@ui5/webcomponents-base 0.0.0-b132dd7b9 → 0.0.0-b3a4f8020

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 (349) hide show
  1. package/AGENTS.md +195 -0
  2. package/CHANGELOG.md +563 -0
  3. package/CLAUDE.md +1 -0
  4. package/LICENSE.txt +201 -0
  5. package/README.md +7 -7
  6. package/dist/.tsbuildinfobuild +1 -1
  7. package/dist/Assets-fetch.d.ts +1 -0
  8. package/dist/Assets-fetch.js +3 -0
  9. package/dist/Assets-fetch.js.map +1 -0
  10. package/dist/Assets-node.d.ts +12 -0
  11. package/dist/Assets-node.js +14 -0
  12. package/dist/Assets-node.js.map +1 -0
  13. package/dist/Assets.d.ts +1 -0
  14. package/dist/Assets.js +3 -0
  15. package/dist/Assets.js.map +1 -0
  16. package/dist/Boot.d.ts +2 -1
  17. package/dist/Boot.js +44 -14
  18. package/dist/Boot.js.map +1 -1
  19. package/dist/CustomElementsRegistry.js +1 -1
  20. package/dist/CustomElementsRegistry.js.map +1 -1
  21. package/dist/CustomElementsScopeUtils.d.ts +10 -3
  22. package/dist/CustomElementsScopeUtils.js +13 -3
  23. package/dist/CustomElementsScopeUtils.js.map +1 -1
  24. package/dist/DragAndDrop.d.ts +2 -0
  25. package/dist/DragAndDrop.js +5 -0
  26. package/dist/DragAndDrop.js.map +1 -0
  27. package/dist/FontFace.css +36 -0
  28. package/dist/FontFace.js +0 -8
  29. package/dist/FontFace.js.map +1 -1
  30. package/dist/InitialConfiguration.js +7 -0
  31. package/dist/InitialConfiguration.js.map +1 -1
  32. package/dist/Keys.d.ts +4 -1
  33. package/dist/Keys.js +4 -1
  34. package/dist/Keys.js.map +1 -1
  35. package/dist/ManagedStyles.js +1 -1
  36. package/dist/ManagedStyles.js.map +1 -1
  37. package/dist/ScrollbarStyles.d.ts +2 -0
  38. package/dist/ScrollbarStyles.js +9 -0
  39. package/dist/ScrollbarStyles.js.map +1 -0
  40. package/dist/SystemCSSVars.js +2 -4
  41. package/dist/SystemCSSVars.js.map +1 -1
  42. package/dist/UI5Element.d.ts +35 -9
  43. package/dist/UI5Element.js +59 -27
  44. package/dist/UI5Element.js.map +1 -1
  45. package/dist/UI5ElementMetadata.d.ts +1 -1
  46. package/dist/UI5ElementMetadata.js.map +1 -1
  47. package/dist/asset-registries/Icons.d.ts +42 -8
  48. package/dist/asset-registries/Icons.js +51 -8
  49. package/dist/asset-registries/Icons.js.map +1 -1
  50. package/dist/asset-registries/Illustrations.d.ts +133 -8
  51. package/dist/asset-registries/Illustrations.js +82 -1
  52. package/dist/asset-registries/Illustrations.js.map +1 -1
  53. package/dist/asset-registries/LocaleData.js +2 -1
  54. package/dist/asset-registries/LocaleData.js.map +1 -1
  55. package/dist/asset-registries/Themes.d.ts +5 -2
  56. package/dist/asset-registries/Themes.js +3 -3
  57. package/dist/asset-registries/Themes.js.map +1 -1
  58. package/dist/config/Language.d.ts +2 -1
  59. package/dist/config/Language.js +12 -1
  60. package/dist/config/Language.js.map +1 -1
  61. package/dist/config/Theme.d.ts +13 -1
  62. package/dist/config/Theme.js +18 -1
  63. package/dist/config/Theme.js.map +1 -1
  64. package/dist/config/ThemeRoot.d.ts +3 -1
  65. package/dist/config/ThemeRoot.js +3 -1
  66. package/dist/config/ThemeRoot.js.map +1 -1
  67. package/dist/css/MultipleDragGhost.css +17 -0
  68. package/dist/css/OpenUI5PopupStyles.css +10 -0
  69. package/dist/css/ScrollbarStyles.css +3 -0
  70. package/dist/css/SystemCSSVars.css +28 -3
  71. package/dist/custom-elements-internal.json +1855 -1738
  72. package/dist/custom-elements.json +1462 -1345
  73. package/dist/decorators/slot-strict.d.ts +27 -0
  74. package/dist/decorators/slot-strict.js +54 -0
  75. package/dist/decorators/slot-strict.js.map +1 -0
  76. package/dist/decorators/slot.d.ts +18 -0
  77. package/dist/decorators/slot.js +18 -0
  78. package/dist/decorators/slot.js.map +1 -1
  79. package/dist/decorators.d.ts +2 -1
  80. package/dist/decorators.js +2 -1
  81. package/dist/decorators.js.map +1 -1
  82. package/dist/features/F6Navigation.d.ts +1 -0
  83. package/dist/features/F6Navigation.js +23 -14
  84. package/dist/features/F6Navigation.js.map +1 -1
  85. package/dist/features/InputElementsFormSupport.d.ts +1 -1
  86. package/dist/features/InputElementsFormSupport.js +6 -2
  87. package/dist/features/InputElementsFormSupport.js.map +1 -1
  88. package/dist/features/OpenUI5Support.d.ts +15 -4
  89. package/dist/features/OpenUI5Support.js +83 -42
  90. package/dist/features/OpenUI5Support.js.map +1 -1
  91. package/dist/features/insertOpenUI5PopupStyles.d.ts +2 -0
  92. package/dist/features/insertOpenUI5PopupStyles.js +9 -0
  93. package/dist/features/insertOpenUI5PopupStyles.js.map +1 -0
  94. package/dist/features/patchPatcher.d.ts +7 -6
  95. package/dist/features/patchPatcher.js +14 -4
  96. package/dist/features/patchPatcher.js.map +1 -1
  97. package/dist/features/patchPopup.d.ts +26 -8
  98. package/dist/features/patchPopup.js +118 -25
  99. package/dist/features/patchPopup.js.map +1 -1
  100. package/dist/generated/VersionInfo.js +6 -6
  101. package/dist/generated/VersionInfo.js.map +1 -1
  102. package/dist/generated/assets/i18n/messagebundle_en.json +1 -0
  103. package/dist/generated/assets/i18n/messagebundle_en_US_sappsd.json +1 -0
  104. package/dist/generated/assets/i18n/messagebundle_en_US_saprigi.json +1 -0
  105. package/dist/generated/assets/i18n/messagebundle_en_US_saptrc.json +1 -0
  106. package/dist/generated/css/FontFace.css.d.ts +1 -1
  107. package/dist/generated/css/FontFace.css.js +36 -1
  108. package/dist/generated/css/FontFace.css.js.map +1 -1
  109. package/dist/generated/css/MultipleDragGhost.css.d.ts +2 -0
  110. package/dist/generated/css/MultipleDragGhost.css.js +2 -0
  111. package/dist/generated/css/MultipleDragGhost.css.js.map +1 -0
  112. package/dist/generated/css/OpenUI5PopupStyles.css.d.ts +2 -0
  113. package/dist/generated/css/OpenUI5PopupStyles.css.js +2 -0
  114. package/dist/generated/css/OpenUI5PopupStyles.css.js.map +1 -0
  115. package/dist/generated/css/ScrollbarStyles.css.d.ts +2 -0
  116. package/dist/generated/css/ScrollbarStyles.css.js +2 -0
  117. package/dist/generated/css/ScrollbarStyles.css.js.map +1 -0
  118. package/dist/generated/css/SystemCSSVars.css.d.ts +1 -1
  119. package/dist/generated/css/SystemCSSVars.css.js +1 -1
  120. package/dist/generated/css/SystemCSSVars.css.js.map +1 -1
  121. package/dist/generated/i18n/i18n-defaults.d.ts +3 -0
  122. package/dist/generated/i18n/i18n-defaults.js +3 -0
  123. package/dist/generated/i18n/i18n-defaults.js.map +1 -0
  124. package/dist/generated/json-imports/i18n-fetch.d.ts +1 -0
  125. package/dist/generated/json-imports/i18n-fetch.js +2 -0
  126. package/dist/generated/json-imports/i18n-fetch.js.map +1 -0
  127. package/dist/generated/json-imports/i18n-node.d.ts +1 -0
  128. package/dist/generated/json-imports/i18n-node.js +2 -0
  129. package/dist/generated/json-imports/i18n-node.js.map +1 -0
  130. package/dist/generated/json-imports/i18n.d.ts +1 -0
  131. package/dist/generated/json-imports/i18n.js +2 -0
  132. package/dist/generated/json-imports/i18n.js.map +1 -0
  133. package/dist/index.d.ts +3 -1
  134. package/dist/index.js +5 -1
  135. package/dist/index.js.map +1 -1
  136. package/dist/jsx-runtime.d.ts +1 -0
  137. package/dist/jsx-runtime.js.map +1 -1
  138. package/dist/prod/Assets-fetch.js +2 -0
  139. package/dist/prod/Assets-fetch.js.map +7 -0
  140. package/dist/prod/Assets-node.js +2 -0
  141. package/dist/prod/Assets-node.js.map +7 -0
  142. package/dist/prod/Assets.js +2 -0
  143. package/dist/prod/Assets.js.map +7 -0
  144. package/dist/prod/Boot.js +1 -1
  145. package/dist/prod/Boot.js.map +3 -3
  146. package/dist/prod/CustomElementsRegistry.js +5 -5
  147. package/dist/prod/CustomElementsRegistry.js.map +2 -2
  148. package/dist/prod/CustomElementsScopeUtils.js +1 -1
  149. package/dist/prod/CustomElementsScopeUtils.js.map +3 -3
  150. package/dist/prod/DragAndDrop.js +2 -0
  151. package/dist/prod/DragAndDrop.js.map +7 -0
  152. package/dist/prod/FontFace.js +1 -1
  153. package/dist/prod/FontFace.js.map +3 -3
  154. package/dist/prod/InitialConfiguration.js +1 -1
  155. package/dist/prod/InitialConfiguration.js.map +2 -2
  156. package/dist/prod/Keys.js +1 -1
  157. package/dist/prod/Keys.js.map +3 -3
  158. package/dist/prod/ManagedStyles.js +1 -1
  159. package/dist/prod/ManagedStyles.js.map +2 -2
  160. package/dist/prod/ScrollbarStyles.js +2 -0
  161. package/dist/prod/ScrollbarStyles.js.map +7 -0
  162. package/dist/prod/SystemCSSVars.js +1 -1
  163. package/dist/prod/SystemCSSVars.js.map +3 -3
  164. package/dist/prod/UI5Element.js +1 -1
  165. package/dist/prod/UI5Element.js.map +3 -3
  166. package/dist/prod/UI5ElementMetadata.js +1 -1
  167. package/dist/prod/UI5ElementMetadata.js.map +1 -1
  168. package/dist/prod/asset-registries/Icons.js +1 -1
  169. package/dist/prod/asset-registries/Icons.js.map +3 -3
  170. package/dist/prod/asset-registries/Illustrations.js +1 -1
  171. package/dist/prod/asset-registries/Illustrations.js.map +3 -3
  172. package/dist/prod/asset-registries/LocaleData.js +1 -1
  173. package/dist/prod/asset-registries/LocaleData.js.map +2 -2
  174. package/dist/prod/asset-registries/Themes.js +1 -1
  175. package/dist/prod/asset-registries/Themes.js.map +3 -3
  176. package/dist/prod/config/Language.js +1 -1
  177. package/dist/prod/config/Language.js.map +3 -3
  178. package/dist/prod/config/Theme.js +1 -1
  179. package/dist/prod/config/Theme.js.map +3 -3
  180. package/dist/prod/config/ThemeRoot.js.map +2 -2
  181. package/dist/prod/decorators/slot-strict.js +2 -0
  182. package/dist/prod/decorators/slot-strict.js.map +7 -0
  183. package/dist/prod/decorators/slot.js.map +2 -2
  184. package/dist/prod/decorators.js +1 -1
  185. package/dist/prod/decorators.js.map +3 -3
  186. package/dist/prod/features/F6Navigation.js +1 -1
  187. package/dist/prod/features/F6Navigation.js.map +3 -3
  188. package/dist/prod/features/InputElementsFormSupport.js +1 -1
  189. package/dist/prod/features/InputElementsFormSupport.js.map +3 -3
  190. package/dist/prod/features/OpenUI5Support.js +1 -1
  191. package/dist/prod/features/OpenUI5Support.js.map +3 -3
  192. package/dist/prod/features/insertOpenUI5PopupStyles.js +2 -0
  193. package/dist/prod/features/insertOpenUI5PopupStyles.js.map +7 -0
  194. package/dist/prod/features/patchPatcher.js +1 -1
  195. package/dist/prod/features/patchPatcher.js.map +3 -3
  196. package/dist/prod/features/patchPopup.js +1 -1
  197. package/dist/prod/features/patchPopup.js.map +3 -3
  198. package/dist/prod/generated/VersionInfo.js +1 -1
  199. package/dist/prod/generated/VersionInfo.js.map +2 -2
  200. package/dist/prod/generated/assets/i18n/messagebundle_en.json +1 -0
  201. package/dist/prod/generated/assets/i18n/messagebundle_en_US_sappsd.json +1 -0
  202. package/dist/prod/generated/assets/i18n/messagebundle_en_US_saprigi.json +1 -0
  203. package/dist/prod/generated/assets/i18n/messagebundle_en_US_saptrc.json +1 -0
  204. package/dist/prod/generated/css/FontFace.css.js +36 -1
  205. package/dist/prod/generated/css/FontFace.css.js.map +2 -2
  206. package/dist/prod/generated/css/MultipleDragGhost.css.js +2 -0
  207. package/dist/prod/generated/css/MultipleDragGhost.css.js.map +7 -0
  208. package/dist/prod/generated/css/OpenUI5PopupStyles.css.js +2 -0
  209. package/dist/prod/generated/css/OpenUI5PopupStyles.css.js.map +7 -0
  210. package/dist/prod/generated/css/ScrollbarStyles.css.js +2 -0
  211. package/dist/prod/generated/css/ScrollbarStyles.css.js.map +7 -0
  212. package/dist/prod/generated/css/SystemCSSVars.css.js +1 -1
  213. package/dist/prod/generated/css/SystemCSSVars.css.js.map +1 -1
  214. package/dist/prod/generated/i18n/i18n-defaults.js +2 -0
  215. package/dist/prod/generated/i18n/i18n-defaults.js.map +7 -0
  216. package/dist/prod/generated/json-imports/i18n-fetch.js +2 -0
  217. package/dist/prod/generated/json-imports/i18n-fetch.js.map +7 -0
  218. package/dist/prod/generated/json-imports/i18n-node.js +2 -0
  219. package/dist/prod/generated/json-imports/i18n-node.js.map +7 -0
  220. package/dist/prod/generated/json-imports/i18n.js +2 -0
  221. package/dist/prod/generated/json-imports/i18n.js.map +7 -0
  222. package/dist/prod/index.js +1 -1
  223. package/dist/prod/index.js.map +3 -3
  224. package/dist/prod/jsx-runtime.js.map +2 -2
  225. package/dist/prod/ssr-dom-shim.js +1 -1
  226. package/dist/prod/ssr-dom-shim.js.map +2 -2
  227. package/dist/prod/theming/applyTheme.js +1 -1
  228. package/dist/prod/theming/applyTheme.js.map +3 -3
  229. package/dist/prod/theming/componentStyles.js +3 -0
  230. package/dist/prod/theming/componentStyles.js.map +7 -0
  231. package/dist/prod/thirdparty/preact/preact.module.js +1 -1
  232. package/dist/prod/updateShadowRoot.js +1 -1
  233. package/dist/prod/updateShadowRoot.js.map +3 -3
  234. package/dist/prod/util/FocusableElements.js +1 -1
  235. package/dist/prod/util/FocusableElements.js.map +2 -2
  236. package/dist/prod/util/SelectionAssistant.js +1 -1
  237. package/dist/prod/util/SelectionAssistant.js.map +3 -3
  238. package/dist/prod/util/TabbableElements.js +1 -1
  239. package/dist/prod/util/TabbableElements.js.map +2 -2
  240. package/dist/prod/util/createInstanceChecker.js +2 -0
  241. package/dist/prod/util/createInstanceChecker.js.map +7 -0
  242. package/dist/prod/util/createMultiInstanceChecker.js +2 -0
  243. package/dist/prod/util/createMultiInstanceChecker.js.map +7 -0
  244. package/dist/prod/util/dragAndDrop/DragRegistry.js +1 -1
  245. package/dist/prod/util/dragAndDrop/DragRegistry.js.map +3 -3
  246. package/dist/prod/util/getParentElement.js +2 -0
  247. package/dist/prod/util/getParentElement.js.map +7 -0
  248. package/dist/prod/util/isElementHidden.js +1 -1
  249. package/dist/prod/util/isElementHidden.js.map +3 -3
  250. package/dist/prod/util/isEventMarked.js +2 -0
  251. package/dist/prod/util/isEventMarked.js.map +7 -0
  252. package/dist/prod/util/valueStateNavigation.js +2 -0
  253. package/dist/prod/util/valueStateNavigation.js.map +7 -0
  254. package/dist/prod/validateThemeRoot.js +1 -1
  255. package/dist/prod/validateThemeRoot.js.map +2 -2
  256. package/dist/ssr-dom-shim.js +2 -1
  257. package/dist/ssr-dom-shim.js.map +1 -1
  258. package/dist/theming/applyTheme.d.ts +2 -0
  259. package/dist/theming/applyTheme.js +20 -5
  260. package/dist/theming/applyTheme.js.map +1 -1
  261. package/dist/theming/componentStyles.d.ts +3 -0
  262. package/dist/theming/componentStyles.js +15 -0
  263. package/dist/theming/componentStyles.js.map +1 -0
  264. package/dist/thirdparty/preact/preact.module.js +1 -1
  265. package/dist/types.d.ts +11 -3
  266. package/dist/types.js.map +1 -1
  267. package/dist/updateShadowRoot.js +2 -1
  268. package/dist/updateShadowRoot.js.map +1 -1
  269. package/dist/util/FocusableElements.js +3 -3
  270. package/dist/util/FocusableElements.js.map +1 -1
  271. package/dist/util/SelectionAssistant.js +0 -8
  272. package/dist/util/SelectionAssistant.js.map +1 -1
  273. package/dist/util/TabbableElements.js +2 -2
  274. package/dist/util/TabbableElements.js.map +1 -1
  275. package/dist/util/createInstanceChecker.d.ts +2 -0
  276. package/dist/util/createInstanceChecker.js +8 -0
  277. package/dist/util/createInstanceChecker.js.map +1 -0
  278. package/dist/util/createMultiInstanceChecker.d.ts +2 -0
  279. package/dist/util/createMultiInstanceChecker.js +19 -0
  280. package/dist/util/createMultiInstanceChecker.js.map +1 -0
  281. package/dist/util/dragAndDrop/DragRegistry.d.ts +14 -8
  282. package/dist/util/dragAndDrop/DragRegistry.js +46 -50
  283. package/dist/util/dragAndDrop/DragRegistry.js.map +1 -1
  284. package/dist/util/getClassCopy.d.ts +4 -3
  285. package/dist/util/getParentElement.d.ts +2 -0
  286. package/dist/util/getParentElement.js +5 -0
  287. package/dist/util/getParentElement.js.map +1 -0
  288. package/dist/util/isElementHidden.js +2 -1
  289. package/dist/util/isElementHidden.js.map +1 -1
  290. package/dist/util/isEventMarked.d.ts +2 -0
  291. package/dist/util/isEventMarked.js +6 -0
  292. package/dist/util/isEventMarked.js.map +1 -0
  293. package/dist/util/valueStateNavigation.d.ts +8 -0
  294. package/dist/util/valueStateNavigation.js +40 -0
  295. package/dist/util/valueStateNavigation.js.map +1 -0
  296. package/dist/validateThemeRoot.js +6 -2
  297. package/dist/validateThemeRoot.js.map +1 -1
  298. package/package-scripts.cjs +64 -33
  299. package/package.json +27 -22
  300. package/src/css/MultipleDragGhost.css +17 -0
  301. package/src/css/OpenUI5PopupStyles.css +10 -0
  302. package/src/css/ScrollbarStyles.css +3 -0
  303. package/src/css/SystemCSSVars.css +28 -3
  304. package/src/i18n/messagebundle.properties +5 -0
  305. package/src/i18n/messagebundle_en.properties +2 -0
  306. package/src/i18n/messagebundle_en_US_sappsd.properties +2 -0
  307. package/src/i18n/messagebundle_en_US_saprigi.properties +2 -0
  308. package/src/i18n/messagebundle_en_US_saptrc.properties +2 -0
  309. package/src/thirdparty/preact/preact.module.js +1 -1
  310. package/cypress/specs/Accessor.cy.tsx +0 -79
  311. package/cypress/specs/Boot.cy.tsx +0 -19
  312. package/cypress/specs/ConfigurationChange.cy.tsx +0 -41
  313. package/cypress/specs/ConfigurationScript.cy.tsx +0 -133
  314. package/cypress/specs/ConfigurationURL.cy.tsx +0 -201
  315. package/cypress/specs/CustomMount.cy.tsx +0 -9
  316. package/cypress/specs/CustomTheme.cy.tsx +0 -36
  317. package/cypress/specs/EventProvider.cy.tsx +0 -59
  318. package/cypress/specs/Events.cy.tsx +0 -28
  319. package/cypress/specs/SystemDOMElements.cy.tsx +0 -8
  320. package/cypress/specs/Theming.cy.tsx +0 -74
  321. package/cypress/specs/UI5ElementInvalidation.cy.tsx +0 -252
  322. package/cypress/specs/UI5ElementLifecycle.cy.tsx +0 -82
  323. package/cypress/specs/UI5ElementListenForChildPropChanges.cy.tsx +0 -83
  324. package/cypress/specs/UI5ElementMetadataExt.cy.tsx +0 -42
  325. package/cypress/specs/UI5ElementPropertyValidation.cy.tsx +0 -16
  326. package/cypress/specs/UI5ElementPropsAndAttrs.cy.tsx +0 -113
  327. package/cypress/specs/UI5ElementShadowDOM.cy.tsx +0 -30
  328. package/cypress/specs/UI5ElementSlots.cy.tsx +0 -136
  329. package/cypress/specs/WithComplexTemplate.cy.tsx +0 -32
  330. package/cypress/specs/i18n_texts.cy.tsx +0 -129
  331. package/cypress/specs/util/FocusableElements.cy.tsx +0 -48
  332. package/cypress/support/commands.ts +0 -39
  333. package/cypress/support/component-index.html +0 -12
  334. package/cypress/support/component.ts +0 -17
  335. package/cypress/tsconfig.json +0 -21
  336. package/dist/css/FontFace.css +0 -96
  337. package/dist/css/OverrideFontFace.css +0 -32
  338. package/dist/generated/css/OverrideFontFace.css.d.ts +0 -2
  339. package/dist/generated/css/OverrideFontFace.css.js +0 -2
  340. package/dist/generated/css/OverrideFontFace.css.js.map +0 -1
  341. package/dist/prod/generated/css/OverrideFontFace.css.js +0 -2
  342. package/dist/prod/generated/css/OverrideFontFace.css.js.map +0 -7
  343. package/dist/prod/util/getEffectiveScrollbarStyle.js +0 -28
  344. package/dist/prod/util/getEffectiveScrollbarStyle.js.map +0 -7
  345. package/dist/util/getEffectiveScrollbarStyle.d.ts +0 -2
  346. package/dist/util/getEffectiveScrollbarStyle.js +0 -36
  347. package/dist/util/getEffectiveScrollbarStyle.js.map +0 -1
  348. package/src/css/FontFace.css +0 -96
  349. package/src/css/OverrideFontFace.css +0 -32
