@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
@@ -0,0 +1,28 @@
1
+ {
2
+ "version": 1.1,
3
+ "properties": [
4
+ {
5
+ "name": "--accentColor",
6
+ "description": {
7
+ "kind": "markdown",
8
+ "value": "Sets the accent color used by interactive elements.\n\nRegistered via `@property` with `syntax: '<color>'`, `inherits: true`."
9
+ },
10
+ "references": [
11
+ {
12
+ "name": "Documentation",
13
+ "url": "https://swiftwc.github.io/ui/tokens/tint"
14
+ }
15
+ ],
16
+ "values": [
17
+ {
18
+ "name": "blue",
19
+ "description": "System blue"
20
+ },
21
+ {
22
+ "name": "red",
23
+ "description": "System red"
24
+ }
25
+ ]
26
+ }
27
+ ]
28
+ }
@@ -0,0 +1,2 @@
1
+ declare const _default: EventTarget;
2
+ export default _default;
@@ -0,0 +1 @@
1
+ export default new EventTarget();
@@ -0,0 +1,2 @@
1
+ declare const _default: EventTarget;
2
+ export default _default;
@@ -0,0 +1 @@
1
+ export default new EventTarget();
@@ -0,0 +1,6 @@
1
+ export { default as alertDialog } from './alert-dialog';
2
+ export * from './alert-dialog';
3
+ export { default as confirmationDialog } from './confirmation-dialog';
4
+ export * from './confirmation-dialog';
5
+ export { default as lifecycleObserver } from './lifecycle-observer';
6
+ export * from './lifecycle-observer';
@@ -0,0 +1,6 @@
1
+ export { default as alertDialog } from './alert-dialog';
2
+ export * from './alert-dialog';
3
+ export { default as confirmationDialog } from './confirmation-dialog';
4
+ export * from './confirmation-dialog';
5
+ export { default as lifecycleObserver } from './lifecycle-observer';
6
+ export * from './lifecycle-observer';
@@ -0,0 +1,2 @@
1
+ declare const _default: EventTarget;
2
+ export default _default;
@@ -0,0 +1 @@
1
+ export default new EventTarget();
@@ -1,16 +1,30 @@
1
- import { ConfirmationDialog } from '../confirmation-dialog';
1
+ import { lifecycleObserver } from '../buses';
2
2
  import { I18n } from '../i18n';
3
3
  import { NavigationPath } from '../internal/class/navigation-path';
4
- import { LifecycleObserver } from '../lifecycle-observer';
4
+ import { type NavigationHost, queryInsertPosition, startViewTransition } from '../internal/privateNamespace';
5
5
  import { type WebComponentCtor } from '../namespace-browser';
6
6
  import { Snapshot } from '../snapshot';
7
7
  export declare const polyfills: Map<string, WebComponentCtor>;
