@swiftwc/ui 0.0.0-dev.3 → 0.0.0-dev.31

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 (302) 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 +31 -2
  11. package/generated/client/index.js +415 -8
  12. package/generated/components/alert-dialog.d.ts +8 -0
  13. package/generated/components/alert-dialog.js +94 -0
  14. package/generated/components/body-view.d.ts +5 -0
  15. package/generated/components/body-view.js +11 -0
  16. package/generated/components/bordered-button.d.ts +13 -0
  17. package/generated/components/bordered-button.js +42 -0
  18. package/generated/components/bordered-prominent-button.d.ts +13 -0
  19. package/generated/components/bordered-prominent-button.js +42 -0
  20. package/generated/components/borderless-button.d.ts +13 -0
  21. package/generated/components/borderless-button.js +42 -0
  22. package/generated/components/confirmation-dialog.d.ts +9 -0
  23. package/generated/components/confirmation-dialog.js +108 -0
  24. package/generated/components/content-unavailable-view.d.ts +24 -0
  25. package/generated/components/content-unavailable-view.js +78 -0
  26. package/generated/components/date-picker.d.ts +46 -0
  27. package/generated/components/date-picker.js +442 -0
  28. package/generated/components/disclosure-group.d.ts +9 -0
  29. package/generated/components/disclosure-group.js +54 -0
  30. package/generated/components/fine-tooltip.d.ts +7 -0
  31. package/generated/components/fine-tooltip.js +104 -0
  32. package/generated/components/form-view.d.ts +6 -0
  33. package/generated/components/form-view.js +58 -0
  34. package/generated/components/glass-button.d.ts +12 -0
  35. package/generated/components/glass-button.js +39 -0
  36. package/generated/components/glass-prominent-button.d.ts +12 -0
  37. package/generated/components/glass-prominent-button.js +39 -0
  38. package/generated/components/index.d.ts +41 -1
  39. package/generated/components/index.js +41 -6
  40. package/generated/components/label-view.d.ts +9 -0
  41. package/generated/components/label-view.js +56 -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 +138 -0
  46. package/generated/components/navigation-large-title.d.ts +6 -0
  47. package/generated/components/navigation-large-title.js +177 -0
  48. package/generated/components/navigation-split-view.d.ts +10 -0
  49. package/generated/components/navigation-split-view.js +21 -0
  50. package/generated/components/navigation-stack.d.ts +10 -0
  51. package/generated/components/navigation-stack.js +27 -0
  52. package/generated/components/navigation-title.d.ts +8 -0
  53. package/generated/components/navigation-title.js +49 -0
  54. package/generated/components/picker-view.d.ts +27 -0
  55. package/generated/components/picker-view.js +452 -0
  56. package/generated/components/plain-button.d.ts +7 -0
  57. package/generated/components/plain-button.js +20 -0
  58. package/generated/components/progress-view.d.ts +13 -0
  59. package/generated/components/progress-view.js +122 -0
  60. package/generated/components/screen-view.d.ts +5 -0
  61. package/generated/components/screen-view.js +9 -0
  62. package/generated/components/scroll-view-proxy.d.ts +8 -0
  63. package/generated/components/scroll-view-proxy.js +14 -0
  64. package/generated/components/scroll-view.d.ts +10 -0
  65. package/generated/components/scroll-view.js +197 -0
  66. package/generated/components/section-view.d.ts +9 -0
  67. package/generated/components/section-view.js +81 -0
  68. package/generated/components/sheet-view.d.ts +8 -0
  69. package/generated/components/sheet-view.js +85 -0
  70. package/generated/components/sidebar-toggle.d.ts +7 -0
  71. package/generated/components/sidebar-toggle.js +82 -0
  72. package/generated/components/sidebar-view.d.ts +7 -0
  73. package/generated/components/sidebar-view.js +35 -0
  74. package/generated/components/sticky-container.d.ts +6 -0
  75. package/generated/components/sticky-container.js +24 -0
  76. package/generated/components/tab-bar.d.ts +10 -0
  77. package/generated/components/tab-bar.js +42 -0
  78. package/generated/components/tab-item.d.ts +7 -0
  79. package/generated/components/tab-item.js +125 -0
  80. package/generated/components/tab-view.d.ts +22 -0
  81. package/generated/components/tab-view.js +259 -0
  82. package/generated/components/table-view.d.ts +7 -0
  83. package/generated/components/table-view.js +187 -0
  84. package/generated/components/text-field.d.ts +29 -0
  85. package/generated/components/text-field.js +478 -0
  86. package/generated/components/tool-bar-item-group.d.ts +5 -0
  87. package/generated/components/tool-bar-item-group.js +28 -0
  88. package/generated/components/tool-bar-item.d.ts +7 -0
  89. package/generated/components/tool-bar-item.js +53 -0
  90. package/generated/components/tool-bar.d.ts +19 -0
  91. package/generated/components/tool-bar.js +90 -0
  92. package/generated/components/v-keyboard.d.ts +11 -0
  93. package/generated/components/v-keyboard.js +81 -0
  94. package/generated/components/v-stack.d.ts +10 -0
  95. package/generated/components/v-stack.js +16 -0
  96. package/generated/css/index.css +8067 -0
  97. package/generated/events/alert-dialog.d.ts +8 -0
  98. package/generated/events/alert-dialog.js +1 -0
  99. package/generated/events/confirmation-dialog.d.ts +9 -0
  100. package/generated/events/confirmation-dialog.js +1 -0
  101. package/generated/events/date-picker.d.ts +8 -0
  102. package/generated/events/date-picker.js +1 -0
  103. package/generated/events/index.d.ts +8 -0
  104. package/generated/events/index.js +8 -0
  105. package/generated/events/lifecycle-observer.d.ts +10 -0
  106. package/generated/events/lifecycle-observer.js +1 -0
  107. package/generated/events/picker-view.d.ts +8 -0
  108. package/generated/events/picker-view.js +1 -0
  109. package/generated/events/scroll-view.d.ts +10 -0
  110. package/generated/events/scroll-view.js +1 -0
  111. package/generated/events/tab-view.d.ts +28 -0
  112. package/generated/events/tab-view.js +1 -0
  113. package/generated/events/text-field.d.ts +8 -0
  114. package/generated/events/text-field.js +1 -0
  115. package/generated/i18n/index.d.ts +34 -0
  116. package/generated/i18n/index.js +167 -0
  117. package/generated/i18n/locales/el.d.ts +15 -0
  118. package/generated/i18n/locales/el.js +15 -0
  119. package/generated/i18n/locales/en.d.ts +15 -0
  120. package/generated/i18n/locales/en.js +15 -0
  121. package/generated/i18n/locales/index.d.ts +4 -0
  122. package/generated/i18n/locales/index.js +4 -0
  123. package/generated/index.js +1 -1
  124. package/generated/internal/class/cleanup-registry.d.ts +5 -0
  125. package/generated/internal/class/cleanup-registry.js +38 -0
  126. package/generated/internal/class/css-style-observer.d.ts +8 -0
  127. package/generated/internal/class/css-style-observer.js +25 -0
  128. package/generated/internal/class/form-associated-base.d.ts +20 -0
  129. package/generated/internal/class/form-associated-base.js +96 -0
  130. package/generated/internal/class/mutation-observer-singleton.d.ts +10 -0
  131. package/generated/internal/class/mutation-observer-singleton.js +46 -0
  132. package/generated/internal/class/navigation-path.d.ts +15 -0
  133. package/generated/internal/class/navigation-path.js +84 -0
  134. package/generated/internal/class/navigation-view.d.ts +8 -0
  135. package/generated/internal/class/navigation-view.js +77 -0
  136. package/generated/internal/class/resize-observer-singleton.d.ts +7 -0
  137. package/generated/internal/class/resize-observer-singleton.js +22 -0
  138. package/generated/internal/decorators/custom-element.d.ts +5 -0
  139. package/generated/internal/decorators/custom-element.js +4 -0
  140. package/generated/internal/privateNamespace.d.ts +4 -0
  141. package/generated/internal/privateNamespace.js +1 -0
  142. package/generated/internal/utils/add.d.ts +1 -0
  143. package/generated/internal/utils/add.js +7 -0
  144. package/generated/internal/utils/button-role.d.ts +1 -0
  145. package/generated/internal/utils/button-role.js +59 -0
  146. package/generated/internal/utils/cash/ancestors.d.ts +1 -0
  147. package/generated/internal/utils/cash/ancestors.js +27 -0
  148. package/generated/internal/utils/cash/index.d.ts +23 -0
  149. package/generated/internal/utils/cash/index.js +25 -0
  150. package/generated/internal/utils/cash/next-all.d.ts +1 -0
  151. package/generated/internal/utils/cash/next-all.js +10 -0
  152. package/generated/internal/utils/cash/next.d.ts +1 -0
  153. package/generated/internal/utils/cash/next.js +9 -0
  154. package/generated/internal/utils/cash/prev-all.d.ts +1 -0
  155. package/generated/internal/utils/cash/prev-all.js +10 -0
  156. package/generated/internal/utils/cash/prev.d.ts +1 -0
  157. package/generated/internal/utils/cash/prev.js +9 -0
  158. package/generated/internal/utils/cash/prop.d.ts +18 -0
  159. package/generated/internal/utils/cash/prop.js +30 -0
  160. package/generated/internal/utils/cash/siblings.d.ts +1 -0
  161. package/generated/internal/utils/cash/siblings.js +10 -0
  162. package/generated/internal/utils/clamp.d.ts +1 -0
  163. package/generated/internal/utils/clamp.js +4 -0
  164. package/generated/internal/utils/compare-big-decimals.d.ts +1 -0
  165. package/generated/internal/utils/compare-big-decimals.js +90 -0
  166. package/generated/internal/utils/css-time.d.ts +1 -0
  167. package/generated/internal/utils/css-time.js +3 -0
  168. package/generated/internal/utils/debounce.d.ts +1 -0
  169. package/generated/internal/utils/debounce.js +13 -0
  170. package/generated/internal/utils/frame.d.ts +1 -0
  171. package/generated/internal/utils/frame.js +6 -0
  172. package/generated/internal/utils/index.d.ts +19 -1
  173. package/generated/internal/utils/index.js +20 -1
  174. package/generated/internal/utils/is-inside.d.ts +1 -0
  175. package/generated/internal/utils/is-inside.js +4 -0
  176. package/generated/internal/utils/kebab-case.d.ts +1 -1
  177. package/generated/internal/utils/kebab-case.js +3 -3
  178. package/generated/internal/utils/list-active.d.ts +7 -0
  179. package/generated/internal/utils/list-active.js +83 -0
  180. package/generated/internal/utils/microtask.d.ts +1 -0
  181. package/generated/internal/utils/microtask.js +3 -0
  182. package/generated/internal/utils/onoff.d.ts +45 -0
  183. package/generated/internal/utils/onoff.js +31 -0
  184. package/generated/internal/utils/set.d.ts +1 -0
  185. package/generated/internal/utils/set.js +7 -0
  186. package/generated/internal/utils/sleep.d.ts +1 -0
  187. package/generated/internal/utils/sleep.js +3 -0
  188. package/generated/internal/utils/slow-hide-show.d.ts +1 -0
  189. package/generated/internal/utils/slow-hide-show.js +16 -0
  190. package/generated/internal/utils/timeout.d.ts +5 -0
  191. package/generated/internal/utils/timeout.js +16 -0
  192. package/generated/internal/utils/touch-glass.d.ts +7 -0
  193. package/generated/internal/utils/touch-glass.js +19 -0
  194. package/generated/namespace-browser/base.d.ts +36 -0
  195. package/generated/namespace-browser/base.js +92 -0
  196. package/generated/namespace-browser/index.d.ts +7 -0
  197. package/generated/namespace-browser/index.js +1 -0
  198. package/generated/snapshot/index.d.ts +9 -0
  199. package/generated/snapshot/index.js +58 -0
  200. package/package.json +36 -9
  201. package/scss/_base.scss +5 -0
  202. package/scss/_components.scss +82 -0
  203. package/scss/_final.scss +1 -0
  204. package/scss/_functions.scss +31 -0
  205. package/scss/_mixins.scss +7 -0
  206. package/scss/_placeholders.scss +3 -0
  207. package/scss/_transitions.scss +32 -0
  208. package/scss/_utils.scss +9 -0
  209. package/scss/_vars.scss +179 -3
  210. package/scss/base/_layout.scss +56 -0
  211. package/scss/base/_reboot.scss +191 -0
  212. package/scss/base/_root.scss +397 -0
  213. package/scss/colors/_index.scss +704 -0
  214. package/scss/components/_alert-dialog.scss +111 -0
  215. package/scss/components/_body-view.scss +17 -0
  216. package/scss/components/_bordered-button.scss +57 -0
  217. package/scss/components/_bordered-prominent-button.scss +63 -0
  218. package/scss/components/_borderless-button.scss +44 -0
  219. package/scss/components/_confirmation-dialog.scss +117 -0
  220. package/scss/components/_content-unavailable-view.scss +45 -0
  221. package/scss/components/_date-picker.scss +30 -0
  222. package/scss/components/_detail-placeholder.scss +153 -0
  223. package/scss/components/_disclosure-group.scss +175 -0
  224. package/scss/components/_fine-tooltip.scss +82 -0
  225. package/scss/components/_form-view.scss +195 -0
  226. package/scss/components/_full-screen.scss +15 -0
  227. package/scss/components/_glass-button.scss +59 -0
  228. package/scss/components/_glass-prominent-button.scss +68 -0
  229. package/scss/components/_h-divider.scss +13 -0
  230. package/scss/components/_h-flex-stack.scss +23 -0
  231. package/scss/components/_h-stack.scss +29 -0
  232. package/scss/components/_index.scss +249 -0
  233. package/scss/components/_label-view copy.scss.txt +420 -0
  234. package/scss/components/_label-view.scss +355 -0
  235. package/scss/components/_label-view.scss.txt +536 -0
  236. package/scss/components/_labeled-content.scss +9 -0
  237. package/scss/components/_list-view.scss +229 -0
  238. package/scss/components/_menu-view.scss +205 -0
  239. package/scss/components/_navigation-large-title.scss +27 -0
  240. package/scss/components/_navigation-split-view.scss +424 -0
  241. package/scss/components/_navigation-stack.scss +11 -0
  242. package/scss/components/_navigation-title.scss +10 -0
  243. package/scss/components/_picker-view.scss +122 -0
  244. package/scss/components/_plain-button.scss +18 -0
  245. package/scss/components/_progress-view.scss +98 -0
  246. package/scss/components/_scroll-view-proxy.scss +79 -0
  247. package/scss/components/_scroll-view-toolbars.scss +126 -0
  248. package/scss/components/_scroll-view.scss +130 -0
  249. package/scss/components/_section-view.scss +119 -0
  250. package/scss/components/_sheet-view.scss +102 -0
  251. package/scss/components/_sidebar-toggle.scss +121 -0
  252. package/scss/components/_sidebar-view.scss +53 -0
  253. package/scss/components/_sticky-container.scss +42 -0
  254. package/scss/components/_tab-bar.scss +260 -0
  255. package/scss/components/_tab-item.scss +25 -0
  256. package/scss/components/_tab-view.scss +312 -0
  257. package/scss/components/_table-column.scss +52 -0
  258. package/scss/components/_table-row.scss +172 -0
  259. package/scss/components/_table-view.scss +223 -0
  260. package/scss/components/_text-field.scss +37 -0
  261. package/scss/components/_tool-bar-item-group.scss +48 -0
  262. package/scss/components/_tool-bar-item.scss +97 -0
  263. package/scss/components/_tool-bar.scss +153 -0
  264. package/scss/components/_v-divider.scss +13 -0
  265. package/scss/components/_v-flex-stack.scss +29 -0
  266. package/scss/components/_v-keyboard.scss +14 -0
  267. package/scss/components/_v-stack.scss +25 -0
  268. package/scss/final/_touch-glass.scss +91 -0
  269. package/scss/index.scss +15 -6
  270. package/scss/mixins/_button.scss +44 -0
  271. package/scss/mixins/_color.scss +16 -0
  272. package/scss/mixins/_dialog.scss +89 -0
  273. package/scss/mixins/_index.scss +422 -0
  274. package/scss/placeholders/_buttons.scss +117 -0
  275. package/scss/placeholders/_lists.scss +561 -0
  276. package/scss/transitions/_alert-dialog.scss +18 -0
  277. package/scss/transitions/_bwd.navbar.scss +19 -0
  278. package/scss/transitions/_bwd.scss +39 -0
  279. package/scss/transitions/_confirmation-dialog.scss +13 -0
  280. package/scss/transitions/_disclosure-group.scss +35 -0
  281. package/scss/transitions/_fine-tooltip.scss +21 -0
  282. package/scss/transitions/_fwd.navbar.scss +41 -0
  283. package/scss/transitions/_fwd.scss +24 -0
  284. package/scss/transitions/_glass-button.scss +12 -0
  285. package/scss/transitions/_glass-prominent-button.scss +12 -0
  286. package/scss/transitions/_index.scss +74 -0
  287. package/scss/transitions/_menu-view.scss +26 -0
  288. package/scss/transitions/_navigation-split-view.scss +23 -0
  289. package/scss/transitions/_progress-view.scss +23 -0
  290. package/scss/transitions/_sheet-view.scss +30 -0
  291. package/scss/transitions/_sidebar-view.scss +36 -0
  292. package/scss/transitions/_tab-bar.scss +20 -0
  293. package/scss/utils/_frame.scss +91 -0
  294. package/scss/utils/_index.scss +77 -0
  295. package/scss/utils/_scroll-view.scss +14 -0
  296. package/scss/utils/_spacing.scss +25 -0
  297. package/scss/utils/_stacks.scss +247 -0
  298. package/web-components.html-data/en.json +458 -0
  299. package/generated/internal/snapshot.d.ts +0 -5
  300. package/generated/internal/snapshot.js +0 -23
  301. package/generated/styles.css +0 -8
  302. package/scss/_reboot.scss +0 -11
