@swiftwc/ui 0.0.0-dev.11 → 0.0.0-dev.111

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 (301) hide show
  1. package/css-data/en.json +28 -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 +24 -10
  11. package/generated/client/index.js +179 -194
  12. package/generated/components/alert-dialog.d.ts +11 -0
  13. package/generated/components/alert-dialog.js +94 -0
  14. package/generated/components/body-view.d.ts +8 -0
  15. package/generated/components/body-view.js +6 -2
  16. package/generated/components/bordered-button.d.ts +10 -0
  17. package/generated/components/bordered-button.js +36 -3
  18. package/generated/components/bordered-prominent-button.d.ts +10 -0
  19. package/generated/components/bordered-prominent-button.js +36 -3
  20. package/generated/components/borderless-button.d.ts +9 -1
  21. package/generated/components/borderless-button.js +29 -11
  22. package/generated/components/color-scheme.d.ts +12 -0
  23. package/generated/components/color-scheme.js +51 -0
  24. package/generated/components/confirmation-dialog.d.ts +4 -1
  25. package/generated/components/confirmation-dialog.js +38 -32
  26. package/generated/components/content-unavailable.d.ts +30 -0
  27. package/generated/components/content-unavailable.js +79 -0
  28. package/generated/components/date-picker.d.ts +21 -15
  29. package/generated/components/date-picker.js +126 -88
  30. package/generated/components/detail-placeholder.d.ts +11 -0
  31. package/generated/components/detail-placeholder.js +15 -0
  32. package/generated/components/disclosure-group.d.ts +8 -0
  33. package/generated/components/disclosure-group.js +18 -7
  34. package/generated/components/fine-tooltip.d.ts +15 -0
  35. package/generated/components/fine-tooltip.js +108 -0
  36. package/generated/components/form-view.d.ts +10 -0
  37. package/generated/components/form-view.js +8 -3
  38. package/generated/components/glass-button.d.ts +10 -0
  39. package/generated/components/glass-button.js +36 -3
  40. package/generated/components/glass-prominent-button.d.ts +10 -0
  41. package/generated/components/glass-prominent-button.js +36 -3
  42. package/generated/components/h-divider.d.ts +11 -0
  43. package/generated/components/h-divider.js +15 -0
  44. package/generated/components/h-stack.d.ts +22 -0
  45. package/generated/components/h-stack.js +24 -0
  46. package/generated/components/image-view.d.ts +18 -0
  47. package/generated/components/image-view.js +65 -0
  48. package/generated/components/index.d.ts +15 -3
  49. package/generated/components/index.js +15 -3
  50. package/generated/components/label-view.d.ts +19 -1
  51. package/generated/components/label-view.js +63 -62
  52. package/generated/components/labeled-content.d.ts +33 -0
  53. package/generated/components/labeled-content.js +160 -0
  54. package/generated/components/list-view.d.ts +14 -0
  55. package/generated/components/list-view.js +12 -17
  56. package/generated/components/menu-view.d.ts +12 -1
  57. package/generated/components/menu-view.js +63 -65
  58. package/generated/components/navigation-large-title.d.ts +11 -0
  59. package/generated/components/navigation-large-title.js +11 -5
  60. package/generated/components/navigation-split-view.d.ts +9 -1
  61. package/generated/components/navigation-split-view.js +10 -6
  62. package/generated/components/navigation-stack.d.ts +9 -1
  63. package/generated/components/navigation-stack.js +13 -11
  64. package/generated/components/navigation-title.d.ts +11 -1
  65. package/generated/components/navigation-title.js +58 -55
  66. package/generated/components/picker-view.d.ts +48 -7
  67. package/generated/components/picker-view.js +971 -261
  68. package/generated/components/plain-button.js +3 -3
  69. package/generated/components/progress-view.d.ts +20 -0
  70. package/generated/components/progress-view.js +120 -0
  71. package/generated/components/screen-view.js +2 -1
  72. package/generated/components/scroll-view-proxy.d.ts +13 -0
  73. package/generated/components/scroll-view-proxy.js +15 -0
  74. package/generated/components/scroll-view.d.ts +13 -1
  75. package/generated/components/scroll-view.js +140 -97
  76. package/generated/components/search-view.d.ts +12 -0
  77. package/generated/components/search-view.js +24 -0
  78. package/generated/components/section-view.d.ts +13 -1
  79. package/generated/components/section-view.js +38 -58
  80. package/generated/components/sheet-view.d.ts +4 -2
  81. package/generated/components/sheet-view.js +10 -39
  82. package/generated/components/sidebar-toggle.d.ts +9 -1
  83. package/generated/components/sidebar-toggle.js +46 -69
  84. package/generated/components/sidebar-view.d.ts +3 -0
  85. package/generated/components/sidebar-view.js +16 -9
  86. package/generated/components/sticky-container.d.ts +6 -1
  87. package/generated/components/sticky-container.js +9 -7
  88. package/generated/components/tab-bar.d.ts +3 -0
  89. package/generated/components/tab-bar.js +17 -13
  90. package/generated/components/tab-item.d.ts +3 -0
  91. package/generated/components/tab-item.js +20 -13
  92. package/generated/components/tab-view.d.ts +13 -4
  93. package/generated/components/tab-view.js +25 -89
  94. package/generated/components/table-view.d.ts +19 -0
  95. package/generated/components/table-view.js +88 -107
  96. package/generated/components/text-field.d.ts +19 -6
  97. package/generated/components/text-field.js +127 -99
  98. package/generated/components/text-view.d.ts +11 -0
  99. package/generated/components/text-view.js +16 -0
  100. package/generated/components/toggle-view.d.ts +43 -0
  101. package/generated/components/toggle-view.js +366 -0
  102. package/generated/components/tool-bar-item-group.d.ts +8 -0
  103. package/generated/components/tool-bar-item-group.js +22 -4
  104. package/generated/components/tool-bar-item.d.ts +12 -1
  105. package/generated/components/tool-bar-item.js +57 -10
  106. package/generated/components/tool-bar.d.ts +19 -0
  107. package/generated/components/tool-bar.js +48 -33
  108. package/generated/components/v-divider.d.ts +11 -0
  109. package/generated/components/v-divider.js +15 -0
  110. package/generated/components/v-keyboard.d.ts +8 -1
  111. package/generated/components/v-keyboard.js +11 -9
  112. package/generated/components/v-stack.d.ts +20 -0
  113. package/generated/components/v-stack.js +18 -2
  114. package/generated/css/index.css +4617 -1266
  115. package/generated/events/alert-dialog.d.ts +13 -0
  116. package/generated/events/alert-dialog.js +1 -0
  117. package/generated/events/confirmation-dialog.d.ts +7 -2
  118. package/generated/events/date-picker.d.ts +6 -1
  119. package/generated/events/index.d.ts +2 -0
  120. package/generated/events/index.js +2 -0
  121. package/generated/events/lifecycle-observer.d.ts +10 -2
  122. package/generated/events/picker-view.d.ts +22 -1
  123. package/generated/events/scroll-view.d.ts +10 -2
  124. package/generated/events/tab-view.d.ts +38 -8
  125. package/generated/events/text-field.d.ts +6 -1
  126. package/generated/events/toggle-view.d.ts +14 -0
  127. package/generated/events/toggle-view.js +1 -0
  128. package/generated/i18n/index.d.ts +19 -10
  129. package/generated/i18n/index.js +79 -54
  130. package/generated/i18n/locales/el.d.ts +16 -0
  131. package/generated/i18n/locales/el.js +16 -0
  132. package/generated/i18n/locales/en.d.ts +16 -0
  133. package/generated/i18n/locales/en.js +16 -0
  134. package/generated/i18n/locales/index.d.ts +4 -0
  135. package/generated/i18n/locales/index.js +4 -0
  136. package/generated/internal/class/css-style-observer.js +2 -2
  137. package/generated/internal/class/form-associated-base.d.ts +0 -4
  138. package/generated/internal/class/form-associated-base.js +22 -39
  139. package/generated/internal/class/mutation-observer-set.d.ts +9 -0
  140. package/generated/internal/class/mutation-observer-set.js +42 -0
  141. package/generated/internal/class/mutation-observer-singleton.js +18 -0
  142. package/generated/internal/class/navigation-view.d.ts +1 -1
  143. package/generated/internal/class/navigation-view.js +36 -43
  144. package/generated/internal/decorators/adaptive-slot.d.ts +1 -0
  145. package/generated/internal/decorators/adaptive-slot.js +47 -0
  146. package/generated/internal/decorators/custom-element.d.ts +1 -1
  147. package/generated/internal/decorators/custom-element.js +2 -1
  148. package/generated/internal/decorators/index.d.ts +6 -0
  149. package/generated/internal/decorators/index.js +6 -0
  150. package/generated/internal/decorators/microtask-on-connected.d.ts +39 -0
  151. package/generated/internal/decorators/microtask-on-connected.js +67 -0
  152. package/generated/internal/flags.d.ts +4 -0
  153. package/generated/internal/flags.js +1 -0
  154. package/generated/internal/privateNamespace.d.ts +10 -0
  155. package/generated/internal/privateNamespace.js +159 -1
  156. package/generated/internal/utils/$.d.ts +9 -0
  157. package/generated/internal/utils/$.js +11 -0
  158. package/generated/internal/utils/compare-big-decimals.js +7 -17
  159. package/generated/internal/utils/debug.d.ts +1 -0
  160. package/generated/internal/utils/debug.js +4 -0
  161. package/generated/internal/utils/define-translations.d.ts +1 -0
  162. package/generated/internal/utils/define-translations.js +3 -0
  163. package/generated/internal/utils/ensure-placeholder.d.ts +1 -0
  164. package/generated/internal/utils/ensure-placeholder.js +41 -0
  165. package/generated/internal/utils/index.d.ts +39 -2
  166. package/generated/internal/utils/index.js +39 -3
  167. package/generated/internal/utils/is-inside.d.ts +1 -0
  168. package/generated/internal/utils/is-inside.js +4 -0
  169. package/generated/internal/utils/kebab-case.js +6 -9
  170. package/generated/internal/utils/list-active.js +67 -12
  171. package/generated/internal/utils/touch-glass.js +5 -5
  172. package/generated/internal/vendor/morphdom.d.ts +6 -0
  173. package/generated/internal/vendor/morphdom.js +720 -0
  174. package/generated/morphdom/index.d.ts +8 -0
  175. package/generated/morphdom/index.js +8 -0
  176. package/generated/morphdom/morph.d.ts +4 -0
  177. package/generated/morphdom/morph.js +10 -0
  178. package/generated/morphdom/query-morph.d.ts +5 -0
  179. package/generated/morphdom/query-morph.js +12 -0
  180. package/generated/morphdom/render-to-string.d.ts +12 -0
  181. package/generated/morphdom/render-to-string.js +48 -0
  182. package/generated/morphdom/unsafe-html.d.ts +2 -0
  183. package/generated/morphdom/unsafe-html.js +4 -0
  184. package/generated/namespace-browser/base.d.ts +12 -3
  185. package/generated/namespace-browser/base.js +41 -18
  186. package/generated/namespace-browser/event.d.ts +10 -0
  187. package/generated/namespace-browser/event.js +1 -0
  188. package/generated/snapshot/index.d.ts +3 -1
  189. package/generated/snapshot/index.js +23 -2
  190. package/generated/tpl/html.d.ts +5 -0
  191. package/generated/tpl/html.js +7 -0
  192. package/generated/tpl/index.d.ts +6 -0
  193. package/generated/tpl/index.js +6 -0
  194. package/generated/tpl/is-template-result.d.ts +3 -0
  195. package/generated/tpl/is-template-result.js +1 -0
  196. package/generated/tpl/render.d.ts +2 -0
  197. package/generated/tpl/render.js +132 -0
  198. package/html-data/en.json +2620 -0
  199. package/package.json +32 -7
  200. package/scss/_components.scss +15 -0
  201. package/scss/_functions.scss +10 -0
  202. package/scss/_maps.scss +293 -0
  203. package/scss/_mixins.scss +4 -0
  204. package/scss/_transitions.scss +6 -1
  205. package/scss/_utils.scss +2 -0
  206. package/scss/_vars.scss +9 -115
  207. package/scss/base/_layout.scss +17 -7
  208. package/scss/base/_reboot.scss +34 -1
  209. package/scss/base/_root.scss +143 -124
  210. package/scss/colors/_index.scss +328 -88
  211. package/scss/components/_alert-dialog.scss +111 -0
  212. package/scss/components/_bordered-button.scss +37 -0
  213. package/scss/components/_bordered-prominent-button.scss +46 -0
  214. package/scss/components/_borderless-button.scss +26 -0
  215. package/scss/components/_confirmation-dialog.scss +41 -49
  216. package/scss/components/_content-unavailable.scss +57 -0
  217. package/scss/components/_date-picker.scss +15 -15
  218. package/scss/components/_detail-placeholder.scss +1 -3
  219. package/scss/components/_disclosure-group.scss +85 -34
  220. package/scss/components/_fine-tooltip.scss +84 -0
  221. package/scss/components/_form-view.scss +63 -24
  222. package/scss/components/_glass-button.scss +37 -0
  223. package/scss/components/_glass-prominent-button.scss +47 -0
  224. package/scss/components/_group-box.scss +27 -0
  225. package/scss/components/_h-flex-stack.scss +23 -0
  226. package/scss/components/_h-stack.scss +6 -17
  227. package/scss/components/_image-view.scss +20 -0
  228. package/scss/components/_index.scss +69 -36
  229. package/scss/components/_label-view copy.scss.txt +420 -0
  230. package/scss/components/_label-view.scss +105 -120
  231. package/scss/components/_label-view.scss.txt +536 -0
  232. package/scss/components/_labeled-content.scss +67 -1
  233. package/scss/components/_list-view.scss +70 -29
  234. package/scss/components/_menu-view.scss +96 -61
  235. package/scss/components/_navigation-large-title.scss +23 -0
  236. package/scss/components/_navigation-split-view.scss +3 -3
  237. package/scss/components/_navigation-title.scss +1 -1
  238. package/scss/components/_picker-view.scss +270 -63
  239. package/scss/components/_plain-button.scss +8 -0
  240. package/scss/components/_progress-view.scss +98 -0
  241. package/scss/components/_scroll-view-proxy.scss +24 -22
  242. package/scss/components/_scroll-view-toolbars.scss +8 -2
  243. package/scss/components/_scroll-view.scss +16 -0
  244. package/scss/components/_search-view.scss +23 -0
  245. package/scss/components/_section-view.scss +23 -22
  246. package/scss/components/_sheet-view.scss +16 -6
  247. package/scss/components/_sidebar-toggle.scss +1 -4
  248. package/scss/components/_sticky-container.scss +1 -1
  249. package/scss/components/_tab-bar.scss +17 -3
  250. package/scss/components/_tab-view.scss +12 -2
  251. package/scss/components/_table-column.scss +4 -2
  252. package/scss/components/_table-row.scss +71 -3
  253. package/scss/components/_table-view.scss +27 -18
  254. package/scss/components/_text-field.scss +37 -17
  255. package/scss/components/_text-view.scss +57 -0
  256. package/scss/components/_toggle-view.scss +171 -0
  257. package/scss/components/_tool-bar-item.scss +34 -82
  258. package/scss/components/_tool-bar.scss +77 -57
  259. package/scss/components/_v-stack.scss +8 -2
  260. package/scss/final/_touch-glass.scss +31 -0
  261. package/scss/mixins/_button.scss +44 -0
  262. package/scss/mixins/_color.scss +16 -0
  263. package/scss/mixins/_dialog.scss +1 -0
  264. package/scss/mixins/_index.scss +73 -5
  265. package/scss/placeholders/_buttons.scss +46 -11
  266. package/scss/placeholders/_lists.scss +159 -126
  267. package/scss/transitions/_alert-dialog.scss +18 -0
  268. package/scss/transitions/_confirmation-dialog.scss +8 -0
  269. package/scss/transitions/_fine-tooltip.scss +21 -0
  270. package/scss/transitions/_menu-view.scss +17 -15
  271. package/scss/transitions/_progress-view.scss +23 -0
  272. package/scss/transitions/_sheet-view.scss +30 -0
  273. package/scss/transitions/_tab-bar.scss +6 -5
  274. package/scss/utils/_background.scss +52 -0
  275. package/scss/utils/_frame.scss +59 -40
  276. package/scss/utils/_index.scss +45 -56
  277. package/scss/utils/_scroll-view.scss +1 -1
  278. package/scss/utils/_spacing.scss +1 -1
  279. package/scss/utils/_stacks.scss +34 -164
  280. package/generated/confirmation-dialog/index.d.ts +0 -1
  281. package/generated/confirmation-dialog/index.js +0 -1
  282. package/generated/internal/utils/cash/index.d.ts +0 -22
  283. package/generated/internal/utils/cash/index.js +0 -23
  284. package/generated/lifecycle-observer/index.d.ts +0 -1
  285. package/generated/lifecycle-observer/index.js +0 -1
  286. package/scss/transitions/_dialog.scss +0 -28
  287. package/web-components.html-data/en.json +0 -330
  288. /package/generated/internal/utils/{cash/ancestors.d.ts → ancestors.d.ts} +0 -0
  289. /package/generated/internal/utils/{cash/ancestors.js → ancestors.js} +0 -0
  290. /package/generated/internal/utils/{cash/next-all.d.ts → next-all.d.ts} +0 -0
  291. /package/generated/internal/utils/{cash/next-all.js → next-all.js} +0 -0
  292. /package/generated/internal/utils/{cash/next.d.ts → next.d.ts} +0 -0
  293. /package/generated/internal/utils/{cash/next.js → next.js} +0 -0
  294. /package/generated/internal/utils/{cash/prev-all.d.ts → prev-all.d.ts} +0 -0
  295. /package/generated/internal/utils/{cash/prev-all.js → prev-all.js} +0 -0
  296. /package/generated/internal/utils/{cash/prev.d.ts → prev.d.ts} +0 -0
  297. /package/generated/internal/utils/{cash/prev.js → prev.js} +0 -0
  298. /package/generated/internal/utils/{cash/prop.d.ts → prop.d.ts} +0 -0
  299. /package/generated/internal/utils/{cash/prop.js → prop.js} +0 -0
  300. /package/generated/internal/utils/{cash/siblings.d.ts → siblings.d.ts} +0 -0
  301. /package/generated/internal/utils/{cash/siblings.js → siblings.js} +0 -0
