@swiftwc/ui 0.0.0-dev.1 → 0.0.0-dev.100

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 (356) hide show
  1. package/README.md +15 -0
  2. package/generated/buses/alert-dialog.d.ts +2 -0
  3. package/generated/buses/alert-dialog.js +1 -0
  4. package/generated/buses/confirmation-dialog.d.ts +2 -0
  5. package/generated/buses/confirmation-dialog.js +1 -0
  6. package/generated/buses/index.d.ts +6 -0
  7. package/generated/buses/index.js +6 -0
  8. package/generated/buses/lifecycle-observer.d.ts +2 -0
  9. package/generated/buses/lifecycle-observer.js +1 -0
  10. package/generated/client/index.d.ts +30 -2
  11. package/generated/client/index.js +279 -8
  12. package/generated/components/alert-dialog.d.ts +11 -0
  13. package/generated/components/alert-dialog.js +102 -0
  14. package/generated/components/body-view.d.ts +13 -0
  15. package/generated/components/body-view.js +17 -0
  16. package/generated/components/bordered-button.d.ts +17 -0
  17. package/generated/components/bordered-button.js +56 -0
  18. package/generated/components/bordered-prominent-button.d.ts +17 -0
  19. package/generated/components/bordered-prominent-button.js +56 -0
  20. package/generated/components/borderless-button.d.ts +17 -0
  21. package/generated/components/borderless-button.js +56 -0
  22. package/generated/components/color-scheme.d.ts +12 -0
  23. package/generated/components/color-scheme.js +54 -0
  24. package/generated/components/confirmation-dialog.d.ts +12 -0
  25. package/generated/components/confirmation-dialog.js +116 -0
  26. package/generated/components/content-unavailable.d.ts +30 -0
  27. package/generated/components/content-unavailable.js +82 -0
  28. package/generated/components/date-picker.d.ts +52 -0
  29. package/generated/components/date-picker.js +480 -0
  30. package/generated/components/disclosure-group.d.ts +17 -0
  31. package/generated/components/disclosure-group.js +66 -0
  32. package/generated/components/fine-tooltip.d.ts +15 -0
  33. package/generated/components/fine-tooltip.js +111 -0
  34. package/generated/components/form-view.d.ts +16 -0
  35. package/generated/components/form-view.js +65 -0
  36. package/generated/components/glass-button.d.ts +16 -0
  37. package/generated/components/glass-button.js +53 -0
  38. package/generated/components/glass-prominent-button.d.ts +16 -0
  39. package/generated/components/glass-prominent-button.js +53 -0
  40. package/generated/components/h-stack.d.ts +22 -0
  41. package/generated/components/h-stack.js +26 -0
  42. package/generated/components/image-view.d.ts +18 -0
  43. package/generated/components/image-view.js +68 -0
  44. package/generated/components/index.d.ts +47 -1
  45. package/generated/components/index.js +47 -6
  46. package/generated/components/label-view.d.ts +27 -0
  47. package/generated/components/label-view.js +87 -0
  48. package/generated/components/labeled-content.d.ts +33 -0
  49. package/generated/components/labeled-content.js +161 -0
  50. package/generated/components/list-view.d.ts +15 -0
  51. package/generated/components/list-view.js +22 -0
  52. package/generated/components/menu-view.d.ts +20 -0
  53. package/generated/components/menu-view.js +140 -0
  54. package/generated/components/navigation-large-title.d.ts +18 -0
  55. package/generated/components/navigation-large-title.js +188 -0
  56. package/generated/components/navigation-split-view.d.ts +15 -0
  57. package/generated/components/navigation-split-view.js +25 -0
  58. package/generated/components/navigation-stack.d.ts +15 -0
  59. package/generated/components/navigation-stack.js +29 -0
  60. package/generated/components/navigation-title.d.ts +18 -0
  61. package/generated/components/navigation-title.js +72 -0
  62. package/generated/components/picker-view.d.ts +68 -0
  63. package/generated/components/picker-view.js +1153 -0
  64. package/generated/components/plain-button.d.ts +7 -0
  65. package/generated/components/plain-button.js +22 -0
  66. package/generated/components/progress-view.d.ts +20 -0
  67. package/generated/components/progress-view.js +125 -0
  68. package/generated/components/screen-view.d.ts +5 -0
  69. package/generated/components/screen-view.js +11 -0
  70. package/generated/components/scroll-view-proxy.d.ts +13 -0
  71. package/generated/components/scroll-view-proxy.js +17 -0
  72. package/generated/components/scroll-view.d.ts +22 -0
  73. package/generated/components/scroll-view.js +237 -0
  74. package/generated/components/search-view.d.ts +12 -0
  75. package/generated/components/search-view.js +27 -0
  76. package/generated/components/section-view.d.ts +21 -0
  77. package/generated/components/section-view.js +64 -0
  78. package/generated/components/sheet-view.d.ts +11 -0
  79. package/generated/components/sheet-view.js +45 -0
  80. package/generated/components/sidebar-toggle.d.ts +15 -0
  81. package/generated/components/sidebar-toggle.js +88 -0
  82. package/generated/components/sidebar-view.d.ts +10 -0
  83. package/generated/components/sidebar-view.js +37 -0
  84. package/generated/components/sticky-container.d.ts +11 -0
  85. package/generated/components/sticky-container.js +26 -0
  86. package/generated/components/tab-bar.d.ts +10 -0
  87. package/generated/components/tab-bar.js +40 -0
  88. package/generated/components/tab-item.d.ts +10 -0
  89. package/generated/components/tab-item.js +134 -0
  90. package/generated/components/tab-view.d.ts +31 -0
  91. package/generated/components/tab-view.js +198 -0
  92. package/generated/components/table-view.d.ts +26 -0
  93. package/generated/components/table-view.js +161 -0
  94. package/generated/components/text-field.d.ts +42 -0
  95. package/generated/components/text-field.js +526 -0
  96. package/generated/components/toggle-view.d.ts +43 -0
  97. package/generated/components/toggle-view.js +371 -0
  98. package/generated/components/tool-bar-item-group.d.ts +13 -0
  99. package/generated/components/tool-bar-item-group.js +31 -0
  100. package/generated/components/tool-bar-item.d.ts +16 -0
  101. package/generated/components/tool-bar-item.js +69 -0
  102. package/generated/components/tool-bar.d.ts +26 -0
  103. package/generated/components/tool-bar.js +95 -0
  104. package/generated/components/v-keyboard.d.ts +18 -0
  105. package/generated/components/v-keyboard.js +87 -0
  106. package/generated/components/v-stack.d.ts +25 -0
  107. package/generated/components/v-stack.js +29 -0
  108. package/generated/css/index.css +10644 -0
  109. package/generated/events/alert-dialog.d.ts +13 -0
  110. package/generated/events/alert-dialog.js +1 -0
  111. package/generated/events/confirmation-dialog.d.ts +14 -0
  112. package/generated/events/confirmation-dialog.js +1 -0
  113. package/generated/events/date-picker.d.ts +13 -0
  114. package/generated/events/date-picker.js +1 -0
  115. package/generated/events/index.d.ts +9 -0
  116. package/generated/events/index.js +9 -0
  117. package/generated/events/lifecycle-observer.d.ts +18 -0
  118. package/generated/events/lifecycle-observer.js +1 -0
  119. package/generated/events/picker-view.d.ts +29 -0
  120. package/generated/events/picker-view.js +1 -0
  121. package/generated/events/scroll-view.d.ts +18 -0
  122. package/generated/events/scroll-view.js +1 -0
  123. package/generated/events/tab-view.d.ts +54 -0
  124. package/generated/events/tab-view.js +1 -0
  125. package/generated/events/text-field.d.ts +13 -0
  126. package/generated/events/text-field.js +1 -0
  127. package/generated/events/toggle-view.d.ts +14 -0
  128. package/generated/events/toggle-view.js +1 -0
  129. package/generated/i18n/index.d.ts +33 -0
  130. package/generated/i18n/index.js +164 -0
  131. package/generated/i18n/locales/el.d.ts +16 -0
  132. package/generated/i18n/locales/el.js +16 -0
  133. package/generated/i18n/locales/en.d.ts +16 -0
  134. package/generated/i18n/locales/en.js +16 -0
  135. package/generated/i18n/locales/index.d.ts +4 -0
  136. package/generated/i18n/locales/index.js +4 -0
  137. package/generated/index.js +1 -1
  138. package/generated/internal/class/cleanup-registry.d.ts +5 -0
  139. package/generated/internal/class/cleanup-registry.js +38 -0
  140. package/generated/internal/class/css-style-observer.d.ts +8 -0
  141. package/generated/internal/class/css-style-observer.js +26 -0
  142. package/generated/internal/class/form-associated-base.d.ts +16 -0
  143. package/generated/internal/class/form-associated-base.js +78 -0
  144. package/generated/internal/class/mutation-observer-set.d.ts +9 -0
  145. package/generated/internal/class/mutation-observer-set.js +42 -0
  146. package/generated/internal/class/mutation-observer-singleton.d.ts +10 -0
  147. package/generated/internal/class/mutation-observer-singleton.js +64 -0
  148. package/generated/internal/class/navigation-path.d.ts +15 -0
  149. package/generated/internal/class/navigation-path.js +84 -0
  150. package/generated/internal/class/navigation-view.d.ts +8 -0
  151. package/generated/internal/class/navigation-view.js +72 -0
  152. package/generated/internal/class/resize-observer-singleton.d.ts +7 -0
  153. package/generated/internal/class/resize-observer-singleton.js +22 -0
  154. package/generated/internal/decorators/adaptive-slot.d.ts +1 -0
  155. package/generated/internal/decorators/adaptive-slot.js +50 -0
  156. package/generated/internal/decorators/custom-element.d.ts +5 -0
  157. package/generated/internal/decorators/custom-element.js +5 -0
  158. package/generated/internal/decorators/index.d.ts +6 -0
  159. package/generated/internal/decorators/index.js +6 -0
  160. package/generated/internal/decorators/microtask-on-connected.d.ts +39 -0
  161. package/generated/internal/decorators/microtask-on-connected.js +67 -0
  162. package/generated/internal/privateNamespace.d.ts +14 -0
  163. package/generated/internal/privateNamespace.js +168 -0
  164. package/generated/internal/utils/add.d.ts +1 -0
  165. package/generated/internal/utils/add.js +7 -0
  166. package/generated/internal/utils/cash/ancestors.d.ts +1 -0
  167. package/generated/internal/utils/cash/ancestors.js +27 -0
  168. package/generated/internal/utils/cash/index.d.ts +24 -0
  169. package/generated/internal/utils/cash/index.js +27 -0
  170. package/generated/internal/utils/cash/next-all.d.ts +1 -0
  171. package/generated/internal/utils/cash/next-all.js +10 -0
  172. package/generated/internal/utils/cash/next.d.ts +1 -0
  173. package/generated/internal/utils/cash/next.js +9 -0
  174. package/generated/internal/utils/cash/prev-all.d.ts +1 -0
  175. package/generated/internal/utils/cash/prev-all.js +10 -0
  176. package/generated/internal/utils/cash/prev.d.ts +1 -0
  177. package/generated/internal/utils/cash/prev.js +9 -0
  178. package/generated/internal/utils/cash/prop.d.ts +18 -0
  179. package/generated/internal/utils/cash/prop.js +30 -0
  180. package/generated/internal/utils/cash/siblings.d.ts +1 -0
  181. package/generated/internal/utils/cash/siblings.js +10 -0
  182. package/generated/internal/utils/clamp.d.ts +1 -0
  183. package/generated/internal/utils/clamp.js +4 -0
  184. package/generated/internal/utils/compare-big-decimals.d.ts +1 -0
  185. package/generated/internal/utils/compare-big-decimals.js +80 -0
  186. package/generated/internal/utils/css-time.d.ts +1 -0
  187. package/generated/internal/utils/css-time.js +3 -0
  188. package/generated/internal/utils/debounce.d.ts +1 -0
  189. package/generated/internal/utils/debounce.js +13 -0
  190. package/generated/internal/utils/define-translations.d.ts +1 -0
  191. package/generated/internal/utils/define-translations.js +3 -0
  192. package/generated/internal/utils/dev-flags.d.ts +3 -0
  193. package/generated/internal/utils/dev-flags.js +5 -0
  194. package/generated/internal/utils/ensure-placeholder.d.ts +1 -0
  195. package/generated/internal/utils/ensure-placeholder.js +41 -0
  196. package/generated/internal/utils/frame.d.ts +1 -0
  197. package/generated/internal/utils/frame.js +6 -0
  198. package/generated/internal/utils/index.d.ts +20 -1
  199. package/generated/internal/utils/index.js +23 -1
  200. package/generated/internal/utils/is-inside.d.ts +1 -0
  201. package/generated/internal/utils/is-inside.js +4 -0
  202. package/generated/internal/utils/kebab-case.d.ts +1 -1
  203. package/generated/internal/utils/kebab-case.js +6 -9
  204. package/generated/internal/utils/list-active.d.ts +7 -0
  205. package/generated/internal/utils/list-active.js +83 -0
  206. package/generated/internal/utils/microtask.d.ts +1 -0
  207. package/generated/internal/utils/microtask.js +3 -0
  208. package/generated/internal/utils/onoff.d.ts +45 -0
  209. package/generated/internal/utils/onoff.js +31 -0
  210. package/generated/internal/utils/set.d.ts +1 -0
  211. package/generated/internal/utils/set.js +7 -0
  212. package/generated/internal/utils/sleep.d.ts +1 -0
  213. package/generated/internal/utils/sleep.js +3 -0
  214. package/generated/internal/utils/slow-hide-show.d.ts +1 -0
  215. package/generated/internal/utils/slow-hide-show.js +16 -0
  216. package/generated/internal/utils/timeout.d.ts +5 -0
  217. package/generated/internal/utils/timeout.js +16 -0
  218. package/generated/internal/utils/touch-glass.d.ts +7 -0
  219. package/generated/internal/utils/touch-glass.js +19 -0
  220. package/generated/internal/vendor/morphdom.d.ts +6 -0
  221. package/generated/internal/vendor/morphdom.js +720 -0
  222. package/generated/morphdom/index.d.ts +8 -0
  223. package/generated/morphdom/index.js +8 -0
  224. package/generated/morphdom/morph.d.ts +4 -0
  225. package/generated/morphdom/morph.js +10 -0
  226. package/generated/morphdom/query-morph.d.ts +5 -0
  227. package/generated/morphdom/query-morph.js +12 -0
  228. package/generated/morphdom/render-to-string.d.ts +12 -0
  229. package/generated/morphdom/render-to-string.js +48 -0
  230. package/generated/morphdom/unsafe-html.d.ts +2 -0
  231. package/generated/morphdom/unsafe-html.js +4 -0
  232. package/generated/namespace-browser/base.d.ts +45 -0
  233. package/generated/namespace-browser/base.js +115 -0
  234. package/generated/namespace-browser/event.d.ts +10 -0
  235. package/generated/namespace-browser/event.js +1 -0
  236. package/generated/namespace-browser/index.d.ts +7 -0
  237. package/generated/namespace-browser/index.js +1 -0
  238. package/generated/snapshot/index.d.ts +9 -0
  239. package/generated/snapshot/index.js +60 -0
  240. package/generated/tpl/html.d.ts +5 -0
  241. package/generated/tpl/html.js +7 -0
  242. package/generated/tpl/index.d.ts +6 -0
  243. package/generated/tpl/index.js +6 -0
  244. package/generated/tpl/is-template-result.d.ts +3 -0
  245. package/generated/tpl/is-template-result.js +1 -0
  246. package/generated/tpl/render.d.ts +2 -0
  247. package/generated/tpl/render.js +132 -0
  248. package/package.json +49 -8
  249. package/scss/_base.scss +5 -0
  250. package/scss/_components.scss +90 -0
  251. package/scss/_final.scss +1 -0
  252. package/scss/_functions.scss +31 -0
  253. package/scss/_maps.scss +293 -0
  254. package/scss/_mixins.scss +7 -0
  255. package/scss/_placeholders.scss +3 -0
  256. package/scss/_transitions.scss +32 -0
  257. package/scss/_utils.scss +9 -0
  258. package/scss/_vars.scss +68 -0
  259. package/scss/base/_layout.scss +66 -0
  260. package/scss/base/_reboot.scss +191 -0
  261. package/scss/base/_root.scss +415 -0
  262. package/scss/colors/_index.scss +881 -0
  263. package/scss/components/_alert-dialog.scss +111 -0
  264. package/scss/components/_body-view.scss +17 -0
  265. package/scss/components/_bordered-button.scss +59 -0
  266. package/scss/components/_bordered-prominent-button.scss +65 -0
  267. package/scss/components/_borderless-button.scss +45 -0
  268. package/scss/components/_confirmation-dialog.scss +102 -0
  269. package/scss/components/_content-unavailable.scss +57 -0
  270. package/scss/components/_date-picker.scss +30 -0
  271. package/scss/components/_detail-placeholder.scss +153 -0
  272. package/scss/components/_disclosure-group.scss +179 -0
  273. package/scss/components/_fine-tooltip.scss +84 -0
  274. package/scss/components/_form-view.scss +234 -0
  275. package/scss/components/_full-screen.scss +15 -0
  276. package/scss/components/_glass-button.scss +61 -0
  277. package/scss/components/_glass-prominent-button.scss +71 -0
  278. package/scss/components/_group-box.scss +27 -0
  279. package/scss/components/_h-divider.scss +13 -0
  280. package/scss/components/_h-flex-stack.scss +23 -0
  281. package/scss/components/_h-stack.scss +28 -0
  282. package/scss/components/_image-view.scss +20 -0
  283. package/scss/components/_index.scss +264 -0
  284. package/scss/components/_label-view copy.scss.txt +420 -0
  285. package/scss/components/_label-view.scss +371 -0
  286. package/scss/components/_label-view.scss.txt +536 -0
  287. package/scss/components/_labeled-content.scss +75 -0
  288. package/scss/components/_list-view.scss +270 -0
  289. package/scss/components/_menu-view.scss +223 -0
  290. package/scss/components/_navigation-large-title.scss +44 -0
  291. package/scss/components/_navigation-split-view.scss +424 -0
  292. package/scss/components/_navigation-stack.scss +11 -0
  293. package/scss/components/_navigation-title.scss +10 -0
  294. package/scss/components/_picker-view.scss +329 -0
  295. package/scss/components/_plain-button.scss +19 -0
  296. package/scss/components/_progress-view.scss +98 -0
  297. package/scss/components/_scroll-view-proxy.scss +81 -0
  298. package/scss/components/_scroll-view-toolbars.scss +132 -0
  299. package/scss/components/_scroll-view.scss +134 -0
  300. package/scss/components/_search-view.scss +23 -0
  301. package/scss/components/_section-view.scss +120 -0
  302. package/scss/components/_sheet-view.scss +103 -0
  303. package/scss/components/_sidebar-toggle.scss +121 -0
  304. package/scss/components/_sidebar-view.scss +53 -0
  305. package/scss/components/_sticky-container.scss +42 -0
  306. package/scss/components/_tab-bar.scss +268 -0
  307. package/scss/components/_tab-item.scss +25 -0
  308. package/scss/components/_tab-view.scss +312 -0
  309. package/scss/components/_table-column.scss +54 -0
  310. package/scss/components/_table-row.scss +240 -0
  311. package/scss/components/_table-view.scss +232 -0
  312. package/scss/components/_text-field.scss +57 -0
  313. package/scss/components/_text-view.scss +57 -0
  314. package/scss/components/_toggle-view.scss +161 -0
  315. package/scss/components/_tool-bar-item-group.scss +48 -0
  316. package/scss/components/_tool-bar-item.scss +97 -0
  317. package/scss/components/_tool-bar.scss +153 -0
  318. package/scss/components/_v-divider.scss +13 -0
  319. package/scss/components/_v-flex-stack.scss +29 -0
  320. package/scss/components/_v-keyboard.scss +14 -0
  321. package/scss/components/_v-stack.scss +24 -0
  322. package/scss/final/_touch-glass.scss +98 -0
  323. package/scss/index.scss +18 -1
  324. package/scss/mixins/_button.scss +44 -0
  325. package/scss/mixins/_color.scss +16 -0
  326. package/scss/mixins/_dialog.scss +89 -0
  327. package/scss/mixins/_index.scss +473 -0
  328. package/scss/placeholders/_buttons.scss +118 -0
  329. package/scss/placeholders/_lists.scss +622 -0
  330. package/scss/transitions/_alert-dialog.scss +18 -0
  331. package/scss/transitions/_bwd.navbar.scss +19 -0
  332. package/scss/transitions/_bwd.scss +39 -0
  333. package/scss/transitions/_confirmation-dialog.scss +27 -0
  334. package/scss/transitions/_disclosure-group.scss +35 -0
  335. package/scss/transitions/_fine-tooltip.scss +21 -0
  336. package/scss/transitions/_fwd.navbar.scss +41 -0
  337. package/scss/transitions/_fwd.scss +24 -0
  338. package/scss/transitions/_glass-button.scss +12 -0
  339. package/scss/transitions/_glass-prominent-button.scss +12 -0
  340. package/scss/transitions/_index.scss +74 -0
  341. package/scss/transitions/_menu-view.scss +28 -0
  342. package/scss/transitions/_navigation-split-view.scss +23 -0
  343. package/scss/transitions/_progress-view.scss +23 -0
  344. package/scss/transitions/_sheet-view.scss +30 -0
  345. package/scss/transitions/_sidebar-view.scss +36 -0
  346. package/scss/transitions/_tab-bar.scss +20 -0
  347. package/scss/utils/_frame.scss +103 -0
  348. package/scss/utils/_index.scss +54 -0
  349. package/scss/utils/_scroll-view.scss +14 -0
  350. package/scss/utils/_spacing.scss +25 -0
  351. package/scss/utils/_stacks.scss +112 -0
  352. package/web-components.css-data/en.json +28 -0
  353. package/web-components.html-data/en.json +2604 -0
  354. package/generated/internal/snapshot.d.ts +0 -5
  355. package/generated/internal/snapshot.js +0 -23
  356. package/generated/styles.css +0 -1
