@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,452 @@
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
+ #slots = new Map();
24
+ #customValidity = '';
25
+ // #validitiesSlot?: HTMLSlotElement
26
+ // #datalistSlot?: HTMLSlotElement
27
+ // #tagSlot?: HTMLSlotElement
28
+ #trackedElements = new Set();
29
+ #selection = '';
30
+ get #internals() {
31
+ return getInternals(this);
32
+ }
33
+ get template() {
34
+ // const style = this.getAttribute((this.constructor as typeof PickerView).ATTR.PICKER_STYLE) ?? ''
35
+ if (!_a.#templates.has(this.pickerStyle))
36
+ switch (this.pickerStyle) {
37
+ // case 'inline':
38
+ // template.innerHTML = `
39
+ // <list-view frame-width="infinity" part="root inline-form">
40
+ // <slot></slot>
41
+ // </list-view>
42
+ // `
43
+ // break
44
+ case 'menu':
45
+ // template.innerHTML = `<slot name="options"></slot><slot></slot>`
46
+ _a.#templates.set(this.pickerStyle, $(String.raw `
47
+ <label part="root picker-stack">
48
+ <div part="root picker-label-stack">
49
+ <slot name="label"></slot>
50
+ </div>
51
+ <div part="root picker-input-stack">
52
+ <slot></slot>
53
+ </div>
54
+ <slot name="options" hidden></slot>
55
+ <slot name="tag" hidden></slot>
56
+ <slot name="validity-options" hidden></slot>
57
+ </label>
58
+ `));
59
+ // break
60
+ // case 'compact':
61
+ // PickerView.#templates.set(
62
+ // style,
63
+ // Object.assign(document.createElement('template'), {
64
+ // innerHTML: String.raw`
65
+ // <label part="compact-picker">
66
+ // <input type="text" part="compact-input">
67
+ // </label>
68
+ // `,
69
+ // })
70
+ // )
71
+ // break
72
+ // case 'fancy':
73
+ // PickerView.#templates.set(
74
+ // style,
75
+ // Object.assign(document.createElement('template'), {
76
+ // innerHTML: String.raw`
77
+ // <div part="fancy-picker">
78
+ // <span>Fancy Picker</span>
79
+ // <input type="text" part="fancy-input">
80
+ // </div>
81
+ // `,
82
+ // })
83
+ // )
84
+ break;
85
+ // case 'gg':
86
+ // PickerView.#templates.set(
87
+ // style,
88
+ // Object.assign(document.createElement('template'), {
89
+ // innerHTML: String.raw`
90
+ // <label part="root text-field-stack">
91
+ // <div part="root text-field-label-stack">
92
+ // <slot name="label"></slot>
93
+ // </div>
94
+ // <div part="root text-field-input-stack">
95
+ // <input type="text" part="root input text-field-form-input" list="tickmarks">
96
+ // <datalist id="tickmarks">
97
+ // <option value="0" label="0%"></option>
98
+ // </datalist>
99
+ // </div>
100
+ // <slot name="options" hidden></slot>
101
+ // </label>`,
102
+ // })
103
+ // )
104
+ // break
105
+ case 'inline':
106
+ default:
107
+ _a.#templates.set(this.pickerStyle, $(String.raw `
108
+ <label part="root picker-stack">
109
+ <div part="root picker-label-stack">
110
+ <slot name="label"></slot>
111
+ </div>
112
+ <div part="root picker-input-stack">
113
+ <slot></slot>
114
+ </div>
115
+ <slot name="options" hidden></slot>
116
+ <slot name="tag" hidden></slot>
117
+ <slot name="validity-options" hidden></slot>
118
+ </label>`));
119
+ break;
120
+ }
121
+ return _a.#templates.get(this.pickerStyle);
122
+ }
123
+ constructor() {
124
+ super();
125
+ this.#shadowRoot = this.attachShadow({ mode: 'closed' });
126
+ // this.#render() // Snapshot.waitReady.then(this.#render.bind(this))
127
+ }
128
+ connectedCallback() {
129
+ console.debug(`${_a.name} ⚡️ connect`);
130
+ CleanupRegistry.register(this, onoff('click', this.#handleClick, this).on());
131
+ if (!this.hasAttribute(this.constructor.ATTR.PICKER_STYLE))
132
+ this.#render(); // will be picked up by attr-change!
133
+ // finally
134
+ if (!this.hasAttribute('selection'))
135
+ return;
136
+ this.#selection = this.getAttribute('selection') ?? '';
137
+ this.#sendValueToForm(false);
138
+ }
139
+ disconnectedCallback() {
140
+ console.debug(`${_a.name} ⚡️ disconnect`);
141
+ CleanupRegistry.unregister(this);
142
+ observers.clearObservationsSet(this.#trackedElements);
143
+ }
144
+ attributeChangedCallback(name, oldValue, newValue) {
145
+ console.debug(`${_a.name} ⚡️ attr-change [${name}] ("${oldValue}" → "${newValue}")`);
146
+ switch (name) {
147
+ case this.constructor.ATTR.PLACEHOLDER:
148
+ this.#reflectPlaceholder(newValue);
149
+ break;
150
+ case this.constructor.ATTR.LABEL:
151
+ this.#reflectLabel(newValue);
152
+ this.#sendValueToForm();
153
+ break;
154
+ case this.constructor.ATTR.PICKER_STYLE:
155
+ if (oldValue === newValue)
156
+ break;
157
+ this.#render();
158
+ // this.#sendValueToForm()
159
+ break;
160
+ case this.constructor.ATTR.SELECTION:
161
+ // nothing happens
162
+ break;
163
+ }
164
+ }
165
+ get pickerStyle() {
166
+ return pickerStyles.includes(this.getAttribute(this.constructor.ATTR.PICKER_STYLE) ?? '')
167
+ ? this.getAttribute(this.constructor.ATTR.PICKER_STYLE)
168
+ : 'automatic';
169
+ }
170
+ #render() {
171
+ console.debug(`${_a.name} ⚡️ render (${this.pickerStyle})`);
172
+ if (!this.isConnected)
173
+ return;
174
+ // const style = this.getAttribute((this.constructor as typeof PickerView).ATTR.PICKER_STYLE)
175
+ if (this.#lastRenderedStyle === this.pickerStyle)
176
+ return; // skip if already applied
177
+ this.#lastRenderedStyle = this.pickerStyle;
178
+ // clear shadow DOM
179
+ this.#shadowRoot.replaceChildren(document.importNode(this.template, true));
180
+ CleanupRegistry.unregister(this, 'slots');
181
+ for (const slot of this.#shadowRoot.querySelectorAll('slot'))
182
+ this.#slots?.set(slot.name, slot);
183
+ CleanupRegistry.register(this, () => {
184
+ this.#slots = new Map();
185
+ }, 'slots');
186
+ CleanupRegistry.unregister(this, 'validities');
187
+ CleanupRegistry.register(this, onoff(makeSlotchangeHandler(this), this.#slots?.get('validity-options')).on(), 'validities');
188
+ CleanupRegistry.unregister(this, 'datalist'); //off1()
189
+ CleanupRegistry.register(this, onoff('slotchange', this.#handleSlotchange, this.#slots?.get('options')).on(), 'datalist');
190
+ CleanupRegistry.unregister(this, 'tags'); //off2()
191
+ CleanupRegistry.register(this, onoff('slotchange', this.#handleSlotchange, this.#slots?.get('tag')).on(), 'tags');
192
+ // if (0 < (this.#slots?.get('options')?.assignedElements({ flatten: true }) ?? []).length) this.#handleTagMutation()
193
+ // if (0 < (this.#slots?.get('tag')?.assignedElements({ flatten: true }) ?? []).length) this.#handleTagMutation()
194
+ //this.getAttribute((this.constructor as typeof PickerView).ATTR.PICKER_STYLE)) {
195
+ switch (this.pickerStyle
196
+ // case 'menu':
197
+ // // if (0 < (this.#slots?.get('options')?.assignedElements({ flatten: true }) ?? []).length) this.#handleMenuDatalistMutation()
198
+ // break
199
+ // case 'gg':
200
+ // // reattach input listener
201
+ // const input = this.#shadowRoot.querySelector('input')
202
+ // if (input) {
203
+ // input.addEventListener('input', () => {
204
+ // this.#internals!.setFormValue(input.value)
205
+ // })
206
+ // // restore placeholder if set
207
+ // const placeholder = this.getAttribute((this.constructor as typeof PickerView).ATTR.PLACEHOLDER)
208
+ // if (placeholder) input.setAttribute('placeholder', placeholder)
209
+ // }
210
+ // // restore label if set
211
+ // const label = this.getAttribute((this.constructor as typeof PickerView).ATTR.LABEL)
212
+ // if (label) this.#reflectLabel(label)
213
+ // break
214
+ // case 'inline':
215
+ // default:
216
+ // // if (0 < (this.#slots?.get('options')?.assignedElements({ flatten: true }) ?? []).length) this.#handleInlineDatalistMutation()
217
+ // break
218
+ ) {
219
+ }
220
+ }
221
+ #sendValueToForm = (dispatchEvent = true) => {
222
+ // input.value has already been updated/synced !!
223
+ if (this.matches(':disabled'))
224
+ return this.setValidity({});
225
+ if (this.hasAttribute('required')) {
226
+ if (!this.#selection) {
227
+ this.setValidity({ badInput: true }, 'invalid-selection');
228
+ }
229
+ else
230
+ this.setValidity({});
231
+ }
232
+ else
233
+ this.setValidity({});
234
+ const entries = new FormData();
235
+ entries.append(this.name, this.#selection);
236
+ this.#internals.setFormValue(entries);
237
+ if (dispatchEvent)
238
+ this.dispatchEvent(new CustomEvent('selection', { detail: { selection: this.#selection }, bubbles: true, composed: true }));
239
+ };
240
+ #handleClick(evt) {
241
+ console.debug(`${_a.name} ⚡️ ${evt?.type}`);
242
+ const target = evt.target instanceof HTMLElement && evt.target;
243
+ if (!target)
244
+ return;
245
+ const btn = target?.closest('button');
246
+ if (!btn)
247
+ return;
248
+ if (btn.hasAttribute('tag')) {
249
+ this.#selection = btn.getAttribute('tag') ?? ''; //return this.dispatchEvent(new CustomEvent('selection', { detail: { tag: btn.getAttribute('tag') }, bubbles: true, composed: true }))
250
+ }
251
+ else {
252
+ this.#selection = btn.textContent; //this.dispatchEvent(new CustomEvent('selection', { detail: { tag: btn.textContent }, bubbles: true, composed: true }))
253
+ }
254
+ this.#sendValueToForm();
255
+ }
256
+ #handleSlotchange = (evt) => {
257
+ console.debug(`${_a.name} ⚡️ ${evt?.type}`);
258
+ const slot = evt.target instanceof HTMLSlotElement && evt.target;
259
+ if (!slot)
260
+ return;
261
+ const assigned = slot.assignedElements({ flatten: true });
262
+ observers.syncObservations(this.#trackedElements, assigned, this.#handleTagMutation);
263
+ // for (const el of this.#trackedElements)
264
+ // if (!assigned.includes(el)) {
265
+ // observers.unobserve(el)
266
+ // this.#trackedElements.delete(el)
267
+ // }
268
+ // for (const el of assigned) {
269
+ // if (!this.#trackedElements.has(el))
270
+ // observers.observe(el, this.#handleTagMutation, {
271
+ // attributes: true,
272
+ // characterData: true,
273
+ // subtree: true,
274
+ // childList: true,
275
+ // // attributeFilter: ['value', 'label'],
276
+ // })
277
+ // this.#trackedElements.add(el)
278
+ // }
279
+ if (0 < assigned.length)
280
+ this.#handleTagMutation();
281
+ };
282
+ static wrapTag(node, slotName) {
283
+ const btn = $(`<button type="button" tabindex="0"></button>`, '>1'); //document.createElement('button')
284
+ // btn.type = 'button'
285
+ // btn.tabIndex = 0
286
+ switch (slotName) {
287
+ case 'tag':
288
+ if (node.hasAttribute('tag'))
289
+ btn.setAttribute('tag', node.getAttribute('tag') ?? '');
290
+ btn.appendChild(node.cloneNode(true));
291
+ break;
292
+ case 'options':
293
+ default:
294
+ if (node.hasAttribute('value'))
295
+ btn.setAttribute('tag', node.getAttribute('value') ?? '');
296
+ const label = $(`<label-view></label-view>`, '>1'); //document.createElement('label-view')
297
+ if (node.hasAttribute('label'))
298
+ label.setAttribute('title', node.getAttribute('label') ?? '');
299
+ btn.appendChild(label);
300
+ break;
301
+ }
302
+ return btn;
303
+ }
304
+ #handleTagMutation = (entry) => {
305
+ console.debug(`${_a.name} ⚡️ mutation`);
306
+ const sourceSlot = 0 < (this.#slots?.get('options')?.assignedElements({ flatten: true }) ?? []).length ? this.#slots?.get('options') : this.#slots?.get('tag');
307
+ // switch (this.getAttribute((this.constructor as typeof PickerView).ATTR.PICKER_STYLE)) {
308
+ switch (this.pickerStyle) {
309
+ case 'menu':
310
+ const menu = this.querySelector(':scope>menu-view:not([slot])') ?? this.appendChild($(`<menu-view tabindex="0"></menu-view>`, '>1'));
311
+ menu.innerHTML = `<label-view slot="label" system-image="dots-three" title="rtyty"></label-view>`;
312
+ for (const el of sourceSlot?.assignedElements({ flatten: true }) ?? [])
313
+ menu.insertAdjacentElement('beforeend', _a.wrapTag(el, sourceSlot?.name));
314
+ // let possibleMv = this.#slot?.assignedElements({ flatten: true })[0]
315
+ // if ('MENU-VIEW' !== possibleMv?.tagName) possibleMv = this.appendChild(document.createElement('menu-view'))
316
+ // possibleMv.innerHTML = `<label-view slot="label" system-image="dots-three" title="rtyty"></label-view>`
317
+ // for (const el of PickerView.sourceNodes(sourceSlot) ?? []) possibleMv.insertAdjacentElement('beforeend', PickerView.wrapTag(el, sourceSlot?.name))
318
+ break;
319
+ case 'inline':
320
+ default:
321
+ const inlineList = this.querySelector(':scope>list-view:not([slot])') ?? this.appendChild($(`<list-view><section-view></section-view></list-view>`, '>1')), section = inlineList.querySelector(':scope>section-view') ?? inlineList.appendChild($(`<section-view></section-view>`, '>1'));
322
+ const label = this.getAttribute(this.constructor.ATTR.LABEL);
323
+ // if (label) section.setAttribute('header', label)
324
+ if (label) {
325
+ const el = $(`<label-view></label-view>`, '>1');
326
+ el.setAttribute('title', label);
327
+ section.insertAdjacentElement('beforeend', el);
328
+ }
329
+ else
330
+ section.innerHTML = '';
331
+ for (const el of sourceSlot?.assignedElements({ flatten: true }) ?? [])
332
+ section.insertAdjacentElement('beforeend', _a.wrapTag(el, sourceSlot?.name));
333
+ // let possibleLv = this.#slot?.assignedElements({ flatten: true })[0]
334
+ // if ('LIST-VIEW' !== possibleLv?.tagName) possibleLv = this.appendChild(document.createElement('list-view'))
335
+ // const sv = document.createElement('section-view')
336
+ // sv.setAttribute('header', 'section-header')
337
+ // possibleLv.appendChild(sv)
338
+ // for (const el of PickerView.sourceNodes(sourceSlot) ?? []) sv.insertAdjacentElement('beforeend', PickerView.wrapTag(el, sourceSlot?.name))
339
+ // for (const el of this.querySelectorAll(':scope>:not([slot])')) el.remove()
340
+ // for (const el of PickerView.sourceNodes(sourceSlot) ?? []) {
341
+ // const btn = document.createElement('button')
342
+ // btn.type = 'button'
343
+ // btn.tabIndex = 0
344
+ // btn.appendChild(PickerView.wrapTag(el, sourceSlot?.name))
345
+ // this.insertAdjacentElement('beforeend', btn)
346
+ // }
347
+ break;
348
+ }
349
+ };
350
+ #reflectPlaceholder(value) {
351
+ const input = this.#shadowRoot.querySelector('input');
352
+ if (input) {
353
+ if (value)
354
+ input.setAttribute('placeholder', value);
355
+ else
356
+ input.removeAttribute('placeholder');
357
+ }
358
+ }
359
+ #reflectLabel(value) {
360
+ // switch (this.getAttribute('picker-style')) {
361
+ // case 'menu':
362
+ // this.#slot!.assignedElements({ flatten: true })[0].setAttribute('label', value ?? '')
363
+ // // if (!mv) {
364
+ // // mv = document.createElement('label-view')
365
+ // // mv.slot = 'label'
366
+ // // this.append(mv)
367
+ // // }
368
+ // // mv.textContent = newValue //el2.replaceChildren(escapeHTMLPolicy.createHTML(newValue))
369
+ // break
370
+ // default:
371
+ let label = this.querySelector(':scope>[slot=label]');
372
+ if (value) {
373
+ label ??= this.appendChild($(`<span slot="label"></span>`, '>1'));
374
+ label.textContent = value;
375
+ }
376
+ else
377
+ label?.remove();
378
+ this.#handleTagMutation();
379
+ // const el =
380
+ // (this.#labelSlot?.assignedElements({ flatten: true })[0] as HTMLElement) ??
381
+ // (() => {
382
+ // const el = document.createElement('span')
383
+ // el.slot = 'label'
384
+ // return this.appendChild(el)
385
+ // })()
386
+ // el.textContent = value ?? '' // el.replaceChildren(escapeHTMLPolicy.createHTML(newValue))
387
+ // break
388
+ // }
389
+ // const assigned = this.#labelSlot?.assignedElements({ flatten: true }) as HTMLElement[] | undefined
390
+ // let el = assigned?.[0]
391
+ // if (!el) {
392
+ // el = document.createElement('span')
393
+ // el.slot = 'label'
394
+ // this.append(el)
395
+ // }
396
+ // el.textContent = value ?? ''
397
+ }
398
+ // Optional: form participation properties
399
+ get name() {
400
+ return this.getAttribute('name') ?? this.getAttribute('label') ?? this.querySelector(':scope>[slot=label]')?.textContent ?? '';
401
+ }
402
+ setValidity = (flags, message, anchor) => {
403
+ // let msg
404
+ // if (message)
405
+ for (const k in flags) {
406
+ const key = k; // ✅ type-safe cast
407
+ if (true !== flags[key])
408
+ continue;
409
+ for (const el of this.#slots?.get('validity-options')?.assignedElements({ flatten: true }) ?? []) {
410
+ if (!el.matches('option'))
411
+ continue;
412
+ const option = el;
413
+ if (`${kebabCase(key)}` === option.value) {
414
+ message = option.label;
415
+ break;
416
+ }
417
+ else if (`${kebabCase(key)}:${message}` === option.value) {
418
+ message = option.label;
419
+ break;
420
+ }
421
+ }
422
+ }
423
+ if (!message)
424
+ for (const k in flags) {
425
+ const key = k; // ✅ type-safe cast
426
+ if (true !== flags[key])
427
+ continue;
428
+ message = kebabCase(key);
429
+ break;
430
+ }
431
+ console.debug(`${_a.name} ⚡️ validity-change`);
432
+ return this.#internals.setValidity(flags, this.#customValidity || message, anchor);
433
+ };
434
+ setCustomValidity = (message) => {
435
+ this.#customValidity = message;
436
+ if (this.#customValidity)
437
+ this.#internals.setValidity({ ...this.#internals.validity, customError: true }, message);
438
+ else
439
+ this.#sendValueToForm(false);
440
+ };
441
+ formAssociatedCallback = (form) => {
442
+ this.#sendValueToForm();
443
+ };
444
+ formDisabledCallback = (disabled) => {
445
+ for (const btn of this.#shadowRoot.querySelectorAll('button'))
446
+ btn.toggleAttribute('disabled', !disabled);
447
+ };
448
+ formResetCallback = () => {
449
+ this.#selection = '';
450
+ };
451
+ }
452
+ _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
+ }
@@ -0,0 +1,13 @@
1
+ /**
2
+ *
3
+ */
4
+ export declare class ProgressView extends HTMLElement {
5
+ #private;
6
+ static get observedAttributes(): string[];
7
+ get progressViewStyle(): "circular" | "linear";
8
+ get template(): DocumentFragment;
9
+ constructor();
10
+ disconnectedCallback(): void;
11
+ connectedCallback(): void;
12
+ attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null): void;
13
+ }
@@ -0,0 +1,122 @@
1
+ var _a;
2
+ import { CleanupRegistry } from '../internal/class/cleanup-registry';
3
+ import { CSSStyleObserver } from '../internal/class/css-style-observer';
4
+ import { $ } from '../internal/utils';
5
+ import { Snapshot } from '../snapshot';
6
+ const progressViewStyles = ['circular', 'linear'];
7
+ /**
8
+ *
9
+ */
10
+ export class ProgressView extends HTMLElement {
11
+ static get observedAttributes() {
12
+ return ['label', 'current-value-label', 'value'];
13
+ }
14
+ static #templates = new Map();
15
+ #cssStyleObserver;
16
+ #progressViewStyle;
17
+ #lastRenderedStyle;
18
+ #shadowRoot;
19
+ #slots = new Map();
20
+ get progressViewStyle() {
21
+ return this.#progressViewStyle ?? 'circular';
22
+ }
23
+ get template() {
24
+ if (!_a.#templates.has(this.progressViewStyle))
25
+ switch (this.progressViewStyle) {
26
+ case 'linear':
27
+ _a.#templates.set(this.progressViewStyle, $(String.raw `
28
+ <slot></slot>
29
+ <div part="root progress-control progress-line-control"></div>
30
+ <slot name="current-value"></slot>
31
+ `));
32
+ break;
33
+ case 'circular':
34
+ default:
35
+ _a.#templates.set(this.progressViewStyle, $(String.raw `
36
+ <div part="root progress-control progress-circular-control">
37
+ <div part="root progress-control progress-circular-blade progress-circular-blade-1"></div>
38
+ <div part="root progress-control progress-circular-blade progress-circular-blade-2"></div>
39
+ <div part="root progress-control progress-circular-blade progress-circular-blade-3"></div>
40
+ <div part="root progress-control progress-circular-blade progress-circular-blade-4"></div>
41
+ <div part="root progress-control progress-circular-blade progress-circular-blade-5"></div>
42
+ <div part="root progress-control progress-circular-blade progress-circular-blade-6"></div>
43
+ <div part="root progress-control progress-circular-blade progress-circular-blade-7"></div>
44
+ <div part="root progress-control progress-circular-blade progress-circular-blade-8"></div>
45
+ </div>
46
+ <slot></slot>
47
+ <slot name="current-value"></slot>
48
+ `));
49
+ break;
50
+ }
51
+ return _a.#templates.get(this.progressViewStyle);
52
+ }
53
+ constructor() {
54
+ super();
55
+ this.#shadowRoot = this.attachShadow({ mode: 'closed' });
56
+ }
57
+ disconnectedCallback() {
58
+ console.debug(`${_a.name} ⚡️ disconnect`);
59
+ CleanupRegistry.unregister(this);
60
+ }
61
+ connectedCallback() {
62
+ console.debug(`${_a.name} ⚡️ connect`);
63
+ this.#cssStyleObserver = new CSSStyleObserver({
64
+ properties: ['--progress-view-style-index'],
65
+ });
66
+ this.#cssStyleObserver.observe(this, this.#handleStyleChange);
67
+ Snapshot.waitReady.then(() => self.requestAnimationFrame(this.#handleStyleChange));
68
+ }
69
+ attributeChangedCallback(name, oldValue, newValue) {
70
+ console.debug(`${_a.name} ⚡️ attr-change [${name}] ("${oldValue}" → "${newValue}")`);
71
+ switch (name) {
72
+ case 'label': {
73
+ const label = this.querySelector(':scope>label-view:not([slot])') ?? this.appendChild($(`<label-view foreground="secondary"></label-view>`, '>1'));
74
+ if (newValue) {
75
+ label.setAttribute('title', newValue);
76
+ }
77
+ else
78
+ label.removeAttribute('title');
79
+ break;
80
+ }
81
+ case 'current-value-label': {
82
+ let label = this.querySelector(':scope>[slot=current-value]');
83
+ if (newValue) {
84
+ label ??= this.appendChild($(`<label-view slot="current-value" font="callout" foreground="secondary"></label-view>`, '>1'));
85
+ label.setAttribute('title', newValue);
86
+ }
87
+ else
88
+ label?.remove();
89
+ break;
90
+ }
91
+ }
92
+ }
93
+ #handleStyleChange = () => {
94
+ console.debug(`${_a.name} ⚡️ style`);
95
+ const raw = self.getComputedStyle(this).getPropertyValue('--progress-view-style-index').trim();
96
+ const newValue = progressViewStyles[Number(raw)] ?? progressViewStyles[0];
97
+ if (newValue === this.#progressViewStyle)
98
+ return;
99
+ this.#progressViewStyle = newValue;
100
+ this.#render();
101
+ };
102
+ #render() {
103
+ console.debug(`${_a.name} ⚡️ render (${this.#progressViewStyle})`);
104
+ if (!this.isConnected)
105
+ return;
106
+ if (this.#lastRenderedStyle === this.#progressViewStyle)
107
+ return; // skip if already applied
108
+ this.#lastRenderedStyle = this.#progressViewStyle;
109
+ this.#shadowRoot.replaceChildren(document.importNode(this.template, true)); // clear shadow DOM
110
+ CleanupRegistry.unregister(this, 'slots');
111
+ for (const slot of this.#shadowRoot.querySelectorAll('slot'))
112
+ this.#slots?.set(slot.name, slot);
113
+ CleanupRegistry.register(this, () => {
114
+ this.#slots = new Map();
115
+ }, 'slots');
116
+ switch (this.#progressViewStyle
117
+ //
118
+ ) {
119
+ }
120
+ }
121
+ }
122
+ _a = ProgressView;
@@ -0,0 +1,5 @@
1
+ import { DialogBase } from '../namespace-browser/base';
2
+ export declare class ScreenView extends DialogBase {
3
+ constructor();
4
+ disconnectedCallback(): void;
5
+ }
@@ -0,0 +1,9 @@
1
+ import { DialogBase } from '../namespace-browser/base';
2
+ export class ScreenView extends DialogBase {
3
+ constructor() {
4
+ super();
5
+ }
6
+ disconnectedCallback() {
7
+ console.debug(`${ScreenView.name} ⚡️ disconnect`);
8
+ }
9
+ }
@@ -0,0 +1,8 @@
1
+ /**
2
+ * @summary A wrapper to {hv}-stacks
3
+ */
4
+ export declare class ScrollViewProxy extends HTMLElement {
5
+ constructor();
6
+ disconnectedCallback(): void;
7
+ connectedCallback(): void;
8
+ }
@@ -0,0 +1,14 @@
1
+ /**
2
+ * @summary A wrapper to {hv}-stacks
3
+ */
4
+ export class ScrollViewProxy extends HTMLElement {
5
+ constructor() {
6
+ super();
7
+ }
8
+ disconnectedCallback() {
9
+ console.debug(`${ScrollViewProxy.name} ⚡️ disconnect`);
10
+ }
11
+ connectedCallback() {
12
+ console.debug(`${ScrollViewProxy.name} ⚡️ connect`);
13
+ }
14
+ }
@@ -0,0 +1,10 @@
1
+ export declare class ScrollView extends HTMLElement {
2
+ #private;
3
+ static get observedAttributes(): string[];
4
+ static get template(): DocumentFragment;
5
+ constructor();
6
+ disconnectedCallback(): void;
7
+ connectedCallback(): void;
8
+ attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null): void;
9
+ centerScrollToElement(child: Element): void;
10
+ }