@swiftwc/ui 0.0.0-dev.4 → 0.0.0-dev.41

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