package/AGENTS.md ADDED
@@ -0,0 +1,195 @@
1
+ # AGENTS.md - UI5 Web Components Development Guide
2
+
3
+ This file provides guidance for AI coding assistants when developing web components built on `@ui5/webcomponents-base`.
4
+
5
+ > **Working in the ui5-webcomponents monorepo?** See the [root AGENTS.md](../../AGENTS.md) for repository commands, build flow, and commit guidelines.
6
+
7
+ ## Component Architecture
8
+
9
+ Components use decorator-based definitions with Preact JSX templates:
10
+
11
+ ```typescript
12
+ import UI5Element from "@ui5/webcomponents-base/dist/UI5Element.js";
13
+ import { customElement, property, slot } from "@ui5/webcomponents-base/dist/decorators.js";
14
+ import jsxRenderer from "@ui5/webcomponents-base/dist/renderer/JsxRenderer.js";
15
+
16
+ @customElement({
17
+ tag: "my-button",
18
+ renderer: jsxRenderer,
19
+ template: MyButtonTemplate,
20
+ styles: myButtonCss,
21
+ languageAware: true, // Re-render on language change
22
+ themeAware: true, // Re-render on theme change
23
+ })
24
+ class MyButton extends UI5Element {
25
+ @property() design: `${ButtonDesign}` = "Default";
26
+ @property({ type: Boolean }) disabled = false;
27
+ @slot({ type: HTMLElement, "default": true }) content!: Array<HTMLElement>;
28
+ }
29
+ ```
30
+
31
+ **Recommended file structure for a component:**
32
+ - `src/ComponentName.ts` - Component class with decorators
33
+ - `src/ComponentNameTemplate.tsx` - JSX template
34
+ - `src/themes/ComponentName.css` - Styles (use CSS variables for theming)
35
+ - `src/i18n/messagebundle*.properties` - Translations (if language-aware)
36
+
37
+ ## Critical Development Rules
38
+
39
+ ### DOM Manipulation Anti-Pattern
40
+
41
+ Accessing DOM elements via `@query` or `querySelector` is allowed only for calling methods like `.focus()`:
42
+
43
+ ```typescript
44
+ @query("[ui5-input]")
45
+ _input!: Input;
46
+
47
+ // GOOD - calling methods
48
+ this._input?.focus();
49
+
50
+ // BAD - modifying properties directly
51
+ this._input.value = "don't do this";
52
+ ```
53
+
54
+ Always modify child component state through the template:
55
+
56
+ ```tsx
57
+ // GOOD - use the template for state
58
+ <Input value={this.inputValue} />
59
+ ```
60
+
61
+ ### Always Use Template Literal Types for Enums
62
+
63
+ This pattern eliminates runtime overhead from enum objects:
64
+
65
+ **Imports:**
66
+ ```typescript
67
+ // BAD - imports the enum object (runtime overhead)
68
+ import ButtonDesign from "./types/ButtonDesign.js";
69
+
70
+ // GOOD - import type only (no runtime overhead)
71
+ import type ButtonDesign from "./types/ButtonDesign.js";
72
+ ```
73
+
74
+ **Property types:**
75
+ ```typescript
76
+ // BAD - uses enum object at runtime
77
+ design: ButtonDesign = ButtonDesign.Default;
78
+
79
+ // GOOD - template literal type with string value
80
+ design: `${ButtonDesign}` = "Default";
81
+ ```
82
+
83
+ **Value comparisons:**
84
+ ```typescript
85
+ // BAD - runtime enum access
86
+ if (this.design !== ButtonDesign.Transparent) { }
87
+
88
+ // GOOD - string comparison (IDE autocomplete + TS type safety)
89
+ if (this.design !== "Transparent") { }
90
+ ```
91
+
92
+ ### Scoping-Safe Code (Required for Micro-Frontend Support)
93
+
94
+ UI5 Web Components support tag name scoping for micro-frontend scenarios where multiple versions may coexist. Always use attribute selectors:
95
+
96
+ **In TypeScript:**
97
+ ```typescript
98
+ // BAD - hard-coded tag names break when scoped
99
+ this.shadowRoot.querySelector("ui5-popover")
100
+ element.tagName === "UI5-BUTTON"
101
+
102
+ // GOOD - attribute selectors work with any scoping
103
+ this.shadowRoot.querySelector("[ui5-popover]")
104
+ ```
105
+
106
+ **In CSS:**
107
+ ```css
108
+ /* BAD - tag selector breaks with scoping */
109
+ ui5-button.accept-btn { color: green; }
110
+
111
+ /* GOOD - attribute selector works with scoping */
112
+ [ui5-button].accept-btn { color: green; }
113
+ ```
114
+
115
+ ### No `instanceof` Checks
116
+
117
+ `instanceof` fails when multiple versions of the framework are loaded. Use duck-typing instead:
118
+
119
+ ```typescript
120
+ // BAD - fails with multiple framework versions
121
+ if (element instanceof Button) { }
122
+
123
+ // BAD - tag name could be scoped (e.g., "UI5-BUTTON-F5331039")
124
+ if (element.tagName === "UI5-BUTTON") { }
125
+
126
+ // GOOD - use createInstanceChecker helper
127
+ import createInstanceChecker from "@ui5/webcomponents-base/dist/util/createInstanceChecker.js";
128
+
129
+ // In your component class:
130
+ class MyItem extends UI5Element {
131
+ readonly isMyItem = true; // Duck-typing marker
132
+ }
133
+ export const isInstanceOfMyItem = createInstanceChecker<MyItem>("isMyItem");
134
+
135
+ // Usage:
136
+ if (isInstanceOfMyItem(element)) {
137
+ // element is typed as MyItem
138
+ }
139
+ ```
140
+
141
+ ### Property and Event Conventions
142
+
143
+ - **Never change public properties programmatically** - only in response to user interaction
144
+ - **Use `noAttribute: true`** for private/internal properties not used in CSS selectors
145
+ - **Fire events for all user interactions** - applications rely on events for state management
146
+ - **Import icons explicitly** - don't rely on bundled icon imports
147
+
148
+ ```typescript
149
+ @property({ noAttribute: true })
150
+ _internalState = false; // Won't create HTML attribute
151
+
152
+ // Fire events for user interactions
153
+ this.fireDecoratorEvent("change", { value: this.value });
154
+ ```
155
+
156
+ ## Testing with Cypress
157
+
158
+ Tests use Cypress component testing with JSX mounting:
159
+
160
+ ```typescript
161
+ import MyButton from "../../src/MyButton.js";
162
+
163
+ describe("MyButton", () => {
164
+ it("fires click event", () => {
165
+ cy.mount(<MyButton>Click me</MyButton>);
166
+
167
+ // Use attribute selector for scoping safety
168
+ cy.get("[my-button]").then(($btn) => {
169
+ $btn[0].addEventListener("click", cy.stub().as("clicked"));
170
+ });
171
+
172
+ // Use cypress-real-events for realistic interaction
173
+ cy.get("[my-button]").realClick();
174
+ cy.get("@clicked").should("have.been.called");
175
+ });
176
+ });
177
+ ```
178
+
179
+ **Key testing patterns:**
180
+ - Use `cypress-real-events`: `realClick()`, `realPress()`, `realType()` instead of Cypress simulated events
181
+ - Always use attribute selectors `[my-component]` not tag selectors `my-component`
182
+ - Use `.only` to run a single test case when debugging, remove before committing
183
+
184
+ ## Summary of Rules
185
+
186
+ | Rule | Bad | Good |
187
+ |------|-----|------|
188
+ | Enum imports | `import Enum from "..."` | `import type Enum from "..."` |
189
+ | Enum types | `prop: Enum` | `prop: \`${Enum}\`` |
190
+ | Enum values | `Enum.Value` | `"Value"` |
191
+ | DOM queries | `querySelector("ui5-tag")` | `querySelector("[ui5-tag]")` |
192
+ | CSS selectors | `ui5-tag { }` | `[ui5-tag] { }` |
193
+ | Type checks | `instanceof Component` | `isInstanceOfComponent(el)` |
194
+ | Tag comparison | `el.tagName === "UI5-TAG"` | Use instance checker |
195
+ | DOM mutation | `this._ref.value = x` | `<Comp value={x} />` in template |