@swiftwc/ui 0.0.0-dev.3 → 0.0.0-dev.31

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 (302) hide show
  1. package/README.md +15 -0
  2. package/generated/buses/alert-dialog.d.ts +2 -0
  3. package/generated/buses/alert-dialog.js +1 -0
  4. package/generated/buses/confirmation-dialog.d.ts +2 -0
  5. package/generated/buses/confirmation-dialog.js +1 -0
  6. package/generated/buses/index.d.ts +6 -0
  7. package/generated/buses/index.js +6 -0
  8. package/generated/buses/lifecycle-observer.d.ts +2 -0
  9. package/generated/buses/lifecycle-observer.js +1 -0
  10. package/generated/client/index.d.ts +31 -2
  11. package/generated/client/index.js +415 -8
  12. package/generated/components/alert-dialog.d.ts +8 -0
  13. package/generated/components/alert-dialog.js +94 -0
  14. package/generated/components/body-view.d.ts +5 -0
  15. package/generated/components/body-view.js +11 -0
  16. package/generated/components/bordered-button.d.ts +13 -0
  17. package/generated/components/bordered-button.js +42 -0
  18. package/generated/components/bordered-prominent-button.d.ts +13 -0
  19. package/generated/components/bordered-prominent-button.js +42 -0
  20. package/generated/components/borderless-button.d.ts +13 -0
  21. package/generated/components/borderless-button.js +42 -0
  22. package/generated/components/confirmation-dialog.d.ts +9 -0
  23. package/generated/components/confirmation-dialog.js +108 -0
  24. package/generated/components/content-unavailable-view.d.ts +24 -0
  25. package/generated/components/content-unavailable-view.js +78 -0
  26. package/generated/components/date-picker.d.ts +46 -0
  27. package/generated/components/date-picker.js +442 -0
  28. package/generated/components/disclosure-group.d.ts +9 -0
  29. package/generated/components/disclosure-group.js +54 -0
  30. package/generated/components/fine-tooltip.d.ts +7 -0
  31. package/generated/components/fine-tooltip.js +104 -0
  32. package/generated/components/form-view.d.ts +6 -0
  33. package/generated/components/form-view.js +58 -0
  34. package/generated/components/glass-button.d.ts +12 -0
  35. package/generated/components/glass-button.js +39 -0
  36. package/generated/components/glass-prominent-button.d.ts +12 -0
  37. package/generated/components/glass-prominent-button.js +39 -0
  38. package/generated/components/index.d.ts +41 -1
  39. package/generated/components/index.js +41 -6
  40. package/generated/components/label-view.d.ts +9 -0
  41. package/generated/components/label-view.js +56 -0
  42. package/generated/components/list-view.d.ts +5 -0
  43. package/generated/components/list-view.js +29 -0
  44. package/generated/components/menu-view.d.ts +9 -0
  45. package/generated/components/menu-view.js +138 -0
  46. package/generated/components/navigation-large-title.d.ts +6 -0
  47. package/generated/components/navigation-large-title.js +177 -0
  48. package/generated/components/navigation-split-view.d.ts +10 -0
  49. package/generated/components/navigation-split-view.js +21 -0
  50. package/generated/components/navigation-stack.d.ts +10 -0
  51. package/generated/components/navigation-stack.js +27 -0
  52. package/generated/components/navigation-title.d.ts +8 -0
  53. package/generated/components/navigation-title.js +49 -0
  54. package/generated/components/picker-view.d.ts +27 -0
  55. package/generated/components/picker-view.js +452 -0
  56. package/generated/components/plain-button.d.ts +7 -0
  57. package/generated/components/plain-button.js +20 -0
  58. package/generated/components/progress-view.d.ts +13 -0
  59. package/generated/components/progress-view.js +122 -0
  60. package/generated/components/screen-view.d.ts +5 -0
  61. package/generated/components/screen-view.js +9 -0
  62. package/generated/components/scroll-view-proxy.d.ts +8 -0
  63. package/generated/components/scroll-view-proxy.js +14 -0
  64. package/generated/components/scroll-view.d.ts +10 -0
  65. package/generated/components/scroll-view.js +197 -0
  66. package/generated/components/section-view.d.ts +9 -0
  67. package/generated/components/section-view.js +81 -0
  68. package/generated/components/sheet-view.d.ts +8 -0
  69. package/generated/components/sheet-view.js +85 -0
  70. package/generated/components/sidebar-toggle.d.ts +7 -0
  71. package/generated/components/sidebar-toggle.js +82 -0
  72. package/generated/components/sidebar-view.d.ts +7 -0
  73. package/generated/components/sidebar-view.js +35 -0
  74. package/generated/components/sticky-container.d.ts +6 -0
  75. package/generated/components/sticky-container.js +24 -0
  76. package/generated/components/tab-bar.d.ts +10 -0
  77. package/generated/components/tab-bar.js +42 -0
  78. package/generated/components/tab-item.d.ts +7 -0
  79. package/generated/components/tab-item.js +125 -0
  80. package/generated/components/tab-view.d.ts +22 -0
  81. package/generated/components/tab-view.js +259 -0
  82. package/generated/components/table-view.d.ts +7 -0
  83. package/generated/components/table-view.js +187 -0
  84. package/generated/components/text-field.d.ts +29 -0
  85. package/generated/components/text-field.js +478 -0
  86. package/generated/components/tool-bar-item-group.d.ts +5 -0
  87. package/generated/components/tool-bar-item-group.js +28 -0
  88. package/generated/components/tool-bar-item.d.ts +7 -0
  89. package/generated/components/tool-bar-item.js +53 -0
  90. package/generated/components/tool-bar.d.ts +19 -0
  91. package/generated/components/tool-bar.js +90 -0
  92. package/generated/components/v-keyboard.d.ts +11 -0
  93. package/generated/components/v-keyboard.js +81 -0
  94. package/generated/components/v-stack.d.ts +10 -0
  95. package/generated/components/v-stack.js +16 -0
  96. package/generated/css/index.css +8067 -0
  97. package/generated/events/alert-dialog.d.ts +8 -0
  98. package/generated/events/alert-dialog.js +1 -0
  99. package/generated/events/confirmation-dialog.d.ts +9 -0
  100. package/generated/events/confirmation-dialog.js +1 -0
  101. package/generated/events/date-picker.d.ts +8 -0
  102. package/generated/events/date-picker.js +1 -0
  103. package/generated/events/index.d.ts +8 -0
  104. package/generated/events/index.js +8 -0
  105. package/generated/events/lifecycle-observer.d.ts +10 -0
  106. package/generated/events/lifecycle-observer.js +1 -0
  107. package/generated/events/picker-view.d.ts +8 -0
  108. package/generated/events/picker-view.js +1 -0
  109. package/generated/events/scroll-view.d.ts +10 -0
  110. package/generated/events/scroll-view.js +1 -0
  111. package/generated/events/tab-view.d.ts +28 -0
  112. package/generated/events/tab-view.js +1 -0
  113. package/generated/events/text-field.d.ts +8 -0
  114. package/generated/events/text-field.js +1 -0
  115. package/generated/i18n/index.d.ts +34 -0
  116. package/generated/i18n/index.js +167 -0
  117. package/generated/i18n/locales/el.d.ts +15 -0
  118. package/generated/i18n/locales/el.js +15 -0
  119. package/generated/i18n/locales/en.d.ts +15 -0
  120. package/generated/i18n/locales/en.js +15 -0
  121. package/generated/i18n/locales/index.d.ts +4 -0
  122. package/generated/i18n/locales/index.js +4 -0
  123. package/generated/index.js +1 -1
  124. package/generated/internal/class/cleanup-registry.d.ts +5 -0
  125. package/generated/internal/class/cleanup-registry.js +38 -0
  126. package/generated/internal/class/css-style-observer.d.ts +8 -0
  127. package/generated/internal/class/css-style-observer.js +25 -0
  128. package/generated/internal/class/form-associated-base.d.ts +20 -0
  129. package/generated/internal/class/form-associated-base.js +96 -0
  130. package/generated/internal/class/mutation-observer-singleton.d.ts +10 -0
  131. package/generated/internal/class/mutation-observer-singleton.js +46 -0
  132. package/generated/internal/class/navigation-path.d.ts +15 -0
  133. package/generated/internal/class/navigation-path.js +84 -0
  134. package/generated/internal/class/navigation-view.d.ts +8 -0
  135. package/generated/internal/class/navigation-view.js +77 -0
  136. package/generated/internal/class/resize-observer-singleton.d.ts +7 -0
  137. package/generated/internal/class/resize-observer-singleton.js +22 -0
  138. package/generated/internal/decorators/custom-element.d.ts +5 -0
  139. package/generated/internal/decorators/custom-element.js +4 -0
  140. package/generated/internal/privateNamespace.d.ts +4 -0
  141. package/generated/internal/privateNamespace.js +1 -0
  142. package/generated/internal/utils/add.d.ts +1 -0
  143. package/generated/internal/utils/add.js +7 -0
  144. package/generated/internal/utils/button-role.d.ts +1 -0
  145. package/generated/internal/utils/button-role.js +59 -0
  146. package/generated/internal/utils/cash/ancestors.d.ts +1 -0
  147. package/generated/internal/utils/cash/ancestors.js +27 -0
  148. package/generated/internal/utils/cash/index.d.ts +23 -0
  149. package/generated/internal/utils/cash/index.js +25 -0
  150. package/generated/internal/utils/cash/next-all.d.ts +1 -0
  151. package/generated/internal/utils/cash/next-all.js +10 -0
  152. package/generated/internal/utils/cash/next.d.ts +1 -0
  153. package/generated/internal/utils/cash/next.js +9 -0
  154. package/generated/internal/utils/cash/prev-all.d.ts +1 -0
  155. package/generated/internal/utils/cash/prev-all.js +10 -0
  156. package/generated/internal/utils/cash/prev.d.ts +1 -0
  157. package/generated/internal/utils/cash/prev.js +9 -0
  158. package/generated/internal/utils/cash/prop.d.ts +18 -0
  159. package/generated/internal/utils/cash/prop.js +30 -0
  160. package/generated/internal/utils/cash/siblings.d.ts +1 -0
  161. package/generated/internal/utils/cash/siblings.js +10 -0
  162. package/generated/internal/utils/clamp.d.ts +1 -0
  163. package/generated/internal/utils/clamp.js +4 -0
  164. package/generated/internal/utils/compare-big-decimals.d.ts +1 -0
  165. package/generated/internal/utils/compare-big-decimals.js +90 -0
  166. package/generated/internal/utils/css-time.d.ts +1 -0
  167. package/generated/internal/utils/css-time.js +3 -0
  168. package/generated/internal/utils/debounce.d.ts +1 -0
  169. package/generated/internal/utils/debounce.js +13 -0
  170. package/generated/internal/utils/frame.d.ts +1 -0
  171. package/generated/internal/utils/frame.js +6 -0
  172. package/generated/internal/utils/index.d.ts +19 -1
  173. package/generated/internal/utils/index.js +20 -1
  174. package/generated/internal/utils/is-inside.d.ts +1 -0
  175. package/generated/internal/utils/is-inside.js +4 -0
  176. package/generated/internal/utils/kebab-case.d.ts +1 -1
  177. package/generated/internal/utils/kebab-case.js +3 -3
  178. package/generated/internal/utils/list-active.d.ts +7 -0
  179. package/generated/internal/utils/list-active.js +83 -0
  180. package/generated/internal/utils/microtask.d.ts +1 -0
  181. package/generated/internal/utils/microtask.js +3 -0
  182. package/generated/internal/utils/onoff.d.ts +45 -0
  183. package/generated/internal/utils/onoff.js +31 -0
  184. package/generated/internal/utils/set.d.ts +1 -0
  185. package/generated/internal/utils/set.js +7 -0
  186. package/generated/internal/utils/sleep.d.ts +1 -0
  187. package/generated/internal/utils/sleep.js +3 -0
  188. package/generated/internal/utils/slow-hide-show.d.ts +1 -0
  189. package/generated/internal/utils/slow-hide-show.js +16 -0
  190. package/generated/internal/utils/timeout.d.ts +5 -0
  191. package/generated/internal/utils/timeout.js +16 -0
  192. package/generated/internal/utils/touch-glass.d.ts +7 -0
  193. package/generated/internal/utils/touch-glass.js +19 -0
  194. package/generated/namespace-browser/base.d.ts +36 -0
  195. package/generated/namespace-browser/base.js +92 -0
  196. package/generated/namespace-browser/index.d.ts +7 -0
  197. package/generated/namespace-browser/index.js +1 -0
  198. package/generated/snapshot/index.d.ts +9 -0
  199. package/generated/snapshot/index.js +58 -0
  200. package/package.json +36 -9
  201. package/scss/_base.scss +5 -0
  202. package/scss/_components.scss +82 -0
  203. package/scss/_final.scss +1 -0
  204. package/scss/_functions.scss +31 -0
  205. package/scss/_mixins.scss +7 -0
  206. package/scss/_placeholders.scss +3 -0
  207. package/scss/_transitions.scss +32 -0
  208. package/scss/_utils.scss +9 -0
  209. package/scss/_vars.scss +179 -3
  210. package/scss/base/_layout.scss +56 -0
  211. package/scss/base/_reboot.scss +191 -0
  212. package/scss/base/_root.scss +397 -0
  213. package/scss/colors/_index.scss +704 -0
  214. package/scss/components/_alert-dialog.scss +111 -0
  215. package/scss/components/_body-view.scss +17 -0
  216. package/scss/components/_bordered-button.scss +57 -0
  217. package/scss/components/_bordered-prominent-button.scss +63 -0
  218. package/scss/components/_borderless-button.scss +44 -0
  219. package/scss/components/_confirmation-dialog.scss +117 -0
  220. package/scss/components/_content-unavailable-view.scss +45 -0
  221. package/scss/components/_date-picker.scss +30 -0
  222. package/scss/components/_detail-placeholder.scss +153 -0
  223. package/scss/components/_disclosure-group.scss +175 -0
  224. package/scss/components/_fine-tooltip.scss +82 -0
  225. package/scss/components/_form-view.scss +195 -0
  226. package/scss/components/_full-screen.scss +15 -0
  227. package/scss/components/_glass-button.scss +59 -0
  228. package/scss/components/_glass-prominent-button.scss +68 -0
  229. package/scss/components/_h-divider.scss +13 -0
  230. package/scss/components/_h-flex-stack.scss +23 -0
  231. package/scss/components/_h-stack.scss +29 -0
  232. package/scss/components/_index.scss +249 -0
  233. package/scss/components/_label-view copy.scss.txt +420 -0
  234. package/scss/components/_label-view.scss +355 -0
  235. package/scss/components/_label-view.scss.txt +536 -0
  236. package/scss/components/_labeled-content.scss +9 -0
  237. package/scss/components/_list-view.scss +229 -0
  238. package/scss/components/_menu-view.scss +205 -0
  239. package/scss/components/_navigation-large-title.scss +27 -0
  240. package/scss/components/_navigation-split-view.scss +424 -0
  241. package/scss/components/_navigation-stack.scss +11 -0
  242. package/scss/components/_navigation-title.scss +10 -0
  243. package/scss/components/_picker-view.scss +122 -0
  244. package/scss/components/_plain-button.scss +18 -0
  245. package/scss/components/_progress-view.scss +98 -0
  246. package/scss/components/_scroll-view-proxy.scss +79 -0
  247. package/scss/components/_scroll-view-toolbars.scss +126 -0
  248. package/scss/components/_scroll-view.scss +130 -0
  249. package/scss/components/_section-view.scss +119 -0
  250. package/scss/components/_sheet-view.scss +102 -0
  251. package/scss/components/_sidebar-toggle.scss +121 -0
  252. package/scss/components/_sidebar-view.scss +53 -0
  253. package/scss/components/_sticky-container.scss +42 -0
  254. package/scss/components/_tab-bar.scss +260 -0
  255. package/scss/components/_tab-item.scss +25 -0
  256. package/scss/components/_tab-view.scss +312 -0
  257. package/scss/components/_table-column.scss +52 -0
  258. package/scss/components/_table-row.scss +172 -0
  259. package/scss/components/_table-view.scss +223 -0
  260. package/scss/components/_text-field.scss +37 -0
  261. package/scss/components/_tool-bar-item-group.scss +48 -0
  262. package/scss/components/_tool-bar-item.scss +97 -0
  263. package/scss/components/_tool-bar.scss +153 -0
  264. package/scss/components/_v-divider.scss +13 -0
  265. package/scss/components/_v-flex-stack.scss +29 -0
  266. package/scss/components/_v-keyboard.scss +14 -0
  267. package/scss/components/_v-stack.scss +25 -0
  268. package/scss/final/_touch-glass.scss +91 -0
  269. package/scss/index.scss +15 -6
  270. package/scss/mixins/_button.scss +44 -0
  271. package/scss/mixins/_color.scss +16 -0
  272. package/scss/mixins/_dialog.scss +89 -0
  273. package/scss/mixins/_index.scss +422 -0
  274. package/scss/placeholders/_buttons.scss +117 -0
  275. package/scss/placeholders/_lists.scss +561 -0
  276. package/scss/transitions/_alert-dialog.scss +18 -0
  277. package/scss/transitions/_bwd.navbar.scss +19 -0
  278. package/scss/transitions/_bwd.scss +39 -0
  279. package/scss/transitions/_confirmation-dialog.scss +13 -0
  280. package/scss/transitions/_disclosure-group.scss +35 -0
  281. package/scss/transitions/_fine-tooltip.scss +21 -0
  282. package/scss/transitions/_fwd.navbar.scss +41 -0
  283. package/scss/transitions/_fwd.scss +24 -0
  284. package/scss/transitions/_glass-button.scss +12 -0
  285. package/scss/transitions/_glass-prominent-button.scss +12 -0
  286. package/scss/transitions/_index.scss +74 -0
  287. package/scss/transitions/_menu-view.scss +26 -0
  288. package/scss/transitions/_navigation-split-view.scss +23 -0
  289. package/scss/transitions/_progress-view.scss +23 -0
  290. package/scss/transitions/_sheet-view.scss +30 -0
  291. package/scss/transitions/_sidebar-view.scss +36 -0
  292. package/scss/transitions/_tab-bar.scss +20 -0
  293. package/scss/utils/_frame.scss +91 -0
  294. package/scss/utils/_index.scss +77 -0
  295. package/scss/utils/_scroll-view.scss +14 -0
  296. package/scss/utils/_spacing.scss +25 -0
  297. package/scss/utils/_stacks.scss +247 -0
  298. package/web-components.html-data/en.json +458 -0
  299. package/generated/internal/snapshot.d.ts +0 -5
  300. package/generated/internal/snapshot.js +0 -23
  301. package/generated/styles.css +0 -8
  302. package/scss/_reboot.scss +0 -11
