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

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 (292) 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 +29 -2
  11. package/generated/client/index.js +341 -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 +9 -0
  17. package/generated/components/bordered-button.js +34 -0
  18. package/generated/components/bordered-prominent-button.d.ts +9 -0
  19. package/generated/components/bordered-prominent-button.js +34 -0
  20. package/generated/components/borderless-button.d.ts +9 -0
  21. package/generated/components/borderless-button.js +34 -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 +436 -0
  28. package/generated/components/disclosure-group.d.ts +9 -0
  29. package/generated/components/disclosure-group.js +54 -0
  30. package/generated/components/form-view.d.ts +6 -0
  31. package/generated/components/form-view.js +58 -0
  32. package/generated/components/glass-button.d.ts +8 -0
  33. package/generated/components/glass-button.js +31 -0
  34. package/generated/components/glass-prominent-button.d.ts +8 -0
  35. package/generated/components/glass-prominent-button.js +31 -0
  36. package/generated/components/index.d.ts +39 -1
  37. package/generated/components/index.js +39 -6
  38. package/generated/components/label-view.d.ts +9 -0
  39. package/generated/components/label-view.js +83 -0
  40. package/generated/components/list-view.d.ts +5 -0
  41. package/generated/components/list-view.js +29 -0
  42. package/generated/components/menu-view.d.ts +9 -0
  43. package/generated/components/menu-view.js +138 -0
  44. package/generated/components/navigation-large-title.d.ts +6 -0
  45. package/generated/components/navigation-large-title.js +177 -0
  46. package/generated/components/navigation-split-view.d.ts +10 -0
  47. package/generated/components/navigation-split-view.js +21 -0
  48. package/generated/components/navigation-stack.d.ts +10 -0
  49. package/generated/components/navigation-stack.js +27 -0
  50. package/generated/components/navigation-title.d.ts +8 -0
  51. package/generated/components/navigation-title.js +66 -0
  52. package/generated/components/picker-view.d.ts +27 -0
  53. package/generated/components/picker-view.js +448 -0
  54. package/generated/components/plain-button.d.ts +7 -0
  55. package/generated/components/plain-button.js +20 -0
  56. package/generated/components/screen-view.d.ts +5 -0
  57. package/generated/components/screen-view.js +9 -0
  58. package/generated/components/scroll-view-proxy.d.ts +8 -0
  59. package/generated/components/scroll-view-proxy.js +14 -0
  60. package/generated/components/scroll-view.d.ts +10 -0
  61. package/generated/components/scroll-view.js +196 -0
  62. package/generated/components/section-view.d.ts +9 -0
  63. package/generated/components/section-view.js +81 -0
  64. package/generated/components/sheet-view.d.ts +9 -0
  65. package/generated/components/sheet-view.js +73 -0
  66. package/generated/components/sidebar-toggle.d.ts +7 -0
  67. package/generated/components/sidebar-toggle.js +82 -0
  68. package/generated/components/sidebar-view.d.ts +7 -0
  69. package/generated/components/sidebar-view.js +35 -0
  70. package/generated/components/sticky-container.d.ts +6 -0
  71. package/generated/components/sticky-container.js +24 -0
  72. package/generated/components/tab-bar.d.ts +10 -0
  73. package/generated/components/tab-bar.js +42 -0
  74. package/generated/components/tab-item.d.ts +7 -0
  75. package/generated/components/tab-item.js +125 -0
  76. package/generated/components/tab-view.d.ts +22 -0
  77. package/generated/components/tab-view.js +259 -0
  78. package/generated/components/table-view.d.ts +7 -0
  79. package/generated/components/table-view.js +181 -0
  80. package/generated/components/text-field.d.ts +29 -0
  81. package/generated/components/text-field.js +473 -0
  82. package/generated/components/tool-bar-item-group.d.ts +7 -0
  83. package/generated/components/tool-bar-item-group.js +39 -0
  84. package/generated/components/tool-bar-item.d.ts +7 -0
  85. package/generated/components/tool-bar-item.js +49 -0
  86. package/generated/components/tool-bar.d.ts +7 -0
  87. package/generated/components/tool-bar.js +77 -0
  88. package/generated/components/v-keyboard.d.ts +11 -0
  89. package/generated/components/v-keyboard.js +81 -0
  90. package/generated/components/v-stack.d.ts +10 -0
  91. package/generated/components/v-stack.js +16 -0
  92. package/generated/css/index.css +7594 -0
  93. package/generated/events/alert-dialog.d.ts +8 -0
  94. package/generated/events/alert-dialog.js +1 -0
  95. package/generated/events/confirmation-dialog.d.ts +9 -0
  96. package/generated/events/confirmation-dialog.js +1 -0
  97. package/generated/events/date-picker.d.ts +8 -0
  98. package/generated/events/date-picker.js +1 -0
  99. package/generated/events/index.d.ts +8 -0
  100. package/generated/events/index.js +8 -0
  101. package/generated/events/lifecycle-observer.d.ts +10 -0
  102. package/generated/events/lifecycle-observer.js +1 -0
  103. package/generated/events/picker-view.d.ts +8 -0
  104. package/generated/events/picker-view.js +1 -0
  105. package/generated/events/scroll-view.d.ts +10 -0
  106. package/generated/events/scroll-view.js +1 -0
  107. package/generated/events/tab-view.d.ts +24 -0
  108. package/generated/events/tab-view.js +1 -0
  109. package/generated/events/text-field.d.ts +8 -0
  110. package/generated/events/text-field.js +1 -0
  111. package/generated/i18n/index.d.ts +34 -0
  112. package/generated/i18n/index.js +167 -0
  113. package/generated/i18n/locales/el.d.ts +17 -0
  114. package/generated/i18n/locales/el.js +17 -0
  115. package/generated/i18n/locales/en.d.ts +17 -0
  116. package/generated/i18n/locales/en.js +17 -0
  117. package/generated/i18n/locales/index.d.ts +4 -0
  118. package/generated/i18n/locales/index.js +4 -0
  119. package/generated/index.js +1 -1
  120. package/generated/internal/class/cleanup-registry.d.ts +5 -0
  121. package/generated/internal/class/cleanup-registry.js +38 -0
  122. package/generated/internal/class/css-style-observer.d.ts +8 -0
  123. package/generated/internal/class/css-style-observer.js +25 -0
  124. package/generated/internal/class/form-associated-base.d.ts +20 -0
  125. package/generated/internal/class/form-associated-base.js +96 -0
  126. package/generated/internal/class/mutation-observer-singleton.d.ts +10 -0
  127. package/generated/internal/class/mutation-observer-singleton.js +46 -0
  128. package/generated/internal/class/navigation-path.d.ts +15 -0
  129. package/generated/internal/class/navigation-path.js +84 -0
  130. package/generated/internal/class/navigation-view.d.ts +8 -0
  131. package/generated/internal/class/navigation-view.js +77 -0
  132. package/generated/internal/class/resize-observer-singleton.d.ts +7 -0
  133. package/generated/internal/class/resize-observer-singleton.js +22 -0
  134. package/generated/internal/decorators/custom-element.d.ts +5 -0
  135. package/generated/internal/decorators/custom-element.js +4 -0
  136. package/generated/internal/privateNamespace.d.ts +4 -0
  137. package/generated/internal/privateNamespace.js +1 -0
  138. package/generated/internal/utils/add.d.ts +1 -0
  139. package/generated/internal/utils/add.js +7 -0
  140. package/generated/internal/utils/button-role.d.ts +1 -0
  141. package/generated/internal/utils/button-role.js +19 -0
  142. package/generated/internal/utils/cash/ancestors.d.ts +1 -0
  143. package/generated/internal/utils/cash/ancestors.js +27 -0
  144. package/generated/internal/utils/cash/index.d.ts +23 -0
  145. package/generated/internal/utils/cash/index.js +25 -0
  146. package/generated/internal/utils/cash/next-all.d.ts +1 -0
  147. package/generated/internal/utils/cash/next-all.js +10 -0
  148. package/generated/internal/utils/cash/next.d.ts +1 -0
  149. package/generated/internal/utils/cash/next.js +9 -0
  150. package/generated/internal/utils/cash/prev-all.d.ts +1 -0
  151. package/generated/internal/utils/cash/prev-all.js +10 -0
  152. package/generated/internal/utils/cash/prev.d.ts +1 -0
  153. package/generated/internal/utils/cash/prev.js +9 -0
  154. package/generated/internal/utils/cash/prop.d.ts +18 -0
  155. package/generated/internal/utils/cash/prop.js +30 -0
  156. package/generated/internal/utils/cash/siblings.d.ts +1 -0
  157. package/generated/internal/utils/cash/siblings.js +10 -0
  158. package/generated/internal/utils/clamp.d.ts +1 -0
  159. package/generated/internal/utils/clamp.js +4 -0
  160. package/generated/internal/utils/compare-big-decimals.d.ts +1 -0
  161. package/generated/internal/utils/compare-big-decimals.js +90 -0
  162. package/generated/internal/utils/css-time.d.ts +1 -0
  163. package/generated/internal/utils/css-time.js +3 -0
  164. package/generated/internal/utils/debounce.d.ts +1 -0
  165. package/generated/internal/utils/debounce.js +13 -0
  166. package/generated/internal/utils/frame.d.ts +1 -0
  167. package/generated/internal/utils/frame.js +6 -0
  168. package/generated/internal/utils/index.d.ts +20 -1
  169. package/generated/internal/utils/index.js +21 -1
  170. package/generated/internal/utils/is-inside.d.ts +1 -0
  171. package/generated/internal/utils/is-inside.js +4 -0
  172. package/generated/internal/utils/kebab-case.d.ts +1 -1
  173. package/generated/internal/utils/kebab-case.js +3 -3
  174. package/generated/internal/utils/list-active.d.ts +7 -0
  175. package/generated/internal/utils/list-active.js +83 -0
  176. package/generated/internal/utils/microtask.d.ts +1 -0
  177. package/generated/internal/utils/microtask.js +3 -0
  178. package/generated/internal/utils/onoff.d.ts +45 -0
  179. package/generated/internal/utils/onoff.js +31 -0
  180. package/generated/internal/utils/set.d.ts +1 -0
  181. package/generated/internal/utils/set.js +7 -0
  182. package/generated/internal/utils/sleep.d.ts +1 -0
  183. package/generated/internal/utils/sleep.js +3 -0
  184. package/generated/internal/utils/slow-hide-show.d.ts +1 -0
  185. package/generated/internal/utils/slow-hide-show.js +16 -0
  186. package/generated/internal/utils/timeout.d.ts +5 -0
  187. package/generated/internal/utils/timeout.js +16 -0
  188. package/generated/internal/utils/toolbar-repositioner.d.ts +1 -0
  189. package/generated/internal/utils/toolbar-repositioner.js +12 -0
  190. package/generated/internal/utils/touch-glass.d.ts +7 -0
  191. package/generated/internal/utils/touch-glass.js +19 -0
  192. package/generated/namespace-browser/base.d.ts +36 -0
  193. package/generated/namespace-browser/base.js +92 -0
  194. package/generated/namespace-browser/index.d.ts +7 -0
  195. package/generated/namespace-browser/index.js +1 -0
  196. package/generated/snapshot/index.d.ts +9 -0
  197. package/generated/snapshot/index.js +58 -0
  198. package/package.json +36 -9
  199. package/scss/_base.scss +5 -0
  200. package/scss/_components.scss +79 -0
  201. package/scss/_final.scss +1 -0
  202. package/scss/_functions.scss +31 -0
  203. package/scss/_mixins.scss +3 -0
  204. package/scss/_placeholders.scss +3 -0
  205. package/scss/_transitions.scss +28 -0
  206. package/scss/_utils.scss +9 -0
  207. package/scss/_vars.scss +174 -3
  208. package/scss/base/_layout.scss +56 -0
  209. package/scss/base/_reboot.scss +160 -0
  210. package/scss/base/_root.scss +396 -0
  211. package/scss/colors/_index.scss +635 -0
  212. package/scss/components/_alert-dialog.scss +106 -0
  213. package/scss/components/_body-view.scss +17 -0
  214. package/scss/components/_bordered-button.scss +30 -0
  215. package/scss/components/_bordered-prominent-button.scss +27 -0
  216. package/scss/components/_borderless-button.scss +27 -0
  217. package/scss/components/_confirmation-dialog.scss +110 -0
  218. package/scss/components/_content-unavailable-view.scss +45 -0
  219. package/scss/components/_date-picker.scss +30 -0
  220. package/scss/components/_detail-placeholder.scss +153 -0
  221. package/scss/components/_disclosure-group.scss +128 -0
  222. package/scss/components/_form-view.scss +195 -0
  223. package/scss/components/_full-screen.scss +15 -0
  224. package/scss/components/_glass-button.scss +32 -0
  225. package/scss/components/_glass-prominent-button.scss +32 -0
  226. package/scss/components/_h-divider.scss +13 -0
  227. package/scss/components/_h-flex-stack.scss +23 -0
  228. package/scss/components/_h-stack.scss +29 -0
  229. package/scss/components/_index.scss +246 -0
  230. package/scss/components/_label-view.scss +393 -0
  231. package/scss/components/_labeled-content.scss +9 -0
  232. package/scss/components/_list-view.scss +229 -0
  233. package/scss/components/_menu-view.scss +188 -0
  234. package/scss/components/_navigation-large-title.scss +27 -0
  235. package/scss/components/_navigation-split-view.scss +424 -0
  236. package/scss/components/_navigation-stack.scss +11 -0
  237. package/scss/components/_navigation-title.scss +10 -0
  238. package/scss/components/_picker-view.scss +122 -0
  239. package/scss/components/_plain-button.scss +18 -0
  240. package/scss/components/_scroll-view-proxy.scss +79 -0
  241. package/scss/components/_scroll-view-toolbars.scss +126 -0
  242. package/scss/components/_scroll-view.scss +130 -0
  243. package/scss/components/_section-view.scss +119 -0
  244. package/scss/components/_sheet-view.scss +102 -0
  245. package/scss/components/_sidebar-toggle.scss +121 -0
  246. package/scss/components/_sidebar-view.scss +53 -0
  247. package/scss/components/_sticky-container.scss +42 -0
  248. package/scss/components/_tab-bar.scss +255 -0
  249. package/scss/components/_tab-item.scss +25 -0
  250. package/scss/components/_tab-view.scss +312 -0
  251. package/scss/components/_table-column.scss +52 -0
  252. package/scss/components/_table-row.scss +172 -0
  253. package/scss/components/_table-view.scss +223 -0
  254. package/scss/components/_text-field.scss +37 -0
  255. package/scss/components/_tool-bar-item-group.scss +48 -0
  256. package/scss/components/_tool-bar-item.scss +145 -0
  257. package/scss/components/_tool-bar.scss +128 -0
  258. package/scss/components/_v-divider.scss +13 -0
  259. package/scss/components/_v-flex-stack.scss +29 -0
  260. package/scss/components/_v-keyboard.scss +14 -0
  261. package/scss/components/_v-stack.scss +25 -0
  262. package/scss/final/_touch-glass.scss +91 -0
  263. package/scss/index.scss +15 -6
  264. package/scss/mixins/_dialog.scss +89 -0
  265. package/scss/mixins/_index.scss +422 -0
  266. package/scss/placeholders/_buttons.scss +125 -0
  267. package/scss/placeholders/_lists.scss +561 -0
  268. package/scss/transitions/_alert-dialog.scss +19 -0
  269. package/scss/transitions/_bwd.navbar.scss +19 -0
  270. package/scss/transitions/_bwd.scss +39 -0
  271. package/scss/transitions/_confirmation-dialog.scss +19 -0
  272. package/scss/transitions/_dialog.scss +28 -0
  273. package/scss/transitions/_disclosure-group.scss +35 -0
  274. package/scss/transitions/_fwd.navbar.scss +41 -0
  275. package/scss/transitions/_fwd.scss +24 -0
  276. package/scss/transitions/_glass-button.scss +12 -0
  277. package/scss/transitions/_glass-prominent-button.scss +12 -0
  278. package/scss/transitions/_index.scss +74 -0
  279. package/scss/transitions/_menu-view.scss +26 -0
  280. package/scss/transitions/_navigation-split-view.scss +23 -0
  281. package/scss/transitions/_sidebar-view.scss +36 -0
  282. package/scss/transitions/_tab-bar.scss +19 -0
  283. package/scss/utils/_frame.scss +91 -0
  284. package/scss/utils/_index.scss +68 -0
  285. package/scss/utils/_scroll-view.scss +14 -0
  286. package/scss/utils/_spacing.scss +25 -0
  287. package/scss/utils/_stacks.scss +247 -0
  288. package/web-components.html-data/en.json +423 -0
  289. package/generated/internal/snapshot.d.ts +0 -5
  290. package/generated/internal/snapshot.js +0 -23
  291. package/generated/styles.css +0 -8
  292. package/scss/_reboot.scss +0 -11