8
- type TransitionType = 'forwards' | 'backwards' | 'reload';
9
- type UpdateCallback = () => void | Promise<void>;
10
- type NavigateOptions = {
11
- updateCallback?: UpdateCallback;
12
- tos?: () => NavigationPath[];
8
+ /**
9
+ * Presents an alert with a message using the given data to produce the alert’s content and a string variable as a title.
10
+ */
11
+ export declare const alert: (title?: string, message?: string, actions?: {
12
+ label?: string;
13
+ image?: string;
14
+ role?: string;
15
+ }[], options?: {
16
+ titleVisibility?: boolean;
17
+ signal?: AbortSignal;
18
+ }) => Promise<string | undefined> & {
19
+ dismiss: (reason?: unknown) => void;
13
20
  };
14
- export declare const startViewTransition: (target: HTMLElement, type?: TransitionType, updateCallbackOrOptions?: UpdateCallback | NavigateOptions) => Promise<void>;
15
- export declare const confirmationDialog: (trigger: HTMLElement, title: string, entries: Array<[string, any]>, controller?: AbortController) => Promise<unknown>;
16
- export { ConfirmationDialog, I18n, LifecycleObserver, NavigationPath, Snapshot };
21
+ export declare const confirmationDialog: (trigger: HTMLElement, title: string, message?: string, actions?: {
22
+ label?: string;
23
+ image?: string;
24
+ role?: string;
25
+ }[], options?: {
26
+ controller?: AbortController;
27
+ titleVisibility?: boolean;
28
+ }) => Promise<string>;
29
+ export { I18n, lifecycleObserver, NavigationPath, queryInsertPosition, Snapshot, startViewTransition };
30
+ export { type NavigationHost };
@@ -1,10 +1,14 @@
1
+ import { alertDialog, confirmationDialog as confirmationDialogBus, lifecycleObserver } from '../buses';
1
2
  import * as Components from '../components';
2
- import { ConfirmationDialog } from '../confirmation-dialog';
3
3
  import { I18n } from '../i18n';
4
4
  import { NavigationPath } from '../internal/class/navigation-path';
5
- import { $, kebabCase, onoff } from '../internal/utils';
6
- import { LifecycleObserver } from '../lifecycle-observer';
5
+ import flags from '../internal/flags';
6
+ import { queryInsertPosition, startViewTransition } from '../internal/privateNamespace';
7
+ import { $, debug, kebabCase, onoff } from '../internal/utils';
7
8
  import { Snapshot } from '../snapshot';
9
+ import { html, render } from '../tpl';
10
+ debug(flags);
11
+ //#region polyfills
8
12
  export const polyfills = new Map();
9
13
  for (const [k, Ctor] of Object.entries(Components)) {
10
14
  const is = kebabCase(k);
@@ -12,14 +16,18 @@ for (const [k, Ctor] of Object.entries(Components)) {
12
16
  if (customElements.get(is))
13
17
  continue;
14
18
  customElements.define(is, Ctor, { extends: Ctor.polyfillExtends });
19
+ // NOTE: Test via the imperative creation path
15
20
  if (!(document.createElement(Ctor.polyfillExtends, { is }) instanceof Ctor))
16
21
  polyfills.set(is, Ctor);
22
+ // NOTE: Defensive, test again via the HTML-parsing path
23
+ if (!($(html `<${Ctor.polyfillExtends} is="${is}"></${Ctor.polyfillExtends}>`, '>1') instanceof Ctor))
24
+ polyfills.set(is, Ctor);
17
25
  continue;
18
26
  }
19
27
  if (!customElements.get(is))
20
28
  customElements.define(is, Ctor);
21
29
  }
22
- console.debug(polyfills);
30
+ debug(polyfills);
23
31
  if (0 < polyfills.size) {
24
32
  const polyfillTagNamesCache = new Set([...polyfills.values()].map((v) => String(v.polyfillExtends ?? '').toUpperCase()).filter(Boolean)); // ['TAG-NAME1', 'TAG-NAME2', ...]
25
33
  const handlers = new WeakMap();
@@ -44,12 +52,12 @@ if (0 < polyfills.size) {
44
52
  oldValue: null,
45
53
  target: el,
46
54
  };
47
- void polyfill.polyfillAttributeChangedCallback([entry]);
55
+ polyfill.polyfillAttributeChangedCallback([entry]);
48
56
  }
49
57
  }, unobserve = (el) => {
50
58
  handlers.delete(el);
51
59
  }, polyfillTagNamesCacheSelector = [...polyfillTagNamesCache.values()].map((v) => `${v}`.toLowerCase()).join(','), flatten = (node) => [node, ...(node.querySelectorAll?.(polyfillTagNamesCacheSelector) ?? [])];
52
- console.debug(polyfillTagNamesCache, polyfillTagNamesCacheSelector);
60
+ debug(polyfillTagNamesCache, polyfillTagNamesCacheSelector);
53
61
  for (const [is, polyfill] of polyfills)
