@breadstone/mosaik-elements-foundation 0.1.50 → 0.1.52

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 (308) hide show
  1. package/Controls/Components/Inputs/Calendar/CalendarElement.d.ts +1 -1
  2. package/Controls/Components/Inputs/Calendar/CalendarElement.d.ts.map +1 -1
  3. package/Controls/Components/Inputs/Calendar/CalendarElement.js +1 -3
  4. package/Controls/Components/Inputs/Calendar/CalendarElement.js.map +1 -1
  5. package/Controls/Components/Inputs/Calendar/CalendarElementTemplate.d.ts.map +1 -1
  6. package/Controls/Components/Inputs/Calendar/CalendarElementTemplate.js +4 -9
  7. package/Controls/Components/Inputs/Calendar/CalendarElementTemplate.js.map +1 -1
  8. package/Controls/Components/Inputs/Calendar/Themes/CalendarElement.Cosmopolitan.d.ts.map +1 -1
  9. package/Controls/Components/Inputs/Calendar/Themes/CalendarElement.Cosmopolitan.js +14 -0
  10. package/Controls/Components/Inputs/Calendar/Themes/CalendarElement.Cosmopolitan.js.map +1 -1
  11. package/Controls/Components/Inputs/Calendar/Themes/CalendarElement.Joy.d.ts.map +1 -1
  12. package/Controls/Components/Inputs/Calendar/Themes/CalendarElement.Joy.js +14 -0
  13. package/Controls/Components/Inputs/Calendar/Themes/CalendarElement.Joy.js.map +1 -1
  14. package/Controls/Components/Inputs/Calendar/Themes/CalendarElement.Memphis.d.ts.map +1 -1
  15. package/Controls/Components/Inputs/Calendar/Themes/CalendarElement.Memphis.js +14 -0
  16. package/Controls/Components/Inputs/Calendar/Themes/CalendarElement.Memphis.js.map +1 -1
  17. package/Controls/Components/Inputs/Choice/ChoiceGroupElement.d.ts +1 -1
  18. package/Controls/Components/Inputs/Choice/ChoiceGroupElement.d.ts.map +1 -1
  19. package/Controls/Components/Inputs/Choice/ChoiceGroupElement.js +5 -5
  20. package/Controls/Components/Inputs/Choice/ChoiceGroupElement.js.map +1 -1
  21. package/Controls/Components/Inputs/Radio/RadioElement.d.ts +0 -5
  22. package/Controls/Components/Inputs/Radio/RadioElement.d.ts.map +1 -1
  23. package/Controls/Components/Inputs/Radio/RadioElement.js +0 -5
  24. package/Controls/Components/Inputs/Radio/RadioElement.js.map +1 -1
  25. package/Controls/Components/Inputs/Radio/RadioGroupElement.d.ts +1 -1
  26. package/Controls/Components/Inputs/Radio/RadioGroupElement.d.ts.map +1 -1
  27. package/Controls/Components/Inputs/Radio/RadioGroupElement.js +6 -6
  28. package/Controls/Components/Inputs/Radio/RadioGroupElement.js.map +1 -1
  29. package/Controls/Components/Inputs/Radio/Themes/RadioElement.Cosmopolitan.d.ts.map +1 -1
  30. package/Controls/Components/Inputs/Radio/Themes/RadioElement.Cosmopolitan.js +5 -6
  31. package/Controls/Components/Inputs/Radio/Themes/RadioElement.Cosmopolitan.js.map +1 -1
  32. package/Controls/Components/Inputs/Radio/Themes/RadioElement.Joy.d.ts.map +1 -1
  33. package/Controls/Components/Inputs/Radio/Themes/RadioElement.Joy.js +7 -8
  34. package/Controls/Components/Inputs/Radio/Themes/RadioElement.Joy.js.map +1 -1
  35. package/Controls/Components/Inputs/Radio/Themes/RadioElement.Memphis.d.ts.map +1 -1
  36. package/Controls/Components/Inputs/Radio/Themes/RadioElement.Memphis.js +20 -21
  37. package/Controls/Components/Inputs/Radio/Themes/RadioElement.Memphis.js.map +1 -1
  38. package/Controls/Components/Inputs/Radio/Themes/RadioGroupElement.Cosmopolitan.js +10 -10
  39. package/Controls/Components/Inputs/Radio/Themes/RadioGroupElement.Joy.js +14 -14
  40. package/Controls/Components/Inputs/Radio/Themes/RadioGroupElement.Memphis.js +20 -20
  41. package/Controls/Components/Inputs/Select/ISelectItemVisualElementProps.d.ts +8 -0
  42. package/Controls/Components/Inputs/Select/ISelectItemVisualElementProps.d.ts.map +1 -0
  43. package/Controls/Components/Inputs/Select/ISelectItemVisualElementProps.js +2 -0
  44. package/Controls/Components/Inputs/Select/ISelectItemVisualElementProps.js.map +1 -0
  45. package/Controls/Components/Inputs/Select/SelectElement.d.ts +4 -0
  46. package/Controls/Components/Inputs/Select/SelectElement.d.ts.map +1 -1
  47. package/Controls/Components/Inputs/Select/SelectElement.js +52 -0
  48. package/Controls/Components/Inputs/Select/SelectElement.js.map +1 -1
  49. package/Controls/Components/Inputs/Select/SelectElementTemplate.d.ts.map +1 -1
  50. package/Controls/Components/Inputs/Select/SelectElementTemplate.js +9 -6
  51. package/Controls/Components/Inputs/Select/SelectElementTemplate.js.map +1 -1
  52. package/Controls/Components/Inputs/Select/SelectItemElement.d.ts +1 -0
  53. package/Controls/Components/Inputs/Select/SelectItemElement.d.ts.map +1 -1
  54. package/Controls/Components/Inputs/Select/SelectItemElement.js +1 -0
  55. package/Controls/Components/Inputs/Select/SelectItemElement.js.map +1 -1
  56. package/Controls/Components/Inputs/Select/SelectItemVisualElement.d.ts +81 -0
  57. package/Controls/Components/Inputs/Select/SelectItemVisualElement.d.ts.map +1 -0
  58. package/Controls/Components/Inputs/Select/SelectItemVisualElement.js +97 -0
  59. package/Controls/Components/Inputs/Select/SelectItemVisualElement.js.map +1 -0
  60. package/Controls/Components/Inputs/Select/SelectItemVisualElementTemplate.d.ts +9 -0
  61. package/Controls/Components/Inputs/Select/SelectItemVisualElementTemplate.d.ts.map +1 -0
  62. package/Controls/Components/Inputs/Select/SelectItemVisualElementTemplate.js +20 -0
  63. package/Controls/Components/Inputs/Select/SelectItemVisualElementTemplate.js.map +1 -0
  64. package/Controls/Components/Inputs/Select/Themes/SelectElement.Cosmopolitan.d.ts.map +1 -1
  65. package/Controls/Components/Inputs/Select/Themes/SelectElement.Cosmopolitan.js +13 -0
  66. package/Controls/Components/Inputs/Select/Themes/SelectElement.Cosmopolitan.js.map +1 -1
  67. package/Controls/Components/Inputs/Select/Themes/SelectElement.Joy.d.ts.map +1 -1
  68. package/Controls/Components/Inputs/Select/Themes/SelectElement.Joy.js +13 -0
  69. package/Controls/Components/Inputs/Select/Themes/SelectElement.Joy.js.map +1 -1
  70. package/Controls/Components/Inputs/Select/Themes/SelectElement.Memphis.d.ts.map +1 -1
  71. package/Controls/Components/Inputs/Select/Themes/SelectElement.Memphis.js +13 -0
  72. package/Controls/Components/Inputs/Select/Themes/SelectElement.Memphis.js.map +1 -1
  73. package/Controls/Components/Inputs/Select/Themes/SelectItemVisualElement.Cosmopolitan.d.ts +6 -0
  74. package/Controls/Components/Inputs/Select/Themes/SelectItemVisualElement.Cosmopolitan.d.ts.map +1 -0
  75. package/Controls/Components/Inputs/Select/Themes/SelectItemVisualElement.Cosmopolitan.js +75 -0
  76. package/Controls/Components/Inputs/Select/Themes/SelectItemVisualElement.Cosmopolitan.js.map +1 -0
  77. package/Controls/Components/Inputs/Select/Themes/SelectItemVisualElement.Joy.d.ts +6 -0
  78. package/Controls/Components/Inputs/Select/Themes/SelectItemVisualElement.Joy.d.ts.map +1 -0
  79. package/Controls/Components/Inputs/Select/Themes/SelectItemVisualElement.Joy.js +75 -0
  80. package/Controls/Components/Inputs/Select/Themes/SelectItemVisualElement.Joy.js.map +1 -0
  81. package/Controls/Components/Inputs/Select/Themes/SelectItemVisualElement.Memphis.d.ts +6 -0
  82. package/Controls/Components/Inputs/Select/Themes/SelectItemVisualElement.Memphis.d.ts.map +1 -0
  83. package/Controls/Components/Inputs/Select/Themes/SelectItemVisualElement.Memphis.js +75 -0
  84. package/Controls/Components/Inputs/Select/Themes/SelectItemVisualElement.Memphis.js.map +1 -0
  85. package/Controls/Components/Inputs/TextBox/TextBoxElement.d.ts +2 -0
  86. package/Controls/Components/Inputs/TextBox/TextBoxElement.d.ts.map +1 -1
  87. package/Controls/Components/Inputs/TextBox/TextBoxElement.js +13 -0
  88. package/Controls/Components/Inputs/TextBox/TextBoxElement.js.map +1 -1
  89. package/Controls/Components/Inputs/TextBox/TextBoxElementTemplate.d.ts.map +1 -1
  90. package/Controls/Components/Inputs/TextBox/TextBoxElementTemplate.js +50 -45
  91. package/Controls/Components/Inputs/TextBox/TextBoxElementTemplate.js.map +1 -1
  92. package/Controls/Components/Inputs/TextBox/Themes/TextBoxElement.Cosmopolitan.d.ts.map +1 -1
  93. package/Controls/Components/Inputs/TextBox/Themes/TextBoxElement.Cosmopolitan.js +30 -3
  94. package/Controls/Components/Inputs/TextBox/Themes/TextBoxElement.Cosmopolitan.js.map +1 -1
  95. package/Controls/Components/Inputs/TextBox/Themes/TextBoxElement.Joy.d.ts.map +1 -1
  96. package/Controls/Components/Inputs/TextBox/Themes/TextBoxElement.Joy.js +30 -3
  97. package/Controls/Components/Inputs/TextBox/Themes/TextBoxElement.Joy.js.map +1 -1
  98. package/Controls/Components/Inputs/TextBox/Themes/TextBoxElement.Memphis.d.ts.map +1 -1
  99. package/Controls/Components/Inputs/TextBox/Themes/TextBoxElement.Memphis.js +30 -3
  100. package/Controls/Components/Inputs/TextBox/Themes/TextBoxElement.Memphis.js.map +1 -1
  101. package/Controls/Components/Overlays/Dialog/DialogActionsElement.d.ts +3 -3
  102. package/Controls/Components/Overlays/Dialog/DialogActionsElement.d.ts.map +1 -1
  103. package/Controls/Components/Overlays/Dialog/DialogActionsElement.js +6 -10
  104. package/Controls/Components/Overlays/Dialog/DialogActionsElement.js.map +1 -1
  105. package/Controls/Components/Overlays/Dialog/DialogActionsElementTemplate.d.ts.map +1 -1
  106. package/Controls/Components/Overlays/Dialog/DialogActionsElementTemplate.js +6 -20
  107. package/Controls/Components/Overlays/Dialog/DialogActionsElementTemplate.js.map +1 -1
  108. package/Controls/Components/Overlays/Dialog/Themes/DialogActionsElement.Cosmopolitan.d.ts.map +1 -1
  109. package/Controls/Components/Overlays/Dialog/Themes/DialogActionsElement.Cosmopolitan.js +10 -2
  110. package/Controls/Components/Overlays/Dialog/Themes/DialogActionsElement.Cosmopolitan.js.map +1 -1
  111. package/Controls/Components/Overlays/Dialog/Themes/DialogActionsElement.Joy.d.ts.map +1 -1
  112. package/Controls/Components/Overlays/Dialog/Themes/DialogActionsElement.Joy.js +10 -2
  113. package/Controls/Components/Overlays/Dialog/Themes/DialogActionsElement.Joy.js.map +1 -1
  114. package/Controls/Components/Overlays/Dialog/Themes/DialogActionsElement.Memphis.d.ts.map +1 -1
  115. package/Controls/Components/Overlays/Dialog/Themes/DialogActionsElement.Memphis.js +10 -2
  116. package/Controls/Components/Overlays/Dialog/Themes/DialogActionsElement.Memphis.js.map +1 -1
  117. package/Controls/Components/Overlays/Dialog/Themes/DialogElement.Cosmopolitan.d.ts.map +1 -1
  118. package/Controls/Components/Overlays/Dialog/Themes/DialogElement.Cosmopolitan.js +2 -0
  119. package/Controls/Components/Overlays/Dialog/Themes/DialogElement.Cosmopolitan.js.map +1 -1
  120. package/Controls/Components/Overlays/Dialog/Themes/DialogElement.Joy.d.ts.map +1 -1
  121. package/Controls/Components/Overlays/Dialog/Themes/DialogElement.Joy.js +3 -1
  122. package/Controls/Components/Overlays/Dialog/Themes/DialogElement.Joy.js.map +1 -1
  123. package/Controls/Components/Overlays/Dialog/Themes/DialogElement.Memphis.d.ts.map +1 -1
  124. package/Controls/Components/Overlays/Dialog/Themes/DialogElement.Memphis.js +2 -0
  125. package/Controls/Components/Overlays/Dialog/Themes/DialogElement.Memphis.js.map +1 -1
  126. package/Controls/Components/Overlays/Drawer/DrawerActionsElement.d.ts +3 -3
  127. package/Controls/Components/Overlays/Drawer/DrawerActionsElement.d.ts.map +1 -1
  128. package/Controls/Components/Overlays/Drawer/DrawerActionsElement.js +6 -10
  129. package/Controls/Components/Overlays/Drawer/DrawerActionsElement.js.map +1 -1
  130. package/Controls/Components/Overlays/Drawer/DrawerActionsElementTemplate.d.ts.map +1 -1
  131. package/Controls/Components/Overlays/Drawer/DrawerActionsElementTemplate.js +6 -20
  132. package/Controls/Components/Overlays/Drawer/DrawerActionsElementTemplate.js.map +1 -1
  133. package/Controls/Components/Overlays/Drawer/DrawerElement.d.ts +6 -7
  134. package/Controls/Components/Overlays/Drawer/DrawerElement.d.ts.map +1 -1
  135. package/Controls/Components/Overlays/Drawer/DrawerElement.js +20 -12
  136. package/Controls/Components/Overlays/Drawer/DrawerElement.js.map +1 -1
  137. package/Controls/Components/Overlays/Drawer/Themes/DrawerActionsElement.Cosmopolitan.d.ts.map +1 -1
  138. package/Controls/Components/Overlays/Drawer/Themes/DrawerActionsElement.Cosmopolitan.js +10 -2
  139. package/Controls/Components/Overlays/Drawer/Themes/DrawerActionsElement.Cosmopolitan.js.map +1 -1
  140. package/Controls/Components/Overlays/Drawer/Themes/DrawerActionsElement.Joy.d.ts.map +1 -1
  141. package/Controls/Components/Overlays/Drawer/Themes/DrawerActionsElement.Joy.js +10 -2
  142. package/Controls/Components/Overlays/Drawer/Themes/DrawerActionsElement.Joy.js.map +1 -1
  143. package/Controls/Components/Overlays/Drawer/Themes/DrawerActionsElement.Memphis.d.ts.map +1 -1
  144. package/Controls/Components/Overlays/Drawer/Themes/DrawerActionsElement.Memphis.js +10 -2
  145. package/Controls/Components/Overlays/Drawer/Themes/DrawerActionsElement.Memphis.js.map +1 -1
  146. package/Controls/Components/Overlays/MessageBox/Themes/MessageBoxElement.Cosmopolitan.d.ts.map +1 -1
  147. package/Controls/Components/Overlays/MessageBox/Themes/MessageBoxElement.Cosmopolitan.js +1 -0
  148. package/Controls/Components/Overlays/MessageBox/Themes/MessageBoxElement.Cosmopolitan.js.map +1 -1
  149. package/Controls/Components/Overlays/MessageBox/Themes/MessageBoxElement.Joy.d.ts.map +1 -1
  150. package/Controls/Components/Overlays/MessageBox/Themes/MessageBoxElement.Joy.js +2 -1
  151. package/Controls/Components/Overlays/MessageBox/Themes/MessageBoxElement.Joy.js.map +1 -1
  152. package/Controls/Components/Overlays/MessageBox/Themes/MessageBoxElement.Memphis.d.ts.map +1 -1
  153. package/Controls/Components/Overlays/MessageBox/Themes/MessageBoxElement.Memphis.js +1 -0
  154. package/Controls/Components/Overlays/MessageBox/Themes/MessageBoxElement.Memphis.js.map +1 -1
  155. package/Controls/Components/Overlays/Sheet/ISheetElementProps.d.ts +95 -4
  156. package/Controls/Components/Overlays/Sheet/ISheetElementProps.d.ts.map +1 -1
  157. package/Controls/Components/Overlays/Sheet/ISheetElementProps.js +31 -1
  158. package/Controls/Components/Overlays/Sheet/ISheetElementProps.js.map +1 -1
  159. package/Controls/Components/Overlays/Sheet/SheetElement.d.ts +318 -50
  160. package/Controls/Components/Overlays/Sheet/SheetElement.d.ts.map +1 -1
  161. package/Controls/Components/Overlays/Sheet/SheetElement.js +959 -159
  162. package/Controls/Components/Overlays/Sheet/SheetElement.js.map +1 -1
  163. package/Controls/Components/Overlays/Sheet/SheetElementTemplate.d.ts.map +1 -1
  164. package/Controls/Components/Overlays/Sheet/SheetElementTemplate.js +21 -8
  165. package/Controls/Components/Overlays/Sheet/SheetElementTemplate.js.map +1 -1
  166. package/Controls/Components/Overlays/Sheet/SheetModalController.d.ts +2 -0
  167. package/Controls/Components/Overlays/Sheet/SheetModalController.d.ts.map +1 -0
  168. package/Controls/Components/Overlays/Sheet/SheetModalController.js +152 -0
  169. package/Controls/Components/Overlays/Sheet/SheetModalController.js.map +1 -0
  170. package/Controls/Components/Overlays/Sheet/SheetService.d.ts.map +1 -1
  171. package/Controls/Components/Overlays/Sheet/SheetService.js +1 -12
  172. package/Controls/Components/Overlays/Sheet/SheetService.js.map +1 -1
  173. package/Controls/Components/Overlays/Sheet/SheetSnapEngine.d.ts +2 -0
  174. package/Controls/Components/Overlays/Sheet/SheetSnapEngine.d.ts.map +1 -0
  175. package/Controls/Components/Overlays/Sheet/SheetSnapEngine.js +135 -0
  176. package/Controls/Components/Overlays/Sheet/SheetSnapEngine.js.map +1 -0
  177. package/Controls/Components/Overlays/Sheet/SheetTypes.d.ts +117 -0
  178. package/Controls/Components/Overlays/Sheet/SheetTypes.d.ts.map +1 -0
  179. package/Controls/Components/Overlays/Sheet/SheetTypes.js +3 -0
  180. package/Controls/Components/Overlays/Sheet/SheetTypes.js.map +1 -0
  181. package/Controls/Components/Overlays/Sheet/Themes/SheetContentElement.Cosmopolitan.d.ts.map +1 -1
  182. package/Controls/Components/Overlays/Sheet/Themes/SheetContentElement.Cosmopolitan.js +6 -1
  183. package/Controls/Components/Overlays/Sheet/Themes/SheetContentElement.Cosmopolitan.js.map +1 -1
  184. package/Controls/Components/Overlays/Sheet/Themes/SheetContentElement.Joy.d.ts.map +1 -1
  185. package/Controls/Components/Overlays/Sheet/Themes/SheetContentElement.Joy.js +6 -1
  186. package/Controls/Components/Overlays/Sheet/Themes/SheetContentElement.Joy.js.map +1 -1
  187. package/Controls/Components/Overlays/Sheet/Themes/SheetContentElement.Memphis.d.ts.map +1 -1
  188. package/Controls/Components/Overlays/Sheet/Themes/SheetContentElement.Memphis.js +6 -1
  189. package/Controls/Components/Overlays/Sheet/Themes/SheetContentElement.Memphis.js.map +1 -1
  190. package/Controls/Components/Overlays/Sheet/Themes/SheetElement.Cosmopolitan.d.ts.map +1 -1
  191. package/Controls/Components/Overlays/Sheet/Themes/SheetElement.Cosmopolitan.js +112 -43
  192. package/Controls/Components/Overlays/Sheet/Themes/SheetElement.Cosmopolitan.js.map +1 -1
  193. package/Controls/Components/Overlays/Sheet/Themes/SheetElement.Joy.d.ts.map +1 -1
  194. package/Controls/Components/Overlays/Sheet/Themes/SheetElement.Joy.js +112 -43
  195. package/Controls/Components/Overlays/Sheet/Themes/SheetElement.Joy.js.map +1 -1
  196. package/Controls/Components/Overlays/Sheet/Themes/SheetElement.Memphis.d.ts.map +1 -1
  197. package/Controls/Components/Overlays/Sheet/Themes/SheetElement.Memphis.js +112 -43
  198. package/Controls/Components/Overlays/Sheet/Themes/SheetElement.Memphis.js.map +1 -1
  199. package/Controls/Components/Overlays/Toast/Themes/ToastActionsElement.Cosmopolitan.d.ts.map +1 -1
  200. package/Controls/Components/Overlays/Toast/Themes/ToastActionsElement.Cosmopolitan.js +10 -2
  201. package/Controls/Components/Overlays/Toast/Themes/ToastActionsElement.Cosmopolitan.js.map +1 -1
  202. package/Controls/Components/Overlays/Toast/Themes/ToastActionsElement.Joy.d.ts.map +1 -1
  203. package/Controls/Components/Overlays/Toast/Themes/ToastActionsElement.Joy.js +10 -2
  204. package/Controls/Components/Overlays/Toast/Themes/ToastActionsElement.Joy.js.map +1 -1
  205. package/Controls/Components/Overlays/Toast/Themes/ToastActionsElement.Memphis.d.ts.map +1 -1
  206. package/Controls/Components/Overlays/Toast/Themes/ToastActionsElement.Memphis.js +10 -2
  207. package/Controls/Components/Overlays/Toast/Themes/ToastActionsElement.Memphis.js.map +1 -1
  208. package/Controls/Components/Overlays/Toast/ToastActionsElement.d.ts +3 -3
  209. package/Controls/Components/Overlays/Toast/ToastActionsElement.d.ts.map +1 -1
  210. package/Controls/Components/Overlays/Toast/ToastActionsElement.js +6 -10
  211. package/Controls/Components/Overlays/Toast/ToastActionsElement.js.map +1 -1
  212. package/Controls/Components/Overlays/Toast/ToastActionsElementTemplate.d.ts.map +1 -1
  213. package/Controls/Components/Overlays/Toast/ToastActionsElementTemplate.js +6 -20
  214. package/Controls/Components/Overlays/Toast/ToastActionsElementTemplate.js.map +1 -1
  215. package/Controls/Components/Primitives/Portal/Themes/PortalHostElement.Cosmopolitan.js +1 -1
  216. package/Controls/Components/Primitives/Portal/Themes/PortalHostElement.Joy.js +1 -1
  217. package/Controls/Components/Primitives/Portal/Themes/PortalHostElement.Memphis.js +1 -1
  218. package/Controls/Components/Primitives/Portal/Themes/PortalProjectionElement.Cosmopolitan.js +1 -1
  219. package/Controls/Components/Primitives/Portal/Themes/PortalProjectionElement.Joy.js +1 -1
  220. package/Controls/Components/Primitives/Portal/Themes/PortalProjectionElement.Memphis.js +1 -1
  221. package/Controls/Components/Selectors/Combo/ComboElement.d.ts +4 -0
  222. package/Controls/Components/Selectors/Combo/ComboElement.d.ts.map +1 -1
  223. package/Controls/Components/Selectors/Combo/ComboElement.js +67 -4
  224. package/Controls/Components/Selectors/Combo/ComboElement.js.map +1 -1
  225. package/Controls/Components/Selectors/Combo/ComboElementTemplate.d.ts.map +1 -1
  226. package/Controls/Components/Selectors/Combo/ComboElementTemplate.js +12 -10
  227. package/Controls/Components/Selectors/Combo/ComboElementTemplate.js.map +1 -1
  228. package/Controls/Components/Selectors/Combo/ComboItemVisualElement.d.ts +81 -0
  229. package/Controls/Components/Selectors/Combo/ComboItemVisualElement.d.ts.map +1 -0
  230. package/Controls/Components/Selectors/Combo/ComboItemVisualElement.js +97 -0
  231. package/Controls/Components/Selectors/Combo/ComboItemVisualElement.js.map +1 -0
  232. package/Controls/Components/Selectors/Combo/ComboItemVisualElementTemplate.d.ts +9 -0
  233. package/Controls/Components/Selectors/Combo/ComboItemVisualElementTemplate.d.ts.map +1 -0
  234. package/Controls/Components/Selectors/Combo/ComboItemVisualElementTemplate.js +20 -0
  235. package/Controls/Components/Selectors/Combo/ComboItemVisualElementTemplate.js.map +1 -0
  236. package/Controls/Components/Selectors/Combo/IComboItemVisualElementProps.d.ts +8 -0
  237. package/Controls/Components/Selectors/Combo/IComboItemVisualElementProps.d.ts.map +1 -0
  238. package/Controls/Components/Selectors/Combo/IComboItemVisualElementProps.js +2 -0
  239. package/Controls/Components/Selectors/Combo/IComboItemVisualElementProps.js.map +1 -0
  240. package/Controls/Components/Selectors/Combo/Themes/ComboElement.Cosmopolitan.d.ts.map +1 -1
  241. package/Controls/Components/Selectors/Combo/Themes/ComboElement.Cosmopolitan.js +13 -0
  242. package/Controls/Components/Selectors/Combo/Themes/ComboElement.Cosmopolitan.js.map +1 -1
  243. package/Controls/Components/Selectors/Combo/Themes/ComboElement.Joy.d.ts.map +1 -1
  244. package/Controls/Components/Selectors/Combo/Themes/ComboElement.Joy.js +13 -0
  245. package/Controls/Components/Selectors/Combo/Themes/ComboElement.Joy.js.map +1 -1
  246. package/Controls/Components/Selectors/Combo/Themes/ComboElement.Memphis.d.ts.map +1 -1
  247. package/Controls/Components/Selectors/Combo/Themes/ComboElement.Memphis.js +13 -0
  248. package/Controls/Components/Selectors/Combo/Themes/ComboElement.Memphis.js.map +1 -1
  249. package/Controls/Components/Selectors/Combo/Themes/ComboItemVisualElement.Cosmopolitan.d.ts +6 -0
  250. package/Controls/Components/Selectors/Combo/Themes/ComboItemVisualElement.Cosmopolitan.d.ts.map +1 -0
  251. package/Controls/Components/Selectors/Combo/Themes/ComboItemVisualElement.Cosmopolitan.js +75 -0
  252. package/Controls/Components/Selectors/Combo/Themes/ComboItemVisualElement.Cosmopolitan.js.map +1 -0
  253. package/Controls/Components/Selectors/Combo/Themes/ComboItemVisualElement.Joy.d.ts +6 -0
  254. package/Controls/Components/Selectors/Combo/Themes/ComboItemVisualElement.Joy.d.ts.map +1 -0
  255. package/Controls/Components/Selectors/Combo/Themes/ComboItemVisualElement.Joy.js +75 -0
  256. package/Controls/Components/Selectors/Combo/Themes/ComboItemVisualElement.Joy.js.map +1 -0
  257. package/Controls/Components/Selectors/Combo/Themes/ComboItemVisualElement.Memphis.d.ts +6 -0
  258. package/Controls/Components/Selectors/Combo/Themes/ComboItemVisualElement.Memphis.d.ts.map +1 -0
  259. package/Controls/Components/Selectors/Combo/Themes/ComboItemVisualElement.Memphis.js +75 -0
  260. package/Controls/Components/Selectors/Combo/Themes/ComboItemVisualElement.Memphis.js.map +1 -0
  261. package/Controls/Components/Shell/AppElement.d.ts +0 -1
  262. package/Controls/Components/Shell/AppElement.d.ts.map +1 -1
  263. package/Controls/Components/Shell/AppElement.js +19 -2
  264. package/Controls/Components/Shell/AppElement.js.map +1 -1
  265. package/Controls/Components/Shell/AppElementTemplate.d.ts.map +1 -1
  266. package/Controls/Components/Shell/AppElementTemplate.js +2 -1
  267. package/Controls/Components/Shell/AppElementTemplate.js.map +1 -1
  268. package/Controls/Controllers/ModalController.d.ts +2 -0
  269. package/Controls/Controllers/ModalController.d.ts.map +1 -0
  270. package/Controls/Controllers/ModalController.js +186 -0
  271. package/Controls/Controllers/ModalController.js.map +1 -0
  272. package/Controls/Controllers/SelectionVisualProjectionController.d.ts +2 -0
  273. package/Controls/Controllers/SelectionVisualProjectionController.d.ts.map +1 -0
  274. package/Controls/Controllers/SelectionVisualProjectionController.js +129 -0
  275. package/Controls/Controllers/SelectionVisualProjectionController.js.map +1 -0
  276. package/Controls/Types/SheetDragMode.d.ts +24 -0
  277. package/Controls/Types/SheetDragMode.d.ts.map +1 -0
  278. package/Controls/Types/SheetDragMode.js +19 -0
  279. package/Controls/Types/SheetDragMode.js.map +1 -0
  280. package/Controls/Types/SheetPosition.d.ts +24 -0
  281. package/Controls/Types/SheetPosition.d.ts.map +1 -0
  282. package/Controls/Types/SheetPosition.js +20 -0
  283. package/Controls/Types/SheetPosition.js.map +1 -0
  284. package/Controls/Types/SheetSnap.d.ts +21 -0
  285. package/Controls/Types/SheetSnap.d.ts.map +1 -0
  286. package/Controls/Types/SheetSnap.js +14 -0
  287. package/Controls/Types/SheetSnap.js.map +1 -0
  288. package/Controls/events/OpenCloseEvents.d.ts +1 -1
  289. package/Controls/events/OpenCloseEvents.d.ts.map +1 -1
  290. package/Controls/events/ResizeDragEvents.d.ts +27 -20
  291. package/Controls/events/ResizeDragEvents.d.ts.map +1 -1
  292. package/Controls/events/SheetEvents.d.ts +49 -0
  293. package/Controls/events/SheetEvents.d.ts.map +1 -0
  294. package/Controls/events/SheetEvents.js +3 -0
  295. package/Controls/events/SheetEvents.js.map +1 -0
  296. package/Controls/events/index.d.ts +2 -1
  297. package/Controls/events/index.d.ts.map +1 -1
  298. package/Index.d.ts +7 -0
  299. package/Index.d.ts.map +1 -1
  300. package/Index.js +5 -0
  301. package/Index.js.map +1 -1
  302. package/Routing/PathToRegexp.d.ts +1 -1
  303. package/Utilities/SnapEngine.d.ts +2 -0
  304. package/Utilities/SnapEngine.d.ts.map +1 -0
  305. package/Utilities/SnapEngine.js +121 -0
  306. package/Utilities/SnapEngine.js.map +1 -0
  307. package/custom-elements.json +2464 -821
  308. package/package.json +3 -3
