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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (263) hide show
  1. package/README.md +15 -0
  2. package/generated/client/index.d.ts +13 -3
  3. package/generated/client/index.js +228 -158
  4. package/generated/components/bordered-button.d.ts +7 -0
  5. package/generated/components/bordered-button.js +20 -0
  6. package/generated/components/bordered-prominent-button.d.ts +7 -0
  7. package/generated/components/bordered-prominent-button.js +20 -0
  8. package/generated/components/borderless-button.d.ts +4 -4
  9. package/generated/components/borderless-button.js +26 -16
  10. package/generated/components/confirmation-dialog.d.ts +9 -0
  11. package/generated/components/confirmation-dialog.js +102 -0
  12. package/generated/components/date-picker.d.ts +46 -0
  13. package/generated/components/date-picker.js +430 -0
  14. package/generated/components/disclosure-group.d.ts +4 -7
  15. package/generated/components/disclosure-group.js +41 -66
  16. package/generated/components/form-view.d.ts +6 -0
  17. package/generated/components/form-view.js +58 -0
  18. package/generated/components/glass-button.d.ts +6 -0
  19. package/generated/components/glass-button.js +17 -0
  20. package/generated/components/glass-prominent-button.d.ts +6 -0
  21. package/generated/components/glass-prominent-button.js +17 -0
  22. package/generated/components/index.d.ts +34 -10
  23. package/generated/components/index.js +33 -14
  24. package/generated/components/label-view.d.ts +9 -0
  25. package/generated/components/label-view.js +83 -0
  26. package/generated/components/list-view.d.ts +5 -0
  27. package/generated/components/list-view.js +29 -0
  28. package/generated/components/menu-view.d.ts +9 -0
  29. package/generated/components/menu-view.js +133 -0
  30. package/generated/components/navigation-large-title.d.ts +6 -0
  31. package/generated/components/navigation-large-title.js +177 -0
  32. package/generated/components/navigation-split-view.d.ts +4 -2
  33. package/generated/components/navigation-split-view.js +11 -2
  34. package/generated/components/navigation-stack.d.ts +3 -2
  35. package/generated/components/navigation-stack.js +15 -58
  36. package/generated/components/navigation-title.d.ts +8 -0
  37. package/generated/components/navigation-title.js +66 -0
  38. package/generated/components/picker-view.d.ts +27 -0
  39. package/generated/components/picker-view.js +442 -0
  40. package/generated/components/plain-button.d.ts +7 -0
  41. package/generated/components/plain-button.js +20 -0
  42. package/generated/components/screen-view.d.ts +1 -1
  43. package/generated/components/screen-view.js +1 -1
  44. package/generated/components/scroll-view.d.ts +4 -2
  45. package/generated/components/scroll-view.js +169 -62
  46. package/generated/components/section-view.d.ts +9 -0
  47. package/generated/components/section-view.js +81 -0
  48. package/generated/components/sheet-view.d.ts +4 -4
  49. package/generated/components/sheet-view.js +59 -16
  50. package/generated/components/sidebar-toggle.d.ts +1 -1
  51. package/generated/components/sidebar-toggle.js +89 -63
  52. package/generated/components/sidebar-view.d.ts +2 -4
  53. package/generated/components/sidebar-view.js +20 -17
  54. package/generated/components/sticky-container.d.ts +6 -0
  55. package/generated/components/sticky-container.js +22 -0
  56. package/generated/components/tab-bar.d.ts +2 -4
  57. package/generated/components/tab-bar.js +24 -17
  58. package/generated/components/tab-item.d.ts +4 -3
  59. package/generated/components/tab-item.js +114 -29
  60. package/generated/components/tab-view.d.ts +17 -2
  61. package/generated/components/tab-view.js +244 -17
  62. package/generated/components/table-view.d.ts +7 -0
  63. package/generated/components/table-view.js +175 -0
  64. package/generated/components/text-field.d.ts +29 -0
  65. package/generated/components/text-field.js +489 -0
  66. package/generated/components/tool-bar-item-group.d.ts +5 -0
  67. package/generated/components/tool-bar-item-group.js +11 -0
  68. package/generated/components/tool-bar-item.d.ts +5 -0
  69. package/generated/components/tool-bar-item.js +19 -0
  70. package/generated/components/tool-bar.d.ts +7 -0
  71. package/generated/components/tool-bar.js +77 -0
  72. package/generated/components/v-keyboard.d.ts +2 -0
  73. package/generated/components/v-keyboard.js +64 -68
  74. package/generated/components/v-stack.d.ts +5 -0
  75. package/generated/components/v-stack.js +11 -0
  76. package/generated/confirmation-dialog/index.d.ts +1 -0
  77. package/generated/confirmation-dialog/index.js +1 -0
  78. package/generated/css/index.css +7463 -0
  79. package/generated/events/confirmation-dialog.d.ts +9 -0
  80. package/generated/events/date-picker.d.ts +8 -0
  81. package/generated/events/date-picker.js +1 -0
  82. package/generated/events/index.d.ts +7 -0
  83. package/generated/events/index.js +7 -0
  84. package/generated/events/lifecycle-observer.d.ts +10 -0
  85. package/generated/events/lifecycle-observer.js +1 -0
  86. package/generated/events/picker-view.d.ts +8 -0
  87. package/generated/events/picker-view.js +1 -0
  88. package/generated/events/scroll-view.d.ts +10 -0
  89. package/generated/events/scroll-view.js +1 -0
  90. package/generated/events/tab-view.d.ts +24 -0
  91. package/generated/events/tab-view.js +1 -0
  92. package/generated/events/text-field.d.ts +8 -0
  93. package/generated/events/text-field.js +1 -0
  94. package/generated/i18n/index.d.ts +24 -0
  95. package/generated/i18n/index.js +139 -0
  96. package/generated/internal/class/cleanup-registry.d.ts +5 -0
  97. package/generated/internal/class/cleanup-registry.js +38 -0
  98. package/generated/internal/class/css-style-observer.d.ts +8 -0
  99. package/generated/internal/class/css-style-observer.js +25 -0
  100. package/generated/internal/class/form-associated-base.d.ts +20 -0
  101. package/generated/internal/class/form-associated-base.js +93 -0
  102. package/generated/internal/class/mutation-observer-singleton.d.ts +10 -0
  103. package/generated/internal/class/mutation-observer-singleton.js +46 -0
  104. package/generated/internal/class/navigation-path.d.ts +15 -0
  105. package/generated/internal/class/navigation-path.js +84 -0
  106. package/generated/internal/class/navigation-view.d.ts +8 -0
  107. package/generated/internal/class/navigation-view.js +77 -0
  108. package/generated/internal/class/resize-observer-singleton.d.ts +7 -0
  109. package/generated/internal/class/resize-observer-singleton.js +22 -0
  110. package/generated/internal/decorators/custom-element.d.ts +5 -0
  111. package/generated/internal/decorators/custom-element.js +4 -0
  112. package/generated/internal/privateNamespace.d.ts +4 -0
  113. package/generated/internal/privateNamespace.js +1 -0
  114. package/generated/internal/utils/add.d.ts +1 -0
  115. package/generated/internal/utils/add.js +7 -0
  116. package/generated/internal/utils/cash/ancestors.d.ts +1 -0
  117. package/generated/internal/utils/cash/ancestors.js +27 -0
  118. package/generated/internal/utils/cash/index.d.ts +22 -0
  119. package/generated/internal/utils/cash/index.js +23 -0
  120. package/generated/internal/utils/cash/next-all.d.ts +1 -0
  121. package/generated/internal/utils/cash/next-all.js +10 -0
  122. package/generated/internal/utils/cash/next.d.ts +1 -0
  123. package/generated/internal/utils/cash/next.js +9 -0
  124. package/generated/internal/utils/cash/prev-all.d.ts +1 -0
  125. package/generated/internal/utils/cash/prev-all.js +10 -0
  126. package/generated/internal/utils/cash/prev.d.ts +1 -0
  127. package/generated/internal/utils/cash/prev.js +9 -0
  128. package/generated/internal/utils/cash/prop.d.ts +18 -0
  129. package/generated/internal/utils/cash/prop.js +30 -0
  130. package/generated/internal/utils/cash/siblings.d.ts +1 -0
  131. package/generated/internal/utils/cash/siblings.js +10 -0
  132. package/generated/internal/utils/clamp.d.ts +1 -0
  133. package/generated/internal/utils/clamp.js +4 -0
  134. package/generated/internal/utils/compare-big-decimals.d.ts +1 -0
  135. package/generated/internal/utils/compare-big-decimals.js +90 -0
  136. package/generated/internal/utils/debounce.d.ts +1 -0
  137. package/generated/internal/utils/debounce.js +13 -0
  138. package/generated/internal/utils/frame.d.ts +1 -0
  139. package/generated/internal/utils/frame.js +6 -0
  140. package/generated/internal/utils/index.d.ts +16 -1
  141. package/generated/internal/utils/index.js +17 -1
  142. package/generated/internal/utils/kebab-case.d.ts +1 -1
  143. package/generated/internal/utils/list-active.d.ts +7 -0
  144. package/generated/internal/utils/list-active.js +28 -0
  145. package/generated/internal/utils/microtask.d.ts +1 -0
  146. package/generated/internal/utils/microtask.js +3 -0
  147. package/generated/internal/utils/onoff.d.ts +45 -0
  148. package/generated/internal/utils/onoff.js +31 -0
  149. package/generated/internal/utils/set.d.ts +1 -0
  150. package/generated/internal/utils/set.js +7 -0
  151. package/generated/internal/utils/sleep.d.ts +1 -0
  152. package/generated/internal/utils/sleep.js +3 -0
  153. package/generated/internal/utils/slow-hide-show.d.ts +1 -0
  154. package/generated/internal/utils/slow-hide-show.js +16 -0
  155. package/generated/internal/utils/timeout.d.ts +5 -0
  156. package/generated/internal/utils/timeout.js +16 -0
  157. package/generated/internal/utils/touch-glass.d.ts +7 -0
  158. package/generated/internal/utils/touch-glass.js +19 -0
  159. package/generated/lifecycle-observer/index.d.ts +1 -0
  160. package/generated/lifecycle-observer/index.js +1 -0
  161. package/generated/namespace-browser/base.d.ts +36 -0
  162. package/generated/namespace-browser/base.js +92 -0
  163. package/generated/namespace-browser/index.d.ts +7 -0
  164. package/generated/namespace-browser/index.js +1 -0
  165. package/generated/snapshot/index.d.ts +2 -11
  166. package/generated/snapshot/index.js +31 -144
  167. package/package.json +19 -8
  168. package/scss/_components.scss +52 -16
  169. package/scss/_final.scss +1 -0
  170. package/scss/_mixins.scss +2 -171
  171. package/scss/_placeholders.scss +3 -0
  172. package/scss/_transitions.scss +16 -0
  173. package/scss/_utils.scss +9 -0
  174. package/scss/_vars.scss +137 -23
  175. package/scss/base/_layout.scss +31 -15
  176. package/scss/base/_reboot.scss +118 -15
  177. package/scss/base/_root.scss +355 -25
  178. package/scss/colors/_index.scss +624 -70
  179. package/scss/components/_body-view.scss +12 -3
  180. package/scss/components/_bordered-button.scss +22 -0
  181. package/scss/components/_bordered-prominent-button.scss +19 -0
  182. package/scss/components/_borderless-button.scss +11 -6
  183. package/scss/components/_confirmation-dialog.scss +110 -0
  184. package/scss/components/_date-picker.scss +30 -0
  185. package/scss/components/_detail-placeholder.scss +155 -0
  186. package/scss/components/_disclosure-group.scss +100 -52
  187. package/scss/components/_form-view.scss +195 -0
  188. package/scss/components/_full-screen.scss +7 -5
  189. package/scss/components/_glass-button.scss +24 -0
  190. package/scss/components/_glass-prominent-button.scss +24 -0
  191. package/scss/components/_h-divider.scss +13 -0
  192. package/scss/components/_h-stack.scss +39 -0
  193. package/scss/components/_index.scss +224 -7
  194. package/scss/components/_label-view.scss +386 -0
  195. package/scss/components/_labeled-content.scss +9 -0
  196. package/scss/components/_list-view.scss +229 -0
  197. package/scss/components/_menu-view.scss +188 -0
  198. package/scss/components/_navigation-large-title.scss +27 -0
  199. package/scss/components/_navigation-split-view.scss +329 -269
  200. package/scss/components/_navigation-stack.scss +6 -6
  201. package/scss/components/_navigation-title.scss +10 -0
  202. package/scss/components/_picker-view.scss +122 -0
  203. package/scss/components/_plain-button.scss +11 -0
  204. package/scss/components/_scroll-view-proxy.scss +79 -0
  205. package/scss/components/_scroll-view-toolbars.scss +126 -0
  206. package/scss/components/_scroll-view.scss +110 -66
  207. package/scss/components/_section-view.scss +119 -0
  208. package/scss/components/_sheet-view.scss +68 -35
  209. package/scss/components/_sidebar-toggle.scss +90 -27
  210. package/scss/components/_sidebar-view.scss +30 -40
  211. package/scss/components/_sticky-container.scss +42 -0
  212. package/scss/components/_tab-bar.scss +201 -84
  213. package/scss/components/_tab-item.scss +25 -0
  214. package/scss/components/_tab-view.scss +268 -126
  215. package/scss/components/_table-column.scss +52 -0
  216. package/scss/components/_table-row.scss +172 -0
  217. package/scss/components/_table-view.scss +223 -0
  218. package/scss/components/_text-field.scss +37 -0
  219. package/scss/components/_tool-bar-item-group.scss +30 -19
  220. package/scss/components/_tool-bar-item.scss +128 -70
  221. package/scss/components/_tool-bar.scss +107 -64
  222. package/scss/components/_v-divider.scss +13 -0
  223. package/scss/components/_v-flex-stack.scss +29 -0
  224. package/scss/components/_v-keyboard.scss +6 -4
  225. package/scss/components/_v-stack.scss +8 -9
  226. package/scss/final/_touch-glass.scss +67 -0
  227. package/scss/index.scss +6 -2
  228. package/scss/mixins/_dialog.scss +88 -0
  229. package/scss/mixins/_index.scss +405 -0
  230. package/scss/placeholders/_buttons.scss +83 -0
  231. package/scss/placeholders/_lists.scss +589 -0
  232. package/scss/transitions/_bwd.navbar.scss +3 -13
  233. package/scss/transitions/_bwd.scss +4 -20
  234. package/scss/transitions/_confirmation-dialog.scss +19 -0
  235. package/scss/transitions/_dialog.scss +7 -11
  236. package/scss/transitions/_disclosure-group.scss +35 -0
  237. package/scss/transitions/_fwd.navbar.scss +4 -9
  238. package/scss/transitions/_fwd.scss +4 -34
  239. package/scss/transitions/_glass-button.scss +12 -0
  240. package/scss/transitions/_glass-prominent-button.scss +12 -0
  241. package/scss/transitions/_index.scss +35 -143
  242. package/scss/transitions/_menu-view.scss +26 -0
  243. package/scss/transitions/_navigation-split-view.scss +23 -0
  244. package/scss/transitions/_sidebar-view.scss +36 -0
  245. package/scss/transitions/_tab-bar.scss +19 -0
  246. package/scss/utils/_frame.scss +84 -0
  247. package/scss/utils/_index.scss +68 -0
  248. package/scss/utils/_scroll-view.scss +14 -0
  249. package/scss/utils/_spacing.scss +25 -0
  250. package/scss/utils/_stacks.scss +242 -0
  251. package/web-components.html-data/en.json +330 -0
  252. package/generated/components/bottom-bar.d.ts +0 -10
  253. package/generated/components/bottom-bar.js +0 -73
  254. package/generated/components/navigation-bar.d.ts +0 -10
  255. package/generated/components/navigation-bar.js +0 -80
  256. package/generated/internal/class.d.ts +0 -18
  257. package/generated/internal/class.js +0 -18
  258. package/generated/namespace/index.d.ts +0 -6
  259. package/generated/styles.css +0 -1305
  260. package/scss/_dev.scss +0 -68
  261. package/scss/components/_tab-bar-stack.scss +0 -101
  262. package/scss/components/_toolbars.scss +0 -100
  263. /package/generated/{namespace/index.js → events/confirmation-dialog.js} +0 -0