54
62
  for (const el of document.querySelectorAll(`${polyfill.polyfillExtends}[is="${CSS.escape(is)}"]`)) {
55
63
  polyfill.polyfillConnectedCallback(el);
@@ -97,197 +105,174 @@ if (0 < polyfills.size) {
97
105
  }
98
106
  // SECTION: Safari polyfill
99
107
  document.addEventListener('touchstart', () => { }, { passive: true });
100
- // SECTION: Transitions
101
- const cleanup = (lm, type) => {
102
- let arr = [Snapshot.config['vt-fwd-class-name'], 'fwdd', 'fwn', 'fwnn', 'bwd', 'bwdd', 'bwn', 'bwnn'];
103
- if (['backwards', 'forwards'].includes(type ?? ''))
104
- for (let i = arr.length - 1; i >= 0; i--)
105
- if (arr[i].startsWith('backwards' === type ? 'fw' : 'bw'))
106
- arr.splice(i, 1);
107
- for (const el of [...(lm?.querySelectorAll(arr.map((v) => `.${v}`).join(',')) ?? [])])
108
- el.classList.remove(...arr);
109
- };
110
- export const startViewTransition = async (target, type = 'forwards', updateCallbackOrOptions = async () => { }) => {
111
- console.debug(`startViewTransition (${type})`, target);
108
+ //#endregion
109
+ // SECTION
110
+ const handleHelp = ({ target, relatedTarget }) => {
112
111
  if (!(target instanceof HTMLElement))
113
- throw new TypeError("Argument 1 ('target') to client.startViewTransition must be an instance of HTMLElement");
114
- if (!['forwards', 'backwards', 'reload'].includes(type))
115
- throw new TypeError("Argument 2 ('type') to client.startViewTransition must be of TransitionType");
116
- const options = typeof updateCallbackOrOptions === 'function'
117
- ? {
118
- updateCallback: updateCallbackOrOptions,
119
- }
120
- : (updateCallbackOrOptions ?? {}), updateCallback = options.updateCallback ?? (async () => { });
121
- await Snapshot.waitReady;
122
- const from = new NavigationPath(target); //const from = closestBody(target) //event.target as HTMLElement)
123
- if ('forwards' === type) {
124
- await updateCallback(); // updatetheDOMSomehow
125
- // Snapshot.getSnapshot(from)
126
- // const root = getRootViewController(from)
127
- // const oldPath = new NavigationPath(from)
128
- const root = [from, ...from.parents()]
129
- .map((item) => item.component)
130
- .filter(Boolean)
131
- .at(-1);
132
- // const { toolBarConfig: oldToolbars } = getComputedView(from) // const { toolBarConfig: oldToolbars, slot: oldSLot, page: oldPage } = getComputedView(from) //
133
- // console.log(88, oldPage, oldPath.page, oldSLot, oldPath.slot, oldToolbars, oldPath.toolBarConfig)
134
- // const oldToolbars = Snapshot.toolbarItems
135
- // const { toolBarConfig: oldToolbars, host: oldHost } = getComputedView(from)
136
- const tos = options.tos?.() ?? [...from.children()].map((item) => item?.hydrate()), //queryBodyAll(oldSLot), //[...oldPath.children()].map((item) => item.body).filter(Boolean),//
137
- to = tos.at(-1),
138
- // to = newPath?.body, //tos.slice(-1)?.pop?.(), //Snapshot.leaf, //
139
- // newHost = newPath?.component, //{ host: newHost } = getComputedView(to),
140
- newToolbars = tos.flatMap((item) => item.toolBarConfig ?? []).filter((item) => !!item),
141
- // .map((item) => item.toolBarConfig)
142
- // .flat()
143
- // .filter(Boolean), //queryToolbarConfigAll(oldSLot),
144
- modalViews = tos.map((item) => item.component).filter((item) => !!item && item.matches('dialog')); //[...queryHostAll(oldPage)].filter?.((item) => item?.matches('dialog'))
145
- // toFrame = Snapshot.leafContainer, //queryHostAll(from).slice(-1)?.pop?.(),
146
- // toToolbars = Snapshot.leafToolbarItems
147
- // dialogFrames = [toFrame, ...(Snapshot.leaveFrames ?? [])].filter((item): item is HTMLDialogElement => item instanceof HTMLDialogElement) //[toFrame, ...(Snapshot.leaveFrames ?? [])].filter((item) => item?.matches('dialog'))
148
- // if ('DIALOG' === newHost?.tagName) {
149
- // ;(newHost as HTMLDialogElement).showModal()
150
- // console.debug(`⚡️ view-transition-start (${type})`)
151
- // await Promise.allSettled(newHost.getAnimations().map(({ finished }) => finished))
152
- // console.debug(`⚡️ view-transition-end (${type})`)
153
- // return
154
- // }
155
- // purge
156
- cleanup(root, 'backwards');
157
- // prepare old
158
- from.body?.classList.add(Snapshot.config['vt-fwd-class-name']);
159
- from.body?.dispatchEvent(new CustomEvent('pageswap', { detail: { page: from.body }, bubbles: true, composed: true }));
160
- for (const oldToolbar of from.toolBarConfig ?? [])
161
- oldToolbar.classList.add('fwn'); // prepare navbs
162
- // prepare new
163
- const toolbarExclusion = 0 < modalViews.length
164
- ? (value, index, array) => value.parentElement?.matches('tool-bar:not(dialog tool-bar,body-view ~ tool-bar)')
165
- : (value, index, array) => value.parentElement?.matches('tool-bar:not(body-view ~ tool-bar)'), bodyExclusion = 0 < modalViews.length
166
- ? (item) => item.body?.matches('scroll-view:not(dialog scroll-view)')
167
- : (value, index, array) => value;
168
- for (const bti of newToolbars?.filter?.(toolbarExclusion) ?? [])
169
- bti.classList.add('fwnn'); // for (const ti of newToolbars ?? []) ti.classList.add('fwnn') //
170
- for (const bt of tos?.filter?.(bodyExclusion) ?? []) {
171
- bt.body?.classList.add('fwdd'); //to?.classList.add('fwdd')
172
- bt.body?.dispatchEvent(new CustomEvent('pagereveal', { detail: { page: bt.body }, bubbles: true, composed: true }));
173
- }
174
- if (0 < modalViews.length) {
175
- for await (const el of modalViews)
176
- el.showModal();
177
- console.debug(`⚡️ view-dialog-transition-start (${type})`);
178
- await Promise.allSettled(modalViews?.[0].getAnimations().map(({ finished }) => finished));
179
- console.debug(`⚡️ view-dialog-transition-end (${type})`);
180
- }
181
- else {
182
- console.debug(`⚡️ view-transition-start (${type})`);
183
- await Promise.allSettled([
184
- ...(from.body?.getAnimations().map(({ finished }) => finished) ?? []),
185
- ...(to?.body?.getAnimations().map(({ finished }) => finished) ?? []),
186
- ]);
187
- console.debug(`⚡️ view-transition-end (${type})`);
188
- }
189
- if (0 < (to?.component?.querySelectorAll(`.${Snapshot.config?.['vt-fwd-class-name']},.bwd`) ?? []).length)
190
- return;
191
- cleanup(root);
192
- }
193
- else {
194
- // Snapshot.getSnapshot(from)
195
- // const oldPath = new NavigationPath(from)
196
- const root = [from, ...from.parents()]
197
- .map((item) => item.component)
198
- .filter(Boolean)
199
- .at(-1); // const root = getRootViewController(from)
200
- //const { toolBarConfig: oldToolbars, host: oldHost, page: oldPage, slot: oldSlot } = getComputedView(from)
201
- const froms = [...from.children()].map((item) => item?.hydrate());
202
- const oldToolbars = froms.flatMap((item) => item.toolBarConfig ?? []).filter((item) => !!item), oldBodies = froms.map((item) => item.body).filter((item) => !!item);
203
- // console.log(99, queryToolbarConfigAll(oldSlot), oldToolbars)
204
- // if most-top effect is closing a modal, skip everything
205
- if ('DIALOG' === from.component?.tagName) {
206
- from.body?.dispatchEvent(new CustomEvent('pageswap', { detail: { page: from.body }, bubbles: true, composed: true }));
207
- from.component.close();
208
- console.debug(`⚡️ view-dialog-transition-start (${type})`);
209
- await Promise.allSettled(from.component.getAnimations().map(({ finished }) => finished));
210
- console.debug(`⚡️ view-dialog-transition-end (${type})`);
211
- if (from.component.matches('[open]'))
212
- return;
213
- await updateCallback();
214
- return; // just close modal
215
- }
216
- const to = [...from.parents()].at(0)?.hydrate(); //closestBody(oldPath.component?.parentElement ?? undefined)
217
- // console.log(99, to)
218
- if (!to)
219
- return console.debug('Can not go backwards.'); // nothing to go back to
220
- const tv = to.body?.closest('tab-view');
221
- if (tv && to.body?.matches('tab-view>navigation-stack:has(> navigation-stack,> navigation-split-view)>:scope'))
222
- if ('bottom-bar' !== tv.tabBarPlacement)
223
- return;
224
- // const { toolBarConfig: newToolbars } = getComputedView(to.body)
225
- // purge
226
- cleanup(root, 'forwards');
227
- // prepare new
228
- for (const ti of to.toolBarConfig ?? [])
229
- ti.classList.add('bwnn');
230
- to.body?.classList.add('bwdd');
231
- to.body?.dispatchEvent(new CustomEvent('pagereveal', { detail: { page: to.body }, bubbles: true, composed: true }));
232
- // prepare old
233
- 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
234
- toolbarExclusion = 0 < inbetweenModals.length
235
- ? (value, index, array) => value.parentElement?.matches('tool-bar:not(dialog tool-bar)')
236
- : (value, index, array) => value, bodyExclusion = 0 < inbetweenModals.length ? (item) => item?.matches('scroll-view:not(dialog scroll-view)') : (item) => item;
237
- for (const ti of [...(from.toolBarConfig ?? []), ...(oldToolbars?.filter?.(toolbarExclusion) ?? [])])
238
- ti.classList.add('bwn');
239
- for (const nn of [from.body, ...oldBodies?.filter?.(bodyExclusion)]) {
240
- nn?.classList.add('bwd'); //from?.classList.add('bwd')
241
- nn?.dispatchEvent(new CustomEvent('pageswap', { detail: { page: nn }, bubbles: true, composed: true }));
242
- }
243
- for (const el of inbetweenModals)
244
- el.close(); // close old inbetween modals
245
- // capture trans
246
- console.debug(`⚡️ view-transition-start (${type})`);
247
- await Promise.allSettled([
248
- ...(from.body?.getAnimations().map(({ finished }) => finished) ?? []),
249
- ...(to.body?.getAnimations().map(({ finished }) => finished) ?? []),
250
- ]);
251
- console.debug(`⚡️ view-transition-end (${type})`);
252
- if (to.body?.closest(`.bwd,.${Snapshot.config?.['vt-fwd-class-name']}`))
253
- return;
254
- cleanup(root);
255
- // remove or hide
256
- await updateCallback();
257
- }
112
+ return;
113
+ const trigger = target.closest('[help]');
114
+ if (!trigger)
115
+ return;
116
+ if (['PICKER-VIEW'].includes(trigger.tagName))
117
+ return;
118
+ if (relatedTarget instanceof HTMLElement && trigger.contains(relatedTarget))
119
+ return;
120
+ const newAnchorName = `--help-${self.crypto.randomUUID()}`;
121
+ const tooltip = $(html `<fine-tooltip></fine-tooltip>`, '>1');
122
+ trigger.style.setProperty('anchor-name', newAnchorName);
123
+ tooltip.style.setProperty('position-anchor', newAnchorName);
124
+ document.body.appendChild(tooltip);
125
+ // setInterval(() => {
126
+ // trigger.setAttribute('help', trigger.getAttribute('help') + 'h')
127
+ // }, 2000)
128
+ // console.log(999, trigger)
129
+ }, handleDone = ({ target, relatedTarget }) => {
130
+ if (!(target instanceof HTMLElement))
131
+ return;
132
+ const trigger = target.closest('[help]');
133
+ if (!trigger)
134
+ return;
135
+ if (['PICKER-VIEW'].includes(trigger.tagName))
136
+ return;
137
+ if (relatedTarget instanceof HTMLElement && trigger.contains(relatedTarget))
138
+ return;
139
+ const anchorName = trigger.style.anchorName;
140
+ if (!anchorName.startsWith('--help-'))
141
+ return;
142
+ // for (const el of document.querySelectorAll<HTMLElement>(`[style*="--help-${CSS.escape(anchorName)}"][help]`)) el.style.removeProperty('anchor-name') //trigger.style.removeProperty('anchor-name')
143
+ // for (const el of document.querySelectorAll(`[style*="${CSS.escape(anchorName)}"]:not([help])`)) el.remove()
144
+ // return
145
+ // }
146
+ const tooltip = document.querySelector(`[style*="${CSS.escape(anchorName)}"]:not([help])`);
147
+ if (!tooltip)
148
+ return;
149
+ // for (const el of document.querySelectorAll<HTMLElement>(`[style*="--help-${CSS.escape(anchorName)}"][help]`)) el.style.removeProperty('anchor-name') //trigger.style.removeProperty('anchor-name')
150
+ // for (const el of document.querySelectorAll(`[style*="${CSS.escape(anchorName)}"]:not([help])`)) el.remove()
151
+ // return
152
+ // }
153
+ // trigger.style.removeProperty('anchor-name')
154
+ tooltip.hidePopover(); // tooltip.remove?.()
155
+ };
156
+ const mediaQueryList = self.matchMedia(`(pointer: fine)`);
157
+ mediaQueryList.addEventListener('change', ({ matches }) => {
158
+ for (const [k, v] of [
159
+ ['pointerover', handleHelp],
160
+ ['pointerout', handleDone],
161
+ ])
162
+ document.removeEventListener(k, v);
163
+ if (matches)
164
+ for (const [k, v] of [
165
+ ['pointerover', handleHelp],
166
+ ['pointerout', handleDone],
167
+ ])
168
+ document.addEventListener(k, v, { passive: true });
169
+ });
170
+ if (mediaQueryList.matches)
171
+ for (const [k, v] of [
172
+ ['pointerover', handleHelp],
173
+ ['pointerout', handleDone],
174
+ ])
175
+ document.addEventListener(k, v, { passive: true });
176
+ //#region fns
177
+ // const a = alert('Saving…', 'Please wait')
178
+ // // later, e.g. save completed early
179
+ // a.dismiss() // silently resolves undefined, closes+removes dialog
180
+ // // or
181
+ // a.dismiss(new Error('cancelled')) // rejects instead
182
+ // const result = await a // still works normally if not dismissed
183
+ // const ac = new AbortController()
184
+ // const a = alert('Uploading…', 'Please wait', undefined, { signal: ac.signal })
185
+ // // elsewhere, e.g. upload finished before the user dismissed
186
+ // ac.abort() // dialog closes silently, a rejects with AbortError
187
+ // // or still works standalone
188
+ // a.dismiss() // same effect, no signal needed
189
+ /**
190
+ * Presents an alert with a message using the given data to produce the alert’s content and a string variable as a title.
191
+ */
192
+ export const alert = (title, message, actions, options) => {
193
+ const { promise, resolve, reject } = Promise.withResolvers();
194
+ let dialog;
195
+ let off;
196
+ const dismiss = (reason) => {
197
+ off?.();
198
+ dialog?.close();
199
+ // dialog?.remove()
200
+ reason === undefined ? resolve(undefined) : reject(reason instanceof Error ? reason : new DOMException('Alert dismissed', 'AbortError'));
201
+ };
202
+ if (options?.signal)
203
+ if (options.signal.aborted)
204
+ dismiss(options.signal.reason); // already aborted before we even started — settle immediately, skip showing anything
205
+ else
206
+ options.signal.addEventListener('abort', () => dismiss(options.signal.reason), { once: true });
207
+ navigator.locks
208
+ .request('alert:', async () => {
209
+ if (options?.signal?.aborted)
210
+ return; // in case it was aborted while queued behind another lock holder
211
+ const mount = document.createElement('div');
212
+ render(html `<dialog is="alert-dialog">
213
+ <v-stack spacing="1" alignment="fill">
214
+ ${title ? html `<label-view font="headline" title="${title}"></label-view>` : null}
215
+ ${message ? html `<label-view foreground="secondary" font="callout" title="${message}"></label-view>` : null}
216
+ </v-stack>
217
+ ${(actions ?? [{ role: 'close' }]).map((action, index) => html `
218
+ <button type="button" tabindex="0" is="bordered-button" value="${index}" role="${action.role ?? null}">
219
+ ${action.label || action.image ? html `<label-view title="${action.label ?? null}" system-image="${action.image ?? null}"></label-view>` : null}
220
+ </button>
221
+ `)}
222
+ </dialog>`, mount);
223
+ dialog = mount.firstElementChild;
224
+ document.body.insertAdjacentElement('beforeend', dialog);
225
+ dialog.showModal();
226
+ off = onoff('alert:return', (evt) => {
227
+ const { detail } = evt;
228
+ off?.();
229
+ resolve(detail.returnValue);
230
+ }, alertDialog, { once: true }).on();
231
+ return promise;
232
+ })
233
+ .catch(() => { });
234
+ return Object.assign(promise, { dismiss });
258
235
  };
259
- export const confirmationDialog = async (trigger, title, entries, controller = new AbortController()) => {
236
+ export const confirmationDialog = async (trigger, title, message, actions, options) => {
260
237
  const newAnchorName = `--confirmation-dialog-${self.crypto.randomUUID()}`;
261
- const dialog = $(`<dialog is="confirmation-dialog">
262
- ${entries.map((item, index) => `<button type="button" tabindex="0" value="${index}">
263
- <label-view title="${item[0]}"></label-view>
264
- </button>`)}
265
- </dialog>`);
266
- $.prop('anchor-name', newAnchorName, trigger, 'important');
267
- $.prop('position-anchor', newAnchorName, dialog);
268
- if (title) {
269
- const label = $(`<label-view></label-view>`);
238
+ const dialog = $(html `<dialog is="confirmation-dialog"></dialog>`, '>1'), vStack = dialog.querySelector(':scope>v-stack') ?? dialog.appendChild($(html `<v-stack spacing="1" alignment="fill"></v-stack>`, '>1'));
239
+ trigger.style.setProperty('anchor-name', newAnchorName, 'important'); //$.prop('anchor-name', newAnchorName, trigger, 'important')
240
+ dialog.style.setProperty('position-anchor', newAnchorName); //$.prop('position-anchor', newAnchorName, dialog)
241
+ if (title && false !== options?.titleVisibility) {
242
+ const label = $(html `<label-view font="headline"></label-view>`, '>1');
270
243
  label.setAttribute('title', title);
271
- dialog.insertAdjacentElement('afterbegin', label);
244
+ vStack.insertAdjacentElement('beforeend', label);
272
245
  }
273
- trigger.closest('body-view')?.insertAdjacentElement('beforeend', dialog); // dialog.showModal()
274
- return await new Promise((resolve, reject) => {
275
- const onClose = (evt) => {
276
- off();
277
- resolve(evt.detail.returnValue);
278
- }, off = onoff('return', onClose, ConfirmationDialog, { once: true }).on();
279
- // const onAbort = () => {
280
- // cleanup()
281
- // reject(new DOMException('aborted', 'AbortError'))
282
- // }
283
- // const cleanup = () => {
284
- // ConfirmationDialog.removeEventListener('close', onClose)
285
- // // controller.signal.removeEventListener('abort', onAbort)
286
- // }
287
- // ConfirmationDialog.addEventListener('close', onClose, { once: true })
288
- // controller.signal.addEventListener('abort', onAbort, { once: true })
289
- });
246
+ if (message && false !== options?.titleVisibility) {
247
+ const label = $(html `<label-view foreground="secondary" font="callout"></label-view>`, '>1');
248
+ label.setAttribute('title', message);
249
+ vStack.insertAdjacentElement('beforeend', label);
250
+ }
251
+ for (const [index, action] of (actions ?? []).entries()) {
252
+ const btn = $(html `<button type="button" tabindex="0" is="bordered-button"></button>`, '>1');
253
+ btn.setAttribute('value', `${index}`);
254
+ if (action?.role)
255
+ btn.setAttribute('role', action.role);
256
+ if (action.label || action.image) {
257
+ const label = $(html `<label-view></label-view>`, '>1');
258
+ if (action.label)
259
+ label.setAttribute('title', action.label);
260
+ if (action.image)
261
+ label.setAttribute('system-image', action.image);
262
+ btn.appendChild(label);
263
+ }
264
+ dialog.insertAdjacentElement('beforeend', btn);
265
+ }
266
+ trigger.closest('body-view,dialog')?.insertAdjacentElement('beforeend', dialog); // dialog.showModal()
267
+ const { promise, resolve } = Promise.withResolvers(), off = onoff('confirmation:return', (evt) => {
268
+ const { detail } = evt;
269
+ off();
270
+ resolve(detail.returnValue);
271
+ }, confirmationDialogBus, { once: true }).on();
272
+ return promise;
290
273
  };
291
- void Snapshot.waitReady; // void Snapshot.setOwnConfig()
292
- // SECTION
293
- export { ConfirmationDialog, I18n, LifecycleObserver, NavigationPath, Snapshot };
274
+ //#endregion
275
+ void Snapshot.waitReady;
276
+ //#region exports
277
+ export { I18n, lifecycleObserver, NavigationPath, queryInsertPosition, Snapshot, startViewTransition };
278
+ //#endregion
@@ -0,0 +1,11 @@
1
+ import { DialogBase } from '../namespace-browser/base';
2
+ /**
3
+ * @summary A dialog that shows a message. Use it from the client module like `void alert('Save failed.')`.
4
+ */
5
+ export declare class AlertDialog extends DialogBase {
6
+ #private;
7
+ constructor();
8
+ static polyfillDisconnectedCallback(el: AlertDialog): void;
9
+ static polyfillConnectedCallback(el: AlertDialog): void;
10
+ static polyfillAttributeChangedCallback([{ attributeName, target, oldValue }]: Pick<MutationRecord, 'attributeName' | 'oldValue' | 'target'>[]): void;
11
+ }