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

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 (300) 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 +24 -10
  10. package/generated/client/index.js +179 -194
  11. package/generated/components/alert-dialog.d.ts +11 -0
  12. package/generated/components/alert-dialog.js +94 -0
  13. package/generated/components/body-view.d.ts +8 -0
  14. package/generated/components/body-view.js +6 -2
  15. package/generated/components/bordered-button.d.ts +10 -0
  16. package/generated/components/bordered-button.js +36 -3
  17. package/generated/components/bordered-prominent-button.d.ts +10 -0
  18. package/generated/components/bordered-prominent-button.js +36 -3
  19. package/generated/components/borderless-button.d.ts +9 -1
  20. package/generated/components/borderless-button.js +29 -11
  21. package/generated/components/color-scheme.d.ts +12 -0
  22. package/generated/components/color-scheme.js +51 -0
  23. package/generated/components/confirmation-dialog.d.ts +4 -1
  24. package/generated/components/confirmation-dialog.js +38 -32
  25. package/generated/components/content-unavailable.d.ts +30 -0
  26. package/generated/components/content-unavailable.js +79 -0
  27. package/generated/components/date-picker.d.ts +21 -15
  28. package/generated/components/date-picker.js +126 -88
  29. package/generated/components/detail-placeholder.d.ts +11 -0
  30. package/generated/components/detail-placeholder.js +15 -0
  31. package/generated/components/disclosure-group.d.ts +8 -0
  32. package/generated/components/disclosure-group.js +18 -7
  33. package/generated/components/fine-tooltip.d.ts +15 -0
  34. package/generated/components/fine-tooltip.js +108 -0
  35. package/generated/components/form-view.d.ts +10 -0
  36. package/generated/components/form-view.js +8 -3
  37. package/generated/components/glass-button.d.ts +10 -0
  38. package/generated/components/glass-button.js +36 -3
  39. package/generated/components/glass-prominent-button.d.ts +10 -0
  40. package/generated/components/glass-prominent-button.js +36 -3
  41. package/generated/components/h-divider.d.ts +11 -0
  42. package/generated/components/h-divider.js +15 -0
  43. package/generated/components/h-stack.d.ts +22 -0
  44. package/generated/components/h-stack.js +24 -0
  45. package/generated/components/image-view.d.ts +18 -0
  46. package/generated/components/image-view.js +65 -0
  47. package/generated/components/index.d.ts +15 -3
  48. package/generated/components/index.js +15 -3
  49. package/generated/components/label-view.d.ts +19 -1
  50. package/generated/components/label-view.js +63 -62
  51. package/generated/components/labeled-content.d.ts +33 -0
  52. package/generated/components/labeled-content.js +160 -0
  53. package/generated/components/list-view.d.ts +14 -0
  54. package/generated/components/list-view.js +12 -17
  55. package/generated/components/menu-view.d.ts +12 -1
  56. package/generated/components/menu-view.js +63 -65
  57. package/generated/components/navigation-large-title.d.ts +11 -0
  58. package/generated/components/navigation-large-title.js +11 -5
  59. package/generated/components/navigation-split-view.d.ts +9 -1
  60. package/generated/components/navigation-split-view.js +10 -6
  61. package/generated/components/navigation-stack.d.ts +9 -1
  62. package/generated/components/navigation-stack.js +13 -11
  63. package/generated/components/navigation-title.d.ts +11 -1
  64. package/generated/components/navigation-title.js +58 -55
  65. package/generated/components/picker-view.d.ts +48 -7
  66. package/generated/components/picker-view.js +971 -261
  67. package/generated/components/plain-button.js +3 -3
  68. package/generated/components/progress-view.d.ts +20 -0
  69. package/generated/components/progress-view.js +120 -0
  70. package/generated/components/screen-view.js +2 -1
  71. package/generated/components/scroll-view-proxy.d.ts +13 -0
  72. package/generated/components/scroll-view-proxy.js +15 -0
  73. package/generated/components/scroll-view.d.ts +13 -1
  74. package/generated/components/scroll-view.js +140 -97
  75. package/generated/components/search-view.d.ts +12 -0
  76. package/generated/components/search-view.js +24 -0
  77. package/generated/components/section-view.d.ts +13 -1
  78. package/generated/components/section-view.js +38 -58
  79. package/generated/components/sheet-view.d.ts +4 -2
  80. package/generated/components/sheet-view.js +10 -39
  81. package/generated/components/sidebar-toggle.d.ts +9 -1
  82. package/generated/components/sidebar-toggle.js +46 -69
  83. package/generated/components/sidebar-view.d.ts +3 -0
  84. package/generated/components/sidebar-view.js +16 -9
  85. package/generated/components/sticky-container.d.ts +6 -1
  86. package/generated/components/sticky-container.js +9 -7
  87. package/generated/components/tab-bar.d.ts +3 -0
  88. package/generated/components/tab-bar.js +17 -13
  89. package/generated/components/tab-item.d.ts +3 -0
  90. package/generated/components/tab-item.js +20 -13
  91. package/generated/components/tab-view.d.ts +13 -4
  92. package/generated/components/tab-view.js +25 -89
  93. package/generated/components/table-view.d.ts +19 -0
  94. package/generated/components/table-view.js +88 -107
  95. package/generated/components/text-field.d.ts +19 -6
  96. package/generated/components/text-field.js +127 -99
  97. package/generated/components/text-view.d.ts +11 -0
  98. package/generated/components/text-view.js +16 -0
  99. package/generated/components/toggle-view.d.ts +43 -0
  100. package/generated/components/toggle-view.js +366 -0
  101. package/generated/components/tool-bar-item-group.d.ts +8 -0
  102. package/generated/components/tool-bar-item-group.js +22 -4
  103. package/generated/components/tool-bar-item.d.ts +12 -1
  104. package/generated/components/tool-bar-item.js +57 -10
  105. package/generated/components/tool-bar.d.ts +19 -0
  106. package/generated/components/tool-bar.js +48 -33
  107. package/generated/components/v-divider.d.ts +11 -0
  108. package/generated/components/v-divider.js +15 -0
  109. package/generated/components/v-keyboard.d.ts +8 -1
  110. package/generated/components/v-keyboard.js +11 -9
  111. package/generated/components/v-stack.d.ts +20 -0
  112. package/generated/components/v-stack.js +18 -2
  113. package/generated/css/index.css +4617 -1266
  114. package/generated/events/alert-dialog.d.ts +13 -0
  115. package/generated/events/alert-dialog.js +1 -0
  116. package/generated/events/confirmation-dialog.d.ts +7 -2
  117. package/generated/events/date-picker.d.ts +6 -1
  118. package/generated/events/index.d.ts +2 -0
  119. package/generated/events/index.js +2 -0
  120. package/generated/events/lifecycle-observer.d.ts +10 -2
  121. package/generated/events/picker-view.d.ts +22 -1
  122. package/generated/events/scroll-view.d.ts +10 -2
  123. package/generated/events/tab-view.d.ts +38 -8
  124. package/generated/events/text-field.d.ts +6 -1
  125. package/generated/events/toggle-view.d.ts +14 -0
  126. package/generated/events/toggle-view.js +1 -0
  127. package/generated/i18n/index.d.ts +19 -10
  128. package/generated/i18n/index.js +79 -54
  129. package/generated/i18n/locales/el.d.ts +16 -0
  130. package/generated/i18n/locales/el.js +16 -0
  131. package/generated/i18n/locales/en.d.ts +16 -0
  132. package/generated/i18n/locales/en.js +16 -0
  133. package/generated/i18n/locales/index.d.ts +4 -0
  134. package/generated/i18n/locales/index.js +4 -0
  135. package/generated/internal/class/css-style-observer.js +2 -2
  136. package/generated/internal/class/form-associated-base.d.ts +0 -4
  137. package/generated/internal/class/form-associated-base.js +22 -39
  138. package/generated/internal/class/mutation-observer-set.d.ts +9 -0
  139. package/generated/internal/class/mutation-observer-set.js +42 -0
  140. package/generated/internal/class/mutation-observer-singleton.js +18 -0
  141. package/generated/internal/class/navigation-view.d.ts +1 -1
  142. package/generated/internal/class/navigation-view.js +36 -43
  143. package/generated/internal/decorators/adaptive-slot.d.ts +1 -0
  144. package/generated/internal/decorators/adaptive-slot.js +47 -0
  145. package/generated/internal/decorators/custom-element.d.ts +1 -1
  146. package/generated/internal/decorators/custom-element.js +2 -1
  147. package/generated/internal/decorators/index.d.ts +6 -0
  148. package/generated/internal/decorators/index.js +6 -0
  149. package/generated/internal/decorators/microtask-on-connected.d.ts +39 -0
  150. package/generated/internal/decorators/microtask-on-connected.js +67 -0
  151. package/generated/internal/flags.d.ts +4 -0
  152. package/generated/internal/flags.js +1 -0
  153. package/generated/internal/privateNamespace.d.ts +10 -0
  154. package/generated/internal/privateNamespace.js +159 -1
  155. package/generated/internal/utils/$.d.ts +9 -0
  156. package/generated/internal/utils/$.js +11 -0
  157. package/generated/internal/utils/compare-big-decimals.js +7 -17
  158. package/generated/internal/utils/debug.d.ts +1 -0
  159. package/generated/internal/utils/debug.js +4 -0
  160. package/generated/internal/utils/define-translations.d.ts +1 -0
  161. package/generated/internal/utils/define-translations.js +3 -0
  162. package/generated/internal/utils/ensure-placeholder.d.ts +1 -0
  163. package/generated/internal/utils/ensure-placeholder.js +41 -0
  164. package/generated/internal/utils/index.d.ts +39 -2
  165. package/generated/internal/utils/index.js +39 -3
  166. package/generated/internal/utils/is-inside.d.ts +1 -0
  167. package/generated/internal/utils/is-inside.js +4 -0
  168. package/generated/internal/utils/kebab-case.js +6 -9
  169. package/generated/internal/utils/list-active.js +67 -12
  170. package/generated/internal/utils/touch-glass.js +5 -5
  171. package/generated/internal/vendor/morphdom.d.ts +6 -0
  172. package/generated/internal/vendor/morphdom.js +720 -0
  173. package/generated/morphdom/index.d.ts +8 -0
  174. package/generated/morphdom/index.js +8 -0
  175. package/generated/morphdom/morph.d.ts +4 -0
  176. package/generated/morphdom/morph.js +10 -0
  177. package/generated/morphdom/query-morph.d.ts +5 -0
  178. package/generated/morphdom/query-morph.js +12 -0
  179. package/generated/morphdom/render-to-string.d.ts +12 -0
  180. package/generated/morphdom/render-to-string.js +48 -0
  181. package/generated/morphdom/unsafe-html.d.ts +2 -0
  182. package/generated/morphdom/unsafe-html.js +4 -0
  183. package/generated/namespace-browser/base.d.ts +12 -3
  184. package/generated/namespace-browser/base.js +41 -18
  185. package/generated/namespace-browser/event.d.ts +10 -0
  186. package/generated/namespace-browser/event.js +1 -0
  187. package/generated/snapshot/index.d.ts +3 -1
  188. package/generated/snapshot/index.js +23 -2
  189. package/generated/tpl/html.d.ts +5 -0
  190. package/generated/tpl/html.js +7 -0
  191. package/generated/tpl/index.d.ts +6 -0
  192. package/generated/tpl/index.js +6 -0
  193. package/generated/tpl/is-template-result.d.ts +3 -0
  194. package/generated/tpl/is-template-result.js +1 -0
  195. package/generated/tpl/render.d.ts +2 -0
  196. package/generated/tpl/render.js +132 -0
  197. package/package.json +32 -7
  198. package/scss/_components.scss +15 -0
  199. package/scss/_functions.scss +10 -0
  200. package/scss/_maps.scss +293 -0
  201. package/scss/_mixins.scss +4 -0
  202. package/scss/_transitions.scss +6 -1
  203. package/scss/_utils.scss +2 -0
  204. package/scss/_vars.scss +9 -115
  205. package/scss/base/_layout.scss +17 -7
  206. package/scss/base/_reboot.scss +34 -1
  207. package/scss/base/_root.scss +143 -124
  208. package/scss/colors/_index.scss +328 -88
  209. package/scss/components/_alert-dialog.scss +111 -0
  210. package/scss/components/_bordered-button.scss +37 -0
  211. package/scss/components/_bordered-prominent-button.scss +46 -0
  212. package/scss/components/_borderless-button.scss +26 -0
  213. package/scss/components/_confirmation-dialog.scss +41 -49
  214. package/scss/components/_content-unavailable.scss +57 -0
  215. package/scss/components/_date-picker.scss +15 -15
  216. package/scss/components/_detail-placeholder.scss +1 -3
  217. package/scss/components/_disclosure-group.scss +85 -34
  218. package/scss/components/_fine-tooltip.scss +84 -0
  219. package/scss/components/_form-view.scss +63 -24
  220. package/scss/components/_glass-button.scss +37 -0
  221. package/scss/components/_glass-prominent-button.scss +47 -0
  222. package/scss/components/_group-box.scss +27 -0
  223. package/scss/components/_h-flex-stack.scss +23 -0
  224. package/scss/components/_h-stack.scss +6 -17
  225. package/scss/components/_image-view.scss +20 -0
  226. package/scss/components/_index.scss +69 -36
  227. package/scss/components/_label-view copy.scss.txt +420 -0
  228. package/scss/components/_label-view.scss +105 -120
  229. package/scss/components/_label-view.scss.txt +536 -0
  230. package/scss/components/_labeled-content.scss +67 -1
  231. package/scss/components/_list-view.scss +70 -29
  232. package/scss/components/_menu-view.scss +96 -61
  233. package/scss/components/_navigation-large-title.scss +23 -0
  234. package/scss/components/_navigation-split-view.scss +3 -3
  235. package/scss/components/_navigation-title.scss +1 -1
  236. package/scss/components/_picker-view.scss +270 -63
  237. package/scss/components/_plain-button.scss +8 -0
  238. package/scss/components/_progress-view.scss +98 -0
  239. package/scss/components/_scroll-view-proxy.scss +24 -22
  240. package/scss/components/_scroll-view-toolbars.scss +8 -2
  241. package/scss/components/_scroll-view.scss +16 -0
  242. package/scss/components/_search-view.scss +23 -0
  243. package/scss/components/_section-view.scss +23 -22
  244. package/scss/components/_sheet-view.scss +16 -6
  245. package/scss/components/_sidebar-toggle.scss +1 -4
  246. package/scss/components/_sticky-container.scss +1 -1
  247. package/scss/components/_tab-bar.scss +17 -3
  248. package/scss/components/_tab-view.scss +12 -2
  249. package/scss/components/_table-column.scss +4 -2
  250. package/scss/components/_table-row.scss +71 -3
  251. package/scss/components/_table-view.scss +27 -18
  252. package/scss/components/_text-field.scss +37 -17
  253. package/scss/components/_text-view.scss +57 -0
  254. package/scss/components/_toggle-view.scss +171 -0
  255. package/scss/components/_tool-bar-item.scss +34 -82
  256. package/scss/components/_tool-bar.scss +77 -57
  257. package/scss/components/_v-stack.scss +8 -2
  258. package/scss/final/_touch-glass.scss +31 -0
  259. package/scss/mixins/_button.scss +44 -0
  260. package/scss/mixins/_color.scss +16 -0
  261. package/scss/mixins/_dialog.scss +1 -0
  262. package/scss/mixins/_index.scss +73 -5
  263. package/scss/placeholders/_buttons.scss +46 -11
  264. package/scss/placeholders/_lists.scss +159 -126
  265. package/scss/transitions/_alert-dialog.scss +18 -0
  266. package/scss/transitions/_confirmation-dialog.scss +8 -0
  267. package/scss/transitions/_fine-tooltip.scss +21 -0
  268. package/scss/transitions/_menu-view.scss +17 -15
  269. package/scss/transitions/_progress-view.scss +23 -0
  270. package/scss/transitions/_sheet-view.scss +30 -0
  271. package/scss/transitions/_tab-bar.scss +6 -5
  272. package/scss/utils/_background.scss +52 -0
  273. package/scss/utils/_frame.scss +59 -40
  274. package/scss/utils/_index.scss +45 -56
  275. package/scss/utils/_scroll-view.scss +1 -1
  276. package/scss/utils/_spacing.scss +1 -1
  277. package/scss/utils/_stacks.scss +34 -164
  278. package/web-components.css-data/en.json +28 -0
  279. package/web-components.html-data/en.json +2456 -166
  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/generated/internal/utils/{cash/ancestors.d.ts → ancestors.d.ts} +0 -0
  288. /package/generated/internal/utils/{cash/ancestors.js → ancestors.js} +0 -0
  289. /package/generated/internal/utils/{cash/next-all.d.ts → next-all.d.ts} +0 -0
  290. /package/generated/internal/utils/{cash/next-all.js → next-all.js} +0 -0
  291. /package/generated/internal/utils/{cash/next.d.ts → next.d.ts} +0 -0
  292. /package/generated/internal/utils/{cash/next.js → next.js} +0 -0
  293. /package/generated/internal/utils/{cash/prev-all.d.ts → prev-all.d.ts} +0 -0
  294. /package/generated/internal/utils/{cash/prev-all.js → prev-all.js} +0 -0
  295. /package/generated/internal/utils/{cash/prev.d.ts → prev.d.ts} +0 -0
  296. /package/generated/internal/utils/{cash/prev.js → prev.js} +0 -0
  297. /package/generated/internal/utils/{cash/prop.d.ts → prop.d.ts} +0 -0
  298. /package/generated/internal/utils/{cash/prop.js → prop.js} +0 -0
  299. /package/generated/internal/utils/{cash/siblings.d.ts → siblings.d.ts} +0 -0
  300. /package/generated/internal/utils/{cash/siblings.js → siblings.js} +0 -0