@@ -0,0 +1,442 @@
1
+ var _a;
2
+ import { CleanupRegistry } from '../internal/class/cleanup-registry';
3
+ import { FormAssociatedBase, getInternals, makeSlotchangeHandler } from '../internal/class/form-associated-base';
4
+ import { MutationObserverSingleton } from '../internal/class/mutation-observer-singleton';
5
+ import { $, kebabCase, onoff } from '../internal/utils';
6
+ const pickerStyles = ['menu', 'inline', 'automatic'];
7
+ const observers = new MutationObserverSingleton();
8
+ export class PickerView extends FormAssociatedBase {
9
+ static get ATTR() {
10
+ return {
11
+ PLACEHOLDER: 'placeholder',
12
+ LABEL: 'label',
13
+ PICKER_STYLE: 'picker-style',
14
+ SELECTION: 'selection',
15
+ };
16
+ }
17
+ static get observedAttributes() {
18
+ return Object.values(this.ATTR);
19
+ }
20
+ static #templates = new Map();
21
+ #lastRenderedStyle; //string | null
22
+ #shadowRoot;
23
+ #customValidity = '';
24
+ #validitiesSlot;
25
+ #datalistSlot;
26
+ #tagSlot;
27
+ #trackedElements = new Set();
28
+ #selection = '';
29
+ get #internals() {
30
+ return getInternals(this);
31
+ }
32
+ get template() {
33
+ // const style = this.getAttribute((this.constructor as typeof PickerView).ATTR.PICKER_STYLE) ?? ''
34
+ if (!_a.#templates.has(this.pickerStyle))
35
+ switch (this.pickerStyle) {
36
+ // case 'inline':
37
+ // template.innerHTML = `
38
+ // <list-view frame-width="infinity" part="root inline-form">
39
+ // <slot></slot>
40
+ // </list-view>
41
+ // `
42
+ // break
43
+ case 'menu':
44
+ // template.innerHTML = `<slot name="options"></slot><slot></slot>`
45
+ _a.#templates.set(this.pickerStyle, $(String.raw `
46
+ <label part="root picker-stack">
47
+ <div part="root picker-label-stack">
48
+ <slot name="label"></slot>
49
+ </div>
50
+ <div part="root picker-input-stack">
51
+ <slot></slot>
52
+ </div>
53
+ <slot name="options" hidden></slot>
54
+ <slot name="tag" hidden></slot>
55
+ <slot name="validity-options" hidden></slot>
56
+ </label>
57
+ `, ''));
58
+ // break
59
+ // case 'compact':
60
+ // PickerView.#templates.set(
61
+ // style,
62
+ // Object.assign(document.createElement('template'), {
63
+ // innerHTML: String.raw`
64
+ // <label part="compact-picker">
65
+ // <input type="text" part="compact-input">
66
+ // </label>
67
+ // `,
68
+ // })
69
+ // )
70
+ // break
71
+ // case 'fancy':
72
+ // PickerView.#templates.set(
73
+ // style,
74
+ // Object.assign(document.createElement('template'), {
75
+ // innerHTML: String.raw`
76
+ // <div part="fancy-picker">
77
+ // <span>Fancy Picker</span>
78
+ // <input type="text" part="fancy-input">
79
+ // </div>
80
+ // `,
81
+ // })
82
+ // )
83
+ break;
84
+ // case 'gg':
85
+ // PickerView.#templates.set(
86
+ // style,
87
+ // Object.assign(document.createElement('template'), {
88
+ // innerHTML: String.raw`
89
+ // <label part="root text-field-stack">
90
+ // <div part="root text-field-label-stack">
91
+ // <slot name="label"></slot>
92
+ // </div>
93
+ // <div part="root text-field-input-stack">
94
+ // <input type="text" part="root input text-field-form-input" list="tickmarks">
95
+ // <datalist id="tickmarks">
96
+ // <option value="0" label="0%"></option>
97
+ // </datalist>
98
+ // </div>
99
+ // <slot name="options" hidden></slot>
100
+ // </label>`,
101
+ // })
102
+ // )
103
+ // break
104
+ case 'inline':
105
+ default:
106
+ _a.#templates.set(this.pickerStyle, $(String.raw `
107
+ <label part="root picker-stack">
108
+ <div part="root picker-label-stack">
109
+ <slot name="label"></slot>
110
+ </div>
111
+ <div part="root picker-input-stack">
112
+ <slot></slot>
113
+ </div>
114
+ <slot name="options" hidden></slot>
115
+ <slot name="tag" hidden></slot>
116
+ <slot name="validity-options" hidden></slot>
117
+ </label>`, ''));
118
+ break;
119
+ }
120
+ return _a.#templates.get(this.pickerStyle);
121
+ }
122
+ constructor() {
123
+ super();
124
+ this.#shadowRoot = this.attachShadow({ mode: 'closed' });
125
+ // this.#render() // Snapshot.waitReady.then(this.#render.bind(this))
126
+ }
127
+ connectedCallback() {
128
+ console.debug(`${_a.name} ⚡️ connect`);
129
+ CleanupRegistry.register(this, onoff('click', this.#handleClick, this).on());
130
+ if (!this.hasAttribute(this.constructor.ATTR.PICKER_STYLE))
131
+ this.#render(); // will be picked up by attr-change!
132
+ // finally
133
+ if (!this.hasAttribute('selection'))
134
+ return;
135
+ this.#selection = this.getAttribute('selection') ?? '';
136
+ this.#sendValueToForm(false);
137
+ }
138
+ disconnectedCallback() {
139
+ console.debug(`${_a.name} ⚡️ disconnect`);
140
+ CleanupRegistry.unregister(this);
141
+ observers.clearObservationsSet(this.#trackedElements);
142
+ }
143
+ attributeChangedCallback(name, oldValue, newValue) {
144
+ console.debug(`${_a.name} ⚡️ attr-change [${name}] ("${oldValue}" → "${newValue}")`);
145
+ switch (name) {
146
+ case this.constructor.ATTR.PLACEHOLDER:
147
+ this.#reflectPlaceholder(newValue);
148
+ break;
149
+ case this.constructor.ATTR.LABEL:
150
+ this.#reflectLabel(newValue);
151
+ this.#sendValueToForm();
152
+ break;
153
+ case this.constructor.ATTR.PICKER_STYLE:
154
+ if (oldValue === newValue)
155
+ break;
156
+ this.#render();
157
+ // this.#sendValueToForm()
158
+ break;
159
+ case this.constructor.ATTR.SELECTION:
160
+ // nothing happens
161
+ break;
162
+ }
163
+ }
164
+ get pickerStyle() {
165
+ return pickerStyles.includes(this.getAttribute(this.constructor.ATTR.PICKER_STYLE) ?? '')
166
+ ? this.getAttribute(this.constructor.ATTR.PICKER_STYLE)
167
+ : 'automatic';
168
+ }
169
+ #render() {
170
+ console.debug(`${_a.name} ⚡️ render (${this.pickerStyle})`);
171
+ if (!this.isConnected)
172
+ return;
173
+ // const style = this.getAttribute((this.constructor as typeof PickerView).ATTR.PICKER_STYLE)
174
+ if (this.#lastRenderedStyle === this.pickerStyle)
175
+ return; // skip if already applied
176
+ this.#lastRenderedStyle = this.pickerStyle;
177
+ // clear shadow DOM
178
+ this.#shadowRoot.replaceChildren(document.importNode(this.template, true));
179
+ this.#validitiesSlot = this.#shadowRoot.querySelector('slot[name=validity-options]') ?? undefined;
180
+ this.#datalistSlot = this.#shadowRoot.querySelector('slot[name=options]') ?? undefined;
181
+ this.#tagSlot = this.#shadowRoot.querySelector('slot[name=tag]') ?? undefined;
182
+ CleanupRegistry.unregister(this, 'validities');
183
+ CleanupRegistry.register(this, onoff(makeSlotchangeHandler(this), this.#validitiesSlot).on(), 'validities');
184
+ CleanupRegistry.unregister(this, 'datalist'); //off1()
185
+ CleanupRegistry.register(this, onoff('slotchange', this.#handleSlotchange, this.#datalistSlot).on(), 'datalist');
186
+ CleanupRegistry.unregister(this, 'tags'); //off2()
187
+ CleanupRegistry.register(this, onoff('slotchange', this.#handleSlotchange, this.#tagSlot).on(), 'tags');
188
+ // if (0 < (this.#datalistSlot?.assignedElements({ flatten: true }) ?? []).length) this.#handleTagMutation()
189
+ // if (0 < (this.#tagSlot?.assignedElements({ flatten: true }) ?? []).length) this.#handleTagMutation()
190
+ //this.getAttribute((this.constructor as typeof PickerView).ATTR.PICKER_STYLE)) {
191
+ switch (this.pickerStyle
192
+ // case 'menu':
193
+ // // if (0 < (this.#datalistSlot?.assignedElements({ flatten: true }) ?? []).length) this.#handleMenuDatalistMutation()
194
+ // break
195
+ // case 'gg':
196
+ // // reattach input listener
197
+ // const input = this.#shadowRoot.querySelector('input')
198
+ // if (input) {
199
+ // input.addEventListener('input', () => {
200
+ // this.#internals!.setFormValue(input.value)
201
+ // })
202
+ // // restore placeholder if set
203
+ // const placeholder = this.getAttribute((this.constructor as typeof PickerView).ATTR.PLACEHOLDER)
204
+ // if (placeholder) input.setAttribute('placeholder', placeholder)
205
+ // }
206
+ // // restore label if set
207
+ // const label = this.getAttribute((this.constructor as typeof PickerView).ATTR.LABEL)
208
+ // if (label) this.#reflectLabel(label)
209
+ // break
210
+ // case 'inline':
211
+ // default:
212
+ // // if (0 < (this.#datalistSlot?.assignedElements({ flatten: true }) ?? []).length) this.#handleInlineDatalistMutation()
213
+ // break
214
+ ) {
215
+ }
216
+ }
217
+ #sendValueToForm = (dispatchEvent = true) => {
218
+ // input.value has already been updated/synced !!
219
+ if (this.matches(':disabled'))
220
+ return this.setValidity({});
221
+ if (this.hasAttribute('required')) {
222
+ if (!this.#selection) {
223
+ this.setValidity({ badInput: true }, 'invalid-selection');
224
+ }
225
+ else
226
+ this.setValidity({});
227
+ }
228
+ else
229
+ this.setValidity({});
230
+ const entries = new FormData();
231
+ entries.append(this.name, this.#selection);
232
+ this.#internals.setFormValue(entries);
233
+ if (dispatchEvent)
234
+ this.dispatchEvent(new CustomEvent('selection', { detail: { selection: this.#selection }, bubbles: true, composed: true }));
235
+ };
236
+ #handleClick(evt) {
237
+ console.debug(`${_a.name} ⚡️ ${evt?.type}`);
238
+ const target = evt.target, btn = target?.closest('button');
239
+ if (!btn)
240
+ return;
241
+ if (btn.hasAttribute('tag')) {
242
+ this.#selection = btn.getAttribute('tag') ?? ''; //return this.dispatchEvent(new CustomEvent('selection', { detail: { tag: btn.getAttribute('tag') }, bubbles: true, composed: true }))
243
+ }
244
+ else {
245
+ this.#selection = btn.textContent; //this.dispatchEvent(new CustomEvent('selection', { detail: { tag: btn.textContent }, bubbles: true, composed: true }))
246
+ }
247
+ this.#sendValueToForm();
248
+ }
249
+ #handleSlotchange = (evt) => {
250
+ console.debug(`${_a.name} ⚡️ ${evt?.type}`);
251
+ const slot = evt.target, assigned = slot.assignedElements({ flatten: true });
252
+ observers.syncObservations(this.#trackedElements, assigned, this.#handleTagMutation);
253
+ // for (const el of this.#trackedElements)
254
+ // if (!assigned.includes(el)) {
255
+ // observers.unobserve(el)
256
+ // this.#trackedElements.delete(el)
257
+ // }
258
+ // for (const el of assigned) {
259
+ // if (!this.#trackedElements.has(el))
260
+ // observers.observe(el, this.#handleTagMutation, {
261
+ // attributes: true,
262
+ // characterData: true,
263
+ // subtree: true,
264
+ // childList: true,
265
+ // // attributeFilter: ['value', 'label'],
266
+ // })
267
+ // this.#trackedElements.add(el)
268
+ // }
269
+ if (0 < assigned.length)
270
+ this.#handleTagMutation();
271
+ };
272
+ static wrapTag(node, slotName) {
273
+ const btn = $(`<button type="button" tabindex="0"></button>`); //document.createElement('button')
274
+ // btn.type = 'button'
275
+ // btn.tabIndex = 0
276
+ switch (slotName) {
277
+ case 'tag':
278
+ if (node.hasAttribute('tag'))
279
+ btn.setAttribute('tag', node.getAttribute('tag') ?? '');
280
+ btn.appendChild(node.cloneNode(true));
281
+ break;
282
+ case 'options':
283
+ default:
284
+ if (node.hasAttribute('value'))
285
+ btn.setAttribute('tag', node.getAttribute('value') ?? '');
286
+ const label = $(`<label-view></label-view>`); //document.createElement('label-view')
287
+ if (node.hasAttribute('label'))
288
+ label.setAttribute('title', node.getAttribute('label') ?? '');
289
+ btn.appendChild(label);
290
+ break;
291
+ }
292
+ return btn;
293
+ }
294
+ #handleTagMutation = (entry) => {
295
+ console.debug(`${_a.name} ⚡️ mutation`);
296
+ const sourceSlot = 0 < (this.#datalistSlot?.assignedElements({ flatten: true }) ?? []).length ? this.#datalistSlot : this.#tagSlot;
297
+ // switch (this.getAttribute((this.constructor as typeof PickerView).ATTR.PICKER_STYLE)) {
298
+ switch (this.pickerStyle) {
299
+ case 'menu':
300
+ const menu = this.querySelector(':scope>menu-view:not([slot])') ?? this.appendChild($(`<menu-view tabindex="0"></menu-view>`));
301
+ menu.innerHTML = `<label-view slot="label" system-image="dots-three" title="rtyty"></label-view>`;
302
+ for (const el of sourceSlot?.assignedElements({ flatten: true }) ?? [])
303
+ menu.insertAdjacentElement('beforeend', _a.wrapTag(el, sourceSlot?.name));
304
+ // let possibleMv = this.#slot?.assignedElements({ flatten: true })[0]
305
+ // if ('MENU-VIEW' !== possibleMv?.tagName) possibleMv = this.appendChild(document.createElement('menu-view'))
306
+ // possibleMv.innerHTML = `<label-view slot="label" system-image="dots-three" title="rtyty"></label-view>`
307
+ // for (const el of PickerView.sourceNodes(sourceSlot) ?? []) possibleMv.insertAdjacentElement('beforeend', PickerView.wrapTag(el, sourceSlot?.name))
308
+ break;
309
+ case 'inline':
310
+ default:
311
+ const inlineList = this.querySelector(':scope>list-view:not([slot])') ?? this.appendChild($(`<list-view><section-view></section-view></list-view>`)), section = inlineList.querySelector(':scope>section-view') ?? inlineList.appendChild($(`<section-view></section-view>`));
312
+ const label = this.getAttribute(this.constructor.ATTR.LABEL);
313
+ // if (label) section.setAttribute('header', label)
314
+ if (label) {
315
+ const el = $(`<label-view></label-view>`);
316
+ el.setAttribute('title', label);
317
+ section.insertAdjacentElement('beforeend', el);
318
+ }
319
+ else
320
+ section.innerHTML = '';
321
+ for (const el of sourceSlot?.assignedElements({ flatten: true }) ?? [])
322
+ section.insertAdjacentElement('beforeend', _a.wrapTag(el, sourceSlot?.name));
323
+ // let possibleLv = this.#slot?.assignedElements({ flatten: true })[0]
324
+ // if ('LIST-VIEW' !== possibleLv?.tagName) possibleLv = this.appendChild(document.createElement('list-view'))
325
+ // const sv = document.createElement('section-view')
326
+ // sv.setAttribute('header', 'section-header')
327
+ // possibleLv.appendChild(sv)
328
+ // for (const el of PickerView.sourceNodes(sourceSlot) ?? []) sv.insertAdjacentElement('beforeend', PickerView.wrapTag(el, sourceSlot?.name))
329
+ // for (const el of this.querySelectorAll(':scope>:not([slot])')) el.remove()
330
+ // for (const el of PickerView.sourceNodes(sourceSlot) ?? []) {
331
+ // const btn = document.createElement('button')
332
+ // btn.type = 'button'
333
+ // btn.tabIndex = 0
334
+ // btn.appendChild(PickerView.wrapTag(el, sourceSlot?.name))
335
+ // this.insertAdjacentElement('beforeend', btn)
336
+ // }
337
+ break;
338
+ }
339
+ };
340
+ #reflectPlaceholder(value) {
341
+ const input = this.#shadowRoot.querySelector('input');
342
+ if (input) {
343
+ if (value)
344
+ input.setAttribute('placeholder', value);
345
+ else
346
+ input.removeAttribute('placeholder');
347
+ }
348
+ }
349
+ #reflectLabel(value) {
350
+ // switch (this.getAttribute('picker-style')) {
351
+ // case 'menu':
352
+ // this.#slot!.assignedElements({ flatten: true })[0].setAttribute('label', value ?? '')
353
+ // // if (!mv) {
354
+ // // mv = document.createElement('label-view')
355
+ // // mv.slot = 'label'
356
+ // // this.append(mv)
357
+ // // }
358
+ // // mv.textContent = newValue //el2.replaceChildren(escapeHTMLPolicy.createHTML(newValue))
359
+ // break
360
+ // default:
361
+ let label = this.querySelector(':scope>[slot=label]');
362
+ if (value) {
363
+ label ??= this.appendChild($(`<span slot="label"></span>`));
364
+ label.textContent = value;
365
+ }
366
+ else
367
+ label?.remove();
368
+ this.#handleTagMutation();
369
+ // const el =
370
+ // (this.#labelSlot?.assignedElements({ flatten: true })[0] as HTMLElement) ??
371
+ // (() => {
372
+ // const el = document.createElement('span')
373
+ // el.slot = 'label'
374
+ // return this.appendChild(el)
375
+ // })()
376
+ // el.textContent = value ?? '' // el.replaceChildren(escapeHTMLPolicy.createHTML(newValue))
377
+ // break
378
+ // }
379
+ // const assigned = this.#labelSlot?.assignedElements({ flatten: true }) as HTMLElement[] | undefined
380
+ // let el = assigned?.[0]
381
+ // if (!el) {
382
+ // el = document.createElement('span')
383
+ // el.slot = 'label'
384
+ // this.append(el)
385
+ // }
386
+ // el.textContent = value ?? ''
387
+ }
388
+ // Optional: form participation properties
389
+ get name() {
390
+ return this.getAttribute('name') ?? this.getAttribute('label') ?? this.querySelector(':scope>[slot=label]')?.textContent ?? '';
391
+ }
392
+ setValidity = (flags, message, anchor) => {
393
+ // let msg
394
+ // if (message)
395
+ for (const k in flags) {
396
+ const key = k; // ✅ type-safe cast
397
+ if (true !== flags[key])
398
+ continue;
399
+ for (const el of this.#validitiesSlot?.assignedElements({ flatten: true }) ?? []) {
400
+ if (!el.matches('option'))
401
+ continue;
402
+ const option = el;
403
+ if (`${kebabCase(key)}` === option.value) {
404
+ message = option.label;
405
+ break;
406
+ }
407
+ else if (`${kebabCase(key)}:${message}` === option.value) {
408
+ message = option.label;
409
+ break;
410
+ }
411
+ }
412
+ }
413
+ if (!message)
414
+ for (const k in flags) {
415
+ const key = k; // ✅ type-safe cast
416
+ if (true !== flags[key])
417
+ continue;
418
+ message = kebabCase(key);
419
+ break;
420
+ }
421
+ console.debug(`${_a.name} ⚡️ validity-change`);
422
+ return this.#internals.setValidity(flags, this.#customValidity || message, anchor);
423
+ };
424
+ setCustomValidity = (message) => {
425
+ this.#customValidity = message;
426
+ if (this.#customValidity)
427
+ this.#internals.setValidity({ ...this.#internals.validity, customError: true }, message);
428
+ else
429
+ this.#sendValueToForm(false);
430
+ };
431
+ formAssociatedCallback = (form) => {
432
+ this.#sendValueToForm();
433
+ };
434
+ formDisabledCallback = (disabled) => {
435
+ for (const btn of this.#shadowRoot.querySelectorAll('button'))
436
+ btn.toggleAttribute('disabled', !disabled);
437
+ };
438
+ formResetCallback = () => {
439
+ this.#selection = '';
440
+ };
441
+ }
442
+ _a = PickerView;
@@ -0,0 +1,7 @@
1
+ import { ButtonBase } from '../namespace-browser/base';
2
+ export declare class PlainButton extends ButtonBase {
3
+ #private;
4
+ constructor();
5
+ static polyfillDisconnectedCallback(el: PlainButton): void;
6
+ static polyfillConnectedCallback(el: PlainButton): void;
7
+ }
@@ -0,0 +1,20 @@
1
+ import { CleanupRegistry } from '../internal/class/cleanup-registry';
2
+ import { onoff } from '../internal/utils';
3
+ import { ButtonBase } from '../namespace-browser/base';
4
+ export class PlainButton extends ButtonBase {
5
+ constructor() {
6
+ super();
7
+ }
8
+ static polyfillDisconnectedCallback(el) {
9
+ console.debug(`${PlainButton.name} ⚡️ disconnect`);
10
+ CleanupRegistry.unregister(el);
11
+ }
12
+ static polyfillConnectedCallback(el) {
13
+ console.debug(`${PlainButton.name} ⚡️ connect`);
14
+ el.tabIndex = 0;
15
+ CleanupRegistry.register(el, onoff('click', PlainButton.#handleClick, el).on());
16
+ }
17
+ static #handleClick = async (evt) => {
18
+ // alert(99)
19
+ };
20
+ }
@@ -1,4 +1,4 @@
1
- import { DialogBase } from '../internal/class';
1
+ import { DialogBase } from '../namespace-browser/base';
2
2
  export declare class ScreenView extends DialogBase {
3
3
  constructor();
4
4
  disconnectedCallback(): void;
@@ -1,4 +1,4 @@
1
- import { DialogBase } from '../internal/class';
1
+ import { DialogBase } from '../namespace-browser/base';
2
2
  export class ScreenView extends DialogBase {
3
3
  constructor() {
4
4
  super();
@@ -1,8 +1,10 @@
1
1
  export declare class ScrollView extends HTMLElement {
2
2
  #private;
3
- static get template(): HTMLTemplateElement;
3
+ static get observedAttributes(): string[];
4
+ static get template(): DocumentFragment;
4
5
  constructor();
5
6
  disconnectedCallback(): void;
6
7
  connectedCallback(): void;
7
- scrollToElement(el: Element): void;
8
+ attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null): void;
9
+ centerScrollToElement(child: Element): void;
8
10
  }