@blukavantui/community 1.0.1 → 1.2.0

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 (304) hide show
  1. package/README.md +11 -5
  2. package/dist/build-audit.json +234 -44
  3. package/dist/checkbox.css +1 -0
  4. package/dist/checkbox.d.ts +2 -0
  5. package/dist/checkbox.js +1 -0
  6. package/dist/chunk-2BSBXDOT.js +1 -0
  7. package/dist/chunk-4LHIQROI.js +0 -0
  8. package/dist/chunk-5ENZVZGF.js +0 -0
  9. package/dist/chunk-6T677NSC.js +1 -0
  10. package/dist/chunk-7CEOCZ5L.js +0 -0
  11. package/dist/chunk-7DXFNK7C.js +1 -0
  12. package/dist/chunk-AL2ETLJV.js +1 -0
  13. package/dist/chunk-BN3PDE5G.js +0 -0
  14. package/dist/chunk-CNIIMGT3.js +0 -0
  15. package/dist/chunk-CSTCEBEK.js +1 -0
  16. package/dist/chunk-DRZM2AL3.js +0 -0
  17. package/dist/chunk-EOKNLCNS.js +1 -0
  18. package/dist/chunk-EPPETNK6.js +1 -0
  19. package/dist/chunk-EPPSBHZR.js +1 -0
  20. package/dist/chunk-EPZGLHPD.js +0 -0
  21. package/dist/chunk-FNX33PDD.js +0 -0
  22. package/dist/{chunk-NTFHNL7T.js → chunk-G6OW4OZM.js} +1 -1
  23. package/dist/chunk-GS67ZBLI.js +1 -0
  24. package/dist/chunk-HO6CYWED.js +0 -0
  25. package/dist/{chunk-6EHKOVZK.js → chunk-HVR2UDFX.js} +1 -1
  26. package/dist/chunk-IJ62ILKE.js +0 -0
  27. package/dist/chunk-IKYBFMHI.js +1 -0
  28. package/dist/chunk-IO22GWON.js +0 -0
  29. package/dist/chunk-KVOA55NE.js +0 -0
  30. package/dist/{chunk-MZBB5ROJ.js → chunk-LF2HELEZ.js} +1 -1
  31. package/dist/chunk-MYVLBALF.js +1 -0
  32. package/dist/{chunk-UEOCR2C3.js → chunk-OLDA73XG.js} +2 -2
  33. package/dist/chunk-RWBLICYX.js +0 -0
  34. package/dist/chunk-RYD6RHRX.js +0 -0
  35. package/dist/chunk-T45FJNEQ.js +1 -0
  36. package/dist/chunk-TZSX4OTV.js +1 -0
  37. package/dist/chunk-UN2SLVFG.js +1 -0
  38. package/dist/{chunk-GK3INPAZ.js → chunk-V2YPIC6Z.js} +1 -1
  39. package/dist/chunk-V4ZQLQ7L.js +0 -0
  40. package/dist/chunk-VAM3FPCS.js +0 -0
  41. package/dist/chunk-VJVFHL6P.js +0 -0
  42. package/dist/chunk-VSTKXZYY.js +0 -0
  43. package/dist/chunk-W3H7XTA7.js +1 -0
  44. package/dist/chunk-WG4US4JH.js +1 -0
  45. package/dist/chunk-WGSTNXAQ.js +0 -0
  46. package/dist/chunk-WJHCVECU.js +1 -0
  47. package/dist/chunk-XVMJG26X.js +1 -0
  48. package/dist/chunk-Y4AXWTAD.js +0 -0
  49. package/dist/chunk-YCLR3IE3.js +0 -0
  50. package/dist/chunk-YLFXSHKZ.js +0 -0
  51. package/dist/chunk-ZDGZGAYG.js +0 -0
  52. package/dist/columns2.css +1 -0
  53. package/dist/columns2.d.ts +2 -0
  54. package/dist/columns2.js +1 -0
  55. package/dist/columns3.css +1 -0
  56. package/dist/columns3.d.ts +2 -0
  57. package/dist/columns3.js +1 -0
  58. package/dist/columns4.css +1 -0
  59. package/dist/columns4.d.ts +2 -0
  60. package/dist/columns4.js +1 -0
  61. package/dist/command-palette.js +1 -1
  62. package/dist/component-motion.css +39 -0
  63. package/dist/component-motion.d.ts +45 -0
  64. package/dist/component-motion.js +1 -0
  65. package/dist/content.js +1 -1
  66. package/dist/core.css +8 -0
  67. package/dist/core.js +1 -1
  68. package/dist/data-motion.css +4 -0
  69. package/dist/data-motion.d.ts +23 -0
  70. package/dist/data-motion.js +1 -0
  71. package/dist/data.css +63 -0
  72. package/dist/data.d.ts +1 -0
  73. package/dist/data.js +1 -1
  74. package/dist/date-picker.css +5 -5
  75. package/dist/date-picker.js +1 -1
  76. package/dist/date-range-picker.css +5 -5
  77. package/dist/date-range-picker.js +1 -1
  78. package/dist/date-time-picker.css +5 -5
  79. package/dist/date-time-picker.js +1 -1
  80. package/dist/draft-components.json +77 -0
  81. package/dist/drawer.js +1 -1
  82. package/dist/essentials.css +8 -0
  83. package/dist/feedback.js +1 -1
  84. package/dist/form-field.css +1 -0
  85. package/dist/form-field.d.ts +2 -0
  86. package/dist/form-field.js +1 -0
  87. package/dist/form-layout/choice.d.ts +15 -0
  88. package/dist/form-layout/layout.d.ts +12 -0
  89. package/dist/form-layout/select.d.ts +3 -0
  90. package/dist/form-layout/shared.d.ts +21 -0
  91. package/dist/form-layout/table.d.ts +20 -0
  92. package/dist/form-layout/text.d.ts +3 -0
  93. package/dist/form-layout/types.d.ts +151 -0
  94. package/dist/form-layout.css +62 -0
  95. package/dist/form-layout.d.ts +12 -0
  96. package/dist/form-layout.js +1 -0
  97. package/dist/index.d.ts +1 -0
  98. package/dist/index.js +1 -1
  99. package/dist/inputs.css +83 -20
  100. package/dist/inputs.d.ts +8 -0
  101. package/dist/inputs.js +1 -1
  102. package/dist/layout.css +63 -0
  103. package/dist/layout.d.ts +3 -0
  104. package/dist/layout.js +1 -1
  105. package/dist/modal.js +1 -1
  106. package/dist/motion/action-feedback.d.ts +14 -0
  107. package/dist/motion/border-glow.d.ts +12 -0
  108. package/dist/motion/button.d.ts +11 -0
  109. package/dist/motion/component-settings.d.ts +51 -0
  110. package/dist/motion/controller.d.ts +33 -0
  111. package/dist/motion/effects.d.ts +30 -0
  112. package/dist/motion/feedback.d.ts +6 -0
  113. package/dist/motion/loading.d.ts +9 -0
  114. package/dist/motion/optional.d.ts +35 -0
  115. package/dist/motion/photo.d.ts +7 -0
  116. package/dist/motion/presence.d.ts +12 -0
  117. package/dist/motion/scene.d.ts +10 -0
  118. package/dist/motion/screen.d.ts +6 -0
  119. package/dist/motion/scroll-reveal.d.ts +13 -0
  120. package/dist/motion/settings-group.d.ts +14 -0
  121. package/dist/motion/stagger.d.ts +12 -0
  122. package/dist/motion/structure.d.ts +18 -0
  123. package/dist/motion/tabs.d.ts +19 -0
  124. package/dist/motion/tokens.d.ts +11 -0
  125. package/dist/motion/value.d.ts +21 -0
  126. package/dist/motion/view-transition.d.ts +14 -0
  127. package/dist/motion-enhancers.d.ts +12 -0
  128. package/dist/motion-enhancers.js +1 -0
  129. package/dist/motion-settings.d.ts +3 -0
  130. package/dist/motion-settings.js +1 -0
  131. package/dist/motion.css +1076 -0
  132. package/dist/motion.d.ts +20 -0
  133. package/dist/motion.js +1 -0
  134. package/dist/native/date-picker.js +1 -1
  135. package/dist/native/date-range-picker.js +1 -1
  136. package/dist/native/date-time-picker.js +1 -1
  137. package/dist/native/form-layout.js +1 -0
  138. package/dist/native/time-picker.js +1 -1
  139. package/dist/native-components/form-layout.d.ts +1 -0
  140. package/dist/native-motion-components.d.ts +3 -0
  141. package/dist/native-motion-content.d.ts +1 -0
  142. package/dist/native-motion-foundations.d.ts +3 -0
  143. package/dist/native-motion-layout.d.ts +3 -0
  144. package/dist/native-motion-pilot.d.ts +34 -0
  145. package/dist/native-motion.d.ts +71 -0
  146. package/dist/notification.js +1 -1
  147. package/dist/pagination.js +1 -1
  148. package/dist/radio-button.css +1 -0
  149. package/dist/radio-button.d.ts +2 -0
  150. package/dist/radio-button.js +1 -0
  151. package/dist/radio-group.css +1 -0
  152. package/dist/radio-group.d.ts +2 -0
  153. package/dist/radio-group.js +1 -0
  154. package/dist/select.css +1 -0
  155. package/dist/select.d.ts +2 -0
  156. package/dist/select.js +1 -0
  157. package/dist/sidebar.js +1 -1
  158. package/dist/sizes.json +416 -112
  159. package/dist/skeleton.css +8 -0
  160. package/dist/styles.css +1213 -20
  161. package/dist/switch.css +1 -0
  162. package/dist/switch.d.ts +2 -0
  163. package/dist/switch.js +1 -0
  164. package/dist/table.css +1 -0
  165. package/dist/table.d.ts +2 -0
  166. package/dist/table.js +1 -0
  167. package/dist/text-area.css +1 -0
  168. package/dist/text-area.d.ts +2 -0
  169. package/dist/text-area.js +1 -0
  170. package/dist/text-input.css +1 -0
  171. package/dist/text-input.d.ts +2 -0
  172. package/dist/text-input.js +1 -0
  173. package/dist/time-picker.css +5 -5
  174. package/dist/time-picker.js +1 -1
  175. package/dist/tree-view.js +1 -1
  176. package/dist/web-motion/chip-ripple.d.ts +6 -0
  177. package/dist/web-motion/choice-ripple.d.ts +6 -0
  178. package/dist/web-motion/content.d.ts +9 -0
  179. package/dist/web-motion/data-rows.d.ts +12 -0
  180. package/dist/web-motion/fields.d.ts +6 -0
  181. package/dist/web-motion/navigation.d.ts +6 -0
  182. package/dist/web-motion/notifications.d.ts +6 -0
  183. package/dist/web-motion/select-ripple.d.ts +6 -0
  184. package/dist/web-motion/statistic.d.ts +13 -0
  185. package/dist/web-motion/surfaces.d.ts +10 -0
  186. package/dist/web-motion/tree.d.ts +6 -0
  187. package/docs/FORM-LAYOUT-ESSENTIALS.md +122 -0
  188. package/docs/PUBLISHING.md +129 -25
  189. package/draft-components.json +77 -0
  190. package/edition.json +44 -7
  191. package/npm-shrinkwrap.json +2 -2
  192. package/package.json +102 -10
  193. package/scripts/build-motion-css.mjs +36 -0
  194. package/scripts/build-motion-styles.mjs +29 -0
  195. package/scripts/build.mjs +20 -8
  196. package/scripts/motion-entries.mjs +2 -0
  197. package/src/checkbox.ts +2 -0
  198. package/src/columns2.ts +2 -0
  199. package/src/columns3.ts +2 -0
  200. package/src/columns4.ts +2 -0
  201. package/src/component-motion.ts +101 -0
  202. package/src/data-motion.ts +60 -0
  203. package/src/data.ts +1 -0
  204. package/src/form-field.ts +2 -0
  205. package/src/form-layout/choice.ts +82 -0
  206. package/src/form-layout/layout.ts +40 -0
  207. package/src/form-layout/select.ts +97 -0
  208. package/src/form-layout/shared.ts +57 -0
  209. package/src/form-layout/table.ts +86 -0
  210. package/src/form-layout/text.ts +73 -0
  211. package/src/form-layout/types.ts +59 -0
  212. package/src/form-layout.ts +12 -0
  213. package/src/index.ts +2 -0
  214. package/src/inputs.ts +8 -0
  215. package/src/layout.ts +3 -0
  216. package/src/motion/action-feedback.ts +38 -0
  217. package/src/motion/border-glow.ts +41 -0
  218. package/src/motion/button.ts +56 -0
  219. package/src/motion/component-settings.ts +147 -0
  220. package/src/motion/controller.ts +191 -0
  221. package/src/motion/effects.ts +75 -0
  222. package/src/motion/feedback.ts +41 -0
  223. package/src/motion/loading.ts +40 -0
  224. package/src/motion/optional.ts +123 -0
  225. package/src/motion/photo.ts +19 -0
  226. package/src/motion/presence.ts +44 -0
  227. package/src/motion/scene.ts +103 -0
  228. package/src/motion/screen.ts +15 -0
  229. package/src/motion/scroll-reveal.ts +49 -0
  230. package/src/motion/settings-group.ts +28 -0
  231. package/src/motion/stagger.ts +26 -0
  232. package/src/motion/structure.ts +75 -0
  233. package/src/motion/tabs.ts +105 -0
  234. package/src/motion/tokens.ts +2 -0
  235. package/src/motion/value.ts +61 -0
  236. package/src/motion/view-transition.ts +57 -0
  237. package/src/motion-enhancers.ts +12 -0
  238. package/src/motion-settings.ts +3 -0
  239. package/src/motion.ts +20 -0
  240. package/src/native-components/form-layout.ts +21 -0
  241. package/src/native-motion-components.ts +76 -0
  242. package/src/native-motion-content.ts +10 -0
  243. package/src/native-motion-foundations.ts +56 -0
  244. package/src/native-motion-layout.ts +35 -0
  245. package/src/native-motion-pilot.ts +151 -0
  246. package/src/native-motion.ts +188 -0
  247. package/src/radio-button.ts +2 -0
  248. package/src/radio-group.ts +2 -0
  249. package/src/runtime/date-picker.js +21 -12
  250. package/src/runtime/date-range-picker.js +21 -12
  251. package/src/runtime/date-time-picker.js +21 -12
  252. package/src/runtime/time-picker.js +21 -12
  253. package/src/select.ts +2 -0
  254. package/src/switch.ts +2 -0
  255. package/src/table.ts +2 -0
  256. package/src/text-area.ts +2 -0
  257. package/src/text-input.ts +2 -0
  258. package/src/types.ts +0 -12
  259. package/src/web-motion/chip-ripple.ts +31 -0
  260. package/src/web-motion/choice-ripple.ts +30 -0
  261. package/src/web-motion/content.ts +74 -0
  262. package/src/web-motion/data-rows.ts +106 -0
  263. package/src/web-motion/fields.ts +52 -0
  264. package/src/web-motion/navigation.ts +62 -0
  265. package/src/web-motion/notifications.ts +67 -0
  266. package/src/web-motion/select-ripple.ts +23 -0
  267. package/src/web-motion/statistic.ts +23 -0
  268. package/src/web-motion/surfaces.ts +137 -0
  269. package/src/web-motion/tree.ts +44 -0
  270. package/styles/checkbox.css +1 -0
  271. package/styles/columns2.css +1 -0
  272. package/styles/columns3.css +1 -0
  273. package/styles/columns4.css +1 -0
  274. package/styles/component-motion.css +39 -0
  275. package/styles/data-motion.css +4 -0
  276. package/styles/date-picker.css +5 -5
  277. package/styles/date-range-picker.css +5 -5
  278. package/styles/date-time-picker.css +5 -5
  279. package/styles/form-field.css +1 -0
  280. package/styles/form-layout.css +62 -0
  281. package/styles/motion-optional.css +15 -0
  282. package/styles/motion-presets.css +92 -0
  283. package/styles/motion-tokens.css +6 -0
  284. package/styles/motion.css +125 -0
  285. package/styles/radio-button.css +1 -0
  286. package/styles/radio-group.css +1 -0
  287. package/styles/select.css +1 -0
  288. package/styles/skeleton.css +8 -0
  289. package/styles/switch.css +1 -0
  290. package/styles/table.css +1 -0
  291. package/styles/text-area.css +1 -0
  292. package/styles/text-input.css +1 -0
  293. package/styles/time-picker.css +5 -5
  294. package/test/component-motion-settings.test.mjs +35 -0
  295. package/test/content-overlay-motion.test.mjs +36 -0
  296. package/test/form-layout.test.mjs +28 -0
  297. package/test/isolation.test.mjs +2 -2
  298. package/test/motion.test.mjs +215 -0
  299. package/dist/chunk-2TCNAQC6.js +0 -1
  300. package/dist/chunk-CTLZIWMX.js +0 -1
  301. package/dist/chunk-MHHJZYXW.js +0 -1
  302. package/dist/chunk-XDYBNO4P.js +0 -1
  303. /package/dist/{chunk-H7ETPJVW.js → chunk-3PODK22R.js} +0 -0
  304. /package/dist/{chunk-SIU7DSOA.js → chunk-KBWB4OIF.js} +0 -0
