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

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 (263) hide show
  1. package/README.md +15 -0
  2. package/generated/client/index.d.ts +13 -3
  3. package/generated/client/index.js +228 -158
  4. package/generated/components/bordered-button.d.ts +7 -0
  5. package/generated/components/bordered-button.js +20 -0
  6. package/generated/components/bordered-prominent-button.d.ts +7 -0
  7. package/generated/components/bordered-prominent-button.js +20 -0
  8. package/generated/components/borderless-button.d.ts +4 -4
  9. package/generated/components/borderless-button.js +26 -16
  10. package/generated/components/confirmation-dialog.d.ts +9 -0
  11. package/generated/components/confirmation-dialog.js +102 -0
  12. package/generated/components/date-picker.d.ts +46 -0
  13. package/generated/components/date-picker.js +430 -0
  14. package/generated/components/disclosure-group.d.ts +4 -7
  15. package/generated/components/disclosure-group.js +41 -66
  16. package/generated/components/form-view.d.ts +6 -0
  17. package/generated/components/form-view.js +58 -0
  18. package/generated/components/glass-button.d.ts +6 -0
  19. package/generated/components/glass-button.js +17 -0
  20. package/generated/components/glass-prominent-button.d.ts +6 -0
  21. package/generated/components/glass-prominent-button.js +17 -0
  22. package/generated/components/index.d.ts +34 -10
  23. package/generated/components/index.js +33 -14
  24. package/generated/components/label-view.d.ts +9 -0
  25. package/generated/components/label-view.js +83 -0
  26. package/generated/components/list-view.d.ts +5 -0
  27. package/generated/components/list-view.js +29 -0
  28. package/generated/components/menu-view.d.ts +9 -0
  29. package/generated/components/menu-view.js +133 -0
  30. package/generated/components/navigation-large-title.d.ts +6 -0
  31. package/generated/components/navigation-large-title.js +177 -0
  32. package/generated/components/navigation-split-view.d.ts +4 -2
  33. package/generated/components/navigation-split-view.js +11 -2
  34. package/generated/components/navigation-stack.d.ts +3 -2
  35. package/generated/components/navigation-stack.js +15 -58
  36. package/generated/components/navigation-title.d.ts +8 -0
  37. package/generated/components/navigation-title.js +66 -0
  38. package/generated/components/picker-view.d.ts +27 -0
  39. package/generated/components/picker-view.js +442 -0
  40. package/generated/components/plain-button.d.ts +7 -0
  41. package/generated/components/plain-button.js +20 -0
  42. package/generated/components/screen-view.d.ts +1 -1
  43. package/generated/components/screen-view.js +1 -1
  44. package/generated/components/scroll-view.d.ts +4 -2
  45. package/generated/components/scroll-view.js +169 -62
  46. package/generated/components/section-view.d.ts +9 -0
  47. package/generated/components/section-view.js +81 -0
  48. package/generated/components/sheet-view.d.ts +4 -4
  49. package/generated/components/sheet-view.js +59 -16
  50. package/generated/components/sidebar-toggle.d.ts +1 -1
  51. package/generated/components/sidebar-toggle.js +89 -63
  52. package/generated/components/sidebar-view.d.ts +2 -4
  53. package/generated/components/sidebar-view.js +20 -17
  54. package/generated/components/sticky-container.d.ts +6 -0
  55. package/generated/components/sticky-container.js +22 -0
  56. package/generated/components/tab-bar.d.ts +2 -4
  57. package/generated/components/tab-bar.js +24 -17
  58. package/generated/components/tab-item.d.ts +4 -3
  59. package/generated/components/tab-item.js +114 -29
  60. package/generated/components/tab-view.d.ts +17 -2
  61. package/generated/components/tab-view.js +244 -17
  62. package/generated/components/table-view.d.ts +7 -0
  63. package/generated/components/table-view.js +175 -0
  64. package/generated/components/text-field.d.ts +29 -0
  65. package/generated/components/text-field.js +489 -0
  66. package/generated/components/tool-bar-item-group.d.ts +5 -0
  67. package/generated/components/tool-bar-item-group.js +11 -0
  68. package/generated/components/tool-bar-item.d.ts +5 -0
  69. package/generated/components/tool-bar-item.js +19 -0
  70. package/generated/components/tool-bar.d.ts +7 -0
  71. package/generated/components/tool-bar.js +77 -0
  72. package/generated/components/v-keyboard.d.ts +2 -0
  73. package/generated/components/v-keyboard.js +64 -68
  74. package/generated/components/v-stack.d.ts +5 -0
  75. package/generated/components/v-stack.js +11 -0
  76. package/generated/confirmation-dialog/index.d.ts +1 -0
  77. package/generated/confirmation-dialog/index.js +1 -0
  78. package/generated/css/index.css +7463 -0
  79. package/generated/events/confirmation-dialog.d.ts +9 -0
  80. package/generated/events/date-picker.d.ts +8 -0
  81. package/generated/events/date-picker.js +1 -0
  82. package/generated/events/index.d.ts +7 -0
  83. package/generated/events/index.js +7 -0
  84. package/generated/events/lifecycle-observer.d.ts +10 -0
  85. package/generated/events/lifecycle-observer.js +1 -0
  86. package/generated/events/picker-view.d.ts +8 -0
  87. package/generated/events/picker-view.js +1 -0
  88. package/generated/events/scroll-view.d.ts +10 -0
  89. package/generated/events/scroll-view.js +1 -0
  90. package/generated/events/tab-view.d.ts +24 -0
  91. package/generated/events/tab-view.js +1 -0
  92. package/generated/events/text-field.d.ts +8 -0
  93. package/generated/events/text-field.js +1 -0
  94. package/generated/i18n/index.d.ts +24 -0
  95. package/generated/i18n/index.js +139 -0
  96. package/generated/internal/class/cleanup-registry.d.ts +5 -0
  97. package/generated/internal/class/cleanup-registry.js +38 -0
  98. package/generated/internal/class/css-style-observer.d.ts +8 -0
  99. package/generated/internal/class/css-style-observer.js +25 -0
  100. package/generated/internal/class/form-associated-base.d.ts +20 -0
  101. package/generated/internal/class/form-associated-base.js +93 -0
  102. package/generated/internal/class/mutation-observer-singleton.d.ts +10 -0
  103. package/generated/internal/class/mutation-observer-singleton.js +46 -0
  104. package/generated/internal/class/navigation-path.d.ts +15 -0
  105. package/generated/internal/class/navigation-path.js +84 -0
  106. package/generated/internal/class/navigation-view.d.ts +8 -0
  107. package/generated/internal/class/navigation-view.js +77 -0
  108. package/generated/internal/class/resize-observer-singleton.d.ts +7 -0
  109. package/generated/internal/class/resize-observer-singleton.js +22 -0
  110. package/generated/internal/decorators/custom-element.d.ts +5 -0
  111. package/generated/internal/decorators/custom-element.js +4 -0
  112. package/generated/internal/privateNamespace.d.ts +4 -0
  113. package/generated/internal/privateNamespace.js +1 -0
  114. package/generated/internal/utils/add.d.ts +1 -0
  115. package/generated/internal/utils/add.js +7 -0
  116. package/generated/internal/utils/cash/ancestors.d.ts +1 -0
  117. package/generated/internal/utils/cash/ancestors.js +27 -0
  118. package/generated/internal/utils/cash/index.d.ts +22 -0
  119. package/generated/internal/utils/cash/index.js +23 -0
  120. package/generated/internal/utils/cash/next-all.d.ts +1 -0
  121. package/generated/internal/utils/cash/next-all.js +10 -0
  122. package/generated/internal/utils/cash/next.d.ts +1 -0
  123. package/generated/internal/utils/cash/next.js +9 -0
  124. package/generated/internal/utils/cash/prev-all.d.ts +1 -0
  125. package/generated/internal/utils/cash/prev-all.js +10 -0
  126. package/generated/internal/utils/cash/prev.d.ts +1 -0
  127. package/generated/internal/utils/cash/prev.js +9 -0
  128. package/generated/internal/utils/cash/prop.d.ts +18 -0
  129. package/generated/internal/utils/cash/prop.js +30 -0
  130. package/generated/internal/utils/cash/siblings.d.ts +1 -0
  131. package/generated/internal/utils/cash/siblings.js +10 -0
  132. package/generated/internal/utils/clamp.d.ts +1 -0
  133. package/generated/internal/utils/clamp.js +4 -0
  134. package/generated/internal/utils/compare-big-decimals.d.ts +1 -0
  135. package/generated/internal/utils/compare-big-decimals.js +90 -0
  136. package/generated/internal/utils/debounce.d.ts +1 -0
  137. package/generated/internal/utils/debounce.js +13 -0
  138. package/generated/internal/utils/frame.d.ts +1 -0
  139. package/generated/internal/utils/frame.js +6 -0
  140. package/generated/internal/utils/index.d.ts +16 -1
  141. package/generated/internal/utils/index.js +17 -1
  142. package/generated/internal/utils/kebab-case.d.ts +1 -1
  143. package/generated/internal/utils/list-active.d.ts +7 -0
  144. package/generated/internal/utils/list-active.js +28 -0
  145. package/generated/internal/utils/microtask.d.ts +1 -0
  146. package/generated/internal/utils/microtask.js +3 -0
  147. package/generated/internal/utils/onoff.d.ts +45 -0
  148. package/generated/internal/utils/onoff.js +31 -0
  149. package/generated/internal/utils/set.d.ts +1 -0
  150. package/generated/internal/utils/set.js +7 -0
  151. package/generated/internal/utils/sleep.d.ts +1 -0
  152. package/generated/internal/utils/sleep.js +3 -0
  153. package/generated/internal/utils/slow-hide-show.d.ts +1 -0
  154. package/generated/internal/utils/slow-hide-show.js +16 -0
  155. package/generated/internal/utils/timeout.d.ts +5 -0
  156. package/generated/internal/utils/timeout.js +16 -0
  157. package/generated/internal/utils/touch-glass.d.ts +7 -0
  158. package/generated/internal/utils/touch-glass.js +19 -0
  159. package/generated/lifecycle-observer/index.d.ts +1 -0
  160. package/generated/lifecycle-observer/index.js +1 -0
  161. package/generated/namespace-browser/base.d.ts +36 -0
  162. package/generated/namespace-browser/base.js +92 -0
  163. package/generated/namespace-browser/index.d.ts +7 -0
  164. package/generated/namespace-browser/index.js +1 -0
  165. package/generated/snapshot/index.d.ts +2 -11
  166. package/generated/snapshot/index.js +31 -144
  167. package/package.json +19 -8
  168. package/scss/_components.scss +52 -16
  169. package/scss/_final.scss +1 -0
  170. package/scss/_mixins.scss +2 -171
  171. package/scss/_placeholders.scss +3 -0
  172. package/scss/_transitions.scss +16 -0
  173. package/scss/_utils.scss +9 -0
  174. package/scss/_vars.scss +137 -23
  175. package/scss/base/_layout.scss +31 -15
  176. package/scss/base/_reboot.scss +118 -15
  177. package/scss/base/_root.scss +355 -25
  178. package/scss/colors/_index.scss +624 -70
  179. package/scss/components/_body-view.scss +12 -3
  180. package/scss/components/_bordered-button.scss +22 -0
  181. package/scss/components/_bordered-prominent-button.scss +19 -0
  182. package/scss/components/_borderless-button.scss +11 -6
  183. package/scss/components/_confirmation-dialog.scss +110 -0
  184. package/scss/components/_date-picker.scss +30 -0
  185. package/scss/components/_detail-placeholder.scss +155 -0
  186. package/scss/components/_disclosure-group.scss +100 -52
  187. package/scss/components/_form-view.scss +195 -0
  188. package/scss/components/_full-screen.scss +7 -5
  189. package/scss/components/_glass-button.scss +24 -0
  190. package/scss/components/_glass-prominent-button.scss +24 -0
  191. package/scss/components/_h-divider.scss +13 -0
  192. package/scss/components/_h-stack.scss +39 -0
  193. package/scss/components/_index.scss +224 -7
  194. package/scss/components/_label-view.scss +386 -0
  195. package/scss/components/_labeled-content.scss +9 -0
  196. package/scss/components/_list-view.scss +229 -0
  197. package/scss/components/_menu-view.scss +188 -0
  198. package/scss/components/_navigation-large-title.scss +27 -0
  199. package/scss/components/_navigation-split-view.scss +329 -269
  200. package/scss/components/_navigation-stack.scss +6 -6
  201. package/scss/components/_navigation-title.scss +10 -0
  202. package/scss/components/_picker-view.scss +122 -0
  203. package/scss/components/_plain-button.scss +11 -0
  204. package/scss/components/_scroll-view-proxy.scss +79 -0
  205. package/scss/components/_scroll-view-toolbars.scss +126 -0
  206. package/scss/components/_scroll-view.scss +110 -66
  207. package/scss/components/_section-view.scss +119 -0
  208. package/scss/components/_sheet-view.scss +68 -35
  209. package/scss/components/_sidebar-toggle.scss +90 -27
  210. package/scss/components/_sidebar-view.scss +30 -40
  211. package/scss/components/_sticky-container.scss +42 -0
  212. package/scss/components/_tab-bar.scss +201 -84
  213. package/scss/components/_tab-item.scss +25 -0
  214. package/scss/components/_tab-view.scss +268 -126
  215. package/scss/components/_table-column.scss +52 -0
  216. package/scss/components/_table-row.scss +172 -0
  217. package/scss/components/_table-view.scss +223 -0
  218. package/scss/components/_text-field.scss +37 -0
  219. package/scss/components/_tool-bar-item-group.scss +30 -19
  220. package/scss/components/_tool-bar-item.scss +128 -70
  221. package/scss/components/_tool-bar.scss +107 -64
  222. package/scss/components/_v-divider.scss +13 -0
  223. package/scss/components/_v-flex-stack.scss +29 -0
  224. package/scss/components/_v-keyboard.scss +6 -4
  225. package/scss/components/_v-stack.scss +8 -9
  226. package/scss/final/_touch-glass.scss +67 -0
  227. package/scss/index.scss +6 -2
  228. package/scss/mixins/_dialog.scss +88 -0
  229. package/scss/mixins/_index.scss +405 -0
  230. package/scss/placeholders/_buttons.scss +83 -0
  231. package/scss/placeholders/_lists.scss +589 -0
  232. package/scss/transitions/_bwd.navbar.scss +3 -13
  233. package/scss/transitions/_bwd.scss +4 -20
  234. package/scss/transitions/_confirmation-dialog.scss +19 -0
  235. package/scss/transitions/_dialog.scss +7 -11
  236. package/scss/transitions/_disclosure-group.scss +35 -0
  237. package/scss/transitions/_fwd.navbar.scss +4 -9
  238. package/scss/transitions/_fwd.scss +4 -34
  239. package/scss/transitions/_glass-button.scss +12 -0
  240. package/scss/transitions/_glass-prominent-button.scss +12 -0
  241. package/scss/transitions/_index.scss +35 -143
  242. package/scss/transitions/_menu-view.scss +26 -0
  243. package/scss/transitions/_navigation-split-view.scss +23 -0
  244. package/scss/transitions/_sidebar-view.scss +36 -0
  245. package/scss/transitions/_tab-bar.scss +19 -0
  246. package/scss/utils/_frame.scss +84 -0
  247. package/scss/utils/_index.scss +68 -0
  248. package/scss/utils/_scroll-view.scss +14 -0
  249. package/scss/utils/_spacing.scss +25 -0
  250. package/scss/utils/_stacks.scss +242 -0
  251. package/web-components.html-data/en.json +330 -0
  252. package/generated/components/bottom-bar.d.ts +0 -10
  253. package/generated/components/bottom-bar.js +0 -73
  254. package/generated/components/navigation-bar.d.ts +0 -10
  255. package/generated/components/navigation-bar.js +0 -80
  256. package/generated/internal/class.d.ts +0 -18
  257. package/generated/internal/class.js +0 -18
  258. package/generated/namespace/index.d.ts +0 -6
  259. package/generated/styles.css +0 -1305
  260. package/scss/_dev.scss +0 -68
  261. package/scss/components/_tab-bar-stack.scss +0 -101
  262. package/scss/components/_toolbars.scss +0 -100
  263. /package/generated/{namespace/index.js → events/confirmation-dialog.js} +0 -0