@@ -0,0 +1,45 @@
1
+ import { CleanupRegistry } from '../internal/class/cleanup-registry';
2
+ import { devFlags, onoff } from '../internal/utils';
3
+ import { DialogBase } from '../namespace-browser/base';
4
+ /**
5
+ * @summary A dialog that slides up over the current screen.
6
+ */
7
+ export class SheetView extends DialogBase {
8
+ constructor() {
9
+ super();
10
+ }
11
+ static polyfillDisconnectedCallback(el) {
12
+ if (devFlags.debug)
13
+ console.debug(`${SheetView.name} ⚡️ disconnect`);
14
+ CleanupRegistry.unregister(el);
15
+ }
16
+ static polyfillConnectedCallback(el) {
17
+ if (devFlags.debug)
18
+ console.debug(`${SheetView.name} ⚡️ connect`);
19
+ CleanupRegistry.register(el, onoff([
20
+ { types: 'cancel', listener: this.#handleCancel },
21
+ { types: 'keydown', listener: SheetView.#handleKeydown },
22
+ ], el).on());
23
+ el.autofocus = true;
24
+ }
25
+ static polyfillAttributeChangedCallback([{ attributeName, target, oldValue }]) {
26
+ if (devFlags.debug)
27
+ console.debug(`${SheetView.name} ⚡️ attr-change [${attributeName}] ("${oldValue}" → "${target.getAttribute(attributeName ?? '')}")`);
28
+ }
29
+ static #handleKeydown = (evt) => {
30
+ if (devFlags.debug)
31
+ console.debug(`${SheetView.name} ⚡️ ${evt?.type} (${evt.key})`);
32
+ if ('Escape' !== evt.key)
33
+ return;
34
+ evt.preventDefault();
35
+ evt.stopImmediatePropagation();
36
+ evt.stopPropagation();
37
+ };
38
+ static #handleCancel = (evt) => {
39
+ if (devFlags.debug)
40
+ console.debug(`${SheetView.name} ⚡️ ${evt?.type} (${evt.cancelable})`);
41
+ if (!evt.cancelable)
42
+ return;
43
+ evt.preventDefault();
44
+ };
45
+ }
@@ -0,0 +1,15 @@
1
+ /**
2
+ * @summary A control that shows or hides the sidebar view.
3
+ */
4
+ export declare class SidebarToggle extends HTMLElement {
5
+ #private;
6
+ constructor();
7
+ disconnectedCallback(): void;
8
+ connectedCallback(): void;
9
+ private static query;
10
+ }
11
+ declare global {
12
+ interface HTMLElementTagNameMap {
13
+ 'sidebar-toggle': SidebarToggle;
14
+ }
15
+ }
@@ -0,0 +1,88 @@
1
+ var _a;
2
+ import { CleanupRegistry } from '../internal/class/cleanup-registry';
3
+ import { ResizeObserverSingleton } from '../internal/class/resize-observer-singleton';
4
+ import { debounce, devFlags, onoff } from '../internal/utils';
5
+ const observers = new ResizeObserverSingleton();
6
+ /**
7
+ * @summary A control that shows or hides the sidebar view.
8
+ */
9
+ export class SidebarToggle extends HTMLElement {
10
+ constructor() {
11
+ super();
12
+ }
13
+ disconnectedCallback() {
14
+ if (devFlags.debug)
15
+ console.debug(`${_a.name} ⚡️ disconnect`);
16
+ observers.unobserve(this);
17
+ CleanupRegistry.unregister(this);
18
+ }
19
+ connectedCallback() {
20
+ if (devFlags.debug)
21
+ console.debug(`${_a.name} ⚡️ connect`);
22
+ CleanupRegistry.register(this, onoff('click', this.#handleClick, this).on());
23
+ const entry = {
24
+ target: this,
25
+ };
26
+ observers.observe(this, debounce(_a.#handleMeasure, 100, true)); //this.#ro?.observe(this)
27
+ // @ts-expect-error
28
+ _a.#handleMeasure([entry]);
29
+ }
30
+ static query(target) {
31
+ const container = target?.closest('navigation-split-view,tab-view'), sideBar = container?.querySelector(':scope>[is=sidebar-view]');
32
+ return { container, sideBar };
33
+ }
34
+ // This triggers on show/hide of any of sidebar-toggle elements
35
+ static #handleMeasure(entry) {
36
+ if (devFlags.debug)
37
+ console.debug(`${_a.name} ⚡️ measure`);
38
+ const { target } = entry ?? {};
39
+ if (!(target instanceof HTMLElement))
40
+ return;
41
+ // set/remove css var/prop to parent based on shown/hidden
42
+ const tv = target.parentElement;
43
+ // inlineSize = entry.borderBoxSize?.at(0)?.inlineSize ?? entry.contentRect?.width ?? 0,
44
+ // blockSize = entry.borderBoxSize?.at(0)?.blockSize ?? entry.contentRect?.height ?? 0
45
+ self.requestAnimationFrame(() => {
46
+ const inlineSize = target.offsetWidth ?? 0;
47
+ if (0 < inlineSize)
48
+ tv?.style?.setProperty?.('--sidebar-toggle-padding-inline-start', `${inlineSize}px`); //$.prop('--sidebar-toggle-padding-inline-start', `${inlineSize}px`, tv) //
49
+ else
50
+ tv?.style?.removeProperty?.('--sidebar-toggle-padding-inline-start'); //$.prop('--sidebar-toggle-padding-inline-start', null, tv) //
51
+ });
52
+ // auto close IF open
53
+ const { container, sideBar } = _a.query(target); //target?.closest('navigation-split-view,tab-view')
54
+ if (!sideBar?.open)
55
+ return;
56
+ self.requestAnimationFrame(() => {
57
+ switch (container?.tagName) {
58
+ case 'NAVIGATION-SPLIT-VIEW':
59
+ if (0 < target.offsetWidth && 0 < target.offsetHeight)
60
+ return;
61
+ break;
62
+ case 'TAB-VIEW':
63
+ // scan all toggles for anyone that is visible, sign that sidebar should stay open
64
+ if ([
65
+ ...container.querySelectorAll(':scope > sidebar-toggle,:scope > [is=tab-bar] > sidebar-toggle' //,:scope > [is='sidebar-view'] > tool-bar > sidebar-toggle" ?? FIXME: removed this bc/ inside sidebar!
66
+ ),
67
+ ].some(({ offsetWidth, offsetHeight }) => 0 < offsetWidth && 0 < offsetHeight))
68
+ return;
69
+ break;
70
+ }
71
+ sideBar?.close?.();
72
+ });
73
+ }
74
+ #handleClick({ target, type }) {
75
+ if (devFlags.debug)
76
+ console.debug(`${_a.name} ⚡️ ${type}`);
77
+ if (!(target instanceof HTMLElement))
78
+ return;
79
+ if (!target?.closest('button'))
80
+ return;
81
+ const { sideBar } = _a.query(target);
82
+ if (!sideBar?.open)
83
+ sideBar?.showModal();
84
+ else
85
+ sideBar.close();
86
+ }
87
+ }
88
+ _a = SidebarToggle;
@@ -0,0 +1,10 @@
1
+ import { DialogBase } from '../namespace-browser/base';
2
+ /**
3
+ * @summary A container view that arranges navigation destinations in a single column.
4
+ */
5
+ export declare class SidebarView extends DialogBase {
6
+ #private;
7
+ constructor();
8
+ static polyfillDisconnectedCallback(el: HTMLDialogElement): void;
9
+ static polyfillConnectedCallback(el: HTMLDialogElement): void;
10
+ }
@@ -0,0 +1,37 @@
1
+ import { CleanupRegistry } from '../internal/class/cleanup-registry';
2
+ import { devFlags, onoff, touchGlass } from '../internal/utils';
3
+ import { DialogBase } from '../namespace-browser/base';
4
+ /**
5
+ * @summary A container view that arranges navigation destinations in a single column.
6
+ */
7
+ export class SidebarView extends DialogBase {
8
+ constructor() {
9
+ super();
10
+ }
11
+ static polyfillDisconnectedCallback(el) {
12
+ el.removeEventListener('click', SidebarView.#handleClick);
13
+ CleanupRegistry.unregister(el);
14
+ }
15
+ static polyfillConnectedCallback(el) {
16
+ CleanupRegistry.register(el, onoff('click', SidebarView.#handleClick, el).on());
17
+ CleanupRegistry.register(el, onoff(touchGlass(el, (t) => t, ({ target }) => {
18
+ if (!(target instanceof HTMLElement))
19
+ return true;
20
+ if (target.matches('[is=sidebar-view]'))
21
+ return false;
22
+ if (target.closest('tool-bar-item'))
23
+ return false;
24
+ return true;
25
+ }), el).on());
26
+ el.autofocus = true;
27
+ }
28
+ // Autoclose on click outside.
29
+ static #handleClick = async ({ target, type }) => {
30
+ if (devFlags.debug)
31
+ console.debug(`${SidebarView.name} ⚡️ ${type}`);
32
+ if (!(target instanceof HTMLElement))
33
+ return;
34
+ if (target instanceof HTMLDialogElement && 'sidebar-view' === target.getAttribute('is'))
35
+ target.close?.();
36
+ };
37
+ }
@@ -0,0 +1,11 @@
1
+ export declare class StickyContainer extends HTMLElement {
2
+ #private;
3
+ constructor();
4
+ disconnectedCallback(): void;
5
+ connectedCallback(): void;
6
+ }
7
+ declare global {
8
+ interface HTMLElementTagNameMap {
9
+ 'sticky-container': StickyContainer;
10
+ }
11
+ }
@@ -0,0 +1,26 @@
1
+ import { CleanupRegistry } from '../internal/class/cleanup-registry';
2
+ import { devFlags, onoff } from '../internal/utils';
3
+ export class StickyContainer extends HTMLElement {
4
+ constructor() {
5
+ super();
6
+ }
7
+ disconnectedCallback() {
8
+ if (devFlags.debug)
9
+ console.debug(`${StickyContainer.name} ⚡️ disconnect`);
10
+ CleanupRegistry.unregister(this);
11
+ }
12
+ connectedCallback() {
13
+ if (devFlags.debug)
14
+ console.debug(`${StickyContainer.name} ⚡️ connect`);
15
+ // CleanupRegistry.register(this, onoff('transitionend transitionstart transitioncancel', this.#handleTransitionrun as unknown as EventListener, this).on())
16
+ CleanupRegistry.register(this, onoff('transitionrun', this.#handleTransitionrun, this).on());
17
+ }
18
+ #handleTransitionrun = ({ target, propertyName, pseudoElement }) => {
19
+ if (!(target instanceof HTMLElement))
20
+ return;
21
+ if ('--stuck' !== propertyName || '::before' !== pseudoElement || !target.matches('sticky-container'))
22
+ return;
23
+ const stuck = self.getComputedStyle(this, 'before').getPropertyValue('--stuck');
24
+ this.toggleAttribute('stuck', '1' === stuck);
25
+ };
26
+ }
@@ -0,0 +1,10 @@
1
+ import { DialogBase } from '../namespace-browser/base';
2
+ /**
3
+ * @summary A container view that groups tab-items together along the top or bottom of the screen.
4
+ */
5
+ export declare class TabBar extends DialogBase {
6
+ #private;
7
+ constructor();
8
+ static polyfillDisconnectedCallback(el: HTMLDialogElement): void;
9
+ static polyfillConnectedCallback(el: HTMLDialogElement): void;
10
+ }
@@ -0,0 +1,40 @@
1
+ import { CleanupRegistry } from '../internal/class/cleanup-registry';
2
+ import { devFlags, onoff, touchGlass } from '../internal/utils';
3
+ import { DialogBase } from '../namespace-browser/base';
4
+ /**
5
+ * @summary A container view that groups tab-items together along the top or bottom of the screen.
6
+ */
7
+ export class TabBar extends DialogBase {
8
+ constructor() {
9
+ super();
10
+ }
11
+ static polyfillDisconnectedCallback(el) {
12
+ if (devFlags.debug)
13
+ console.debug(`${TabBar.name} ⚡️ disconnect`);
14
+ el.removeEventListener('click', TabBar.#handleClick);
15
+ CleanupRegistry.unregister(el);
16
+ }
17
+ static polyfillConnectedCallback(el) {
18
+ if (devFlags.debug)
19
+ console.debug(`${TabBar.name} ⚡️ connect`);
20
+ el.autofocus = true;
21
+ CleanupRegistry.register(el, onoff('click', TabBar.#handleClick, el).on());
22
+ CleanupRegistry.register(el, onoff(touchGlass(el, (t) => t, ({ target }) => {
23
+ if (!(target instanceof HTMLElement))
24
+ return true;
25
+ if (target.matches('[is=tab-bar]'))
26
+ return false;
27
+ if (target.closest('tool-bar-item'))
28
+ return false;
29
+ return true;
30
+ }), el).on());
31
+ }
32
+ static #handleClick = async ({ target, type }) => {
33
+ if (devFlags.debug)
34
+ console.debug(`${TabBar.name} ⚡️ ${type}`);
35
+ if (!(target instanceof HTMLElement))
36
+ return;
37
+ if (target instanceof HTMLDialogElement && 'tab-bar' === target.getAttribute('is'))
38
+ target.close?.();
39
+ };
40
+ }
@@ -0,0 +1,10 @@
1
+ import { ButtonBase } from '../namespace-browser/base';
2
+ /**
3
+ * @summary A control that switches the tab view to this tab.
4
+ */
5
+ export declare class TabItem extends ButtonBase {
6
+ #private;
7
+ constructor();
8
+ static polyfillDisconnectedCallback(btn: HTMLButtonElement): void;
9
+ static polyfillConnectedCallback(btn: TabItem): void;
10
+ }
@@ -0,0 +1,134 @@
1
+ import { CleanupRegistry } from '../internal/class/cleanup-registry';
2
+ import { devFlags, onoff } from '../internal/utils';
3
+ import { ButtonBase } from '../namespace-browser/base';
4
+ import { TabView } from './tab-view';
5
+ /**
6
+ * @summary A control that switches the tab view to this tab.
7
+ */
8
+ export class TabItem extends ButtonBase {
9
+ constructor() {
10
+ super();
11
+ }
12
+ static polyfillDisconnectedCallback(btn) {
13
+ if (devFlags.debug)
14
+ console.debug(`${TabItem.name} ⚡️ disconnect`);
15
+ CleanupRegistry.unregister(btn);
16
+ }
17
+ static polyfillConnectedCallback(btn) {
18
+ if (devFlags.debug)
19
+ console.debug(`${TabItem.name} ⚡️ connect`);
20
+ Object.assign(btn, {
21
+ tabIndex: 0,
22
+ ariaSelected: 'false',
23
+ });
24
+ CleanupRegistry.register(btn, onoff('click', TabItem.#handleClick, btn).on());
25
+ const handler1 = TabItem.#handleTabRevealOrSwap.bind(null, btn), handler2 = TabItem.#handleTabMoreStackAllowance.bind(null, btn), tv = btn.closest('tab-view') ?? undefined;
26
+ CleanupRegistry.register(btn, onoff('tabreveal tabswap', handler1, tv).on());
27
+ CleanupRegistry.register(btn, onoff('tab-view:adaptable-tab-bar-placement-change', handler2, tv).on());
28
+ // NOTE: Make sure before invoking props of TAB-VIEW
29
+ self.customElements.whenDefined('tab-view').then(() => {
30
+ if (!btn.isConnected)
31
+ return;
32
+ if (tv?.selectedTab?.map(({ id }) => id)?.includes(btn.value))
33
+ void this.#handleTabRevealOrSwap(btn, new CustomEvent('tabreveal', { detail: { tag: btn.value } }));
34
+ if (tv?.moreTab)
35
+ this.#handleTabMoreStackAllowance(btn, new CustomEvent('tab-view:adaptable-tab-bar-placement-change'));
36
+ });
37
+ }
38
+ static #handleTabMoreStackAllowance = async (btn, evt) => {
39
+ if (devFlags.debug)
40
+ console.debug(`${TabItem.name} ⚡️ ${evt?.type}`);
41
+ const tv = btn.closest('tab-view');
42
+ if (!tv)
43
+ return;
44
+ if (tv.moreTab?.id !== btn.value)
45
+ return;
46
+ btn.hidden = 'bottom-bar' !== tv.tabBarPlacement;
47
+ };
48
+ static #handleTabRevealOrSwap = async (btn, evt) => {
49
+ if (devFlags.debug)
50
+ console.debug(`${TabItem.name} ⚡️ ${evt?.type}`);
51
+ const tv = btn?.closest('tab-view');
52
+ if (!tv)
53
+ return;
54
+ // if (evt.detail?.tag !== btn.value) return
55
+ // await Snapshot.waitReady
56
+ const isSelected = tv.selectedTab.map(({ id }) => id).includes(btn.value); //'tabreveal' === evt?.type
57
+ if (`${isSelected}` !== btn.ariaSelected)
58
+ btn.ariaSelected = `${isSelected}`;
59
+ if (!isSelected)
60
+ return;
61
+ setTimeout(() => {
62
+ if (btn.ariaSelected !== 'true' || !btn.isConnected)
63
+ return;
64
+ btn.scrollIntoView({
65
+ behavior: self.matchMedia('(prefers-reduced-motion: no-preference)').matches ? 'smooth' : 'instant',
66
+ block: 'nearest',
67
+ inline: 'nearest',
68
+ });
69
+ }, 100);
70
+ };
71
+ static #handleClick = async ({ type, currentTarget: btn }) => {
72
+ if (devFlags.debug)
73
+ console.debug(`${TabItem.name} ⚡️ ${type}`);
74
+ if (!(btn instanceof HTMLElement))
75
+ return;
76
+ // const tag = btn.getAttribute('value')
77
+ // if (!tag) return // sidebartoggle > tab-item //throw new DOMException(`Attribute "tag" is set but invalid`, 'InvalidStateError')
78
+ const tv = btn.closest('tab-view');
79
+ if (!tv)
80
+ throw new Error('TabView not found');
81
+ const newTab = tv?.querySelector(`#${btn.getAttribute('value')}`);
82
+ if (!newTab)
83
+ return;
84
+ // console.log(99, TabView.gatherTab(newTab))
85
+ // const possibleParentNs = newTab?.parentElement?.closest<NavigationStack | NavigationSplitView>('navigation-stack,navigation-split-view')
86
+ const tabs = TabView.gatherTab(newTab); //[possibleParentNs, newTab].filter(Boolean) as (NavigationStack | NavigationSplitView)[]
87
+ // if (possibleParentNs) tabs.unshift(possibleParentNs)
88
+ // SECTION: before submitting new tabs, check for tabroot
89
+ // iphone cases:
90
+ // current -> new
91
+ // ns1 -> ns1 tabroot💡ns1 1 1 === ===
92
+ // more -> more tabroot💡more 1 1 === ===
93
+ // ns1 -> more tabroot💡more 1 1 !== ->
94
+ // more,settings -> more tabroot💡more 2 1 !== ↖
95
+ // more,settings -> ns1 2 1 !== <-
96
+ // ns1 -> more tabroot💡more 1 1 !== ->
97
+ // ipad cases:
98
+ // ns1 -> ns1 tabroot💡ns1 1 1 === ===
99
+ // more,settings -> more,settings tabroot💡settings 2 2 === ===
100
+ // more,settings -> more,ns3 2 2 !== <->
101
+ // more,ns3 -> more,settings 2 2 !== <->
102
+ // ns1 -> more,settings 1 2 !== ↘
103
+ const seed1 = tv.selectedTab.map((item) => item.id).join(','), seed2 = tabs.map((item) => item.id).join(',');
104
+ const dir = tv.selectedTab.length < tabs.length
105
+ ? '↘'
106
+ : tv.selectedTab.length > tabs.length
107
+ ? tv.selectedTab.at(0) === tabs.at(0)
108
+ ? '↖'
109
+ : '<-'
110
+ : seed1 === seed2
111
+ ? '==='
112
+ : tv.moreTab === tabs.at(-1)
113
+ ? '->'
114
+ : '<->';
115
+ if (['===', '↖'].includes(dir)) {
116
+ for (const tab of tabs.reverse())
117
+ if (tv.selectedTab.includes(tab)) {
118
+ const eventType = 'tabroot';
119
+ if (devFlags.debug)
120
+ console.debug(`${TabItem.name} 💡 ${eventType}`);
121
+ tab?.dispatchEvent(new CustomEvent(eventType, { bubbles: true, composed: true }));
122
+ return; // skip rest no selection!
123
+ }
124
+ }
125
+ else if ('->' === dir) {
126
+ const eventType = 'tabroot';
127
+ if (devFlags.debug)
128
+ console.debug(`${TabItem.name} 💡 ${eventType}`);
129
+ tabs.at(0)?.dispatchEvent(new CustomEvent(eventType, { bubbles: true, composed: true }));
130
+ }
131
+ // SECTION: finally, submit new tabs
132
+ tv.selectedTab = tabs;
133
+ };
134
+ }
@@ -0,0 +1,31 @@
1
+ import { type NavigationSplitView } from './navigation-split-view';
2
+ import { type NavigationStack } from './navigation-stack';
3
+ declare const TAB_BAR_PLACEMENTS: readonly ["bottom-bar", "ornament", "sidebar", "top-bar"];
4
+ export type TabBarPlacement = (typeof TAB_BAR_PLACEMENTS)[number];
5
+ /**
6
+ * @summary A container view that switches between screens using tabs.
7
+ *
8
+ * @cssprop --adaptable-tab-bar-placement
9
+ *
10
+ * @fires tabshow — A Tab is shown
11
+ * @fires tabhide — A Tab is hidden
12
+ * @fires tab-view:toggle
13
+ * @fires tab-view:adaptable-tab-bar-placement-change
14
+ */
15
+ export declare class TabView extends HTMLElement {
16
+ #private;
17
+ static gatherTab(newTab: NavigationStack | NavigationSplitView): (NavigationStack | NavigationSplitView)[];
18
+ constructor();
19
+ disconnectedCallback(): void;
20
+ get tabBarPlacement(): "bottom-bar" | "ornament" | "sidebar" | "top-bar" | undefined;
21
+ get moreTab(): NavigationStack | null;
22
+ connectedCallback(): void;
23
+ get selectedTab(): (NavigationSplitView | NavigationStack)[];
24
+ set selectedTab(tabs: (NavigationSplitView | NavigationStack)[]);
25
+ }
26
+ declare global {
27
+ interface HTMLElementTagNameMap {
28
+ 'tab-view': TabView;
29
+ }
30
+ }
31
+ export {};
@@ -0,0 +1,198 @@
1
+ var _a;
2
+ import { CleanupRegistry } from '../internal/class/cleanup-registry';
3
+ import { CSSStyleObserver } from '../internal/class/css-style-observer';
4
+ import { NavigationPath } from '../internal/class/navigation-path';
5
+ import { $, cssTime, debounce, devFlags, frame, onoff, timeout } from '../internal/utils';
6
+ import { Snapshot } from '../snapshot';
7
+ const TAB_BAR_PLACEMENTS = ['bottom-bar', 'ornament', 'sidebar', 'top-bar'];
8
+ /**
9
+ * @summary A container view that switches between screens using tabs.
10
+ *
11
+ * @cssprop --adaptable-tab-bar-placement
12
+ *
13
+ * @fires tabshow — A Tab is shown
14
+ * @fires tabhide — A Tab is hidden
15
+ * @fires tab-view:toggle
16
+ * @fires tab-view:adaptable-tab-bar-placement-change
17
+ */
18
+ export class TabView extends HTMLElement {
19
+ #debouncedHandler;
20
+ #cssStyleObserver;
21
+ #afterTabRevealDelay = timeout();
22
+ #cachedAdaptableTabBarPlacement = 'bottom-bar';
23
+ static gatherTab(newTab) {
24
+ const possibleParentNs = newTab?.parentElement?.closest('navigation-stack,navigation-split-view');
25
+ return [possibleParentNs, newTab].filter(Boolean);
26
+ }
27
+ constructor() {
28
+ super();
29
+ this.#debouncedHandler = debounce(this.#handleSelectionChange, 1);
30
+ }
31
+ disconnectedCallback() {
32
+ if (devFlags.debug)
33
+ console.debug(`${_a.name} ⚡️ disconnect`);
34
+ this.#afterTabRevealDelay.cancel();
35
+ this.#cssStyleObserver?.disconnect();
36
+ CleanupRegistry.unregister(this);
37
+ }
38
+ get tabBarPlacement() {
39
+ return this.#cachedAdaptableTabBarPlacement;
40
+ }
41
+ get moreTab() {
42
+ return this.querySelector(':scope>navigation-stack:has(> navigation-stack,> navigation-split-view)');
43
+ }
44
+ connectedCallback() {
45
+ if (devFlags.debug)
46
+ console.debug(`${_a.name} ⚡️ connect`);
47
+ this.#cssStyleObserver = new CSSStyleObserver({
48
+ properties: ['--adaptable-tab-bar-placement-index'],
49
+ });
50
+ this.#cssStyleObserver.observe(this, this.#handleStyleChange);
51
+ Snapshot.waitReady.then(() => self.requestAnimationFrame(this.#handleStyleChange)); // Snapshot.waitReady.then(this.#handleStyleChange)
52
+ CleanupRegistry.register(this, onoff([
53
+ { types: 'tabreveal tabswap', listener: this.#debouncedHandler },
54
+ { types: 'beforetabreveal beforetabswap', listener: this.#addAnimations },
55
+ { types: 'tab-view:adaptable-tab-bar-placement-change', listener: this.#handleAdaptableTabBarPlacementChange },
56
+ { types: 'pagereveal', listener: this.#handleTabViewPagereveal },
57
+ {
58
+ types: 'click',
59
+ listener: this.#handleSummaryClick,
60
+ },
61
+ ], this).on());
62
+ }
63
+ #handleSummaryClick = ({ target }) => {
64
+ if (!(target instanceof HTMLElement))
65
+ return;
66
+ const summary = target.closest('summary');
67
+ if (!summary)
68
+ return;
69
+ if (0 === $.siblings('[aria-selected=true]', summary).length)
70
+ return;
71
+ if (!summary.closest('scroll-view')?.matches('tab-view > [is=sidebar-view] > scroll-view'))
72
+ return;
73
+ const form = summary.closest('[is=form-view]');
74
+ if (!form)
75
+ return;
76
+ const style = self.getComputedStyle(form);
77
+ if ('sidebar' !== style.getPropertyValue('--list-style'))
78
+ return;
79
+ this.#addAnimations(new CustomEvent('beforetabreveal', { detail: { tag: '', ms: cssTime(`${this.computedStyleMap().get(`--tabbar-after-tabreveal-duration`)}`) }, bubbles: true, composed: true }));
80
+ };
81
+ #handleTabViewPagereveal = (evt) => {
82
+ if (devFlags.debug)
83
+ console.debug(`${_a.name} ⚡️ ${evt?.type}`);
84
+ void this.#syncBodyFace();
85
+ };
86
+ #handleStyleChange = () => {
87
+ if (devFlags.debug)
88
+ console.debug(`${_a.name} ⚡️ style`);
89
+ const style = self.getComputedStyle(this);
90
+ const placement = style.getPropertyValue('--adaptable-tab-bar-placement'), // or do it manually without any computedstyle
91
+ newValue = TAB_BAR_PLACEMENTS.includes(placement) ? placement : 'bottom-bar';
92
+ if (newValue !== this.#cachedAdaptableTabBarPlacement) {
93
+ const oldValue = this.#cachedAdaptableTabBarPlacement;
94
+ this.#cachedAdaptableTabBarPlacement = newValue;
95
+ this.dispatchEvent(new CustomEvent('tab-view:adaptable-tab-bar-placement-change', {
96
+ detail: { oldValue, newValue },
97
+ bubbles: true,
98
+ composed: true,
99
+ }));
100
+ }
101
+ };
102
+ #handleAdaptableTabBarPlacementChange = (evt) => {
103
+ if (devFlags.debug)
104
+ console.debug(`${_a.name} ⚡️ ${evt?.type}`);
105
+ if ('bottom-bar' !== evt.detail.oldValue)
106
+ return; // button triggers should happen, ONLY when going FROM bottom-bar TO anything else
107
+ const innerSelection = this.moreTab?.querySelector(':scope>navigation-stack:not([hidden]),:scope>navigation-split-view:not([hidden])')?.id;
108
+ if (innerSelection) {
109
+ const btn = this.querySelector(`[is="tab-item"][value="${CSS.escape(innerSelection)}"]`);
110
+ // NOTE: simulate btn click BU WITHOUT tabroot functionality!
111
+ if (btn) {
112
+ const newTab = this.querySelector(`#${btn.getAttribute('value')}`);
113
+ if (newTab) {
114
+ this.selectedTab = _a.gatherTab(newTab);
115
+ return;
116
+ }
117
+ }
118
+ }
119
+ const outerSelection = this?.querySelector(':scope>navigation-stack:not([hidden]),:scope>navigation-split-view:not([hidden])')?.id;
120
+ if (outerSelection && outerSelection === this.moreTab?.id) {
121
+ const btn = this.querySelector(`[is="tab-item"]:not([value="${CSS.escape(outerSelection)}"])`);
122
+ // NOTE: simulate btn click BU WITHOUT tabroot functionality!
123
+ if (btn) {
124
+ const newTab = this.querySelector(`#${btn.getAttribute('value')}`);
125
+ if (newTab) {
126
+ this.selectedTab = _a.gatherTab(newTab);
127
+ return;
128
+ }
129
+ }
130
+ }
131
+ };
132
+ get selectedTab() {
133
+ return [...this.querySelectorAll('navigation-stack:not([hidden]),navigation-split-view:not([hidden])')];
134
+ }
135
+ set selectedTab(tabs) {
136
+ const valid = [...tabs].every((el, i, arr) => !i || arr[i - 1].contains(el));
137
+ if (0 === tabs.length)
138
+ throw new Error('Element not found');
139
+ if (!valid)
140
+ throw new Error('selectedTab[] must be in order of parent>child. You provided an element that contains the previous sibling.');
141
+ //
142
+ const selectors = [':not(:is(:scope>{{tag}}))', ':is(:scope>{{tag}})']; // first nested ones, then root ones
143
+ const ms = cssTime(`${this.computedStyleMap().get(`--tabbar-after-tabreveal-duration`)}`);
144
+ for (const selector of selectors)
145
+ for (const ns of this.querySelectorAll(`navigation-stack:not([hidden])${selector.replace('{{tag}}', 'navigation-stack')},navigation-split-view:not([hidden])${selector.replace('{{tag}}', 'navigation-split-view')}`)) {
146
+ if (!tabs.some((tab) => !ns.contains(tab)))
147
+ continue; // shouldRun
148
+ ns.dispatchEvent(new CustomEvent('beforetabswap', { detail: { tag: ns.id, ms }, bubbles: true, composed: true }));
149
+ ns.hidden = true; // triggers
150
+ }
151
+ for (const selector of selectors.reverse())
152
+ for (const ns of this.querySelectorAll(`navigation-stack[hidden]${selector.replace('{{tag}}', 'navigation-stack')},navigation-split-view[hidden]${selector.replace('{{tag}}', 'navigation-split-view')}`)) {
153
+ if (!tabs.some((tab) => ns.contains(tab)))
154
+ continue; // shouldRun
155
+ ns.dispatchEvent(new CustomEvent('beforetabreveal', { detail: { tag: ns.id, ms }, bubbles: true, composed: true }));
156
+ ns.hidden = false; // triggers
157
+ }
158
+ }
159
+ #addAnimations = (evt) => {
160
+ this.setAttribute('js-aftertabreveal', '');
161
+ // const ms = cssTime(`${this.computedStyleMap().get(`--tabbar-after-tabreveal-duration`)}`)
162
+ this.#afterTabRevealDelay.next(() => {
163
+ this.removeAttribute('js-aftertabreveal');
164
+ }, evt.detail.ms);
165
+ };
166
+ #handleSelectionChange = (evt) => {
167
+ this.#triggerToggleEvent(evt);
168
+ };
169
+ #triggerToggleEvent = (evt) => {
170
+ const eventType = 'tab-view:toggle';
171
+ void this.#syncBodyFace();
172
+ if (devFlags.debug)
173
+ console.debug(`${_a.name} 💡 ${eventType}`);
174
+ this.dispatchEvent(new CustomEvent(eventType, { detail: { selection: this.selectedTab }, bubbles: true, composed: true }));
175
+ };
176
+ #syncBodyFace = async () => {
177
+ if (!(await frame(this)))
178
+ return;
179
+ const tab = this.selectedTab.at(-1), //event.detail.selection.at(-1), //document.querySelector(`#${}`),
180
+ path = new NavigationPath(tab), sv = [path, ...path.children()]
181
+ .filter((item) => item.component?.matches(':not(dialog)'))
182
+ .map((item) => item.body)
183
+ .filter(Boolean)
184
+ .at(-1); //queryBodyAll(tab).at(-1)
185
+ if (!sv)
186
+ return;
187
+ // const style = self.getComputedStyle(sv),
188
+ // hostStyle = self.getComputedStyle(document.documentElement)
189
+ // console.log(999, tab, style.getPropertyValue('--face'), hostStyle.getPropertyValue('--face'))
190
+ if (!sv.style.getPropertyValue('--face'))
191
+ return document.body.style.removeProperty('--face');
192
+ // if (style.getPropertyValue('--face') === hostStyle.getPropertyValue('--face'))
193
+ document.body.style.setProperty('--face', sv.style.getPropertyValue('--face'));
194
+ // if (tab?.matches('tab-view>navigation-stack>:scope')) return document.body.style.setProperty('--face', style.getPropertyValue('--face'))
195
+ // if (tab?.matches('tab-view>:scope')) return document.body.style.setProperty('--face', style.getPropertyValue('--face'))
196
+ };
197
+ }
198
+ _a = TabView;