@@ -1,12 +1,19 @@
1
1
  var _a;
2
2
  import { I18n } from '../i18n';
3
3
  import { CleanupRegistry } from '../internal/class/cleanup-registry';
4
- import { FormAssociatedBase, getInternals, makeSlotchangeHandler } from '../internal/class/form-associated-base';
5
- import { $, compareBigDecimals, kebabCase, onoff, set } from '../internal/utils';
4
+ import { FormAssociatedBase, getInternals } from '../internal/class/form-associated-base';
5
+ import { MutationObserverSet } from '../internal/class/mutation-observer-set';
6
+ import { $, compareBigDecimals, debug, kebabCase, onoff, set } from '../internal/utils';
7
+ import { queryMorph } from '../morphdom';
8
+ import { html } from '../tpl';
6
9
  const keyboardTypes = ['decimal-pad', 'number-pad', 'default'];
7
10
  /**
11
+ * @summary A control that displays an editable text area.
12
+ *
13
+ * @fires {{ detail: { text: string } }} commit — Triggered when user interacts with the input area
14
+ *
8
15
  * @slot label
9
- * @slot validity-options
16
+ * @slot {HTMLOptionElement[]} validity-options
10
17
  */
11
18
  export class TextField extends FormAssociatedBase {
12
19
  static get observedAttributes() {
@@ -20,29 +27,46 @@ export class TextField extends FormAssociatedBase {
20
27
  'name',
21
28
  'text',
22
29
  'text-input-autocapitalization',
30
+ /**
31
+ * @type {boolean}
32
+ */
23
33
  'disable-autocorrection',
34
+ /**
35
+ * @type {decimal-pad|number-pad|default}
36
+ */
24
37
  'keyboard-type',
38
+ /**
39
+ * @type {boolean}
40
+ */
25
41
  'required',
42
+ /**
43
+ * @type {boolean}
44
+ */
26
45
  'disabled',
27
46
  ];
28
47
  }
29
48
  static #template;
30
49
  static get template() {
31
- return (this.#template ??= $(String.raw `
32
- <label part="root text-field-stack">
33
- <div part="root text-field-label-stack">
34
- <slot name="label"></slot>
35
- </div>
36
- <div part="root text-field-input-stack">
37
- <input type="text" part="root input text-field-form-input">
38
- </div>
39
- <slot name="validity-options" hidden></slot>
40
- </label>`, ''));
50
+ return (this.#template ??= $(html `<label part="root text-field-stack">
51
+ <div part="root text-field-label-stack">
52
+ <slot name="label"></slot>
53
+ </div>
54
+ <div part="root text-field-input-stack">
55
+ <input type="text" part="root input text-field-form-input" />
56
+ </div>
57
+ <slot name="validity-options" hidden></slot>
58
+ </label>`));
41
59
  }
60
+ #renderValidityMsgs = (entries) => {
61
+ debug(`${_a.name} ⚡️ mutation`);
62
+ this.setValidity(this.validity, this.validationMessage);
63
+ };
42
64
  #shadowRoot;
43
65
  // #internals: ElementInternals
44
66
  #customValidity = '';
45
- #validitiesSlot;
67
+ // #validitiesSlot?: HTMLSlotElement
68
+ #slots = new Map();
69
+ #validityObservers = new MutationObserverSet(this.#renderValidityMsgs);
46
70
  #input;
47
71
  get #internals() {
48
72
  return getInternals(this);
@@ -51,9 +75,13 @@ export class TextField extends FormAssociatedBase {
51
75
  super();
52
76
  this.#shadowRoot = this.attachShadow({ mode: 'closed' });
53
77
  this.#shadowRoot.appendChild(document.importNode(this.constructor.template, true));
54
- this.#validitiesSlot = this.#shadowRoot.querySelector('slot[name=validity-options]') ?? undefined;
78
+ for (const slot of this.#shadowRoot.querySelectorAll('slot'))
79
+ this.#slots?.set(slot.name, slot);
80
+ CleanupRegistry.register(this, () => {
81
+ this.#slots = new Map();
82
+ });
55
83
  CleanupRegistry.unregister(this, 'validities');
56
- CleanupRegistry.register(this, onoff(makeSlotchangeHandler(this), this.#validitiesSlot).on(), 'validities');
84
+ CleanupRegistry.register(this, onoff('slotchange', this.#handleValiditiesSlotchange, this.#slots?.get('validity-options')).on(), 'validities');
57
85
  this.#input = this.#shadowRoot.querySelector('input') ?? undefined;
58
86
  CleanupRegistry.register(this, onoff([{ types: 'focusin', listener: this.#handleFocusin }], this).on());
59
87
  CleanupRegistry.register(this, onoff([
@@ -62,23 +90,12 @@ export class TextField extends FormAssociatedBase {
62
90
  { types: 'beforeinput', listener: this.#handleInputBeforeinput },
63
91
  { types: 'paste', listener: this.#handleInputPaste },
64
92
  ], this.#input).on());
65
- CleanupRegistry.register(this, onoff('change', () => {
93
+ CleanupRegistry.register(this, onoff('localechange', () => {
66
94
  this.text = this.text;
67
95
  }, I18n.on).on());
68
96
  }
69
- connectedCallback() {
70
- super.connectedCallback();
71
- // finally
72
- if (!this.hasAttribute('text'))
73
- return;
74
- this.text = this.getAttribute('text') ?? ''; // this.#input.value = this.getAttribute('text') ?? ''
75
- this.#sendValueToForm(false);
76
- }
77
- disconnectedCallback() {
78
- super.disconnectedCallback();
79
- }
80
97
  attributeChangedCallback(name, oldValue, newValue) {
81
- console.debug(`${_a.name} ⚡️ attr-change [${name}] ("${oldValue}" → "${newValue}")`);
98
+ debug(`${_a.name} ⚡️ attr-change [${name}] ("${oldValue}" → "${newValue}")`);
82
99
  switch (name) {
83
100
  case 'keyboard-type':
84
101
  switch (newValue) {
@@ -126,7 +143,7 @@ export class TextField extends FormAssociatedBase {
126
143
  break;
127
144
  case 'text':
128
145
  // if (this.#input) this.#input.value = newValue ?? ''
129
- this.text = newValue ?? '';
146
+ // nothing happens //this.text = newValue ?? ''
130
147
  break;
131
148
  case 'required':
132
149
  this.#input?.setAttribute(name, newValue ?? ''); // else this.#input?.removeAttribute(name)
@@ -135,7 +152,7 @@ export class TextField extends FormAssociatedBase {
135
152
  case 'name':
136
153
  case 'minimum':
137
154
  case 'maximum':
138
- this.#sendValueToForm();
155
+ this.#sendValueToForm(false);
139
156
  break;
140
157
  case 'prompt':
141
158
  this.#input?.setAttribute('placeholder', newValue ?? ''); // else this.#input?.removeAttribute(name)
@@ -149,14 +166,8 @@ export class TextField extends FormAssociatedBase {
149
166
  this.#sendValueToForm();
150
167
  break;
151
168
  case 'label':
152
- let label = this.querySelector(':scope>[slot=label]');
153
- if (newValue) {
154
- label ??= this.appendChild($(`<span slot="label" foreground="secondary"></span>`));
155
- label.textContent = newValue;
156
- }
157
- else
158
- label?.remove();
159
- this.#sendValueToForm();
169
+ queryMorph('[slot=label]', html `<label-view slot="label" foreground="secondary">${newValue ? html `<span>${newValue}</span>` : null}</label-view>`, this);
170
+ // this.#sendValueToForm()
160
171
  break;
161
172
  case 'disabled':
162
173
  for (const el of this.#shadowRoot.querySelectorAll('input'))
@@ -180,10 +191,20 @@ export class TextField extends FormAssociatedBase {
180
191
  break;
181
192
  }
182
193
  }
194
+ disconnectedCallback() {
195
+ super.disconnectedCallback();
196
+ this.#validityObservers.unobserveAll();
197
+ }
198
+ connectedCallback() {
199
+ super.connectedCallback();
200
+ // finally
201
+ if (!this.hasAttribute('text'))
202
+ return;
203
+ this.text = this.getAttribute('text') ?? ''; // this.#input.value = this.getAttribute('text') ?? ''
204
+ this.#sendValueToForm(false);
205
+ }
183
206
  get keyboardType() {
184
- return keyboardTypes.includes(this.getAttribute('keyboard-type') ?? '')
185
- ? this.getAttribute('keyboard-type')
186
- : 'default';
207
+ return keyboardTypes.includes(this.getAttribute('keyboard-type') ?? '') ? this.getAttribute('keyboard-type') : 'default';
187
208
  }
188
209
  get text() {
189
210
  return this.#input?.value ?? '';
@@ -200,8 +221,17 @@ export class TextField extends FormAssociatedBase {
200
221
  set(this.#input, 'value', finalText); // if (this.text !== finalText) this.#input.value = finalText
201
222
  }
202
223
  }
224
+ #handleValiditiesSlotchange = ({ type, target: slot }) => {
225
+ debug(`${_a.name} ⚡️ ${type}`);
226
+ if (!(slot instanceof HTMLSlotElement))
227
+ return;
228
+ const assigned = slot.assignedElements();
229
+ this.#validityObservers.syncObservations(assigned, ['value', 'label']);
230
+ // if (0 < assigned.length)
231
+ this.#renderValidityMsgs([]);
232
+ };
203
233
  #handleFocusin = (evt) => {
204
- console.debug(`${_a.name} ⚡️ ${evt?.type}`);
234
+ debug(`${_a.name} ⚡️ ${evt?.type}`);
205
235
  if (evt.target === this)
206
236
  this.#input?.focus();
207
237
  };
@@ -232,9 +262,9 @@ export class TextField extends FormAssociatedBase {
232
262
  this.dispatchEvent(new CustomEvent('commit', { detail: { text: this.text }, bubbles: true, composed: true }));
233
263
  };
234
264
  #handleInputPaste = (evt) => {
235
- console.debug(`${_a.name} ⚡️ ${evt?.type}`);
236
- const input = evt.target;
237
- if (!input)
265
+ debug(`${_a.name} ⚡️ ${evt?.type}`);
266
+ const { target: input } = evt;
267
+ if (!(input instanceof HTMLInputElement))
238
268
  return;
239
269
  evt.preventDefault();
240
270
  const data = this.#identity(evt.clipboardData?.getData('text') ?? ''); // number is now sanitized but contains edge cases like '+' and also global one separator that could be wither dot or decimal.
@@ -303,41 +333,41 @@ export class TextField extends FormAssociatedBase {
303
333
  const allowedSignsRegex2 = /^[+-]?$|^[+-]?(\d+([.,]\d*)?|[.,]\d*)$/, // allow single '+' or '-', then allow only one ',' or '.' and finally only digits
304
334
  digitsDecimalsOnlyRegex = /^(\d+([.,]\d*)?|[.,]\d*)?$/; // allow only one ',' or '.' and finally only digits
305
335
  return (this.negativeNumbersAllowed ? allowedSignsRegex2 : digitsDecimalsOnlyRegex).test(str);
306
- // // console.log(isValidDecimal("")); // true
307
- // // console.log(isValidDecimal("+")); // true
308
- // // console.log(isValidDecimal("-")); // true
309
- // // console.log(isValidDecimal("123")); // true
310
- // // console.log(isValidDecimal("+123")); // true
311
- // // console.log(isValidDecimal("-456")); // true
312
- // // console.log(isValidDecimal("12.34")); // true
313
- // // console.log(isValidDecimal("-0,56")); // true
314
- // // console.log(isValidDecimal(".78")); // true
315
- // // console.log(isValidDecimal(",9")); // true
316
- // // console.log(isValidDecimal("12.3.4")); // false
317
- // // console.log(isValidDecimal("12,3,4")); // false
318
- // // console.log(isValidDecimal("12-3")); // false
319
- // // console.log(isValidDecimal("12a")); // false
336
+ // // isValidDecimal(""); // true
337
+ // // isValidDecimal("+"); // true
338
+ // // isValidDecimal("-"); // true
339
+ // // isValidDecimal("123"); // true
340
+ // // isValidDecimal("+123"); // true
341
+ // // isValidDecimal("-456"); // true
342
+ // // isValidDecimal("12.34"); // true
343
+ // // isValidDecimal("-0,56"); // true
344
+ // // isValidDecimal(".78"); // true
345
+ // // isValidDecimal(",9"); // true
346
+ // // isValidDecimal("12.3.4"); // false
347
+ // // isValidDecimal("12,3,4"); // false
348
+ // // isValidDecimal("12-3"); // false
349
+ // // isValidDecimal("12a"); // false
320
350
  case 'number-pad':
321
351
  const allowedSignsRegex = /^([+-]|\d+|[+-]\d+)?$/, // allow single '+' or '-', then allow only digits
322
352
  digitsOnlyRegex = /^(\d+)?$/; // allow only digits
323
353
  return (this.negativeNumbersAllowed ? allowedSignsRegex : digitsOnlyRegex).test(str);
324
- // // console.log(isValidInteger("")); // true
325
- // // console.log(isValidInteger("+")); // true
326
- // // console.log(isValidInteger("-")); // true
327
- // // console.log(isValidInteger("123")); // true
328
- // // console.log(isValidInteger("+123")); // true
329
- // // console.log(isValidInteger("-456")); // true
330
- // // console.log(isValidInteger("12-3")); // false
331
- // // console.log(isValidInteger("++123")); // false
332
- // // console.log(isValidInteger("123a")); // false
354
+ // // isValidInteger(""); // true
355
+ // // isValidInteger("+"); // true
356
+ // // isValidInteger("-"); // true
357
+ // // isValidInteger("123"); // true
358
+ // // isValidInteger("+123"); // true
359
+ // // isValidInteger("-456"); // true
360
+ // // isValidInteger("12-3"); // false
361
+ // // isValidInteger("++123"); // false
362
+ // // isValidInteger("123a"); // false
333
363
  default:
334
364
  return true;
335
365
  }
336
366
  };
337
367
  #handleInputBeforeinput = (evt) => {
338
- console.debug(`${_a.name} ⚡️ ${evt?.type}`);
339
- const input = evt.target;
340
- if (!input)
368
+ debug(`${_a.name} ⚡️ ${evt?.type}`);
369
+ const { target: input } = evt;
370
+ if (!(input instanceof HTMLInputElement))
341
371
  return;
342
372
  if ('insertText' !== evt.inputType)
343
373
  return;
@@ -369,10 +399,9 @@ export class TextField extends FormAssociatedBase {
369
399
  // this.setValidity(prevValidity, prevValiditationMessage) // restore
370
400
  }
371
401
  };
372
- #handleInputBlur = (evt) => {
373
- console.debug(`${_a.name} ⚡️ ${evt?.type}`);
374
- const input = evt.target;
375
- if (!input)
402
+ #handleInputBlur = ({ type, target: input }) => {
403
+ debug(`${_a.name} ⚡️ ${type}`);
404
+ if (!(input instanceof HTMLInputElement))
376
405
  return;
377
406
  if (0 === input.value.length)
378
407
  return;
@@ -382,10 +411,12 @@ export class TextField extends FormAssociatedBase {
382
411
  this.#sendValueToForm();
383
412
  };
384
413
  #handleInputInput = (evt) => {
385
- console.debug(`${_a.name} ⚡️ ${evt?.type}`);
414
+ debug(`${_a.name} ⚡️ ${evt?.type}`);
386
415
  this.#sendValueToForm();
387
416
  };
388
- // Optional: form participation properties
417
+ /**
418
+ * Form participation property
419
+ */
389
420
  get name() {
390
421
  return this.getAttribute('name') ?? this.getAttribute('label') ?? this.querySelector(':scope>[slot=label]')?.textContent ?? '';
391
422
  }
@@ -426,14 +457,8 @@ export class TextField extends FormAssociatedBase {
426
457
  }
427
458
  }
428
459
  get negativeNumbersAllowed() {
429
- // switch (this.keyboardType) {
430
- // case 'decimal-pad':
431
- // case 'number-pad':
432
460
  const min = this.getAttribute('minimum') ?? '-Infinity', max = this.getAttribute('maximum') ?? 'Infinity';
433
461
  return compareBigDecimals('0', min) >= 0 && compareBigDecimals('0', max) <= 0;
434
- // default:
435
- // return false
436
- // }
437
462
  }
438
463
  setValidity = (flags, message, anchor) => {
439
464
  // let msg
@@ -442,16 +467,16 @@ export class TextField extends FormAssociatedBase {
442
467
  const key = k; // ✅ type-safe cast
443
468
  if (true !== flags[key])
444
469
  continue;
445
- for (const el of this.#validitiesSlot?.assignedElements({ flatten: true }) ?? []) {
470
+ for (const el of this.#slots?.get('validity-options')?.assignedElements({ flatten: true }) ?? []) {
446
471
  if (!el.matches('option'))
447
472
  continue;
448
- const option = el;
449
- if (`${kebabCase(key)}` === option.value) {
450
- message = option.label;
473
+ const { label, value } = el;
474
+ if (`${kebabCase(key)}` === value) {
475
+ message = label;
451
476
  break;
452
477
  }
453
- else if (`${kebabCase(key)}:${message}` === option.value) {
454
- message = option.label;
478
+ else if (`${kebabCase(key)}:${message}` === value) {
479
+ message = label;
455
480
  break;
456
481
  }
457
482
  }
@@ -464,7 +489,7 @@ export class TextField extends FormAssociatedBase {
464
489
  message = kebabCase(key);
465
490
  break;
466
491
  }
467
- console.debug(`${_a.name} ⚡️ validity-change`);
492
+ debug(`${_a.name} ⚡️ validity-change`);
468
493
  return this.#internals.setValidity(flags, this.#customValidity || message, anchor ?? this.#input);
469
494
  };
470
495
  setCustomValidity = (message) => {
@@ -474,16 +499,19 @@ export class TextField extends FormAssociatedBase {
474
499
  else
475
500
  this.#sendValueToForm(false);
476
501
  };
477
- formAssociatedCallback = (form) => {
478
- this.#sendValueToForm();
479
- };
480
- formDisabledCallback = (disabled) => {
502
+ formStateRestoreCallback(state, reason) {
503
+ this.text = state;
504
+ }
505
+ formAssociatedCallback(form) {
506
+ this.#sendValueToForm(false);
507
+ }
508
+ formDisabledCallback(disabled) {
481
509
  for (const el of this.#shadowRoot.querySelectorAll('input'))
482
510
  el.toggleAttribute('disabled', !disabled);
483
- };
484
- formResetCallback = () => {
511
+ }
512
+ formResetCallback() {
485
513
  this.text = '';
486
- this.#sendValueToForm();
487
- };
514
+ this.#sendValueToForm(false);
515
+ }
488
516
  }
489
517
  _a = TextField;
@@ -0,0 +1,11 @@
1
+ export declare class TextView extends HTMLElement {
2
+ constructor();
3
+ connectedCallback(): void;
4
+ disconnectedCallback(): void;
5
+ attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null): void;
6
+ }
7
+ declare global {
8
+ interface HTMLElementTagNameMap {
9
+ 'text-view': TextView;
10
+ }
11
+ }
@@ -0,0 +1,16 @@
1
+ import { debug } from '../internal/utils';
2
+ export class TextView extends HTMLElement {
3
+ constructor() {
4
+ super();
5
+ }
6
+ connectedCallback() {
7
+ debug(`${TextView.name} ⚡️ connect`);
8
+ }
9
+ disconnectedCallback() {
10
+ debug(`${TextView.name} ⚡️ disconnect`);
11
+ }
12
+ attributeChangedCallback(name, oldValue, newValue) {
13
+ debug(`${TextView.name} ⚡️ attr-change [${name}]`);
14
+ //
15
+ }
16
+ }
@@ -0,0 +1,43 @@
1
+ import { FormAssociatedBase } from '../internal/class/form-associated-base';
2
+ declare const toggleStyles: readonly ["switch", "button"];
3
+ export type ToggleStyle = (typeof toggleStyles)[number];
4
+ /**
5
+ * @summary A control that switches between on and off states.
6
+ *
7
+ * @example <toggle-view label="Custom Label"></toggle-view> — Creates a toggle that displays a custom label
8
+ *
9
+ * @fires toggle:change — User toggled the control
10
+ *
11
+ * @slot label
12
+ * @slot {HTMLOptionElement[]} validity-options
13
+ */
14
+ export declare class ToggleView extends FormAssociatedBase {
15
+ #private;
16
+ static get observedAttributes(): string[];
17
+ static get template(): DocumentFragment;
18
+ constructor();
19
+ attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null): void;
20
+ disconnectedCallback(): void;
21
+ connectedCallback(): void;
22
+ get toggleStyle(): ToggleStyle;
23
+ get isOn(): boolean;
24
+ set isOn(v: boolean);
25
+ /**
26
+ * Form participation property
27
+ */
28
+ get name(): string;
29
+ get value(): string | null;
30
+ set value(v: string | null);
31
+ setValidity: (flags?: ValidityStateFlags, message?: string, anchor?: HTMLElement) => void;
32
+ setCustomValidity: (message: string) => void;
33
+ formStateRestoreCallback(state: string, reason: string): void;
34
+ formAssociatedCallback(form: HTMLFormElement): void;
35
+ formDisabledCallback(disabled: boolean): void;
36
+ formResetCallback(): void;
37
+ }
38
+ declare global {
39
+ interface HTMLElementTagNameMap {
40
+ 'toggle-view': ToggleView;
41
+ }
42
+ }
43
+ export {};