@@ -0,0 +1,196 @@
1
+ var _a;
2
+ import { lifecycleObserver } from '../buses';
3
+ import { CleanupRegistry } from '../internal/class/cleanup-registry';
4
+ import { ResizeObserverSingleton } from '../internal/class/resize-observer-singleton';
5
+ import { $, frame, onoff, slowHideShow } from '../internal/utils';
6
+ const observers = new ResizeObserverSingleton();
7
+ export class ScrollView extends HTMLElement {
8
+ static get observedAttributes() {
9
+ return ['navigation-title', 'navigation-inline-title', 'navigation-inline-subtitle', 'navigation-bar-title-display-mode'];
10
+ }
11
+ static #template;
12
+ static get template() {
13
+ return (this.#template ??= $(String.raw `
14
+ <slot></slot>
15
+ <div part="root scroll-view-navbar">
16
+ <div part="root scroll-view-navbar-stack">
17
+ <slot name="top-bar-principal"></slot>
18
+ </div>
19
+ </div>
20
+ <div part="root scroll-view-toolbar">
21
+ <div part="root scroll-view-toolbar-stack">
22
+ <slot name="bottom-bar-principal"></slot>
23
+ </div>
24
+ </div>`));
25
+ }
26
+ #shadowRoot;
27
+ #navbarPrincipalSlot;
28
+ #isMidScroll;
29
+ #lastScrollTop = 0;
30
+ // #stopRecordingScrollTop?: boolean = false
31
+ #beforeTabSwapLastScrolltop;
32
+ constructor() {
33
+ super();
34
+ this.#shadowRoot = this.attachShadow({ mode: 'closed' });
35
+ this.#shadowRoot.appendChild(document.importNode(this.constructor.template, true));
36
+ this.#navbarPrincipalSlot = this.#shadowRoot.querySelector('slot[name=top-bar-principal]') ?? undefined;
37
+ }
38
+ disconnectedCallback() {
39
+ console.debug(`${_a.name} ⚡️ disconnect`);
40
+ CleanupRegistry.unregister(this);
41
+ observers.unobserve(this);
42
+ frame().then(() => lifecycleObserver.dispatchEvent(new CustomEvent('pagehide', { detail: { page: this }, bubbles: true, composed: true })));
43
+ }
44
+ connectedCallback() {
45
+ console.debug(`${_a.name} ⚡️ connect`);
46
+ CleanupRegistry.register(this, onoff([
47
+ // { types: 'tabreveal', listener: this.#handleTabReveal as EventListener },
48
+ { types: 'beforetabswap', listener: this.#handleTabBeforeswap },
49
+ ], this.closest('tab-view') ?? undefined).on());
50
+ CleanupRegistry.register(this, onoff([
51
+ { types: 'scroll', listener: this.#handleScroll, addOptions: { passive: true } },
52
+ { types: 'scrollend', listener: this.#handleScrollend, addOptions: { passive: true } },
53
+ ], this).on());
54
+ frame().then(() => lifecycleObserver.dispatchEvent(new CustomEvent('pageshow', { detail: { page: this }, bubbles: true, composed: true })));
55
+ observers.observe(this, this.#handleMeasure.bind(this));
56
+ // frame(this).then((r) => {
57
+ // if (!r) return
58
+ // let first = true
59
+ // observeResizeEnd(this, () => {
60
+ // if (first) {
61
+ // first = false
62
+ // return
63
+ // }
64
+ // this.dispatchEvent(new CustomEvent('resizeend', { bubbles: true, composed: true }))
65
+ // })
66
+ // })
67
+ }
68
+ attributeChangedCallback(name, oldValue, newValue) {
69
+ console.debug(`${_a.name} ⚡️ attr-change [${name}] ("${oldValue}" → "${newValue}")`);
70
+ switch (name) {
71
+ case 'navigation-inline-title':
72
+ this.#renderNavTitle(newValue, this.getAttribute('navigation-inline-subtitle'));
73
+ break;
74
+ case 'navigation-inline-subtitle':
75
+ this.#renderNavTitle(this.getAttribute('navigation-inline-title'), newValue);
76
+ break;
77
+ case 'navigation-title':
78
+ //
79
+ break;
80
+ case 'navigation-bar-title-display-mode':
81
+ if (oldValue === newValue)
82
+ break;
83
+ if (this.closest('[hidden]'))
84
+ break; // iREPAINT ALERT! if (0 === this.offsetHeight + this.offsetWidth) break
85
+ if (!this.#isMidScroll)
86
+ break;
87
+ const title = this.#navbarPrincipalSlot?.assignedElements({ flatten: true })?.at(0);
88
+ slowHideShow('largeinline' === `${oldValue}${newValue}` ? 'show' : 'hide', title);
89
+ break;
90
+ }
91
+ }
92
+ #handleScroll = (evt) => {
93
+ console.debug(`${_a.name} ⚡️ ${evt?.type}`);
94
+ if (!this.#isMidScroll)
95
+ this.#isMidScroll = true;
96
+ // if (this.#stopRecordingScrollTop) return
97
+ const target = evt.target instanceof HTMLElement && evt.target;
98
+ if (!target)
99
+ return;
100
+ this.#lastScrollTop = target.scrollTop;
101
+ };
102
+ #handleScrollend = (evt) => {
103
+ console.debug(`${_a.name} ⚡️ ${evt?.type}`);
104
+ if (this.#isMidScroll)
105
+ this.#isMidScroll = false;
106
+ };
107
+ #handleMeasure = (entry) => {
108
+ console.debug(`${_a.name} ⚡️ measure`);
109
+ if (0 === entry.contentRect.width + entry.contentRect.height)
110
+ return;
111
+ if (undefined === this.#beforeTabSwapLastScrolltop)
112
+ return;
113
+ if (this.#beforeTabSwapLastScrolltop === this.#lastScrollTop)
114
+ return;
115
+ // this.#stopRecordingScrollTop = true
116
+ entry.target.scrollTop = this.#beforeTabSwapLastScrolltop;
117
+ // entry.target.scrollTo({
118
+ // top: this.#beforeTabSwapLastScrolltop,
119
+ // behavior: 'smooth',
120
+ // }) //
121
+ // this.#stopRecordingScrollTop = false
122
+ this.#beforeTabSwapLastScrolltop = undefined;
123
+ };
124
+ #handleTabReveal = (evt) => {
125
+ console.debug(`${_a.name} ⚡️ ${evt?.type}`);
126
+ const target = evt.target instanceof HTMLElement && evt.target;
127
+ if (!target)
128
+ return;
129
+ if (!target.contains(this))
130
+ return;
131
+ if (this.closest('[hidden]'))
132
+ return;
133
+ // console.log(888, this.#beforeTabSwapLastScrolltop, this.#lastScrollTop)
134
+ // this.style.setProperty('clip-path', 'inset(50%)')
135
+ // this.style.setProperty('opacity', '0.001')
136
+ // this.style.opacity = '0.001'
137
+ // console.log(99, this.style.opacity)
138
+ // self.requestAnimationFrame(() => {
139
+ // if (undefined === this.#beforeTabSwapLastScrolltop) return
140
+ // if (this.#beforeTabSwapLastScrolltop === this.#lastScrollTop) return
141
+ // this.#stopRecordingScrollTop = true
142
+ // // console.log(999, this.#beforeTabSwapLastScrolltop)
143
+ // // console.log(999, this, this.#beforeTabSwapLastScrolltop, this.#lastScrollTop)
144
+ // this.scrollTop = this.#beforeTabSwapLastScrolltop
145
+ // // this.scrollTo({
146
+ // // top: this.#beforeTabSwapLastScrolltop,
147
+ // // behavior: 'instant',
148
+ // // }) //
149
+ // this.#stopRecordingScrollTop = false
150
+ // this.#beforeTabSwapLastScrolltop = undefined
151
+ // // self.requestAnimationFrame(() => {
152
+ // // // this.style.removeProperty('opacity')
153
+ // // })
154
+ // })
155
+ };
156
+ #handleTabBeforeswap = (evt) => {
157
+ console.debug(`${_a.name} ⚡️ ${evt?.type}`);
158
+ const target = evt.target instanceof HTMLElement && evt.target;
159
+ if (!target)
160
+ return;
161
+ if (!target.contains(this))
162
+ return;
163
+ if (this.closest('[hidden]'))
164
+ return;
165
+ this.#beforeTabSwapLastScrolltop = this.scrollTop; //#lastScrollTop
166
+ };
167
+ centerScrollToElement(child) {
168
+ // scrollTop needed to center child
169
+ const parentRect = this.getBoundingClientRect(), childRect = child.getBoundingClientRect();
170
+ // current scroll + offset of child relative to parent
171
+ const top = this.scrollTop + childRect.top - parentRect.top - parentRect.height / 2 + childRect.height / 2;
172
+ this.scrollTo({
173
+ top,
174
+ behavior: self.matchMedia('(prefers-reduced-motion: no-preference)').matches ? 'smooth' : 'instant', // optional: smooth scroll
175
+ });
176
+ }
177
+ #renderNavTitle = (title, subtitle) => {
178
+ const vStack = this.querySelector(':scope>[slot=top-bar-principal]') ??
179
+ this.appendChild($(`<v-stack spacing="0" alignment="fill" slot="top-bar-principal"><label-view line-limit="1" truncation-mode="tail" font="headline"></label-view><label-view line-limit="1" truncation-mode="tail" font="callout"></label-view></v-stack>`, '>1'));
180
+ let titleLabel = vStack.querySelector(':scope>label-view:nth-child(1)');
181
+ if (title) {
182
+ titleLabel ??= vStack.appendChild($(`<label-view line-limit="1" truncation-mode="tail" font="headline"></label-view>`, '>1'));
183
+ titleLabel.setAttribute('title', title);
184
+ }
185
+ else
186
+ titleLabel?.remove();
187
+ let subtitleLabel = vStack.querySelector(':scope>label-view:nth-child(2)');
188
+ if (subtitle) {
189
+ subtitleLabel ??= vStack.appendChild($(`<label-view line-limit="1" truncation-mode="tail" font="callout"></label-view>`, '>1'));
190
+ subtitleLabel.setAttribute('title', subtitle);
191
+ }
192
+ else
193
+ subtitleLabel?.remove();
194
+ };
195
+ }
196
+ _a = ScrollView;
@@ -0,0 +1,9 @@
1
+ export declare class SectionView extends HTMLElement {
2
+ #private;
3
+ static get observedAttributes(): string[];
4
+ static get template(): DocumentFragment;
5
+ constructor();
6
+ disconnectedCallback(): void;
7
+ connectedCallback(): void;
8
+ attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null): void;
9
+ }
@@ -0,0 +1,81 @@
1
+ import { $ } from '../internal/utils';
2
+ export class SectionView extends HTMLElement {
3
+ static get observedAttributes() {
4
+ return ['header', 'footer'];
5
+ }
6
+ static #template;
7
+ static get template() {
8
+ return (this.#template ??= $(String.raw `
9
+ <div part="root section-main-stack">
10
+ <slot></slot>
11
+ </div>
12
+ <div part="root section-header-stack">
13
+ <slot name="header"></slot>
14
+ </div>
15
+ <div part="root section-footer-stack">
16
+ <slot name="footer"></slot>
17
+ </div>`));
18
+ // <div class="sticky-sentinel" style="grid-area:sentinel;inline-size:100%;block-size:0.1px;pointer-events:none;"></div>
19
+ }
20
+ #shadowRoot;
21
+ // #observer?: IntersectionObserver
22
+ // #sibling?: HTMLElement
23
+ // #sentinel?: HTMLElement
24
+ // #sentinelIsIntersecting: boolean = false
25
+ // #isIntersecting: boolean = false
26
+ constructor() {
27
+ super();
28
+ this.#shadowRoot = this.attachShadow({ mode: 'closed' });
29
+ // Snapshot.waitReady.then(() => {
30
+ this.#shadowRoot.appendChild(document.importNode(this.constructor.template, true));
31
+ // this.#sentinel = this.#shadowRoot.querySelector('.sticky-sentinel') ?? undefined
32
+ // })
33
+ }
34
+ disconnectedCallback() {
35
+ console.debug(`${SectionView.name} ⚡️ disconnect`);
36
+ // if (this.#sentinel) this.#observer?.unobserve(this.#sentinel)
37
+ // this.#observer?.unobserve(this)
38
+ }
39
+ connectedCallback() {
40
+ console.debug(`${SectionView.name} ⚡️ connect`);
41
+ // this.#sibling = this.closest('scroll-view') ?? undefined
42
+ // Snapshot.waitReady.then(() => {
43
+ // if (!(await frame(this))) return // NOTE: Required or BREAKS transitions // self.requestAnimationFrame(() => {
44
+ // if (!this.isConnected) return
45
+ // const blockSizeProp = getComputedStyle(this).getPropertyValue('--navigation-bar-block-size') || '0', //`${document.documentElement.computedStyleMap().get(`--navigation-bar-block-size`) ?? '0'}`, //
46
+ // blockSize = parseFloat(blockSizeProp) * (blockSizeProp.endsWith('rem') ? parseFloat(getComputedStyle(document.documentElement).fontSize) : 1)
47
+ // this.#observer = new IntersectionObserver(this.#handleIntersect, {
48
+ // root: this.#sibling,
49
+ // rootMargin: `-${blockSize}px 0px 0px 0px`,
50
+ // threshold: [0, 1],
51
+ // })
52
+ // if (this.#sentinel) this.#observer.observe(this.#sentinel)
53
+ // this.#observer.observe(this)
54
+ // })
55
+ }
56
+ attributeChangedCallback(name, oldValue, newValue) {
57
+ console.debug(`${SectionView.name} ⚡️ attr-change [${name}] ("${oldValue}" → "${newValue}")`);
58
+ // Snapshot.waitReady.then(() => {
59
+ switch (name) {
60
+ case 'header':
61
+ let header = this.querySelector(':scope>[slot=header]');
62
+ if (newValue) {
63
+ header ??= this.appendChild($(`<header slot="header"><label-view line-limit="1" truncation-mode="tail" font="callout"></label-view></header>`, '>1'));
64
+ header.querySelector('label-view')?.setAttribute('title', newValue);
65
+ }
66
+ else
67
+ header?.remove();
68
+ break;
69
+ case 'footer':
70
+ let footer = this.querySelector(':scope>[slot=footer]');
71
+ if (newValue) {
72
+ footer ??= this.appendChild($(`<footer slot="footer"><label-view line-limit="1" truncation-mode="tail" font="callout"></label-view></footer>`, '>1'));
73
+ footer.querySelector('label-view')?.setAttribute('title', newValue);
74
+ }
75
+ else
76
+ footer?.remove();
77
+ break;
78
+ }
79
+ // })
80
+ }
81
+ }
@@ -0,0 +1,9 @@
1
+ import { DialogBase } from '../namespace-browser/base';
2
+ export declare class SheetView extends DialogBase {
3
+ #private;
4
+ static get observedAttributes(): string[];
5
+ constructor();
6
+ static polyfillDisconnectedCallback(el: SheetView): void;
7
+ static polyfillConnectedCallback(el: SheetView): void;
8
+ static polyfillAttributeChangedCallback([{ attributeName, target, oldValue }]: Pick<MutationRecord, 'attributeName' | 'oldValue' | 'target'>[]): void;
9
+ }
@@ -0,0 +1,73 @@
1
+ import { CleanupRegistry } from '../internal/class/cleanup-registry';
2
+ import { onoff } from '../internal/utils';
3
+ import { DialogBase } from '../namespace-browser/base';
4
+ export class SheetView extends DialogBase {
5
+ static get observedAttributes() {
6
+ return ['fine-presentation-large-adaptation'];
7
+ }
8
+ constructor() {
9
+ super();
10
+ }
11
+ static polyfillDisconnectedCallback(el) {
12
+ console.debug(`${SheetView.name} ⚡️ disconnect`);
13
+ CleanupRegistry.unregister(el);
14
+ }
15
+ static polyfillConnectedCallback(el) {
16
+ console.debug(`${SheetView.name} ⚡️ connect`);
17
+ CleanupRegistry.register(el, onoff([
18
+ { types: 'cancel', listener: this.#handleCancel },
19
+ { types: 'keydown', listener: SheetView.#handleKeydown },
20
+ ], el).on());
21
+ el.autofocus = true;
22
+ }
23
+ static polyfillAttributeChangedCallback([{ attributeName, target, oldValue }]) {
24
+ console.debug(`${SheetView.name} ⚡️ attr-change [${attributeName}] ("${oldValue}" → "${target.getAttribute(attributeName ?? '')}")`);
25
+ // NOTE: wait for config
26
+ // Snapshot.waitReady.then(() => {
27
+ // switch (attributeName) {
28
+ // case 'fine-presentation-large-adaptation':
29
+ // const node = target instanceof HTMLDialogElement && target
30
+ // if (!node) break
31
+ // CleanupRegistry.unregister(node, 'mediaquery')
32
+ // if ('bottom-bar' !== target.getAttribute(attributeName ?? '')) break
33
+ // const mediaQueryList = self.matchMedia(`(pointer: fine) and (min-width: ${Snapshot.config!['ipad-sheet-view-inline-size']}) and (min-height: ${Snapshot.config!['ipad-sheet-view-height']})`)
34
+ // SheetView.#handleMediaChange(
35
+ // node,
36
+ // new MediaQueryListEvent(`media-change`, {
37
+ // matches: mediaQueryList.matches,
38
+ // })
39
+ // ) // Initial check
40
+ // const handler1 = SheetView.#handleMediaChange.bind(null, node)
41
+ // CleanupRegistry.register(node, onoff('change', handler1 as unknown as EventListener, mediaQueryList).on(), 'mediaquery')
42
+ // break
43
+ // }
44
+ // })
45
+ }
46
+ static #handleKeydown = (evt) => {
47
+ console.debug(`${SheetView.name} ⚡️ ${evt?.type} (${evt.key})`);
48
+ if ('Escape' !== evt.key)
49
+ return;
50
+ evt.preventDefault();
51
+ evt.stopImmediatePropagation();
52
+ evt.stopPropagation();
53
+ };
54
+ static #handleCancel = (evt) => {
55
+ console.debug(`${SheetView.name} ⚡️ ${evt?.type} (${evt.cancelable})`);
56
+ if (!evt.cancelable)
57
+ return;
58
+ evt.preventDefault();
59
+ };
60
+ static #handleMediaChange = (el, evt) => {
61
+ console.debug(`${SheetView.name} ⚡️ ${evt?.type}`);
62
+ if (evt.matches)
63
+ for (const item of el.querySelectorAll(':scope>tool-bar>[slot^="top-bar-"]')) {
64
+ item.dataset.previousSlot = item.getAttribute('slot') ?? '';
65
+ item.slot = 'bottom-bar-trailing';
66
+ }
67
+ else
68
+ for (const item of el.querySelectorAll(':scope>tool-bar>[data-previous-slot]')) {
69
+ item.slot = item.dataset.previousSlot ?? '';
70
+ delete item.dataset.previousSlot;
71
+ }
72
+ };
73
+ }
@@ -0,0 +1,7 @@
1
+ export declare class SidebarToggle extends HTMLElement {
2
+ #private;
3
+ constructor();
4
+ connectedCallback(): void;
5
+ disconnectedCallback(): void;
6
+ private static query;
7
+ }
@@ -0,0 +1,82 @@
1
+ var _a;
2
+ import { CleanupRegistry } from '../internal/class/cleanup-registry';
3
+ import { ResizeObserverSingleton } from '../internal/class/resize-observer-singleton';
4
+ import { debounce, onoff } from '../internal/utils';
5
+ const observers = new ResizeObserverSingleton();
6
+ export class SidebarToggle extends HTMLElement {
7
+ constructor() {
8
+ super();
9
+ }
10
+ connectedCallback() {
11
+ console.debug(`${_a.name} ⚡️ connect`);
12
+ CleanupRegistry.register(this, onoff('click', this.#handleClick, this).on());
13
+ const entry = {
14
+ target: this,
15
+ };
16
+ observers.observe(this, debounce(_a.#handleMeasure, 100, true)); //this.#ro?.observe(this)
17
+ // @ts-expect-error
18
+ _a.#handleMeasure([entry]);
19
+ }
20
+ disconnectedCallback() {
21
+ console.debug(`${_a.name} ⚡️ disconnect`);
22
+ observers.unobserve(this);
23
+ CleanupRegistry.unregister(this);
24
+ }
25
+ static query(target) {
26
+ const container = target?.closest('navigation-split-view,tab-view'), sideBar = container?.querySelector(':scope > [is=sidebar-view]');
27
+ return { container, sideBar };
28
+ }
29
+ // This triggers on show/hide of any of sidebar-toggle elements
30
+ static #handleMeasure(entry) {
31
+ console.debug(`${_a.name} ⚡️ measure`);
32
+ const target = entry?.target instanceof HTMLElement && entry.target;
33
+ if (!target)
34
+ return;
35
+ // set/remove css var/prop to parent based on shown/hidden
36
+ const tv = target.parentElement;
37
+ // inlineSize = entry.borderBoxSize?.at(0)?.inlineSize ?? entry.contentRect?.width ?? 0,
38
+ // blockSize = entry.borderBoxSize?.at(0)?.blockSize ?? entry.contentRect?.height ?? 0
39
+ self.requestAnimationFrame(() => {
40
+ const inlineSize = target.offsetWidth ?? 0;
41
+ if (0 < inlineSize)
42
+ tv?.style?.setProperty?.('--sidebar-toggle-padding-inline-start', `${inlineSize}px`); //$.prop('--sidebar-toggle-padding-inline-start', `${inlineSize}px`, tv) //
43
+ else
44
+ tv?.style?.removeProperty?.('--sidebar-toggle-padding-inline-start'); //$.prop('--sidebar-toggle-padding-inline-start', null, tv) //
45
+ });
46
+ // auto close IF open
47
+ const { container, sideBar } = _a.query(target); //target?.closest('navigation-split-view,tab-view')
48
+ if (!sideBar?.open)
49
+ return;
50
+ self.requestAnimationFrame(() => {
51
+ switch (container?.tagName) {
52
+ case 'NAVIGATION-SPLIT-VIEW':
53
+ if (0 < target.offsetWidth && 0 < target.offsetHeight)
54
+ return;
55
+ break;
56
+ case 'TAB-VIEW':
57
+ // scan all toggles for anyone that is visible, sign that sidebar should stay open
58
+ if ([
59
+ ...container.querySelectorAll(':scope > sidebar-toggle,:scope > [is=tab-bar] > sidebar-toggle' //,:scope > [is='sidebar-view'] > tool-bar > sidebar-toggle" ?? FIXME: removed this bc/ inside sidebar!
60
+ ),
61
+ ].some(({ offsetWidth, offsetHeight }) => 0 < offsetWidth && 0 < offsetHeight))
62
+ return;
63
+ break;
64
+ }
65
+ sideBar?.close?.();
66
+ });
67
+ }
68
+ #handleClick(evt) {
69
+ console.debug(`${_a.name} ⚡️ ${evt?.type}`);
70
+ const target = evt?.target instanceof HTMLElement && evt.target;
71
+ if (!target)
72
+ return;
73
+ if (!target?.closest('button'))
74
+ return;
75
+ const { sideBar } = _a.query(target);
76
+ if (!sideBar?.open)
77
+ sideBar?.showModal();
78
+ else
79
+ sideBar.close();
80
+ }
81
+ }
82
+ _a = SidebarToggle;
@@ -0,0 +1,7 @@
1
+ import { DialogBase } from '../namespace-browser/base';
2
+ export declare class SidebarView extends DialogBase {
3
+ #private;
4
+ constructor();
5
+ static polyfillDisconnectedCallback(el: HTMLDialogElement): void;
6
+ static polyfillConnectedCallback(el: HTMLDialogElement): void;
7
+ }
@@ -0,0 +1,35 @@
1
+ import { CleanupRegistry } from '../internal/class/cleanup-registry';
2
+ import { onoff, touchGlass } from '../internal/utils';
3
+ import { DialogBase } from '../namespace-browser/base';
4
+ export class SidebarView extends DialogBase {
5
+ constructor() {
6
+ super();
7
+ }
8
+ static polyfillDisconnectedCallback(el) {
9
+ el.removeEventListener('click', SidebarView.#handleClick);
10
+ CleanupRegistry.unregister(el);
11
+ }
12
+ static polyfillConnectedCallback(el) {
13
+ CleanupRegistry.register(el, onoff('click', SidebarView.#handleClick, el).on());
14
+ CleanupRegistry.register(el, onoff(touchGlass(el, (t) => t, (evt) => {
15
+ const target = evt.target instanceof HTMLElement && evt.target;
16
+ if (!target)
17
+ return true;
18
+ if (target.matches('[is=sidebar-view]'))
19
+ return false;
20
+ if (target.closest('tool-bar-item'))
21
+ return false;
22
+ return true;
23
+ }), el).on());
24
+ el.autofocus = true;
25
+ }
26
+ /** Autoclose on click outside. */
27
+ static #handleClick = async (evt) => {
28
+ console.debug(`${SidebarView.name} ⚡️ ${evt?.type}`);
29
+ const target = evt.target instanceof HTMLElement && evt.target;
30
+ if (!target)
31
+ return;
32
+ if (target instanceof HTMLDialogElement && 'sidebar-view' === target.getAttribute('is'))
33
+ target.close?.();
34
+ };
35
+ }
@@ -0,0 +1,6 @@
1
+ export declare class StickyContainer extends HTMLElement {
2
+ #private;
3
+ constructor();
4
+ connectedCallback(): void;
5
+ disconnectedCallback(): void;
6
+ }
@@ -0,0 +1,24 @@
1
+ import { CleanupRegistry } from '../internal/class/cleanup-registry';
2
+ import { onoff } from '../internal/utils';
3
+ export class StickyContainer extends HTMLElement {
4
+ constructor() {
5
+ super();
6
+ }
7
+ connectedCallback() {
8
+ console.debug(`${StickyContainer.name} ⚡️ connect`);
9
+ // CleanupRegistry.register(this, onoff('transitionend transitionstart transitioncancel', this.#handleTransitionrun as unknown as EventListener, this).on())
10
+ CleanupRegistry.register(this, onoff('transitionrun', this.#handleTransitionrun, this).on());
11
+ }
12
+ disconnectedCallback() {
13
+ console.debug(`${StickyContainer.name} ⚡️ disconnect`);
14
+ CleanupRegistry.unregister(this);
15
+ }
16
+ #handleTransitionrun = ({ target, propertyName, pseudoElement }) => {
17
+ if (!(target instanceof HTMLElement && target))
18
+ return;
19
+ if ('--stuck' !== propertyName || '::before' !== pseudoElement || !target.matches('sticky-container'))
20
+ return;
21
+ const stuck = self.getComputedStyle(this, 'before').getPropertyValue('--stuck');
22
+ this.toggleAttribute('stuck', '1' === stuck);
23
+ };
24
+ }
@@ -0,0 +1,10 @@
1
+ import { DialogBase } from '../namespace-browser/base';
2
+ /**
3
+ * @summary A screen that lets users switch between different views using buttons, tabs, or other controls.
4
+ */
5
+ export declare class TabBar extends DialogBase {
6
+ #private;
7
+ constructor();
8
+ static polyfillDisconnectedCallback(el: HTMLDialogElement): void;
9
+ static polyfillConnectedCallback(el: HTMLDialogElement): void;
10
+ }
@@ -0,0 +1,42 @@
1
+ import { CleanupRegistry } from '../internal/class/cleanup-registry';
2
+ import { onoff, touchGlass } from '../internal/utils';
3
+ import { DialogBase } from '../namespace-browser/base';
4
+ /**
5
+ * @summary A screen that lets users switch between different views using buttons, tabs, or other controls.
6
+ */
7
+ export class TabBar extends DialogBase {
8
+ constructor() {
9
+ super();
10
+ }
11
+ static polyfillDisconnectedCallback(el) {
12
+ console.debug(`${TabBar.name} ⚡️ disconnect`);
13
+ el.removeEventListener('click', TabBar.#handleClick);
14
+ CleanupRegistry.unregister(el);
15
+ }
16
+ static polyfillConnectedCallback(el) {
17
+ console.debug(`${TabBar.name} ⚡️ connect`);
18
+ el.autofocus = true;
19
+ // Snapshot.waitReadyFor(el).then((r) => {
20
+ // if (!r) return
21
+ CleanupRegistry.register(el, onoff('click', TabBar.#handleClick, el).on());
22
+ CleanupRegistry.register(el, onoff(touchGlass(el, (t) => t, (evt) => {
23
+ const target = evt.target instanceof HTMLElement && evt.target;
24
+ if (!target)
25
+ return true;
26
+ if (target.matches('[is=tab-bar]'))
27
+ return false;
28
+ if (target.closest('tool-bar-item'))
29
+ return false;
30
+ return true;
31
+ }), el).on());
32
+ // })
33
+ }
34
+ static #handleClick = async (evt) => {
35
+ console.debug(`${TabBar.name} ⚡️ ${evt?.type}`);
36
+ const target = evt.target instanceof HTMLElement && evt.target;
37
+ if (!target)
38
+ return;
39
+ if (target instanceof HTMLDialogElement && 'tab-bar' === target.getAttribute('is'))
40
+ target.close?.();
41
+ };
42
+ }
@@ -0,0 +1,7 @@
1
+ import { ButtonBase } from '../namespace-browser/base';
2
+ export declare class TabItem extends ButtonBase {
3
+ #private;
4
+ constructor();
5
+ static polyfillDisconnectedCallback(btn: HTMLButtonElement): void;
6
+ static polyfillConnectedCallback(btn: TabItem): void;
7
+ }