@@ -0,0 +1,9 @@
1
+ export type ReturnDetail = {
2
+ returnValue: string;
3
+ positionAnchor: string;
4
+ };
5
+ declare global {
6
+ interface HTMLElementEventMap {
7
+ return: CustomEvent<ReturnDetail>;
8
+ }
9
+ }
@@ -0,0 +1,8 @@
1
+ export type DatePickerSelectionDetail = {
2
+ selection: string;
3
+ };
4
+ declare global {
5
+ interface HTMLElementEventMap {
6
+ selection: CustomEvent<DatePickerSelectionDetail>;
7
+ }
8
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,7 @@
1
+ export * from './confirmation-dialog';
2
+ export * from './date-picker';
3
+ export * from './lifecycle-observer';
4
+ export * from './picker-view';
5
+ export * from './scroll-view';
6
+ export * from './tab-view';
7
+ export * from './text-field';
@@ -0,0 +1,7 @@
1
+ export * from './confirmation-dialog';
2
+ export * from './date-picker';
3
+ export * from './lifecycle-observer';
4
+ export * from './picker-view';
5
+ export * from './scroll-view';
6
+ export * from './tab-view';
7
+ export * from './text-field';
@@ -0,0 +1,10 @@
1
+ import { type ScrollView } from '../components';
2
+ export type PageShowHideDetail = {
3
+ page: ScrollView;
4
+ };
5
+ declare global {
6
+ interface HTMLElementEventMap {
7
+ pageshow: CustomEvent<PageShowHideDetail>;
8
+ pagehide: CustomEvent<PageShowHideDetail>;
9
+ }
10
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,8 @@
1
+ export type PickerSelectionDetail = {
2
+ selection: string;
3
+ };
4
+ declare global {
5
+ interface HTMLElementEventMap {
6
+ selection: CustomEvent<PickerSelectionDetail>;
7
+ }
8
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,10 @@
1
+ import { type ScrollView } from '../components';
2
+ export type PageRevealSwapDetail = {
3
+ page: ScrollView;
4
+ };
5
+ declare global {
6
+ interface HTMLElementEventMap {
7
+ pagereveal: CustomEvent<PageRevealSwapDetail>;
8
+ pageswap: CustomEvent<PageRevealSwapDetail>;
9
+ }
10
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,24 @@
1
+ import { type NavigationSplitView, type NavigationStack } from '../components';
2
+ import { type TabBarPlacement } from '../components/tab-view';
3
+ export type TabDetail = {
4
+ tag: string;
5
+ };
6
+ export type TabViewDetail = {
7
+ selection: (NavigationStack | NavigationSplitView)[];
8
+ };
9
+ export type TabViewAdaptableTabBarPlacementDetail = {
10
+ oldValue?: TabBarPlacement;
11
+ newValue?: TabBarPlacement;
12
+ };
13
+ declare global {
14
+ interface HTMLElementEventMap {
15
+ tabshow: CustomEvent<TabDetail>;
16
+ tabhide: CustomEvent<TabDetail>;
17
+ tabreveal: CustomEvent<TabDetail>;
18
+ tabswap: CustomEvent<TabDetail>;
19
+ beforetabreveal: CustomEvent<TabDetail>;
20
+ beforetabswap: CustomEvent<TabDetail>;
21
+ 'tab-view:toggle': CustomEvent<TabViewDetail>;
22
+ 'tab-view:adaptable-tab-bar-placement-change': CustomEvent<TabViewAdaptableTabBarPlacementDetail>;
23
+ }
24
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,8 @@
1
+ export type TextFieldCommitDetail = {
2
+ text: string;
3
+ };
4
+ declare global {
5
+ interface HTMLElementEventMap {
6
+ commit: CustomEvent<TextFieldCommitDetail>;
7
+ }
8
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,24 @@
1
+ type LocaleInput = Intl.UnicodeBCP47LocaleIdentifier | Intl.Locale;
2
+ type I18nProps = {
3
+ tag?: LocaleInput;
4
+ options?: Intl.LocaleOptions;
5
+ locale: Intl.Locale;
6
+ decimalSeparator: string;
7
+ dateSeparator: string;
8
+ dateOrder: string[];
9
+ };
10
+ export declare class I18n {
11
+ #private;
12
+ static on: EventTarget;
13
+ static _props: I18nProps;
14
+ static get tag(): LocaleInput | undefined;
15
+ static set tag(val: LocaleInput | undefined);
16
+ static get options(): Intl.LocaleOptions | undefined;
17
+ static set options(val: Intl.LocaleOptions | undefined);
18
+ static get locale(): Intl.Locale;
19
+ static get decimalSeparator(): string;
20
+ static get dateSeparator(): string;
21
+ static get dateOrder(): string[];
22
+ static setOwnConfig(options?: Intl.LocaleOptions): void;
23
+ }
24
+ export {};
@@ -0,0 +1,139 @@
1
+ export class I18n {
2
+ static #readyCalled = false;
3
+ static #tag = 'en';
4
+ static #options;
5
+ static #locale = new Intl.Locale('en');
6
+ static #observer;
7
+ static #decimalSeparator = '.';
8
+ static #dateSeparator = '/';
9
+ static #dateOrder = ['month', 'day', 'year'];
10
+ static on = new EventTarget();
11
+ // ----------------------------
12
+ // Lazy init
13
+ // ----------------------------
14
+ static #ensureReady() {
15
+ if (!this.#readyCalled)
16
+ this.setOwnConfig();
17
+ }
18
+ // ----------------------------
19
+ // Proxy with typed target
20
+ // ----------------------------
21
+ static _props = new Proxy({}, {
22
+ get: (_, prop) => {
23
+ this.#ensureReady();
24
+ switch (prop) {
25
+ case 'tag':
26
+ return this.#tag;
27
+ case 'options':
28
+ return this.#options;
29
+ case 'locale':
30
+ return this.#locale;
31
+ case 'decimalSeparator':
32
+ return this.#decimalSeparator;
33
+ case 'dateSeparator':
34
+ return this.#dateSeparator;
35
+ case 'dateOrder':
36
+ return this.#dateOrder;
37
+ }
38
+ },
39
+ set: (_, prop, value) => {
40
+ switch (prop) {
41
+ case 'tag':
42
+ this.#observer?.disconnect();
43
+ this.#observer = undefined;
44
+ this.#tag = value;
45
+ this.#getOwnConfig();
46
+ break;
47
+ case 'options':
48
+ this.#options = value;
49
+ this.#getOwnConfig();
50
+ break;
51
+ }
52
+ return true;
53
+ },
54
+ });
55
+ // ----------------------------
56
+ // Accessors
57
+ // ----------------------------
58
+ static get tag() {
59
+ return this._props.tag;
60
+ }
61
+ static set tag(val) {
62
+ this._props.tag = val;
63
+ }
64
+ static get options() {
65
+ return this._props.options;
66
+ }
67
+ static set options(val) {
68
+ this._props.options = val;
69
+ }
70
+ static get locale() {
71
+ return this._props.locale;
72
+ }
73
+ static get decimalSeparator() {
74
+ return this._props.decimalSeparator;
75
+ }
76
+ static get dateSeparator() {
77
+ return this._props.dateSeparator;
78
+ }
79
+ static get dateOrder() {
80
+ return this._props.dateOrder;
81
+ }
82
+ // ----------------------------
83
+ // Core logic
84
+ // ----------------------------
85
+ static setOwnConfig(options) {
86
+ if (!this.#readyCalled)
87
+ this.#readyCalled = true;
88
+ this.#tag = document.documentElement.lang;
89
+ this.#options = options;
90
+ this.#observer?.disconnect();
91
+ this.#observer = new MutationObserver(this.#handleMutation.bind(this));
92
+ this.#observer.observe(document.documentElement, {
93
+ attributes: true,
94
+ attributeFilter: ['lang'],
95
+ });
96
+ this.#getOwnConfig();
97
+ }
98
+ static #handleMutation() {
99
+ if (!this.#observer)
100
+ return;
101
+ this.#tag = document.documentElement.lang;
102
+ this.#getOwnConfig();
103
+ this.on.dispatchEvent(new CustomEvent('change'));
104
+ }
105
+ static #getOwnConfig() {
106
+ try {
107
+ this.#locale = new Intl.Locale(this.#tag ?? 'en', this.#options);
108
+ }
109
+ catch {
110
+ this.#locale = new Intl.Locale('en');
111
+ }
112
+ console.debug(this.#locale);
113
+ try {
114
+ const nf = new Intl.NumberFormat(this.#locale);
115
+ const parts = nf.formatToParts(1.1);
116
+ this.#decimalSeparator = parts.find(({ type }) => type === 'decimal')?.value ?? '.';
117
+ }
118
+ catch {
119
+ this.#decimalSeparator = '.';
120
+ }
121
+ console.debug(this.#decimalSeparator);
122
+ try {
123
+ const df = new Intl.DateTimeFormat(this.#locale);
124
+ const parts = df.formatToParts(new Date(2000, 11, 31));
125
+ this.#dateOrder = parts.filter(({ type }) => type !== 'literal')?.map(({ type }) => type) ?? ['month', 'day', 'year'];
126
+ this.#dateSeparator =
127
+ parts
128
+ .filter(({ type }) => type === 'literal')
129
+ .map(({ value }) => value)
130
+ .at(0) ?? '/';
131
+ }
132
+ catch {
133
+ this.#dateOrder = ['month', 'day', 'year'];
134
+ this.#dateSeparator = '/';
135
+ }
136
+ console.debug(`${I18n.name} ${this.#dateSeparator}`);
137
+ console.debug(`${I18n.name} ${this.#dateOrder}`);
138
+ }
139
+ }
@@ -0,0 +1,5 @@
1
+ export declare class CleanupRegistry {
2
+ #private;
3
+ static register(target: Element, heldValue: () => void, unregisterToken?: string | symbol): void;
4
+ static unregister(target: Element, token?: string | symbol): void;
5
+ }
@@ -0,0 +1,38 @@
1
+ export class CleanupRegistry {
2
+ static #cleanups = new WeakMap();
3
+ static #DEFAULT = Symbol('__default__');
4
+ static register(target, heldValue, unregisterToken = this.#DEFAULT) {
5
+ let tokens = this.#cleanups.get(target);
6
+ if (!tokens)
7
+ this.#cleanups.set(target, (tokens = new Map()));
8
+ let fns = tokens.get(unregisterToken);
9
+ if (!fns)
10
+ tokens.set(unregisterToken, (fns = new Set()));
11
+ fns.add(heldValue);
12
+ }
13
+ static unregister(target, token) {
14
+ const tokens = this.#cleanups.get(target);
15
+ if (!tokens)
16
+ return;
17
+ if (undefined === token) {
18
+ for (const fns of tokens.values())
19
+ for (const fn of fns)
20
+ fn();
21
+ this.#cleanups.delete(target);
22
+ }
23
+ else if ('string' === typeof token && token.endsWith('*')) {
24
+ const prefix = token.slice(0, -1);
25
+ for (const [key, fns] of tokens)
26
+ if ('string' === typeof key && key.startsWith(prefix)) {
27
+ for (const fn of fns)
28
+ fn();
29
+ tokens.delete(key);
30
+ }
31
+ }
32
+ else {
33
+ for (const fn of tokens.get(token) ?? [])
34
+ fn();
35
+ tokens.delete(token);
36
+ }
37
+ }
38
+ }
@@ -0,0 +1,8 @@
1
+ export declare class CSSStyleObserver {
2
+ #private;
3
+ constructor(options?: {
4
+ properties: string[];
5
+ });
6
+ observe(target: Node, callback: (evt: TransitionEvent) => void): Promise<void>;
7
+ disconnect(): Promise<void>;
8
+ }
@@ -0,0 +1,25 @@
1
+ var _a;
2
+ import { onoff } from '../../internal/utils';
3
+ export class CSSStyleObserver {
4
+ #cleanups;
5
+ #options;
6
+ constructor(options = {
7
+ properties: ['perspective-origin'], // --other-number-@property
8
+ }) {
9
+ this.#options = options;
10
+ }
11
+ async observe(target, callback) {
12
+ const listener = this.#handleTransitionrun.bind(this, callback);
13
+ this.#cleanups = onoff('transitionrun', listener, target).on();
14
+ }
15
+ async disconnect() {
16
+ this.#cleanups?.();
17
+ }
18
+ #handleTransitionrun = (callback, evt) => {
19
+ console.debug(`${_a.name} ⚡️ ${evt?.type}`);
20
+ if (!this.#options?.properties.some((prop) => evt.propertyName.startsWith(prop)))
21
+ return;
22
+ callback?.(evt);
23
+ };
24
+ }
25
+ _a = CSSStyleObserver;
@@ -0,0 +1,20 @@
1
+ export declare function getInternals(instance: FormAssociatedBase): ElementInternals;
2
+ export declare function makeSlotchangeHandler(t: FormAssociatedBase): {
3
+ types: string;
4
+ listener: (evt: Event) => void;
5
+ }[];
6
+ export declare abstract class FormAssociatedBase extends HTMLElement {
7
+ abstract setValidity(flags?: ValidityStateFlags, message?: string, anchor?: HTMLElement): void;
8
+ static get formAssociated(): boolean;
9
+ constructor();
10
+ disconnectedCallback(): void;
11
+ connectedCallback(): void;
12
+ get type(): string;
13
+ get form(): HTMLFormElement | null;
14
+ get validity(): ValidityState;
15
+ get validationMessage(): string;
16
+ get willValidate(): boolean;
17
+ checkValidity: () => boolean;
18
+ reportValidity: () => boolean;
19
+ shake: (times?: number, distance?: number, duration?: number) => Promise<void>;
20
+ }
@@ -0,0 +1,93 @@
1
+ import { CleanupRegistry } from './cleanup-registry';
2
+ import { MutationObserverSingleton } from './mutation-observer-singleton';
3
+ const internals = new WeakMap();
4
+ const trackedElements = new WeakMap();
5
+ const observers = new MutationObserverSingleton();
6
+ export function getInternals(instance) {
7
+ const i = internals.get(instance);
8
+ if (!i)
9
+ throw new Error('Not a FormAssociatedBase instance');
10
+ return i;
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
+ }
41
+ export class FormAssociatedBase extends HTMLElement {
42
+ static get formAssociated() {
43
+ return true;
44
+ }
45
+ constructor() {
46
+ super();
47
+ internals.set(this, this.attachInternals());
48
+ trackedElements.set(this, new Set());
49
+ }
50
+ disconnectedCallback() {
51
+ console.debug(`${FormAssociatedBase.name} ⚡️ disconnect`);
52
+ 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)
56
+ }
57
+ connectedCallback() {
58
+ console.debug(`${FormAssociatedBase.name} ⚡️ connect`);
59
+ }
60
+ get type() {
61
+ return this.localName;
62
+ }
63
+ get form() {
64
+ return getInternals(this).form;
65
+ }
66
+ get validity() {
67
+ return getInternals(this).validity;
68
+ }
69
+ get validationMessage() {
70
+ return getInternals(this).validationMessage;
71
+ }
72
+ get willValidate() {
73
+ return getInternals(this).willValidate;
74
+ }
75
+ checkValidity = () => {
76
+ return getInternals(this).checkValidity();
77
+ };
78
+ reportValidity = () => {
79
+ return getInternals(this).reportValidity();
80
+ };
81
+ shake = async (times = 3, distance = 8, duration = 400) => {
82
+ const frames = [{ transform: 'translateX(0)' }];
83
+ for (let i = 0; i < times; i++)
84
+ frames.push({ transform: `translateX(-${distance}px)` }, { transform: `translateX(${distance}px)` });
85
+ frames.push({ transform: 'translateX(0)' });
86
+ try {
87
+ await this.animate(frames, { duration, easing: 'ease-in-out' }).finished;
88
+ }
89
+ catch {
90
+ //
91
+ }
92
+ };
93
+ }
@@ -0,0 +1,10 @@
1
+ export declare class MutationObserverSingleton {
2
+ #private;
3
+ readonly observer: Promise<MutationObserver>;
4
+ constructor();
5
+ observe(target: Node, callback: (entry: MutationRecord) => void, options: MutationObserverInit): Promise<void>;
6
+ unobserve(target: Node): Promise<void>;
7
+ /** Observes automatically all elements using a Set provided by outside. Calls renderCallback on EVERY change. */
8
+ syncObservations(set: Set<Element>, nodes: Element[], renderCallback: () => void, attributeFilter?: string[]): Promise<void>;
9
+ clearObservationsSet(set: Set<Element>): Promise<void>;
10
+ }
@@ -0,0 +1,46 @@
1
+ import { Snapshot } from '../../snapshot';
2
+ export class MutationObserverSingleton {
3
+ #observers = new WeakMap();
4
+ observer;
5
+ constructor() {
6
+ this.observer = Snapshot.waitReady.then(() => {
7
+ return new MutationObserver((entries) => {
8
+ for (const entry of entries)
9
+ this.#observers.get(entry.target)?.(entry);
10
+ });
11
+ });
12
+ }
13
+ async observe(target, callback, options) {
14
+ this.#observers.set(target, callback);
15
+ (await this.observer).observe(target, options);
16
+ }
17
+ async unobserve(target) {
18
+ ;
19
+ (await this.observer).disconnect();
20
+ this.#observers.delete(target);
21
+ }
22
+ /** Observes automatically all elements using a Set provided by outside. Calls renderCallback on EVERY change. */
23
+ async syncObservations(set, nodes, renderCallback, attributeFilter) {
24
+ for (const el of set)
25
+ if (!nodes.includes(el)) {
26
+ this.unobserve(el);
27
+ set.delete(el);
28
+ }
29
+ for (const el of nodes) {
30
+ if (!set.has(el))
31
+ this.observe(el, renderCallback, {
32
+ attributes: true,
33
+ characterData: true,
34
+ subtree: true,
35
+ childList: true,
36
+ ...(attributeFilter && { attributeFilter }),
37
+ });
38
+ set.add(el);
39
+ }
40
+ }
41
+ async clearObservationsSet(set) {
42
+ for (const el of set)
43
+ this.unobserve(el);
44
+ set.clear();
45
+ }
46
+ }
@@ -0,0 +1,15 @@
1
+ import type * as Components from '../../components';
2
+ import { type NavigationHost, type NavigationPage, type NavigationToolbarConfiguration } from '../privateNamespace';
3
+ export declare class NavigationPath {
4
+ #private;
5
+ get component(): NavigationHost | undefined;
6
+ get body(): Components.ScrollView | null | undefined;
7
+ get page(): NavigationPage | null | undefined;
8
+ get toolBarConfig(): NavigationToolbarConfiguration[] | undefined;
9
+ get slot(): NavigationHost | null | undefined;
10
+ constructor(any?: HTMLElement);
11
+ hydrate(): this;
12
+ children(): Generator<NavigationPath>;
13
+ parents(): Generator<NavigationPath>;
14
+ [Symbol.iterator](): Generator<NavigationPath>;
15
+ }
@@ -0,0 +1,84 @@
1
+ /**
2
+ * Gets current host (closest)
3
+ */
4
+ function closestHost(any) {
5
+ return any?.closest('body-view,[is=sheet-view],navigation-stack,navigation-split-view') ?? undefined;
6
+ }
7
+ export class NavigationPath {
8
+ #component;
9
+ #slot;
10
+ #body;
11
+ #page;
12
+ #toolBarConfig;
13
+ get component() {
14
+ return this.#component;
15
+ }
16
+ get body() {
17
+ if (undefined === this.#body)
18
+ this.#queryBody();
19
+ return this.#body;
20
+ }
21
+ get page() {
22
+ if (undefined === this.#page)
23
+ this.#queryPage();
24
+ return this.#page;
25
+ }
26
+ get toolBarConfig() {
27
+ if (undefined === this.#toolBarConfig)
28
+ this.#queryToolBarConfig();
29
+ return this.#toolBarConfig;
30
+ }
31
+ get slot() {
32
+ if (undefined === this.#slot)
33
+ this.#querySlot();
34
+ return this.#slot;
35
+ }
36
+ constructor(any) {
37
+ this.#component = closestHost(any);
38
+ }
39
+ #queryBody() {
40
+ this.#body = closestHost(this.#component)?.querySelector(`:scope>scroll-view,:scope>[is=sidebar-view]>scroll-view`) ?? null;
41
+ }
42
+ #queryPage() {
43
+ this.#page = this.#component?.querySelector(':scope>scroll-view,:scope>[is=sidebar-view]') ?? null;
44
+ }
45
+ #queryToolBarConfig() {
46
+ this.#toolBarConfig = [
47
+ ...(this.#component?.querySelectorAll(`:scope>tool-bar>tool-bar-item,:scope>tool-bar>tool-bar-item-group,:scope>[is=sidebar-view]>tool-bar>tool-bar-item,:scope>[is=sidebar-view]>tool-bar>tool-bar-item-group`) ?? []),
48
+ ];
49
+ }
50
+ #querySlot() {
51
+ this.#slot =
52
+ this.#component?.querySelector(':scope>body-view:not([hidden]),:scope>[is=sheet-view]:not([hidden]),:scope>navigation-stack:not([hidden]),:scope>navigation-split-view:not([hidden])') ?? null;
53
+ }
54
+ hydrate() {
55
+ this.#queryBody();
56
+ this.#queryPage();
57
+ this.#queryToolBarConfig();
58
+ this.#querySlot();
59
+ return this;
60
+ }
61
+ *children() {
62
+ if (!this.slot)
63
+ return;
64
+ const child = new NavigationPath(this.slot);
65
+ yield child;
66
+ yield* child.children();
67
+ }
68
+ *parents() {
69
+ if (!this.#component)
70
+ return;
71
+ let el = this.#component.parentElement;
72
+ while (el) {
73
+ const host = closestHost(el);
74
+ if (!host)
75
+ break;
76
+ yield new NavigationPath(host);
77
+ el = host.parentElement;
78
+ }
79
+ }
80
+ *[Symbol.iterator]() {
81
+ yield this;
82
+ yield* this.children();
83
+ }
84
+ }
@@ -0,0 +1,8 @@
1
+ export declare class NavigationView extends HTMLElement {
2
+ #private;
3
+ static get observedAttributes(): string[];
4
+ constructor();
5
+ disconnectedCallback(): void;
6
+ connectedCallback(): void;
7
+ attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null): void;
8
+ }