@swiftwc/ui 0.0.0-dev.2 → 0.0.0-dev.20

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 (277) hide show
  1. package/README.md +15 -0
  2. package/generated/client/index.d.ts +16 -2
  3. package/generated/client/index.js +290 -8
  4. package/generated/components/body-view.d.ts +5 -0
  5. package/generated/components/body-view.js +11 -0
  6. package/generated/components/bordered-button.d.ts +7 -0
  7. package/generated/components/bordered-button.js +20 -0
  8. package/generated/components/bordered-prominent-button.d.ts +7 -0
  9. package/generated/components/bordered-prominent-button.js +20 -0
  10. package/generated/components/borderless-button.d.ts +9 -0
  11. package/generated/components/borderless-button.js +35 -0
  12. package/generated/components/confirmation-dialog.d.ts +9 -0
  13. package/generated/components/confirmation-dialog.js +102 -0
  14. package/generated/components/content-unavailable-view.d.ts +24 -0
  15. package/generated/components/content-unavailable-view.js +78 -0
  16. package/generated/components/date-picker.d.ts +46 -0
  17. package/generated/components/date-picker.js +428 -0
  18. package/generated/components/disclosure-group.d.ts +9 -0
  19. package/generated/components/disclosure-group.js +51 -0
  20. package/generated/components/form-view.d.ts +6 -0
  21. package/generated/components/form-view.js +58 -0
  22. package/generated/components/glass-button.d.ts +6 -0
  23. package/generated/components/glass-button.js +17 -0
  24. package/generated/components/glass-prominent-button.d.ts +6 -0
  25. package/generated/components/glass-prominent-button.js +17 -0
  26. package/generated/components/index.d.ts +38 -1
  27. package/generated/components/index.js +38 -6
  28. package/generated/components/label-view.d.ts +9 -0
  29. package/generated/components/label-view.js +83 -0
  30. package/generated/components/list-view.d.ts +5 -0
  31. package/generated/components/list-view.js +29 -0
  32. package/generated/components/menu-view.d.ts +9 -0
  33. package/generated/components/menu-view.js +133 -0
  34. package/generated/components/navigation-large-title.d.ts +6 -0
  35. package/generated/components/navigation-large-title.js +177 -0
  36. package/generated/components/navigation-split-view.d.ts +10 -0
  37. package/generated/components/navigation-split-view.js +21 -0
  38. package/generated/components/navigation-stack.d.ts +10 -0
  39. package/generated/components/navigation-stack.js +27 -0
  40. package/generated/components/navigation-title.d.ts +8 -0
  41. package/generated/components/navigation-title.js +66 -0
  42. package/generated/components/picker-view.d.ts +27 -0
  43. package/generated/components/picker-view.js +442 -0
  44. package/generated/components/plain-button.d.ts +7 -0
  45. package/generated/components/plain-button.js +20 -0
  46. package/generated/components/screen-view.d.ts +5 -0
  47. package/generated/components/screen-view.js +9 -0
  48. package/generated/components/scroll-view-proxy.d.ts +8 -0
  49. package/generated/components/scroll-view-proxy.js +14 -0
  50. package/generated/components/scroll-view.d.ts +10 -0
  51. package/generated/components/scroll-view.js +187 -0
  52. package/generated/components/section-view.d.ts +9 -0
  53. package/generated/components/section-view.js +81 -0
  54. package/generated/components/sheet-view.d.ts +9 -0
  55. package/generated/components/sheet-view.js +69 -0
  56. package/generated/components/sidebar-toggle.d.ts +7 -0
  57. package/generated/components/sidebar-toggle.js +80 -0
  58. package/generated/components/sidebar-view.d.ts +7 -0
  59. package/generated/components/sidebar-view.js +29 -0
  60. package/generated/components/sticky-container.d.ts +6 -0
  61. package/generated/components/sticky-container.js +22 -0
  62. package/generated/components/tab-bar.d.ts +10 -0
  63. package/generated/components/tab-bar.js +36 -0
  64. package/generated/components/tab-item.d.ts +7 -0
  65. package/generated/components/tab-item.js +123 -0
  66. package/generated/components/tab-view.d.ts +22 -0
  67. package/generated/components/tab-view.js +256 -0
  68. package/generated/components/table-view.d.ts +7 -0
  69. package/generated/components/table-view.js +175 -0
  70. package/generated/components/text-field.d.ts +29 -0
  71. package/generated/components/text-field.js +473 -0
  72. package/generated/components/tool-bar-item-group.d.ts +5 -0
  73. package/generated/components/tool-bar-item-group.js +11 -0
  74. package/generated/components/tool-bar-item.d.ts +5 -0
  75. package/generated/components/tool-bar-item.js +19 -0
  76. package/generated/components/tool-bar.d.ts +7 -0
  77. package/generated/components/tool-bar.js +77 -0
  78. package/generated/components/v-keyboard.d.ts +11 -0
  79. package/generated/components/v-keyboard.js +81 -0
  80. package/generated/components/v-stack.d.ts +5 -0
  81. package/generated/components/v-stack.js +11 -0
  82. package/generated/confirmation-dialog/index.d.ts +1 -0
  83. package/generated/confirmation-dialog/index.js +1 -0
  84. package/generated/css/index.css +7503 -0
  85. package/generated/events/confirmation-dialog.d.ts +9 -0
  86. package/generated/events/confirmation-dialog.js +1 -0
  87. package/generated/events/date-picker.d.ts +8 -0
  88. package/generated/events/date-picker.js +1 -0
  89. package/generated/events/index.d.ts +7 -0
  90. package/generated/events/index.js +7 -0
  91. package/generated/events/lifecycle-observer.d.ts +10 -0
  92. package/generated/events/lifecycle-observer.js +1 -0
  93. package/generated/events/picker-view.d.ts +8 -0
  94. package/generated/events/picker-view.js +1 -0
  95. package/generated/events/scroll-view.d.ts +10 -0
  96. package/generated/events/scroll-view.js +1 -0
  97. package/generated/events/tab-view.d.ts +24 -0
  98. package/generated/events/tab-view.js +1 -0
  99. package/generated/events/text-field.d.ts +8 -0
  100. package/generated/events/text-field.js +1 -0
  101. package/generated/i18n/index.d.ts +34 -0
  102. package/generated/i18n/index.js +167 -0
  103. package/generated/i18n/locales/el.d.ts +8 -0
  104. package/generated/i18n/locales/el.js +8 -0
  105. package/generated/i18n/locales/en.d.ts +8 -0
  106. package/generated/i18n/locales/en.js +8 -0
  107. package/generated/i18n/locales/index.d.ts +4 -0
  108. package/generated/i18n/locales/index.js +4 -0
  109. package/generated/index.js +1 -1
  110. package/generated/internal/class/cleanup-registry.d.ts +5 -0
  111. package/generated/internal/class/cleanup-registry.js +38 -0
  112. package/generated/internal/class/css-style-observer.d.ts +8 -0
  113. package/generated/internal/class/css-style-observer.js +25 -0
  114. package/generated/internal/class/form-associated-base.d.ts +20 -0
  115. package/generated/internal/class/form-associated-base.js +93 -0
  116. package/generated/internal/class/mutation-observer-singleton.d.ts +10 -0
  117. package/generated/internal/class/mutation-observer-singleton.js +46 -0
  118. package/generated/internal/class/navigation-path.d.ts +15 -0
  119. package/generated/internal/class/navigation-path.js +84 -0
  120. package/generated/internal/class/navigation-view.d.ts +8 -0
  121. package/generated/internal/class/navigation-view.js +77 -0
  122. package/generated/internal/class/resize-observer-singleton.d.ts +7 -0
  123. package/generated/internal/class/resize-observer-singleton.js +22 -0
  124. package/generated/internal/decorators/custom-element.d.ts +5 -0
  125. package/generated/internal/decorators/custom-element.js +4 -0
  126. package/generated/internal/privateNamespace.d.ts +4 -0
  127. package/generated/internal/privateNamespace.js +1 -0
  128. package/generated/internal/utils/add.d.ts +1 -0
  129. package/generated/internal/utils/add.js +7 -0
  130. package/generated/internal/utils/cash/ancestors.d.ts +1 -0
  131. package/generated/internal/utils/cash/ancestors.js +27 -0
  132. package/generated/internal/utils/cash/index.d.ts +22 -0
  133. package/generated/internal/utils/cash/index.js +23 -0
  134. package/generated/internal/utils/cash/next-all.d.ts +1 -0
  135. package/generated/internal/utils/cash/next-all.js +10 -0
  136. package/generated/internal/utils/cash/next.d.ts +1 -0
  137. package/generated/internal/utils/cash/next.js +9 -0
  138. package/generated/internal/utils/cash/prev-all.d.ts +1 -0
  139. package/generated/internal/utils/cash/prev-all.js +10 -0
  140. package/generated/internal/utils/cash/prev.d.ts +1 -0
  141. package/generated/internal/utils/cash/prev.js +9 -0
  142. package/generated/internal/utils/cash/prop.d.ts +18 -0
  143. package/generated/internal/utils/cash/prop.js +30 -0
  144. package/generated/internal/utils/cash/siblings.d.ts +1 -0
  145. package/generated/internal/utils/cash/siblings.js +10 -0
  146. package/generated/internal/utils/clamp.d.ts +1 -0
  147. package/generated/internal/utils/clamp.js +4 -0
  148. package/generated/internal/utils/compare-big-decimals.d.ts +1 -0
  149. package/generated/internal/utils/compare-big-decimals.js +90 -0
  150. package/generated/internal/utils/css-time.d.ts +1 -0
  151. package/generated/internal/utils/css-time.js +3 -0
  152. package/generated/internal/utils/debounce.d.ts +1 -0
  153. package/generated/internal/utils/debounce.js +13 -0
  154. package/generated/internal/utils/frame.d.ts +1 -0
  155. package/generated/internal/utils/frame.js +6 -0
  156. package/generated/internal/utils/index.d.ts +17 -1
  157. package/generated/internal/utils/index.js +18 -1
  158. package/generated/internal/utils/kebab-case.d.ts +1 -1
  159. package/generated/internal/utils/kebab-case.js +3 -3
  160. package/generated/internal/utils/list-active.d.ts +7 -0
  161. package/generated/internal/utils/list-active.js +73 -0
  162. package/generated/internal/utils/microtask.d.ts +1 -0
  163. package/generated/internal/utils/microtask.js +3 -0
  164. package/generated/internal/utils/onoff.d.ts +45 -0
  165. package/generated/internal/utils/onoff.js +31 -0
  166. package/generated/internal/utils/set.d.ts +1 -0
  167. package/generated/internal/utils/set.js +7 -0
  168. package/generated/internal/utils/sleep.d.ts +1 -0
  169. package/generated/internal/utils/sleep.js +3 -0
  170. package/generated/internal/utils/slow-hide-show.d.ts +1 -0
  171. package/generated/internal/utils/slow-hide-show.js +16 -0
  172. package/generated/internal/utils/timeout.d.ts +5 -0
  173. package/generated/internal/utils/timeout.js +16 -0
  174. package/generated/internal/utils/touch-glass.d.ts +7 -0
  175. package/generated/internal/utils/touch-glass.js +19 -0
  176. package/generated/lifecycle-observer/index.d.ts +1 -0
  177. package/generated/lifecycle-observer/index.js +1 -0
  178. package/generated/namespace-browser/base.d.ts +36 -0
  179. package/generated/namespace-browser/base.js +92 -0
  180. package/generated/namespace-browser/index.d.ts +7 -0
  181. package/generated/namespace-browser/index.js +1 -0
  182. package/generated/snapshot/index.d.ts +7 -0
  183. package/generated/snapshot/index.js +37 -0
  184. package/package.json +33 -9
  185. package/scss/_base.scss +5 -0
  186. package/scss/_components.scss +77 -0
  187. package/scss/_final.scss +1 -0
  188. package/scss/_functions.scss +21 -0
  189. package/scss/_mixins.scss +3 -0
  190. package/scss/_placeholders.scss +3 -0
  191. package/scss/_transitions.scss +27 -0
  192. package/scss/_utils.scss +9 -0
  193. package/scss/_vars.scss +174 -3
  194. package/scss/base/_layout.scss +56 -0
  195. package/scss/base/_reboot.scss +160 -0
  196. package/scss/base/_root.scss +396 -0
  197. package/scss/colors/_index.scss +635 -0
  198. package/scss/components/_body-view.scss +17 -0
  199. package/scss/components/_bordered-button.scss +30 -0
  200. package/scss/components/_bordered-prominent-button.scss +27 -0
  201. package/scss/components/_borderless-button.scss +27 -0
  202. package/scss/components/_components.scss +76 -0
  203. package/scss/components/_confirmation-dialog.scss +110 -0
  204. package/scss/components/_content-unavailable-view.scss +45 -0
  205. package/scss/components/_date-picker.scss +30 -0
  206. package/scss/components/_detail-placeholder.scss +153 -0
  207. package/scss/components/_disclosure-group.scss +128 -0
  208. package/scss/components/_form-view.scss +195 -0
  209. package/scss/components/_full-screen.scss +15 -0
  210. package/scss/components/_glass-button.scss +32 -0
  211. package/scss/components/_glass-prominent-button.scss +32 -0
  212. package/scss/components/_h-divider.scss +13 -0
  213. package/scss/components/_h-flex-stack.scss +23 -0
  214. package/scss/components/_h-stack.scss +39 -0
  215. package/scss/components/_index.scss +245 -0
  216. package/scss/components/_label-view.scss +393 -0
  217. package/scss/components/_labeled-content.scss +9 -0
  218. package/scss/components/_list-view.scss +229 -0
  219. package/scss/components/_menu-view.scss +188 -0
  220. package/scss/components/_navigation-large-title.scss +27 -0
  221. package/scss/components/_navigation-split-view.scss +424 -0
  222. package/scss/components/_navigation-stack.scss +11 -0
  223. package/scss/components/_navigation-title.scss +10 -0
  224. package/scss/components/_picker-view.scss +122 -0
  225. package/scss/components/_plain-button.scss +18 -0
  226. package/scss/components/_scroll-view-proxy.scss +79 -0
  227. package/scss/components/_scroll-view-toolbars.scss +126 -0
  228. package/scss/components/_scroll-view.scss +130 -0
  229. package/scss/components/_section-view.scss +119 -0
  230. package/scss/components/_sheet-view.scss +92 -0
  231. package/scss/components/_sidebar-toggle.scss +121 -0
  232. package/scss/components/_sidebar-view.scss +53 -0
  233. package/scss/components/_sticky-container.scss +42 -0
  234. package/scss/components/_tab-bar.scss +255 -0
  235. package/scss/components/_tab-item.scss +25 -0
  236. package/scss/components/_tab-view.scss +312 -0
  237. package/scss/components/_table-column.scss +52 -0
  238. package/scss/components/_table-row.scss +172 -0
  239. package/scss/components/_table-view.scss +223 -0
  240. package/scss/components/_text-field.scss +37 -0
  241. package/scss/components/_tool-bar-item-group.scss +48 -0
  242. package/scss/components/_tool-bar-item.scss +145 -0
  243. package/scss/components/_tool-bar.scss +128 -0
  244. package/scss/components/_v-divider.scss +13 -0
  245. package/scss/components/_v-flex-stack.scss +29 -0
  246. package/scss/components/_v-keyboard.scss +14 -0
  247. package/scss/components/_v-stack.scss +35 -0
  248. package/scss/final/_touch-glass.scss +84 -0
  249. package/scss/index.scss +15 -6
  250. package/scss/mixins/_dialog.scss +89 -0
  251. package/scss/mixins/_index.scss +405 -0
  252. package/scss/placeholders/_buttons.scss +83 -0
  253. package/scss/placeholders/_lists.scss +561 -0
  254. package/scss/transitions/_bwd.navbar.scss +19 -0
  255. package/scss/transitions/_bwd.scss +39 -0
  256. package/scss/transitions/_confirmation-dialog.scss +19 -0
  257. package/scss/transitions/_dialog.scss +28 -0
  258. package/scss/transitions/_disclosure-group.scss +35 -0
  259. package/scss/transitions/_fwd.navbar.scss +41 -0
  260. package/scss/transitions/_fwd.scss +24 -0
  261. package/scss/transitions/_glass-button.scss +12 -0
  262. package/scss/transitions/_glass-prominent-button.scss +12 -0
  263. package/scss/transitions/_index.scss +74 -0
  264. package/scss/transitions/_menu-view.scss +26 -0
  265. package/scss/transitions/_navigation-split-view.scss +23 -0
  266. package/scss/transitions/_sidebar-view.scss +36 -0
  267. package/scss/transitions/_tab-bar.scss +19 -0
  268. package/scss/utils/_frame.scss +84 -0
  269. package/scss/utils/_index.scss +68 -0
  270. package/scss/utils/_scroll-view.scss +14 -0
  271. package/scss/utils/_spacing.scss +25 -0
  272. package/scss/utils/_stacks.scss +247 -0
  273. package/web-components.html-data/en.json +346 -0
  274. package/generated/internal/snapshot.d.ts +0 -5
  275. package/generated/internal/snapshot.js +0 -23
  276. package/generated/styles.css +0 -8
  277. package/scss/_reboot.scss +0 -11