package/dist/inputs.css CHANGED
@@ -1215,7 +1215,7 @@ Keep bulk commands together in a wrapping row between the panels. */
1215
1215
  .blu-picker [hidden],.blu-picker__dialog [hidden] {display:none!important;}
1216
1216
  .blu-picker__fields {display:flex;flex-wrap:wrap;gap:12px;}
1217
1217
  .blu-picker__field {flex:1 1 180px;min-width:0;}
1218
- .blu-picker__field label,.blu-picker__select-field>span {display:block;margin-bottom:5px;color:var(--bluui-text,#182230);font-weight:600;}
1218
+ .blu-picker__field label,.blu-picker__select-caption {display:block;margin-bottom:5px;color:var(--bluui-text,#182230);font-weight:600;}
1219
1219
  .blu-picker__input {display:block;width:100%;min-width:0;min-height:42px;padding:9px 11px;border:1px solid var(--bluui-control-border,#69788d);border-radius:9px;background:var(--bluui-surface,#fff);color:var(--bluui-text,#182230);font:inherit;line-height:1.4;}
1220
1220
  .blu-picker__field-control {position:relative;}
1221
1221
  .blu-picker__field-control>.blu-picker__input {padding-right:38px;}
@@ -1238,7 +1238,7 @@ Keep bulk commands together in a wrapping row between the panels. */
1238
1238
  .blu-picker__dialog::backdrop {background:transparent;pointer-events:none;}
1239
1239
  .blu-picker__dialog-head {display:flex;align-items:center;justify-content:space-between;gap:16px;margin-bottom:14px;}
1240
1240
  .blu-picker__dialog-head h2 {font-size:16px;line-height:1.4;font-family:var(--blu-font-heading-family,inherit);margin:0;overflow-wrap:anywhere;}
1241
- .blu-picker__calendar-nav {display:grid;grid-template-columns:32px minmax(0,1fr) 72px 32px;align-items:end;gap:6px;margin-top:0;}
1241
+ .blu-picker__calendar-nav {display:grid;grid-template-columns:32px minmax(0,1fr) 88px 32px;align-items:end;gap:6px;margin-top:0;}
1242
1242
  .blu-picker__calendar-nav>.blu-picker__button {height:36px;padding:2px;font-size:22px;}
1243
1243
  .blu-picker__select-field {min-width:0;}
1244
1244
  .blu-picker__caption {font-size:15px;text-align:center;margin:16px 0 8px;}
@@ -1263,8 +1263,8 @@ Keep bulk commands together in a wrapping row between the panels. */
1263
1263
  /* Compact popup controls; editable text stays at 16px to avoid iOS focus zoom. */
1264
1264
  .blu-picker__dialog .blu-picker__input {min-height:36px;padding:5px 7px;font-size:16px;line-height:1.2;}
1265
1265
  .blu-picker__dialog .blu-picker__button {min-height:34px;min-width:32px;padding:5px 9px;font-size:13px;line-height:1.25;}
1266
- .blu-picker__dialog .blu-picker__select-field>span {font-size:11px;margin-bottom:2px;}
1267
- .blu-picker__calendar-nav .blu-picker__select-field>span {position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap;margin:0;}
1266
+ .blu-picker__dialog .blu-picker__select-caption {font-size:11px;margin-bottom:2px;}
1267
+ .blu-picker__calendar-nav .blu-picker__select-caption {position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap;margin:0;}
1268
1268
  .blu-picker__dialog .blu-picker__error {margin-top:4px;font-size:12px;line-height:1.3;}
1269
1269
  @media(pointer:coarse){
1270
1270
  .blu-picker__field-control>.blu-picker__input {font-size:16px;min-height:44px;}
@@ -1281,7 +1281,7 @@ Keep bulk commands together in a wrapping row between the panels. */
1281
1281
  .blu-picker__dialog[data-compact=true] .blu-picker__calendar td {height:24px;}
1282
1282
  .blu-picker__dialog[data-compact=true] .blu-picker__day {min-height:24px;padding:3px 0;}
1283
1283
  .blu-picker__dialog[data-compact=true] .blu-picker__time-area {margin:4px 0;gap:6px;}
1284
- .blu-picker__dialog[data-compact=true] .blu-picker__time-area .blu-picker__select-field>span {position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap;}
1284
+ .blu-picker__dialog[data-compact=true] .blu-picker__time-area .blu-picker__select-caption {position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap;}
1285
1285
  .blu-picker__dialog[data-compact=true] .blu-picker__selection {position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap;margin:0;}
1286
1286
  .blu-picker__dialog[data-compact=true] .blu-picker__popup-actions {margin-top:4px;gap:4px;}
1287
1287
  .blu-picker__dialog[data-compact=true] .blu-picker__presets {margin-bottom:4px;gap:4px;}
@@ -1294,7 +1294,7 @@ Keep bulk commands together in a wrapping row between the panels. */
1294
1294
  .blu-picker [hidden],.blu-picker__dialog [hidden] {display:none!important;}
1295
1295
  .blu-picker__fields {display:flex;flex-wrap:wrap;gap:12px;}
1296
1296
  .blu-picker__field {flex:1 1 180px;min-width:0;}
1297
- .blu-picker__field label,.blu-picker__select-field>span {display:block;margin-bottom:5px;color:var(--bluui-text,#182230);font-weight:600;}
1297
+ .blu-picker__field label,.blu-picker__select-caption {display:block;margin-bottom:5px;color:var(--bluui-text,#182230);font-weight:600;}
1298
1298
  .blu-picker__input {display:block;width:100%;min-width:0;min-height:42px;padding:9px 11px;border:1px solid var(--bluui-control-border,#69788d);border-radius:9px;background:var(--bluui-surface,#fff);color:var(--bluui-text,#182230);font:inherit;line-height:1.4;}
1299
1299
  .blu-picker__field-control {position:relative;}
1300
1300
  .blu-picker__field-control>.blu-picker__input {padding-right:38px;}
@@ -1317,7 +1317,7 @@ Keep bulk commands together in a wrapping row between the panels. */
1317
1317
  .blu-picker__dialog::backdrop {background:transparent;pointer-events:none;}
1318
1318
  .blu-picker__dialog-head {display:flex;align-items:center;justify-content:space-between;gap:16px;margin-bottom:14px;}
1319
1319
  .blu-picker__dialog-head h2 {font-size:16px;line-height:1.4;font-family:var(--blu-font-heading-family,inherit);margin:0;overflow-wrap:anywhere;}
1320
- .blu-picker__calendar-nav {display:grid;grid-template-columns:32px minmax(0,1fr) 72px 32px;align-items:end;gap:6px;margin-top:0;}
1320
+ .blu-picker__calendar-nav {display:grid;grid-template-columns:32px minmax(0,1fr) 88px 32px;align-items:end;gap:6px;margin-top:0;}
1321
1321
  .blu-picker__calendar-nav>.blu-picker__button {height:36px;padding:2px;font-size:22px;}
1322
1322
  .blu-picker__select-field {min-width:0;}
1323
1323
  .blu-picker__caption {font-size:15px;text-align:center;margin:16px 0 8px;}
@@ -1342,8 +1342,8 @@ Keep bulk commands together in a wrapping row between the panels. */
1342
1342
  /* Compact popup controls; editable text stays at 16px to avoid iOS focus zoom. */
1343
1343
  .blu-picker__dialog .blu-picker__input {min-height:36px;padding:5px 7px;font-size:16px;line-height:1.2;}
1344
1344
  .blu-picker__dialog .blu-picker__button {min-height:34px;min-width:32px;padding:5px 9px;font-size:13px;line-height:1.25;}
1345
- .blu-picker__dialog .blu-picker__select-field>span {font-size:11px;margin-bottom:2px;}
1346
- .blu-picker__calendar-nav .blu-picker__select-field>span {position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap;margin:0;}
1345
+ .blu-picker__dialog .blu-picker__select-caption {font-size:11px;margin-bottom:2px;}
1346
+ .blu-picker__calendar-nav .blu-picker__select-caption {position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap;margin:0;}
1347
1347
  .blu-picker__dialog .blu-picker__error {margin-top:4px;font-size:12px;line-height:1.3;}
1348
1348
  @media(pointer:coarse){
1349
1349
  .blu-picker__field-control>.blu-picker__input {font-size:16px;min-height:44px;}
@@ -1360,7 +1360,7 @@ Keep bulk commands together in a wrapping row between the panels. */
1360
1360
  .blu-picker__dialog[data-compact=true] .blu-picker__calendar td {height:24px;}
1361
1361
  .blu-picker__dialog[data-compact=true] .blu-picker__day {min-height:24px;padding:3px 0;}
1362
1362
  .blu-picker__dialog[data-compact=true] .blu-picker__time-area {margin:4px 0;gap:6px;}
1363
- .blu-picker__dialog[data-compact=true] .blu-picker__time-area .blu-picker__select-field>span {position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap;}
1363
+ .blu-picker__dialog[data-compact=true] .blu-picker__time-area .blu-picker__select-caption {position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap;}
1364
1364
  .blu-picker__dialog[data-compact=true] .blu-picker__selection {position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap;margin:0;}
1365
1365
  .blu-picker__dialog[data-compact=true] .blu-picker__popup-actions {margin-top:4px;gap:4px;}
1366
1366
  .blu-picker__dialog[data-compact=true] .blu-picker__presets {margin-bottom:4px;gap:4px;}
@@ -1373,7 +1373,7 @@ Keep bulk commands together in a wrapping row between the panels. */
1373
1373
  .blu-picker [hidden],.blu-picker__dialog [hidden] {display:none!important;}
1374
1374
  .blu-picker__fields {display:flex;flex-wrap:wrap;gap:12px;}
1375
1375
  .blu-picker__field {flex:1 1 180px;min-width:0;}
1376
- .blu-picker__field label,.blu-picker__select-field>span {display:block;margin-bottom:5px;color:var(--bluui-text,#182230);font-weight:600;}
1376
+ .blu-picker__field label,.blu-picker__select-caption {display:block;margin-bottom:5px;color:var(--bluui-text,#182230);font-weight:600;}
1377
1377
  .blu-picker__input {display:block;width:100%;min-width:0;min-height:42px;padding:9px 11px;border:1px solid var(--bluui-control-border,#69788d);border-radius:9px;background:var(--bluui-surface,#fff);color:var(--bluui-text,#182230);font:inherit;line-height:1.4;}
1378
1378
  .blu-picker__field-control {position:relative;}
1379
1379
  .blu-picker__field-control>.blu-picker__input {padding-right:38px;}
@@ -1396,7 +1396,7 @@ Keep bulk commands together in a wrapping row between the panels. */
1396
1396
  .blu-picker__dialog::backdrop {background:transparent;pointer-events:none;}
1397
1397
  .blu-picker__dialog-head {display:flex;align-items:center;justify-content:space-between;gap:16px;margin-bottom:14px;}
1398
1398
  .blu-picker__dialog-head h2 {font-size:16px;line-height:1.4;font-family:var(--blu-font-heading-family,inherit);margin:0;overflow-wrap:anywhere;}
1399
- .blu-picker__calendar-nav {display:grid;grid-template-columns:32px minmax(0,1fr) 72px 32px;align-items:end;gap:6px;margin-top:0;}
1399
+ .blu-picker__calendar-nav {display:grid;grid-template-columns:32px minmax(0,1fr) 88px 32px;align-items:end;gap:6px;margin-top:0;}
1400
1400
  .blu-picker__calendar-nav>.blu-picker__button {height:36px;padding:2px;font-size:22px;}
1401
1401
  .blu-picker__select-field {min-width:0;}
1402
1402
  .blu-picker__caption {font-size:15px;text-align:center;margin:16px 0 8px;}
@@ -1421,8 +1421,8 @@ Keep bulk commands together in a wrapping row between the panels. */
1421
1421
  /* Compact popup controls; editable text stays at 16px to avoid iOS focus zoom. */
1422
1422
  .blu-picker__dialog .blu-picker__input {min-height:36px;padding:5px 7px;font-size:16px;line-height:1.2;}
1423
1423
  .blu-picker__dialog .blu-picker__button {min-height:34px;min-width:32px;padding:5px 9px;font-size:13px;line-height:1.25;}
1424
- .blu-picker__dialog .blu-picker__select-field>span {font-size:11px;margin-bottom:2px;}
1425
- .blu-picker__calendar-nav .blu-picker__select-field>span {position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap;margin:0;}
1424
+ .blu-picker__dialog .blu-picker__select-caption {font-size:11px;margin-bottom:2px;}
1425
+ .blu-picker__calendar-nav .blu-picker__select-caption {position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap;margin:0;}
1426
1426
  .blu-picker__dialog .blu-picker__error {margin-top:4px;font-size:12px;line-height:1.3;}
1427
1427
  @media(pointer:coarse){
1428
1428
  .blu-picker__field-control>.blu-picker__input {font-size:16px;min-height:44px;}
@@ -1439,7 +1439,7 @@ Keep bulk commands together in a wrapping row between the panels. */
1439
1439
  .blu-picker__dialog[data-compact=true] .blu-picker__calendar td {height:24px;}
1440
1440
  .blu-picker__dialog[data-compact=true] .blu-picker__day {min-height:24px;padding:3px 0;}
1441
1441
  .blu-picker__dialog[data-compact=true] .blu-picker__time-area {margin:4px 0;gap:6px;}
1442
- .blu-picker__dialog[data-compact=true] .blu-picker__time-area .blu-picker__select-field>span {position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap;}
1442
+ .blu-picker__dialog[data-compact=true] .blu-picker__time-area .blu-picker__select-caption {position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap;}
1443
1443
  .blu-picker__dialog[data-compact=true] .blu-picker__selection {position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap;margin:0;}
1444
1444
  .blu-picker__dialog[data-compact=true] .blu-picker__popup-actions {margin-top:4px;gap:4px;}
1445
1445
  .blu-picker__dialog[data-compact=true] .blu-picker__presets {margin-bottom:4px;gap:4px;}
@@ -1452,7 +1452,7 @@ Keep bulk commands together in a wrapping row between the panels. */
1452
1452
  .blu-picker [hidden],.blu-picker__dialog [hidden] {display:none!important;}
1453
1453
  .blu-picker__fields {display:flex;flex-wrap:wrap;gap:12px;}
1454
1454
  .blu-picker__field {flex:1 1 180px;min-width:0;}
1455
- .blu-picker__field label,.blu-picker__select-field>span {display:block;margin-bottom:5px;color:var(--bluui-text,#182230);font-weight:600;}
1455
+ .blu-picker__field label,.blu-picker__select-caption {display:block;margin-bottom:5px;color:var(--bluui-text,#182230);font-weight:600;}
1456
1456
  .blu-picker__input {display:block;width:100%;min-width:0;min-height:42px;padding:9px 11px;border:1px solid var(--bluui-control-border,#69788d);border-radius:9px;background:var(--bluui-surface,#fff);color:var(--bluui-text,#182230);font:inherit;line-height:1.4;}
1457
1457
  .blu-picker__field-control {position:relative;}
1458
1458
  .blu-picker__field-control>.blu-picker__input {padding-right:38px;}
@@ -1475,7 +1475,7 @@ Keep bulk commands together in a wrapping row between the panels. */
1475
1475
  .blu-picker__dialog::backdrop {background:transparent;pointer-events:none;}
1476
1476
  .blu-picker__dialog-head {display:flex;align-items:center;justify-content:space-between;gap:16px;margin-bottom:14px;}
1477
1477
  .blu-picker__dialog-head h2 {font-size:16px;line-height:1.4;font-family:var(--blu-font-heading-family,inherit);margin:0;overflow-wrap:anywhere;}
1478
- .blu-picker__calendar-nav {display:grid;grid-template-columns:32px minmax(0,1fr) 72px 32px;align-items:end;gap:6px;margin-top:0;}
1478
+ .blu-picker__calendar-nav {display:grid;grid-template-columns:32px minmax(0,1fr) 88px 32px;align-items:end;gap:6px;margin-top:0;}
1479
1479
  .blu-picker__calendar-nav>.blu-picker__button {height:36px;padding:2px;font-size:22px;}
1480
1480
  .blu-picker__select-field {min-width:0;}
1481
1481
  .blu-picker__caption {font-size:15px;text-align:center;margin:16px 0 8px;}
@@ -1500,8 +1500,8 @@ Keep bulk commands together in a wrapping row between the panels. */
1500
1500
  /* Compact popup controls; editable text stays at 16px to avoid iOS focus zoom. */
1501
1501
  .blu-picker__dialog .blu-picker__input {min-height:36px;padding:5px 7px;font-size:16px;line-height:1.2;}
1502
1502
  .blu-picker__dialog .blu-picker__button {min-height:34px;min-width:32px;padding:5px 9px;font-size:13px;line-height:1.25;}
1503
- .blu-picker__dialog .blu-picker__select-field>span {font-size:11px;margin-bottom:2px;}
1504
- .blu-picker__calendar-nav .blu-picker__select-field>span {position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap;margin:0;}
1503
+ .blu-picker__dialog .blu-picker__select-caption {font-size:11px;margin-bottom:2px;}
1504
+ .blu-picker__calendar-nav .blu-picker__select-caption {position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap;margin:0;}
1505
1505
  .blu-picker__dialog .blu-picker__error {margin-top:4px;font-size:12px;line-height:1.3;}
1506
1506
  @media(pointer:coarse){
1507
1507
  .blu-picker__field-control>.blu-picker__input {font-size:16px;min-height:44px;}
@@ -1518,7 +1518,70 @@ Keep bulk commands together in a wrapping row between the panels. */
1518
1518
  .blu-picker__dialog[data-compact=true] .blu-picker__calendar td {height:24px;}
1519
1519
  .blu-picker__dialog[data-compact=true] .blu-picker__day {min-height:24px;padding:3px 0;}
1520
1520
  .blu-picker__dialog[data-compact=true] .blu-picker__time-area {margin:4px 0;gap:6px;}
1521
- .blu-picker__dialog[data-compact=true] .blu-picker__time-area .blu-picker__select-field>span {position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap;}
1521
+ .blu-picker__dialog[data-compact=true] .blu-picker__time-area .blu-picker__select-caption {position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap;}
1522
1522
  .blu-picker__dialog[data-compact=true] .blu-picker__selection {position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap;margin:0;}
1523
1523
  .blu-picker__dialog[data-compact=true] .blu-picker__popup-actions {margin-top:4px;gap:4px;}
1524
1524
  .blu-picker__dialog[data-compact=true] .blu-picker__presets {margin-bottom:4px;gap:4px;}
1525
+
1526
+ /* Community Form & Layout Essentials — local draft; no OutSystems UI selectors. */
1527
+ .blu-field,.blu-columns,.blu-table{box-sizing:border-box;min-width:0;color:var(--bluui-text,#182230);font-family:var(--blu-font-family,Inter,system-ui,sans-serif);font-size:14px}
1528
+ .blu-field *,.blu-columns *,.blu-table *{box-sizing:border-box}
1529
+ .blu-field [hidden],.blu-table [hidden]{display:none!important}
1530
+ .blu-field{--blu-field-height:42px;--blu-field-padding:12px;display:flex;flex-direction:column;gap:7px;border:0;padding:0;margin:0;min-inline-size:0}
1531
+ .blu-field--small{--blu-field-height:34px;--blu-field-padding:9px;font-size:13px}.blu-field--large{--blu-field-height:50px;--blu-field-padding:15px;font-size:16px}
1532
+ .blu-field__label{font-weight:600;line-height:1.5;padding:0;margin:0 0 2px}.blu-field__body{min-width:0}
1533
+ .blu-field__help,.blu-choice__description,.blu-field__count{font-size:12px;color:var(--bluui-text-muted,#5c6b80);line-height:1.5}.blu-field__error{color:var(--bluui-color-error-text,#b42318);font-size:12px;line-height:1.5}.blu-field__count{text-align:end;margin-top:5px;font-variant-numeric:tabular-nums}
1534
+ .blu-text,.blu-textarea,.blu-select__trigger{border:1px solid var(--bluui-control-border,#7b8799);border-radius:var(--blu-radius-md,8px);background:var(--bluui-surface,#fff);color:inherit;transition:border-color .12s,box-shadow .12s}
1535
+ .blu-text{display:flex;align-items:center;gap:8px;min-height:var(--blu-field-height);padding:0 var(--blu-field-padding)}
1536
+ .blu-text__input{width:100%;min-width:0;border:0!important;box-shadow:none!important;outline:none!important;background:transparent!important;color:inherit;padding:9px 0!important;font:inherit;line-height:1.5;height:auto}
1537
+ .blu-text__input::placeholder,.blu-textarea::placeholder{color:var(--bluui-text-muted,#5c6b80);opacity:1}
1538
+ .blu-text:focus-within,.blu-textarea:focus-visible,.blu-select__trigger:focus-visible{border-color:var(--bluui-primary,#4f46e5);outline:2px solid var(--bluui-primary,#4f46e5);outline-offset:2px}
1539
+ .blu-text__adornment{display:inline-flex;flex:none;gap:6px;align-items:center;color:var(--bluui-text-muted,#5c6b80);white-space:nowrap}.blu-text__adornment img{width:24px;height:24px;object-fit:contain;border-radius:4px}
1540
+ .blu-text__action{display:inline-flex;align-items:center;justify-content:center;border:0;border-radius:4px;background:transparent;color:var(--bluui-primary,#4f46e5);font:inherit;font-size:12px;font-weight:600;min-width:26px;min-height:30px;cursor:pointer;white-space:nowrap;padding:3px}
1541
+ .blu-text__action:hover{background:var(--bluui-hover,#f0f2f7)}
1542
+ .blu-field button:focus-visible,.blu-table button:focus-visible,.blu-table__scroll:focus-visible{outline:2px solid var(--bluui-primary,#4f46e5);outline-offset:3px}
1543
+ .blu-textarea{display:block;width:100%;min-height:var(--blu-field-height);padding:10px var(--blu-field-padding);font:inherit;line-height:1.6}
1544
+ .blu-field[data-invalid=true] .blu-text,.blu-field[data-invalid=true] .blu-textarea,.blu-field[data-invalid=true] .blu-select__trigger{border-color:var(--bluui-color-error-text,#b42318)}
1545
+ .blu-field[data-disabled=true]{opacity:.6}.blu-field input:disabled,.blu-field textarea:disabled,.blu-field button:disabled{cursor:not-allowed}
1546
+ .blu-field input[readonly],.blu-field textarea[readonly]{cursor:default}
1547
+ .blu-choice{display:flex;align-items:center;position:relative;gap:10px;min-height:32px;cursor:pointer;line-height:1.5}.blu-choice__input{position:absolute;inline-size:1px;block-size:1px;clip-path:inset(50%);overflow:hidden;white-space:nowrap;opacity:0}
1548
+ .blu-choice__mark{display:inline-flex;flex-shrink:0;align-items:center;justify-content:center;width:19px;height:19px;border:1.5px solid var(--bluui-control-border,#7b8799);border-radius:5px;background:var(--bluui-surface,#fff);color:var(--bluui-on-primary,#fff)}
1549
+ .blu-choice__input:checked+.blu-choice__mark,.blu-choice__input:indeterminate+.blu-choice__mark{background:var(--bluui-primary,#4f46e5);border-color:var(--bluui-primary,#4f46e5)}
1550
+ .blu-choice--checkbox .blu-choice__input:checked+.blu-choice__mark:after{content:'';width:5px;height:9px;border:solid currentColor;border-width:0 2px 2px 0;transform:translateY(-1px) rotate(45deg)}
1551
+ .blu-choice__input:indeterminate+.blu-choice__mark:after{content:'';width:9px;height:2px;background:currentColor;transform:none;border:0}
1552
+ .blu-choice__input:focus-visible+.blu-choice__mark{outline:2px solid var(--bluui-primary,#4f46e5);outline-offset:3px}
1553
+ .blu-choice:has(input:disabled){opacity:.6;cursor:not-allowed}.blu-field[data-disabled=true] .blu-choice:has(input:disabled){opacity:1}
1554
+ .blu-choice--radio .blu-choice__mark{border-radius:50%}.blu-choice--radio .blu-choice__input:checked+.blu-choice__mark:after{content:'';width:7px;height:7px;border-radius:50%;background:currentColor}
1555
+ .blu-choice--switch .blu-choice__mark{width:38px;height:22px;border-radius:20px;background:var(--bluui-control-border,#7b8799);padding:2px;justify-content:flex-start}
1556
+ .blu-choice--switch .blu-choice__mark:after{content:'';height:16px;width:16px;background:#fff;border-radius:50%;transition:transform .15s}
1557
+ .blu-choice--switch .blu-choice__input:checked+.blu-choice__mark:after{transform:translateX(14px)}.blu-choice--switch .blu-choice__input:checked+.blu-choice__mark{background:var(--bluui-primary,#4f46e5)}
1558
+ .blu-choice__state{margin-inline-start:auto;font-size:12px;color:var(--bluui-text-muted,#5c6b80)}.blu-choice__description{display:block}
1559
+ .blu-radio-group{display:flex;flex-direction:column;gap:10px}.blu-radio-group--horizontal{flex-direction:row;flex-wrap:wrap;gap:12px 24px}
1560
+ .blu-select{position:relative;display:flex;gap:5px}.blu-select__native{position:absolute;width:1px;height:1px;opacity:0;clip-path:inset(50%);pointer-events:none}
1561
+ .blu-select__trigger{display:flex;align-items:center;justify-content:space-between;gap:10px;min-width:0;min-height:var(--blu-field-height);width:100%;padding:9px var(--blu-field-padding);font:inherit;text-align:start;cursor:pointer}
1562
+ .blu-select__trigger:after{content:'';width:7px;height:7px;border:solid currentColor;border-width:0 1.5px 1.5px 0;transform:translateY(-2px) rotate(45deg);flex-shrink:0}.blu-select__trigger[data-placeholder=true]{color:var(--bluui-text-muted,#5c6b80)}
1563
+ .blu-select__popup{box-sizing:border-box;position:absolute;inset:calc(100% + 6px) 0 auto;z-index:1000;max-height:320px;overflow:auto;margin:0;padding:6px;border:1px solid var(--bluui-border-strong,#b8c4d4);border-radius:10px;background:var(--bluui-surface,#fff);box-shadow:var(--bluui-menu-shadow,0 10px 30px #17203326);color:var(--bluui-text,#182230);font:inherit}
1564
+ .blu-select__search{width:100%;min-height:38px;padding:8px 10px;border:1px solid var(--bluui-control-border,#7b8799);border-radius:6px;background:var(--bluui-surface,#fff);color:inherit;font:inherit;margin-bottom:5px;outline-offset:2px}
1565
+ .blu-select__option{padding:9px 10px;border-radius:5px;cursor:pointer;line-height:1.5}.blu-select__option[aria-selected=true]{font-weight:600;color:var(--bluui-primary,#4f46e5)}.blu-select__option[data-active=true]{background:var(--bluui-selected,#e9e6ff)}.blu-select__option[aria-disabled=true]{opacity:.5;cursor:not-allowed}
1566
+ .blu-columns{display:grid;grid-template-columns:var(--blu-columns-tracks,1fr 1fr);gap:var(--blu-columns-gap,24px)}.blu-columns__column{min-width:0;display:flex;flex-direction:column;gap:20px}
1567
+ @media(max-width:479px){.blu-columns--stack-small{grid-template-columns:minmax(0,1fr)}}
1568
+ @media(max-width:767px){.blu-columns--stack-medium{grid-template-columns:minmax(0,1fr)}}
1569
+ @media(max-width:1023px){.blu-columns--stack-large{grid-template-columns:minmax(0,1fr)}}
1570
+ .blu-table{border:1px solid var(--bluui-border,#e2e8f0);border-radius:12px;background:var(--bluui-surface,#fff);overflow:hidden}
1571
+ .blu-table__scroll{overflow:auto}.blu-table table{width:100%;border-collapse:collapse;font:inherit;text-align:start}.blu-table caption{text-align:start;padding:18px;font-weight:600;font-size:15px}
1572
+ .blu-table th{font-size:12px;color:var(--bluui-text-muted,#5c6b80);background:var(--bluui-surface-muted,#f7f8fb);font-weight:600;white-space:nowrap}
1573
+ .blu-table th,.blu-table td{padding:14px 18px;border-top:1px solid var(--bluui-border,#e2e8f0);line-height:1.5}
1574
+ .blu-table[data-density=Compact] th,.blu-table[data-density=Compact] td{padding:8px 12px}
1575
+ .blu-table[data-striped=true] tbody tr:nth-child(even){background:var(--bluui-surface-muted,#f7f8fb)}
1576
+ .blu-table__sort{font:inherit;font-weight:600;color:inherit;background:transparent;border:0;padding:0;cursor:pointer;display:inline-flex;align-items:center;gap:12px}
1577
+ .blu-table__empty{text-align:center!important;height:140px;color:var(--bluui-text-muted,#5c6b80)}
1578
+ .blu-table__footer{display:flex;align-items:center;gap:8px;padding:12px 18px;border-top:1px solid var(--bluui-border,#e2e8f0);font-size:12px;flex-wrap:wrap}.blu-table__footer>span{margin-inline-end:auto;color:var(--bluui-text-muted,#5c6b80)}
1579
+ .blu-table-button{border:1px solid var(--bluui-border-strong,#b8c4d4);border-radius:6px;padding:6px 10px;background:var(--bluui-surface,#fff);font:inherit;font-size:12px;color:var(--bluui-text,#182230);cursor:pointer;min-height:30px;white-space:nowrap}.blu-table-button:hover{background:var(--bluui-hover,#f0f2f7)}.blu-table-button:disabled{opacity:.5;cursor:not-allowed}.blu-table__actions{display:flex;gap:6px}
1580
+ @media(prefers-reduced-motion:reduce){.blu-field *{transition:none!important}}
1581
+ @media(forced-colors:active){.blu-choice__mark{forced-color-adjust:none;border-color:ButtonText;background:Canvas;color:HighlightText}.blu-choice__input:checked+.blu-choice__mark,.blu-choice__input:indeterminate+.blu-choice__mark{background:Highlight;border-color:Highlight}.blu-select__option[data-active=true]{outline:2px solid Highlight}.blu-choice--switch .blu-choice__mark:after{background:ButtonText}.blu-choice--switch .blu-choice__input:checked+.blu-choice__mark:after{background:HighlightText}}
1582
+
1583
+ /* Equal height is row-scoped; stacked columns retain their content height. */
1584
+ .blu-columns.blu-columns--equal-height{align-items:stretch}
1585
+ .blu-columns--equal-height > .blu-columns__column > :only-child{flex:1 1 auto}
1586
+ .blu-columns--equal-height > .blu-columns__column > [data-placeholder]{display:flex;flex-direction:column}
1587
+ .blu-columns--equal-height > .blu-columns__column > [data-placeholder] > :only-child{flex:1 1 auto}
package/dist/inputs.d.ts CHANGED
@@ -6,3 +6,11 @@ export * from './date-picker.js';
6
6
  export * from './time-picker.js';
7
7
  export * from './date-time-picker.js';
8
8
  export * from './date-range-picker.js';
9
+ export * from './checkbox.js';
10
+ export * from './text-input.js';
11
+ export * from './text-area.js';
12
+ export * from './radio-button.js';
13
+ export * from './radio-group.js';
14
+ export * from './switch.js';
15
+ export * from './select.js';
16
+ export * from './form-field.js';
package/dist/inputs.js CHANGED
@@ -1 +1 @@
1
- import{a as p}from"./chunk-XDYBNO4P.js";import{a as t}from"./chunk-2TCNAQC6.js";import{a as x}from"./chunk-CTLZIWMX.js";import{a as o}from"./chunk-C3CLLZH2.js";import{a as r}from"./chunk-4USJBOSC.js";import{a as e}from"./chunk-GEG3TNB4.js";import{a as f}from"./chunk-2MQNFEGJ.js";import{a as m}from"./chunk-MHHJZYXW.js";import"./chunk-O3MRWAI5.js";import"./chunk-MEEQNPGM.js";import"./chunk-5TEIXA4R.js";import"./chunk-SDMH2EVD.js";export{f as createCascader,m as createDatePicker,x as createDateRangePicker,t as createDateTimePicker,p as createTimePicker,e as createTransferList,o as createTreeSelect,r as createUploadManager};
1
+ import{a as f}from"./chunk-2MQNFEGJ.js";import"./chunk-KVOA55NE.js";import"./chunk-V4ZQLQ7L.js";import"./chunk-Y4AXWTAD.js";import"./chunk-WGSTNXAQ.js";import{a as o}from"./chunk-C3CLLZH2.js";import{a as r}from"./chunk-4USJBOSC.js";import{a as e}from"./chunk-GEG3TNB4.js";import{a as m}from"./chunk-2BSBXDOT.js";import{a as p}from"./chunk-EPPETNK6.js";import{a as t}from"./chunk-W3H7XTA7.js";import{a as x}from"./chunk-XVMJG26X.js";import"./chunk-O3MRWAI5.js";import"./chunk-MEEQNPGM.js";import"./chunk-5TEIXA4R.js";import{a as i}from"./chunk-MYVLBALF.js";import"./chunk-RYD6RHRX.js";import{a as j}from"./chunk-UN2SLVFG.js";import"./chunk-HO6CYWED.js";import"./chunk-RWBLICYX.js";import"./chunk-YCLR3IE3.js";import{a as g,b as h}from"./chunk-AL2ETLJV.js";import"./chunk-FNX33PDD.js";import"./chunk-IO22GWON.js";import"./chunk-EPZGLHPD.js";import{a,b,c,d}from"./chunk-TZSX4OTV.js";import"./chunk-EOKNLCNS.js";import"./chunk-SDMH2EVD.js";export{f as createCascader,a as createCheckbox,m as createDatePicker,x as createDateRangePicker,t as createDateTimePicker,j as createFormField,c as createRadioButton,d as createRadioGroup,i as createSelect,b as createSwitch,h as createTextArea,g as createTextInput,p as createTimePicker,e as createTransferList,o as createTreeSelect,r as createUploadManager};
package/dist/layout.css CHANGED
@@ -842,3 +842,66 @@ No If widget is needed; consumer content remains mounted with its state. */
842
842
  .blu-shape-mask__media .blu-common-slot--content>div {height:100%;}
843
843
  .blu-advanced-sr {position:absolute!important;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap;}
844
844
  @media(prefers-reduced-motion:reduce){.blu-shape-mask__media{animation:none!important;transition:none!important;}}
845
+
846
+ /* Community Form & Layout Essentials — local draft; no OutSystems UI selectors. */
847
+ .blu-field,.blu-columns,.blu-table{box-sizing:border-box;min-width:0;color:var(--bluui-text,#182230);font-family:var(--blu-font-family,Inter,system-ui,sans-serif);font-size:14px}
848
+ .blu-field *,.blu-columns *,.blu-table *{box-sizing:border-box}
849
+ .blu-field [hidden],.blu-table [hidden]{display:none!important}
850
+ .blu-field{--blu-field-height:42px;--blu-field-padding:12px;display:flex;flex-direction:column;gap:7px;border:0;padding:0;margin:0;min-inline-size:0}
851
+ .blu-field--small{--blu-field-height:34px;--blu-field-padding:9px;font-size:13px}.blu-field--large{--blu-field-height:50px;--blu-field-padding:15px;font-size:16px}
852
+ .blu-field__label{font-weight:600;line-height:1.5;padding:0;margin:0 0 2px}.blu-field__body{min-width:0}
853
+ .blu-field__help,.blu-choice__description,.blu-field__count{font-size:12px;color:var(--bluui-text-muted,#5c6b80);line-height:1.5}.blu-field__error{color:var(--bluui-color-error-text,#b42318);font-size:12px;line-height:1.5}.blu-field__count{text-align:end;margin-top:5px;font-variant-numeric:tabular-nums}
854
+ .blu-text,.blu-textarea,.blu-select__trigger{border:1px solid var(--bluui-control-border,#7b8799);border-radius:var(--blu-radius-md,8px);background:var(--bluui-surface,#fff);color:inherit;transition:border-color .12s,box-shadow .12s}
855
+ .blu-text{display:flex;align-items:center;gap:8px;min-height:var(--blu-field-height);padding:0 var(--blu-field-padding)}
856
+ .blu-text__input{width:100%;min-width:0;border:0!important;box-shadow:none!important;outline:none!important;background:transparent!important;color:inherit;padding:9px 0!important;font:inherit;line-height:1.5;height:auto}
857
+ .blu-text__input::placeholder,.blu-textarea::placeholder{color:var(--bluui-text-muted,#5c6b80);opacity:1}
858
+ .blu-text:focus-within,.blu-textarea:focus-visible,.blu-select__trigger:focus-visible{border-color:var(--bluui-primary,#4f46e5);outline:2px solid var(--bluui-primary,#4f46e5);outline-offset:2px}
859
+ .blu-text__adornment{display:inline-flex;flex:none;gap:6px;align-items:center;color:var(--bluui-text-muted,#5c6b80);white-space:nowrap}.blu-text__adornment img{width:24px;height:24px;object-fit:contain;border-radius:4px}
860
+ .blu-text__action{display:inline-flex;align-items:center;justify-content:center;border:0;border-radius:4px;background:transparent;color:var(--bluui-primary,#4f46e5);font:inherit;font-size:12px;font-weight:600;min-width:26px;min-height:30px;cursor:pointer;white-space:nowrap;padding:3px}
861
+ .blu-text__action:hover{background:var(--bluui-hover,#f0f2f7)}
862
+ .blu-field button:focus-visible,.blu-table button:focus-visible,.blu-table__scroll:focus-visible{outline:2px solid var(--bluui-primary,#4f46e5);outline-offset:3px}
863
+ .blu-textarea{display:block;width:100%;min-height:var(--blu-field-height);padding:10px var(--blu-field-padding);font:inherit;line-height:1.6}
864
+ .blu-field[data-invalid=true] .blu-text,.blu-field[data-invalid=true] .blu-textarea,.blu-field[data-invalid=true] .blu-select__trigger{border-color:var(--bluui-color-error-text,#b42318)}
865
+ .blu-field[data-disabled=true]{opacity:.6}.blu-field input:disabled,.blu-field textarea:disabled,.blu-field button:disabled{cursor:not-allowed}
866
+ .blu-field input[readonly],.blu-field textarea[readonly]{cursor:default}
867
+ .blu-choice{display:flex;align-items:center;position:relative;gap:10px;min-height:32px;cursor:pointer;line-height:1.5}.blu-choice__input{position:absolute;inline-size:1px;block-size:1px;clip-path:inset(50%);overflow:hidden;white-space:nowrap;opacity:0}
868
+ .blu-choice__mark{display:inline-flex;flex-shrink:0;align-items:center;justify-content:center;width:19px;height:19px;border:1.5px solid var(--bluui-control-border,#7b8799);border-radius:5px;background:var(--bluui-surface,#fff);color:var(--bluui-on-primary,#fff)}
869
+ .blu-choice__input:checked+.blu-choice__mark,.blu-choice__input:indeterminate+.blu-choice__mark{background:var(--bluui-primary,#4f46e5);border-color:var(--bluui-primary,#4f46e5)}
870
+ .blu-choice--checkbox .blu-choice__input:checked+.blu-choice__mark:after{content:'';width:5px;height:9px;border:solid currentColor;border-width:0 2px 2px 0;transform:translateY(-1px) rotate(45deg)}
871
+ .blu-choice__input:indeterminate+.blu-choice__mark:after{content:'';width:9px;height:2px;background:currentColor;transform:none;border:0}
872
+ .blu-choice__input:focus-visible+.blu-choice__mark{outline:2px solid var(--bluui-primary,#4f46e5);outline-offset:3px}
873
+ .blu-choice:has(input:disabled){opacity:.6;cursor:not-allowed}.blu-field[data-disabled=true] .blu-choice:has(input:disabled){opacity:1}
874
+ .blu-choice--radio .blu-choice__mark{border-radius:50%}.blu-choice--radio .blu-choice__input:checked+.blu-choice__mark:after{content:'';width:7px;height:7px;border-radius:50%;background:currentColor}
875
+ .blu-choice--switch .blu-choice__mark{width:38px;height:22px;border-radius:20px;background:var(--bluui-control-border,#7b8799);padding:2px;justify-content:flex-start}
876
+ .blu-choice--switch .blu-choice__mark:after{content:'';height:16px;width:16px;background:#fff;border-radius:50%;transition:transform .15s}
877
+ .blu-choice--switch .blu-choice__input:checked+.blu-choice__mark:after{transform:translateX(14px)}.blu-choice--switch .blu-choice__input:checked+.blu-choice__mark{background:var(--bluui-primary,#4f46e5)}
878
+ .blu-choice__state{margin-inline-start:auto;font-size:12px;color:var(--bluui-text-muted,#5c6b80)}.blu-choice__description{display:block}
879
+ .blu-radio-group{display:flex;flex-direction:column;gap:10px}.blu-radio-group--horizontal{flex-direction:row;flex-wrap:wrap;gap:12px 24px}
880
+ .blu-select{position:relative;display:flex;gap:5px}.blu-select__native{position:absolute;width:1px;height:1px;opacity:0;clip-path:inset(50%);pointer-events:none}
881
+ .blu-select__trigger{display:flex;align-items:center;justify-content:space-between;gap:10px;min-width:0;min-height:var(--blu-field-height);width:100%;padding:9px var(--blu-field-padding);font:inherit;text-align:start;cursor:pointer}
882
+ .blu-select__trigger:after{content:'';width:7px;height:7px;border:solid currentColor;border-width:0 1.5px 1.5px 0;transform:translateY(-2px) rotate(45deg);flex-shrink:0}.blu-select__trigger[data-placeholder=true]{color:var(--bluui-text-muted,#5c6b80)}
883
+ .blu-select__popup{box-sizing:border-box;position:absolute;inset:calc(100% + 6px) 0 auto;z-index:1000;max-height:320px;overflow:auto;margin:0;padding:6px;border:1px solid var(--bluui-border-strong,#b8c4d4);border-radius:10px;background:var(--bluui-surface,#fff);box-shadow:var(--bluui-menu-shadow,0 10px 30px #17203326);color:var(--bluui-text,#182230);font:inherit}
884
+ .blu-select__search{width:100%;min-height:38px;padding:8px 10px;border:1px solid var(--bluui-control-border,#7b8799);border-radius:6px;background:var(--bluui-surface,#fff);color:inherit;font:inherit;margin-bottom:5px;outline-offset:2px}
885
+ .blu-select__option{padding:9px 10px;border-radius:5px;cursor:pointer;line-height:1.5}.blu-select__option[aria-selected=true]{font-weight:600;color:var(--bluui-primary,#4f46e5)}.blu-select__option[data-active=true]{background:var(--bluui-selected,#e9e6ff)}.blu-select__option[aria-disabled=true]{opacity:.5;cursor:not-allowed}
886
+ .blu-columns{display:grid;grid-template-columns:var(--blu-columns-tracks,1fr 1fr);gap:var(--blu-columns-gap,24px)}.blu-columns__column{min-width:0;display:flex;flex-direction:column;gap:20px}
887
+ @media(max-width:479px){.blu-columns--stack-small{grid-template-columns:minmax(0,1fr)}}
888
+ @media(max-width:767px){.blu-columns--stack-medium{grid-template-columns:minmax(0,1fr)}}
889
+ @media(max-width:1023px){.blu-columns--stack-large{grid-template-columns:minmax(0,1fr)}}
890
+ .blu-table{border:1px solid var(--bluui-border,#e2e8f0);border-radius:12px;background:var(--bluui-surface,#fff);overflow:hidden}
891
+ .blu-table__scroll{overflow:auto}.blu-table table{width:100%;border-collapse:collapse;font:inherit;text-align:start}.blu-table caption{text-align:start;padding:18px;font-weight:600;font-size:15px}
892
+ .blu-table th{font-size:12px;color:var(--bluui-text-muted,#5c6b80);background:var(--bluui-surface-muted,#f7f8fb);font-weight:600;white-space:nowrap}
893
+ .blu-table th,.blu-table td{padding:14px 18px;border-top:1px solid var(--bluui-border,#e2e8f0);line-height:1.5}
894
+ .blu-table[data-density=Compact] th,.blu-table[data-density=Compact] td{padding:8px 12px}
895
+ .blu-table[data-striped=true] tbody tr:nth-child(even){background:var(--bluui-surface-muted,#f7f8fb)}
896
+ .blu-table__sort{font:inherit;font-weight:600;color:inherit;background:transparent;border:0;padding:0;cursor:pointer;display:inline-flex;align-items:center;gap:12px}
897
+ .blu-table__empty{text-align:center!important;height:140px;color:var(--bluui-text-muted,#5c6b80)}
898
+ .blu-table__footer{display:flex;align-items:center;gap:8px;padding:12px 18px;border-top:1px solid var(--bluui-border,#e2e8f0);font-size:12px;flex-wrap:wrap}.blu-table__footer>span{margin-inline-end:auto;color:var(--bluui-text-muted,#5c6b80)}
899
+ .blu-table-button{border:1px solid var(--bluui-border-strong,#b8c4d4);border-radius:6px;padding:6px 10px;background:var(--bluui-surface,#fff);font:inherit;font-size:12px;color:var(--bluui-text,#182230);cursor:pointer;min-height:30px;white-space:nowrap}.blu-table-button:hover{background:var(--bluui-hover,#f0f2f7)}.blu-table-button:disabled{opacity:.5;cursor:not-allowed}.blu-table__actions{display:flex;gap:6px}
900
+ @media(prefers-reduced-motion:reduce){.blu-field *{transition:none!important}}
901
+ @media(forced-colors:active){.blu-choice__mark{forced-color-adjust:none;border-color:ButtonText;background:Canvas;color:HighlightText}.blu-choice__input:checked+.blu-choice__mark,.blu-choice__input:indeterminate+.blu-choice__mark{background:Highlight;border-color:Highlight}.blu-select__option[data-active=true]{outline:2px solid Highlight}.blu-choice--switch .blu-choice__mark:after{background:ButtonText}.blu-choice--switch .blu-choice__input:checked+.blu-choice__mark:after{background:HighlightText}}
902
+
903
+ /* Equal height is row-scoped; stacked columns retain their content height. */
904
+ .blu-columns.blu-columns--equal-height{align-items:stretch}
905
+ .blu-columns--equal-height > .blu-columns__column > :only-child{flex:1 1 auto}
906
+ .blu-columns--equal-height > .blu-columns__column > [data-placeholder]{display:flex;flex-direction:column}
907
+ .blu-columns--equal-height > .blu-columns__column > [data-placeholder] > :only-child{flex:1 1 auto}
package/dist/layout.d.ts CHANGED
@@ -6,3 +6,6 @@ export * from './splitter.js';
6
6
  export * from './app-layout.js';
7
7
  export * from './page-layout.js';
8
8
  export * from './shape-mask.js';
9
+ export * from './columns2.js';
10
+ export * from './columns3.js';
11
+ export * from './columns4.js';
package/dist/layout.js CHANGED
@@ -1 +1 @@
1
- import{a as p}from"./chunk-XIOI5PKM.js";import{a as t}from"./chunk-Y4TCT2K6.js";import{a as x}from"./chunk-3LWXPCWY.js";import"./chunk-MSMNEIWA.js";import{a as r}from"./chunk-U73BNLZ3.js";import{a as e}from"./chunk-LJ4O6YTN.js";import{a as f}from"./chunk-SIU7DSOA.js";import{a as m}from"./chunk-K2P2BHV5.js";import{f as o}from"./chunk-O3MRWAI5.js";import"./chunk-MEEQNPGM.js";import"./chunk-5TEIXA4R.js";import"./chunk-SDMH2EVD.js";export{p as createAppLayout,r as createBreadcrumbs,o as createCard,e as createPageHeader,t as createPageLayout,x as createShapeMask,f as createSidebar,m as createSplitter};
1
+ import"./chunk-7CEOCZ5L.js";import{a as m}from"./chunk-K2P2BHV5.js";import{a as p}from"./chunk-XIOI5PKM.js";import{a as t}from"./chunk-Y4TCT2K6.js";import{a as x}from"./chunk-3LWXPCWY.js";import"./chunk-MSMNEIWA.js";import{a as r}from"./chunk-U73BNLZ3.js";import{a as e}from"./chunk-LJ4O6YTN.js";import{a as f}from"./chunk-KBWB4OIF.js";import{f as o}from"./chunk-O3MRWAI5.js";import"./chunk-MEEQNPGM.js";import"./chunk-5TEIXA4R.js";import"./chunk-BN3PDE5G.js";import"./chunk-VJVFHL6P.js";import"./chunk-IJ62ILKE.js";import{b as a,c as b,d as c}from"./chunk-UN2SLVFG.js";import"./chunk-EOKNLCNS.js";import"./chunk-SDMH2EVD.js";export{p as createAppLayout,r as createBreadcrumbs,o as createCard,a as createColumns2,b as createColumns3,c as createColumns4,e as createPageHeader,t as createPageLayout,x as createShapeMask,f as createSidebar,m as createSplitter};
package/dist/modal.js CHANGED
@@ -1 +1 @@
1
- import{a}from"./chunk-6EHKOVZK.js";import"./chunk-MEEQNPGM.js";import"./chunk-5TEIXA4R.js";import"./chunk-SDMH2EVD.js";export{a as createModal};
1
+ import"./chunk-DRZM2AL3.js";import{a}from"./chunk-HVR2UDFX.js";import"./chunk-MEEQNPGM.js";import"./chunk-5TEIXA4R.js";import"./chunk-SDMH2EVD.js";export{a as createModal};
@@ -0,0 +1,14 @@
1
+ import type { MotionController } from './controller.js';
2
+ export interface ActionMessages {
3
+ pending: string;
4
+ success: string;
5
+ error: string;
6
+ }
7
+ export type ActionResult = 'success' | 'error' | 'busy' | 'cancelled';
8
+ /** Feedback follows an actual action promise. No simulated success, timed reset,
9
+ * duplicated live region or overlapping action. The caller owns data and controls. */
10
+ export declare function createActionFeedback(status: HTMLElement, motion: MotionController): {
11
+ readonly pending: boolean;
12
+ run(action: () => unknown | Promise<unknown>, messages: ActionMessages): Promise<ActionResult>;
13
+ destroy(): void;
14
+ };
@@ -0,0 +1,12 @@
1
+ export interface BorderGlowOptions {
2
+ /** One slow circuit in milliseconds, 4–60 seconds. Default: 12 seconds. */
3
+ duration?: number;
4
+ paused?: boolean;
5
+ }
6
+ /** Decorative, noninteractive border only. CSS honors the motion scope and OS.
7
+ * Pause automatically while outside the viewport or in a hidden document. */
8
+ export declare function createBorderGlow(element: HTMLElement, options?: BorderGlowOptions): {
9
+ element: HTMLSpanElement;
10
+ update(next: BorderGlowOptions): void;
11
+ destroy(): void;
12
+ };
@@ -0,0 +1,11 @@
1
+ import type { ButtonOptions, ButtonEvents, Component } from '../types.js';
2
+ /** Draft web API; deliberately separate from the shared native Button until review. */
3
+ export interface MotionButtonOptions extends ButtonOptions {
4
+ LoadingLabel?: string;
5
+ SpinnerPosition?: 'Leading' | 'Trailing';
6
+ /** Reserve space for known result labels to avoid shifting surrounding controls. */
7
+ ReserveLabels?: string[];
8
+ /** App-owned completion/failure message, announced outside the busy button. */
9
+ StatusText?: string;
10
+ }
11
+ export declare function createMotionButton(host: HTMLElement, initial: MotionButtonOptions, events?: ButtonEvents): Component<MotionButtonOptions>;
@@ -0,0 +1,51 @@
1
+ import type { MotionEasing } from './effects.js';
2
+ import type { MotionController, MotionMode, MotionOptions, MotionTarget } from './controller.js';
3
+ /** Local 1.2 component contract. Omitted values inherit collection defaults. */
4
+ export interface ComponentMotionSettings {
5
+ mode?: 'inherit' | 'reduced' | 'off';
6
+ /** Override finite component transitions. Does not change spinner speed. Zero is instant. */
7
+ duration?: number;
8
+ easing?: MotionEasing;
9
+ }
10
+ export interface ComponentMotionHandle {
11
+ /** Replace this component's overrides; omit settings to inherit again. */
12
+ setMotion(settings?: ComponentMotionSettings): void;
13
+ }
14
+ export declare function validateComponentMotion(settings: ComponentMotionSettings): ComponentMotionSettings;
15
+ /** Shared presentation state for WAAPI adapters and chart engines. */
16
+ export declare function createComponentMotionState(root: HTMLElement, parent: {
17
+ readonly mode: MotionMode;
18
+ }, initial?: ComponentMotionSettings): {
19
+ mode: () => MotionMode;
20
+ resolveOptions: (options?: MotionOptions) => MotionOptions;
21
+ readonly settings: {
22
+ mode?: "inherit" | "reduced" | "off";
23
+ /** Override finite component transitions. Does not change spinner speed. Zero is instant. */
24
+ duration?: number;
25
+ easing?: MotionEasing;
26
+ };
27
+ update(next: ComponentMotionSettings): void;
28
+ destroy(): void;
29
+ };
30
+ /** Minimal controller contract also usable from a native lifecycle adapter. */
31
+ export interface TransitionMotion {
32
+ readonly mode: MotionMode;
33
+ animate(target: MotionTarget, frames: Keyframe[], options: {
34
+ duration: number;
35
+ easing?: MotionEasing;
36
+ }, reduced?: 'fade' | 'instant'): Promise<unknown>;
37
+ cancel(target: MotionTarget): void;
38
+ }
39
+ export declare function createTransitionMotionScope(root: HTMLElement, parent: TransitionMotion, initial?: ComponentMotionSettings): {
40
+ motion: TransitionMotion;
41
+ update(next: ComponentMotionSettings): void;
42
+ destroy(): void;
43
+ };
44
+ /** An owned view of a shared controller, including portal exit decorations.
45
+ * No second system-preference listener or component event interception is needed.
46
+ */
47
+ export declare function createComponentMotionScope(root: HTMLElement, parent: MotionController, initial?: ComponentMotionSettings): {
48
+ motion: MotionController;
49
+ update: (next: ComponentMotionSettings) => void;
50
+ destroy: () => void;
51
+ };
@@ -0,0 +1,33 @@
1
+ import type { MotionEffect, MotionPhase, MotionEasing, MotionOrigin } from './effects.js';
2
+ export type { MotionEffect, MotionPhase, MotionEasing } from './effects.js';
3
+ export type MotionPreference = 'system' | 'reduced' | 'off';
4
+ export type MotionMode = 'full' | 'reduced' | 'off';
5
+ export type MotionResult = 'finished' | 'cancelled';
6
+ export type MotionTarget = HTMLElement | SVGElement;
7
+ export interface MotionOptions {
8
+ phase?: MotionPhase;
9
+ duration?: number;
10
+ delay?: number;
11
+ easing?: MotionEasing;
12
+ /** Scale/rotation anchor. Does not move or position the target itself. */
13
+ origin?: MotionOrigin;
14
+ }
15
+ export interface MotionController {
16
+ readonly mode: MotionMode;
17
+ readonly preference: MotionPreference;
18
+ setPreference(preference: MotionPreference): void;
19
+ /** Component-scoped timing resolver, used by bounded visual-cleanup deadlines. */
20
+ resolveOptions?(options?: MotionOptions): MotionOptions;
21
+ play(element: HTMLElement, effect?: MotionEffect, options?: MotionOptions): Promise<MotionResult>;
22
+ /** Custom frames use instant reduced motion unless a fade is explicitly requested. */
23
+ animate(element: MotionTarget, frames: Keyframe[], options?: MotionOptions, reduced?: 'instant' | 'fade'): Promise<MotionResult>;
24
+ /** Numeric interpolation shares cancellation and preference handling with other effects. */
25
+ tween(element: MotionTarget, from: number, to: number, render: (value: number) => void, options?: MotionOptions): Promise<MotionResult>;
26
+ cancel(element: MotionTarget): void;
27
+ destroy(): void;
28
+ }
29
+ export declare function resolveMotionMode(preference: MotionPreference, systemReduced: boolean): MotionMode;
30
+ export declare function boundedTime(value: number | undefined, fallback: number, maximum?: number): number;
31
+ export declare function createMotionController(scope: HTMLElement, initial?: MotionPreference): MotionController;
32
+ /** Solve cubic-bezier x before sampling y, so numeric motion matches CSS timing. */
33
+ export declare function easeProgress(progress: number, easing: MotionEasing): number;
@@ -0,0 +1,30 @@
1
+ /** Shared preset definitions: used by the controller and the CSS generator. */
2
+ export declare const motionEffects: readonly ["fade", "slide-up", "slide-down", "slide-left", "slide-right", "zoom-in", "zoom-out", "rotate-left", "rotate-right", "flip-x", "flip-y", "pop", "bounce", "wipe-up", "wipe-down", "wipe-left", "wipe-right", "circle-reveal", "blur-clear"];
3
+ export declare const motionOrigins: {
4
+ readonly center: "50% 50%";
5
+ readonly top: "50% 0%";
6
+ readonly bottom: "50% 100%";
7
+ readonly left: "0% 50%";
8
+ readonly right: "100% 50%";
9
+ readonly 'top-left': "0% 0%";
10
+ readonly 'top-right': "100% 0%";
11
+ readonly 'bottom-left': "0% 100%";
12
+ readonly 'bottom-right': "100% 100%";
13
+ };
14
+ export type MotionOrigin = keyof typeof motionOrigins;
15
+ export type MotionPreset = typeof motionEffects[number];
16
+ export type MotionEffect = MotionPreset | 'scale';
17
+ export type MotionPhase = 'enter' | 'exit';
18
+ export declare const motionEasings: {
19
+ readonly standard: "cubic-bezier(.2,.8,.2,1)";
20
+ readonly 'ease-in': "cubic-bezier(.42,0,1,1)";
21
+ readonly 'ease-out': "cubic-bezier(0,0,.58,1)";
22
+ readonly 'ease-in-out': "cubic-bezier(.42,0,.58,1)";
23
+ readonly linear: "linear";
24
+ readonly spring: "cubic-bezier(.34,1.25,.64,1)";
25
+ };
26
+ export type MotionEasing = keyof typeof motionEasings;
27
+ /** Names describe movement: slide-left enters from the right and exits toward the left. */
28
+ export declare function motionFrames(effect: MotionEffect, phase?: MotionPhase, distance?: string): Keyframe[];
29
+ export declare function motionClass(effect: MotionPreset, phase?: MotionPhase): string;
30
+ export declare function motionEasingClass(easing: MotionEasing): string;
@@ -0,0 +1,6 @@
1
+ import type { MotionController, MotionOptions } from './controller.js';
2
+ export declare function playFeedback(element: HTMLElement, motion: MotionController, effect: 'highlight' | 'nudge', options?: MotionOptions): Promise<import("./controller.js").MotionResult>;
3
+ /** Decorative feedback only: does not call click, prevent native activation, or alter button state. */
4
+ export declare function createPressFeedback(element: HTMLElement, motion: MotionController): {
5
+ destroy(): void;
6
+ };
@@ -0,0 +1,9 @@
1
+ import type { Component } from '../types.js';
2
+ export interface LoadingIndicatorOptions {
3
+ Label: string;
4
+ Variant?: 'Spinner' | 'Dots' | 'Bar';
5
+ /** Real completion percentage, 0–100. Omit when the amount of work is unknown. */
6
+ Progress?: number;
7
+ }
8
+ export declare function normalizeProgress(value: number | undefined): number | undefined;
9
+ export declare function createLoadingIndicator(host: HTMLElement, initial: LoadingIndicatorOptions): Component<LoadingIndicatorOptions>;
@@ -0,0 +1,35 @@
1
+ import type { MotionController, MotionOptions, MotionResult } from './controller.js';
2
+ /** Responds to an actual click; never synthesizes activation or changes focus. */
3
+ export declare function createRipple(element: HTMLElement, motion: MotionController, options?: MotionOptions & {
4
+ listen?: boolean;
5
+ }): {
6
+ element: HTMLSpanElement;
7
+ play: (point?: {
8
+ clientX: number;
9
+ clientY: number;
10
+ }) => void;
11
+ destroy(): void;
12
+ };
13
+ export interface ShimmerOptions {
14
+ duration?: number;
15
+ paused?: boolean;
16
+ }
17
+ /** Attach to a decorative skeleton only. The caller owns busy/status semantics. */
18
+ export declare function createShimmer(element: HTMLElement, options?: ShimmerOptions): {
19
+ element: HTMLSpanElement;
20
+ update(next: ShimmerOptions): void;
21
+ destroy(): void;
22
+ };
23
+ export type MotionIcon = 'chevron' | 'plus-minus' | 'menu-close' | 'save-check';
24
+ /** Owns an empty decorative icon slot only. Labels and aria-expanded/pressed belong to the control. */
25
+ export declare function createIconTransition(host: HTMLElement, motion: MotionController, kind: MotionIcon, initial?: boolean): {
26
+ element: SVGSVGElement;
27
+ setActive(next: boolean, options?: MotionOptions): Promise<MotionResult>;
28
+ destroy(): void;
29
+ };
30
+ /** Persistent selection decoration; never replaces a focus outline. */
31
+ export declare function createEmphasis(element: HTMLElement, motion: MotionController, kind?: 'underline' | 'border'): {
32
+ element: HTMLSpanElement;
33
+ setActive(next: boolean, options?: MotionOptions): Promise<MotionResult>;
34
+ destroy(): void;
35
+ };
@@ -0,0 +1,7 @@
1
+ import type { MotionController, MotionResult } from './controller.js';
2
+ import { type TransitionOptions } from './structure.js';
3
+ /** A persistent crop change inside an overflow-hidden frame; does not fade the photo away. */
4
+ export declare function createPhotoZoom(image: HTMLImageElement, motion: MotionController, maximum?: number): {
5
+ setZoomed(zoomed: boolean, options?: TransitionOptions): Promise<MotionResult>;
6
+ destroy(): void;
7
+ };
@@ -0,0 +1,12 @@
1
+ import type { MotionController, MotionEffect, MotionOptions, MotionResult } from './controller.js';
2
+ export interface PresenceOptions extends Omit<MotionOptions, 'phase'> {
3
+ effect?: MotionEffect;
4
+ /** Required when hiding an element that currently contains keyboard focus. */
5
+ focusFallback?: HTMLElement;
6
+ }
7
+ /** Owns hidden/inert for a mounted element. Use for panels, cards and menus; no router dependency. */
8
+ export declare function createMotionPresence(element: HTMLElement, motion: MotionController): {
9
+ show(options?: PresenceOptions): Promise<MotionResult>;
10
+ hide(options?: PresenceOptions): Promise<MotionResult>;
11
+ destroy(): void;
12
+ };
@@ -0,0 +1,10 @@
1
+ import type { MotionController, MotionResult } from './controller.js';
2
+ import { type TransitionOptions } from './structure.js';
3
+ export declare function createCrossfade(host: HTMLElement, motion: MotionController): {
4
+ show(next: HTMLElement, options?: TransitionOptions): Promise<MotionResult>;
5
+ destroy(): void;
6
+ };
7
+ export declare function createSharedElementTransition(host: HTMLElement, motion: MotionController): {
8
+ show(next: HTMLElement, options?: TransitionOptions): Promise<MotionResult>;
9
+ destroy(): void;
10
+ };
@@ -0,0 +1,6 @@
1
+ import type { MotionController, MotionResult } from './controller.js';
2
+ /** Enhance an already-rendered container. The host owns visibility, DOM and navigation. */
3
+ export declare function createScreenMotion(scope: HTMLElement, motion: MotionController): {
4
+ enter(element: HTMLElement, key: string): Promise<MotionResult>;
5
+ destroy(): void;
6
+ };