@tartaguti/ui-components 0.0.0-stage → 0.2.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 (392) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/LICENSE +21 -0
  3. package/README.md +192 -2
  4. package/THIRD-PARTY-NOTICES.md +29 -0
  5. package/custom-elements.json +16899 -0
  6. package/dist/accordion/tt-accordion-item.d.ts +32 -0
  7. package/dist/accordion/tt-accordion-item.d.ts.map +1 -0
  8. package/dist/accordion/tt-accordion-item.js +247 -0
  9. package/dist/accordion/tt-accordion-item.js.map +1 -0
  10. package/dist/accordion/tt-accordion.d.ts +28 -0
  11. package/dist/accordion/tt-accordion.d.ts.map +1 -0
  12. package/dist/accordion/tt-accordion.js +148 -0
  13. package/dist/accordion/tt-accordion.js.map +1 -0
  14. package/dist/bento/tt-bento-item.d.ts +35 -0
  15. package/dist/bento/tt-bento-item.d.ts.map +1 -0
  16. package/dist/bento/tt-bento-item.js +201 -0
  17. package/dist/bento/tt-bento-item.js.map +1 -0
  18. package/dist/bento/tt-bento.d.ts +25 -0
  19. package/dist/bento/tt-bento.d.ts.map +1 -0
  20. package/dist/bento/tt-bento.js +314 -0
  21. package/dist/bento/tt-bento.js.map +1 -0
  22. package/dist/floating.d.ts +61 -0
  23. package/dist/floating.d.ts.map +1 -0
  24. package/dist/floating.js +120 -0
  25. package/dist/floating.js.map +1 -0
  26. package/dist/index.d.ts +92 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +96 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/interaction/tt-draggable.d.ts +29 -0
  31. package/dist/interaction/tt-draggable.d.ts.map +1 -0
  32. package/dist/interaction/tt-draggable.js +66 -0
  33. package/dist/interaction/tt-draggable.js.map +1 -0
  34. package/dist/interaction/tt-droppable.d.ts +37 -0
  35. package/dist/interaction/tt-droppable.d.ts.map +1 -0
  36. package/dist/interaction/tt-droppable.js +108 -0
  37. package/dist/interaction/tt-droppable.js.map +1 -0
  38. package/dist/interaction/tt-resizable.d.ts +45 -0
  39. package/dist/interaction/tt-resizable.d.ts.map +1 -0
  40. package/dist/interaction/tt-resizable.js +210 -0
  41. package/dist/interaction/tt-resizable.js.map +1 -0
  42. package/dist/interaction/tt-reveal.d.ts +54 -0
  43. package/dist/interaction/tt-reveal.d.ts.map +1 -0
  44. package/dist/interaction/tt-reveal.js +302 -0
  45. package/dist/interaction/tt-reveal.js.map +1 -0
  46. package/dist/motion.d.ts +8 -0
  47. package/dist/motion.d.ts.map +1 -0
  48. package/dist/motion.js +49 -0
  49. package/dist/motion.js.map +1 -0
  50. package/dist/overlay.d.ts +7 -0
  51. package/dist/overlay.d.ts.map +1 -0
  52. package/dist/overlay.js +121 -0
  53. package/dist/overlay.js.map +1 -0
  54. package/dist/safe-url.d.ts +14 -0
  55. package/dist/safe-url.d.ts.map +1 -0
  56. package/dist/safe-url.js +46 -0
  57. package/dist/safe-url.js.map +1 -0
  58. package/dist/scroll-lock.d.ts +22 -0
  59. package/dist/scroll-lock.d.ts.map +1 -0
  60. package/dist/scroll-lock.js +56 -0
  61. package/dist/scroll-lock.js.map +1 -0
  62. package/dist/sidebar/tt-menu-group.d.ts +69 -0
  63. package/dist/sidebar/tt-menu-group.d.ts.map +1 -0
  64. package/dist/sidebar/tt-menu-group.js +358 -0
  65. package/dist/sidebar/tt-menu-group.js.map +1 -0
  66. package/dist/sidebar/tt-menu-item.d.ts +70 -0
  67. package/dist/sidebar/tt-menu-item.d.ts.map +1 -0
  68. package/dist/sidebar/tt-menu-item.js +502 -0
  69. package/dist/sidebar/tt-menu-item.js.map +1 -0
  70. package/dist/sidebar/tt-sidebar-footer.d.ts +39 -0
  71. package/dist/sidebar/tt-sidebar-footer.d.ts.map +1 -0
  72. package/dist/sidebar/tt-sidebar-footer.js +205 -0
  73. package/dist/sidebar/tt-sidebar-footer.js.map +1 -0
  74. package/dist/sidebar/tt-sidebar-header.d.ts +31 -0
  75. package/dist/sidebar/tt-sidebar-header.d.ts.map +1 -0
  76. package/dist/sidebar/tt-sidebar-header.js +150 -0
  77. package/dist/sidebar/tt-sidebar-header.js.map +1 -0
  78. package/dist/sidebar/tt-sidebar.d.ts +72 -0
  79. package/dist/sidebar/tt-sidebar.d.ts.map +1 -0
  80. package/dist/sidebar/tt-sidebar.js +539 -0
  81. package/dist/sidebar/tt-sidebar.js.map +1 -0
  82. package/dist/sr-only.d.ts +15 -0
  83. package/dist/sr-only.d.ts.map +1 -0
  84. package/dist/sr-only.js +27 -0
  85. package/dist/sr-only.js.map +1 -0
  86. package/dist/tokens.css +1124 -0
  87. package/dist/tt-alert.d.ts +26 -0
  88. package/dist/tt-alert.d.ts.map +1 -0
  89. package/dist/tt-alert.js +165 -0
  90. package/dist/tt-alert.js.map +1 -0
  91. package/dist/tt-aspect-ratio.d.ts +40 -0
  92. package/dist/tt-aspect-ratio.d.ts.map +1 -0
  93. package/dist/tt-aspect-ratio.js +98 -0
  94. package/dist/tt-aspect-ratio.js.map +1 -0
  95. package/dist/tt-auth.d.ts +75 -0
  96. package/dist/tt-auth.d.ts.map +1 -0
  97. package/dist/tt-auth.js +520 -0
  98. package/dist/tt-auth.js.map +1 -0
  99. package/dist/tt-avatar.d.ts +26 -0
  100. package/dist/tt-avatar.d.ts.map +1 -0
  101. package/dist/tt-avatar.js +169 -0
  102. package/dist/tt-avatar.js.map +1 -0
  103. package/dist/tt-badge.d.ts +36 -0
  104. package/dist/tt-badge.d.ts.map +1 -0
  105. package/dist/tt-badge.js +135 -0
  106. package/dist/tt-badge.js.map +1 -0
  107. package/dist/tt-breadcrumbs.d.ts +22 -0
  108. package/dist/tt-breadcrumbs.d.ts.map +1 -0
  109. package/dist/tt-breadcrumbs.js +144 -0
  110. package/dist/tt-breadcrumbs.js.map +1 -0
  111. package/dist/tt-button-group.d.ts +32 -0
  112. package/dist/tt-button-group.d.ts.map +1 -0
  113. package/dist/tt-button-group.js +132 -0
  114. package/dist/tt-button-group.js.map +1 -0
  115. package/dist/tt-button.d.ts +31 -0
  116. package/dist/tt-button.d.ts.map +1 -0
  117. package/dist/tt-button.js +483 -0
  118. package/dist/tt-button.js.map +1 -0
  119. package/dist/tt-card.d.ts +26 -0
  120. package/dist/tt-card.d.ts.map +1 -0
  121. package/dist/tt-card.js +429 -0
  122. package/dist/tt-card.js.map +1 -0
  123. package/dist/tt-chart.d.ts +36 -0
  124. package/dist/tt-chart.d.ts.map +1 -0
  125. package/dist/tt-chart.js +332 -0
  126. package/dist/tt-chart.js.map +1 -0
  127. package/dist/tt-checkbox-group.d.ts +38 -0
  128. package/dist/tt-checkbox-group.d.ts.map +1 -0
  129. package/dist/tt-checkbox-group.js +243 -0
  130. package/dist/tt-checkbox-group.js.map +1 -0
  131. package/dist/tt-checkbox.d.ts +35 -0
  132. package/dist/tt-checkbox.d.ts.map +1 -0
  133. package/dist/tt-checkbox.js +354 -0
  134. package/dist/tt-checkbox.js.map +1 -0
  135. package/dist/tt-code-block.d.ts +37 -0
  136. package/dist/tt-code-block.d.ts.map +1 -0
  137. package/dist/tt-code-block.js +409 -0
  138. package/dist/tt-code-block.js.map +1 -0
  139. package/dist/tt-collapsible.d.ts +71 -0
  140. package/dist/tt-collapsible.d.ts.map +1 -0
  141. package/dist/tt-collapsible.js +206 -0
  142. package/dist/tt-collapsible.js.map +1 -0
  143. package/dist/tt-combobox.d.ts +107 -0
  144. package/dist/tt-combobox.d.ts.map +1 -0
  145. package/dist/tt-combobox.js +816 -0
  146. package/dist/tt-combobox.js.map +1 -0
  147. package/dist/tt-company-card.d.ts +30 -0
  148. package/dist/tt-company-card.d.ts.map +1 -0
  149. package/dist/tt-company-card.js +382 -0
  150. package/dist/tt-company-card.js.map +1 -0
  151. package/dist/tt-comparison-table.d.ts +59 -0
  152. package/dist/tt-comparison-table.d.ts.map +1 -0
  153. package/dist/tt-comparison-table.js +441 -0
  154. package/dist/tt-comparison-table.js.map +1 -0
  155. package/dist/tt-component-doc.d.ts +63 -0
  156. package/dist/tt-component-doc.d.ts.map +1 -0
  157. package/dist/tt-component-doc.js +585 -0
  158. package/dist/tt-component-doc.js.map +1 -0
  159. package/dist/tt-confirm.d.ts +45 -0
  160. package/dist/tt-confirm.d.ts.map +1 -0
  161. package/dist/tt-confirm.js +151 -0
  162. package/dist/tt-confirm.js.map +1 -0
  163. package/dist/tt-contact-list.d.ts +18 -0
  164. package/dist/tt-contact-list.d.ts.map +1 -0
  165. package/dist/tt-contact-list.js +101 -0
  166. package/dist/tt-contact-list.js.map +1 -0
  167. package/dist/tt-copy-button.d.ts +25 -0
  168. package/dist/tt-copy-button.d.ts.map +1 -0
  169. package/dist/tt-copy-button.js +194 -0
  170. package/dist/tt-copy-button.js.map +1 -0
  171. package/dist/tt-data-table.d.ts +96 -0
  172. package/dist/tt-data-table.d.ts.map +1 -0
  173. package/dist/tt-data-table.js +812 -0
  174. package/dist/tt-data-table.js.map +1 -0
  175. package/dist/tt-divider.d.ts +19 -0
  176. package/dist/tt-divider.d.ts.map +1 -0
  177. package/dist/tt-divider.js +104 -0
  178. package/dist/tt-divider.js.map +1 -0
  179. package/dist/tt-drawer.d.ts +38 -0
  180. package/dist/tt-drawer.d.ts.map +1 -0
  181. package/dist/tt-drawer.js +433 -0
  182. package/dist/tt-drawer.js.map +1 -0
  183. package/dist/tt-dropdown-menu.d.ts +57 -0
  184. package/dist/tt-dropdown-menu.d.ts.map +1 -0
  185. package/dist/tt-dropdown-menu.js +631 -0
  186. package/dist/tt-dropdown-menu.js.map +1 -0
  187. package/dist/tt-empty-state.d.ts +13 -0
  188. package/dist/tt-empty-state.d.ts.map +1 -0
  189. package/dist/tt-empty-state.js +94 -0
  190. package/dist/tt-empty-state.js.map +1 -0
  191. package/dist/tt-example.d.ts +33 -0
  192. package/dist/tt-example.d.ts.map +1 -0
  193. package/dist/tt-example.js +250 -0
  194. package/dist/tt-example.js.map +1 -0
  195. package/dist/tt-file-upload.d.ts +85 -0
  196. package/dist/tt-file-upload.d.ts.map +1 -0
  197. package/dist/tt-file-upload.js +662 -0
  198. package/dist/tt-file-upload.js.map +1 -0
  199. package/dist/tt-filter.d.ts +62 -0
  200. package/dist/tt-filter.d.ts.map +1 -0
  201. package/dist/tt-filter.js +393 -0
  202. package/dist/tt-filter.js.map +1 -0
  203. package/dist/tt-form.d.ts +33 -0
  204. package/dist/tt-form.d.ts.map +1 -0
  205. package/dist/tt-form.js +202 -0
  206. package/dist/tt-form.js.map +1 -0
  207. package/dist/tt-grid.d.ts +22 -0
  208. package/dist/tt-grid.d.ts.map +1 -0
  209. package/dist/tt-grid.js +106 -0
  210. package/dist/tt-grid.js.map +1 -0
  211. package/dist/tt-icon.d.ts +20 -0
  212. package/dist/tt-icon.d.ts.map +1 -0
  213. package/dist/tt-icon.js +510 -0
  214. package/dist/tt-icon.js.map +1 -0
  215. package/dist/tt-image.d.ts +59 -0
  216. package/dist/tt-image.d.ts.map +1 -0
  217. package/dist/tt-image.js +314 -0
  218. package/dist/tt-image.js.map +1 -0
  219. package/dist/tt-inbox.d.ts +45 -0
  220. package/dist/tt-inbox.d.ts.map +1 -0
  221. package/dist/tt-inbox.js +275 -0
  222. package/dist/tt-inbox.js.map +1 -0
  223. package/dist/tt-input.d.ts +43 -0
  224. package/dist/tt-input.d.ts.map +1 -0
  225. package/dist/tt-input.js +476 -0
  226. package/dist/tt-input.js.map +1 -0
  227. package/dist/tt-kbd.d.ts +39 -0
  228. package/dist/tt-kbd.d.ts.map +1 -0
  229. package/dist/tt-kbd.js +145 -0
  230. package/dist/tt-kbd.js.map +1 -0
  231. package/dist/tt-key-values.d.ts +17 -0
  232. package/dist/tt-key-values.d.ts.map +1 -0
  233. package/dist/tt-key-values.js +126 -0
  234. package/dist/tt-key-values.js.map +1 -0
  235. package/dist/tt-knowledge-doc.d.ts +24 -0
  236. package/dist/tt-knowledge-doc.d.ts.map +1 -0
  237. package/dist/tt-knowledge-doc.js +120 -0
  238. package/dist/tt-knowledge-doc.js.map +1 -0
  239. package/dist/tt-layout.d.ts +36 -0
  240. package/dist/tt-layout.d.ts.map +1 -0
  241. package/dist/tt-layout.js +318 -0
  242. package/dist/tt-layout.js.map +1 -0
  243. package/dist/tt-modal.d.ts +32 -0
  244. package/dist/tt-modal.d.ts.map +1 -0
  245. package/dist/tt-modal.js +553 -0
  246. package/dist/tt-modal.js.map +1 -0
  247. package/dist/tt-navbar.d.ts +33 -0
  248. package/dist/tt-navbar.d.ts.map +1 -0
  249. package/dist/tt-navbar.js +390 -0
  250. package/dist/tt-navbar.js.map +1 -0
  251. package/dist/tt-page-header.d.ts +28 -0
  252. package/dist/tt-page-header.d.ts.map +1 -0
  253. package/dist/tt-page-header.js +166 -0
  254. package/dist/tt-page-header.js.map +1 -0
  255. package/dist/tt-page.d.ts +14 -0
  256. package/dist/tt-page.d.ts.map +1 -0
  257. package/dist/tt-page.js +163 -0
  258. package/dist/tt-page.js.map +1 -0
  259. package/dist/tt-pagination.d.ts +27 -0
  260. package/dist/tt-pagination.d.ts.map +1 -0
  261. package/dist/tt-pagination.js +194 -0
  262. package/dist/tt-pagination.js.map +1 -0
  263. package/dist/tt-preview.d.ts +11 -0
  264. package/dist/tt-preview.d.ts.map +1 -0
  265. package/dist/tt-preview.js +68 -0
  266. package/dist/tt-preview.js.map +1 -0
  267. package/dist/tt-product.d.ts +40 -0
  268. package/dist/tt-product.d.ts.map +1 -0
  269. package/dist/tt-product.js +590 -0
  270. package/dist/tt-product.js.map +1 -0
  271. package/dist/tt-profile-card.d.ts +23 -0
  272. package/dist/tt-profile-card.d.ts.map +1 -0
  273. package/dist/tt-profile-card.js +199 -0
  274. package/dist/tt-profile-card.js.map +1 -0
  275. package/dist/tt-progress.d.ts +26 -0
  276. package/dist/tt-progress.d.ts.map +1 -0
  277. package/dist/tt-progress.js +156 -0
  278. package/dist/tt-progress.js.map +1 -0
  279. package/dist/tt-quantity.d.ts +36 -0
  280. package/dist/tt-quantity.d.ts.map +1 -0
  281. package/dist/tt-quantity.js +396 -0
  282. package/dist/tt-quantity.js.map +1 -0
  283. package/dist/tt-radio-group.d.ts +50 -0
  284. package/dist/tt-radio-group.d.ts.map +1 -0
  285. package/dist/tt-radio-group.js +372 -0
  286. package/dist/tt-radio-group.js.map +1 -0
  287. package/dist/tt-rating.d.ts +54 -0
  288. package/dist/tt-rating.d.ts.map +1 -0
  289. package/dist/tt-rating.js +312 -0
  290. package/dist/tt-rating.js.map +1 -0
  291. package/dist/tt-search.d.ts +47 -0
  292. package/dist/tt-search.d.ts.map +1 -0
  293. package/dist/tt-search.js +360 -0
  294. package/dist/tt-search.js.map +1 -0
  295. package/dist/tt-section.d.ts +13 -0
  296. package/dist/tt-section.d.ts.map +1 -0
  297. package/dist/tt-section.js +98 -0
  298. package/dist/tt-section.js.map +1 -0
  299. package/dist/tt-select.d.ts +62 -0
  300. package/dist/tt-select.d.ts.map +1 -0
  301. package/dist/tt-select.js +662 -0
  302. package/dist/tt-select.js.map +1 -0
  303. package/dist/tt-skeleton.d.ts +20 -0
  304. package/dist/tt-skeleton.d.ts.map +1 -0
  305. package/dist/tt-skeleton.js +143 -0
  306. package/dist/tt-skeleton.js.map +1 -0
  307. package/dist/tt-slider.d.ts +74 -0
  308. package/dist/tt-slider.d.ts.map +1 -0
  309. package/dist/tt-slider.js +426 -0
  310. package/dist/tt-slider.js.map +1 -0
  311. package/dist/tt-social-links.d.ts +34 -0
  312. package/dist/tt-social-links.d.ts.map +1 -0
  313. package/dist/tt-social-links.js +242 -0
  314. package/dist/tt-social-links.js.map +1 -0
  315. package/dist/tt-sparkline.d.ts +19 -0
  316. package/dist/tt-sparkline.d.ts.map +1 -0
  317. package/dist/tt-sparkline.js +191 -0
  318. package/dist/tt-sparkline.js.map +1 -0
  319. package/dist/tt-spinner.d.ts +19 -0
  320. package/dist/tt-spinner.d.ts.map +1 -0
  321. package/dist/tt-spinner.js +93 -0
  322. package/dist/tt-spinner.js.map +1 -0
  323. package/dist/tt-stack.d.ts +42 -0
  324. package/dist/tt-stack.d.ts.map +1 -0
  325. package/dist/tt-stack.js +158 -0
  326. package/dist/tt-stack.js.map +1 -0
  327. package/dist/tt-stat.d.ts +17 -0
  328. package/dist/tt-stat.d.ts.map +1 -0
  329. package/dist/tt-stat.js +134 -0
  330. package/dist/tt-stat.js.map +1 -0
  331. package/dist/tt-switch.d.ts +39 -0
  332. package/dist/tt-switch.d.ts.map +1 -0
  333. package/dist/tt-switch.js +254 -0
  334. package/dist/tt-switch.js.map +1 -0
  335. package/dist/tt-switcher.d.ts +23 -0
  336. package/dist/tt-switcher.d.ts.map +1 -0
  337. package/dist/tt-switcher.js +203 -0
  338. package/dist/tt-switcher.js.map +1 -0
  339. package/dist/tt-table-cell.d.ts +26 -0
  340. package/dist/tt-table-cell.d.ts.map +1 -0
  341. package/dist/tt-table-cell.js +121 -0
  342. package/dist/tt-table-cell.js.map +1 -0
  343. package/dist/tt-table-row.d.ts +31 -0
  344. package/dist/tt-table-row.d.ts.map +1 -0
  345. package/dist/tt-table-row.js +72 -0
  346. package/dist/tt-table-row.js.map +1 -0
  347. package/dist/tt-table.d.ts +44 -0
  348. package/dist/tt-table.d.ts.map +1 -0
  349. package/dist/tt-table.js +270 -0
  350. package/dist/tt-table.js.map +1 -0
  351. package/dist/tt-tabs.d.ts +31 -0
  352. package/dist/tt-tabs.d.ts.map +1 -0
  353. package/dist/tt-tabs.js +223 -0
  354. package/dist/tt-tabs.js.map +1 -0
  355. package/dist/tt-tag-list.d.ts +19 -0
  356. package/dist/tt-tag-list.d.ts.map +1 -0
  357. package/dist/tt-tag-list.js +136 -0
  358. package/dist/tt-tag-list.js.map +1 -0
  359. package/dist/tt-text.d.ts +52 -0
  360. package/dist/tt-text.d.ts.map +1 -0
  361. package/dist/tt-text.js +337 -0
  362. package/dist/tt-text.js.map +1 -0
  363. package/dist/tt-textarea.d.ts +43 -0
  364. package/dist/tt-textarea.d.ts.map +1 -0
  365. package/dist/tt-textarea.js +356 -0
  366. package/dist/tt-textarea.js.map +1 -0
  367. package/dist/tt-thread.d.ts +62 -0
  368. package/dist/tt-thread.d.ts.map +1 -0
  369. package/dist/tt-thread.js +374 -0
  370. package/dist/tt-thread.js.map +1 -0
  371. package/dist/tt-toast.d.ts +49 -0
  372. package/dist/tt-toast.d.ts.map +1 -0
  373. package/dist/tt-toast.js +440 -0
  374. package/dist/tt-toast.js.map +1 -0
  375. package/dist/tt-toggle-group.d.ts +73 -0
  376. package/dist/tt-toggle-group.d.ts.map +1 -0
  377. package/dist/tt-toggle-group.js +273 -0
  378. package/dist/tt-toggle-group.js.map +1 -0
  379. package/dist/tt-toggle.d.ts +54 -0
  380. package/dist/tt-toggle.d.ts.map +1 -0
  381. package/dist/tt-toggle.js +232 -0
  382. package/dist/tt-toggle.js.map +1 -0
  383. package/dist/tt-toolbar.d.ts +26 -0
  384. package/dist/tt-toolbar.d.ts.map +1 -0
  385. package/dist/tt-toolbar.js +164 -0
  386. package/dist/tt-toolbar.js.map +1 -0
  387. package/dist/tt-tooltip.d.ts +42 -0
  388. package/dist/tt-tooltip.d.ts.map +1 -0
  389. package/dist/tt-tooltip.js +299 -0
  390. package/dist/tt-tooltip.js.map +1 -0
  391. package/package.json +84 -4
  392. package/vscode.html-custom-data.json +2911 -0