@@ -0,0 +1,123 @@
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 {
6
+ constructor() {
7
+ super();
8
+ }
9
+ static polyfillDisconnectedCallback(btn) {
10
+ console.debug(`${TabItem.name} ⚡️ disconnect`);
11
+ CleanupRegistry.unregister(btn);
12
+ }
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
+ });
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
+ const tv = btn?.closest('tab-view');
45
+ if (!tv)
46
+ return;
47
+ // if (evt.detail?.tag !== btn.value) return
48
+ // await Snapshot.waitReady
49
+ const isSelected = tv.selectedTab.map(({ id }) => id).includes(btn.value); //'tabreveal' === evt?.type
50
+ if (`${isSelected}` !== btn.ariaSelected)
51
+ btn.ariaSelected = `${isSelected}`;
52
+ if (!isSelected)
53
+ return;
54
+ setTimeout(() => {
55
+ if (btn.ariaSelected !== 'true' || !btn.isConnected)
56
+ return;
57
+ btn.scrollIntoView({
58
+ behavior: self.matchMedia('(prefers-reduced-motion: no-preference)').matches ? 'smooth' : 'instant',
59
+ block: 'nearest',
60
+ inline: 'nearest',
61
+ });
62
+ }, 100);
63
+ };
64
+ static #handleClick = async (evt) => {
65
+ console.debug(`${TabItem.name} ⚡️ ${evt?.type}`);
66
+ const btn = evt.currentTarget;
67
+ // const tag = btn.getAttribute('value')
68
+ // if (!tag) return // sidebartoggle > tab-item //throw new DOMException(`Attribute "tag" is set but invalid`, 'InvalidStateError')
69
+ const tv = btn.closest('tab-view');
70
+ if (!tv)
71
+ throw new Error('TabView not found');
72
+ const newTab = tv?.querySelector(`#${btn.getAttribute('value')}`);
73
+ if (!newTab)
74
+ return;
75
+ // console.log(99, TabView.gatherTab(newTab))
76
+ // const possibleParentNs = newTab?.parentElement?.closest<NavigationStack | NavigationSplitView>('navigation-stack,navigation-split-view')
77
+ const tabs = TabView.gatherTab(newTab); //[possibleParentNs, newTab].filter(Boolean) as (NavigationStack | NavigationSplitView)[]
78
+ // if (possibleParentNs) tabs.unshift(possibleParentNs)
79
+ // SECTION: before submitting new tabs, check for tabroot
80
+ // iphone cases:
81
+ // current -> new
82
+ // ns1 -> ns1 tabroot💡ns1 1 1 === ===
83
+ // more -> more tabroot💡more 1 1 === ===
84
+ // ns1 -> more tabroot💡more 1 1 !== ->
85
+ // more,settings -> more tabroot💡more 2 1 !== ↖
86
+ // more,settings -> ns1 2 1 !== <-
87
+ // ns1 -> more tabroot💡more 1 1 !== ->
88
+ // ipad cases:
89
+ // ns1 -> ns1 tabroot💡ns1 1 1 === ===
90
+ // more,settings -> more,settings tabroot💡settings 2 2 === ===
91
+ // more,settings -> more,ns3 2 2 !== <->
92
+ // more,ns3 -> more,settings 2 2 !== <->
93
+ // ns1 -> more,settings 1 2 !== ↘
94
+ const seed1 = tv.selectedTab.map((item) => item.id).join(','), seed2 = tabs.map((item) => item.id).join(',');
95
+ const dir = tv.selectedTab.length < tabs.length
96
+ ? '↘'
97
+ : tv.selectedTab.length > tabs.length
98
+ ? tv.selectedTab.at(0) === tabs.at(0)
99
+ ? '↖'
100
+ : '<-'
101
+ : seed1 === seed2
102
+ ? '==='
103
+ : tv.moreTab === tabs.at(-1)
104
+ ? '->'
105
+ : '<->';
106
+ if (['===', '↖'].includes(dir)) {
107
+ for (const tab of tabs.reverse())
108
+ if (tv.selectedTab.includes(tab)) {
109
+ const eventType = 'tabroot';
110
+ console.debug(`${TabItem.name} 💡 ${eventType}`);
111
+ tab?.dispatchEvent(new CustomEvent(eventType, { bubbles: true, composed: true }));
112
+ return; // skip rest no selection!
113
+ }
114
+ }
115
+ else if ('->' === dir) {
116
+ const eventType = 'tabroot';
117
+ console.debug(`${TabItem.name} 💡 ${eventType}`);
118
+ tabs.at(0)?.dispatchEvent(new CustomEvent(eventType, { bubbles: true, composed: true }));
119
+ }
120
+ // SECTION: finally, submit new tabs
121
+ tv.selectedTab = tabs;
122
+ };
123
+ }
@@ -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,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
+ */
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
+ console.debug(`${_a.name} ⚡️ disconnect`);
29
+ this.#afterTabRevealDelay.cancel();
30
+ this.#cssStyleObserver?.disconnect();
31
+ CleanupRegistry.unregister(this);
32
+ }
33
+ get tabBarPlacement() {
34
+ return this.#cachedAdaptableTabBarPlacement;
35
+ }
36
+ get moreTab() {
37
+ return this.querySelector(':scope>navigation-stack:has(> navigation-stack,> navigation-split-view)');
38
+ }
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)
85
+ return;
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
+ }
176
+ }
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])')];
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
+ };
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
+ }
@@ -0,0 +1,175 @@
1
+ var _a;
2
+ import { CleanupRegistry } from '../internal/class/cleanup-registry';
3
+ import { CSSStyleObserver } from '../internal/class/css-style-observer';
4
+ import { MutationObserverSingleton } from '../internal/class/mutation-observer-singleton';
5
+ import { $, listActive, onoff } from '../internal/utils';
6
+ import { Snapshot } from '../snapshot';
7
+ const observers = new MutationObserverSingleton();
8
+ export class TableView extends HTMLElement {
9
+ #styleObserver;
10
+ #compactToolbarItem;
11
+ #trackedElements = new Set();
12
+ static #template;
13
+ static get template() {
14
+ return (this.#template ??= $(String.raw `
15
+ <div part="root table-container">
16
+ <div part="root table-header-stack">
17
+ <div part="root table-header-leading-stack">
18
+ <slot name="header-leading"></slot>
19
+ </div>
20
+ <div part="root table-header-principal-stack">
21
+ <slot name="header-principal"></slot>
22
+ </div>
23
+ <div part="root table-header-trailing-stack">
24
+ <slot name="header-trailing"></slot>
25
+ </div>
26
+ </div>
27
+ <div part="root table-column-stack">
28
+ <slot name="column"></slot>
29
+ </div>
30
+ <slot><p>empty</p></slot>
31
+ <div part="root table-footer-stack">
32
+ <div part="root table-footer-leading-stack">
33
+ <slot name="footer-leading"></slot>
34
+ </div>
35
+ <div part="root table-footer-principal-stack">
36
+ <slot name="footer-principal"></slot>
37
+ </div>
38
+ <div part="root table-footer-trailing-stack">
39
+ <slot name="footer-trailing"></slot>
40
+ </div>
41
+ </div>
42
+ </div>`, ''));
43
+ }
44
+ #shadowRoot;
45
+ #colSlot;
46
+ // #slot?: HTMLSlotElement
47
+ constructor() {
48
+ super();
49
+ this.#shadowRoot = this.attachShadow({ mode: 'closed' });
50
+ this.#shadowRoot.appendChild(document.importNode(this.constructor.template, true));
51
+ this.#colSlot = this.#shadowRoot.querySelector('slot[name=column]') ?? undefined;
52
+ // this.#slot = this.#shadowRoot.querySelector<HTMLSlotElement>('slot:not([name])') ?? undefined
53
+ this.#colSlot?.addEventListener('slotchange', this.#handleSlotchange);
54
+ // this.append(
55
+ // document.createRange().createContextualFragment(`<menu-view slot="header-trailing">
56
+ // <label-view slot="label" title="Delete"></label-view>
57
+ // <button type="button" tabindex="0">
58
+ // <label-view system-image="dots-three" title="Scan Documents"></label-view>
59
+ // </button>
60
+ // <button type="button" tabindex="0">
61
+ // <label-view system-image="dots-three" title="Connect to Server"></label-view>
62
+ // </button>
63
+ // <button type="button" tabindex="0">
64
+ // <label-view title="Edit Sidebar"></label-view>
65
+ // </button>
66
+ // </menu-view>
67
+ // `)
68
+ // $(`<menu-view slot="header-trailing">
69
+ // <label-view slot="label" title="Delete"></label-view>
70
+ // <button type="button" tabindex="0">
71
+ // <label-view system-image="dots-three" title="Scan Documents"></label-view>
72
+ // </button>
73
+ // <button type="button" tabindex="0">
74
+ // <label-view system-image="dots-three" title="Connect to Server"></label-view>
75
+ // </button>
76
+ // <button type="button" tabindex="0">
77
+ // <label-view title="Edit Sidebar"></label-view>
78
+ // </button>
79
+ // </menu-view>
80
+ // <div slot="footer-leading">22</div>
81
+ // <div slot="footer-trailing"><button>&lt;</button> <button>&gt;</button></div>`)
82
+ // )
83
+ }
84
+ disconnectedCallback() {
85
+ console.debug(`${_a.name} ⚡️ disconnect`);
86
+ CleanupRegistry.unregister(this);
87
+ this.#styleObserver?.disconnect();
88
+ observers.clearObservationsSet(this.#trackedElements);
89
+ this.#compactToolbarItem = undefined;
90
+ }
91
+ connectedCallback() {
92
+ console.debug(`${_a.name} ⚡️ connect`);
93
+ CleanupRegistry.register(this, onoff(listActive(this), this).on());
94
+ // console.log(999, this.#shadowRoot.querySelector('[part*=table-column-stack]'))
95
+ this.#styleObserver = new CSSStyleObserver({
96
+ properties: ['--adaptable-table-style-index'],
97
+ });
98
+ const target = this.#shadowRoot.querySelector('[part*=table-container]') ?? undefined;
99
+ if (!target)
100
+ return;
101
+ this.#styleObserver.observe(target, this.#handleStyleChange);
102
+ Snapshot.waitReady.then(() => self.requestAnimationFrame(this.#handleStyleChange));
103
+ }
104
+ #handleSlotchange = (evt) => {
105
+ console.debug(`${_a.name} ⚡️ ${evt?.type}`);
106
+ const slot = evt.target, assigned = slot.assignedElements({ flatten: true });
107
+ observers.syncObservations(this.#trackedElements, assigned, this.#handleTagMutation);
108
+ if (0 < assigned.length)
109
+ this.#handleTagMutation();
110
+ };
111
+ #handleTagMutation = (entry) => {
112
+ console.debug(`${_a.name} ⚡️ mutation`);
113
+ // const sourceSlot = 0 < (this.#colSlot?.assignedElements({ flatten: true }) ?? []).length ? this.#colSlot : this.#colSlot
114
+ // const menu = this.querySelector(':scope>menu-view:not([slot])') ?? this.appendChild($(`<menu-view></menu-view>`))
115
+ // menu.innerHTML = `<label-view slot="label" system-image="dots-three" title="rtyty"></label-view>`
116
+ // for (const el of sourceSlot?.assignedElements({ flatten: true }) ?? []) menu.insertAdjacentElement('beforeend', TableView.wrapTag(el, sourceSlot?.name))
117
+ //
118
+ if (!this.#compactToolbarItem) {
119
+ this.#compactToolbarItem = $(`<menu-view tabindex="0" slot="header-trailing"></menu-view>`);
120
+ CleanupRegistry.unregister(this, 'compact_toolbar');
121
+ CleanupRegistry.register(this, onoff('click', this.#handleMenuClick, this.#compactToolbarItem).on(), 'compact_toolbar');
122
+ }
123
+ this.#compactToolbarItem.innerHTML = `<label-view slot="label" system-image="dots-three"></label-view>`;
124
+ for (const node of this.#colSlot?.assignedElements({ flatten: true }) ?? []) {
125
+ if (!node.matches('[is=table-column]'))
126
+ continue;
127
+ const btn = $(`<button type="button" tabindex="0">
128
+ <v-stack spacing="0" alignment="leading">
129
+ <label-view></label-view>
130
+ <label-view font="callout" foreground="secondary"></label-view>
131
+ </v-stack>
132
+ </button>`), title = btn.querySelector('label-view:first-child'), subTitle = btn.querySelector('label-view:last-child');
133
+ title?.setAttribute('title', node.textContent.trim());
134
+ subTitle?.setAttribute('title', node.ariaSort ?? '');
135
+ this.#compactToolbarItem.appendChild(btn);
136
+ }
137
+ // const wasConnected = this.#compactToolbarItem?.isConnected
138
+ // this.#compactToolbarItem?.removeEventListener('click', this.#handleMenuClick)
139
+ // this.#compactToolbarItem?.remove()
140
+ // this.#compactToolbarItem = menu
141
+ // this.#compactToolbarItem?.addEventListener('click', this.#handleMenuClick)
142
+ // if (wasConnected) this.insertAdjacentElement('beforeend', this.#compactToolbarItem)
143
+ };
144
+ #handleStyleChange = () => {
145
+ console.debug(`${_a.name} ⚡️ style`);
146
+ const target = this.#shadowRoot.querySelector('[part*=table-container]') ?? undefined;
147
+ if (!target)
148
+ return;
149
+ const style = self.getComputedStyle(target);
150
+ const adaptableTableStyle = style.getPropertyValue('--adaptable-table-style') || 'compact';
151
+ switch (adaptableTableStyle) {
152
+ case 'expanded':
153
+ if (!this.#compactToolbarItem?.isConnected)
154
+ break;
155
+ this.#compactToolbarItem?.remove();
156
+ break;
157
+ default:
158
+ if (!this.#compactToolbarItem)
159
+ break;
160
+ if (this.#compactToolbarItem?.isConnected)
161
+ break;
162
+ this.insertAdjacentElement('beforeend', this.#compactToolbarItem);
163
+ break;
164
+ }
165
+ };
166
+ #handleMenuClick = (evt) => {
167
+ const btn = evt.target.closest('button');
168
+ if (!btn)
169
+ return;
170
+ const siblings = [...(btn.parentNode?.querySelectorAll(':scope>button') ?? [])];
171
+ const index = siblings.indexOf(btn);
172
+ this.querySelector(`:scope>[slot=column]:nth-of-type(${index + 1})`)?.click();
173
+ };
174
+ }
175
+ _a = TableView;
@@ -0,0 +1,29 @@
1
+ import { FormAssociatedBase } from '../internal/class/form-associated-base';
2
+ declare const keyboardTypes: readonly ["decimal-pad", "number-pad", "default"];
3
+ export type KeyboardType = (typeof keyboardTypes)[number];
4
+ /**
5
+ * @slot label
6
+ * @slot validity-options
7
+ */
8
+ export declare class TextField extends FormAssociatedBase {
9
+ #private;
10
+ static get observedAttributes(): string[];
11
+ static get template(): DocumentFragment;
12
+ constructor();
13
+ connectedCallback(): void;
14
+ disconnectedCallback(): void;
15
+ attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null): void;
16
+ get keyboardType(): KeyboardType;
17
+ get text(): string;
18
+ set text(v: string);
19
+ get name(): string;
20
+ get value(): string;
21
+ get valueAsNumber(): number | "";
22
+ get negativeNumbersAllowed(): boolean;
23
+ setValidity: (flags?: ValidityStateFlags, message?: string, anchor?: HTMLElement) => void;
24
+ setCustomValidity: (message: string) => void;
25
+ formAssociatedCallback: (form: HTMLFormElement) => void;
26
+ formDisabledCallback: (disabled: boolean) => void;
27
+ formResetCallback: () => void;
28
+ }
29
+ export {};