@@ -8,17 +8,25 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
8
8
  var __metadata = (this && this.__metadata) || function (k, v) {
9
9
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
10
  };
11
- import { on } from '@breadstone/mosaik-elements';
11
+ import { HTMLElementEventEmitter } from '@breadstone/mosaik-elements';
12
12
  import { CssLength } from '@breadstone/mosaik-themes';
13
13
  import { RendererServiceLocator } from '../../../../Dom/Renderer';
14
+ import { clamp } from '../../../../Extensions/NumberExtensions';
15
+ import { applyElasticity, resolveSnapLength, resolveSnaps, selectSnap, verticalPointerDelta } from '../../../../Utilities/SnapEngine';
14
16
  import { Slottable } from '../../../Behaviors/Slottable';
15
17
  import { Themeable } from '../../../Behaviors/Themeable';
16
- import { addFocusTrapController } from '../../../Controllers/FocusTrapController';
17
18
  import { addInheritanceProviderController } from '../../../Controllers/InheritanceProviderController';
19
+ import { ModalController } from '../../../Controllers/ModalController';
18
20
  import { Attribute } from '../../../Decorators/AttributeDecorator';
19
21
  import { Component } from '../../../Decorators/ComponentDecorator';
22
+ import { Watch } from '../../../Decorators/WatchDecorator';
23
+ import { Emit } from '../../../../events/Decorators/EmitDecorator';
24
+ import { SheetDragMode } from '../../../Types/SheetDragMode';
25
+ import { SheetPosition } from '../../../Types/SheetPosition';
26
+ import { SheetSnap } from '../../../Types/SheetSnap';
20
27
  import { BackdropElement } from '../../Primitives/Backdrop/BackdropElement';
