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

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 (243) hide show
  1. package/generated/buses/alert-dialog.d.ts +2 -0
  2. package/generated/buses/alert-dialog.js +1 -0
  3. package/generated/buses/confirmation-dialog.d.ts +2 -0
  4. package/generated/buses/confirmation-dialog.js +1 -0
  5. package/generated/buses/index.d.ts +6 -0
  6. package/generated/buses/index.js +6 -0
  7. package/generated/buses/lifecycle-observer.d.ts +2 -0
  8. package/generated/buses/lifecycle-observer.js +1 -0
  9. package/generated/client/index.d.ts +21 -10
  10. package/generated/client/index.js +177 -194
  11. package/generated/components/alert-dialog.d.ts +8 -0
  12. package/generated/components/alert-dialog.js +99 -0
  13. package/generated/components/body-view.js +5 -2
  14. package/generated/components/bordered-button.d.ts +10 -0
  15. package/generated/components/bordered-button.js +39 -3
  16. package/generated/components/bordered-prominent-button.d.ts +10 -0
  17. package/generated/components/bordered-prominent-button.js +39 -3
  18. package/generated/components/borderless-button.d.ts +9 -1
  19. package/generated/components/borderless-button.js +32 -11
  20. package/generated/components/color-scheme.d.ts +7 -0
  21. package/generated/components/color-scheme.js +54 -0
  22. package/generated/components/confirmation-dialog.d.ts +1 -1
  23. package/generated/components/confirmation-dialog.js +43 -32
  24. package/generated/components/content-unavailable-view.d.ts +24 -0
  25. package/generated/components/content-unavailable-view.js +81 -0
  26. package/generated/components/date-picker.d.ts +2 -12
  27. package/generated/components/date-picker.js +96 -65
  28. package/generated/components/disclosure-group.d.ts +5 -0
  29. package/generated/components/disclosure-group.js +18 -7
  30. package/generated/components/fine-tooltip.d.ts +7 -0
  31. package/generated/components/fine-tooltip.js +107 -0
  32. package/generated/components/form-view.d.ts +3 -0
  33. package/generated/components/form-view.js +8 -3
  34. package/generated/components/glass-button.d.ts +10 -0
  35. package/generated/components/glass-button.js +39 -3
  36. package/generated/components/glass-prominent-button.d.ts +10 -0
  37. package/generated/components/glass-prominent-button.js +39 -3
  38. package/generated/components/h-stack.d.ts +14 -0
  39. package/generated/components/h-stack.js +23 -0
  40. package/generated/components/image-view.d.ts +9 -0
  41. package/generated/components/image-view.js +64 -0
  42. package/generated/components/index.d.ts +11 -3
  43. package/generated/components/index.js +11 -3
  44. package/generated/components/label-view.d.ts +6 -1
  45. package/generated/components/label-view.js +40 -60
  46. package/generated/components/labeled-content.d.ts +9 -0
  47. package/generated/components/labeled-content.js +116 -0
  48. package/generated/components/list-view.d.ts +3 -0
  49. package/generated/components/list-view.js +20 -17
  50. package/generated/components/menu-view.d.ts +4 -1
  51. package/generated/components/menu-view.js +60 -51
  52. package/generated/components/navigation-large-title.js +9 -5
  53. package/generated/components/navigation-split-view.d.ts +4 -1
  54. package/generated/components/navigation-split-view.js +13 -6
  55. package/generated/components/navigation-stack.d.ts +4 -1
  56. package/generated/components/navigation-stack.js +16 -9
  57. package/generated/components/navigation-title.d.ts +1 -1
  58. package/generated/components/navigation-title.js +58 -55
  59. package/generated/components/picker-view.d.ts +32 -4
  60. package/generated/components/picker-view.js +924 -234
  61. package/generated/components/plain-button.js +5 -3
  62. package/generated/components/progress-view.d.ts +13 -0
  63. package/generated/components/progress-view.js +120 -0
  64. package/generated/components/screen-view.js +3 -1
  65. package/generated/components/scroll-view-proxy.d.ts +8 -0
  66. package/generated/components/scroll-view-proxy.js +17 -0
  67. package/generated/components/scroll-view.d.ts +1 -1
  68. package/generated/components/scroll-view.js +101 -85
  69. package/generated/components/search-view.d.ts +7 -0
  70. package/generated/components/search-view.js +30 -0
  71. package/generated/components/section-view.d.ts +1 -1
  72. package/generated/components/section-view.js +35 -30
  73. package/generated/components/sheet-view.d.ts +1 -2
  74. package/generated/components/sheet-view.js +32 -39
  75. package/generated/components/sidebar-toggle.js +44 -66
  76. package/generated/components/sidebar-view.js +13 -8
  77. package/generated/components/sticky-container.js +8 -4
  78. package/generated/components/tab-bar.d.ts +3 -0
  79. package/generated/components/tab-bar.js +20 -10
  80. package/generated/components/tab-item.js +24 -13
  81. package/generated/components/tab-view.js +25 -17
  82. package/generated/components/table-view.d.ts +5 -0
  83. package/generated/components/table-view.js +55 -77
  84. package/generated/components/text-field.d.ts +2 -2
  85. package/generated/components/text-field.js +95 -88
  86. package/generated/components/toggle-view.d.ts +28 -0
  87. package/generated/components/toggle-view.js +224 -0
  88. package/generated/components/tool-bar-item-group.js +21 -4
  89. package/generated/components/tool-bar-item.d.ts +4 -1
  90. package/generated/components/tool-bar-item.js +57 -10
  91. package/generated/components/tool-bar.d.ts +12 -0
  92. package/generated/components/tool-bar.js +27 -11
  93. package/generated/components/v-keyboard.d.ts +3 -1
  94. package/generated/components/v-keyboard.js +12 -6
  95. package/generated/components/v-stack.d.ts +12 -0
  96. package/generated/components/v-stack.js +17 -2
  97. package/generated/css/index.css +2533 -941
  98. package/generated/events/alert-dialog.d.ts +8 -0
  99. package/generated/events/alert-dialog.js +1 -0
  100. package/generated/events/confirmation-dialog.d.ts +2 -2
  101. package/generated/events/index.d.ts +2 -0
  102. package/generated/events/index.js +2 -0
  103. package/generated/events/picker-view.d.ts +7 -0
  104. package/generated/events/scroll-view.js +4 -0
  105. package/generated/events/tab-view.d.ts +6 -2
  106. package/generated/events/text-field.js +3 -0
  107. package/generated/events/toggle-view.d.ts +9 -0
  108. package/generated/events/toggle-view.js +4 -0
  109. package/generated/i18n/index.d.ts +20 -10
  110. package/generated/i18n/index.js +82 -54
  111. package/generated/i18n/locales/el.d.ts +16 -0
  112. package/generated/i18n/locales/el.js +16 -0
  113. package/generated/i18n/locales/en.d.ts +16 -0
  114. package/generated/i18n/locales/en.js +16 -0
  115. package/generated/i18n/locales/index.d.ts +4 -0
  116. package/generated/i18n/locales/index.js +4 -0
  117. package/generated/internal/class/css-style-observer.js +3 -2
  118. package/generated/internal/class/form-associated-base.d.ts +0 -4
  119. package/generated/internal/class/form-associated-base.js +23 -38
  120. package/generated/internal/class/mutation-observer-set.d.ts +9 -0
  121. package/generated/internal/class/mutation-observer-set.js +42 -0
  122. package/generated/internal/class/mutation-observer-singleton.js +18 -0
  123. package/generated/internal/class/navigation-view.d.ts +1 -1
  124. package/generated/internal/class/navigation-view.js +38 -43
  125. package/generated/internal/decorators/adaptive-slot.d.ts +1 -0
  126. package/generated/internal/decorators/adaptive-slot.js +50 -0
  127. package/generated/internal/decorators/custom-element.d.ts +1 -1
  128. package/generated/internal/decorators/custom-element.js +2 -1
  129. package/generated/internal/decorators/index.d.ts +6 -0
  130. package/generated/internal/decorators/index.js +6 -0
  131. package/generated/internal/decorators/microtask-on-connected.d.ts +39 -0
  132. package/generated/internal/decorators/microtask-on-connected.js +67 -0
  133. package/generated/internal/privateNamespace.d.ts +10 -0
  134. package/generated/internal/privateNamespace.js +168 -1
  135. package/generated/internal/utils/cash/index.d.ts +4 -3
  136. package/generated/internal/utils/cash/index.js +6 -4
  137. package/generated/internal/utils/dev-flags.d.ts +3 -0
  138. package/generated/internal/utils/dev-flags.js +5 -0
  139. package/generated/internal/utils/ensure-placeholder.d.ts +1 -0
  140. package/generated/internal/utils/ensure-placeholder.js +55 -0
  141. package/generated/internal/utils/index.d.ts +7 -2
  142. package/generated/internal/utils/index.js +9 -2
  143. package/generated/internal/utils/is-inside.d.ts +1 -0
  144. package/generated/internal/utils/is-inside.js +4 -0
  145. package/generated/internal/utils/list-active.js +67 -12
  146. package/generated/internal/utils/render-label-icon.d.ts +2 -0
  147. package/generated/internal/utils/render-label-icon.js +19 -0
  148. package/generated/internal/utils/render-label-title.d.ts +2 -0
  149. package/generated/internal/utils/render-label-title.js +16 -0
  150. package/generated/internal/utils/render-label.d.ts +1 -0
  151. package/generated/internal/utils/render-label.js +19 -0
  152. package/generated/internal/utils/touch-glass.js +5 -5
  153. package/generated/namespace-browser/base.d.ts +12 -3
  154. package/generated/namespace-browser/base.js +41 -18
  155. package/generated/namespace-browser/event.d.ts +10 -0
  156. package/generated/namespace-browser/event.js +1 -0
  157. package/generated/snapshot/index.d.ts +3 -1
  158. package/generated/snapshot/index.js +25 -2
  159. package/generated/tpl/html.d.ts +5 -0
  160. package/generated/tpl/html.js +3 -0
  161. package/generated/tpl/index.d.ts +4 -0
  162. package/generated/tpl/index.js +4 -0
  163. package/generated/tpl/render.d.ts +2 -0
  164. package/generated/tpl/render.js +132 -0
  165. package/package.json +18 -4
  166. package/scss/_components.scss +14 -0
  167. package/scss/_functions.scss +10 -0
  168. package/scss/_mixins.scss +4 -0
  169. package/scss/_transitions.scss +6 -1
  170. package/scss/_vars.scss +9 -2
  171. package/scss/base/_layout.scss +17 -7
  172. package/scss/base/_reboot.scss +34 -1
  173. package/scss/base/_root.scss +117 -114
  174. package/scss/colors/_index.scss +304 -85
  175. package/scss/components/_alert-dialog.scss +111 -0
  176. package/scss/components/_bordered-button.scss +35 -0
  177. package/scss/components/_bordered-prominent-button.scss +45 -0
  178. package/scss/components/_borderless-button.scss +25 -0
  179. package/scss/components/_confirmation-dialog.scss +41 -49
  180. package/scss/components/_content-unavailable-view.scss +56 -0
  181. package/scss/components/_date-picker.scss +15 -15
  182. package/scss/components/_detail-placeholder.scss +1 -3
  183. package/scss/components/_disclosure-group.scss +84 -33
  184. package/scss/components/_fine-tooltip.scss +84 -0
  185. package/scss/components/_form-view.scss +58 -20
  186. package/scss/components/_glass-button.scss +35 -0
  187. package/scss/components/_glass-prominent-button.scss +46 -0
  188. package/scss/components/_group-box.scss +27 -0
  189. package/scss/components/_h-flex-stack.scss +23 -0
  190. package/scss/components/_h-stack.scss +21 -15
  191. package/scss/components/_image-view.scss +20 -0
  192. package/scss/components/_index.scss +40 -20
  193. package/scss/components/_label-view copy.scss.txt +420 -0
  194. package/scss/components/_label-view.scss +94 -110
  195. package/scss/components/_label-view.scss.txt +536 -0
  196. package/scss/components/_labeled-content.scss +59 -1
  197. package/scss/components/_list-view.scss +65 -25
  198. package/scss/components/_menu-view.scss +95 -60
  199. package/scss/components/_navigation-large-title.scss +17 -0
  200. package/scss/components/_navigation-split-view.scss +3 -3
  201. package/scss/components/_picker-view.scss +259 -59
  202. package/scss/components/_plain-button.scss +7 -0
  203. package/scss/components/_progress-view.scss +98 -0
  204. package/scss/components/_scroll-view-proxy.scss +22 -20
  205. package/scss/components/_scroll-view.scss +4 -0
  206. package/scss/components/_search-view.scss +22 -0
  207. package/scss/components/_section-view.scss +23 -22
  208. package/scss/components/_sheet-view.scss +16 -6
  209. package/scss/components/_sidebar-toggle.scss +1 -4
  210. package/scss/components/_sticky-container.scss +1 -1
  211. package/scss/components/_tab-bar.scss +17 -3
  212. package/scss/components/_tab-view.scss +4 -2
  213. package/scss/components/_table-column.scss +2 -0
  214. package/scss/components/_table-row.scss +69 -1
  215. package/scss/components/_table-view.scss +22 -14
  216. package/scss/components/_text-field.scss +37 -17
  217. package/scss/components/_toggle-view.scss +112 -0
  218. package/scss/components/_tool-bar-item.scss +34 -82
  219. package/scss/components/_tool-bar.scss +77 -57
  220. package/scss/components/_v-stack.scss +9 -2
  221. package/scss/final/_touch-glass.scss +24 -0
  222. package/scss/mixins/_button.scss +44 -0
  223. package/scss/mixins/_color.scss +16 -0
  224. package/scss/mixins/_dialog.scss +1 -0
  225. package/scss/mixins/_index.scss +64 -2
  226. package/scss/placeholders/_buttons.scss +44 -10
  227. package/scss/placeholders/_lists.scss +133 -126
  228. package/scss/transitions/_alert-dialog.scss +18 -0
  229. package/scss/transitions/_confirmation-dialog.scss +8 -0
  230. package/scss/transitions/_fine-tooltip.scss +21 -0
  231. package/scss/transitions/_menu-view.scss +17 -15
  232. package/scss/transitions/_progress-view.scss +23 -0
  233. package/scss/transitions/_sheet-view.scss +30 -0
  234. package/scss/transitions/_tab-bar.scss +6 -5
  235. package/scss/utils/_frame.scss +42 -0
  236. package/scss/utils/_index.scss +67 -52
  237. package/scss/utils/_stacks.scss +56 -73
  238. package/web-components.html-data/en.json +623 -24
  239. package/generated/confirmation-dialog/index.d.ts +0 -1
  240. package/generated/confirmation-dialog/index.js +0 -1
  241. package/generated/lifecycle-observer/index.d.ts +0 -1
  242. package/generated/lifecycle-observer/index.js +0 -1
  243. package/scss/transitions/_dialog.scss +0 -28
