@swiftwc/ui 0.0.0-dev.6 → 0.0.0-dev.8

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