21
28
  import { OverlayElement } from '../Abstracts/OverlayElement';
29
+ import { ISheetElementProps } from './ISheetElementProps';
22
30
  import { SheetContentElement } from './SheetContentElement';
23
31
  import { sheetElementTemplate } from './SheetElementTemplate';
24
32
  import { SheetFooterElement } from './SheetFooterElement';
@@ -27,12 +35,16 @@ import { SHEET_INHERITANCE_CONTEXT } from './SheetInheritanceContext';
27
35
  import { sheetElementCosmopolitanStyle } from './Themes/SheetElement.Cosmopolitan';
28
36
  import { sheetElementJoyStyle } from './Themes/SheetElement.Joy';
29
37
  import { sheetElementMemphisStyle } from './Themes/SheetElement.Memphis';
38
+ // #endregion
39
+ const INTERACTIVE_SELECTOR = 'button,a[href],input,select,textarea,summary,[role="button"],[contenteditable="true"]';
40
+ const AXIS_LOCK_THRESHOLD = 6;
30
41
  /**
31
- * Sheet - A bottom-sheet overlay element that slides up from the bottom of the viewport.
42
+ * Sheet - A mobile-first, snap-based overlay entering from the top or bottom edge.
32
43
  *
33
44
  * @description
34
- * A gesture-driven bottom sheet that supports drag to open, close, and partial states.
35
- * Use the `height` attribute to control the initial expanded height.
45
+ * Supports pointer gestures, velocity-based snap selection, scroll handoff and optional modal behavior.
46
+ * Runtime state is exposed through `data-state`, `data-dragging`, `data-snap-index` and `data-max-snap`.
47
+ * The `root` part publishes `--sheet-progress` from `0` to `1` and `--sheet-resolved-height` in CSS pixels.
36
48
  *
37
49
  * @name Sheet
38
50
  * @element mosaik-sheet
@@ -43,13 +55,21 @@ import { sheetElementMemphisStyle } from './Themes/SheetElement.Memphis';
43
55
  * @slot header - The header slot for `SheetHeaderElement`.
44
56
  *
45
57
  * @csspart backdrop - The backdrop part.
46
- * @csspart heading - The heading part.
47
- * @csspart root - The root part.
48
- * @csspart thumb - The thumb part.
58
+ * @csspart body - The body part.
59
+ * @csspart content-slot - The slot that projects the scrollable sheet content.
60
+ * @csspart footer-slot - The slot that projects the sheet footer.
61
+ * @csspart handle - The visual drag handle.
62
+ * @csspart header-slot - The slot that projects the sheet header.
63
+ * @csspart heading - The sheet heading and gesture affordance.
64
+ * @csspart root - The movable sheet surface.
65
+ * @csspart snap-indicator - Container for snap indicators.
66
+ * @csspart snap-indicator-item - An individual snap indicator.
49
67
  *
50
68
  * @cssprop {String} --sheet-background-color - The background color CSS custom property.
51
69
  * @cssprop {String} --sheet-border-color - The border color CSS custom property.
70
+ * @cssprop {String} --sheet-border-radius - The border radius CSS custom property.
52
71
  * @cssprop {String} --sheet-border-width - The border width CSS custom property.
72
+ * @cssprop {String} --sheet-edge-offset - The edge offset CSS custom property.
53
73
  * @cssprop {String} --sheet-font-family - The font family CSS custom property.
54
74
  * @cssprop {String} --sheet-font-letter-spacing - The font letter spacing CSS custom property.
55
75
  * @cssprop {String} --sheet-font-line-height - The font line height CSS custom property.
@@ -59,6 +79,12 @@ import { sheetElementMemphisStyle } from './Themes/SheetElement.Memphis';
59
79
  * @cssprop {String} --sheet-font-weight - The font weight CSS custom property.
60
80
  * @cssprop {String} --sheet-foreground-color - The foreground color CSS custom property.
61
81
  * @cssprop {String} --sheet-gap - The gap CSS custom property.
82
+ * @cssprop {String} --sheet-handle-background-color - The handle background color CSS custom property.
83
+ * @cssprop {String} --sheet-handle-border-radius - The handle border radius CSS custom property.
84
+ * @cssprop {String} --sheet-handle-height - The handle height CSS custom property.
85
+ * @cssprop {String} --sheet-handle-margin - The handle margin CSS custom property.
86
+ * @cssprop {String} --sheet-handle-width - The handle width CSS custom property.
87
+ * @cssprop {String} --sheet-max-width - The max width CSS custom property.
62
88
  * @cssprop {String} --sheet-padding-bottom - The padding bottom CSS custom property.
63
89
  * @cssprop {String} --sheet-padding-left - The padding left CSS custom property.
64
90
  * @cssprop {String} --sheet-padding-right - The padding right CSS custom property.
@@ -69,74 +95,138 @@ import { sheetElementMemphisStyle } from './Themes/SheetElement.Memphis';
69
95
  * @cssprop {String} --sheet-shadow-offset-x - The shadow offset x CSS custom property.
70
96
  * @cssprop {String} --sheet-shadow-offset-y - The shadow offset y CSS custom property.
71
97
  * @cssprop {String} --sheet-shadow-spread - The shadow spread CSS custom property.
98
+ * @cssprop {String} --sheet-snap-indicator-active-background-color - The snap indicator active background color CSS custom property.
99
+ * @cssprop {String} --sheet-snap-indicator-background-color - The snap indicator background color CSS custom property.
100
+ * @cssprop {String} --sheet-snap-indicator-border-radius - The snap indicator border radius CSS custom property.
101
+ * @cssprop {String} --sheet-snap-indicator-gap - The snap indicator gap CSS custom property.
102
+ * @cssprop {String} --sheet-snap-indicator-size - The snap indicator size CSS custom property.
72
103
  * @cssprop {String} --sheet-transition-duration - The transition duration CSS custom property.
73
104
  * @cssprop {String} --sheet-transition-mode - The transition mode CSS custom property.
74
105
  * @cssprop {String} --sheet-transition-property - The transition property CSS custom property.
75
106
  * @cssprop {String} --sheet-translate - The translate CSS custom property.
76
107
  * @cssprop {String} --sheet-translate-y - The translate y CSS custom property.
108
+ * @cssprop {String} --sheet-z-index - The stacking order CSS custom property.
109
+ *
110
+ * @fires activeSnapChanged {ActiveSnapChangedEvent} - Fired after the active snap changes.
111
+ * @fires dragStart {DragStartEvent} - Fired when a vertical sheet gesture starts.
112
+ * @fires dragging {DraggingEvent} - Fired while the sheet is dragged.
113
+ * @fires dragEnd {DragEndEvent} - Fired when a sheet gesture ends.
77
114
  *
78
115
  * @dependency mosaik-backdrop - The Backdrop element.
79
116
  *
80
117
  * @example
81
- * Basic bottom sheet:
118
+ * Mobile checkout summary with three selectable snap extents:
82
119
  * ```html
83
- * <mosaik-sheet></mosaik-sheet>
120
+ * <mosaik-sheet snaps="25% 55% 90%" active-snap-index="1" is-modal>
121
+ * <mosaik-sheet-header slot="header">Order summary</mosaik-sheet-header>
122
+ * <mosaik-sheet-content slot="content">Checkout details</mosaik-sheet-content>
123
+ * <mosaik-sheet-footer slot="footer">Checkout actions</mosaik-sheet-footer>
124
+ * </mosaik-sheet>
84
125
  * ```
85
126
  *
86
127
  * @example
87
- * Bottom sheet with custom height:
128
+ * Search filters that expand from the top and adapt to their content:
88
129
  * ```html
89
- * <mosaik-sheet height="50vh"></mosaik-sheet>
130
+ * <mosaik-sheet position="top" height="100dvh" snaps="content 90%" drag-mode="handle">
131
+ * <mosaik-sheet-header slot="header">Filters</mosaik-sheet-header>
132
+ * <mosaik-sheet-content slot="content">Filter controls</mosaik-sheet-content>
133
+ * </mosaik-sheet>
90
134
  * ```
91
135
  *
92
136
  * @public
93
137
  */
