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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (243) hide show
  1. package/generated/buses/alert-dialog.d.ts +2 -0
  2. package/generated/buses/alert-dialog.js +1 -0
  3. package/generated/buses/confirmation-dialog.d.ts +2 -0
  4. package/generated/buses/confirmation-dialog.js +1 -0
  5. package/generated/buses/index.d.ts +6 -0
  6. package/generated/buses/index.js +6 -0
  7. package/generated/buses/lifecycle-observer.d.ts +2 -0
  8. package/generated/buses/lifecycle-observer.js +1 -0
  9. package/generated/client/index.d.ts +21 -10
  10. package/generated/client/index.js +177 -194
  11. package/generated/components/alert-dialog.d.ts +8 -0
  12. package/generated/components/alert-dialog.js +99 -0
  13. package/generated/components/body-view.js +5 -2
  14. package/generated/components/bordered-button.d.ts +10 -0
  15. package/generated/components/bordered-button.js +39 -3
  16. package/generated/components/bordered-prominent-button.d.ts +10 -0
  17. package/generated/components/bordered-prominent-button.js +39 -3
  18. package/generated/components/borderless-button.d.ts +9 -1
  19. package/generated/components/borderless-button.js +32 -11
  20. package/generated/components/color-scheme.d.ts +7 -0
  21. package/generated/components/color-scheme.js +54 -0
  22. package/generated/components/confirmation-dialog.d.ts +1 -1
  23. package/generated/components/confirmation-dialog.js +43 -32
  24. package/generated/components/content-unavailable-view.d.ts +24 -0
  25. package/generated/components/content-unavailable-view.js +81 -0
  26. package/generated/components/date-picker.d.ts +2 -12
  27. package/generated/components/date-picker.js +96 -65
  28. package/generated/components/disclosure-group.d.ts +5 -0
  29. package/generated/components/disclosure-group.js +18 -7
  30. package/generated/components/fine-tooltip.d.ts +7 -0
  31. package/generated/components/fine-tooltip.js +107 -0
  32. package/generated/components/form-view.d.ts +3 -0
  33. package/generated/components/form-view.js +8 -3
  34. package/generated/components/glass-button.d.ts +10 -0
  35. package/generated/components/glass-button.js +39 -3
  36. package/generated/components/glass-prominent-button.d.ts +10 -0
  37. package/generated/components/glass-prominent-button.js +39 -3
  38. package/generated/components/h-stack.d.ts +14 -0
  39. package/generated/components/h-stack.js +23 -0
  40. package/generated/components/image-view.d.ts +9 -0
  41. package/generated/components/image-view.js +64 -0
  42. package/generated/components/index.d.ts +11 -3
  43. package/generated/components/index.js +11 -3
  44. package/generated/components/label-view.d.ts +6 -1
  45. package/generated/components/label-view.js +40 -60
  46. package/generated/components/labeled-content.d.ts +9 -0
  47. package/generated/components/labeled-content.js +116 -0
  48. package/generated/components/list-view.d.ts +3 -0
  49. package/generated/components/list-view.js +20 -17
  50. package/generated/components/menu-view.d.ts +4 -1
  51. package/generated/components/menu-view.js +60 -51
  52. package/generated/components/navigation-large-title.js +9 -5
  53. package/generated/components/navigation-split-view.d.ts +4 -1
  54. package/generated/components/navigation-split-view.js +13 -6
  55. package/generated/components/navigation-stack.d.ts +4 -1
  56. package/generated/components/navigation-stack.js +16 -9
  57. package/generated/components/navigation-title.d.ts +1 -1
  58. package/generated/components/navigation-title.js +58 -55
  59. package/generated/components/picker-view.d.ts +32 -4
  60. package/generated/components/picker-view.js +924 -234
  61. package/generated/components/plain-button.js +5 -3
  62. package/generated/components/progress-view.d.ts +13 -0
  63. package/generated/components/progress-view.js +120 -0
  64. package/generated/components/screen-view.js +3 -1
  65. package/generated/components/scroll-view-proxy.d.ts +8 -0
  66. package/generated/components/scroll-view-proxy.js +17 -0
  67. package/generated/components/scroll-view.d.ts +1 -1
  68. package/generated/components/scroll-view.js +101 -85
  69. package/generated/components/search-view.d.ts +7 -0
  70. package/generated/components/search-view.js +30 -0
  71. package/generated/components/section-view.d.ts +1 -1
  72. package/generated/components/section-view.js +35 -30
  73. package/generated/components/sheet-view.d.ts +1 -2
  74. package/generated/components/sheet-view.js +32 -39
  75. package/generated/components/sidebar-toggle.js +44 -66
  76. package/generated/components/sidebar-view.js +13 -8
  77. package/generated/components/sticky-container.js +8 -4
  78. package/generated/components/tab-bar.d.ts +3 -0
  79. package/generated/components/tab-bar.js +20 -10
  80. package/generated/components/tab-item.js +24 -13
  81. package/generated/components/tab-view.js +25 -17
  82. package/generated/components/table-view.d.ts +5 -0
  83. package/generated/components/table-view.js +55 -77
  84. package/generated/components/text-field.d.ts +2 -2
  85. package/generated/components/text-field.js +95 -88
  86. package/generated/components/toggle-view.d.ts +28 -0
  87. package/generated/components/toggle-view.js +224 -0
  88. package/generated/components/tool-bar-item-group.js +21 -4
  89. package/generated/components/tool-bar-item.d.ts +4 -1
  90. package/generated/components/tool-bar-item.js +57 -10
  91. package/generated/components/tool-bar.d.ts +12 -0
  92. package/generated/components/tool-bar.js +27 -11
  93. package/generated/components/v-keyboard.d.ts +3 -1
  94. package/generated/components/v-keyboard.js +12 -6
  95. package/generated/components/v-stack.d.ts +12 -0
  96. package/generated/components/v-stack.js +17 -2
  97. package/generated/css/index.css +2533 -941
  98. package/generated/events/alert-dialog.d.ts +8 -0
  99. package/generated/events/alert-dialog.js +1 -0
  100. package/generated/events/confirmation-dialog.d.ts +2 -2
  101. package/generated/events/index.d.ts +2 -0
  102. package/generated/events/index.js +2 -0
  103. package/generated/events/picker-view.d.ts +7 -0
  104. package/generated/events/scroll-view.js +4 -0
  105. package/generated/events/tab-view.d.ts +6 -2
  106. package/generated/events/text-field.js +3 -0
  107. package/generated/events/toggle-view.d.ts +9 -0
  108. package/generated/events/toggle-view.js +4 -0
  109. package/generated/i18n/index.d.ts +20 -10
  110. package/generated/i18n/index.js +82 -54
  111. package/generated/i18n/locales/el.d.ts +16 -0
  112. package/generated/i18n/locales/el.js +16 -0
  113. package/generated/i18n/locales/en.d.ts +16 -0
  114. package/generated/i18n/locales/en.js +16 -0
  115. package/generated/i18n/locales/index.d.ts +4 -0
  116. package/generated/i18n/locales/index.js +4 -0
  117. package/generated/internal/class/css-style-observer.js +3 -2
  118. package/generated/internal/class/form-associated-base.d.ts +0 -4
  119. package/generated/internal/class/form-associated-base.js +23 -38
  120. package/generated/internal/class/mutation-observer-set.d.ts +9 -0
  121. package/generated/internal/class/mutation-observer-set.js +42 -0
  122. package/generated/internal/class/mutation-observer-singleton.js +18 -0
  123. package/generated/internal/class/navigation-view.d.ts +1 -1
  124. package/generated/internal/class/navigation-view.js +38 -43
  125. package/generated/internal/decorators/adaptive-slot.d.ts +1 -0
  126. package/generated/internal/decorators/adaptive-slot.js +50 -0
  127. package/generated/internal/decorators/custom-element.d.ts +1 -1
  128. package/generated/internal/decorators/custom-element.js +2 -1
  129. package/generated/internal/decorators/index.d.ts +6 -0
  130. package/generated/internal/decorators/index.js +6 -0
  131. package/generated/internal/decorators/microtask-on-connected.d.ts +39 -0
  132. package/generated/internal/decorators/microtask-on-connected.js +67 -0
  133. package/generated/internal/privateNamespace.d.ts +10 -0
  134. package/generated/internal/privateNamespace.js +168 -1
  135. package/generated/internal/utils/cash/index.d.ts +4 -3
  136. package/generated/internal/utils/cash/index.js +6 -4
  137. package/generated/internal/utils/dev-flags.d.ts +3 -0
  138. package/generated/internal/utils/dev-flags.js +5 -0
  139. package/generated/internal/utils/ensure-placeholder.d.ts +1 -0
  140. package/generated/internal/utils/ensure-placeholder.js +55 -0
  141. package/generated/internal/utils/index.d.ts +7 -2
  142. package/generated/internal/utils/index.js +9 -2
  143. package/generated/internal/utils/is-inside.d.ts +1 -0
  144. package/generated/internal/utils/is-inside.js +4 -0
  145. package/generated/internal/utils/list-active.js +67 -12
  146. package/generated/internal/utils/render-label-icon.d.ts +2 -0
  147. package/generated/internal/utils/render-label-icon.js +19 -0
  148. package/generated/internal/utils/render-label-title.d.ts +2 -0
  149. package/generated/internal/utils/render-label-title.js +16 -0
  150. package/generated/internal/utils/render-label.d.ts +1 -0
  151. package/generated/internal/utils/render-label.js +19 -0
  152. package/generated/internal/utils/touch-glass.js +5 -5
  153. package/generated/namespace-browser/base.d.ts +12 -3
  154. package/generated/namespace-browser/base.js +41 -18
  155. package/generated/namespace-browser/event.d.ts +10 -0
  156. package/generated/namespace-browser/event.js +1 -0
  157. package/generated/snapshot/index.d.ts +3 -1
  158. package/generated/snapshot/index.js +25 -2
  159. package/generated/tpl/html.d.ts +5 -0
  160. package/generated/tpl/html.js +3 -0
  161. package/generated/tpl/index.d.ts +4 -0
  162. package/generated/tpl/index.js +4 -0
  163. package/generated/tpl/render.d.ts +2 -0
  164. package/generated/tpl/render.js +132 -0
  165. package/package.json +18 -4
  166. package/scss/_components.scss +14 -0
  167. package/scss/_functions.scss +10 -0
  168. package/scss/_mixins.scss +4 -0
  169. package/scss/_transitions.scss +6 -1
  170. package/scss/_vars.scss +9 -2
  171. package/scss/base/_layout.scss +17 -7
  172. package/scss/base/_reboot.scss +34 -1
  173. package/scss/base/_root.scss +117 -114
  174. package/scss/colors/_index.scss +304 -85
  175. package/scss/components/_alert-dialog.scss +111 -0
  176. package/scss/components/_bordered-button.scss +35 -0
  177. package/scss/components/_bordered-prominent-button.scss +45 -0
  178. package/scss/components/_borderless-button.scss +25 -0
  179. package/scss/components/_confirmation-dialog.scss +41 -49
  180. package/scss/components/_content-unavailable-view.scss +56 -0
  181. package/scss/components/_date-picker.scss +15 -15
  182. package/scss/components/_detail-placeholder.scss +1 -3
  183. package/scss/components/_disclosure-group.scss +84 -33
  184. package/scss/components/_fine-tooltip.scss +84 -0
  185. package/scss/components/_form-view.scss +58 -20
  186. package/scss/components/_glass-button.scss +35 -0
  187. package/scss/components/_glass-prominent-button.scss +46 -0
  188. package/scss/components/_group-box.scss +27 -0
  189. package/scss/components/_h-flex-stack.scss +23 -0
  190. package/scss/components/_h-stack.scss +21 -15
  191. package/scss/components/_image-view.scss +20 -0
  192. package/scss/components/_index.scss +40 -20
  193. package/scss/components/_label-view copy.scss.txt +420 -0
  194. package/scss/components/_label-view.scss +94 -110
  195. package/scss/components/_label-view.scss.txt +536 -0
  196. package/scss/components/_labeled-content.scss +59 -1
  197. package/scss/components/_list-view.scss +65 -25
  198. package/scss/components/_menu-view.scss +95 -60
  199. package/scss/components/_navigation-large-title.scss +17 -0
  200. package/scss/components/_navigation-split-view.scss +3 -3
  201. package/scss/components/_picker-view.scss +259 -59
  202. package/scss/components/_plain-button.scss +7 -0
  203. package/scss/components/_progress-view.scss +98 -0
  204. package/scss/components/_scroll-view-proxy.scss +22 -20
  205. package/scss/components/_scroll-view.scss +4 -0
  206. package/scss/components/_search-view.scss +22 -0
  207. package/scss/components/_section-view.scss +23 -22
  208. package/scss/components/_sheet-view.scss +16 -6
  209. package/scss/components/_sidebar-toggle.scss +1 -4
  210. package/scss/components/_sticky-container.scss +1 -1
  211. package/scss/components/_tab-bar.scss +17 -3
  212. package/scss/components/_tab-view.scss +4 -2
  213. package/scss/components/_table-column.scss +2 -0
  214. package/scss/components/_table-row.scss +69 -1
  215. package/scss/components/_table-view.scss +22 -14
  216. package/scss/components/_text-field.scss +37 -17
  217. package/scss/components/_toggle-view.scss +112 -0
  218. package/scss/components/_tool-bar-item.scss +34 -82
  219. package/scss/components/_tool-bar.scss +77 -57
  220. package/scss/components/_v-stack.scss +9 -2
  221. package/scss/final/_touch-glass.scss +24 -0
  222. package/scss/mixins/_button.scss +44 -0
  223. package/scss/mixins/_color.scss +16 -0
  224. package/scss/mixins/_dialog.scss +1 -0
  225. package/scss/mixins/_index.scss +64 -2
  226. package/scss/placeholders/_buttons.scss +44 -10
  227. package/scss/placeholders/_lists.scss +133 -126
  228. package/scss/transitions/_alert-dialog.scss +18 -0
  229. package/scss/transitions/_confirmation-dialog.scss +8 -0
  230. package/scss/transitions/_fine-tooltip.scss +21 -0
  231. package/scss/transitions/_menu-view.scss +17 -15
  232. package/scss/transitions/_progress-view.scss +23 -0
  233. package/scss/transitions/_sheet-view.scss +30 -0
  234. package/scss/transitions/_tab-bar.scss +6 -5
  235. package/scss/utils/_frame.scss +42 -0
  236. package/scss/utils/_index.scss +67 -52
  237. package/scss/utils/_stacks.scss +56 -73
  238. package/web-components.html-data/en.json +623 -24
  239. package/generated/confirmation-dialog/index.d.ts +0 -1
  240. package/generated/confirmation-dialog/index.js +0 -1
  241. package/generated/lifecycle-observer/index.d.ts +0 -1
  242. package/generated/lifecycle-observer/index.js +0 -1
  243. package/scss/transitions/_dialog.scss +0 -28