@@ -0,0 +1,210 @@
1
+ import { Directive, directive } from "lit/directive.js";
2
+ import { PartType } from "lit/directive.js";
3
+ /*
4
+ A resize HANDLE, behaviour only: it reports movement and never applies
5
+ it.
6
+
7
+ Put it on the strip or corner a person grabs. The owner keeps the size,
8
+ which is "events up, data down": the handle cannot know what it
9
+ resizes, so the same directive serves a sidebar, a table column and a
10
+ builder's canvas. The owner's half of the deal:
11
+
12
+ - Remember the size in onResizeStart, then set start + delta in
13
+ onResize. The delta counts from the start of the gesture, so a late
14
+ or dropped move event cannot make the size drift.
15
+ - Clamp to your own minimum and maximum. The handle knows no bounds.
16
+ - Divide by any scale you draw at (a zoomed canvas). The delta is in
17
+ the page's pixels, not yours.
18
+ - Give the handle its meaning. This sets no role, ARIA or tabindex,
19
+ because only the owner knows the label and the current size. The
20
+ pattern is a focusable separator (the "window splitter"):
21
+ role="separator" tabindex="0" aria-label="Resize sidebar"
22
+ aria-orientation="vertical" aria-valuenow="280"
23
+ plus aria-valuemin and aria-valuemax when there are bounds.
24
+ aria-orientation names the LINE, not the movement: a handle dragged
25
+ left and right is a vertical line.
26
+
27
+ Listeners are attached ONCE and read the latest options, as in
28
+ tt-draggable. update() runs on every render of the template this sits
29
+ in, and here that is every pointer move, because an onResize that sets
30
+ the owner's state re-renders it. Detaching and reattaching each time
31
+ would strip the `resizing` attribute and lose the gesture mid-drag.
32
+ Keeping the newest options in a field gives the same "always current"
33
+ behaviour without touching the element.
34
+ */
35
+ class ResizableDirective extends Directive {
36
+ constructor(partInfo) {
37
+ super(partInfo);
38
+ this.options = {};
39
+ this.attached = false;
40
+ // The pointer driving the current drag, or null between gestures.
41
+ this.pointerId = null;
42
+ this.startX = 0;
43
+ this.startY = 0;
44
+ this.delta = { dx: 0, dy: 0 };
45
+ this.handlePointerDown = (e) => {
46
+ // The main button only: a right click opens a menu, it does not resize.
47
+ if (e.button !== 0 || !this.element)
48
+ return;
49
+ // A press while a gesture is still open means its end never arrived
50
+ // (the handle was moved in the DOM mid-drag, say). Close it, so every
51
+ // start the owner hears is matched by exactly one end.
52
+ this.end();
53
+ /*
54
+ Capture sends every later move, and the release, to this element
55
+ even once the pointer has left it. A handle is a few pixels wide,
56
+ so without capture a quick drag outruns it and the resize stalls.
57
+
58
+ In a try because it throws for a pointer the browser is not
59
+ tracking, which is exactly what a synthetic PointerEvent in a test
60
+ is. Nothing else depends on it, so the gesture still runs.
61
+ */
62
+ try {
63
+ this.element.setPointerCapture(e.pointerId);
64
+ }
65
+ catch {
66
+ // Not a live pointer. See above.
67
+ }
68
+ this.pointerId = e.pointerId;
69
+ this.startX = e.clientX;
70
+ this.startY = e.clientY;
71
+ this.delta = { dx: 0, dy: 0 };
72
+ this.element.setAttribute("resizing", "");
73
+ this.options.onResizeStart?.();
74
+ };
75
+ this.handlePointerMove = (e) => {
76
+ if (e.pointerId !== this.pointerId)
77
+ return;
78
+ // Cumulative from where the press started, never per event.
79
+ this.delta = this.measure(e.clientX - this.startX, e.clientY - this.startY);
80
+ this.options.onResize?.(this.delta);
81
+ };
82
+ // pointerup, pointercancel and lostpointercapture all end a drag, and a
83
+ // real release fires two of them. end() only acts on the first.
84
+ this.handlePointerEnd = (e) => {
85
+ if (e.pointerId === this.pointerId)
86
+ this.end();
87
+ };
88
+ /*
89
+ Each key press is a whole gesture: start, one move, end. An owner
90
+ then handles the keyboard and the pointer with the same three
91
+ callbacks and never needs to know which one it got.
92
+ */
93
+ this.handleKeyDown = (e) => {
94
+ // A key in the middle of a drag would open a second gesture inside
95
+ // the first, and reset the start size the owner is counting from.
96
+ if (this.pointerId !== null)
97
+ return;
98
+ // With Alt, Ctrl or Meta held, an arrow belongs to the browser or the
99
+ // system (Alt+Left is Back), not to this handle.
100
+ if (e.altKey || e.ctrlKey || e.metaKey)
101
+ return;
102
+ const delta = this.keyDelta(e.key);
103
+ if (!delta)
104
+ return;
105
+ // Only for keys this handles, or the page would scroll as well.
106
+ e.preventDefault();
107
+ const { onResizeStart, onResize, onResizeEnd } = this.options;
108
+ onResizeStart?.();
109
+ onResize?.(delta);
110
+ onResizeEnd?.(delta);
111
+ };
112
+ if (partInfo.type !== PartType.ELEMENT) {
113
+ throw new Error("The resizable directive can only be attached directly to an element (e.g. <div ${resizable()}>)");
114
+ }
115
+ }
116
+ render(_options) {
117
+ // Behavior-only directive
118
+ }
119
+ update(part, [options = {}]) {
120
+ this.element = part.element;
121
+ this.options = options;
122
+ if (options.disabled)
123
+ this.detach();
124
+ else
125
+ this.attach();
126
+ }
127
+ // The axis that is not asked for is always 0, so an owner can apply
128
+ // both numbers without checking which one it wanted.
129
+ measure(dx, dy) {
130
+ const axis = this.options.axis ?? "x";
131
+ return {
132
+ dx: axis === "y" ? 0 : dx,
133
+ dy: axis === "x" ? 0 : dy,
134
+ };
135
+ }
136
+ end() {
137
+ if (this.pointerId === null)
138
+ return;
139
+ this.pointerId = null;
140
+ this.element?.removeAttribute("resizing");
141
+ this.options.onResizeEnd?.(this.delta);
142
+ }
143
+ // A key for the axis that is not reported does nothing at all, so
144
+ // ArrowUp on a sideways handle still scrolls the page as it normally would.
145
+ keyDelta(key) {
146
+ const axis = this.options.axis ?? "x";
147
+ const step = this.options.step ?? 16;
148
+ const sideways = axis !== "y";
149
+ const upDown = axis !== "x";
150
+ switch (key) {
151
+ case "ArrowLeft":
152
+ return sideways ? { dx: -step, dy: 0 } : null;
153
+ case "ArrowRight":
154
+ return sideways ? { dx: step, dy: 0 } : null;
155
+ case "ArrowUp":
156
+ return upDown ? { dx: 0, dy: -step } : null;
157
+ case "ArrowDown":
158
+ return upDown ? { dx: 0, dy: step } : null;
159
+ default:
160
+ return null;
161
+ }
162
+ }
163
+ attach() {
164
+ if (this.attached || !this.element)
165
+ return;
166
+ this.attached = true;
167
+ /*
168
+ touch-action: none, or a touch drag scrolls the page instead of
169
+ resizing. The browser decides that a touch is a scroll before any
170
+ script runs, then cancels the pointer a few pixels in.
171
+
172
+ Inline, because a directive has no stylesheet of its own. So do not
173
+ bind the handle's own style attribute in a template: that binding
174
+ rewrites the whole attribute and would drop this.
175
+ */
176
+ this.element.style.touchAction = "none";
177
+ this.element.addEventListener("pointerdown", this.handlePointerDown);
178
+ this.element.addEventListener("pointermove", this.handlePointerMove);
179
+ this.element.addEventListener("pointerup", this.handlePointerEnd);
180
+ this.element.addEventListener("pointercancel", this.handlePointerEnd);
181
+ this.element.addEventListener("lostpointercapture", this.handlePointerEnd);
182
+ this.element.addEventListener("keydown", this.handleKeyDown);
183
+ }
184
+ detach() {
185
+ if (!this.attached || !this.element)
186
+ return;
187
+ this.attached = false;
188
+ /*
189
+ Disabling mid-drag cancels the gesture WITHOUT calling onResizeEnd.
190
+ This runs inside the owner's render, and the owner is the one that
191
+ turned the handle off, so it already knows. A callback here would
192
+ be setting the owner's state in the middle of its own render.
193
+ */
194
+ if (this.pointerId !== null &&
195
+ this.element.hasPointerCapture(this.pointerId)) {
196
+ this.element.releasePointerCapture(this.pointerId);
197
+ }
198
+ this.pointerId = null;
199
+ this.element.removeAttribute("resizing");
200
+ this.element.style.removeProperty("touch-action");
201
+ this.element.removeEventListener("pointerdown", this.handlePointerDown);
202
+ this.element.removeEventListener("pointermove", this.handlePointerMove);
203
+ this.element.removeEventListener("pointerup", this.handlePointerEnd);
204
+ this.element.removeEventListener("pointercancel", this.handlePointerEnd);
205
+ this.element.removeEventListener("lostpointercapture", this.handlePointerEnd);
206
+ this.element.removeEventListener("keydown", this.handleKeyDown);
207
+ }
208
+ }
209
+ export const resizable = directive(ResizableDirective);
210
+ //# sourceMappingURL=tt-resizable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tt-resizable.js","sourceRoot":"","sources":["../../src/interaction/tt-resizable.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ import { AsyncDirective } from "lit/async-directive.js";
2
+ import type { ElementPart, PartInfo, DirectiveParameters } from "lit/directive.js";
3
+ /** The way an element travels as it arrives. "none" only fades. */
4
+ export type RevealDirection = "up" | "down" | "left" | "right" | "none";
5
+ export interface RevealOptions {
6
+ /** Default "up": starts a little below its place and rises into it. */
7
+ direction?: RevealDirection;
8
+ /** How far it travels. A CSS length, or a number of pixels. Default --tt-reveal-distance, else 1.5rem. */
9
+ distance?: string | number;
10
+ /** Milliseconds before it starts moving. Default 0. */
11
+ delay?: number;
12
+ /** Its place in a group that arrives together. Each step adds `stagger` ms of delay. Default 0. */
13
+ index?: number;
14
+ /** Milliseconds per index step. Default 60. */
15
+ stagger?: number;
16
+ /** Default true: arrive once, then stay. false hides it again whenever it leaves the viewport, so it replays. */
17
+ once?: boolean;
18
+ /** Grows or shrinks the viewport the observer checks against. Default "0px": any pixel in view counts. */
19
+ rootMargin?: string;
20
+ /** Shown as it is, with no observer. */
21
+ disabled?: boolean;
22
+ /** Called each time it comes into view (with or without motion). */
23
+ onReveal?: (element: Element) => void;
24
+ }
25
+ declare class RevealDirective extends AsyncDirective {
26
+ private element?;
27
+ private options;
28
+ private state;
29
+ private unwatch?;
30
+ private cancelFinish?;
31
+ private queued;
32
+ constructor(partInfo: PartInfo);
33
+ render(_options?: RevealOptions): void;
34
+ update(part: ElementPart, [options]: DirectiveParameters<this>): void;
35
+ private sync;
36
+ private start;
37
+ private writeOffsets;
38
+ private handleEntry;
39
+ private reveal;
40
+ private settle;
41
+ private handleFocusIn;
42
+ private stopWatching;
43
+ private stop;
44
+ protected disconnected(): void;
45
+ }
46
+ /**
47
+ * Fades and slides an element into place when it scrolls into view.
48
+ *
49
+ * <section ${reveal()}>...</section>
50
+ * ${items.map((item, i) => html`<li ${reveal({ index: i % 3 })}>...</li>`)}
51
+ */
52
+ export declare const reveal: (_options?: RevealOptions | undefined) => import("lit-html/directive.js").DirectiveResult<typeof RevealDirective>;
53
+ export {};
54
+ //# sourceMappingURL=tt-reveal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tt-reveal.d.ts","sourceRoot":"","sources":["../../src/interaction/tt-reveal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAGxD,OAAO,KAAK,EACV,WAAW,EACX,QAAQ,EACR,mBAAmB,EACpB,MAAM,kBAAkB,CAAC;AAI1B,mEAAmE;AACnE,MAAM,MAAM,eAAe,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;AAExE,MAAM,WAAW,aAAa;IAC5B,uEAAuE;IACvE,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,0GAA0G;IAC1G,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC3B,uDAAuD;IACvD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mGAAmG;IACnG,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+CAA+C;IAC/C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iHAAiH;IACjH,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,0GAA0G;IAC1G,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,wCAAwC;IACxC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,oEAAoE;IACpE,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;CACvC;AAoKD,cAAM,eAAgB,SAAQ,cAAc;IAC1C,OAAO,CAAC,OAAO,CAAC,CAAc;IAC9B,OAAO,CAAC,OAAO,CAAqB;IACpC,OAAO,CAAC,KAAK,CAAiB;IAE9B,OAAO,CAAC,OAAO,CAAC,CAAa;IAC7B,OAAO,CAAC,YAAY,CAAC,CAAa;IAClC,OAAO,CAAC,MAAM,CAAS;gBAEX,QAAQ,EAAE,QAAQ;IAS9B,MAAM,CAAC,QAAQ,CAAC,EAAE,aAAa,GAAG,IAAI;IAI7B,MAAM,CACb,IAAI,EAAE,WAAW,EACjB,CAAC,OAAY,CAAC,EAAE,mBAAmB,CAAC,IAAI,CAAC,GACxC,IAAI;IA2BP,OAAO,CAAC,IAAI;IAQZ,OAAO,CAAC,KAAK;IAyBb,OAAO,CAAC,YAAY;IAapB,OAAO,CAAC,WAAW,CAoBjB;IAEF,OAAO,CAAC,MAAM;IAuBd,OAAO,CAAC,MAAM;IAOd,OAAO,CAAC,aAAa,CAMnB;IAEF,OAAO,CAAC,YAAY;IAOpB,OAAO,CAAC,IAAI;cAmBO,YAAY,IAAI,IAAI;CAIxC;AAED;;;;;GAKG;AACH,eAAO,MAAM,MAAM,mHAA6B,CAAC"}
@@ -0,0 +1,302 @@
1
+ import { AsyncDirective } from "lit/async-directive.js";
2
+ import { directive, PartType } from "lit/directive.js";
3
+ import { afterTransitions } from "../motion.js";
4
+ /*
5
+ Content that fades and rises into place as it scrolls into view.
6
+
7
+ THE STYLES ARE CSS, NOT SCRIPT. The directive only flips one attribute,
8
+ data-tt-reveal, from "hidden" to "in". What those two states look like
9
+ lives in one shared stylesheet, adopted into whichever document or
10
+ shadow root the element sits in, and every rule in it is inside
11
+
12
+ @media screen and (prefers-reduced-motion: no-preference)
13
+
14
+ That single query is the safety net. Reduced motion, a printout, and a
15
+ setting changed while the page is open all show the content at once,
16
+ decided by the browser, with no script to get wrong. Where the sheet
17
+ cannot be adopted, or IntersectionObserver is missing, nothing is ever
18
+ hidden at all: the failure mode is "no animation", never "no content".
19
+
20
+ Only opacity and translate, so the element keeps its box from the first
21
+ frame and nothing around it moves (no layout shift). translate, not
22
+ transform, so an element that already has a transform keeps it.
23
+
24
+ !important in the sheet, deliberately. The two states are short-lived
25
+ and owned by this directive, and without it any consumer rule more
26
+ specific than an attribute selector (".grid .card { opacity: 1 }")
27
+ silently cancels the hidden state, and with it the whole effect. Once
28
+ the element has arrived the attribute is removed, so its own styles,
29
+ transitions included, are back in charge.
30
+
31
+ Keyboard users never land on an invisible control: focus moving inside
32
+ a hidden element reveals it on the spot.
33
+ */
34
+ const STYLES = `
35
+ @media screen and (prefers-reduced-motion: no-preference) {
36
+ [data-tt-reveal="hidden"] {
37
+ opacity: 0 !important;
38
+ translate: var(--_tt-reveal-x, 0) var(--_tt-reveal-y, 0) !important;
39
+ }
40
+
41
+ [data-tt-reveal="in"] {
42
+ transition:
43
+ opacity var(--tt-reveal-duration, var(--tt-duration-slower))
44
+ var(--tt-ease-out) var(--_tt-reveal-delay, 0ms),
45
+ translate var(--tt-reveal-duration, var(--tt-duration-slower))
46
+ var(--tt-ease-out) var(--_tt-reveal-delay, 0ms) !important;
47
+ }
48
+ }
49
+ `;
50
+ // Built once, on first use, and shared by every root. null once it is
51
+ // known the browser cannot construct one.
52
+ let sheet;
53
+ function revealSheet() {
54
+ if (sheet === undefined) {
55
+ try {
56
+ sheet = new CSSStyleSheet();
57
+ sheet.replaceSync(STYLES);
58
+ }
59
+ catch {
60
+ sheet = null;
61
+ }
62
+ }
63
+ return sheet;
64
+ }
65
+ /*
66
+ Puts the shared sheet into the root the element lives in. A shadow root
67
+ sees none of the page's styles, so each root needs it once. False when
68
+ that is impossible: a detached element, a root in another document (an
69
+ iframe), or no constructable stylesheets.
70
+ */
71
+ function adoptInto(root) {
72
+ if (!(root instanceof Document || root instanceof ShadowRoot))
73
+ return false;
74
+ const shared = revealSheet();
75
+ if (!shared)
76
+ return false;
77
+ try {
78
+ if (!root.adoptedStyleSheets.includes(shared)) {
79
+ root.adoptedStyleSheets = [...root.adoptedStyleSheets, shared];
80
+ }
81
+ return true;
82
+ }
83
+ catch {
84
+ return false;
85
+ }
86
+ }
87
+ const pools = new Map();
88
+ function watch(element, rootMargin, watcher) {
89
+ let pool = pools.get(rootMargin);
90
+ if (!pool) {
91
+ const watchers = new Map();
92
+ const observer = new IntersectionObserver((entries) => {
93
+ for (const entry of entries)
94
+ watchers.get(entry.target)?.(entry);
95
+ }, { rootMargin, threshold: 0 });
96
+ pool = { observer, watchers };
97
+ pools.set(rootMargin, pool);
98
+ }
99
+ const owner = pool;
100
+ owner.watchers.set(element, watcher);
101
+ owner.observer.observe(element);
102
+ return () => {
103
+ if (owner.watchers.get(element) !== watcher)
104
+ return;
105
+ owner.watchers.delete(element);
106
+ owner.observer.unobserve(element);
107
+ // The last one out disconnects it, so no observer outlives its use.
108
+ if (owner.watchers.size === 0) {
109
+ owner.observer.disconnect();
110
+ if (pools.get(rootMargin) === owner)
111
+ pools.delete(rootMargin);
112
+ }
113
+ };
114
+ }
115
+ function toLength(distance) {
116
+ if (distance === undefined)
117
+ return "var(--tt-reveal-distance, 1.5rem)";
118
+ return typeof distance === "number" ? `${distance}px` : distance;
119
+ }
120
+ // Where the element starts, as the x and y it travels FROM.
121
+ function offsets(direction, length) {
122
+ switch (direction) {
123
+ case "down":
124
+ return ["0px", `calc(${length} * -1)`];
125
+ case "left":
126
+ return [length, "0px"];
127
+ case "right":
128
+ return [`calc(${length} * -1)`, "0px"];
129
+ case "none":
130
+ return ["0px", "0px"];
131
+ default:
132
+ return ["0px", length];
133
+ }
134
+ }
135
+ /*
136
+ An AsyncDirective rather than a plain one, for disconnected(): it is
137
+ told when its element leaves the page, which is where the observer is
138
+ given up. A plain Directive never hears about it, and the observer
139
+ would keep the element alive.
140
+ */
141
+ class RevealDirective extends AsyncDirective {
142
+ constructor(partInfo) {
143
+ super(partInfo);
144
+ this.options = {};
145
+ this.state = "idle";
146
+ this.queued = false;
147
+ this.handleEntry = (entry) => {
148
+ // Removed without a disconnect reaching this directive (a template
149
+ // rendered with render() and never cleared): stop holding on to it.
150
+ if (!this.element?.isConnected) {
151
+ this.stopWatching();
152
+ return;
153
+ }
154
+ if (entry.isIntersecting) {
155
+ if (this.state === "hidden")
156
+ this.reveal();
157
+ return;
158
+ }
159
+ // Left the viewport. Only a replaying reveal goes back to hidden,
160
+ // and it does so instantly, out of sight.
161
+ if (this.options.once === false && this.state !== "hidden") {
162
+ this.cancelFinish?.();
163
+ this.element?.setAttribute("data-tt-reveal", "hidden");
164
+ this.state = "hidden";
165
+ }
166
+ };
167
+ // Tabbed into while still hidden: shown at once, not faded in under
168
+ // the focus ring.
169
+ this.handleFocusIn = () => {
170
+ if (this.state !== "hidden")
171
+ return;
172
+ if (this.options.once !== false)
173
+ this.stopWatching();
174
+ this.settle();
175
+ if (this.element)
176
+ this.options.onReveal?.(this.element);
177
+ };
178
+ if (partInfo.type !== PartType.ELEMENT) {
179
+ throw new Error("The reveal directive can only be attached directly to an element (e.g. <section ${reveal()}>)");
180
+ }
181
+ }
182
+ render(_options) {
183
+ // Behaviour-only directive
184
+ }
185
+ update(part, [options = {}]) {
186
+ this.element = part.element;
187
+ this.options = options;
188
+ if (options.disabled) {
189
+ this.stop();
190
+ // Re-enabling arms it again, unless it has already arrived.
191
+ if (this.state !== "done")
192
+ this.state = "idle";
193
+ return;
194
+ }
195
+ /*
196
+ In a microtask, never during the render itself. On a first render
197
+ this runs while the template is still a detached fragment, so there
198
+ is no root to adopt the sheet into yet, and a style binding later
199
+ on the same element would overwrite the custom properties written
200
+ now. A microtask still runs before the first paint.
201
+ */
202
+ if (!this.queued) {
203
+ this.queued = true;
204
+ queueMicrotask(() => {
205
+ this.queued = false;
206
+ this.sync();
207
+ });
208
+ }
209
+ }
210
+ sync() {
211
+ const element = this.element;
212
+ if (!element || !this.isConnected || this.options.disabled)
213
+ return;
214
+ if (this.state === "idle")
215
+ this.start(element);
216
+ else if (this.state === "hidden")
217
+ this.writeOffsets(element);
218
+ }
219
+ start(element) {
220
+ const supported = typeof IntersectionObserver === "function" &&
221
+ adoptInto(element.getRootNode());
222
+ // Nothing is hidden that cannot be shown again: without an observer
223
+ // or the stylesheet, the element simply stays as it is.
224
+ if (!supported) {
225
+ this.state = "done";
226
+ this.options.onReveal?.(element);
227
+ return;
228
+ }
229
+ this.writeOffsets(element);
230
+ element.setAttribute("data-tt-reveal", "hidden");
231
+ this.state = "hidden";
232
+ element.addEventListener("focusin", this.handleFocusIn);
233
+ this.unwatch = watch(element, this.options.rootMargin ?? "0px", this.handleEntry);
234
+ }
235
+ writeOffsets(element) {
236
+ const { direction = "up", distance, delay = 0, index = 0, stagger = 60 } = this.options;
237
+ const [x, y] = offsets(direction, toLength(distance));
238
+ element.style.setProperty("--_tt-reveal-x", x);
239
+ element.style.setProperty("--_tt-reveal-y", y);
240
+ element.style.setProperty("--_tt-reveal-delay", `${Math.max(0, delay + index * stagger)}ms`);
241
+ }
242
+ reveal() {
243
+ const element = this.element;
244
+ if (!element)
245
+ return;
246
+ element.setAttribute("data-tt-reveal", "in");
247
+ this.state = "in";
248
+ // Arriving once means there is nothing left to watch for.
249
+ if (this.options.once !== false)
250
+ this.stopWatching();
251
+ this.options.onReveal?.(element);
252
+ // Read after "in" is applied, so the durations are the reveal's own.
253
+ this.cancelFinish = afterTransitions([element], () => {
254
+ this.cancelFinish = undefined;
255
+ this.settle();
256
+ });
257
+ }
258
+ /*
259
+ Arrived: the attribute goes, so the element's own styles (its own
260
+ transitions especially) are back in charge.
261
+ */
262
+ settle() {
263
+ this.element?.removeAttribute("data-tt-reveal");
264
+ this.state = this.options.once === false ? "shown" : "done";
265
+ }
266
+ stopWatching() {
267
+ this.unwatch?.();
268
+ this.unwatch = undefined;
269
+ this.element?.removeEventListener("focusin", this.handleFocusIn);
270
+ }
271
+ // Back to the element exactly as it was written, fully visible.
272
+ stop() {
273
+ this.stopWatching();
274
+ this.cancelFinish?.();
275
+ this.cancelFinish = undefined;
276
+ const element = this.element;
277
+ if (!element)
278
+ return;
279
+ element.removeAttribute("data-tt-reveal");
280
+ element.style.removeProperty("--_tt-reveal-x");
281
+ element.style.removeProperty("--_tt-reveal-y");
282
+ element.style.removeProperty("--_tt-reveal-delay");
283
+ }
284
+ /*
285
+ Left the page (or the template stopped using this directive). The
286
+ observer is given up and the element is left VISIBLE: if it is ever
287
+ put back, it should be there, not waiting on a reveal that already
288
+ belonged to its last visit.
289
+ */
290
+ disconnected() {
291
+ this.stop();
292
+ this.state = "done";
293
+ }
294
+ }
295
+ /**
296
+ * Fades and slides an element into place when it scrolls into view.
297
+ *
298
+ * <section ${reveal()}>...</section>
299
+ * ${items.map((item, i) => html`<li ${reveal({ index: i % 3 })}>...</li>`)}
300
+ */
301
+ export const reveal = directive(RevealDirective);
302
+ //# sourceMappingURL=tt-reveal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tt-reveal.js","sourceRoot":"","sources":["../../src/interaction/tt-reveal.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Calls `done` once the transitions on every element given have had time
3
+ * to finish. Call it AFTER the styles being waited on are applied (the
4
+ * closing ones, say), so the durations it reads are theirs. Returns a
5
+ * cancel function, for an overlay reopened before its exit finished.
6
+ */
7
+ export declare function afterTransitions(elements: (Element | null | undefined)[], done: () => void): () => void;
8
+ //# sourceMappingURL=motion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"motion.d.ts","sourceRoot":"","sources":["../src/motion.ts"],"names":[],"mappings":"AAuCA;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,CAAC,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC,EAAE,EACxC,IAAI,EAAE,MAAM,IAAI,GACf,MAAM,IAAI,CAUZ"}
package/dist/motion.js ADDED
@@ -0,0 +1,49 @@
1
+ /*
2
+ Knowing when a transition is over, for motion that has to clean up
3
+ after itself.
4
+
5
+ Exit motion for things that are REMOVED when they close (tt-modal,
6
+ tt-drawer, a dismissed tt-toast) needs it most. Removing an element ends
7
+ its styles at once, so there is nothing left to animate. Those
8
+ components keep the closing copy on the page, `inert` and click-through,
9
+ and drop it once its transitions have run. The reveal() directive uses
10
+ it the same way, to hand an element back its own styles after it
11
+ arrives.
12
+
13
+ A timer read from the computed durations, not `transitionend`. A
14
+ transition that never starts never ends: a consumer who turns motion off
15
+ through ::part(), or a tab in the background that paints no frames,
16
+ would otherwise leave the closing copy on the page for good. Reading the
17
+ durations also follows the reduced-motion block in tokens.css for free,
18
+ since that makes every one of them 1ms.
19
+ */
20
+ // "0.25s, 150ms" -> [250, 150]
21
+ function toMs(list) {
22
+ return list.split(",").map((value) => {
23
+ const n = Number.parseFloat(value);
24
+ if (Number.isNaN(n))
25
+ return 0;
26
+ return value.trim().endsWith("ms") ? n : n * 1000;
27
+ });
28
+ }
29
+ // The longest duration plus the longest delay: a slight overestimate when
30
+ // the two belong to different properties, which only costs a few ms.
31
+ function longest(element) {
32
+ const style = getComputedStyle(element);
33
+ return (Math.max(0, ...toMs(style.transitionDuration)) +
34
+ Math.max(0, ...toMs(style.transitionDelay)));
35
+ }
36
+ /**
37
+ * Calls `done` once the transitions on every element given have had time
38
+ * to finish. Call it AFTER the styles being waited on are applied (the
39
+ * closing ones, say), so the durations it reads are theirs. Returns a
40
+ * cancel function, for an overlay reopened before its exit finished.
41
+ */
42
+ export function afterTransitions(elements, done) {
43
+ const wait = Math.max(0, ...elements.filter((el) => !!el).map(longest));
44
+ // A little slack, so the last frame of the fade is painted before the
45
+ // element goes.
46
+ const timer = setTimeout(done, wait > 0 ? wait + 20 : 0);
47
+ return () => clearTimeout(timer);
48
+ }
49
+ //# sourceMappingURL=motion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"motion.js","sourceRoot":"","sources":["../src/motion.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;EAkBE;AAEF,+BAA+B;AAC/B,SAAS,IAAI,CAAC,IAAY;IACxB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QACnC,MAAM,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QACnC,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC;QAC9B,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IACpD,CAAC,CAAC,CAAC;AACL,CAAC;AAED,0EAA0E;AAC1E,qEAAqE;AACrE,SAAS,OAAO,CAAC,OAAgB;IAC/B,MAAM,KAAK,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IACxC,OAAO,CACL,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;QAC9C,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAC5C,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAC9B,QAAwC,EACxC,IAAgB;IAEhB,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CACnB,CAAC,EACD,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,EAAiB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAC7D,CAAC;IAEF,sEAAsE;IACtE,gBAAgB;IAChB,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACzD,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;AACnC,CAAC"}