94
138
  let SheetElement = class SheetElement extends Themeable(Slottable(OverlayElement)) {
95
139
  // #region Fields
96
- _bounceOffset;
140
+ _activeSnapChanged;
141
+ _dragStart;
142
+ _dragging;
143
+ _dragEnd;
144
+ _modalController;
145
+ _width;
97
146
  _height;
98
- _dragOffset;
99
- _positionY;
100
- _isPartial;
101
- _mouseDownSubscription;
102
- _touchStartSubscription;
103
- _mouseUpSubscription;
104
- _touchEndSubscription;
105
- _mouseMoveSubscription;
106
- _touchMoveSubscription;
107
- _clickSubscription;
147
+ _position;
148
+ _snaps;
149
+ _activeSnapIndex;
150
+ _activeSnapIndexExplicit;
151
+ _closeThreshold;
152
+ _elastic;
153
+ _inertia;
154
+ _dragMode;
155
+ _hasHandle;
156
+ _hasSnapIndicator;
157
+ _isModal;
158
+ _resolvedSnaps;
159
+ _visibleExtent;
160
+ _maxExtent;
161
+ _pointerId;
162
+ _startX;
163
+ _startY;
164
+ _lastY;
165
+ _startExtent;
166
+ _isDragging;
167
+ _axisRejected;
168
+ _samples;
169
+ _resizeObserver;
170
+ _observedRoot;
171
+ _visualViewportHandler;
172
+ _measureFrame;
108
173
  // #endregion
109
174
  // #region Ctor
110
175
  /**
176
+ * Constructs a new instance of the `SheetElement` class.
177
+ *
111
178
  * @public
112
179
  */
113
180
  constructor() {
114
181
  super();
115
- this._height = '60vh';
116
- this._dragOffset = 0;
117
- this._bounceOffset = 35;
118
- this._positionY = 0;
119
- this._isPartial = false;
120
- this._mouseDownSubscription = null;
121
- this._touchStartSubscription = null;
122
- this._mouseUpSubscription = null;
123
- this._touchEndSubscription = null;
124
- this._mouseMoveSubscription = null;
125
- this._touchMoveSubscription = null;
126
- this._clickSubscription = null;
127
- addFocusTrapController(this);
182
+ this._activeSnapChanged = new HTMLElementEventEmitter(this, 'activeSnapChanged');
183
+ this._dragStart = new HTMLElementEventEmitter(this, 'dragStart');
184
+ this._dragging = new HTMLElementEventEmitter(this, 'dragging');
185
+ this._dragEnd = new HTMLElementEventEmitter(this, 'dragEnd');
186
+ this._modalController = new ModalController(this);
187
+ this._width = ISheetElementProps.DEFAULTS.width;
188
+ this._height = ISheetElementProps.DEFAULTS.height;
189
+ this._position = ISheetElementProps.DEFAULTS.position;
190
+ this._snaps = [...ISheetElementProps.DEFAULTS.snaps];
191
+ this._activeSnapIndex = ISheetElementProps.DEFAULTS.activeSnapIndex;
192
+ this._activeSnapIndexExplicit = false;
193
+ this._closeThreshold = ISheetElementProps.DEFAULTS.closeThreshold;
194
+ this._elastic = ISheetElementProps.DEFAULTS.elastic;
195
+ this._inertia = ISheetElementProps.DEFAULTS.inertia;
196
+ this._dragMode = ISheetElementProps.DEFAULTS.dragMode;
197
+ this._hasHandle = ISheetElementProps.DEFAULTS.hasHandle;
198
+ this._hasSnapIndicator = ISheetElementProps.DEFAULTS.hasSnapIndicator;
199
+ this._isModal = ISheetElementProps.DEFAULTS.isModal;
200
+ this._resolvedSnaps = [];
201
+ this._visibleExtent = 0;
202
+ this._maxExtent = 0;
203
+ this._pointerId = null;
204
+ this._startX = 0;
205
+ this._startY = 0;
206
+ this._lastY = 0;
207
+ this._startExtent = 0;
208
+ this._isDragging = false;
209
+ this._axisRejected = false;
210
+ this._samples = [];
211
+ this._resizeObserver = null;
212
+ this._observedRoot = null;
213
+ this._visualViewportHandler = null;
214
+ this._measureFrame = null;
215
+ this.handleViewportResize = this.handleViewportResize.bind(this);
216
+ this.handlePointerDown = this.handlePointerDown.bind(this);
217
+ this.handlePointerMove = this.handlePointerMove.bind(this);
218
+ this.handlePointerUp = this.handlePointerUp.bind(this);
219
+ this.handlePointerCancel = this.handlePointerCancel.bind(this);
220
+ this.onBackdrop = this.onBackdrop.bind(this);
128
221
  addInheritanceProviderController(this, {
129
222
  context: SHEET_INHERITANCE_CONTEXT,
130
- values: () => ({
131
- closeable: this.closeable
132
- })
223
+ values: () => ({ closeable: this.closeable })
133
224
  });
134
225
  }
135
226
  // #endregion
136
227
  // #region Properties
137
228
  /**
138
- * Returns the `is` property.
139
- * The `is` property represents natural name of this element.
229
+ * Returns the natural name of this element.
140
230
  *
141
231
  * @public
142
232
  * @static
@@ -146,10 +236,29 @@ let SheetElement = class SheetElement extends Themeable(Slottable(OverlayElement
146
236
  return 'mosaik-sheet';
147
237
  }
148
238
  /**
149
- * Gets or sets the `height` property.
239
+ * Gets or sets the width of the sheet surface.
240
+ * The width remains constrained by the viewport and the theme's maximum width.
241
+ *
242
+ * @public
243
+ * @attr
244
+ * @default '100%'
245
+ */
246
+ get width() {
247
+ return this._width;
248
+ }
249
+ set width(value) {
250
+ if (this._width !== value) {
251
+ this._width = value;
252
+ this.requestUpdate('width');
253
+ }
254
+ }
255
+ /**
256
+ * Gets or sets the maximum visible extent of the sheet.
257
+ * The `auto` value uses the measured content height.
150
258
  *
151
259
  * @public
152
260
  * @attr
261
+ * @default '60dvh'
153
262
  */
154
263
  get height() {
155
264
  return this._height;
@@ -160,181 +269,877 @@ let SheetElement = class SheetElement extends Themeable(Slottable(OverlayElement
160
269
  this.requestUpdate('height');
161
270
  }
162
271
  }
272
+ /**
273
+ * Gets or sets the viewport edge from which the sheet opens.
274
+ *
275
+ * @public
276
+ * @attr
277
+ * @default 'bottom'
278
+ */
279
+ get position() {
280
+ return this._position;
281
+ }
282
+ set position(value) {
283
+ if (this._position !== value) {
284
+ this._position = value;
285
+ this.requestUpdate('position');
286
+ }
287
+ }
288
+ /**
289
+ * Gets or sets the sheet's snap extents.
290
+ * Values are resolved, clamped to `height`, sorted and de-duplicated.
291
+ * The `content` value uses the measured content height.
292
+ * In plain HTML, provide a space-separated list such as `snaps="25% content 90dvh"`.
293
+ * Invalid values and the unsupported `auto` value throw a descriptive error.
294
+ *
295
+ * @public
296
+ * @attr
297
+ * @default []
298
+ */
299
+ get snaps() {
300
+ return this._snaps;
301
+ }
302
+ set snaps(value) {
303
+ const next = Array.isArray(value) ? value : [];
304
+ if (this._snaps !== next) {
305
+ this._snaps = next;
306
+ this.requestUpdate('snaps');
307
+ }
308
+ }
309
+ /**
310
+ * Gets or sets the active index in the resolved, ascending snap list.
311
+ * Invalid values are clamped to an available index.
312
+ *
313
+ * @public
314
+ * @attr
315
+ * @default 0
316
+ */
317
+ get activeSnapIndex() {
318
+ return this._activeSnapIndex;
319
+ }
320
+ set activeSnapIndex(value) {
321
+ this._activeSnapIndexExplicit = true;
322
+ const next = this.clampSnapIndex(value);
323
+ if (this._activeSnapIndex !== next) {
324
+ this._activeSnapIndex = next;
325
+ this.requestUpdate('activeSnapIndex');
326
+ }
327
+ }
328
+ /**
329
+ * Gets or sets the close threshold as a fraction of the maximum extent.
330
+ * Values are clamped to the range from `0` to `1`.
331
+ *
332
+ * @public
333
+ * @attr
334
+ * @default 0.25
335
+ */
336
+ get closeThreshold() {
337
+ return this._closeThreshold;
338
+ }
339
+ set closeThreshold(value) {
340
+ const next = clamp(Number.isFinite(value) ? value : ISheetElementProps.DEFAULTS.closeThreshold, 0, 1);
341
+ if (this._closeThreshold !== next) {
342
+ this._closeThreshold = next;
343
+ this.requestUpdate('closeThreshold');
344
+ }
345
+ }
346
+ /**
347
+ * Gets or sets whether dragging beyond the legal range uses elastic resistance.
348
+ *
349
+ * @public
350
+ * @attr
351
+ * @default true
352
+ */
353
+ get elastic() {
354
+ return this._elastic;
355
+ }
356
+ set elastic(value) {
357
+ this.setBooleanProperty('_elastic', 'elastic', value);
358
+ }
359
+ /**
360
+ * Gets or sets whether release velocity influences the landing snap.
361
+ *
362
+ * @public
363
+ * @attr
364
+ * @default true
365
+ */
366
+ get inertia() {
367
+ return this._inertia;
368
+ }
369
+ set inertia(value) {
370
+ this.setBooleanProperty('_inertia', 'inertia', value);
371
+ }
372
+ /**
373
+ * Gets or sets the area from which a sheet gesture may start.
374
+ * Interactive controls never start a sheet gesture.
375
+ *
376
+ * @public
377
+ * @attr
378
+ * @default 'sheet'
379
+ */
380
+ get dragMode() {
381
+ return this._dragMode;
382
+ }
383
+ set dragMode(value) {
384
+ if (this._dragMode !== value) {
385
+ this._dragMode = value;
386
+ this.requestUpdate('dragMode');
387
+ }
388
+ }
389
+ /**
390
+ * Gets or sets whether the built-in drag handle is rendered.
391
+ *
392
+ * @public
393
+ * @attr
394
+ * @default true
395
+ */
396
+ get hasHandle() {
397
+ return this._hasHandle;
398
+ }
399
+ set hasHandle(value) {
400
+ this.setBooleanProperty('_hasHandle', 'hasHandle', value);
401
+ }
402
+ /**
403
+ * Gets or sets whether indicators for the resolved snaps are rendered.
404
+ *
405
+ * @public
406
+ * @attr
407
+ * @default false
408
+ */
409
+ get hasSnapIndicator() {
410
+ return this._hasSnapIndicator;
411
+ }
412
+ set hasSnapIndicator(value) {
413
+ this.setBooleanProperty('_hasSnapIndicator', 'hasSnapIndicator', value);
414
+ }
415
+ /**
416
+ * Gets or sets whether the open sheet traps focus, restores focus and locks document scrolling.
417
+ *
418
+ * @public
419
+ * @attr
420
+ * @default false
421
+ */
422
+ get isModal() {
423
+ return this._isModal;
424
+ }
425
+ set isModal(value) {
426
+ if (this._isModal !== value) {
427
+ this._isModal = value;
428
+ this.requestUpdate('isModal');
429
+ }
430
+ }
431
+ /**
432
+ * Called after the active snap changes.
433
+ * Provides `IActiveSnapChangedEventDetail` as event detail.
434
+ *
435
+ * @public
436
+ * @readonly
437
+ * @eventProperty
438
+ */
439
+ get activeSnapChanged() {
440
+ return this._activeSnapChanged;
441
+ }
442
+ /**
443
+ * Called when a vertical sheet gesture starts.
444
+ * Provides `IDragStartEventDetail` as event detail.
445
+ *
446
+ * @public
447
+ * @readonly
448
+ * @eventProperty
449
+ */
450
+ get dragStart() {
451
+ return this._dragStart;
452
+ }
453
+ /**
454
+ * Called while the sheet is moved by a vertical pointer gesture.
455
+ * Provides `IDraggingEventDetail` as event detail.
456
+ *
457
+ * @public
458
+ * @readonly
459
+ * @eventProperty
460
+ */
461
+ get dragging() {
462
+ return this._dragging;
463
+ }
464
+ /**
465
+ * Called when a vertical sheet gesture ends.
466
+ * Provides `IDragEndEventDetail` as event detail.
467
+ *
468
+ * @public
469
+ * @readonly
470
+ * @eventProperty
471
+ */
472
+ get dragEnd() {
473
+ return this._dragEnd;
474
+ }
163
475
  // #endregion
164
476
  // #region Methods
165
477
  /**
166
- * Opens the `SheetElement`.
478
+ * @inheritdoc
479
+ * @public
480
+ * @override
481
+ */
482
+ connectedCallback() {
483
+ super.connectedCallback();
484
+ if (this.isOpen) {
485
+ this.activateInteractionResources();
486
+ }
487
+ }
488
+ /**
489
+ * @inheritdoc
490
+ * @public
491
+ * @override
492
+ */
493
+ disconnectedCallback() {
494
+ this.deactivateInteractionResources();
495
+ this._modalController.deactivate();
496
+ super.disconnectedCallback();
497
+ }
498
+ /**
499
+ * Opens the sheet at its active snap.
167
500
  *
168
501
  * @public
169
502
  * @override
503
+ * @returns A promise that resolves after the sheet has opened.
170
504
  */
171
505
  async open() {
172
- return super.open().then(() => {
173
- const root = this.getTemplatePart('root');
174
- this.moveDragElement(window.innerHeight - root.clientHeight, 'open');
175
- RendererServiceLocator.current.setAttribute(this, 'state', 'open');
176
- });
506
+ await super.open();
507
+ await this.updateComplete;
508
+ this.activateInteractionResources();
509
+ this.measure();
510
+ this.moveToSnap(this.clampSnapIndex(this._activeSnapIndex), false);
511
+ this.setState('open');
512
+ if (this.isModal) {
513
+ this._modalController.activate();
514
+ }
177
515
  }
178
516
  /**
179
- * Closes the `SheetElement`.
517
+ * Closes the sheet through the normal overlay lifecycle.
180
518
  *
181
519
  * @public
182
520
  * @override
521
+ * @returns A promise resolving to whether the sheet was closed.
183
522
  */
184
523
  async close() {
185
- return super.close().then((x) => {
186
- if (x) {
187
- if (this.closeable) {
188
- this.moveDragElement(window.innerHeight + 50, 'close');
189
- RendererServiceLocator.current.setAttribute(this, 'state', 'close');
190
- }
191
- }
192
- return x;
193
- });
524
+ if (!this.isOpen) {
525
+ return false;
526
+ }
527
+ this._modalController.deactivate();
528
+ this.setTransition(true);
529
+ this.setVisibleExtent(0);
530
+ this.setState('closed');
531
+ await this.waitForMotion();
532
+ return super.close();
194
533
  }
195
534
  /**
196
- * Sets the sheet to a partial (peek) state, showing only the heading area.
535
+ * Moves the open sheet to a configured snap.
536
+ * Invalid indices are clamped to the resolved snap range.
197
537
  *
198
538
  * @public
539
+ * @param index - The target index in the resolved, ascending snap list.
199
540
  */
200
- partial() {
201
- const heading = this.getTemplatePart('heading');
202
- this.moveDragElement(window.innerHeight - heading.clientHeight - this._bounceOffset, 'partial');
203
- RendererServiceLocator.current.setAttribute(this, 'state', 'partial');
541
+ snapTo(index) {
542
+ const next = this.clampSnapIndex(index);
543
+ const previous = this._activeSnapIndex;
544
+ this._activeSnapIndex = next;
545
+ this.requestUpdate('activeSnapIndex');
546
+ this.moveToSnap(next, true, previous);
204
547
  }
205
548
  /**
206
- * Toggles between open and partial states.
549
+ * Handles a backdrop activation according to the sheet dismissal configuration.
207
550
  *
208
- * @public
551
+ * @internal
552
+ * @hidden
209
553
  */
210
- async toggle() {
211
- if (this._isPartial) {
212
- return this.open();
554
+ onBackdrop() {
555
+ if (this.clickOutsideToClose && this.requestClose('outside')) {
556
+ void this.close();
213
557
  }
214
- this.partial();
215
- return Promise.resolve();
216
558
  }
217
559
  /**
560
+ * Handles open-state changes without overriding the overlay's internal state hook.
561
+ *
218
562
  * @protected
219
- * @override
220
563
  */
221
564
  onApplyTemplate() {
222
565
  super.onApplyTemplate();
223
- const heading = this.getTemplatePart('heading');
224
- this._clickSubscription = on(heading, 'click', () => void this.toggle());
225
- this._mouseDownSubscription = on(heading, 'mousedown', (e) => this.dragMouseDown(e));
226
- this._touchStartSubscription = on(heading, 'touchstart', (e) => this.dragMouseDown(e), { passive: true });
566
+ const root = this.getTemplatePart('root');
567
+ if (this._observedRoot && this._observedRoot !== root) {
568
+ this.detachPointerListeners(this._observedRoot);
569
+ }
570
+ this._observedRoot = root;
571
+ if (this.isOpen) {
572
+ this.activateInteractionResources();
573
+ this.queueMeasurement();
574
+ }
227
575
  }
228
576
  /**
229
- * Handles the backdrop click event.
230
- * Only closes the sheet if `clickOutsideToClose` is enabled.
577
+ * Keeps dialog semantics on the sheet surface instead of the custom-element host.
231
578
  *
232
- * @public
233
- * @template
579
+ * @protected
234
580
  */
235
- onBackdrop() {
236
- if (this.clickOutsideToClose && this.requestClose('outside')) {
237
- void this.close();
581
+ onIsOpenPropertyChanged(_previous, next) {
582
+ if (next) {
583
+ this.activateInteractionResources();
584
+ this.queueMeasurement();
585
+ this.setState('open');
586
+ if (this.isModal) {
587
+ this._modalController.activate();
588
+ }
589
+ }
590
+ else {
591
+ this.deactivateInteractionResources();
592
+ this._modalController.deactivate();
593
+ this.setState('closed');
238
594
  }
239
595
  }
240
596
  /**
241
- * @private
597
+ * @inheritdoc
598
+ * @protected
599
+ * @override
242
600
  */
243
- dragMouseDown(e) {
244
- const target = e.target;
245
- this._mouseUpSubscription = on(window, 'mouseup', (x) => this.dragMouseUp(x));
246
- this._mouseMoveSubscription = on(window, 'mousemove', (x) => this.dragMouseMove(x));
247
- this._touchEndSubscription = on(window, 'touchend', (x) => this.dragMouseUp(x));
248
- this._touchMoveSubscription = on(window, 'touchmove', (x) => this.dragMouseMove(x));
249
- this._positionY = this.getYCoord(e);
250
- this._dragOffset = this._positionY - target.getBoundingClientRect().top;
251
- document.body.style.overscrollBehaviorY = 'none';
601
+ onSheetHasBackdropPropertyChanged(_previous, _next) {
602
+ // Dialog semantics live on the movable surface, not on the custom-element host.
603
+ RendererServiceLocator.current.removeAttribute(this, 'aria-modal');
252
604
  }
253
605
  /**
254
- * @private
606
+ * Re-measures the sheet after its maximum height changes.
607
+ *
608
+ * @protected
255
609
  */
256
- dragMouseUp(e) {
257
- const root = this.getTemplatePart('root');
258
- const heading = this.getTemplatePart('heading');
259
- this._positionY = this.getYCoord(e);
260
- if (this.closeable && this._positionY >= window.innerHeight - 25) {
261
- // snap to close position.
262
- this.moveDragElement(window.innerHeight + 50, 'close');
263
- RendererServiceLocator.current.setAttribute(this, 'state', 'close');
264
- this._isPartial = false;
265
- return;
266
- }
267
- if (window.innerHeight - this._positionY > root.clientHeight / 2.5) {
268
- // snap to open position.
269
- this.moveDragElement(window.innerHeight - root.clientHeight, 'open');
270
- RendererServiceLocator.current.setAttribute(this, 'state', 'open');
271
- this._isPartial = false;
610
+ onHeightPropertyChanged(_previous, _next) {
611
+ this.queueMeasurement();
612
+ }
613
+ /**
614
+ * Re-measures the sheet after its opening edge changes.
615
+ *
616
+ * @protected
617
+ */
618
+ onPositionPropertyChanged(_previous, _next) {
619
+ this.queueMeasurement();
620
+ }
621
+ /**
622
+ * Synchronizes the default active snap and schedules snap resolution.
623
+ *
624
+ * @protected
625
+ */
626
+ onSnapsPropertyChanged(_previous, next) {
627
+ if (!this._activeSnapIndexExplicit) {
628
+ this._activeSnapIndex = Math.max(0, next.length - 1);
629
+ this.requestUpdate('activeSnapIndex');
272
630
  }
273
- else {
274
- // snap to initial position.
275
- // only when the header is visible.
276
- this.moveDragElement(window.innerHeight - heading.clientHeight - this._bounceOffset, 'partial');
277
- RendererServiceLocator.current.setAttribute(this, 'state', 'partial');
278
- this._isPartial = true;
631
+ this.queueMeasurement();
632
+ }
633
+ /**
634
+ * Moves an open sheet after its controlled snap index changes.
635
+ *
636
+ * @protected
637
+ */
638
+ onActiveSnapIndexPropertyChanged(previous, next) {
639
+ if (this.isOpen && !this._isDragging) {
640
+ this.moveToSnap(next, true, previous);
279
641
  }
280
642
  }
281
643
  /**
282
- * @private
644
+ * Activates or deactivates modal behavior while the sheet is open.
645
+ *
646
+ * @protected
283
647
  */
284
- dragMouseMove(e) {
285
- const root = this.getTemplatePart('root');
286
- this._positionY = this.getYCoord(e);
287
- if (this._positionY <= (window.innerHeight - root.clientHeight + this._dragOffset)) {
288
- return;
648
+ onIsModalPropertyChanged(_previous, next) {
649
+ if (this.isOpen) {
650
+ if (next) {
651
+ this._modalController.activate();
652
+ }
653
+ else {
654
+ this._modalController.deactivate();
655
+ }
289
656
  }
290
- root.style.setProperty('transition', 'none');
291
- root.style.setProperty('transform', `translateY(${this._positionY - this._dragOffset}px)`);
292
657
  }
293
658
  /**
294
- * @private
659
+ * Synchronizes the optional snap indicator after its visibility changes.
660
+ *
661
+ * @protected
295
662
  */
296
- moveDragElement(toPoint, state) {
297
- const root = this.getTemplatePart('root');
298
- const heading = this.getTemplatePart('heading');
299
- this._mouseUpSubscription?.dispose();
300
- this._touchEndSubscription?.dispose();
301
- this._mouseMoveSubscription?.dispose();
302
- this._touchMoveSubscription?.dispose();
303
- if (!toPoint && this._positionY >= window.innerHeight - heading.clientHeight) {
304
- root.style.setProperty('transform', `translateY(calc(100vh - ${heading.clientHeight}px))`);
663
+ onHasSnapIndicatorPropertyChanged(_previous, next) {
664
+ if (next) {
665
+ void this.updateComplete.then(() => this.renderSnapIndicators());
305
666
  }
306
- else {
307
- root.style.setProperty('transform', `translateY(${(toPoint || this._positionY) + this._bounceOffset}px)`);
667
+ }
668
+ activateInteractionResources() {
669
+ if (!this._visualViewportHandler) {
670
+ this._visualViewportHandler = this.handleViewportResize;
671
+ window.addEventListener('resize', this._visualViewportHandler, { passive: true });
672
+ window.visualViewport?.addEventListener('resize', this._visualViewportHandler, { passive: true });
308
673
  }
309
- root.style.setProperty('transition', 'transform 500ms cubic-bezier(0.4, 0, 0, 1) 0s');
310
- if (state === 'close') {
311
- this._mouseDownSubscription?.dispose();
312
- this._touchStartSubscription?.dispose();
313
- this._clickSubscription?.dispose();
314
- setTimeout(() => {
315
- this._mouseDownSubscription?.dispose();
316
- this._touchStartSubscription?.dispose();
317
- }, 250);
674
+ if (this._observedRoot) {
675
+ this.attachPointerListeners(this._observedRoot);
676
+ this.observeRoot(this._observedRoot);
318
677
  }
319
678
  }
320
- /**
321
- * @private
322
- */
323
- getYCoord(e) {
324
- if ('changedTouches' in e && e.changedTouches.length > 0) {
325
- return e.changedTouches[0].clientY;
679
+ deactivateInteractionResources() {
680
+ this.cleanupPointer();
681
+ if (this._observedRoot) {
682
+ this.detachPointerListeners(this._observedRoot);
683
+ }
684
+ this._resizeObserver?.disconnect();
685
+ this._resizeObserver = null;
686
+ if (this._measureFrame !== null) {
687
+ cancelAnimationFrame(this._measureFrame);
688
+ this._measureFrame = null;
689
+ }
690
+ if (this._visualViewportHandler) {
691
+ window.removeEventListener('resize', this._visualViewportHandler);
692
+ window.visualViewport?.removeEventListener('resize', this._visualViewportHandler);
693
+ this._visualViewportHandler = null;
694
+ }
695
+ }
696
+ attachPointerListeners(root) {
697
+ this.detachPointerListeners(root);
698
+ root.addEventListener('pointerdown', this.handlePointerDown);
699
+ root.addEventListener('pointermove', this.handlePointerMove);
700
+ root.addEventListener('pointerup', this.handlePointerUp);
701
+ root.addEventListener('pointercancel', this.handlePointerCancel);
702
+ }
703
+ detachPointerListeners(root) {
704
+ root.removeEventListener('pointerdown', this.handlePointerDown);
705
+ root.removeEventListener('pointermove', this.handlePointerMove);
706
+ root.removeEventListener('pointerup', this.handlePointerUp);
707
+ root.removeEventListener('pointercancel', this.handlePointerCancel);
708
+ }
709
+ handlePointerDown(event) {
710
+ if (!event.isPrimary || this._pointerId !== null || event.button > 0 || !this.isOpen) {
711
+ return;
712
+ }
713
+ const path = event.composedPath();
714
+ const target = path.find((entry) => entry instanceof Element);
715
+ if (!target || path.some((entry) => entry instanceof Element && entry.matches(INTERACTIVE_SELECTOR))) {
716
+ return;
717
+ }
718
+ if (this.dragMode === SheetDragMode.Handle && !path.some((entry) => entry instanceof Element && entry.matches('[part="handle"]'))) {
719
+ return;
720
+ }
721
+ this._pointerId = event.pointerId;
722
+ this._startX = event.clientX;
723
+ this._startY = event.clientY;
724
+ this._lastY = event.clientY;
725
+ this._startExtent = this._visibleExtent;
726
+ this._samples = [{ y: event.clientY, time: event.timeStamp }];
727
+ this._axisRejected = false;
728
+ this._isDragging = false;
729
+ }
730
+ handlePointerMove(event) {
731
+ if (event.pointerId !== this._pointerId || this._axisRejected) {
732
+ return;
733
+ }
734
+ const deltaX = event.clientX - this._startX;
735
+ const deltaY = event.clientY - this._startY;
736
+ if (!this._isDragging) {
737
+ if (Math.max(Math.abs(deltaX), Math.abs(deltaY)) < AXIS_LOCK_THRESHOLD) {
738
+ return;
739
+ }
740
+ if (Math.abs(deltaX) > Math.abs(deltaY)) {
741
+ this._axisRejected = true;
742
+ return;
743
+ }
744
+ if (this.consumeScrollableMovement(event)) {
745
+ this._startY = event.clientY;
746
+ this._lastY = event.clientY;
747
+ this._samples = [{ y: event.clientY, time: event.timeStamp }];
748
+ return;
749
+ }
750
+ this._isDragging = true;
751
+ this._observedRoot?.setPointerCapture(event.pointerId);
752
+ this.setTransition(false);
753
+ this.toggleAttribute('data-dragging', true);
754
+ this.setState('dragging');
755
+ this._dragStart.emit(this.createDragDetail(event, 0));
756
+ }
757
+ const extentDelta = verticalPointerDelta(this.position, this._startY, event.clientY);
758
+ const next = applyElasticity(this._startExtent + extentDelta, 0, this._maxExtent, this.elastic);
759
+ this.setVisibleExtent(next);
760
+ this._samples.push({ y: event.clientY, time: event.timeStamp });
761
+ this._samples = this._samples.filter((sample) => event.timeStamp - sample.time <= 120).slice(-6);
762
+ this._lastY = event.clientY;
763
+ this._dragging.emit(this.createDragDetail(event, this.getVelocity()));
764
+ }
765
+ handlePointerUp(event) {
766
+ if (event.pointerId !== this._pointerId) {
767
+ return;
768
+ }
769
+ if (!this._isDragging) {
770
+ this.cleanupPointer();
771
+ return;
772
+ }
773
+ const velocity = this.getVelocity();
774
+ const result = selectSnap(this._visibleExtent, velocity, this._resolvedSnaps, this._maxExtent, this.closeThreshold, this.inertia);
775
+ this._dragEnd.emit(this.createDragDetail(event, velocity));
776
+ this.cleanupPointer();
777
+ if (result.close && this.closeable && this.requestClose('gesture')) {
778
+ void this.close();
779
+ return;
780
+ }
781
+ this.moveToSnap(result.snapIndex < 0 ? 0 : result.snapIndex, true, this._activeSnapIndex);
782
+ this.setState('open');
783
+ }
784
+ handlePointerCancel(event) {
785
+ if (event.pointerId !== this._pointerId) {
786
+ return;
787
+ }
788
+ this.cleanupPointer();
789
+ this.moveToSnap(this._activeSnapIndex, true);
790
+ this.setState('open');
791
+ }
792
+ consumeScrollableMovement(event) {
793
+ if (this.dragMode === SheetDragMode.Handle || this._activeSnapIndex < this._resolvedSnaps.length - 1) {
794
+ return false;
795
+ }
796
+ const scrollable = this.findScrollable(event.composedPath());
797
+ if (!scrollable) {
798
+ return false;
799
+ }
800
+ const desiredScroll = this._lastY - event.clientY;
801
+ const maxScroll = scrollable.scrollHeight - scrollable.clientHeight;
802
+ const next = clamp(scrollable.scrollTop + desiredScroll, 0, maxScroll);
803
+ if (Math.abs(next - scrollable.scrollTop) < 0.5) {
804
+ return false;
805
+ }
806
+ scrollable.scrollTop = next;
807
+ return true;
808
+ }
809
+ findScrollable(path) {
810
+ return path.find((entry) => {
811
+ if (!(entry instanceof HTMLElement) || entry === this._observedRoot) {
812
+ return false;
813
+ }
814
+ const style = getComputedStyle(entry);
815
+ return /(auto|scroll)/.test(`${style.overflowY} ${style.overflow}`) && entry.scrollHeight > entry.clientHeight;
816
+ }) ?? null;
817
+ }
818
+ cleanupPointer() {
819
+ if (this._pointerId !== null && this._observedRoot?.hasPointerCapture(this._pointerId)) {
820
+ this._observedRoot.releasePointerCapture(this._pointerId);
821
+ }
822
+ this._pointerId = null;
823
+ this._isDragging = false;
824
+ this._axisRejected = false;
825
+ this._samples = [];
826
+ this.toggleAttribute('data-dragging', false);
827
+ }
828
+ getVelocity() {
829
+ if (this._samples.length < 2) {
830
+ return 0;
831
+ }
832
+ const first = this._samples[0];
833
+ const last = this._samples[this._samples.length - 1];
834
+ const elapsed = Math.max(1, last.time - first.time);
835
+ return verticalPointerDelta(this.position, first.y, last.y) / elapsed;
836
+ }
837
+ createDragDetail(event, velocity) {
838
+ return {
839
+ x: event.clientX,
840
+ y: event.clientY,
841
+ delta: verticalPointerDelta(this.position, this._startY, event.clientY),
842
+ position: this._visibleExtent,
843
+ velocity,
844
+ direction: this.position
845
+ };
846
+ }
847
+ measure() {
848
+ const root = this._observedRoot;
849
+ if (!root) {
850
+ return;
851
+ }
852
+ const viewportSize = window.visualViewport?.height ?? window.innerHeight;
853
+ const contentSize = root.scrollHeight;
854
+ this._maxExtent = this.height === 'auto'
855
+ ? Math.min(contentSize, viewportSize)
856
+ : clamp(resolveSnapLength(this.height, viewportSize, (value) => this.measureCssLength(value)), 0, viewportSize);
857
+ this._resolvedSnaps = resolveSnaps(this.snaps, SheetSnap.Content, viewportSize, contentSize, this._maxExtent, (value) => this.measureCssLength(value));
858
+ this._activeSnapIndex = this.clampSnapIndex(this._activeSnapIndex);
859
+ this.renderSnapIndicators();
860
+ if (this.isOpen && !this._isDragging) {
861
+ this.moveToSnap(this._activeSnapIndex, false);
862
+ }
863
+ }
864
+ measureCssLength(value) {
865
+ const probe = document.createElement('div');
866
+ probe.style.cssText = `position:fixed;visibility:hidden;pointer-events:none;height:${value};`;
867
+ document.body.appendChild(probe);
868
+ const result = probe.getBoundingClientRect().height;
869
+ probe.remove();
870
+ return result;
871
+ }
872
+ moveToSnap(index, animate, previousIndex = this._activeSnapIndex) {
873
+ if (this._resolvedSnaps.length === 0) {
874
+ return;
326
875
  }
327
- if ('touches' in e && e.touches.length > 0) {
328
- return e.touches[0].clientY;
876
+ const nextIndex = clamp(index, 0, this._resolvedSnaps.length - 1);
877
+ const snap = this._resolvedSnaps[nextIndex];
878
+ this.setTransition(animate);
879
+ this.setVisibleExtent(snap.value);
880
+ this._activeSnapIndex = nextIndex;
881
+ this.requestUpdate('activeSnapIndex');
882
+ this.setAttribute('data-snap-index', String(nextIndex));
883
+ this.toggleAttribute('data-max-snap', nextIndex === this._resolvedSnaps.length - 1);
884
+ this.updateSnapIndicatorState();
885
+ if (previousIndex !== nextIndex) {
886
+ this._activeSnapChanged.emit({
887
+ previousIndex,
888
+ currentIndex: nextIndex,
889
+ snap: snap.snap,
890
+ value: snap.value
891
+ });
329
892
  }
330
- return e.clientY;
893
+ }
894
+ setVisibleExtent(value) {
895
+ this._visibleExtent = value;
896
+ const root = this._observedRoot;
897
+ if (!root) {
898
+ return;
899
+ }
900
+ const hidden = this._maxExtent - value;
901
+ const translate = this.position === SheetPosition.Bottom ? hidden : -hidden;
902
+ root.style.transform = `translate3d(0, ${translate}px, 0)`;
903
+ root.style.setProperty('--sheet-progress', String(this._maxExtent > 0 ? clamp(value / this._maxExtent, 0, 1) : 0));
904
+ root.style.setProperty('--sheet-resolved-height', `${this._maxExtent}px`);
905
+ }
906
+ setTransition(enabled) {
907
+ this._observedRoot?.toggleAttribute('data-animate', enabled);
908
+ }
909
+ setState(state) {
910
+ RendererServiceLocator.current.setAttribute(this, 'data-state', state);
911
+ }
912
+ clampSnapIndex(value) {
913
+ const length = this._resolvedSnaps.length || this._snaps.length || 1;
914
+ return clamp(Math.round(Number.isFinite(value) ? value : length - 1), 0, length - 1);
915
+ }
916
+ queueMeasurement() {
917
+ if (!this.isConnected) {
918
+ return;
919
+ }
920
+ if (this._measureFrame !== null) {
921
+ cancelAnimationFrame(this._measureFrame);
922
+ }
923
+ this._measureFrame = requestAnimationFrame(() => {
924
+ this._measureFrame = null;
925
+ this.measure();
926
+ });
927
+ }
928
+ handleViewportResize() {
929
+ this.measure();
930
+ }
931
+ observeRoot(root) {
932
+ this._resizeObserver?.disconnect();
933
+ if (typeof ResizeObserver !== 'undefined') {
934
+ this._resizeObserver = new ResizeObserver(() => this.measure());
935
+ this._resizeObserver.observe(root);
936
+ }
937
+ }
938
+ waitForMotion() {
939
+ const root = this._observedRoot;
940
+ if (!root || matchMedia('(prefers-reduced-motion: reduce)').matches) {
941
+ return Promise.resolve();
942
+ }
943
+ const style = getComputedStyle(root);
944
+ const durations = style.transitionDuration.split(',').map((value) => this.parseMotionTime(value));
945
+ const delays = style.transitionDelay.split(',').map((value) => this.parseMotionTime(value));
946
+ const motionTime = durations.reduce((maximum, duration, index) => {
947
+ return Math.max(maximum, duration + delays[index % delays.length]);
948
+ }, 0);
949
+ if (motionTime === 0) {
950
+ return Promise.resolve();
951
+ }
952
+ return new Promise((resolve) => {
953
+ const timeout = window.setTimeout(resolve, Math.ceil(motionTime));
954
+ root.addEventListener('transitionend', () => {
955
+ clearTimeout(timeout);
956
+ resolve();
957
+ }, { once: true });
958
+ });
959
+ }
960
+ parseMotionTime(value) {
961
+ const time = Number.parseFloat(value);
962
+ return value.trim().endsWith('ms') ? time : time * 1000;
963
+ }
964
+ setBooleanProperty(field, property, value) {
965
+ if (this[field] !== value) {
966
+ this[field] = value;
967
+ this.requestUpdate(property);
968
+ }
969
+ }
970
+ renderSnapIndicators() {
971
+ const container = this.shadowRoot?.querySelector('[part="snap-indicator"]');
972
+ if (!container) {
973
+ return;
974
+ }
975
+ const indicators = this._resolvedSnaps.map((_snap, index) => {
976
+ const indicator = document.createElement('span');
977
+ indicator.setAttribute('part', 'snap-indicator-item');
978
+ indicator.setAttribute('data-active', String(index === this._activeSnapIndex));
979
+ return indicator;
980
+ });
981
+ container.replaceChildren(...indicators);
982
+ }
983
+ updateSnapIndicatorState() {
984
+ const indicators = this.shadowRoot?.querySelectorAll('[part="snap-indicator-item"]') ?? [];
985
+ indicators.forEach((indicator, index) => {
986
+ indicator.setAttribute('data-active', String(index === this._activeSnapIndex));
987
+ });
331
988
  }
332
989
  };
990
+ __decorate([
991
+ Attribute({
992
+ type: String,
993
+ converter: {
994
+ toAttribute: (value) => typeof value === 'number' ? `${value}px` : value?.toString() ?? ''
995
+ }
996
+ }),
997
+ __metadata("design:type", Object),
998
+ __metadata("design:paramtypes", [Object])
999
+ ], SheetElement.prototype, "width", null);
333
1000
  __decorate([
334
1001
  Attribute({ type: CssLength }),
335
1002
  __metadata("design:type", Object),
336
1003
  __metadata("design:paramtypes", [Object])
337
1004
  ], SheetElement.prototype, "height", null);
1005
+ __decorate([
1006
+ Attribute({ type: SheetPosition }),
1007
+ __metadata("design:type", String),
1008
+ __metadata("design:paramtypes", [String])
1009
+ ], SheetElement.prototype, "position", null);
1010
+ __decorate([
1011
+ Attribute({
1012
+ type: Array,
1013
+ converter: {
1014
+ fromAttribute: (value) => {
1015
+ if (!value?.trim()) {
1016
+ return [];
1017
+ }
1018
+ return value.trim().split(/\s+/).map((entry) => {
1019
+ if (entry === SheetSnap.Content) {
1020
+ return SheetSnap.Content;
1021
+ }
1022
+ const parsed = CssLength.tryParse(entry);
1023
+ if (parsed === undefined || parsed === 'auto') {
1024
+ throw new TypeError(`Invalid sheet snap "${entry}". Use a CSS length or "content".`);
1025
+ }
1026
+ return parsed;
1027
+ });
1028
+ },
1029
+ toAttribute: (value) => value.map((entry) => typeof entry === 'number' ? `${entry}px` : entry).join(' ')
1030
+ }
1031
+ }),
1032
+ __metadata("design:type", Array),
1033
+ __metadata("design:paramtypes", [Array])
1034
+ ], SheetElement.prototype, "snaps", null);
1035
+ __decorate([
1036
+ Attribute({ type: Number }),
1037
+ __metadata("design:type", Number),
1038
+ __metadata("design:paramtypes", [Number])
1039
+ ], SheetElement.prototype, "activeSnapIndex", null);
1040
+ __decorate([
1041
+ Attribute({ type: Number }),
1042
+ __metadata("design:type", Number),
1043
+ __metadata("design:paramtypes", [Number])
1044
+ ], SheetElement.prototype, "closeThreshold", null);
1045
+ __decorate([
1046
+ Attribute({ type: Boolean, useDefault: true }),
1047
+ __metadata("design:type", Boolean),
1048
+ __metadata("design:paramtypes", [Boolean])
1049
+ ], SheetElement.prototype, "elastic", null);
1050
+ __decorate([
1051
+ Attribute({ type: Boolean, useDefault: true }),
1052
+ __metadata("design:type", Boolean),
1053
+ __metadata("design:paramtypes", [Boolean])
1054
+ ], SheetElement.prototype, "inertia", null);
1055
+ __decorate([
1056
+ Attribute({ type: SheetDragMode }),
1057
+ __metadata("design:type", String),
1058
+ __metadata("design:paramtypes", [String])
1059
+ ], SheetElement.prototype, "dragMode", null);
1060
+ __decorate([
1061
+ Attribute({ type: Boolean, useDefault: true }),
1062
+ __metadata("design:type", Boolean),
1063
+ __metadata("design:paramtypes", [Boolean])
1064
+ ], SheetElement.prototype, "hasHandle", null);
1065
+ __decorate([
1066
+ Attribute({ type: Boolean, useDefault: true }),
1067
+ __metadata("design:type", Boolean),
1068
+ __metadata("design:paramtypes", [Boolean])
1069
+ ], SheetElement.prototype, "hasSnapIndicator", null);
1070
+ __decorate([
1071
+ Attribute({ type: Boolean, useDefault: true }),
1072
+ __metadata("design:type", Boolean),
1073
+ __metadata("design:paramtypes", [Boolean])
1074
+ ], SheetElement.prototype, "isModal", null);
1075
+ __decorate([
1076
+ Emit(),
1077
+ __metadata("design:type", Object),
1078
+ __metadata("design:paramtypes", [])
1079
+ ], SheetElement.prototype, "activeSnapChanged", null);
1080
+ __decorate([
1081
+ Emit(),
1082
+ __metadata("design:type", Object),
1083
+ __metadata("design:paramtypes", [])
1084
+ ], SheetElement.prototype, "dragStart", null);
1085
+ __decorate([
1086
+ Emit(),
1087
+ __metadata("design:type", Object),
1088
+ __metadata("design:paramtypes", [])
1089
+ ], SheetElement.prototype, "dragging", null);
1090
+ __decorate([
1091
+ Emit(),
1092
+ __metadata("design:type", Object),
1093
+ __metadata("design:paramtypes", [])
1094
+ ], SheetElement.prototype, "dragEnd", null);
1095
+ __decorate([
1096
+ Watch('isOpen', { waitUntilFirstUpdate: true }),
1097
+ __metadata("design:type", Function),
1098
+ __metadata("design:paramtypes", [Boolean, Boolean]),
1099
+ __metadata("design:returntype", void 0)
1100
+ ], SheetElement.prototype, "onIsOpenPropertyChanged", null);
1101
+ __decorate([
1102
+ Watch('hasBackdrop'),
1103
+ __metadata("design:type", Function),
1104
+ __metadata("design:paramtypes", [Boolean, Boolean]),
1105
+ __metadata("design:returntype", void 0)
1106
+ ], SheetElement.prototype, "onSheetHasBackdropPropertyChanged", null);
1107
+ __decorate([
1108
+ Watch('height'),
1109
+ __metadata("design:type", Function),
1110
+ __metadata("design:paramtypes", [Object, Object]),
1111
+ __metadata("design:returntype", void 0)
1112
+ ], SheetElement.prototype, "onHeightPropertyChanged", null);
1113
+ __decorate([
1114
+ Watch('position'),
1115
+ __metadata("design:type", Function),
1116
+ __metadata("design:paramtypes", [String, String]),
1117
+ __metadata("design:returntype", void 0)
1118
+ ], SheetElement.prototype, "onPositionPropertyChanged", null);
1119
+ __decorate([
1120
+ Watch('snaps'),
1121
+ __metadata("design:type", Function),
1122
+ __metadata("design:paramtypes", [Array, Array]),
1123
+ __metadata("design:returntype", void 0)
1124
+ ], SheetElement.prototype, "onSnapsPropertyChanged", null);
1125
+ __decorate([
1126
+ Watch('activeSnapIndex'),
1127
+ __metadata("design:type", Function),
1128
+ __metadata("design:paramtypes", [Number, Number]),
1129
+ __metadata("design:returntype", void 0)
1130
+ ], SheetElement.prototype, "onActiveSnapIndexPropertyChanged", null);
1131
+ __decorate([
1132
+ Watch('isModal'),
1133
+ __metadata("design:type", Function),
1134
+ __metadata("design:paramtypes", [Boolean, Boolean]),
1135
+ __metadata("design:returntype", void 0)
1136
+ ], SheetElement.prototype, "onIsModalPropertyChanged", null);
1137
+ __decorate([
1138
+ Watch('hasSnapIndicator', { waitUntilFirstUpdate: true }),
1139
+ __metadata("design:type", Function),
1140
+ __metadata("design:paramtypes", [Boolean, Boolean]),
1141
+ __metadata("design:returntype", void 0)
1142
+ ], SheetElement.prototype, "onHasSnapIndicatorPropertyChanged", null);
338
1143
  SheetElement = __decorate([
339
1144
  Component({
340
1145
  selector: 'mosaik-sheet',
@@ -344,12 +1149,7 @@ SheetElement = __decorate([
344
1149
  memphis: sheetElementMemphisStyle,
345
1150
  cosmopolitan: sheetElementCosmopolitanStyle
346
1151
  },
347
- imports: [
348
- BackdropElement,
349
- SheetHeaderElement,
350
- SheetContentElement,
351
- SheetFooterElement
352
- ]
1152
+ imports: [BackdropElement, SheetHeaderElement, SheetContentElement, SheetFooterElement]
353
1153
  }),
354
1154
  __metadata("design:paramtypes", [])
355
1155
  ], SheetElement);