@@ -1,7 +1,7 @@
1
1
  var _a;
2
+ import { lifecycleObserver } from '../../buses';
2
3
  import { CleanupRegistry } from '../../internal/class/cleanup-registry';
3
- import { LifecycleObserver } from '../../lifecycle-observer';
4
- import { frame, onoff } from '../utils';
4
+ import { devFlags, frame, onoff } from '../utils';
5
5
  export class NavigationView extends HTMLElement {
6
6
  static get observedAttributes() {
7
7
  return ['hidden'];
@@ -11,30 +11,6 @@ export class NavigationView extends HTMLElement {
11
11
  constructor() {
12
12
  super();
13
13
  }
14
- disconnectedCallback() {
15
- CleanupRegistry.unregister(this);
16
- this.#recentBefore = undefined;
17
- // this.removeEventListener('tabreveal', this.#handleTabReveal)
18
- if (this.closest('tab-view'))
19
- frame().then(() => LifecycleObserver.dispatchEvent(new CustomEvent('tabhide', { detail: { tag: this.id }, bubbles: true, composed: true })));
20
- }
21
- connectedCallback() {
22
- if (this.closest('tab-view')) {
23
- // frame(this).then((r) => {
24
- // if (!r) return
25
- // this.dispatchEvent(new CustomEvent<TabDetail>('tabshow', { detail: { tag: this.id }, bubbles: true, composed: true }))
26
- // })
27
- CleanupRegistry.register(this, onoff('beforetabreveal beforetabswap', this.#handleBeforeTabRevealOrSwap, this).on());
28
- }
29
- // Snapshot.waitReady.then(async () => {
30
- if (this.hasAttribute('hidden'))
31
- return; // will be picked up by attr-change!
32
- if (this.closest('tab-view'))
33
- frame(this).then(() => {
34
- // if (!r) return
35
- LifecycleObserver.dispatchEvent(new CustomEvent('tabshow', { detail: { tag: this.id }, bubbles: true, composed: true }));
36
- });
37
- }
38
14
  attributeChangedCallback(name, oldValue, newValue) {
39
15
  switch (name) {
40
16
  case 'hidden':
@@ -42,36 +18,55 @@ export class NavigationView extends HTMLElement {
42
18
  break;
43
19
  if (!this.closest('tab-view'))
44
20
  break; // tabview stuff
45
- let eventType = this.hasAttribute(name) ? 'tabshow' : 'tabhide', target = LifecycleObserver;
21
+ // trigger show/hide/reveal/swap on NEXT tick
22
+ // show/hide run on initial render too (show on NEXT tick, is also taken care of on connected on initial render)
23
+ let eventType = this.hasAttribute(name) ? 'tabhide' : 'tabshow', target = lifecycleObserver;
46
24
  // isRecent by 100ms window
47
- if (this.#recentBefore && performance.now() - this.#recentBefore.time <= 100) {
48
- if (this.#recentBefore.type === 'beforetabreveal') {
49
- eventType = 'tabreveal';
50
- target = this;
51
- }
52
- else if (this.#recentBefore.type === 'beforetabswap') {
53
- eventType = 'tabswap';
25
+ // && performance.now() - this.#recentBefore.time <= 100) {
26
+ if (this.#recentBefore) {
27
+ if (['beforetabreveal', 'beforetabswap'].includes(this.#recentBefore.type)) {
28
+ eventType = this.#recentBefore.type === 'beforetabreveal' ? 'tabreveal' : 'tabswap';
54
29
  target = this;
55
30
  }
56
31
  // consume it (important so it doesn’t leak to next change)
57
32
  this.#recentBefore = undefined;
58
33
  }
59
- console.debug(`${_a.name} 💡 ${eventType}`);
60
- frame(this).then(() => {
61
- // if (!r) return
62
- target.dispatchEvent(new CustomEvent(eventType, { detail: { tag: this.id }, bubbles: true, composed: true }));
63
- });
34
+ if (devFlags.debug)
35
+ console.debug(`${_a.name} 💡 ${eventType}`);
36
+ frame(this).then(() => target.dispatchEvent(new CustomEvent(eventType, { detail: { tag: this.id }, bubbles: true, composed: true })));
64
37
  break;
65
38
  }
66
39
  }
67
- #handleBeforeTabRevealOrSwap = (evt) => {
68
- console.debug(`${_a.name} ⚡️ ${evt?.type}`);
69
- if (this.id !== evt.detail?.tag)
40
+ disconnectedCallback() {
41
+ CleanupRegistry.unregister(this);
42
+ this.#recentBefore = undefined;
43
+ // trigger hide on NEXT tick
44
+ if (!this.closest('tab-view'))
45
+ return;
46
+ frame().then(() => lifecycleObserver.dispatchEvent(new CustomEvent('tabhide', { detail: { tag: this.id }, bubbles: true, composed: true })));
47
+ }
48
+ connectedCallback() {
49
+ if (!this.closest('tab-view'))
50
+ return;
51
+ // wire befores
52
+ CleanupRegistry.register(this, onoff('beforetabreveal beforetabswap', this.#handleBeforeTabRevealOrSwap, this).on());
53
+ // trigger show on NEXT tick
54
+ if (this.hasAttribute('hidden'))
55
+ return; // skip if already rendered by attr-change during upgrade!
56
+ frame(this).then(() => lifecycleObserver.dispatchEvent(new CustomEvent('tabshow', { detail: { tag: this.id }, bubbles: true, composed: true })));
57
+ }
58
+ #handleBeforeTabRevealOrSwap = ({ type, detail }) => {
59
+ if (devFlags.debug)
60
+ console.debug(`${_a.name} ⚡️ ${type}`);
61
+ if (this.id !== detail?.tag)
70
62
  return;
71
63
  this.#recentBefore = {
72
- type: evt.type, // beforetabreveal / beforetabswap
64
+ type, // beforetabreveal / beforetabswap
73
65
  time: performance.now(),
74
66
  };
67
+ self.queueMicrotask(() => {
68
+ this.#recentBefore = undefined;
69
+ }); // auto-expire after current task
75
70
  };
76
71
  }
77
72
  _a = NavigationView;
@@ -0,0 +1 @@
1
+ export default function (filter?: (el: HTMLElement) => boolean): <T extends CustomElementConstructor>(Base: T, _context?: ClassDecoratorContext<T>) => void;
@@ -0,0 +1,50 @@
1
+ import { Snapshot } from '../../snapshot';
2
+ import { CleanupRegistry } from '../class/cleanup-registry';
3
+ import { devFlags, onoff } from '../utils';
4
+ export default function (filter) {
5
+ const handleMediaChange = (el, { type, matches }) => {
6
+ if (devFlags.debug)
7
+ console.debug(`${el.localName} ⚡️ ${type}`);
8
+ if (matches) {
9
+ if (!el.matches(`[slot="cancellation-action"],[slot="primary-action"],[slot="confirmation-action"],[slot="destructive-action"]`))
10
+ return;
11
+ const newSlot = ['destructive-action'].includes(el.slot) ? 'bottom-bar-leading' : 'bottom-bar-trailing';
12
+ if (el.slot !== newSlot)
13
+ el.dataset.previousSlot = el.slot;
14
+ el.slot = newSlot;
15
+ }
16
+ else {
17
+ if (!el.matches(`[data-previous-slot]`))
18
+ return;
19
+ el.slot = el.dataset.previousSlot ?? '';
20
+ delete el.dataset.previousSlot;
21
+ }
22
+ };
23
+ return function (Base, _context) {
24
+ const originalConnected = Base.prototype.connectedCallback, originalDisconnected = Base.prototype.disconnectedCallback;
25
+ Base.prototype.connectedCallback = function () {
26
+ if (devFlags.debug)
27
+ console.debug(`decorator:[${this.localName}] ⚡️ connect`);
28
+ originalConnected?.call(this);
29
+ if (filter && !filter(this))
30
+ return;
31
+ if (!this.closest('[is=sheet-view]'))
32
+ return;
33
+ if (!self.matchMedia('(pointer: fine)').matches)
34
+ return;
35
+ const handler1 = handleMediaChange.bind(null, this);
36
+ CleanupRegistry.register(this, onoff('fine_dialog_sheet:change', handler1, Snapshot.on).on(), 'adaptive-slot');
37
+ Snapshot.waitReady.then(() => {
38
+ handleMediaChange(this, new MediaQueryListEvent(`media-change`, {
39
+ matches: Snapshot.breakpoints?.get('fine_dialog_sheet'),
40
+ })); // Initial check
41
+ });
42
+ };
43
+ Base.prototype.disconnectedCallback = function () {
44
+ if (devFlags.debug)
45
+ console.debug(`decorator:[${this.localName}] ⚡️ disconnect`);
46
+ originalDisconnected?.call(this);
47
+ CleanupRegistry.unregister(this, 'adaptive-slot');
48
+ };
49
+ };
50
+ }
@@ -1,4 +1,4 @@
1
- export declare function customElement<T extends {
1
+ export default function <T extends {
2
2
  new (...args: any[]): {};
3
3
  }>(constructor: T): {
4
4
  new (...args: any[]): {};
@@ -1,4 +1,5 @@
1
- export function customElement(constructor) {
1
+ // https://www.typescriptlang.org/docs/handbook/decorators.html
2
+ export default function (constructor) {
2
3
  return class extends constructor {
3
4
  };
4
5
  }
@@ -0,0 +1,6 @@
1
+ export { default as adaptiveSlot } from './adaptive-slot';
2
+ export * from './adaptive-slot';
3
+ export { default as customElement } from './custom-element';
4
+ export * from './custom-element';
5
+ export { default as microtaskOnConnected } from './microtask-on-connected';
6
+ export * from './microtask-on-connected';
@@ -0,0 +1,6 @@
1
+ export { default as adaptiveSlot } from './adaptive-slot';
2
+ export * from './adaptive-slot';
3
+ export { default as customElement } from './custom-element';
4
+ export * from './custom-element';
5
+ export { default as microtaskOnConnected } from './microtask-on-connected';
6
+ export * from './microtask-on-connected';
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Replacement for this
3
+ class() {
4
+ #pendingSync = false
5
+ #scheduleSync() {
6
+ if (this.#pendingSync) return
7
+ this.#pendingSync = true
8
+ self.queueMicrotask(() => {
9
+ this.#pendingSync = false
10
+ this.#syncSibling()
11
+ })
12
+ }
13
+ #syncSibling = () => {
14
+ const sibling = this.closest<ScrollView>('scroll-view'),
15
+ value = this.getAttribute('value'),
16
+ subtitle = this.getAttribute('subtitle')
17
+
18
+ if (null === value) sibling?.removeAttribute('navigation-inline-title')
19
+ else sibling?.setAttribute('navigation-inline-title', value)
20
+
21
+ if (null === subtitle) sibling?.removeAttribute('navigation-inline-subtitle')
22
+ else sibling?.setAttribute('navigation-inline-subtitle', subtitle)
23
+ }
24
+ }
25
+ connectedCallback() {
26
+ if (devFlags.debug) console.debug(`${NavigationTitle.name} ⚡️ connect`)
27
+
28
+ this.#scheduleSync()
29
+ }
30
+
31
+ attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null) {
32
+ if (devFlags.debug) console.debug(`${NavigationTitle.name} ⚡️ attr-change [${name}] ("${oldValue}" → "${newValue}")`)
33
+
34
+ this.#scheduleSync()
35
+
36
+ this.#render(this.getAttribute('value'), this.getAttribute('subtitle'))
37
+ }
38
+ */
39
+ export default function <T extends HTMLElement>(fn: (el: T) => void): <C extends CustomElementConstructor>(Base: C, _context?: ClassDecoratorContext<C>) => void;
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Replacement for this
3
+ class() {
4
+ #pendingSync = false
5
+ #scheduleSync() {
6
+ if (this.#pendingSync) return
7
+ this.#pendingSync = true
8
+ self.queueMicrotask(() => {
9
+ this.#pendingSync = false
10
+ this.#syncSibling()
11
+ })
12
+ }
13
+ #syncSibling = () => {
14
+ const sibling = this.closest<ScrollView>('scroll-view'),
15
+ value = this.getAttribute('value'),
16
+ subtitle = this.getAttribute('subtitle')
17
+
18
+ if (null === value) sibling?.removeAttribute('navigation-inline-title')
19
+ else sibling?.setAttribute('navigation-inline-title', value)
20
+
21
+ if (null === subtitle) sibling?.removeAttribute('navigation-inline-subtitle')
22
+ else sibling?.setAttribute('navigation-inline-subtitle', subtitle)
23
+ }
24
+ }
25
+ connectedCallback() {
26
+ if (devFlags.debug) console.debug(`${NavigationTitle.name} ⚡️ connect`)
27
+
28
+ this.#scheduleSync()
29
+ }
30
+
31
+ attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null) {
32
+ if (devFlags.debug) console.debug(`${NavigationTitle.name} ⚡️ attr-change [${name}] ("${oldValue}" → "${newValue}")`)
33
+
34
+ this.#scheduleSync()
35
+
36
+ this.#render(this.getAttribute('value'), this.getAttribute('subtitle'))
37
+ }
38
+ */
39
+ // const _sync = Symbol('sync')
40
+ // @microtaskOnConnected((el) => (el as NavigationTitle)[_sync]())
41
+ // attributeChangedCallback fires
42
+ // → originalAttrChanged (your #render) runs synchronously ✅
43
+ // → schedule() queues microtask
44
+ // → microtask flush: syncToScrollView runs with already-updated attrs ✅
45
+ export default function (fn) {
46
+ return function (Base, _context) {
47
+ const originalConnected = Base.prototype.connectedCallback, originalAttrChanged = Base.prototype.attributeChangedCallback;
48
+ Base.prototype.connectedCallback = function () {
49
+ originalConnected?.call(this);
50
+ schedule(this, fn);
51
+ };
52
+ Base.prototype.attributeChangedCallback = function (name, oldValue, newValue) {
53
+ originalAttrChanged?.call(this, name, oldValue, newValue);
54
+ schedule(this, fn);
55
+ };
56
+ };
57
+ }
58
+ const pendingMap = new WeakMap();
59
+ function schedule(el, fn) {
60
+ if (pendingMap.get(el))
61
+ return;
62
+ pendingMap.set(el, true);
63
+ self.queueMicrotask(() => {
64
+ pendingMap.delete(el);
65
+ fn(el);
66
+ });
67
+ }
@@ -1,4 +1,14 @@
1
1
  import type * as Components from '../components';
2
+ import { NavigationPath } from '../internal/class/navigation-path';
3
+ type TransitionType = 'forwards' | 'backwards' | 'reload';
2
4
  export type NavigationHost = Components.BodyView | Components.SheetView | Components.NavigationStack | Components.NavigationSplitView;
3
5
  export type NavigationToolbarConfiguration = Components.ToolBarItem | Components.ToolBarItemGroup;
4
6
  export type NavigationPage = Components.SidebarView | Components.ScrollView;
7
+ export declare function queryInsertPosition(frame: NavigationHost): "afterend" | "beforebegin";
8
+ type UpdateCallback = () => void | Promise<void>;
9
+ type NavigateOptions = {
10
+ updateCallback?: UpdateCallback;
11
+ tos?: () => NavigationPath[];
12
+ };
13
+ export declare const startViewTransition: (target: HTMLElement, type?: TransitionType, updateCallbackOrOptions?: UpdateCallback | NavigateOptions) => Promise<void>;
14
+ export {};
@@ -1 +1,168 @@
1
- export {};
1
+ import { NavigationPath } from '../internal/class/navigation-path';
2
+ import { devFlags } from '../internal/utils';
3
+ import { Snapshot } from '../snapshot';
4
+ export function queryInsertPosition(frame) {
5
+ if ('NAVIGATION-SPLIT-VIEW' === frame?.tagName)
6
+ return 'beforebegin'; // lookFor = 'previousElementSibling'
7
+ else if ('NAVIGATION-SPLIT-VIEW' === frame?.parentElement?.tagName && frame?.parentElement.querySelector(':scope>[is=sidebar-view]') && 'BODY-VIEW' === frame?.tagName)
8
+ return 'beforebegin'; // lookFor = 'previousElementSibling'
9
+ return 'afterend'; // lookFor = 'nextElementSibling'
10
+ }
11
+ const cleanup = (lm, type) => {
12
+ let arr = [Snapshot.config['vt-fwd-class-name'], 'fwdd', 'fwn', 'fwnn', 'bwd', 'bwdd', 'bwn', 'bwnn'];
13
+ if (['backwards', 'forwards'].includes(type ?? ''))
14
+ for (let i = arr.length - 1; i >= 0; i--)
15
+ if (arr[i].startsWith('backwards' === type ? 'fw' : 'bw'))
16
+ arr.splice(i, 1);
17
+ for (const el of [...(lm?.querySelectorAll(arr.map((v) => `.${v}`).join(',')) ?? [])])
18
+ el.classList.remove(...arr);
19
+ };
20
+ export const startViewTransition = async (target, type = 'forwards', updateCallbackOrOptions = async () => { }) => {
21
+ if (devFlags.debug)
22
+ console.debug(`startViewTransition (${type})`, target);
23
+ if (!(target instanceof HTMLElement))
24
+ throw new TypeError("Argument 1 ('target') to client.startViewTransition must be an instance of HTMLElement");
25
+ if (!['forwards', 'backwards', 'reload'].includes(type))
26
+ throw new TypeError("Argument 2 ('type') to client.startViewTransition must be of TransitionType");
27
+ const options = typeof updateCallbackOrOptions === 'function'
28
+ ? {
29
+ updateCallback: updateCallbackOrOptions,
30
+ }
31
+ : (updateCallbackOrOptions ?? {}), updateCallback = options.updateCallback ?? (async () => { });
32
+ await Snapshot.waitReady;
33
+ const from = new NavigationPath(target); //const from = closestBody(target) //event.target as HTMLElement)
34
+ if ('forwards' === type) {
35
+ await updateCallback(); // updatetheDOMSomehow
36
+ // Snapshot.getSnapshot(from)
37
+ // const root = getRootViewController(from)
38
+ // const oldPath = new NavigationPath(from)
39
+ const root = [from, ...from.parents()]
40
+ .map((item) => item.component)
41
+ .filter(Boolean)
42
+ .at(-1);
43
+ // const { toolBarConfig: oldToolbars } = getComputedView(from) // const { toolBarConfig: oldToolbars, slot: oldSLot, page: oldPage } = getComputedView(from) //
44
+ // console.log(88, oldPage, oldPath.page, oldSLot, oldPath.slot, oldToolbars, oldPath.toolBarConfig)
45
+ // const oldToolbars = Snapshot.toolbarItems
46
+ // const { toolBarConfig: oldToolbars, host: oldHost } = getComputedView(from)
47
+ const tos = options.tos?.() ?? [...from.children()].map((item) => item?.hydrate()), //queryBodyAll(oldSLot), //[...oldPath.children()].map((item) => item.body).filter(Boolean),//
48
+ to = tos.at(-1),
49
+ // to = newPath?.body, //tos.slice(-1)?.pop?.(), //Snapshot.leaf, //
50
+ // newHost = newPath?.component, //{ host: newHost } = getComputedView(to),
51
+ newToolbars = tos.flatMap((item) => item.toolBarConfig ?? []).filter((item) => !!item),
52
+ // .map((item) => item.toolBarConfig)
53
+ // .flat()
54
+ // .filter(Boolean), //queryToolbarConfigAll(oldSLot),
55
+ modalViews = tos.map((item) => item.component).filter((item) => !!item && item.matches('dialog')); //[...queryHostAll(oldPage)].filter?.((item) => item?.matches('dialog'))
56
+ // toFrame = Snapshot.leafContainer, //queryHostAll(from).slice(-1)?.pop?.(),
57
+ // toToolbars = Snapshot.leafToolbarItems
58
+ // dialogFrames = [toFrame, ...(Snapshot.leaveFrames ?? [])].filter((item): item is HTMLDialogElement => item instanceof HTMLDialogElement) //[toFrame, ...(Snapshot.leaveFrames ?? [])].filter((item) => item?.matches('dialog'))
59
+ // if ('DIALOG' === newHost?.tagName) {
60
+ // ;(newHost as HTMLDialogElement).showModal()
61
+ // if (devFlags.debug) console.debug(`⚡️ view-transition-start (${type})`)
62
+ // await Promise.allSettled(newHost.getAnimations().map(({ finished }) => finished))
63
+ // if (devFlags.debug) console.debug(`⚡️ view-transition-end (${type})`)
64
+ // return
65
+ // }
66
+ // purge
67
+ cleanup(root, 'backwards');
68
+ // prepare old
69
+ from.body?.classList.add(Snapshot.config['vt-fwd-class-name']);
70
+ from.body?.dispatchEvent(new CustomEvent('pageswap', { detail: { page: from.body }, bubbles: true, composed: true }));
71
+ for (const oldToolbar of from.toolBarConfig ?? [])
72
+ oldToolbar.classList.add('fwn'); // prepare navbs
73
+ // prepare new
74
+ const toolbarExclusion = 0 < modalViews.length
75
+ ? (value, index, array) => value.parentElement?.matches('tool-bar:not(dialog tool-bar,body-view ~ tool-bar)')
76
+ : (value, index, array) => value.parentElement?.matches('tool-bar:not(body-view ~ tool-bar)'), bodyExclusion = 0 < modalViews.length ? (item) => item.body?.matches('scroll-view:not(dialog scroll-view)') : (value, index, array) => value;
77
+ for (const bti of newToolbars?.filter?.(toolbarExclusion) ?? [])
78
+ bti.classList.add('fwnn'); // for (const ti of newToolbars ?? []) ti.classList.add('fwnn') //
79
+ for (const bt of tos?.filter?.(bodyExclusion) ?? []) {
80
+ bt.body?.classList.add('fwdd'); //to?.classList.add('fwdd')
81
+ bt.body?.dispatchEvent(new CustomEvent('pagereveal', { detail: { page: bt.body }, bubbles: true, composed: true }));
82
+ }
83
+ if (0 < modalViews.length) {
84
+ for await (const el of modalViews)
85
+ el.showModal();
86
+ if (devFlags.debug)
87
+ console.debug(`⚡️ view-dialog-transition-start (${type})`);
88
+ await Promise.allSettled(modalViews?.[0].getAnimations().map(({ finished }) => finished));
89
+ if (devFlags.debug)
90
+ console.debug(`⚡️ view-dialog-transition-end (${type})`);
91
+ }
92
+ else {
93
+ if (devFlags.debug)
94
+ console.debug(`⚡️ view-transition-start (${type})`);
95
+ await Promise.allSettled([...(from.body?.getAnimations().map(({ finished }) => finished) ?? []), ...(to?.body?.getAnimations().map(({ finished }) => finished) ?? [])]);
96
+ if (devFlags.debug)
97
+ console.debug(`⚡️ view-transition-end (${type})`);
98
+ }
99
+ if (0 < (to?.component?.querySelectorAll(`.${Snapshot.config?.['vt-fwd-class-name']},.bwd`) ?? []).length)
100
+ return;
101
+ cleanup(root);
102
+ }
103
+ else {
104
+ // Snapshot.getSnapshot(from)
105
+ // const oldPath = new NavigationPath(from)
106
+ const root = [from, ...from.parents()]
107
+ .map((item) => item.component)
108
+ .filter(Boolean)
109
+ .at(-1); // const root = getRootViewController(from)
110
+ //const { toolBarConfig: oldToolbars, host: oldHost, page: oldPage, slot: oldSlot } = getComputedView(from)
111
+ const froms = [...from.children()].map((item) => item?.hydrate());
112
+ const oldToolbars = froms.flatMap((item) => item.toolBarConfig ?? []).filter((item) => !!item), oldBodies = froms.map((item) => item.body).filter((item) => !!item);
113
+ // console.log(99, queryToolbarConfigAll(oldSlot), oldToolbars)
114
+ // if most-top effect is closing a modal, skip everything
115
+ if ('DIALOG' === from.component?.tagName) {
116
+ from.body?.dispatchEvent(new CustomEvent('pageswap', { detail: { page: from.body }, bubbles: true, composed: true }));
117
+ from.component.close();
118
+ if (devFlags.debug)
119
+ console.debug(`⚡️ view-dialog-transition-start (${type})`);
120
+ await Promise.allSettled(from.component.getAnimations().map(({ finished }) => finished));
121
+ if (devFlags.debug)
122
+ console.debug(`⚡️ view-dialog-transition-end (${type})`);
123
+ if (from.component.matches('[open]'))
124
+ return;
125
+ await updateCallback();
126
+ return; // just close modal
127
+ }
128
+ const to = [...from.parents()].at(0)?.hydrate(); //closestBody(oldPath.component?.parentElement ?? undefined)
129
+ if (!to)
130
+ return console.debug('Can not go backwards.'); // nothing to go back to
131
+ const tv = to.body?.closest('tab-view');
132
+ if (tv && to.body?.matches('tab-view>navigation-stack:has(> navigation-stack,> navigation-split-view)>:scope'))
133
+ if ('bottom-bar' !== tv.tabBarPlacement)
134
+ return;
135
+ // const { toolBarConfig: newToolbars } = getComputedView(to.body)
136
+ // purge
137
+ cleanup(root, 'forwards');
138
+ // prepare new
139
+ for (const ti of to.toolBarConfig ?? [])
140
+ ti.classList.add('bwnn');
141
+ to.body?.classList.add('bwdd');
142
+ to.body?.dispatchEvent(new CustomEvent('pagereveal', { detail: { page: to.body }, bubbles: true, composed: true }));
143
+ // prepare old
144
+ const inbetweenModals = froms.map((item) => item.component).filter((item) => !!item && item.matches('dialog[open]')), //queryHostAll(oldPage).filter?.((item) => item.matches('dialog[open]')) ?? [], // FIXME: TEst this, added oldHost too
145
+ toolbarExclusion = 0 < inbetweenModals.length
146
+ ? (value, index, array) => value.parentElement?.matches('tool-bar:not(dialog tool-bar)')
147
+ : (value, index, array) => value, bodyExclusion = 0 < inbetweenModals.length ? (item) => item?.matches('scroll-view:not(dialog scroll-view)') : (item) => item;
148
+ for (const ti of [...(from.toolBarConfig ?? []), ...(oldToolbars?.filter?.(toolbarExclusion) ?? [])])
149
+ ti.classList.add('bwn');
150
+ for (const nn of [from.body, ...oldBodies?.filter?.(bodyExclusion)]) {
151
+ nn?.classList.add('bwd'); //from?.classList.add('bwd')
152
+ nn?.dispatchEvent(new CustomEvent('pageswap', { detail: { page: nn }, bubbles: true, composed: true }));
153
+ }
154
+ for (const el of inbetweenModals)
155
+ el.close(); // close old inbetween modals
156
+ // capture trans
157
+ if (devFlags.debug)
158
+ console.debug(`⚡️ view-transition-start (${type})`);
159
+ await Promise.allSettled([...(from.body?.getAnimations().map(({ finished }) => finished) ?? []), ...(to.body?.getAnimations().map(({ finished }) => finished) ?? [])]);
160
+ if (devFlags.debug)
161
+ console.debug(`⚡️ view-transition-end (${type})`);
162
+ if (to.body?.closest(`.bwd,.${Snapshot.config?.['vt-fwd-class-name']}`))
163
+ return;
164
+ cleanup(root);
165
+ // remove or hide
166
+ await updateCallback();
167
+ }
168
+ };
@@ -5,10 +5,11 @@ import prev from './prev';
5
5
  import prevAll from './prev-all';
6
6
  import prop from './prop';
7
7
  import siblings from './siblings';
8
- declare const DEFAULT: ":scope>:first-child";
8
+ declare const DEFAULT: ">1";
9
9
  interface CashFn {
10
- (innerHTML: string, selector?: typeof DEFAULT): Element;
11
- (innerHTML: string, selector: string): DocumentFragment;
10
+ (innerHTML: string): DocumentFragment;
11
+ <T extends Element = Element>(innerHTML: string, selector: typeof DEFAULT): T;
12
+ <T extends Element = Element>(innerHTML: string, selector: string): T;
12
13
  prop: typeof prop;
13
14
  nextAll: typeof nextAll;
14
15
  prevAll: typeof prevAll;
@@ -5,12 +5,14 @@ import prev from './prev';
5
5
  import prevAll from './prev-all';
6
6
  import prop from './prop';
7
7
  import siblings from './siblings';
8
- const DEFAULT = ':scope>:first-child';
9
- const cash = ((innerHTML, selector = DEFAULT) => {
8
+ const DEFAULT = '>1';
9
+ const cash = ((innerHTML, selector) => {
10
10
  const template = Object.assign(document.createElement('template'), { innerHTML });
11
+ if (!selector)
12
+ return template.content;
11
13
  if (selector === DEFAULT)
12
- return template.content.firstElementChild;
13
- return template.content;
14
+ return template.content.firstElementChild; // OVERKILL
15
+ return template.content.querySelector('>1' === selector ? ':first-child' : selector);
14
16
  });
15
17
  cash.prop = prop;
16
18
  cash.nextAll = nextAll;
@@ -0,0 +1,3 @@
1
+ export default class {
2
+ static get debug(): boolean;
3
+ }
@@ -0,0 +1,5 @@
1
+ export default class {
2
+ static get debug() {
3
+ return true;
4
+ }
5
+ }
@@ -0,0 +1 @@
1
+ export default function (target: HTMLElement | null, role: string | null, titleKey?: string | null): void;
@@ -0,0 +1,55 @@
1
+ import { I18n } from '../../i18n';
2
+ import { Snapshot } from '../../snapshot';
3
+ import { default as $ } from './cash';
4
+ function renderPlaceholder(el, role, titleKey) {
5
+ // if (!el.isConnected) return
6
+ // self.requestAnimationFrame(() => {
7
+ // if (!el.isConnected) return
8
+ const label = el.querySelector(':scope>[slot=placeholder]') ?? el.appendChild($(`<label-view slot="placeholder"></label-view>`, '>1'));
9
+ switch (role) {
10
+ case 'cancel':
11
+ label.setAttribute('title', titleKey && titleKey in I18n.t('ButtonRole') ? I18n.t('ButtonRole')[titleKey] : I18n.t('ButtonRole').Cancel);
12
+ label.setAttribute('system-image', Snapshot.config['cancel-button-icon']);
13
+ break;
14
+ case 'close':
15
+ if (label.closest('[is=alert-dialog]')) {
16
+ label.setAttribute('title', titleKey && titleKey in I18n.t('ButtonRole') ? I18n.t('ButtonRole')[titleKey] : I18n.t('ButtonRole').OK);
17
+ }
18
+ else {
19
+ label.setAttribute('title', titleKey && titleKey in I18n.t('ButtonRole') ? I18n.t('ButtonRole')[titleKey] : I18n.t('ButtonRole').Close);
20
+ label.setAttribute('system-image', Snapshot.config['close-button-icon']);
21
+ }
22
+ break;
23
+ case 'confirm':
24
+ label.setAttribute('title', titleKey && titleKey in I18n.t('ButtonRole') ? I18n.t('ButtonRole')[titleKey] : I18n.t('ButtonRole').Confirm);
25
+ label.setAttribute('system-image', Snapshot.config['confirm-button-icon']);
26
+ break;
27
+ case 'confirmation-action':
28
+ label.setAttribute('title', titleKey && titleKey in I18n.t('ButtonRole') ? I18n.t('ButtonRole')[titleKey] : I18n.t('ButtonRole').Confirm);
29
+ label.setAttribute('system-image', Snapshot.config['confirm-button-icon']);
30
+ break;
31
+ case 'cancellation-action':
32
+ label.setAttribute('title', titleKey && titleKey in I18n.t('ButtonRole') ? I18n.t('ButtonRole')[titleKey] : I18n.t('ButtonRole').Cancel);
33
+ label.setAttribute('system-image', Snapshot.config['cancel-button-icon']);
34
+ break;
35
+ case 'destructive':
36
+ label.setAttribute('title', titleKey && titleKey in I18n.t('ButtonRole') ? I18n.t('ButtonRole')[titleKey] : I18n.t('ButtonRole').Destructive);
37
+ label.setAttribute('system-image', Snapshot.config['delete-button-icon']);
38
+ break;
39
+ default:
40
+ label?.remove();
41
+ break;
42
+ }
43
+ // if (role) {
44
+ // label.setAttribute('title', I18n.t('ButtonRole').Default.Destructive)
45
+ // } else label?.remove()
46
+ // })
47
+ }
48
+ export default function (target, role, titleKey) {
49
+ if (!target)
50
+ return;
51
+ const overiderTitle = typeof titleKey === 'string' && titleKey in I18n.t('ButtonRole') ? titleKey : undefined;
52
+ renderPlaceholder(target, role, overiderTitle);
53
+ // CleanupRegistry.unregister(target, 'i18n')
54
+ // CleanupRegistry.register(target, onoff('localechange', () => renderPlaceholder(target, role, overiderTitle), I18n.on).on(), 'i18n')
55
+ }
@@ -1,17 +1,22 @@
1
- import cash from './cash';
2
1
  export { default as add } from './add';
2
+ export { default as $ } from './cash';
3
3
  export { default as clamp } from './clamp';
4
4
  export { default as compareBigDecimals } from './compare-big-decimals';
5
5
  export { default as cssTime } from './css-time';
6
6
  export { default as debounce } from './debounce';
7
+ export { default as devFlags } from './dev-flags';
8
+ export { default as ensurePlaceholder } from './ensure-placeholder';
7
9
  export { default as frame } from './frame';
10
+ export { default as isInside } from './is-inside';
8
11
  export { default as kebabCase } from './kebab-case';
9
12
  export { default as listActive } from './list-active';
10
13
  export { default as microtask } from './microtask';
11
14
  export { default as onoff } from './onoff';
15
+ export { default as renderLabel } from './render-label';
16
+ export { default as renderLabelIcon } from './render-label-icon';
17
+ export { default as renderLabelTitle } from './render-label-title';
12
18
  export { default as set } from './set';
13
19
  export { default as sleep } from './sleep';
14
20
  export { default as slowHideShow } from './slow-hide-show';
15
21
  export { default as timeout } from './timeout';
16
22
  export { default as touchGlass } from './touch-glass';
17
- export declare const $: typeof cash;