@@ -0,0 +1,125 @@
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 instanceof HTMLElement && evt.currentTarget;
67
+ if (!btn)
68
+ return;
69
+ // const tag = btn.getAttribute('value')
70
+ // if (!tag) return // sidebartoggle > tab-item //throw new DOMException(`Attribute "tag" is set but invalid`, 'InvalidStateError')
71
+ const tv = btn.closest('tab-view');
72
+ if (!tv)
73
+ throw new Error('TabView not found');
74
+ const newTab = tv?.querySelector(`#${btn.getAttribute('value')}`);
75
+ if (!newTab)
76
+ return;
77
+ // console.log(99, TabView.gatherTab(newTab))
78
+ // const possibleParentNs = newTab?.parentElement?.closest<NavigationStack | NavigationSplitView>('navigation-stack,navigation-split-view')
79
+ const tabs = TabView.gatherTab(newTab); //[possibleParentNs, newTab].filter(Boolean) as (NavigationStack | NavigationSplitView)[]
80
+ // if (possibleParentNs) tabs.unshift(possibleParentNs)
81
+ // SECTION: before submitting new tabs, check for tabroot
82
+ // iphone cases:
83
+ // current -> new
84
+ // ns1 -> ns1 tabroot💡ns1 1 1 === ===
85
+ // more -> more tabroot💡more 1 1 === ===
86
+ // ns1 -> more tabroot💡more 1 1 !== ->
87
+ // more,settings -> more tabroot💡more 2 1 !== ↖
88
+ // more,settings -> ns1 2 1 !== <-
89
+ // ns1 -> more tabroot💡more 1 1 !== ->
90
+ // ipad cases:
91
+ // ns1 -> ns1 tabroot💡ns1 1 1 === ===
92
+ // more,settings -> more,settings tabroot💡settings 2 2 === ===
93
+ // more,settings -> more,ns3 2 2 !== <->
94
+ // more,ns3 -> more,settings 2 2 !== <->
95
+ // ns1 -> more,settings 1 2 !== ↘
96
+ const seed1 = tv.selectedTab.map((item) => item.id).join(','), seed2 = tabs.map((item) => item.id).join(',');
97
+ const dir = tv.selectedTab.length < tabs.length
98
+ ? '↘'
99
+ : tv.selectedTab.length > tabs.length
100
+ ? tv.selectedTab.at(0) === tabs.at(0)
101
+ ? '↖'
102
+ : '<-'
103
+ : seed1 === seed2
104
+ ? '==='
105
+ : tv.moreTab === tabs.at(-1)
106
+ ? '->'
107
+ : '<->';
108
+ if (['===', '↖'].includes(dir)) {
109
+ for (const tab of tabs.reverse())
110
+ if (tv.selectedTab.includes(tab)) {
111
+ const eventType = 'tabroot';
112
+ console.debug(`${TabItem.name} 💡 ${eventType}`);
113
+ tab?.dispatchEvent(new CustomEvent(eventType, { bubbles: true, composed: true }));
114
+ return; // skip rest no selection!
115
+ }
116
+ }
117
+ else if ('->' === dir) {
118
+ const eventType = 'tabroot';
119
+ console.debug(`${TabItem.name} 💡 ${eventType}`);
120
+ tabs.at(0)?.dispatchEvent(new CustomEvent(eventType, { bubbles: true, composed: true }));
121
+ }
122
+ // SECTION: finally, submit new tabs
123
+ tv.selectedTab = tabs;
124
+ };
125
+ }
@@ -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,259 @@
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 target = evt.target instanceof HTMLElement && evt.target;
77
+ if (!target)
78
+ return;
79
+ const summary = target.closest('summary');
80
+ if (!summary)
81
+ return;
82
+ if (0 === $.siblings('[aria-selected=true]', summary).length)
83
+ return;
84
+ if (!summary.closest('scroll-view')?.matches('tab-view > [is=sidebar-view] > scroll-view'))
85
+ return;
86
+ const form = summary.closest('[is=form-view]');
87
+ if (!form)
88
+ return;
89
+ const style = self.getComputedStyle(form);
90
+ if ('sidebar' !== style.getPropertyValue('--list-style'))
91
+ return;
92
+ this.#addAnimations(new CustomEvent('beforetabreveal', { detail: { tag: '', ms: cssTime(`${this.computedStyleMap().get(`--tabbar-after-tabreveal-duration`)}`) }, bubbles: true, composed: true }));
93
+ };
94
+ #handleTabViewPagereveal = (evt) => {
95
+ console.debug(`${_a.name} ⚡️ ${evt?.type}`);
96
+ void this.#syncBodyFace();
97
+ };
98
+ #handleStyleChange = () => {
99
+ console.debug(`${_a.name} ⚡️ style`);
100
+ const style = self.getComputedStyle(this);
101
+ const placement = style.getPropertyValue('--adaptable-tab-bar-placement'), // or do it manually without any computedstyle
102
+ newValue = TAB_BAR_PLACEMENTS.includes(placement) ? placement : 'bottom-bar';
103
+ if (newValue !== this.#cachedAdaptableTabBarPlacement) {
104
+ const oldValue = this.#cachedAdaptableTabBarPlacement;
105
+ this.#cachedAdaptableTabBarPlacement = newValue;
106
+ this.dispatchEvent(new CustomEvent('tab-view:adaptable-tab-bar-placement-change', {
107
+ detail: { oldValue, newValue },
108
+ bubbles: true,
109
+ composed: true,
110
+ }));
111
+ }
112
+ };
113
+ // #handleMediaChange: (evt: MediaQueryListEvent) => void = (evt) => {
114
+ // console.debug(`${TabView.name} ⚡️ ${evt?.type}`)
115
+ // if (!evt.matches) return
116
+ // this.#handleStyleChange()
117
+ // // if (evt.matches) {
118
+ // // const placement = self.getComputedStyle(this).getPropertyValue('--adaptable-tab-bar-placement'), // or do it manually without any computedstyle
119
+ // // newValue = (TAB_BAR_PLACEMENTS as readonly string[]).includes(placement) ? (placement as (typeof TAB_BAR_PLACEMENTS)[number]) : 'bottom-bar'
120
+ // // if (newValue !== this.#cachedAdaptableTabBarPlacement) {
121
+ // // const oldValue = this.#cachedAdaptableTabBarPlacement
122
+ // // this.#cachedAdaptableTabBarPlacement = newValue
123
+ // // this.dispatchEvent(
124
+ // // new CustomEvent<TabViewAdaptableTabBarPlacementDetail>('tab-view:adaptable-tab-bar-placement-change', {
125
+ // // detail: { oldValue, newValue },
126
+ // // bubbles: true,
127
+ // // composed: true,
128
+ // // })
129
+ // // )
130
+ // // }
131
+ // // }
132
+ // // // trigger more-stack (dis)allowed event
133
+ // // if (evt.matches !== this.#moreStackAllowed) {
134
+ // // this.#moreStackAllowed = evt.matches
135
+ // // const eventType = evt.matches ? 'tab-view:more-tab-allowed' : 'tab-view:more-tab-disallowed'
136
+ // // this.dispatchEvent(new CustomEvent<TabMoreStackAllowanceDetail>(eventType, { detail: { moreTab: this.moreTab }, bubbles: true, composed: true }))
137
+ // // }
138
+ // // if (evt.matches) return // no button triggers should happen, already on iphone portrait
139
+ // // const innerSelection = this.moreTab?.querySelector(':scope>navigation-stack:not([hidden]),:scope>navigation-split-view:not([hidden])')?.id
140
+ // // if (innerSelection) {
141
+ // // const btn = this.querySelector<HTMLButtonElement>(`[is="tab-item"][value="${CSS.escape(innerSelection)}"]`)
142
+ // // // NOTE: simulate btn click BU WITHOUT tabroot functionality!
143
+ // // if (btn) {
144
+ // // const newTab = this.querySelector<NavigationStack | NavigationSplitView>(`#${btn.getAttribute('value')}`)
145
+ // // if (newTab) {
146
+ // // this.selectedTab = TabView.gatherTab(newTab)
147
+ // // return
148
+ // // }
149
+ // // }
150
+ // // }
151
+ // // const outerSelection = this?.querySelector(':scope>navigation-stack:not([hidden]),:scope>navigation-split-view:not([hidden])')?.id
152
+ // // if (outerSelection && outerSelection === this.moreTab?.id) {
153
+ // // const btn = this.querySelector<HTMLButtonElement>(`[is="tab-item"]:not([value="${CSS.escape(outerSelection)}"])`)
154
+ // // // NOTE: simulate btn click BU WITHOUT tabroot functionality!
155
+ // // if (btn) {
156
+ // // const newTab = this.querySelector<NavigationStack | NavigationSplitView>(`#${btn.getAttribute('value')}`)
157
+ // // if (newTab) {
158
+ // // this.selectedTab = TabView.gatherTab(newTab)
159
+ // // return
160
+ // // }
161
+ // // }
162
+ // // }
163
+ // }
164
+ #handleAdaptableTabBarPlacementChange = (evt) => {
165
+ console.debug(`${_a.name} ⚡️ ${evt?.type}`);
166
+ if ('bottom-bar' !== evt.detail.oldValue)
167
+ return; // button triggers should happen, ONLY when going FROM bottom-bar TO anything else
168
+ const innerSelection = this.moreTab?.querySelector(':scope>navigation-stack:not([hidden]),:scope>navigation-split-view:not([hidden])')?.id;
169
+ if (innerSelection) {
170
+ const btn = this.querySelector(`[is="tab-item"][value="${CSS.escape(innerSelection)}"]`);
171
+ // NOTE: simulate btn click BU WITHOUT tabroot functionality!
172
+ if (btn) {
173
+ const newTab = this.querySelector(`#${btn.getAttribute('value')}`);
174
+ if (newTab) {
175
+ this.selectedTab = _a.gatherTab(newTab);
176
+ return;
177
+ }
178
+ }
179
+ }
180
+ const outerSelection = this?.querySelector(':scope>navigation-stack:not([hidden]),:scope>navigation-split-view:not([hidden])')?.id;
181
+ if (outerSelection && outerSelection === this.moreTab?.id) {
182
+ const btn = this.querySelector(`[is="tab-item"]:not([value="${CSS.escape(outerSelection)}"])`);
183
+ // NOTE: simulate btn click BU WITHOUT tabroot functionality!
184
+ if (btn) {
185
+ const newTab = this.querySelector(`#${btn.getAttribute('value')}`);
186
+ if (newTab) {
187
+ this.selectedTab = _a.gatherTab(newTab);
188
+ return;
189
+ }
190
+ }
191
+ }
192
+ };
193
+ get selectedTab() {
194
+ // return this.querySelector<NavigationStack | NavigationSplitView>(':scope>navigation-stack:not([hidden]),:scope>navigation-split-view:not([hidden])')
195
+ return [...this.querySelectorAll('navigation-stack:not([hidden]),navigation-split-view:not([hidden])')];
196
+ }
197
+ set selectedTab(tabs) {
198
+ const valid = [...tabs].every((el, i, arr) => !i || arr[i - 1].contains(el));
199
+ if (0 === tabs.length)
200
+ throw new Error('Element not found');
201
+ if (!valid)
202
+ throw new Error('selectedTab[] must be in order of parent>child. You provided an element that contains the previous sibling.');
203
+ //
204
+ const selectors = [':not(:is(:scope>{{tag}}))', ':is(:scope>{{tag}})']; // first nested ones, then root ones
205
+ const ms = cssTime(`${this.computedStyleMap().get(`--tabbar-after-tabreveal-duration`)}`);
206
+ for (const selector of selectors)
207
+ 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')}`)) {
208
+ if (!tabs.some((tab) => !ns.contains(tab)))
209
+ continue; // shouldRun
210
+ ns.dispatchEvent(new CustomEvent('beforetabswap', { detail: { tag: ns.id, ms }, bubbles: true, composed: true }));
211
+ ns.hidden = true; // triggers
212
+ }
213
+ for (const selector of selectors.reverse())
214
+ for (const ns of this.querySelectorAll(`navigation-stack[hidden]${selector.replace('{{tag}}', 'navigation-stack')},navigation-split-view[hidden]${selector.replace('{{tag}}', 'navigation-split-view')}`)) {
215
+ if (!tabs.some((tab) => ns.contains(tab)))
216
+ continue; // shouldRun
217
+ ns.dispatchEvent(new CustomEvent('beforetabreveal', { detail: { tag: ns.id, ms }, bubbles: true, composed: true }));
218
+ ns.hidden = false; // triggers
219
+ }
220
+ }
221
+ #addAnimations = (evt) => {
222
+ this.setAttribute('js-aftertabreveal', '');
223
+ // const ms = cssTime(`${this.computedStyleMap().get(`--tabbar-after-tabreveal-duration`)}`)
224
+ this.#afterTabRevealDelay.next(() => {
225
+ this.removeAttribute('js-aftertabreveal');
226
+ }, evt.detail.ms);
227
+ };
228
+ #handleSelectionChange = (evt) => {
229
+ this.#triggerToggleEvent(evt);
230
+ };
231
+ #triggerToggleEvent = (evt) => {
232
+ const eventType = 'tab-view:toggle';
233
+ void this.#syncBodyFace();
234
+ console.debug(`${_a.name} 💡 ${eventType}`);
235
+ this.dispatchEvent(new CustomEvent(eventType, { detail: { selection: this.selectedTab }, bubbles: true, composed: true }));
236
+ };
237
+ #syncBodyFace = async () => {
238
+ if (!(await frame(this)))
239
+ return;
240
+ const tab = this.selectedTab.at(-1), //event.detail.selection.at(-1), //document.querySelector(`#${}`),
241
+ path = new NavigationPath(tab), sv = [path, ...path.children()]
242
+ .filter((item) => item.component?.matches(':not(dialog)'))
243
+ .map((item) => item.body)
244
+ .filter(Boolean)
245
+ .at(-1); //queryBodyAll(tab).at(-1)
246
+ if (!sv)
247
+ return;
248
+ // const style = self.getComputedStyle(sv),
249
+ // hostStyle = self.getComputedStyle(document.documentElement)
250
+ // console.log(999, tab, style.getPropertyValue('--face'), hostStyle.getPropertyValue('--face'))
251
+ if (!sv.style.getPropertyValue('--face'))
252
+ return document.body.style.removeProperty('--face');
253
+ // if (style.getPropertyValue('--face') === hostStyle.getPropertyValue('--face'))
254
+ document.body.style.setProperty('--face', sv.style.getPropertyValue('--face'));
255
+ // if (tab?.matches('tab-view>navigation-stack>:scope')) return document.body.style.setProperty('--face', style.getPropertyValue('--face'))
256
+ // if (tab?.matches('tab-view>:scope')) return document.body.style.setProperty('--face', style.getPropertyValue('--face'))
257
+ };
258
+ }
259
+ _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,187 @@
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
+ #slots = new Map();
46
+ // #colSlot?: HTMLSlotElement
47
+ // #slot?: HTMLSlotElement
48
+ constructor() {
49
+ super();
50
+ this.#shadowRoot = this.attachShadow({ mode: 'closed' });
51
+ this.#shadowRoot.appendChild(document.importNode(this.constructor.template, true));
52
+ for (const slot of this.#shadowRoot.querySelectorAll('slot'))
53
+ this.#slots?.set(slot.name, slot);
54
+ CleanupRegistry.register(this, () => {
55
+ this.#slots = new Map();
56
+ });
57
+ // this.#colSlot = this.#shadowRoot.querySelector<HTMLSlotElement>('slot[name=column]') ?? undefined
58
+ // this.#slot = this.#shadowRoot.querySelector<HTMLSlotElement>('slot:not([name])') ?? undefined
59
+ this.#slots?.get('column')?.addEventListener('slotchange', this.#handleSlotchange);
60
+ // this.append(
61
+ // document.createRange().createContextualFragment(`<menu-view slot="header-trailing">
62
+ // <label-view slot="label" title="Delete"></label-view>
63
+ // <button type="button" tabindex="0">
64
+ // <label-view system-image="dots-three" title="Scan Documents"></label-view>
65
+ // </button>
66
+ // <button type="button" tabindex="0">
67
+ // <label-view system-image="dots-three" title="Connect to Server"></label-view>
68
+ // </button>
69
+ // <button type="button" tabindex="0">
70
+ // <label-view title="Edit Sidebar"></label-view>
71
+ // </button>
72
+ // </menu-view>
73
+ // `)
74
+ // $(`<menu-view slot="header-trailing">
75
+ // <label-view slot="label" title="Delete"></label-view>
76
+ // <button type="button" tabindex="0">
77
+ // <label-view system-image="dots-three" title="Scan Documents"></label-view>
78
+ // </button>
79
+ // <button type="button" tabindex="0">
80
+ // <label-view system-image="dots-three" title="Connect to Server"></label-view>
81
+ // </button>
82
+ // <button type="button" tabindex="0">
83
+ // <label-view title="Edit Sidebar"></label-view>
84
+ // </button>
85
+ // </menu-view>
86
+ // <div slot="footer-leading">22</div>
87
+ // <div slot="footer-trailing"><button>&lt;</button> <button>&gt;</button></div>`)
88
+ // )
89
+ }
90
+ disconnectedCallback() {
91
+ console.debug(`${_a.name} ⚡️ disconnect`);
92
+ CleanupRegistry.unregister(this);
93
+ this.#styleObserver?.disconnect();
94
+ observers.clearObservationsSet(this.#trackedElements);
95
+ this.#compactToolbarItem = undefined;
96
+ }
97
+ connectedCallback() {
98
+ console.debug(`${_a.name} ⚡️ connect`);
99
+ CleanupRegistry.register(this, onoff(listActive(this), this).on());
100
+ // console.log(999, this.#shadowRoot.querySelector('[part*=table-column-stack]'))
101
+ this.#styleObserver = new CSSStyleObserver({
102
+ properties: ['--adaptable-table-style-index'],
103
+ });
104
+ const target = this.#shadowRoot.querySelector('[part*=table-container]') ?? undefined;
105
+ if (!target)
106
+ return;
107
+ this.#styleObserver.observe(target, this.#handleStyleChange);
108
+ Snapshot.waitReady.then(() => self.requestAnimationFrame(this.#handleStyleChange));
109
+ }
110
+ #handleSlotchange = (evt) => {
111
+ console.debug(`${_a.name} ⚡️ ${evt?.type}`);
112
+ const slot = evt.target instanceof HTMLSlotElement && evt.target;
113
+ if (!slot)
114
+ return;
115
+ const assigned = slot.assignedElements({ flatten: true });
116
+ observers.syncObservations(this.#trackedElements, assigned, this.#handleTagMutation);
117
+ if (0 < assigned.length)
118
+ this.#handleTagMutation();
119
+ };
120
+ #handleTagMutation = (entry) => {
121
+ console.debug(`${_a.name} ⚡️ mutation`);
122
+ // const sourceSlot = 0 < (this.#slots?.get('column')?.assignedElements({ flatten: true }) ?? []).length ? this.#slots?.get('column') : this.#slots?.get('column')
123
+ // const menu = this.querySelector(':scope>menu-view:not([slot])') ?? this.appendChild($(`<menu-view></menu-view>`))
124
+ // menu.innerHTML = `<label-view slot="label" system-image="dots-three" title="rtyty"></label-view>`
125
+ // for (const el of sourceSlot?.assignedElements({ flatten: true }) ?? []) menu.insertAdjacentElement('beforeend', TableView.wrapTag(el, sourceSlot?.name))
126
+ //
127
+ if (!this.#compactToolbarItem) {
128
+ this.#compactToolbarItem = $(`<menu-view tabindex="0" slot="header-trailing"></menu-view>`, '>1');
129
+ CleanupRegistry.unregister(this, 'compact_toolbar');
130
+ CleanupRegistry.register(this, onoff('click', this.#handleMenuClick, this.#compactToolbarItem).on(), 'compact_toolbar');
131
+ }
132
+ this.#compactToolbarItem.innerHTML = `<label-view slot="label" system-image="dots-three"></label-view>`;
133
+ for (const node of this.#slots?.get('column')?.assignedElements({ flatten: true }) ?? []) {
134
+ if (!node.matches('[is=table-column]'))
135
+ continue;
136
+ const btn = $(`<button type="button" tabindex="0">
137
+ <v-stack spacing="0" alignment="leading">
138
+ <label-view></label-view>
139
+ <label-view font="callout" foreground="secondary"></label-view>
140
+ </v-stack>
141
+ </button>`, '>1'), title = btn.querySelector('label-view:first-child'), subTitle = btn.querySelector('label-view:last-child');
142
+ title?.setAttribute('title', node.textContent.trim());
143
+ subTitle?.setAttribute('title', node.ariaSort ?? '');
144
+ this.#compactToolbarItem.appendChild(btn);
145
+ }
146
+ // const wasConnected = this.#compactToolbarItem?.isConnected
147
+ // this.#compactToolbarItem?.removeEventListener('click', this.#handleMenuClick)
148
+ // this.#compactToolbarItem?.remove()
149
+ // this.#compactToolbarItem = menu
150
+ // this.#compactToolbarItem?.addEventListener('click', this.#handleMenuClick)
151
+ // if (wasConnected) this.insertAdjacentElement('beforeend', this.#compactToolbarItem)
152
+ };
153
+ #handleStyleChange = () => {
154
+ console.debug(`${_a.name} ⚡️ style`);
155
+ const target = this.#shadowRoot.querySelector('[part*=table-container]') ?? undefined;
156
+ if (!target)
157
+ return;
158
+ const style = self.getComputedStyle(target);
159
+ const adaptableTableStyle = style.getPropertyValue('--adaptable-table-style') || 'compact';
160
+ switch (adaptableTableStyle) {
161
+ case 'expanded':
162
+ if (!this.#compactToolbarItem?.isConnected)
163
+ break;
164
+ this.#compactToolbarItem?.remove();
165
+ break;
166
+ default:
167
+ if (!this.#compactToolbarItem)
168
+ break;
169
+ if (this.#compactToolbarItem?.isConnected)
170
+ break;
171
+ this.insertAdjacentElement('beforeend', this.#compactToolbarItem);
172
+ break;
173
+ }
174
+ };
175
+ #handleMenuClick = (evt) => {
176
+ const target = evt.target instanceof HTMLElement && evt.target;
177
+ if (!target)
178
+ return;
179
+ const btn = target.closest('button');
180
+ if (!btn)
181
+ return;
182
+ const siblings = [...(btn.parentNode?.querySelectorAll(':scope>button') ?? [])];
183
+ const index = siblings.indexOf(btn);
184
+ this.querySelector(`:scope>[slot=column]:nth-of-type(${index + 1})`)?.click();
185
+ };
186
+ }
187
+ _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 {};