@@ -0,0 +1,8 @@
1
+ export type AlertReturnDetail = {
2
+ returnValue: string;
3
+ };
4
+ declare global {
5
+ interface HTMLElementEventMap {
6
+ 'alert:return': CustomEvent<AlertReturnDetail>;
7
+ }
8
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -1,9 +1,9 @@
1
- export type ReturnDetail = {
1
+ export type ConfirmationReturnDetail = {
2
2
  returnValue: string;
3
3
  positionAnchor: string;
4
4
  };
5
5
  declare global {
6
6
  interface HTMLElementEventMap {
7
- return: CustomEvent<ReturnDetail>;
7
+ 'confirmation:return': CustomEvent<ConfirmationReturnDetail>;
8
8
  }
9
9
  }
@@ -1,3 +1,4 @@
1
+ export * from './alert-dialog';
1
2
  export * from './confirmation-dialog';
2
3
  export * from './date-picker';
3
4
  export * from './lifecycle-observer';
@@ -5,3 +6,4 @@ export * from './picker-view';
5
6
  export * from './scroll-view';
6
7
  export * from './tab-view';
7
8
  export * from './text-field';
9
+ export * from './toggle-view';
@@ -1,3 +1,4 @@
1
+ export * from './alert-dialog';
1
2
  export * from './confirmation-dialog';
2
3
  export * from './date-picker';
3
4
  export * from './lifecycle-observer';
@@ -5,3 +6,4 @@ export * from './picker-view';
5
6
  export * from './scroll-view';
6
7
  export * from './tab-view';
7
8
  export * from './text-field';
9
+ export * from './toggle-view';
@@ -1,8 +1,15 @@
1
1
  export type PickerSelectionDetail = {
2
2
  selection: string;
3
3
  };
4
+ export type PickerSearchableDetail = {
5
+ element: HTMLElement;
6
+ search: string;
7
+ };
4
8
  declare global {
5
9
  interface HTMLElementEventMap {
6
10
  selection: CustomEvent<PickerSelectionDetail>;
11
+ 'picker:searchfocus': CustomEvent<PickerSearchableDetail>;
12
+ 'picker:searchblur': CustomEvent<PickerSearchableDetail>;
13
+ 'picker:searchinput': CustomEvent<PickerSearchableDetail>;
7
14
  }
8
15
  }
@@ -1 +1,5 @@
1
1
  export {};
2
+ // export interface ScrollViewEventMap {
3
+ // pagereveal: CustomEvent<PageRevealSwapDetail>
4
+ // pageswap: CustomEvent<PageRevealSwapDetail>
5
+ // }
@@ -1,5 +1,9 @@
1
1
  import { type NavigationSplitView, type NavigationStack } from '../components';
2
2
  import { type TabBarPlacement } from '../components/tab-view';
3
+ export type TabBeforeDetail = {
4
+ tag: string;
5
+ ms: number;
6
+ };
3
7
  export type TabDetail = {
4
8
  tag: string;
5
9
  };
@@ -16,8 +20,8 @@ declare global {
16
20
  tabhide: CustomEvent<TabDetail>;
17
21
  tabreveal: CustomEvent<TabDetail>;
18
22
  tabswap: CustomEvent<TabDetail>;
19
- beforetabreveal: CustomEvent<TabDetail>;
20
- beforetabswap: CustomEvent<TabDetail>;
23
+ beforetabreveal: CustomEvent<TabBeforeDetail>;
24
+ beforetabswap: CustomEvent<TabBeforeDetail>;
21
25
  'tab-view:toggle': CustomEvent<TabViewDetail>;
22
26
  'tab-view:adaptable-tab-bar-placement-change': CustomEvent<TabViewAdaptableTabBarPlacementDetail>;
23
27
  }
@@ -1 +1,4 @@
1
1
  export {};
2
+ // export interface TextFieldEventMap {
3
+ // commit: CustomEvent<TextFieldCommitDetail>
4
+ // }
@@ -0,0 +1,9 @@
1
+ export type ToggleChangeDetail = {
2
+ isOn: boolean;
3
+ value: string | null;
4
+ };
5
+ declare global {
6
+ interface HTMLElementEventMap {
7
+ 'toggle:change': CustomEvent<ToggleChangeDetail>;
8
+ }
9
+ }
@@ -0,0 +1,4 @@
1
+ export {};
2
+ // export interface ToggleViewEventMap {
3
+ // 'toggle:change': CustomEvent<ToggleChangeDetail>
4
+ // }
@@ -1,18 +1,26 @@
1
+ import { en } from './locales';
1
2
  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[];
3
+ type DeepStringify<T> = {
4
+ [K in keyof T]: T[K] extends object ? DeepStringify<T[K]> : string;
9
5
  };
6
+ export declare function defineTranslations<const T extends object>(factory: () => T): () => T;
7
+ type EnTranslations = DeepStringify<ReturnType<typeof en>>;
8
+ /**
9
+ * @fires localechange - On html[lang] change!
10
+ */
10
11
  export declare class I18n {
11
12
  #private;
12
13
  static on: EventTarget;
13
- static _props: I18nProps;
14
- static get tag(): LocaleInput | undefined;
15
- static set tag(val: LocaleInput | undefined);
14
+ /**
15
+ * Register a translation factory for a language.
16
+ * Call this before the language is first needed.
17
+ *
18
+ * @example
19
+ * I18n.register('el', () => ({ SearchUnavailableContent: { … } }))
20
+ */
21
+ static register(lang: string, factory: () => EnTranslations): void;
22
+ static get tag(): LocaleInput;
23
+ static set tag(val: LocaleInput);
16
24
  static get options(): Intl.LocaleOptions | undefined;
17
25
  static set options(val: Intl.LocaleOptions | undefined);
18
26
  static get locale(): Intl.Locale;
@@ -20,5 +28,7 @@ export declare class I18n {
20
28
  static get dateSeparator(): string;
21
29
  static get dateOrder(): string[];
22
30
  static setOwnConfig(options?: Intl.LocaleOptions): void;
31
+ /** Look up a top-level translation key for the current language, falling back to 'en'. */
32
+ static t<K extends keyof EnTranslations>(key: K): EnTranslations[K];
23
33
  }
24
34
  export {};
@@ -1,3 +1,10 @@
1
+ import { el, en } from './locales';
2
+ export function defineTranslations(factory) {
3
+ return factory;
4
+ }
5
+ /**
6
+ * @fires localechange - On html[lang] change!
7
+ */
1
8
  export class I18n {
2
9
  static #readyCalled = false;
3
10
  static #tag = 'en';
@@ -7,8 +14,30 @@ export class I18n {
7
14
  static #decimalSeparator = '.';
8
15
  static #dateSeparator = '/';
9
16
  static #dateOrder = ['month', 'day', 'year'];
17
+ static #lang = 'en';
18
+ /** Registry: language code → factory. Pre-seeded with 'en'. */
19
+ static #factories = new Map([
20
+ ['en', en],
21
+ ['el', el],
22
+ ]);
23
+ /** Cache: language code → resolved translation object. */
24
+ static #strings = new Map();
10
25
  static on = new EventTarget();
11
26
  // ----------------------------
27
+ // Public registration API
28
+ // ----------------------------
29
+ /**
30
+ * Register a translation factory for a language.
31
+ * Call this before the language is first needed.
32
+ *
33
+ * @example
34
+ * I18n.register('el', () => ({ SearchUnavailableContent: { … } }))
35
+ */
36
+ static register(lang, factory) {
37
+ this.#factories.set(lang, factory);
38
+ this.#strings.delete(lang); // bust cache so next t() re-resolves
39
+ }
40
+ // ----------------------------
12
41
  // Lazy init
13
42
  // ----------------------------
14
43
  static #ensureReady() {
@@ -16,72 +45,42 @@ export class I18n {
16
45
  this.setOwnConfig();
17
46
  }
18
47
  // ----------------------------
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
48
  // Accessors
57
49
  // ----------------------------
58
50
  static get tag() {
59
- return this._props.tag;
51
+ this.#ensureReady();
52
+ return this.#tag;
60
53
  }
61
54
  static set tag(val) {
62
- this._props.tag = val;
55
+ this.#observer?.disconnect();
56
+ this.#observer = undefined;
57
+ this.#tag = val;
58
+ this.#getOwnConfig();
63
59
  }
64
60
  static get options() {
65
- return this._props.options;
61
+ this.#ensureReady();
62
+ return this.#options;
66
63
  }
67
64
  static set options(val) {
68
- this._props.options = val;
65
+ this.#options = val;
66
+ this.#getOwnConfig();
69
67
  }
70
68
  static get locale() {
71
- return this._props.locale;
69
+ this.#ensureReady();
70
+ return this.#locale;
72
71
  }
73
72
  static get decimalSeparator() {
74
- return this._props.decimalSeparator;
73
+ this.#ensureReady();
74
+ return this.#decimalSeparator;
75
75
  }
76
76
  static get dateSeparator() {
77
- return this._props.dateSeparator;
77
+ this.#ensureReady();
78
+ return this.#dateSeparator;
78
79
  }
79
80
  static get dateOrder() {
80
- return this._props.dateOrder;
81
+ this.#ensureReady();
82
+ return this.#dateOrder;
81
83
  }
82
- // ----------------------------
83
- // Core logic
84
- // ----------------------------
85
84
  static setOwnConfig(options) {
86
85
  if (!this.#readyCalled)
87
86
  this.#readyCalled = true;
@@ -100,7 +99,7 @@ export class I18n {
100
99
  return;
101
100
  this.#tag = document.documentElement.lang;
102
101
  this.#getOwnConfig();
103
- this.on.dispatchEvent(new CustomEvent('change'));
102
+ this.on.dispatchEvent(new CustomEvent('localechange', { detail: { lang: this.#tag } }));
104
103
  }
105
104
  static #getOwnConfig() {
106
105
  try {
@@ -109,7 +108,6 @@ export class I18n {
109
108
  catch {
110
109
  this.#locale = new Intl.Locale('en');
111
110
  }
112
- console.debug(this.#locale);
113
111
  try {
114
112
  const nf = new Intl.NumberFormat(this.#locale);
115
113
  const parts = nf.formatToParts(1.1);
@@ -118,11 +116,10 @@ export class I18n {
118
116
  catch {
119
117
  this.#decimalSeparator = '.';
120
118
  }
121
- console.debug(this.#decimalSeparator);
122
119
  try {
123
120
  const df = new Intl.DateTimeFormat(this.#locale);
124
121
  const parts = df.formatToParts(new Date(2000, 11, 31));
125
- this.#dateOrder = parts.filter(({ type }) => type !== 'literal')?.map(({ type }) => type) ?? ['month', 'day', 'year'];
122
+ this.#dateOrder = parts.filter(({ type }) => type !== 'literal').map(({ type }) => type) ?? ['month', 'day', 'year'];
126
123
  this.#dateSeparator =
127
124
  parts
128
125
  .filter(({ type }) => type === 'literal')
@@ -133,7 +130,38 @@ export class I18n {
133
130
  this.#dateOrder = ['month', 'day', 'year'];
134
131
  this.#dateSeparator = '/';
135
132
  }
136
- console.debug(`${I18n.name} ${this.#dateSeparator}`);
137
- console.debug(`${I18n.name} ${this.#dateOrder}`);
133
+ try {
134
+ this.#lang = this.#resolveLanguage(this.#tag);
135
+ }
136
+ catch {
137
+ this.#lang = 'en';
138
+ }
139
+ }
140
+ /**
141
+ * Resolve the best available language for a given BCP 47 tag.
142
+ * Tries the full tag, then just the base language, then falls back to 'en'.
143
+ */
144
+ static #resolveLanguage(tag) {
145
+ const lang = tag instanceof Intl.Locale ? tag.language : new Intl.Locale(tag || 'en').language;
146
+ if (this.#factories.has(String(tag)))
147
+ return String(tag);
148
+ if (this.#factories.has(lang))
149
+ return lang;
150
+ return 'en';
151
+ }
152
+ /** Look up a top-level translation key for the current language, falling back to 'en'. */
153
+ static t(key) {
154
+ this.#ensureReady();
155
+ if (!this.#strings.has(this.#lang)) {
156
+ const factory = this.#factories.get(this.#lang) ?? en;
157
+ this.#strings.set(this.#lang, factory());
158
+ }
159
+ const current = this.#strings.get(this.#lang);
160
+ if (key in current)
161
+ return current[key];
162
+ // Key missing from current language — fall back to en
163
+ if (!this.#strings.has('en'))
164
+ this.#strings.set('en', en());
165
+ return this.#strings.get('en')[key];
138
166
  }
139
167
  }
@@ -0,0 +1,16 @@
1
+ declare const _default: () => {
2
+ readonly SearchUnavailableContent: {
3
+ readonly NoLabel: "Κανένα αποτέλεσμα";
4
+ readonly Label: "Κανένα αποτέλεσμα για «{search}»";
5
+ readonly Description: "Ελέγξτε την ορθογραφία ή δοκιμάστε μια νέα αναζήτηση.";
6
+ };
7
+ readonly ButtonRole: {
8
+ readonly Back: "Πίσω";
9
+ readonly Cancel: "Ακύρωση";
10
+ readonly Close: "Κλείσιμο";
11
+ readonly Confirm: "Τέλος";
12
+ readonly Destructive: "Διαγραφή";
13
+ readonly OK: "OK";
14
+ };
15
+ };
16
+ export default _default;
@@ -0,0 +1,16 @@
1
+ import { defineTranslations } from '../index';
2
+ export default defineTranslations(() => ({
3
+ SearchUnavailableContent: {
4
+ NoLabel: 'Κανένα αποτέλεσμα',
5
+ Label: 'Κανένα αποτέλεσμα για «{search}»',
6
+ Description: 'Ελέγξτε την ορθογραφία ή δοκιμάστε μια νέα αναζήτηση.',
7
+ },
8
+ ButtonRole: {
9
+ Back: 'Πίσω',
10
+ Cancel: 'Ακύρωση',
11
+ Close: 'Κλείσιμο',
12
+ Confirm: 'Τέλος',
13
+ Destructive: 'Διαγραφή',
14
+ OK: 'OK',
15
+ },
16
+ }));
@@ -0,0 +1,16 @@
1
+ declare const _default: () => {
2
+ readonly SearchUnavailableContent: {
3
+ readonly NoLabel: "No Results";
4
+ readonly Label: "No Results for ”{search}”";
5
+ readonly Description: "Check the spelling or try a new search.";
6
+ };
7
+ readonly ButtonRole: {
8
+ readonly Back: "Back";
9
+ readonly Cancel: "Cancel";
10
+ readonly Close: "Close";
11
+ readonly Confirm: "Confirm";
12
+ readonly Destructive: "Delete";
13
+ readonly OK: "OK";
14
+ };
15
+ };
16
+ export default _default;
@@ -0,0 +1,16 @@
1
+ import { defineTranslations } from '../index';
2
+ export default defineTranslations(() => ({
3
+ SearchUnavailableContent: {
4
+ NoLabel: 'No Results',
5
+ Label: 'No Results for ”{search}”',
6
+ Description: 'Check the spelling or try a new search.',
7
+ },
8
+ ButtonRole: {
9
+ Back: 'Back',
10
+ Cancel: 'Cancel',
11
+ Close: 'Close',
12
+ Confirm: 'Confirm',
13
+ Destructive: 'Delete',
14
+ OK: 'OK',
15
+ },
16
+ }));
@@ -0,0 +1,4 @@
1
+ export { default as el } from './el';
2
+ export * from './el';
3
+ export { default as en } from './en';
4
+ export * from './en';
@@ -0,0 +1,4 @@
1
+ export { default as el } from './el';
2
+ export * from './el';
3
+ export { default as en } from './en';
4
+ export * from './en';
@@ -1,5 +1,5 @@
1
1
  var _a;
2
- import { onoff } from '../../internal/utils';
2
+ import { devFlags, onoff } from '../../internal/utils';
3
3
  export class CSSStyleObserver {
4
4
  #cleanups;
5
5
  #options;
@@ -16,7 +16,8 @@ export class CSSStyleObserver {
16
16
  this.#cleanups?.();
17
17
  }
18
18
  #handleTransitionrun = (callback, evt) => {
19
- console.debug(`${_a.name} ⚡️ ${evt?.type}`);
19
+ if (devFlags.debug)
20
+ console.debug(`${_a.name} ⚡️ ${evt?.type} (${evt.propertyName})`);
20
21
  if (!this.#options?.properties.some((prop) => evt.propertyName.startsWith(prop)))
21
22
  return;
22
23
  callback?.(evt);
@@ -1,8 +1,4 @@
1
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
2
  export declare abstract class FormAssociatedBase extends HTMLElement {
7
3
  abstract setValidity(flags?: ValidityStateFlags, message?: string, anchor?: HTMLElement): void;
8
4
  static get formAssociated(): boolean;
@@ -1,43 +1,28 @@
1
+ import { devFlags } from '../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
+ // if (devFlags.debug) console.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
+ // if (devFlags.debug) console.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;
@@ -45,17 +30,17 @@ export class FormAssociatedBase extends HTMLElement {
45
30
  constructor() {
46
31
  super();
47
32
  internals.set(this, this.attachInternals());
48
- trackedElements.set(this, new Set());
33
+ // trackedElements.set(this, new Set<Element>())
49
34
  }
50
35
  disconnectedCallback() {
51
- console.debug(`${FormAssociatedBase.name} ⚡️ disconnect`);
36
+ if (devFlags.debug)
37
+ console.debug(`${FormAssociatedBase.name} ⚡️ disconnect`);
52
38
  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)
39
+ // observers.clearObservationsSet(trackedElements.get(this) ?? new Set())
56
40
  }
57
41
  connectedCallback() {
58
- console.debug(`${FormAssociatedBase.name} ⚡️ connect`);
42
+ if (devFlags.debug)
43
+ console.debug(`${FormAssociatedBase.name} ⚡️ connect`);
59
44
  }
60
45
  get type() {
61
46
  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
  }