@@ -1,61 +1,44 @@
1
+ import { debug } from '../../internal/utils';
1
2
  import { CleanupRegistry } from './cleanup-registry';
2
- import { MutationObserverSingleton } from './mutation-observer-singleton';
3
3
  const internals = new WeakMap();
4
- const trackedElements = new WeakMap();
5
- const observers = new MutationObserverSingleton();
4
+ // const trackedElements = new WeakMap<FormAssociatedBase, Set<Element>>()
5
+ // const observers = new MutationObserverSingleton()
6
6
  export function getInternals(instance) {
7
7
  const i = internals.get(instance);
8
8
  if (!i)
9
9
  throw new Error('Not a FormAssociatedBase instance');
10
10
  return i;
11
11
  }
12
- export function makeSlotchangeHandler(t) {
13
- const handleSlotchange = (evt) => {
14
- console.debug(`${makeSlotchangeHandler.name} ⚡️ ${evt?.type}`);
15
- const slot = evt.target, assigned = slot.assignedElements({ flatten: true });
16
- observers.syncObservations(trackedElements.get(t) ?? new Set(), assigned, handleTagMutation, ['value', 'label']);
17
- // for (const el of trackedElements.get(t) ?? [])
18
- // if (!assigned.includes(el)) {
19
- // observers.unobserve(el)
20
- // trackedElements.get(t)?.delete(el)
21
- // }
22
- // for (const el of assigned) {
23
- // if (!trackedElements.get(t)?.has(el))
24
- // observers.observe(el, handleTagMutation, {
25
- // attributes: true,
26
- // characterData: true,
27
- // subtree: true,
28
- // childList: true,
29
- // attributeFilter: ['value', 'label'],
30
- // })
31
- // trackedElements.get(t)?.add(el)
32
- // }
33
- if (0 < assigned.length)
34
- handleTagMutation();
35
- }, handleTagMutation = (entry) => {
36
- console.debug(`${handleTagMutation.name} ⚡️ mutation`);
37
- t.setValidity(t.validity, t.validationMessage);
38
- };
39
- return [{ types: 'slotchange', listener: handleSlotchange }];
40
- }
12
+ // export function makeSlotchangeHandler(t: FormAssociatedBase) {
13
+ // const handleSlotchange = ({ type, target: slot }: Event) => {
14
+ // debug(`${makeSlotchangeHandler.name} ⚡️ ${type}`)
15
+ // if (!(slot instanceof HTMLSlotElement && slot)) return
16
+ // const assigned = slot.assignedElements({ flatten: true })
17
+ // observers.syncObservations(trackedElements.get(t) ?? new Set(), assigned, handleTagMutation, ['value', 'label'])
18
+ // if (0 < assigned.length) handleTagMutation()
19
+ // },
20
+ // handleTagMutation = (entry?: MutationRecord) => {
21
+ // debug(`${handleTagMutation.name} ⚡️ mutation`)
22
+ // t.setValidity(t.validity, t.validationMessage)
23
+ // }
24
+ // return [{ types: 'slotchange', listener: handleSlotchange }]
25
+ // }
41
26
  export class FormAssociatedBase extends HTMLElement {
42
27
  static get formAssociated() {
43
28
  return true;
44
29
  }
45
30
  constructor() {
46
31
  super();
47
- internals.set(this, this.attachInternals());
48
- trackedElements.set(this, new Set());
32
+ internals.set(this, this.attachInternals()); //internals.set(this, this.attachInternals?.())
33
+ // trackedElements.set(this, new Set<Element>())
49
34
  }
50
35
  disconnectedCallback() {
51
- console.debug(`${FormAssociatedBase.name} ⚡️ disconnect`);
36
+ debug(`${FormAssociatedBase.name} ⚡️ disconnect`);
52
37
  CleanupRegistry.unregister(this);
53
- observers.clearObservationsSet(trackedElements.get(this) ?? new Set());
54
- // for (const el of trackedElements.get(this) ?? []) observers.unobserve(el)
55
- // trackedElements.get(this)?.clear() // trackedElements.delete(this)
38
+ // observers.clearObservationsSet(trackedElements.get(this) ?? new Set())
56
39
  }
57
40
  connectedCallback() {
58
- console.debug(`${FormAssociatedBase.name} ⚡️ connect`);
41
+ debug(`${FormAssociatedBase.name} ⚡️ connect`);
59
42
  }
60
43
  get type() {
61
44
  return this.localName;
@@ -0,0 +1,9 @@
1
+ export declare class MutationObserverSet {
2
+ #private;
3
+ private callback;
4
+ constructor(callback: MutationCallback);
5
+ observe(target: Element, attributeFilter?: string[]): Promise<void>;
6
+ unobserve(target: Element): Promise<void>;
7
+ syncObservations(source: Element[], attributeFilter?: string[]): Promise<void>;
8
+ unobserveAll(): Promise<void>;
9
+ }
@@ -0,0 +1,42 @@
1
+ import { Snapshot } from '../../snapshot';
2
+ export class MutationObserverSet {
3
+ callback;
4
+ #observers = new Map();
5
+ constructor(callback) {
6
+ this.callback = callback;
7
+ }
8
+ async observe(target, attributeFilter) {
9
+ await Snapshot.waitReady;
10
+ if (this.#observers.has(target))
11
+ return;
12
+ const observer = new MutationObserver(this.callback);
13
+ observer.observe(target, {
14
+ attributes: true,
15
+ characterData: true,
16
+ subtree: true,
17
+ childList: true,
18
+ ...(attributeFilter && { attributeFilter }),
19
+ });
20
+ this.#observers.set(target, observer);
21
+ }
22
+ async unobserve(target) {
23
+ await Snapshot.waitReady;
24
+ this.#observers.get(target)?.disconnect();
25
+ this.#observers.delete(target);
26
+ }
27
+ async syncObservations(source, attributeFilter) {
28
+ await Snapshot.waitReady;
29
+ const sourceSet = new Set(source);
30
+ for (const el of [...this.#observers.keys()])
31
+ if (!sourceSet.has(el))
32
+ this.unobserve(el);
33
+ for (const el of source)
34
+ this.observe(el, attributeFilter);
35
+ }
36
+ async unobserveAll() {
37
+ await Snapshot.waitReady;
38
+ for (const obs of this.#observers.values())
39
+ obs.disconnect();
40
+ this.#observers.clear();
41
+ }
42
+ }
@@ -20,6 +20,24 @@ export class MutationObserverSingleton {
20
20
  this.#observers.delete(target);
21
21
  }
22
22
  /** Observes automatically all elements using a Set provided by outside. Calls renderCallback on EVERY change. */
23
+ // shortcur fot this
24
+ // #trackedElements = new Set<Element>()
25
+ // for (const el of this.#trackedElements)
26
+ // if (!assigned.includes(el)) {
27
+ // observers.unobserve(el)
28
+ // this.#trackedElements.delete(el)
29
+ // }
30
+ // for (const el of assigned) {
31
+ // if (!this.#trackedElements.has(el))
32
+ // observers.observe(el, this.#handleTagMutation, {
33
+ // attributes: true,
34
+ // characterData: true,
35
+ // subtree: true,
36
+ // childList: true,
37
+ // // attributeFilter: ['value', 'label'],
38
+ // })
39
+ // this.#trackedElements.add(el)
40
+ // }
23
41
  async syncObservations(set, nodes, renderCallback, attributeFilter) {
24
42
  for (const el of set)
25
43
  if (!nodes.includes(el)) {
@@ -2,7 +2,7 @@ export declare class NavigationView extends HTMLElement {
2
2
  #private;
3
3
  static get observedAttributes(): string[];
4
4
  constructor();
5
+ attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null): void;
5
6
  disconnectedCallback(): void;
6
7
  connectedCallback(): void;
7
- attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null): void;
8
8
  }
@@ -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 { debug, 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,53 @@ 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
+ debug(`${_a.name} 💡 ${eventType}`);
35
+ frame(this).then(() => target.dispatchEvent(new CustomEvent(eventType, { detail: { tag: this.id }, bubbles: true, composed: true })));
64
36
  break;
65
37
  }
66
38
  }
67
- #handleBeforeTabRevealOrSwap = (evt) => {
68
- console.debug(`${_a.name} ⚡️ ${evt?.type}`);
69
- if (this.id !== evt.detail?.tag)
39
+ disconnectedCallback() {
40
+ CleanupRegistry.unregister(this);
41
+ this.#recentBefore = undefined;
42
+ // trigger hide on NEXT tick
43
+ if (!this.closest('tab-view'))
44
+ return;
45
+ frame().then(() => lifecycleObserver.dispatchEvent(new CustomEvent('tabhide', { detail: { tag: this.id }, bubbles: true, composed: true })));
46
+ }
47
+ connectedCallback() {
48
+ if (!this.closest('tab-view'))
49
+ return;
50
+ // wire befores
51
+ CleanupRegistry.register(this, onoff('beforetabreveal beforetabswap', this.#handleBeforeTabRevealOrSwap, this).on());
52
+ // trigger show on NEXT tick
53
+ if (this.hasAttribute('hidden'))
54
+ return; // skip if already rendered by attr-change during upgrade!
55
+ frame(this).then(() => lifecycleObserver.dispatchEvent(new CustomEvent('tabshow', { detail: { tag: this.id }, bubbles: true, composed: true })));
56
+ }
57
+ #handleBeforeTabRevealOrSwap = ({ type, detail }) => {
58
+ debug(`${_a.name} ⚡️ ${type}`);
59
+ if (this.id !== detail?.tag)
70
60
  return;
71
61
  this.#recentBefore = {
72
- type: evt.type, // beforetabreveal / beforetabswap
62
+ type, // beforetabreveal / beforetabswap
73
63
  time: performance.now(),
74
64
  };
65
+ self.queueMicrotask(() => {
66
+ this.#recentBefore = undefined;
67
+ }); // auto-expire after current task
75
68
  };
76
69
  }
77
70
  _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,47 @@
1
+ import { Snapshot } from '../../snapshot';
2
+ import { CleanupRegistry } from '../class/cleanup-registry';
3
+ import { debug, onoff } from '../utils';
4
+ export default function (filter) {
5
+ const handleMediaChange = (el, { type, matches }) => {
6
+ debug(`${el.localName} ⚡️ ${type}`);
7
+ if (matches) {
8
+ if (!el.matches(`[slot="cancellation-action"],[slot="primary-action"],[slot="confirmation-action"],[slot="destructive-action"]`))
9
+ return;
10
+ const newSlot = ['destructive-action'].includes(el.slot) ? 'bottom-bar-leading' : 'bottom-bar-trailing';
11
+ if (el.slot !== newSlot)
12
+ el.dataset.previousSlot = el.slot;
13
+ el.slot = newSlot;
14
+ }
15
+ else {
16
+ if (!el.matches(`[data-previous-slot]`))
17
+ return;
18
+ el.slot = el.dataset.previousSlot ?? '';
19
+ delete el.dataset.previousSlot;
20
+ }
21
+ };
22
+ return function (Base, _context) {
23
+ const originalConnected = Base.prototype.connectedCallback, originalDisconnected = Base.prototype.disconnectedCallback;
24
+ Base.prototype.connectedCallback = function () {
25
+ debug(`decorator:[${this.localName}] ⚡️ connect`);
26
+ originalConnected?.call(this);
27
+ if (filter && !filter(this))
28
+ return;
29
+ if (!this.closest('[is=sheet-view]'))
30
+ return;
31
+ if (!self.matchMedia('(pointer: fine)').matches)
32
+ return;
33
+ const handler1 = handleMediaChange.bind(null, this);
34
+ CleanupRegistry.register(this, onoff('fine_dialog_sheet:change', handler1, Snapshot.on).on(), 'adaptive-slot');
35
+ Snapshot.waitReady.then(() => {
36
+ handleMediaChange(this, new MediaQueryListEvent(`media-change`, {
37
+ matches: Snapshot.breakpoints?.get('fine_dialog_sheet'),
38
+ })); // Initial check
39
+ });
40
+ };
41
+ Base.prototype.disconnectedCallback = function () {
42
+ debug(`decorator:[${this.localName}] ⚡️ disconnect`);
43
+ originalDisconnected?.call(this);
44
+ CleanupRegistry.unregister(this, 'adaptive-slot');
45
+ };
46
+ };
47
+ }
@@ -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
+ DEBUG && console.debug(`${NavigationTitle.name} ⚡️ connect`)
27
+
28
+ this.#scheduleSync()
29
+ }
30
+
31
+ attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null) {
32
+ 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
+ DEBUG && console.debug(`${NavigationTitle.name} ⚡️ connect`)
27
+
28
+ this.#scheduleSync()
29
+ }
30
+
31
+ attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null) {
32
+ 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
+ }
@@ -0,0 +1,4 @@
1
+ declare const _default: {
2
+ DEBUG: boolean;
3
+ };
4
+ export default _default;
@@ -0,0 +1 @@
1
+ export default { DEBUG: false };
@@ -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 {};