@chenzy-design/core 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (310) hide show
  1. package/LICENSE +21 -0
  2. package/dist/back-top.d.ts +16 -0
  3. package/dist/back-top.d.ts.map +1 -0
  4. package/dist/back-top.js +29 -0
  5. package/dist/back-top.js.map +1 -0
  6. package/dist/back-top.test.d.ts +2 -0
  7. package/dist/back-top.test.d.ts.map +1 -0
  8. package/dist/back-top.test.js +44 -0
  9. package/dist/back-top.test.js.map +1 -0
  10. package/dist/banner.d.ts +19 -0
  11. package/dist/banner.d.ts.map +1 -0
  12. package/dist/banner.js +20 -0
  13. package/dist/banner.js.map +1 -0
  14. package/dist/banner.test.d.ts +2 -0
  15. package/dist/banner.test.d.ts.map +1 -0
  16. package/dist/banner.test.js +29 -0
  17. package/dist/banner.test.js.map +1 -0
  18. package/dist/breakpoints.d.ts +30 -0
  19. package/dist/breakpoints.d.ts.map +1 -0
  20. package/dist/breakpoints.js +45 -0
  21. package/dist/breakpoints.js.map +1 -0
  22. package/dist/breakpoints.test.d.ts +2 -0
  23. package/dist/breakpoints.test.d.ts.map +1 -0
  24. package/dist/breakpoints.test.js +46 -0
  25. package/dist/breakpoints.test.js.map +1 -0
  26. package/dist/calendar.d.ts +63 -0
  27. package/dist/calendar.d.ts.map +1 -0
  28. package/dist/calendar.js +94 -0
  29. package/dist/calendar.js.map +1 -0
  30. package/dist/calendar.test.d.ts +2 -0
  31. package/dist/calendar.test.d.ts.map +1 -0
  32. package/dist/calendar.test.js +88 -0
  33. package/dist/calendar.test.js.map +1 -0
  34. package/dist/cascader.d.ts +64 -0
  35. package/dist/cascader.d.ts.map +1 -0
  36. package/dist/cascader.js +79 -0
  37. package/dist/cascader.js.map +1 -0
  38. package/dist/cascader.test.d.ts +2 -0
  39. package/dist/cascader.test.d.ts.map +1 -0
  40. package/dist/cascader.test.js +107 -0
  41. package/dist/cascader.test.js.map +1 -0
  42. package/dist/color.d.ts +70 -0
  43. package/dist/color.d.ts.map +1 -0
  44. package/dist/color.js +217 -0
  45. package/dist/color.js.map +1 -0
  46. package/dist/color.test.d.ts +2 -0
  47. package/dist/color.test.d.ts.map +1 -0
  48. package/dist/color.test.js +161 -0
  49. package/dist/color.test.js.map +1 -0
  50. package/dist/config-provider.d.ts +57 -0
  51. package/dist/config-provider.d.ts.map +1 -0
  52. package/dist/config-provider.js +49 -0
  53. package/dist/config-provider.js.map +1 -0
  54. package/dist/config-provider.test.d.ts +2 -0
  55. package/dist/config-provider.test.d.ts.map +1 -0
  56. package/dist/config-provider.test.js +76 -0
  57. package/dist/config-provider.test.js.map +1 -0
  58. package/dist/copyable.d.ts +43 -0
  59. package/dist/copyable.d.ts.map +1 -0
  60. package/dist/copyable.js +102 -0
  61. package/dist/copyable.js.map +1 -0
  62. package/dist/copyable.test.d.ts +2 -0
  63. package/dist/copyable.test.d.ts.map +1 -0
  64. package/dist/copyable.test.js +97 -0
  65. package/dist/copyable.test.js.map +1 -0
  66. package/dist/date.d.ts +86 -0
  67. package/dist/date.d.ts.map +1 -0
  68. package/dist/date.js +226 -0
  69. package/dist/date.js.map +1 -0
  70. package/dist/date.test.d.ts +2 -0
  71. package/dist/date.test.d.ts.map +1 -0
  72. package/dist/date.test.js +171 -0
  73. package/dist/date.test.js.map +1 -0
  74. package/dist/dismiss.d.ts +28 -0
  75. package/dist/dismiss.d.ts.map +1 -0
  76. package/dist/dismiss.js +42 -0
  77. package/dist/dismiss.js.map +1 -0
  78. package/dist/editable.d.ts +59 -0
  79. package/dist/editable.d.ts.map +1 -0
  80. package/dist/editable.js +85 -0
  81. package/dist/editable.js.map +1 -0
  82. package/dist/editable.test.d.ts +2 -0
  83. package/dist/editable.test.d.ts.map +1 -0
  84. package/dist/editable.test.js +111 -0
  85. package/dist/editable.test.js.map +1 -0
  86. package/dist/ellipsis.d.ts +76 -0
  87. package/dist/ellipsis.d.ts.map +1 -0
  88. package/dist/ellipsis.js +99 -0
  89. package/dist/ellipsis.js.map +1 -0
  90. package/dist/ellipsis.test.d.ts +2 -0
  91. package/dist/ellipsis.test.d.ts.map +1 -0
  92. package/dist/ellipsis.test.js +94 -0
  93. package/dist/ellipsis.test.js.map +1 -0
  94. package/dist/floating.d.ts +78 -0
  95. package/dist/floating.d.ts.map +1 -0
  96. package/dist/floating.js +169 -0
  97. package/dist/floating.js.map +1 -0
  98. package/dist/floating.test.d.ts +2 -0
  99. package/dist/floating.test.d.ts.map +1 -0
  100. package/dist/floating.test.js +169 -0
  101. package/dist/floating.test.js.map +1 -0
  102. package/dist/focus-trap.d.ts +24 -0
  103. package/dist/focus-trap.d.ts.map +1 -0
  104. package/dist/focus-trap.js +64 -0
  105. package/dist/focus-trap.js.map +1 -0
  106. package/dist/form.d.ts +131 -0
  107. package/dist/form.d.ts.map +1 -0
  108. package/dist/form.js +257 -0
  109. package/dist/form.js.map +1 -0
  110. package/dist/form.test.d.ts +2 -0
  111. package/dist/form.test.d.ts.map +1 -0
  112. package/dist/form.test.js +323 -0
  113. package/dist/form.test.js.map +1 -0
  114. package/dist/highlight.d.ts +57 -0
  115. package/dist/highlight.d.ts.map +1 -0
  116. package/dist/highlight.js +124 -0
  117. package/dist/highlight.js.map +1 -0
  118. package/dist/highlight.test.d.ts +2 -0
  119. package/dist/highlight.test.d.ts.map +1 -0
  120. package/dist/highlight.test.js +155 -0
  121. package/dist/highlight.test.js.map +1 -0
  122. package/dist/id.d.ts +4 -0
  123. package/dist/id.d.ts.map +1 -0
  124. package/dist/id.js +14 -0
  125. package/dist/id.js.map +1 -0
  126. package/dist/id.test.d.ts +2 -0
  127. package/dist/id.test.d.ts.map +1 -0
  128. package/dist/id.test.js +13 -0
  129. package/dist/id.test.js.map +1 -0
  130. package/dist/index.d.ts +46 -0
  131. package/dist/index.d.ts.map +1 -0
  132. package/dist/index.js +45 -0
  133. package/dist/index.js.map +1 -0
  134. package/dist/inert-background.d.ts +27 -0
  135. package/dist/inert-background.d.ts.map +1 -0
  136. package/dist/inert-background.js +92 -0
  137. package/dist/inert-background.js.map +1 -0
  138. package/dist/inert-background.test.d.ts +2 -0
  139. package/dist/inert-background.test.d.ts.map +1 -0
  140. package/dist/inert-background.test.js +62 -0
  141. package/dist/inert-background.test.js.map +1 -0
  142. package/dist/input-number.d.ts +34 -0
  143. package/dist/input-number.d.ts.map +1 -0
  144. package/dist/input-number.js +69 -0
  145. package/dist/input-number.js.map +1 -0
  146. package/dist/input-number.test.d.ts +2 -0
  147. package/dist/input-number.test.d.ts.map +1 -0
  148. package/dist/input-number.test.js +74 -0
  149. package/dist/input-number.test.js.map +1 -0
  150. package/dist/list-selection.d.ts +38 -0
  151. package/dist/list-selection.d.ts.map +1 -0
  152. package/dist/list-selection.js +61 -0
  153. package/dist/list-selection.js.map +1 -0
  154. package/dist/list-selection.test.d.ts +2 -0
  155. package/dist/list-selection.test.d.ts.map +1 -0
  156. package/dist/list-selection.test.js +61 -0
  157. package/dist/list-selection.test.js.map +1 -0
  158. package/dist/live-announcer.d.ts +38 -0
  159. package/dist/live-announcer.d.ts.map +1 -0
  160. package/dist/live-announcer.js +89 -0
  161. package/dist/live-announcer.js.map +1 -0
  162. package/dist/live-announcer.test.d.ts +2 -0
  163. package/dist/live-announcer.test.d.ts.map +1 -0
  164. package/dist/live-announcer.test.js +70 -0
  165. package/dist/live-announcer.test.js.map +1 -0
  166. package/dist/lottie-icon.d.ts +88 -0
  167. package/dist/lottie-icon.d.ts.map +1 -0
  168. package/dist/lottie-icon.js +84 -0
  169. package/dist/lottie-icon.js.map +1 -0
  170. package/dist/lottie-icon.test.d.ts +2 -0
  171. package/dist/lottie-icon.test.d.ts.map +1 -0
  172. package/dist/lottie-icon.test.js +88 -0
  173. package/dist/lottie-icon.test.js.map +1 -0
  174. package/dist/notification.d.ts +61 -0
  175. package/dist/notification.d.ts.map +1 -0
  176. package/dist/notification.js +133 -0
  177. package/dist/notification.js.map +1 -0
  178. package/dist/notification.test.d.ts +2 -0
  179. package/dist/notification.test.d.ts.map +1 -0
  180. package/dist/notification.test.js +103 -0
  181. package/dist/notification.test.js.map +1 -0
  182. package/dist/overflow-list.d.ts +102 -0
  183. package/dist/overflow-list.d.ts.map +1 -0
  184. package/dist/overflow-list.js +159 -0
  185. package/dist/overflow-list.js.map +1 -0
  186. package/dist/overflow-list.test.d.ts +2 -0
  187. package/dist/overflow-list.test.d.ts.map +1 -0
  188. package/dist/overflow-list.test.js +223 -0
  189. package/dist/overflow-list.test.js.map +1 -0
  190. package/dist/pagination.d.ts +51 -0
  191. package/dist/pagination.d.ts.map +1 -0
  192. package/dist/pagination.js +127 -0
  193. package/dist/pagination.js.map +1 -0
  194. package/dist/pagination.test.d.ts +2 -0
  195. package/dist/pagination.test.d.ts.map +1 -0
  196. package/dist/pagination.test.js +147 -0
  197. package/dist/pagination.test.js.map +1 -0
  198. package/dist/progress.d.ts +64 -0
  199. package/dist/progress.d.ts.map +1 -0
  200. package/dist/progress.js +92 -0
  201. package/dist/progress.js.map +1 -0
  202. package/dist/progress.test.d.ts +2 -0
  203. package/dist/progress.test.d.ts.map +1 -0
  204. package/dist/progress.test.js +79 -0
  205. package/dist/progress.test.js.map +1 -0
  206. package/dist/resize-observer.d.ts +133 -0
  207. package/dist/resize-observer.d.ts.map +1 -0
  208. package/dist/resize-observer.js +358 -0
  209. package/dist/resize-observer.js.map +1 -0
  210. package/dist/resize-observer.test.d.ts +2 -0
  211. package/dist/resize-observer.test.d.ts.map +1 -0
  212. package/dist/resize-observer.test.js +377 -0
  213. package/dist/resize-observer.test.js.map +1 -0
  214. package/dist/roving.d.ts +26 -0
  215. package/dist/roving.d.ts.map +1 -0
  216. package/dist/roving.js +61 -0
  217. package/dist/roving.js.map +1 -0
  218. package/dist/roving.test.d.ts +2 -0
  219. package/dist/roving.test.d.ts.map +1 -0
  220. package/dist/roving.test.js +48 -0
  221. package/dist/roving.test.js.map +1 -0
  222. package/dist/scroll-list.d.ts +81 -0
  223. package/dist/scroll-list.d.ts.map +1 -0
  224. package/dist/scroll-list.js +175 -0
  225. package/dist/scroll-list.js.map +1 -0
  226. package/dist/scroll-list.test.d.ts +2 -0
  227. package/dist/scroll-list.test.d.ts.map +1 -0
  228. package/dist/scroll-list.test.js +135 -0
  229. package/dist/scroll-list.test.js.map +1 -0
  230. package/dist/scroll-lock.d.ts +11 -0
  231. package/dist/scroll-lock.d.ts.map +1 -0
  232. package/dist/scroll-lock.js +45 -0
  233. package/dist/scroll-lock.js.map +1 -0
  234. package/dist/scroll-lock.test.d.ts +2 -0
  235. package/dist/scroll-lock.test.d.ts.map +1 -0
  236. package/dist/scroll-lock.test.js +55 -0
  237. package/dist/scroll-lock.test.js.map +1 -0
  238. package/dist/sider.d.ts +26 -0
  239. package/dist/sider.d.ts.map +1 -0
  240. package/dist/sider.js +55 -0
  241. package/dist/sider.js.map +1 -0
  242. package/dist/sider.test.d.ts +2 -0
  243. package/dist/sider.test.d.ts.map +1 -0
  244. package/dist/sider.test.js +29 -0
  245. package/dist/sider.test.js.map +1 -0
  246. package/dist/spin.d.ts +25 -0
  247. package/dist/spin.d.ts.map +1 -0
  248. package/dist/spin.js +96 -0
  249. package/dist/spin.js.map +1 -0
  250. package/dist/spin.test.d.ts +2 -0
  251. package/dist/spin.test.d.ts.map +1 -0
  252. package/dist/spin.test.js +80 -0
  253. package/dist/spin.test.js.map +1 -0
  254. package/dist/table.d.ts +101 -0
  255. package/dist/table.d.ts.map +1 -0
  256. package/dist/table.js +244 -0
  257. package/dist/table.js.map +1 -0
  258. package/dist/table.test.d.ts +2 -0
  259. package/dist/table.test.d.ts.map +1 -0
  260. package/dist/table.test.js +184 -0
  261. package/dist/table.test.js.map +1 -0
  262. package/dist/textarea.d.ts +48 -0
  263. package/dist/textarea.d.ts.map +1 -0
  264. package/dist/textarea.js +76 -0
  265. package/dist/textarea.js.map +1 -0
  266. package/dist/textarea.test.d.ts +2 -0
  267. package/dist/textarea.test.d.ts.map +1 -0
  268. package/dist/textarea.test.js +77 -0
  269. package/dist/textarea.test.js.map +1 -0
  270. package/dist/time.d.ts +93 -0
  271. package/dist/time.d.ts.map +1 -0
  272. package/dist/time.js +181 -0
  273. package/dist/time.js.map +1 -0
  274. package/dist/time.test.d.ts +2 -0
  275. package/dist/time.test.d.ts.map +1 -0
  276. package/dist/time.test.js +159 -0
  277. package/dist/time.test.js.map +1 -0
  278. package/dist/toast.d.ts +60 -0
  279. package/dist/toast.d.ts.map +1 -0
  280. package/dist/toast.js +135 -0
  281. package/dist/toast.js.map +1 -0
  282. package/dist/toast.test.d.ts +2 -0
  283. package/dist/toast.test.d.ts.map +1 -0
  284. package/dist/toast.test.js +127 -0
  285. package/dist/toast.test.js.map +1 -0
  286. package/dist/tree.d.ts +129 -0
  287. package/dist/tree.d.ts.map +1 -0
  288. package/dist/tree.js +351 -0
  289. package/dist/tree.js.map +1 -0
  290. package/dist/tree.test.d.ts +2 -0
  291. package/dist/tree.test.d.ts.map +1 -0
  292. package/dist/tree.test.js +291 -0
  293. package/dist/tree.test.js.map +1 -0
  294. package/dist/upload.d.ts +62 -0
  295. package/dist/upload.d.ts.map +1 -0
  296. package/dist/upload.js +85 -0
  297. package/dist/upload.js.map +1 -0
  298. package/dist/upload.test.d.ts +2 -0
  299. package/dist/upload.test.d.ts.map +1 -0
  300. package/dist/upload.test.js +169 -0
  301. package/dist/upload.test.js.map +1 -0
  302. package/dist/virtual-list.d.ts +83 -0
  303. package/dist/virtual-list.d.ts.map +1 -0
  304. package/dist/virtual-list.js +143 -0
  305. package/dist/virtual-list.js.map +1 -0
  306. package/dist/virtual-list.test.d.ts +2 -0
  307. package/dist/virtual-list.test.d.ts.map +1 -0
  308. package/dist/virtual-list.test.js +148 -0
  309. package/dist/virtual-list.test.js.map +1 -0
  310. package/package.json +22 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ellipsis.d.ts","sourceRoot":"","sources":["../src/ellipsis.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAC;AAErD,MAAM,WAAW,oBAAoB;IACnC,iDAAiD;IACjD,YAAY,EAAE,MAAM,CAAC;IACrB,kDAAkD;IAClD,YAAY,EAAE,MAAM,CAAC;IACrB,0EAA0E;IAC1E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gCAAgC;IAChC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,6CAA6C;IAC7C,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAYlE;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,WAAW,EAChB,QAAQ,SAAM,GACb,MAAM,CAcR;AAED,MAAM,WAAW,eAAe;IAC9B,6BAA6B;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,0CAA0C;IAC1C,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,gFAAgF;IAChF,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,oEAAoE;IACpE,GAAG,CAAC,EAAE,WAAW,CAAC;IAClB,6BAA6B;IAC7B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAC7C,sCAAsC;IACtC,QAAQ,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;CACxC;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,oDAAoD;IACpD,SAAS,EAAE,OAAO,GAAG,IAAI,CAAC;CAC3B;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,OAAO,GAAG,IAAI,CAAC;IACnC,kDAAkD;IAClD,MAAM,IAAI,IAAI,CAAC;IACf,8BAA8B;IAC9B,WAAW,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAAC;IACjC,qEAAqE;IACrE,OAAO,CAAC,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAAC;CAC/C;AAED,wBAAgB,cAAc,CAAC,OAAO,GAAE,eAAoB,GAAG,WAAW,CA0CzE"}