@@ -0,0 +1,478 @@
1
+ var _a;
2
+ import { I18n } from '../i18n';
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';
6
+ const keyboardTypes = ['decimal-pad', 'number-pad', 'default'];
7
+ /**
8
+ * @slot label
9
+ * @slot validity-options
10
+ */
11
+ export class TextField extends FormAssociatedBase {
12
+ static get observedAttributes() {
13
+ return ['prompt', 'minimum', 'maximum', 'min-length', 'max-length', 'label', 'name', 'text', 'text-input-autocapitalization', 'disable-autocorrection', 'keyboard-type', 'required', 'disabled'];
14
+ }
15
+ static #template;
16
+ static get template() {
17
+ return (this.#template ??= $(String.raw `
18
+ <label part="root text-field-stack">
19
+ <div part="root text-field-label-stack">
20
+ <slot name="label"></slot>
21
+ </div>
22
+ <div part="root text-field-input-stack">
23
+ <input type="text" part="root input text-field-form-input">
24
+ </div>
25
+ <slot name="validity-options" hidden></slot>
26
+ </label>`));
27
+ }
28
+ #shadowRoot;
29
+ // #internals: ElementInternals
30
+ #customValidity = '';
31
+ // #validitiesSlot?: HTMLSlotElement
32
+ #slots = new Map();
33
+ #input;
34
+ get #internals() {
35
+ return getInternals(this);
36
+ }
37
+ constructor() {
38
+ super();
39
+ this.#shadowRoot = this.attachShadow({ mode: 'closed' });
40
+ this.#shadowRoot.appendChild(document.importNode(this.constructor.template, true));
41
+ for (const slot of this.#shadowRoot.querySelectorAll('slot'))
42
+ this.#slots?.set(slot.name, slot);
43
+ CleanupRegistry.register(this, () => {
44
+ this.#slots = new Map();
45
+ });
46
+ CleanupRegistry.unregister(this, 'validities');
47
+ CleanupRegistry.register(this, onoff(makeSlotchangeHandler(this), this.#slots?.get('validity-options')).on(), 'validities');
48
+ this.#input = this.#shadowRoot.querySelector('input') ?? undefined;
49
+ CleanupRegistry.register(this, onoff([{ types: 'focusin', listener: this.#handleFocusin }], this).on());
50
+ CleanupRegistry.register(this, onoff([
51
+ { types: 'blur', listener: this.#handleInputBlur },
52
+ { types: 'input', listener: this.#handleInputInput },
53
+ { types: 'beforeinput', listener: this.#handleInputBeforeinput },
54
+ { types: 'paste', listener: this.#handleInputPaste },
55
+ ], this.#input).on());
56
+ CleanupRegistry.register(this, onoff('localechange', () => {
57
+ this.text = this.text;
58
+ }, I18n.on).on());
59
+ }
60
+ connectedCallback() {
61
+ super.connectedCallback();
62
+ // finally
63
+ if (!this.hasAttribute('text'))
64
+ return;
65
+ this.text = this.getAttribute('text') ?? ''; // this.#input.value = this.getAttribute('text') ?? ''
66
+ this.#sendValueToForm(false);
67
+ }
68
+ disconnectedCallback() {
69
+ super.disconnectedCallback();
70
+ }
71
+ attributeChangedCallback(name, oldValue, newValue) {
72
+ console.debug(`${_a.name} ⚡️ attr-change [${name}] ("${oldValue}" → "${newValue}")`);
73
+ switch (name) {
74
+ case 'keyboard-type':
75
+ switch (newValue) {
76
+ case 'decimal-pad':
77
+ this.#input?.setAttribute('inputmode', 'decimal');
78
+ break;
79
+ case 'number-pad':
80
+ this.#input?.setAttribute('inputmode', 'numeric');
81
+ break;
82
+ case 'default':
83
+ default:
84
+ this.#input?.removeAttribute('inputmode');
85
+ break;
86
+ }
87
+ this.#sendValueToForm();
88
+ break;
89
+ case 'text-input-autocapitalization':
90
+ switch (newValue) {
91
+ case 'never':
92
+ this.#input?.setAttribute('autocapitalize', 'off');
93
+ break;
94
+ case 'characters':
95
+ this.#input?.setAttribute('autocapitalize', newValue);
96
+ break;
97
+ case 'words':
98
+ this.#input?.setAttribute('autocapitalize', newValue);
99
+ break;
100
+ default:
101
+ case 'sentences':
102
+ this.#input?.setAttribute('autocapitalize', 'on');
103
+ break;
104
+ }
105
+ break;
106
+ case 'disable-autocorrection':
107
+ if ('' === newValue)
108
+ for (const [k, v] of [
109
+ ['autocomplete', 'off'],
110
+ ['autocorrect', 'off'],
111
+ ['spellcheck', 'false'],
112
+ ])
113
+ this.#input?.setAttribute(k, v);
114
+ else
115
+ for (const k of ['autocomplete', 'autocorrect', 'spellcheck'])
116
+ this.#input?.removeAttribute(k);
117
+ break;
118
+ case 'text':
119
+ // if (this.#input) this.#input.value = newValue ?? ''
120
+ this.text = newValue ?? '';
121
+ break;
122
+ case 'required':
123
+ this.#input?.setAttribute(name, newValue ?? ''); // else this.#input?.removeAttribute(name)
124
+ this.#sendValueToForm();
125
+ break;
126
+ case 'name':
127
+ case 'minimum':
128
+ case 'maximum':
129
+ this.#sendValueToForm();
130
+ break;
131
+ case 'prompt':
132
+ this.#input?.setAttribute('placeholder', newValue ?? ''); // else this.#input?.removeAttribute(name)
133
+ break;
134
+ case 'min-length':
135
+ this.#input?.setAttribute('minlength', newValue ?? '');
136
+ this.#sendValueToForm();
137
+ break;
138
+ case 'max-length':
139
+ this.#input?.setAttribute('maxlength', newValue ?? '');
140
+ this.#sendValueToForm();
141
+ break;
142
+ case 'label':
143
+ let label = this.querySelector(':scope>[slot=label]');
144
+ if (newValue) {
145
+ label ??= this.appendChild($(`<span slot="label" foreground="secondary"></span>`, '>1'));
146
+ label.textContent = newValue;
147
+ }
148
+ else
149
+ label?.remove();
150
+ this.#sendValueToForm();
151
+ break;
152
+ case 'disabled':
153
+ for (const el of this.#shadowRoot.querySelectorAll('input'))
154
+ el.toggleAttribute('disabled', !newValue);
155
+ break;
156
+ }
157
+ // render pattern
158
+ switch (this.keyboardType) {
159
+ case 'decimal-pad':
160
+ const allowedSignsRegex2 = String.raw `[+\-]?|[+\-]?(\d+([.,]\d*)?|[.,]\d*)`, // allow single '+' or '-', then allow only one ',' or '.' and finally only digits
161
+ digitsDecimalsOnlyRegex = String.raw `(\d+([.,]\d*)?|[.,]\d*)?`; // allow only one ',' or '.' and finally only digits
162
+ this.#input?.setAttribute('pattern', this.negativeNumbersAllowed ? allowedSignsRegex2 : digitsDecimalsOnlyRegex);
163
+ break;
164
+ case 'number-pad':
165
+ const allowedSignsRegex = String.raw `([+\-]|\d+|[+\-]\d+)?`, // allow single '+' or '-', then allow only digits
166
+ digitsOnlyRegex = String.raw `\d*`; // allow only digits
167
+ this.#input?.setAttribute('pattern', this.negativeNumbersAllowed ? allowedSignsRegex : digitsOnlyRegex);
168
+ break;
169
+ default:
170
+ this.#input?.removeAttribute('pattern');
171
+ break;
172
+ }
173
+ }
174
+ get keyboardType() {
175
+ return keyboardTypes.includes(this.getAttribute('keyboard-type') ?? '') ? this.getAttribute('keyboard-type') : 'default';
176
+ }
177
+ get text() {
178
+ return this.#input?.value ?? '';
179
+ }
180
+ set text(v) {
181
+ if (!this.#input)
182
+ return;
183
+ const nv = this.#patternTest(v) ? v : '';
184
+ set(this.#input, 'value', nv);
185
+ // this.text AND this.value have NOW been updated to new values
186
+ // if user is NOT interacting replace new-text/input.value with the formatted version of the new-text/input.value!
187
+ if (document.activeElement !== this && 0 < this.#input.value.length) {
188
+ const finalText = this.value.replace(/[.,]/g, I18n.decimalSeparator);
189
+ set(this.#input, 'value', finalText); // if (this.text !== finalText) this.#input.value = finalText
190
+ }
191
+ }
192
+ #handleFocusin = (evt) => {
193
+ console.debug(`${_a.name} ⚡️ ${evt?.type}`);
194
+ if (evt.target === this)
195
+ this.#input?.focus();
196
+ };
197
+ #sendValueToForm = (dispatchEvent = true) => {
198
+ // input.value has already been updated/synced !!
199
+ if (this.matches(':disabled'))
200
+ return this.setValidity({});
201
+ // if (this.hasAttribute('required')) {
202
+ if (this.#input?.matches(':invalid')) {
203
+ this.setValidity(this.#input?.validity, this.#input?.validationMessage);
204
+ }
205
+ else if (['number-pad', 'decimal-pad'].includes(this.keyboardType) && (this.hasAttribute('minimum') || this.hasAttribute('maximum'))) {
206
+ const underflow = compareBigDecimals(this.value, this.getAttribute('minimum') ?? '-Infinity'), overflow = compareBigDecimals(this.value, this.getAttribute('maximum') ?? 'Infinity');
207
+ if (0 > underflow)
208
+ this.setValidity({ rangeUnderflow: true });
209
+ else if (0 < overflow)
210
+ this.setValidity({ rangeOverflow: true });
211
+ else
212
+ this.setValidity({});
213
+ }
214
+ else {
215
+ this.setValidity({});
216
+ }
217
+ const entries = new FormData();
218
+ entries.append(this.name, this.text);
219
+ this.#internals.setFormValue(entries);
220
+ if (dispatchEvent)
221
+ this.dispatchEvent(new CustomEvent('commit', { detail: { text: this.text }, bubbles: true, composed: true }));
222
+ };
223
+ #handleInputPaste = (evt) => {
224
+ console.debug(`${_a.name} ⚡️ ${evt?.type}`);
225
+ const input = evt.target instanceof HTMLInputElement && evt.target;
226
+ if (!input)
227
+ return;
228
+ evt.preventDefault();
229
+ 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.
230
+ if (0 === data.length)
231
+ return this.shake(); //.then(this.reportValidity) // nothing to paste
232
+ const start = input.selectionStart ?? 0, end = input.selectionEnd ?? 0, before = input.value.slice(0, start), after = input.value.slice(end), newText = `${before}${data}${after}`;
233
+ if (-1 < input.maxLength && input.maxLength < newText.length)
234
+ return this.shake(); //.then(this.reportValidity) // exceeding maxlength
235
+ input.value = newText;
236
+ const newCaret = start + data.length;
237
+ input.setSelectionRange(newCaret, newCaret); // move caret after inserted char
238
+ this.#sendValueToForm(); // input.dispatchEvent(new InputEvent('input', { bubbles: true })) // Manually trigger input event so listeners react
239
+ };
240
+ // NOTE: identity MUST always pass beforeinput checks
241
+ #identity = (str) => {
242
+ // 'ab-1.2.3.4x yz ' // "-1.234"
243
+ // '++12..34 ' // "+12.34"
244
+ // '-+5.6.7.8 ' // "-5.678"
245
+ // ' -+5.6,7.8 ' // "-5.678"
246
+ // 'foo123bar ' // "123"
247
+ // '.12.3 ' // ".123"
248
+ // ' http://localhost:5173/input.html' // "5173."
249
+ // ' http://localhost:51,73/input.html' // "51,73"
250
+ // ' +- 0000.' // "+0000."
251
+ // ' +' // "+"
252
+ // ' +0000234' // "+0000234"
253
+ // ' +-1.2.3.4x yz ' // "+1.234"
254
+ let seenSign = false;
255
+ switch (this.keyboardType) {
256
+ case 'decimal-pad': // allow only ^+- and then only one instance of ., finally remove all non digit rest appearances
257
+ let seenDot = false;
258
+ return [...`${str.trim()}`].reduce((acc, ch, i) => {
259
+ // +- signs are allowed
260
+ if (this.negativeNumbersAllowed)
261
+ if (!seenSign && (ch === '+' || ch === '-')) {
262
+ seenSign = true;
263
+ return `${acc}${ch}`;
264
+ }
265
+ if ((ch === '.' || ch === ',') && !seenDot) {
266
+ seenDot = true;
267
+ return `${acc}${ch}`;
268
+ }
269
+ if (/\d/.test(ch))
270
+ return `${acc}${ch}`;
271
+ return acc; // skip everything else
272
+ }, '');
273
+ case 'number-pad': // allow only ^+- finally remove all non digit rest appearances
274
+ return [...`${str.trim()}`].reduce((acc, ch, i) => {
275
+ // +- signs are allowed
276
+ if (this.negativeNumbersAllowed)
277
+ if (!seenSign && (ch === '+' || ch === '-')) {
278
+ seenSign = true;
279
+ return `${acc}${ch}`;
280
+ }
281
+ if (/\d/.test(ch))
282
+ return `${acc}${ch}`;
283
+ return acc; // skip everything else
284
+ }, '');
285
+ default:
286
+ return `${str}`;
287
+ }
288
+ };
289
+ #patternTest = (str) => {
290
+ switch (this.keyboardType) {
291
+ case 'decimal-pad':
292
+ const allowedSignsRegex2 = /^[+-]?$|^[+-]?(\d+([.,]\d*)?|[.,]\d*)$/, // allow single '+' or '-', then allow only one ',' or '.' and finally only digits
293
+ digitsDecimalsOnlyRegex = /^(\d+([.,]\d*)?|[.,]\d*)?$/; // allow only one ',' or '.' and finally only digits
294
+ return (this.negativeNumbersAllowed ? allowedSignsRegex2 : digitsDecimalsOnlyRegex).test(str);
295
+ // // isValidDecimal(""); // true
296
+ // // isValidDecimal("+"); // true
297
+ // // isValidDecimal("-"); // true
298
+ // // isValidDecimal("123"); // true
299
+ // // isValidDecimal("+123"); // true
300
+ // // isValidDecimal("-456"); // true
301
+ // // isValidDecimal("12.34"); // true
302
+ // // isValidDecimal("-0,56"); // true
303
+ // // isValidDecimal(".78"); // true
304
+ // // isValidDecimal(",9"); // true
305
+ // // isValidDecimal("12.3.4"); // false
306
+ // // isValidDecimal("12,3,4"); // false
307
+ // // isValidDecimal("12-3"); // false
308
+ // // isValidDecimal("12a"); // false
309
+ case 'number-pad':
310
+ const allowedSignsRegex = /^([+-]|\d+|[+-]\d+)?$/, // allow single '+' or '-', then allow only digits
311
+ digitsOnlyRegex = /^(\d+)?$/; // allow only digits
312
+ return (this.negativeNumbersAllowed ? allowedSignsRegex : digitsOnlyRegex).test(str);
313
+ // // isValidInteger(""); // true
314
+ // // isValidInteger("+"); // true
315
+ // // isValidInteger("-"); // true
316
+ // // isValidInteger("123"); // true
317
+ // // isValidInteger("+123"); // true
318
+ // // isValidInteger("-456"); // true
319
+ // // isValidInteger("12-3"); // false
320
+ // // isValidInteger("++123"); // false
321
+ // // isValidInteger("123a"); // false
322
+ default:
323
+ return true;
324
+ }
325
+ };
326
+ #handleInputBeforeinput = (evt) => {
327
+ console.debug(`${_a.name} ⚡️ ${evt?.type}`);
328
+ const input = evt.target instanceof HTMLInputElement && evt.target;
329
+ if (!input)
330
+ return;
331
+ if ('insertText' !== evt.inputType)
332
+ return;
333
+ const data = evt.data ?? '';
334
+ if (-1 < input.maxLength && 0 === data.length) {
335
+ evt.preventDefault();
336
+ return this.shake(); //.then(this.reportValidity)
337
+ } // nothing to add
338
+ const start = input.selectionStart ?? 0, end = input.selectionEnd ?? 0, before = this.text.slice(0, start), after = this.text.slice(end), newText = `${before}${data}${after}`;
339
+ if (0 === newText.length)
340
+ return;
341
+ switch (input.getAttribute('inputmode')) {
342
+ case 'decimal':
343
+ // const allowedSignsRegex2 = /^[+-]?$|^[+-]?(\d+([.,]\d*)?|[.,]\d*)$/, // allow single '+' or '-', then allow only one ',' or '.' and finally only digits
344
+ // digitsDecimalsOnlyRegex = /^(\d+([.,]\d*)?|[.,]\d*)?$/ // allow only one ',' or '.' and finally only digits
345
+ // if ((this.min < 0 ? allowedSignsRegex2 : digitsDecimalsOnlyRegex).test(newText)) break
346
+ if (this.#patternTest(newText))
347
+ break;
348
+ evt.preventDefault();
349
+ return this.shake(); //.then(this.reportValidity)
350
+ case 'numeric':
351
+ // const allowedSignsRegex = /^([+-]|\d+|[+-]\d+)?$/, // allow single '+' or '-', then allow only digits
352
+ // digitsOnlyRegex = /^(\d+)?$/ // allow only digits
353
+ // if ((this.min < 0 ? allowedSignsRegex : digitsOnlyRegex).test(newText)) break
354
+ if (this.#patternTest(newText))
355
+ break;
356
+ evt.preventDefault();
357
+ return this.shake(); //.then(this.reportValidity)
358
+ // this.setValidity(prevValidity, prevValiditationMessage) // restore
359
+ }
360
+ };
361
+ #handleInputBlur = (evt) => {
362
+ console.debug(`${_a.name} ⚡️ ${evt?.type}`);
363
+ const input = evt.target instanceof HTMLInputElement && evt.target;
364
+ if (!input)
365
+ return;
366
+ if (0 === input.value.length)
367
+ return;
368
+ const finalText = this.value.replace(/[.,]/g, I18n.decimalSeparator);
369
+ if (!set(input, 'value', finalText))
370
+ return;
371
+ this.#sendValueToForm();
372
+ };
373
+ #handleInputInput = (evt) => {
374
+ console.debug(`${_a.name} ⚡️ ${evt?.type}`);
375
+ this.#sendValueToForm();
376
+ };
377
+ // Optional: form participation properties
378
+ get name() {
379
+ return this.getAttribute('name') ?? this.getAttribute('label') ?? this.querySelector(':scope>[slot=label]')?.textContent ?? '';
380
+ }
381
+ get value() {
382
+ // text allows special edge cases, like '-.' or '+' and generally might be invalid number. It might also be localized and not US based.
383
+ // here we make sure it is number-like, to be used in number operations.
384
+ switch (this.keyboardType) {
385
+ case 'decimal-pad':
386
+ case 'number-pad':
387
+ if ('string' !== typeof this.text)
388
+ return '0';
389
+ const value = this.text.replace(/[.,]/g, '.');
390
+ // Capture optional leading sign
391
+ const sign = value.startsWith('-') ? '-' : '';
392
+ // Strip sign for processing
393
+ let s = value.replace(/^[+-]/, '');
394
+ // Split on dot (take only first two parts in case of multiple dots — though
395
+ // your input guarantees one, this is defensive)
396
+ const [intPart = '', fracPart = ''] = s.split('.'), hasDot = s.includes('.');
397
+ // Remove leading zeros from integer part, keep at least '0'
398
+ const cleanInt = intPart.replace(/^0+/, '') || '0';
399
+ // Remove trailing zeros from fractional part
400
+ const cleanFrac = fracPart.replace(/0+$/, '');
401
+ // Build result
402
+ const result = hasDot && cleanFrac.length > 0 ? `${sign}${cleanInt}.${cleanFrac}` : `${sign}${cleanInt}`;
403
+ return result.replace(/^-0(\.0+)?$/, '0');
404
+ default:
405
+ return this.text;
406
+ }
407
+ }
408
+ get valueAsNumber() {
409
+ switch (this.keyboardType) {
410
+ case 'decimal-pad':
411
+ case 'number-pad':
412
+ return Number(this.value);
413
+ default:
414
+ return '';
415
+ }
416
+ }
417
+ get negativeNumbersAllowed() {
418
+ // switch (this.keyboardType) {
419
+ // case 'decimal-pad':
420
+ // case 'number-pad':
421
+ const min = this.getAttribute('minimum') ?? '-Infinity', max = this.getAttribute('maximum') ?? 'Infinity';
422
+ return compareBigDecimals('0', min) >= 0 && compareBigDecimals('0', max) <= 0;
423
+ // default:
424
+ // return false
425
+ // }
426
+ }
427
+ setValidity = (flags, message, anchor) => {
428
+ // let msg
429
+ // if (message)
430
+ for (const k in flags) {
431
+ const key = k; // ✅ type-safe cast
432
+ if (true !== flags[key])
433
+ continue;
434
+ for (const el of this.#slots?.get('validity-options')?.assignedElements({ flatten: true }) ?? []) {
435
+ if (!el.matches('option'))
436
+ continue;
437
+ const option = el;
438
+ if (`${kebabCase(key)}` === option.value) {
439
+ message = option.label;
440
+ break;
441
+ }
442
+ else if (`${kebabCase(key)}:${message}` === option.value) {
443
+ message = option.label;
444
+ break;
445
+ }
446
+ }
447
+ }
448
+ if (!message)
449
+ for (const k in flags) {
450
+ const key = k; // ✅ type-safe cast
451
+ if (true !== flags[key])
452
+ continue;
453
+ message = kebabCase(key);
454
+ break;
455
+ }
456
+ console.debug(`${_a.name} ⚡️ validity-change`);
457
+ return this.#internals.setValidity(flags, this.#customValidity || message, anchor ?? this.#input);
458
+ };
459
+ setCustomValidity = (message) => {
460
+ this.#customValidity = message;
461
+ if (this.#customValidity)
462
+ this.#internals.setValidity({ ...this.#internals.validity, customError: true }, message);
463
+ else
464
+ this.#sendValueToForm(false);
465
+ };
466
+ formAssociatedCallback = (form) => {
467
+ this.#sendValueToForm();
468
+ };
469
+ formDisabledCallback = (disabled) => {
470
+ for (const el of this.#shadowRoot.querySelectorAll('input'))
471
+ el.toggleAttribute('disabled', !disabled);
472
+ };
473
+ formResetCallback = () => {
474
+ this.text = '';
475
+ this.#sendValueToForm();
476
+ };
477
+ }
478
+ _a = TextField;
@@ -0,0 +1,5 @@
1
+ export declare class ToolBarItemGroup extends HTMLElement {
2
+ constructor();
3
+ connectedCallback(): void;
4
+ disconnectedCallback(): void;
5
+ }
@@ -0,0 +1,28 @@
1
+ import { CleanupRegistry } from '../internal/class/cleanup-registry';
2
+ export class ToolBarItemGroup extends HTMLElement {
3
+ // static get observedAttributes() {
4
+ // return ['preferred-fine-modal-placement']
5
+ // }
6
+ constructor() {
7
+ super();
8
+ }
9
+ connectedCallback() {
10
+ console.debug(`${ToolBarItemGroup.name} ⚡️ connect`);
11
+ // if (!this.closest('[is=sheet-view]')) return
12
+ // if (!self.matchMedia('(pointer: fine)').matches) return
13
+ // const handler1 = toolbarRepositioner.bind(null, this)
14
+ // CleanupRegistry.register(this, onoff('fine_dialog_sheet:change', handler1 as unknown as EventListener, Snapshot.on).on())
15
+ // Snapshot.waitReady.then(() => {
16
+ // toolbarRepositioner(
17
+ // this,
18
+ // new MediaQueryListEvent(`media-change`, {
19
+ // matches: Snapshot.breakpoints?.get('fine_dialog_sheet'),
20
+ // })
21
+ // ) // Initial check
22
+ // })
23
+ }
24
+ disconnectedCallback() {
25
+ console.debug(`${ToolBarItemGroup.name} ⚡️ disconnect`);
26
+ CleanupRegistry.unregister(this);
27
+ }
28
+ }
@@ -0,0 +1,7 @@
1
+ export declare class ToolBarItem extends HTMLElement {
2
+ static get observedAttributes(): string[];
3
+ constructor();
4
+ connectedCallback(): void;
5
+ disconnectedCallback(): void;
6
+ attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null): void;
7
+ }
@@ -0,0 +1,53 @@
1
+ import { CleanupRegistry } from '../internal/class/cleanup-registry';
2
+ import { buttonRole, onoff, touchGlass } from '../internal/utils';
3
+ import { Snapshot } from '../snapshot';
4
+ export class ToolBarItem extends HTMLElement {
5
+ static get observedAttributes() {
6
+ return ['slot', 'data-previous-slot', 'title-key'];
7
+ }
8
+ constructor() {
9
+ super();
10
+ }
11
+ connectedCallback() {
12
+ console.debug(`${ToolBarItem.name} ⚡️ connect`);
13
+ CleanupRegistry.register(this, onoff(touchGlass(this, (t) => t.closest('tool-bar-item-group') ?? t, (evt) => {
14
+ const target = evt.target instanceof HTMLElement && evt.target;
15
+ if (!target)
16
+ return true;
17
+ if (target.closest('menu-view[open]'))
18
+ return false;
19
+ return true;
20
+ }), this).on());
21
+ // if (this.closest('tool-bar-item-group')) return
22
+ // if (!this.closest('[is=sheet-view]')) return
23
+ // if (!self.matchMedia('(pointer: fine)').matches) return
24
+ // const handler1 = toolbarRepositioner.bind(null, this)
25
+ // CleanupRegistry.register(this, onoff('fine_dialog_sheet:change', handler1 as unknown as EventListener, Snapshot.on).on())
26
+ // Snapshot.waitReady.then(() => {
27
+ // toolbarRepositioner(
28
+ // this,
29
+ // new MediaQueryListEvent(`media-change`, {
30
+ // matches: Snapshot.breakpoints?.get('fine_dialog_sheet'),
31
+ // })
32
+ // ) // Initial check
33
+ // })
34
+ }
35
+ disconnectedCallback() {
36
+ console.debug(`${ToolBarItem.name} ⚡️ disconnect`);
37
+ CleanupRegistry.unregister(this);
38
+ }
39
+ attributeChangedCallback(name, oldValue, newValue) {
40
+ console.debug(`${ToolBarItem.name} ⚡️ attr-change [${name}] ("${oldValue}" → "${newValue}")`);
41
+ switch (name) {
42
+ case 'slot':
43
+ case 'data-previous-slot':
44
+ case 'title-key':
45
+ const target = this.querySelector(':scope>button'), nv = this.getAttribute('data-previous-slot') ?? this.getAttribute('slot') ?? '';
46
+ if (target && ['confirmation-action', 'cancellation-action'].includes(nv))
47
+ Snapshot.waitReady.then(() => {
48
+ buttonRole(target, nv, this.getAttribute('title-key'));
49
+ });
50
+ break;
51
+ }
52
+ }
53
+ }
@@ -0,0 +1,19 @@
1
+ /**
2
+ * @slot cancellation-action - The item represents a cancellation action for a modal interface. Places the item in the leading edge of the top bar and on the leading edge of the bottom bar when fine modal
3
+ * @slot primary-action - The item represents a primary action. Places the item in the trailing edge of the top bar and on the trailing edge of the bottom bar when fine modal
4
+ * @slot confirmation-action - The item represents a confirmation action for a modal interface. Places the item in the trailing edge of the top bar and on the trailing edge of the bottom bar when fine modal
5
+ * @slot destructive-action - The item represents a destructive action for a modal interface. Places the item in the trailing edge of the top bar and on the trailing edge of the bottom bar when fine modal
6
+ * @slot top-bar-leading - Places the item in the leading edge of the top bar
7
+ * @slot top-bar-principal - Places the item in the middle of the top bar
8
+ * @slot top-bar-trailing - Places the item in the trailing edge of the top bar
9
+ * @slot bottom-bar-leading - Places the item in the leading edge of the bottom bar
10
+ * @slot bottom-bar-principal - Places the item in the middle of the bottom bar
11
+ * @slot bottom-bar-trailing - Places the item in the trailing edge of the bottom bar
12
+ */
13
+ export declare class ToolBar extends HTMLElement {
14
+ #private;
15
+ static get template(): DocumentFragment;
16
+ constructor();
17
+ connectedCallback(): void;
18
+ disconnectedCallback(): void;
19
+ }