@@ -0,0 +1,99 @@
1
+ /**
2
+ * createEllipsis — framework-agnostic truncation/expand logic for Typography.
3
+ *
4
+ * Two paths (per spec §9):
5
+ * - CSS clamp (default): no measurement at all — the render layer applies
6
+ * `-webkit-line-clamp`/`text-overflow`. This module only tracks `expanded`
7
+ * and the expand/collapse toggle; `truncated` stays unknown (CSS handles it).
8
+ * - Measurement path (expandable / suffix / showTooltip): the render layer
9
+ * feeds measured box metrics into `measure()`, which decides whether the
10
+ * content overflows (`truncated`). Pure decision — no DOM here; the svelte
11
+ * layer owns the ResizeObserver + rAF-throttled measurement (red line #3).
12
+ *
13
+ * Pure helpers (overflow decision, middle-truncation slicing) are independently
14
+ * unit-tested. No framework deps, no DOM.
15
+ * See specs/components/basic/Typography.spec.md §3, §4.3, §11.
16
+ */
17
+ /**
18
+ * Pure: decide whether content overflows its clamp box. For multi-row we compare
19
+ * heights; for a single row we additionally allow a width comparison. A 1px
20
+ * tolerance absorbs sub-pixel rounding so equal content is not flagged.
21
+ */
22
+ export function isOverflowing(input) {
23
+ const TOL = 1;
24
+ if (input.scrollHeight - input.clientHeight > TOL)
25
+ return true;
26
+ if (input.rows <= 1 &&
27
+ input.scrollWidth !== undefined &&
28
+ input.clientWidth !== undefined &&
29
+ input.scrollWidth - input.clientWidth > TOL) {
30
+ return true;
31
+ }
32
+ return false;
33
+ }
34
+ /**
35
+ * Pure: build a middle/start/end truncated string given a budget of visible
36
+ * characters. Used only on the single-line precise path (pos: middle/start);
37
+ * end truncation is normally left to CSS. Always inserts the ellipsis char.
38
+ */
39
+ export function truncateText(text, maxChars, pos, ellipsis = '…') {
40
+ if (maxChars <= 0)
41
+ return ellipsis;
42
+ if (text.length <= maxChars)
43
+ return text;
44
+ const budget = Math.max(0, maxChars - ellipsis.length);
45
+ if (pos === 'start') {
46
+ return ellipsis + text.slice(text.length - budget);
47
+ }
48
+ if (pos === 'middle') {
49
+ const head = Math.ceil(budget / 2);
50
+ const tail = budget - head;
51
+ return text.slice(0, head) + ellipsis + (tail > 0 ? text.slice(text.length - tail) : '');
52
+ }
53
+ // end
54
+ return text.slice(0, budget) + ellipsis;
55
+ }
56
+ export function createEllipsis(options = {}) {
57
+ const rows = options.rows ?? 1;
58
+ let expanded = options.defaultExpanded ?? false;
59
+ let truncated = null;
60
+ function emit() {
61
+ options.onChange?.({ rows, expanded, truncated });
62
+ }
63
+ function setExpanded(next) {
64
+ if (expanded === next)
65
+ return;
66
+ // expanding requires `expandable`; collapsing back requires `collapsible`.
67
+ if (next && !options.expandable)
68
+ return;
69
+ if (!next && !options.collapsible)
70
+ return;
71
+ expanded = next;
72
+ options.onExpand?.(expanded);
73
+ emit();
74
+ }
75
+ return {
76
+ get rows() {
77
+ return rows;
78
+ },
79
+ get expanded() {
80
+ return expanded;
81
+ },
82
+ get truncated() {
83
+ return truncated;
84
+ },
85
+ toggle() {
86
+ setExpanded(!expanded);
87
+ },
88
+ setExpanded,
89
+ measure(input) {
90
+ const next = isOverflowing(input);
91
+ if (next !== truncated) {
92
+ truncated = next;
93
+ emit();
94
+ }
95
+ return next;
96
+ },
97
+ };
98
+ }
99
+ //# sourceMappingURL=ellipsis.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ellipsis.js","sourceRoot":"","sources":["../src/ellipsis.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ellipsis.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ellipsis.test.d.ts","sourceRoot":"","sources":["../src/ellipsis.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,94 @@
1
+ import { describe, it, expect, vi } from 'vitest';
2
+ import { createEllipsis, isOverflowing, truncateText } from './ellipsis.js';
3
+ describe('isOverflowing', () => {
4
+ it('multi-row: scrollHeight exceeds clientHeight → true', () => {
5
+ expect(isOverflowing({ scrollHeight: 60, clientHeight: 40, rows: 2 })).toBe(true);
6
+ });
7
+ it('multi-row: equal heights → false (within tolerance)', () => {
8
+ expect(isOverflowing({ scrollHeight: 40, clientHeight: 40, rows: 2 })).toBe(false);
9
+ });
10
+ it('single-row: width overflow → true', () => {
11
+ expect(isOverflowing({ scrollHeight: 20, clientHeight: 20, scrollWidth: 200, clientWidth: 100, rows: 1 })).toBe(true);
12
+ });
13
+ it('single-row: width fits → false', () => {
14
+ expect(isOverflowing({ scrollHeight: 20, clientHeight: 20, scrollWidth: 90, clientWidth: 100, rows: 1 })).toBe(false);
15
+ });
16
+ it('1px sub-pixel tolerance not flagged', () => {
17
+ expect(isOverflowing({ scrollHeight: 41, clientHeight: 40, rows: 2 })).toBe(false);
18
+ });
19
+ });
20
+ describe('truncateText', () => {
21
+ it('returns full text when within budget', () => {
22
+ expect(truncateText('hi', 10, 'end')).toBe('hi');
23
+ });
24
+ it('end truncation appends ellipsis', () => {
25
+ expect(truncateText('abcdefgh', 5, 'end')).toBe('abcd…');
26
+ });
27
+ it('start truncation prepends ellipsis', () => {
28
+ expect(truncateText('abcdefgh', 5, 'start')).toBe('…efgh');
29
+ });
30
+ it('middle truncation splits around ellipsis', () => {
31
+ const out = truncateText('abcdefgh', 5, 'middle');
32
+ expect(out).toContain('…');
33
+ expect(out.length).toBe(5);
34
+ });
35
+ it('maxChars <= 0 → ellipsis only', () => {
36
+ expect(truncateText('abc', 0, 'end')).toBe('…');
37
+ });
38
+ });
39
+ describe('createEllipsis', () => {
40
+ it('truncated starts unknown (null) on CSS clamp path', () => {
41
+ const e = createEllipsis({ rows: 2 });
42
+ expect(e.truncated).toBeNull();
43
+ });
44
+ it('toggle is a no-op when not expandable', () => {
45
+ const onExpand = vi.fn();
46
+ const e = createEllipsis({ rows: 2, onExpand });
47
+ e.toggle();
48
+ expect(e.expanded).toBe(false);
49
+ expect(onExpand).not.toHaveBeenCalled();
50
+ });
51
+ it('expandable allows expanding but not collapsing back (no collapsible)', () => {
52
+ const onExpand = vi.fn();
53
+ const e = createEllipsis({ rows: 2, expandable: true, onExpand });
54
+ e.toggle();
55
+ expect(e.expanded).toBe(true);
56
+ expect(onExpand).toHaveBeenCalledWith(true);
57
+ // without collapsible, collapsing back is a no-op (Semi semantics)
58
+ e.toggle();
59
+ expect(e.expanded).toBe(true);
60
+ expect(onExpand).toHaveBeenCalledTimes(1);
61
+ });
62
+ it('collapsible allows collapsing back after expansion', () => {
63
+ const onExpand = vi.fn();
64
+ const e = createEllipsis({ rows: 2, expandable: true, collapsible: true, onExpand });
65
+ e.toggle();
66
+ expect(e.expanded).toBe(true);
67
+ e.toggle();
68
+ expect(e.expanded).toBe(false);
69
+ expect(onExpand).toHaveBeenLastCalledWith(false);
70
+ expect(onExpand).toHaveBeenCalledTimes(2);
71
+ });
72
+ it('collapsible without expandable cannot expand initially', () => {
73
+ const e = createEllipsis({ rows: 2, collapsible: true });
74
+ e.toggle();
75
+ expect(e.expanded).toBe(false);
76
+ });
77
+ it('measure updates truncated and fires onChange', () => {
78
+ const onChange = vi.fn();
79
+ const e = createEllipsis({ rows: 2, expandable: true, onChange });
80
+ const r = e.measure({ scrollHeight: 80, clientHeight: 40, rows: 2 });
81
+ expect(r).toBe(true);
82
+ expect(e.truncated).toBe(true);
83
+ expect(onChange).toHaveBeenCalled();
84
+ });
85
+ it('measure does not re-emit when truncated is unchanged', () => {
86
+ const onChange = vi.fn();
87
+ const e = createEllipsis({ rows: 2, onChange });
88
+ e.measure({ scrollHeight: 80, clientHeight: 40, rows: 2 });
89
+ onChange.mockClear();
90
+ e.measure({ scrollHeight: 80, clientHeight: 40, rows: 2 });
91
+ expect(onChange).not.toHaveBeenCalled();
92
+ });
93
+ });
94
+ //# sourceMappingURL=ellipsis.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ellipsis.test.js","sourceRoot":"","sources":["../src/ellipsis.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * floating — framework-agnostic popup positioning. Pure geometry: given the
3
+ * trigger/popup rects, the viewport, a desired placement and offset, it returns
4
+ * the fixed-viewport (x, y) for the popup, the placement actually used after
5
+ * collision flipping, and the arrow's cross-axis offset. No DOM, no framework.
6
+ *
7
+ * Coordinate space: all rects are in viewport coordinates (as from
8
+ * getBoundingClientRect), so the returned (x, y) is meant for `position: fixed`.
9
+ * See specs/components/show/Tooltip.spec.md / Popover.spec.md (autoAdjustOverflow).
10
+ */
11
+ /** 12-way placement: <side><align?>. align omitted = centered on cross axis. */
12
+ export type Placement = 'top' | 'topStart' | 'topEnd' | 'bottom' | 'bottomStart' | 'bottomEnd' | 'left' | 'leftStart' | 'leftEnd' | 'right' | 'rightStart' | 'rightEnd';
13
+ export type Side = 'top' | 'bottom' | 'left' | 'right';
14
+ export type Align = 'start' | 'center' | 'end';
15
+ /** minimal rect shape (compatible with DOMRect) */
16
+ export interface Rect {
17
+ x: number;
18
+ y: number;
19
+ width: number;
20
+ height: number;
21
+ }
22
+ export interface Viewport {
23
+ width: number;
24
+ height: number;
25
+ }
26
+ export interface ComputePositionInput {
27
+ triggerRect: Rect;
28
+ popupRect: Rect;
29
+ viewport: Viewport;
30
+ placement: Placement;
31
+ /** gap between trigger and popup along the main axis (px) */
32
+ offset?: number;
33
+ /** flip to the opposite side when the chosen side overflows the viewport */
34
+ autoAdjust?: boolean;
35
+ /** keep the popup at least this far from the viewport edge (px) */
36
+ padding?: number;
37
+ /**
38
+ * For start/end-aligned placements, point the arrow at the trigger center
39
+ * instead of pinning it a fixed distance from the popup's aligned edge.
40
+ * Centered placements always point at the center either way. Default false.
41
+ */
42
+ arrowPointAtCenter?: boolean;
43
+ /**
44
+ * For start/end alignment with arrowPointAtCenter=false, the distance (px)
45
+ * from the popup's aligned edge to the arrow center. Default 12.
46
+ */
47
+ arrowEdgeDistance?: number;
48
+ }
49
+ export interface ComputePositionResult {
50
+ /** fixed-viewport x of the popup's top-left corner */
51
+ x: number;
52
+ /** fixed-viewport y of the popup's top-left corner */
53
+ y: number;
54
+ /** placement after collision flipping (may differ from the requested one) */
55
+ placement: Placement;
56
+ /** the resolved side after flipping */
57
+ side: Side;
58
+ /** the resolved align */
59
+ align: Align;
60
+ /**
61
+ * cross-axis offset (px) from the popup's leading edge to where the arrow's
62
+ * center should sit, so the arrow keeps pointing at the trigger's center.
63
+ */
64
+ arrowOffset: number;
65
+ }
66
+ /** split a Placement into its side + align parts. */
67
+ export declare function parsePlacement(placement: Placement): {
68
+ side: Side;
69
+ align: Align;
70
+ };
71
+ /** recompose a side + align into a Placement. */
72
+ export declare function makePlacement(side: Side, align: Align): Placement;
73
+ /**
74
+ * Compute the popup's fixed-viewport position with optional collision flipping
75
+ * and viewport-edge clamping along the cross axis. Pure function.
76
+ */
77
+ export declare function computePosition(input: ComputePositionInput): ComputePositionResult;
78
+ //# sourceMappingURL=floating.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"floating.d.ts","sourceRoot":"","sources":["../src/floating.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,gFAAgF;AAChF,MAAM,MAAM,SAAS,GACjB,KAAK,GACL,UAAU,GACV,QAAQ,GACR,QAAQ,GACR,aAAa,GACb,WAAW,GACX,MAAM,GACN,WAAW,GACX,SAAS,GACT,OAAO,GACP,YAAY,GACZ,UAAU,CAAC;AAEf,MAAM,MAAM,IAAI,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC;AACvD,MAAM,MAAM,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAC;AAE/C,mDAAmD;AACnD,MAAM,WAAW,IAAI;IACnB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,IAAI,CAAC;IAClB,SAAS,EAAE,IAAI,CAAC;IAChB,QAAQ,EAAE,QAAQ,CAAC;IACnB,SAAS,EAAE,SAAS,CAAC;IACrB,6DAA6D;IAC7D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,4EAA4E;IAC5E,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,mEAAmE;IACnE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B;;;OAGG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,qBAAqB;IACpC,sDAAsD;IACtD,CAAC,EAAE,MAAM,CAAC;IACV,sDAAsD;IACtD,CAAC,EAAE,MAAM,CAAC;IACV,6EAA6E;IAC7E,SAAS,EAAE,SAAS,CAAC;IACrB,uCAAuC;IACvC,IAAI,EAAE,IAAI,CAAC;IACX,yBAAyB;IACzB,KAAK,EAAE,KAAK,CAAC;IACb;;;OAGG;IACH,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,qDAAqD;AACrD,wBAAgB,cAAc,CAAC,SAAS,EAAE,SAAS,GAAG;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,KAAK,CAAA;CAAE,CAMjF;AASD,iDAAiD;AACjD,wBAAgB,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,GAAG,SAAS,CAIjE;AA8FD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,oBAAoB,GAAG,qBAAqB,CA+ClF"}
@@ -0,0 +1,169 @@
1
+ /**
2
+ * floating — framework-agnostic popup positioning. Pure geometry: given the
3
+ * trigger/popup rects, the viewport, a desired placement and offset, it returns
4
+ * the fixed-viewport (x, y) for the popup, the placement actually used after
5
+ * collision flipping, and the arrow's cross-axis offset. No DOM, no framework.
6
+ *
7
+ * Coordinate space: all rects are in viewport coordinates (as from
8
+ * getBoundingClientRect), so the returned (x, y) is meant for `position: fixed`.
9
+ * See specs/components/show/Tooltip.spec.md / Popover.spec.md (autoAdjustOverflow).
10
+ */
11
+ /** split a Placement into its side + align parts. */
12
+ export function parsePlacement(placement) {
13
+ if (placement.startsWith('top'))
14
+ return { side: 'top', align: alignOf(placement, 'top') };
15
+ if (placement.startsWith('bottom'))
16
+ return { side: 'bottom', align: alignOf(placement, 'bottom') };
17
+ if (placement.startsWith('left'))
18
+ return { side: 'left', align: alignOf(placement, 'left') };
19
+ return { side: 'right', align: alignOf(placement, 'right') };
20
+ }
21
+ function alignOf(placement, side) {
22
+ const suffix = placement.slice(side.length);
23
+ if (suffix === 'Start')
24
+ return 'start';
25
+ if (suffix === 'End')
26
+ return 'end';
27
+ return 'center';
28
+ }
29
+ /** recompose a side + align into a Placement. */
30
+ export function makePlacement(side, align) {
31
+ if (align === 'center')
32
+ return side;
33
+ const suffix = align === 'start' ? 'Start' : 'End';
34
+ return (side + suffix);
35
+ }
36
+ const OPPOSITE = {
37
+ top: 'bottom',
38
+ bottom: 'top',
39
+ left: 'right',
40
+ right: 'left',
41
+ };
42
+ /** is the side along the vertical (block) axis? top/bottom → true */
43
+ function isVerticalSide(side) {
44
+ return side === 'top' || side === 'bottom';
45
+ }
46
+ /** free space between the trigger and the viewport edge on a given side. */
47
+ function spaceOnSide(side, trigger, viewport) {
48
+ switch (side) {
49
+ case 'top':
50
+ return trigger.y;
51
+ case 'bottom':
52
+ return viewport.height - (trigger.y + trigger.height);
53
+ case 'left':
54
+ return trigger.x;
55
+ case 'right':
56
+ return viewport.width - (trigger.x + trigger.width);
57
+ }
58
+ }
59
+ /** popup extent needed along the main axis for a side (including the offset). */
60
+ function neededOnSide(side, popup, offset) {
61
+ return (isVerticalSide(side) ? popup.height : popup.width) + offset;
62
+ }
63
+ /**
64
+ * choose the final side: keep the requested one unless autoAdjust is on and it
65
+ * overflows while the opposite side has strictly more room.
66
+ */
67
+ function resolveSide(side, input) {
68
+ if (!input.autoAdjust)
69
+ return side;
70
+ const { triggerRect, popupRect, viewport, offset } = input;
71
+ const need = neededOnSide(side, popupRect, offset);
72
+ const have = spaceOnSide(side, triggerRect, viewport);
73
+ if (have >= need)
74
+ return side;
75
+ const opp = OPPOSITE[side];
76
+ const oppHave = spaceOnSide(opp, triggerRect, viewport);
77
+ return oppHave > have ? opp : side;
78
+ }
79
+ /**
80
+ * main-axis coordinate of the popup's leading corner (top for top/bottom-x,
81
+ * left for left/right-y), placing the popup `offset` away from the trigger.
82
+ */
83
+ function mainAxisCoord(side, trigger, popup, offset) {
84
+ switch (side) {
85
+ case 'top':
86
+ return trigger.y - popup.height - offset;
87
+ case 'bottom':
88
+ return trigger.y + trigger.height + offset;
89
+ case 'left':
90
+ return trigger.x - popup.width - offset;
91
+ case 'right':
92
+ return trigger.x + trigger.width + offset;
93
+ }
94
+ }
95
+ /**
96
+ * cross-axis coordinate of the popup's leading corner given the align.
97
+ * For vertical sides the cross axis is horizontal (x); for horizontal sides it
98
+ * is vertical (y).
99
+ */
100
+ function crossAxisCoord(side, align, trigger, popup) {
101
+ const vertical = isVerticalSide(side);
102
+ const triggerStart = vertical ? trigger.x : trigger.y;
103
+ const triggerSize = vertical ? trigger.width : trigger.height;
104
+ const popupSize = vertical ? popup.width : popup.height;
105
+ switch (align) {
106
+ case 'start':
107
+ return triggerStart;
108
+ case 'end':
109
+ return triggerStart + triggerSize - popupSize;
110
+ case 'center':
111
+ return triggerStart + triggerSize / 2 - popupSize / 2;
112
+ }
113
+ }
114
+ /** clamp a value into [min, max]; if the range is empty returns min. */
115
+ function clamp(value, min, max) {
116
+ if (max < min)
117
+ return min;
118
+ return Math.min(Math.max(value, min), max);
119
+ }
120
+ /**
121
+ * Compute the popup's fixed-viewport position with optional collision flipping
122
+ * and viewport-edge clamping along the cross axis. Pure function.
123
+ */
124
+ export function computePosition(input) {
125
+ const offset = input.offset ?? 8;
126
+ const padding = input.padding ?? 4;
127
+ const filled = { ...input, offset, padding };
128
+ const requested = parsePlacement(input.placement);
129
+ const side = resolveSide(requested.side, filled);
130
+ const align = requested.align;
131
+ const { triggerRect, popupRect, viewport } = input;
132
+ let x;
133
+ let y;
134
+ if (isVerticalSide(side)) {
135
+ y = mainAxisCoord(side, triggerRect, popupRect, offset);
136
+ const rawX = crossAxisCoord(side, align, triggerRect, popupRect);
137
+ x = clamp(rawX, padding, viewport.width - popupRect.width - padding);
138
+ }
139
+ else {
140
+ x = mainAxisCoord(side, triggerRect, popupRect, offset);
141
+ const rawY = crossAxisCoord(side, align, triggerRect, popupRect);
142
+ y = clamp(rawY, padding, viewport.height - popupRect.height - padding);
143
+ }
144
+ // Arrow cross-axis offset, measured from the popup's leading edge.
145
+ // - centered align: always at the trigger center (== popup center).
146
+ // - start/end align + arrowPointAtCenter: at the trigger center too.
147
+ // - start/end align (default): pinned `arrowEdgeDistance` from the aligned
148
+ // edge, so the arrow hugs the corner the popup lines up with.
149
+ const vertical = isVerticalSide(side);
150
+ const popupLeadingEdge = vertical ? x : y;
151
+ const popupCrossSize = vertical ? popupRect.width : popupRect.height;
152
+ const edgeDistance = input.arrowEdgeDistance ?? 12;
153
+ const pointAtCenter = input.arrowPointAtCenter ?? false;
154
+ let arrowOffset;
155
+ if (align === 'center' || pointAtCenter) {
156
+ const triggerCenter = vertical
157
+ ? triggerRect.x + triggerRect.width / 2
158
+ : triggerRect.y + triggerRect.height / 2;
159
+ arrowOffset = clamp(triggerCenter - popupLeadingEdge, padding, popupCrossSize - padding);
160
+ }
161
+ else if (align === 'start') {
162
+ arrowOffset = clamp(edgeDistance, padding, popupCrossSize - padding);
163
+ }
164
+ else {
165
+ arrowOffset = clamp(popupCrossSize - edgeDistance, padding, popupCrossSize - padding);
166
+ }
167
+ return { x, y, placement: makePlacement(side, align), side, align, arrowOffset };
168
+ }
169
+ //# sourceMappingURL=floating.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"floating.js","sourceRoot":"","sources":["../src/floating.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=floating.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"floating.test.d.ts","sourceRoot":"","sources":["../src/floating.test.ts"],"names":[],"mappings":""}