q2-tecton-elements 1.69.1 → 1.70.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 (273) hide show
  1. package/dist/bundle-report.json +2246 -355
  2. package/dist/cjs/click-elsewhere_3.cjs.entry.js +2 -2
  3. package/dist/cjs/{index-D2LFCsNP.js → index-SpDCZABA.js} +2 -2
  4. package/dist/cjs/loader.cjs.js +1 -1
  5. package/dist/cjs/q2-action-group_2.cjs.entry.js +1 -1
  6. package/dist/cjs/q2-action-sheet.cjs.entry.js +2 -2
  7. package/dist/cjs/q2-badge_2.cjs.entry.js +11 -4
  8. package/dist/cjs/q2-btn_2.cjs.entry.js +6 -2
  9. package/dist/cjs/q2-calendar.cjs.entry.js +5 -3
  10. package/dist/cjs/q2-card-image.cjs.entry.js +8 -6
  11. package/dist/cjs/q2-card.cjs.entry.js +2 -2
  12. package/dist/cjs/q2-carousel-pane.cjs.entry.js +1 -1
  13. package/dist/cjs/q2-carousel.cjs.entry.js +1 -1
  14. package/dist/cjs/q2-chart-area.cjs.entry.js +1 -1
  15. package/dist/cjs/q2-chart-bar.cjs.entry.js +1 -1
  16. package/dist/cjs/q2-chart-donut.cjs.entry.js +2 -2
  17. package/dist/cjs/q2-checkbox-group.cjs.entry.js +1 -1
  18. package/dist/cjs/q2-checkbox_2.cjs.entry.js +4 -3
  19. package/dist/cjs/q2-context.cjs.entry.js +1 -1
  20. package/dist/cjs/q2-currency.cjs.entry.js +1 -1
  21. package/dist/cjs/q2-data-table.cjs.entry.js +6 -3
  22. package/dist/cjs/q2-detail.cjs.entry.js +2 -2
  23. package/dist/cjs/q2-dropdown-item.cjs.entry.js +1 -1
  24. package/dist/cjs/q2-dropdown.cjs.entry.js +3 -3
  25. package/dist/cjs/q2-editable-field.cjs.entry.js +12 -4
  26. package/dist/cjs/q2-file-picker.cjs.entry.js +1 -1
  27. package/dist/cjs/q2-icon.cjs.entry.js +1 -1
  28. package/dist/cjs/q2-item.cjs.entry.js +2 -2
  29. package/dist/cjs/q2-legend.cjs.entry.js +1 -1
  30. package/dist/cjs/q2-link_2.cjs.entry.js +2 -2
  31. package/dist/cjs/q2-loc.cjs.entry.js +20 -2
  32. package/dist/cjs/q2-message.cjs.entry.js +1 -1
  33. package/dist/cjs/q2-meter.cjs.entry.js +2 -2
  34. package/dist/cjs/q2-modal.cjs.entry.js +3 -3
  35. package/dist/cjs/q2-month-picker.cjs.entry.js +1 -1
  36. package/dist/cjs/q2-optgroup.cjs.entry.js +1 -1
  37. package/dist/cjs/q2-option.cjs.entry.js +1 -1
  38. package/dist/cjs/q2-otp.cjs.entry.js +1 -1
  39. package/dist/cjs/q2-pagination.cjs.entry.js +1 -1
  40. package/dist/cjs/q2-pill.cjs.entry.js +1 -1
  41. package/dist/cjs/q2-radio-group.cjs.entry.js +1 -1
  42. package/dist/cjs/q2-radio.cjs.entry.js +1 -1
  43. package/dist/cjs/q2-relative-time.cjs.entry.js +1 -1
  44. package/dist/cjs/q2-search.cjs.entry.js +101 -12
  45. package/dist/cjs/q2-section.cjs.entry.js +2 -2
  46. package/dist/cjs/q2-select.cjs.entry.js +36 -6
  47. package/dist/cjs/q2-stepper-pane.cjs.entry.js +1 -1
  48. package/dist/cjs/q2-stepper-vertical.cjs.entry.js +24 -18
  49. package/dist/cjs/q2-stepper.cjs.entry.js +5 -4
  50. package/dist/cjs/q2-surface.cjs.entry.js +95 -0
  51. package/dist/cjs/q2-tab-container.cjs.entry.js +2 -2
  52. package/dist/cjs/q2-tab-pane.cjs.entry.js +1 -1
  53. package/dist/cjs/q2-tecton-elements.cjs.js +1 -1
  54. package/dist/cjs/q2-textarea.cjs.entry.js +1 -1
  55. package/dist/cjs/q2-toast.cjs.entry.js +1 -1
  56. package/dist/cjs/q2-tooltip.cjs.entry.js +1 -1
  57. package/dist/cjs/tecton-tab-pane.cjs.entry.js +2 -2
  58. package/dist/collection/collection-manifest.json +1 -0
  59. package/dist/collection/components/q2-action-sheet/q2-action-sheet.css +1 -1
  60. package/dist/collection/components/q2-btn/q2-btn.css +32 -17
  61. package/dist/collection/components/q2-btn/q2-btn.js +6 -1
  62. package/dist/collection/components/q2-calendar/q2-calendar.js +24 -2
  63. package/dist/collection/components/q2-calendar/test/q2-calendar-test.vr.js +4 -0
  64. package/dist/collection/components/q2-card/q2-card.css +2 -2
  65. package/dist/collection/components/q2-card-image/q2-card-image.css +3 -0
  66. package/dist/collection/components/q2-card-image/q2-card-image.js +25 -23
  67. package/dist/collection/components/q2-chart-area/q2-chart-area.css +4 -0
  68. package/dist/collection/components/q2-chart-bar/q2-chart-bar.css +4 -0
  69. package/dist/collection/components/q2-chart-donut/q2-chart-donut.css +1 -1
  70. package/dist/collection/components/q2-checkbox/q2-checkbox.js +2 -1
  71. package/dist/collection/components/q2-currency/q2-currency.css +1 -1
  72. package/dist/collection/components/q2-data-table/q2-data-table.js +5 -2
  73. package/dist/collection/components/q2-detail/q2-detail.css +12 -12
  74. package/dist/collection/components/q2-dropdown/q2-dropdown.js +2 -2
  75. package/dist/collection/components/q2-editable-field/q2-editable-field.js +11 -3
  76. package/dist/collection/components/q2-input/q2-input.css +11 -1
  77. package/dist/collection/components/q2-input/q2-input.js +29 -2
  78. package/dist/collection/components/q2-input/test/q2-input-test.vr.js +8 -0
  79. package/dist/collection/components/q2-item/q2-item.css +10 -5
  80. package/dist/collection/components/q2-item/test/q2-item-test.vr.js +132 -0
  81. package/dist/collection/components/q2-legend/q2-legend.css +2 -2
  82. package/dist/collection/components/q2-list/q2-list.css +1 -1
  83. package/dist/collection/components/q2-loc/q2-loc.js +42 -1
  84. package/dist/collection/components/q2-message/q2-message.css +4 -0
  85. package/dist/collection/components/q2-meter/q2-meter.css +3 -3
  86. package/dist/collection/components/q2-modal/q2-modal.css +1 -1
  87. package/dist/collection/components/q2-modal/q2-modal.js +2 -2
  88. package/dist/collection/components/q2-otp/q2-otp.css +33 -0
  89. package/dist/collection/components/q2-otp/test/q2-otp-test.vr.js +83 -0
  90. package/dist/collection/components/q2-popover/q2-popover.css +2 -1
  91. package/dist/collection/components/q2-radio/q2-radio.css +2 -0
  92. package/dist/collection/components/q2-search/q2-search.css +30 -0
  93. package/dist/collection/components/q2-search/q2-search.js +99 -10
  94. package/dist/collection/components/q2-search/test/q2-search-test.vr.js +145 -0
  95. package/dist/collection/components/q2-section/q2-section.css +1 -1
  96. package/dist/collection/components/q2-select/q2-select.css +4 -2
  97. package/dist/collection/components/q2-select/q2-select.js +54 -4
  98. package/dist/collection/components/q2-select/test/q2-select-test.vr.js +5 -0
  99. package/dist/collection/components/q2-stepper/q2-stepper.css +2 -2
  100. package/dist/collection/components/q2-stepper/q2-stepper.js +3 -2
  101. package/dist/collection/components/q2-stepper-vertical/q2-stepper-vertical.css +2 -2
  102. package/dist/collection/components/q2-stepper-vertical/q2-stepper-vertical.js +22 -16
  103. package/dist/collection/components/q2-surface/q2-surface.css +348 -0
  104. package/dist/collection/components/q2-surface/q2-surface.js +381 -0
  105. package/dist/collection/components/q2-surface/test/q2-surface-test.vr.js +108 -0
  106. package/dist/collection/components/q2-tab-container/q2-tab-container.js +1 -1
  107. package/dist/collection/components/q2-tab-pane/q2-tab-pane.js +1 -1
  108. package/dist/collection/components/q2-tag/q2-tag.js +1 -1
  109. package/dist/collection/components/q2-toast/q2-toast.js +3 -1
  110. package/dist/collection/components/tecton-tab-pane/tecton-tab-pane.js +2 -2
  111. package/dist/collection/utils/index.js +2 -2
  112. package/dist/components/index.js +12 -10
  113. package/dist/components/index2.js +3 -3
  114. package/dist/components/q2-action-sheet.js +1 -1
  115. package/dist/components/q2-btn2.js +5 -1
  116. package/dist/components/q2-calendar.js +294 -290
  117. package/dist/components/q2-card-image.js +9 -6
  118. package/dist/components/q2-card.js +14 -14
  119. package/dist/components/q2-chart-donut.js +1 -1
  120. package/dist/components/q2-checkbox2.js +12 -12
  121. package/dist/components/q2-currency.js +1 -1
  122. package/dist/components/q2-data-table.js +4 -4
  123. package/dist/components/q2-detail.js +1 -1
  124. package/dist/components/q2-dropdown.js +8 -8
  125. package/dist/components/q2-editable-field.js +15 -5
  126. package/dist/components/q2-input2.js +46 -26
  127. package/dist/components/q2-item2.js +1 -1
  128. package/dist/components/q2-legend2.js +51 -51
  129. package/dist/components/q2-list2.js +1 -1
  130. package/dist/components/q2-loc.js +23 -8
  131. package/dist/components/q2-meter.js +10 -10
  132. package/dist/components/q2-modal.js +54 -54
  133. package/dist/components/q2-popover2.js +1 -1
  134. package/dist/components/q2-search.js +106 -51
  135. package/dist/components/q2-section.js +1 -1
  136. package/dist/components/q2-select2.js +25 -9
  137. package/dist/components/q2-stepper-vertical.js +72 -63
  138. package/dist/components/q2-stepper.js +73 -71
  139. package/dist/components/q2-surface.d.ts +11 -0
  140. package/dist/components/q2-surface.js +109 -0
  141. package/dist/components/q2-tab-container.js +12 -12
  142. package/dist/components/q2-tab-pane.js +6 -6
  143. package/dist/components/q2-tag2.js +5 -5
  144. package/dist/components/tecton-tab-pane.js +10 -10
  145. package/dist/esm/click-elsewhere_3.entry.js +2 -2
  146. package/dist/esm/{index-Bx4m6N0g.js → index-Cps4jSQM.js} +2 -2
  147. package/dist/esm/loader.js +1 -1
  148. package/dist/esm/q2-action-group_2.entry.js +1 -1
  149. package/dist/esm/q2-action-sheet.entry.js +2 -2
  150. package/dist/esm/q2-badge_2.entry.js +11 -4
  151. package/dist/esm/q2-btn_2.entry.js +6 -2
  152. package/dist/esm/q2-calendar.entry.js +5 -3
  153. package/dist/esm/q2-card-image.entry.js +8 -6
  154. package/dist/esm/q2-card.entry.js +2 -2
  155. package/dist/esm/q2-carousel-pane.entry.js +1 -1
  156. package/dist/esm/q2-carousel.entry.js +1 -1
  157. package/dist/esm/q2-chart-area.entry.js +1 -1
  158. package/dist/esm/q2-chart-bar.entry.js +1 -1
  159. package/dist/esm/q2-chart-donut.entry.js +2 -2
  160. package/dist/esm/q2-checkbox-group.entry.js +1 -1
  161. package/dist/esm/q2-checkbox_2.entry.js +4 -3
  162. package/dist/esm/q2-context.entry.js +1 -1
  163. package/dist/esm/q2-currency.entry.js +1 -1
  164. package/dist/esm/q2-data-table.entry.js +6 -3
  165. package/dist/esm/q2-detail.entry.js +2 -2
  166. package/dist/esm/q2-dropdown-item.entry.js +1 -1
  167. package/dist/esm/q2-dropdown.entry.js +3 -3
  168. package/dist/esm/q2-editable-field.entry.js +12 -4
  169. package/dist/esm/q2-file-picker.entry.js +1 -1
  170. package/dist/esm/q2-icon.entry.js +1 -1
  171. package/dist/esm/q2-item.entry.js +2 -2
  172. package/dist/esm/q2-legend.entry.js +1 -1
  173. package/dist/esm/q2-link_2.entry.js +2 -2
  174. package/dist/esm/q2-loc.entry.js +20 -2
  175. package/dist/esm/q2-message.entry.js +1 -1
  176. package/dist/esm/q2-meter.entry.js +2 -2
  177. package/dist/esm/q2-modal.entry.js +3 -3
  178. package/dist/esm/q2-month-picker.entry.js +1 -1
  179. package/dist/esm/q2-optgroup.entry.js +1 -1
  180. package/dist/esm/q2-option.entry.js +1 -1
  181. package/dist/esm/q2-otp.entry.js +1 -1
  182. package/dist/esm/q2-pagination.entry.js +1 -1
  183. package/dist/esm/q2-pill.entry.js +1 -1
  184. package/dist/esm/q2-radio-group.entry.js +1 -1
  185. package/dist/esm/q2-radio.entry.js +1 -1
  186. package/dist/esm/q2-relative-time.entry.js +1 -1
  187. package/dist/esm/q2-search.entry.js +101 -12
  188. package/dist/esm/q2-section.entry.js +2 -2
  189. package/dist/esm/q2-select.entry.js +36 -6
  190. package/dist/esm/q2-stepper-pane.entry.js +1 -1
  191. package/dist/esm/q2-stepper-vertical.entry.js +24 -18
  192. package/dist/esm/q2-stepper.entry.js +5 -4
  193. package/dist/esm/q2-surface.entry.js +93 -0
  194. package/dist/esm/q2-tab-container.entry.js +2 -2
  195. package/dist/esm/q2-tab-pane.entry.js +1 -1
  196. package/dist/esm/q2-tecton-elements.js +1 -1
  197. package/dist/esm/q2-textarea.entry.js +1 -1
  198. package/dist/esm/q2-toast.entry.js +1 -1
  199. package/dist/esm/q2-tooltip.entry.js +1 -1
  200. package/dist/esm/tecton-tab-pane.entry.js +2 -2
  201. package/dist/q2-tecton-elements/click-elsewhere_3.entry.js +2 -2
  202. package/dist/q2-tecton-elements/{index-Bx4m6N0g.js → index-Cps4jSQM.js} +3 -3
  203. package/dist/q2-tecton-elements/q2-action-group_2.entry.js +1 -1
  204. package/dist/q2-tecton-elements/q2-action-sheet.entry.js +2 -2
  205. package/dist/q2-tecton-elements/q2-badge_2.entry.js +51 -32
  206. package/dist/q2-tecton-elements/q2-btn_2.entry.js +6 -2
  207. package/dist/q2-tecton-elements/q2-calendar.entry.js +7 -4
  208. package/dist/q2-tecton-elements/q2-card-image.entry.js +65 -62
  209. package/dist/q2-tecton-elements/q2-card.entry.js +2 -2
  210. package/dist/q2-tecton-elements/q2-carousel-pane.entry.js +1 -1
  211. package/dist/q2-tecton-elements/q2-carousel.entry.js +1 -1
  212. package/dist/q2-tecton-elements/q2-chart-area.entry.js +54 -54
  213. package/dist/q2-tecton-elements/q2-chart-bar.entry.js +3 -3
  214. package/dist/q2-tecton-elements/q2-chart-donut.entry.js +7 -7
  215. package/dist/q2-tecton-elements/q2-checkbox-group.entry.js +1 -1
  216. package/dist/q2-tecton-elements/q2-checkbox_2.entry.js +18 -18
  217. package/dist/q2-tecton-elements/q2-context.entry.js +1 -1
  218. package/dist/q2-tecton-elements/q2-currency.entry.js +1 -1
  219. package/dist/q2-tecton-elements/q2-data-table.entry.js +50 -50
  220. package/dist/q2-tecton-elements/q2-detail.entry.js +2 -2
  221. package/dist/q2-tecton-elements/q2-dropdown-item.entry.js +1 -1
  222. package/dist/q2-tecton-elements/q2-dropdown.entry.js +16 -16
  223. package/dist/q2-tecton-elements/q2-editable-field.entry.js +15 -8
  224. package/dist/q2-tecton-elements/q2-file-picker.entry.js +1 -1
  225. package/dist/q2-tecton-elements/q2-icon.entry.js +1 -1
  226. package/dist/q2-tecton-elements/q2-item.entry.js +2 -2
  227. package/dist/q2-tecton-elements/q2-legend.entry.js +1 -1
  228. package/dist/q2-tecton-elements/q2-link_2.entry.js +2 -2
  229. package/dist/q2-tecton-elements/q2-loc.entry.js +20 -6
  230. package/dist/q2-tecton-elements/q2-message.entry.js +1 -1
  231. package/dist/q2-tecton-elements/q2-meter.entry.js +2 -2
  232. package/dist/q2-tecton-elements/q2-modal.entry.js +55 -55
  233. package/dist/q2-tecton-elements/q2-month-picker.entry.js +1 -1
  234. package/dist/q2-tecton-elements/q2-optgroup.entry.js +1 -1
  235. package/dist/q2-tecton-elements/q2-option.entry.js +7 -7
  236. package/dist/q2-tecton-elements/q2-otp.entry.js +1 -1
  237. package/dist/q2-tecton-elements/q2-pagination.entry.js +1 -1
  238. package/dist/q2-tecton-elements/q2-pill.entry.js +1 -1
  239. package/dist/q2-tecton-elements/q2-radio-group.entry.js +1 -1
  240. package/dist/q2-tecton-elements/q2-radio.entry.js +1 -1
  241. package/dist/q2-tecton-elements/q2-relative-time.entry.js +1 -1
  242. package/dist/q2-tecton-elements/q2-search.entry.js +108 -53
  243. package/dist/q2-tecton-elements/q2-section.entry.js +2 -2
  244. package/dist/q2-tecton-elements/q2-select.entry.js +25 -10
  245. package/dist/q2-tecton-elements/q2-stepper-pane.entry.js +1 -1
  246. package/dist/q2-tecton-elements/q2-stepper-vertical.entry.js +75 -66
  247. package/dist/q2-tecton-elements/q2-stepper.entry.js +47 -45
  248. package/dist/q2-tecton-elements/q2-surface.entry.js +89 -0
  249. package/dist/q2-tecton-elements/q2-tab-container.entry.js +13 -13
  250. package/dist/q2-tecton-elements/q2-tab-pane.entry.js +2 -2
  251. package/dist/q2-tecton-elements/q2-tecton-elements.esm.js +1 -1
  252. package/dist/q2-tecton-elements/q2-textarea.entry.js +1 -1
  253. package/dist/q2-tecton-elements/q2-toast.entry.js +5 -5
  254. package/dist/q2-tecton-elements/q2-tooltip.entry.js +8 -8
  255. package/dist/q2-tecton-elements/tecton-tab-pane.entry.js +6 -6
  256. package/dist/types/components/q2-calendar/q2-calendar.d.ts +2 -0
  257. package/dist/types/components/q2-card-image/q2-card-image.d.ts +5 -5
  258. package/dist/types/components/q2-editable-field/q2-editable-field.d.ts +1 -0
  259. package/dist/types/components/q2-input/q2-input.d.ts +3 -0
  260. package/dist/types/components/q2-item/test/q2-item-test.vr.d.ts +1 -0
  261. package/dist/types/components/q2-loc/q2-loc.d.ts +6 -0
  262. package/dist/types/components/q2-modal/q2-modal.d.ts +1 -1
  263. package/dist/types/components/q2-otp/test/q2-otp-test.vr.d.ts +1 -0
  264. package/dist/types/components/q2-search/q2-search.d.ts +7 -0
  265. package/dist/types/components/q2-search/test/q2-search-test.vr.d.ts +1 -0
  266. package/dist/types/components/q2-select/q2-select.d.ts +4 -0
  267. package/dist/types/components/q2-stepper-vertical/q2-stepper-vertical.d.ts +2 -1
  268. package/dist/types/components/q2-surface/q2-surface.d.ts +54 -0
  269. package/dist/types/components/q2-surface/test/q2-surface-test.vr.d.ts +1 -0
  270. package/dist/types/components/q2-toast/q2-toast.d.ts +3 -1
  271. package/dist/types/components.d.ts +259 -13
  272. package/dist/types/utils/index.d.ts +3 -1
  273. package/package.json +4 -3
@@ -41,6 +41,8 @@ export class Q2Calendar {
41
41
  * for use.
42
42
  */
43
43
  this.popoverMode = null;
44
+ /** Show success styles when the calendar is in a valid state. The error state takes precedence when both are set. */
45
+ this.valid = false;
44
46
  this.closeCalendar = () => {
45
47
  if (!this.open)
46
48
  return;
@@ -799,10 +801,10 @@ export class Q2Calendar {
799
801
  }
800
802
  renderInputField() {
801
803
  const { isTypeable } = this;
802
- return (h("q2-input", { ref: el => (this.controlElement = el), class: "calendar-input-field", value: this.formattedValue, label: loc(this.label), hideLabel: this.hideLabel, disabled: !!this.disabled, readonly: !!this.readonly, clearable: this.canClear, placeholder: this.computedPlaceholder, optional: !!this.optional, "aria-expanded": `${!!this.open}`, "aria-controls": "calendar-popover", hints: this.hintList, errors: this.errorList, onClick: isTypeable ? undefined : this.onInputClick, onChange: e => e.stopImmediatePropagation(), onTctChange: e => e.stopImmediatePropagation(), onInput: e => e.stopImmediatePropagation(), onTctInput: this.onInputInput, onKeyDown: this.onInputKeydown, onKeyUp: this.onInputKeyup, onBlur: this.onInputBlur, onFocus: this.onInputFocus, "icon-right": isTypeable ? undefined : 'calendar', "format-modifier": isTypeable ? this.formatModifier : this.displayFormat || this.formatModifier, type: "date", "hide-messages": !isTypeable, "test-id": "inputAndCalendarToggle", _role: "combobox", _preventEntry: !isTypeable }, isTypeable && (h("q2-btn", { ref: el => (this.btnCalendarToggle = el), slot: "input-right", onClick: this.onInputClick, "test-id": "calendarToggle", label: "tecton.element.calendar.toggleAriaLabel", "hide-label": true }, h("q2-icon", { type: "calendar" })))));
804
+ return (h("q2-input", { ref: el => (this.controlElement = el), class: "calendar-input-field", value: this.formattedValue, label: loc(this.label), hideLabel: this.hideLabel, disabled: !!this.disabled, readonly: !!this.readonly, clearable: this.canClear, placeholder: this.computedPlaceholder, optional: !!this.optional, valid: this.valid, "aria-expanded": `${!!this.open}`, "aria-controls": "calendar-popover", hints: this.hintList, errors: this.errorList, onClick: isTypeable ? undefined : this.onInputClick, onChange: e => e.stopImmediatePropagation(), onTctChange: e => e.stopImmediatePropagation(), onInput: e => e.stopImmediatePropagation(), onTctInput: this.onInputInput, onKeyDown: this.onInputKeydown, onKeyUp: this.onInputKeyup, onBlur: this.onInputBlur, onFocus: this.onInputFocus, "icon-right": isTypeable ? undefined : 'calendar', "format-modifier": isTypeable ? this.formatModifier : this.displayFormat || this.formatModifier, type: "date", "hide-messages": !isTypeable, "test-id": "inputAndCalendarToggle", _role: "combobox", _preventEntry: !isTypeable }, isTypeable && (h("q2-btn", { ref: el => (this.btnCalendarToggle = el), slot: "input-right", onClick: this.onInputClick, "test-id": "calendarToggle", label: "tecton.element.calendar.toggleAriaLabel", "hide-label": true }, h("q2-icon", { type: "calendar" })))));
803
805
  }
804
806
  render() {
805
- return (h("click-elsewhere", { key: '55a24cc7138b3477aced736ad4a8ad9cae84e3cc', class: this.open ? 'dropdown-open' : undefined, onChange: this.onClickElsewhere }, this.renderInputField(), h("q2-popover", { key: '15637835c0cc04486398dc86dd589f492f487488', ref: el => (this.popoverElement = el), id: "calendar-popover", controlElement: this.innerInputContainer, open: this.open, direction: this.popoverDirection, minHeight: this.popoverMinHeight, align: this.popoverAlignment, mode: this.popoverMode || undefined, block: true }, this.renderHintField(), this.renderCalendarPopover())));
807
+ return (h("click-elsewhere", { key: 'b13259be3c0d64bff32654faf0c738a7a7450c4e', class: this.open ? 'dropdown-open' : undefined, onChange: this.onClickElsewhere }, this.renderInputField(), h("q2-popover", { key: '2e183cd962e7abc4186b93da7edd835e0db5504a', ref: el => (this.popoverElement = el), id: "calendar-popover", controlElement: this.innerInputContainer, open: this.open, direction: this.popoverDirection, minHeight: this.popoverMinHeight, align: this.popoverAlignment, mode: this.popoverMode || undefined, block: true }, this.renderHintField(), this.renderCalendarPopover())));
806
808
  }
807
809
  static get is() { return "q2-calendar"; }
808
810
  static get encapsulation() { return "shadow"; }
@@ -1436,6 +1438,26 @@ export class Q2Calendar {
1436
1438
  "reflect": true,
1437
1439
  "attribute": "typeable"
1438
1440
  },
1441
+ "valid": {
1442
+ "type": "boolean",
1443
+ "mutable": false,
1444
+ "complexType": {
1445
+ "original": "boolean",
1446
+ "resolved": "boolean",
1447
+ "references": {}
1448
+ },
1449
+ "required": false,
1450
+ "optional": false,
1451
+ "docs": {
1452
+ "tags": [],
1453
+ "text": "Show success styles when the calendar is in a valid state. The error state takes precedence when both are set."
1454
+ },
1455
+ "getter": false,
1456
+ "setter": false,
1457
+ "reflect": true,
1458
+ "attribute": "valid",
1459
+ "defaultValue": "false"
1460
+ },
1439
1461
  "validDates": {
1440
1462
  "type": "unknown",
1441
1463
  "mutable": false,
@@ -34,6 +34,10 @@ const RESTING_VARIANTS = [
34
34
  name: 'invalid',
35
35
  html: `<q2-calendar label="My calendar" placeholder="My date" invalid typeable></q2-calendar>`,
36
36
  },
37
+ {
38
+ name: 'valid',
39
+ html: `<q2-calendar label="My calendar" placeholder="My date" value="2025-05-20" valid></q2-calendar>`,
40
+ },
37
41
  {
38
42
  name: 'with-value',
39
43
  html: `<q2-calendar label="My calendar" placeholder="My date" value="2025-05-20"></q2-calendar>`,
@@ -144,7 +144,7 @@ button {
144
144
  display: grid;
145
145
  gap: var(--tct-card-gap, var(--t-card-gap, var(--app-scale-3x, 15px)));
146
146
  margin: 0;
147
- color: var(--tct-card-font-color, var(--tct-card-color, var(--t-card-color, var(--t-text, #4d4d4d))));
147
+ color: var(--tct-card-font-color, var(--tct-card-color, var(--t-card-color, inherit)));
148
148
  backdrop-filter: var(--tct-card-backdrop-filter);
149
149
  background: var(--tct-card-background, var(--t-card-background, var(--t-base, #ffffff)));
150
150
  border-width: var(--tct-card-border-width, var(--t-card-border-width, 0px));
@@ -223,7 +223,7 @@ button {
223
223
  .container.is-static {
224
224
  cursor: auto;
225
225
  background: var(--tct-card-static-background, var(--tct-card-background, none));
226
- color: var(--tct-card-static-font-color, var(--tct-card-color, var(--t-text, #4d4d4d)));
226
+ color: var(--tct-card-static-font-color, var(--tct-card-color, inherit));
227
227
  backdrop-filter: none;
228
228
  border-radius: 0;
229
229
  border: 0;
@@ -227,6 +227,9 @@ button {
227
227
 
228
228
  .card-wrapper > q2-btn {
229
229
  --const-double-focus-ring: none;
230
+ --tct-btn-min-height-medium: 0;
231
+ --tct-btn-padding-size-medium: 0;
232
+ --tct-btn-font-size-medium: inherit;
230
233
  width: 100%;
231
234
  max-width: 100%;
232
235
  }
@@ -22,6 +22,8 @@ export class Q2CardImage {
22
22
  // #endregion
23
23
  // #region State Properties
24
24
  this.computedSize = 'medium';
25
+ // #endregion
26
+ // #region Public Property API
25
27
  /**
26
28
  * Background style for the base layer.
27
29
  * - `'primary'` | `'secondary'` | `'tertiary'`: Solid theme colors
@@ -314,7 +316,7 @@ export class Q2CardImage {
314
316
  }
315
317
  renderCardContent() {
316
318
  const cardDetails = this.orientation === 'horizontal' ? this.renderHorizontalCardDetails() : this.renderVerticalCardDetails();
317
- return (h("div", { role: !this.isDecorative && !this.clickable ? 'img' : undefined, "aria-label": !this.isDecorative && !this.clickable ? this.accessibilityLabel : undefined, "aria-hidden": this.isDecorative || this.clickable ? 'true' : undefined, class: {
319
+ return (h("div", { role: !this.isDecorative && !this.clickable ? 'img' : undefined, "aria-label": !this.isDecorative && !this.clickable ? this.tctAriaLabel : undefined, "aria-hidden": this.isDecorative || this.clickable ? 'true' : undefined, class: {
318
320
  'card-image-container': true,
319
321
  block: !this.inline,
320
322
  clickable: this.clickable && !this.disabled,
@@ -365,13 +367,13 @@ export class Q2CardImage {
365
367
  }, style: cardTypeColorStyle }, this.getCardTypeText())), h("div", { class: "vertical-vendor-row" }, h("div", { class: "vertical-vendor" }, vendorPath && (h("img", { src: vendorPath, alt: "", "aria-hidden": "true" }))))));
366
368
  }
367
369
  render() {
368
- const cardContent = this.clickable ? (h("q2-btn", { disabled: this.disabled, label: this.accessibilityLabel, hideLabel: true, onClick: this.handleCardClick }, this.renderCardContent())) : (this.renderCardContent());
370
+ const cardContent = this.clickable ? (h("q2-btn", { block: true, disabled: this.disabled, label: this.tctAriaLabel, hideLabel: true, onClick: this.handleCardClick }, this.renderCardContent())) : (this.renderCardContent());
369
371
  const showBanner = !!this.cardStatus && this.size === 'large';
370
- return (h(Host, { key: '3c71f0e8e6fd22ebf3a3e3b98f890767ced6060b', class: {
372
+ return (h(Host, { key: '4425c2f04d081d93b56ed67f00b949c8143d0046', class: {
371
373
  [`${this.orientation}`]: true,
372
374
  'has-action': this.hasActionSlotContent,
373
375
  'has-banner': showBanner,
374
- } }, this.renderStatusBanner(), h("div", { key: '761c7a611ec3f8e0ffd7a5b51e2944f83876f5ae', class: "card-wrapper" }, cardContent, this.renderAction())));
376
+ } }, this.renderStatusBanner(), h("div", { key: '1d264f88e00805b9153a7ac59f4ea367bf28dc3f', class: "card-wrapper" }, cardContent, this.renderAction())));
375
377
  }
376
378
  static get is() { return "q2-card-image"; }
377
379
  static get encapsulation() { return "shadow"; }
@@ -388,25 +390,6 @@ export class Q2CardImage {
388
390
  static get assetsDirs() { return ["assets"]; }
389
391
  static get properties() {
390
392
  return {
391
- "accessibilityLabel": {
392
- "type": "string",
393
- "mutable": false,
394
- "complexType": {
395
- "original": "string",
396
- "resolved": "string",
397
- "references": {}
398
- },
399
- "required": false,
400
- "optional": true,
401
- "docs": {
402
- "tags": [],
403
- "text": "Accessible label for the card image. When provided, this value is applied as `aria-label`\non either the card container (non-clickable) or the wrapping button (clickable)."
404
- },
405
- "getter": false,
406
- "setter": false,
407
- "reflect": false,
408
- "attribute": "accessibility-label"
409
- },
410
393
  "background": {
411
394
  "type": "string",
412
395
  "mutable": false,
@@ -737,6 +720,25 @@ export class Q2CardImage {
737
720
  "reflect": false,
738
721
  "attribute": "status-text-override"
739
722
  },
723
+ "tctAriaLabel": {
724
+ "type": "string",
725
+ "mutable": false,
726
+ "complexType": {
727
+ "original": "string",
728
+ "resolved": "string",
729
+ "references": {}
730
+ },
731
+ "required": false,
732
+ "optional": true,
733
+ "docs": {
734
+ "tags": [],
735
+ "text": "Accessible label for the card image. When provided, this value is applied as `aria-label`\non either the card container (non-clickable) or the wrapping button (clickable)."
736
+ },
737
+ "getter": false,
738
+ "setter": false,
739
+ "reflect": false,
740
+ "attribute": "tct-aria-label"
741
+ },
740
742
  "vendor": {
741
743
  "type": "string",
742
744
  "mutable": false,
@@ -65,6 +65,10 @@ button {
65
65
  visibility: hidden;
66
66
  }
67
67
 
68
+ /**
69
+ * @prop --tct-area-chart-width?: (<length-percentage>) Controls the width of the area chart.
70
+ * @prop --tct-area-chart-height?: (<length-percentage>) Controls the height of the area chart.
71
+ */
68
72
  :host {
69
73
  width: var(--tct-area-chart-width, 100%);
70
74
  height: var(--tct-area-chart-height, 100%);
@@ -65,6 +65,10 @@ button {
65
65
  visibility: hidden;
66
66
  }
67
67
 
68
+ /**
69
+ * @prop --tct-bar-chart-width?: (<length-percentage>) Controls the width of the bar chart.
70
+ * @prop --tct-bar-chart-height?: (<length-percentage>) Controls the height of the bar chart.
71
+ */
68
72
  :host {
69
73
  width: var(--tct-bar-chart-width, 100%);
70
74
  height: var(--tct-bar-chart-height, 100%);
@@ -156,7 +156,7 @@ button:focus-visible {
156
156
  height: 100%;
157
157
  width: 100%;
158
158
  text-align: center;
159
- color: var(--tct-chart-donut-text-color, var(--t-chart-donut-text-color, var(--t-text, #4d4d4d)));
159
+ color: var(--tct-chart-donut-text-color, var(--t-chart-donut-text-color, inherit));
160
160
  margin-inline: auto;
161
161
  display: flex;
162
162
  flex-direction: column;
@@ -30,6 +30,7 @@ export class Q2Checkbox {
30
30
  if (!(event.target instanceof HTMLInputElement))
31
31
  return;
32
32
  const { value, checked } = event.target;
33
+ this.checked = checked;
33
34
  mirrorEmit(this, ['change', 'tctChange'], {
34
35
  value,
35
36
  checked,
@@ -179,7 +180,7 @@ export class Q2Checkbox {
179
180
  containerClasses.push('has-multiline-label');
180
181
  if (this.hideLabel)
181
182
  textLabelClasses.push('sr');
182
- return (h("div", { key: '071518056d28c0c4d0693a202d554bc456d046cf', class: containerClasses.join(' ') }, h("input", { key: 'ad8a499e028c52c59610fff14f5149fde9afdbc6', ref: el => (this.inputElement = el), "aria-describedby": this.hasDescription ? 'description' : undefined, "aria-invalid": this.hasError === undefined ? undefined : `${this.hasError}`, "aria-labelledby": this.ariaLabelledBy, checked: this.indeterminate || this.checked || false, class: "sr", disabled: !!this.disabled || !!this.groupDisabled, id: this._id, name: this.name || this._id, onClick: this.onInputClick, "test-id": "q2CheckboxInnerCheckBox", type: "checkbox", value: this.value }), h("label", { key: '073cb174831c555ec1ec4a4dc951393a9767b731', htmlFor: this._id, class: "label-control", "test-id": "checkboxButton", "aria-hidden": "true" }, this.renderCheckboxSVG()), h("div", { key: '75feec3b0db261773e26788e4a000d49522efbbb', class: textLabelClasses.join(' '), ref: el => (this.labelTextElement = el) }, h("label", { key: '551c209e99da0fe58fcf73b8cb0350230133500b', "test-id": "checkboxLabel", htmlFor: this._id, id: this.labelId }, h("div", { key: 'af6e9d20ae62270abb3e860024705780cc02d824', class: "label-content" }, loc(this.label), h("slot", { key: '81a79439a4503ee2d0820985ad05a915ec6d8864', onSlotchange: this.queueLabelLayoutUpdate }), h("slot", { key: 'd86de89110f4bba45ff40e998ef115256c544056', name: "label", onSlotchange: this.queueLabelLayoutUpdate })))), this._tooltip && (h("span", { key: 'd3819c91a4c7ddf4d93f2da0050dbace7b1854d7', id: this.tooltipId, class: "sr", "test-id": "checkboxTooltipText" }, this._tooltip)), this.hasDescription && (h("div", { key: '9cdf914b053273605322cb9125544ee119a18aec', class: "description-text", "test-id": "checkboxDescription", id: "description" }, loc(this.description), h("slot", { key: '87fa1308868d32ca5c912ca57a7111f12d30a83b', name: "description" })))));
183
+ return (h("div", { key: '0dff5141bf9fd0eb9b9d92f55c80b046a8224bad', class: containerClasses.join(' ') }, h("input", { key: 'ac0565c29bcb4b2e29403215ceb5fc0221578209', ref: el => (this.inputElement = el), "aria-describedby": this.hasDescription ? 'description' : undefined, "aria-invalid": this.hasError === undefined ? undefined : `${this.hasError}`, "aria-labelledby": this.ariaLabelledBy, checked: this.indeterminate || this.checked || false, class: "sr", disabled: !!this.disabled || !!this.groupDisabled, id: this._id, name: this.name || this._id, onClick: this.onInputClick, "test-id": "q2CheckboxInnerCheckBox", type: "checkbox", value: this.value }), h("label", { key: '56684f4fb63b0f6d136e69420f2e632a807ab03a', htmlFor: this._id, class: "label-control", "test-id": "checkboxButton", "aria-hidden": "true" }, this.renderCheckboxSVG()), h("div", { key: '4f40ff7c46337d002e3097e849e8a6d163271787', class: textLabelClasses.join(' '), ref: el => (this.labelTextElement = el) }, h("label", { key: '3d9803210e8462137d28205891762da8a9fa19cd', "test-id": "checkboxLabel", htmlFor: this._id, id: this.labelId }, h("div", { key: 'de644e9efa49bfb2c84400d4f748678f1724786d', class: "label-content" }, loc(this.label), h("slot", { key: 'f537a700ad48155f2896ae1880fcfdc4f1e60226', onSlotchange: this.queueLabelLayoutUpdate }), h("slot", { key: '184d686720af904c8f5cda2d4508cd07add7b1bf', name: "label", onSlotchange: this.queueLabelLayoutUpdate })))), this._tooltip && (h("span", { key: '05a8eacb9150b56ce30183561c72b0c607c60c8c', id: this.tooltipId, class: "sr", "test-id": "checkboxTooltipText" }, this._tooltip)), this.hasDescription && (h("div", { key: '7b06216cede51eb0bc13932ed17e3237854c1316', class: "description-text", "test-id": "checkboxDescription", id: "description" }, loc(this.description), h("slot", { key: '723ac0aa53756d0bd9f06e7bb2a1231056cdca50', name: "description" })))));
183
184
  }
184
185
  static get is() { return "q2-checkbox"; }
185
186
  static get encapsulation() { return "shadow"; }
@@ -101,7 +101,7 @@ button {
101
101
  }
102
102
 
103
103
  .currency {
104
- --comp-currency-color: var(--tct-currency-color, var(--t-text, #4d4d4d));
104
+ --comp-currency-color: var(--tct-currency-color, inherit);
105
105
  color: var(--comp-currency-color);
106
106
  font-size: var(--tct-currency-font-size, inherit);
107
107
  font-weight: var(--tct-currency-font-weight, inherit);
@@ -90,8 +90,11 @@ export class Q2DataTable {
90
90
  rows: selectedRows,
91
91
  allSelected: allRowsSelected,
92
92
  });
93
- if (selectEvent.defaultPrevented)
93
+ if (selectEvent.defaultPrevented) {
94
+ if (event.target)
95
+ event.target.checked = row.selected;
94
96
  return;
97
+ }
95
98
  this.serializedRows = this.serializedRows.map(row => (row.id === selectedRow.id ? selectedRow : row));
96
99
  this.allRowsSelected = allRowsSelected;
97
100
  this.someRowsSelected = isIndeterminate;
@@ -416,7 +419,7 @@ export class Q2DataTable {
416
419
  // #region Render Methods
417
420
  render() {
418
421
  const { caption } = this;
419
- return (h("div", { key: 'ce5dfe7dc753ee2f2a8419e742bf4afef6eccdb0', class: "container" }, h("table", { key: 'f899c9959a20da0dec2d4b9011e01af4f2c05a49' }, caption && h("caption", { key: '1e8d106a6524baf6d228003907d48b7515dc0561', class: this.hideCaption ? 'sr' : undefined }, caption), this.renderTableColGroup(), this.renderTableHeader(), this.renderEmptyState(), this.renderTableRows())));
422
+ return (h("div", { key: '9f2281aae60f873a2755db7ed67aaab73c79f499', class: "container" }, h("table", { key: '2d057320dad36ea04d1037546ef2b9a8135b0a08' }, caption && h("caption", { key: '2b4ae6daf2d2f3c75e1819166cf758b5ff5f3ab4', class: this.hideCaption ? 'sr' : undefined }, caption), this.renderTableColGroup(), this.renderTableHeader(), this.renderEmptyState(), this.renderTableRows())));
420
423
  }
421
424
  renderCellContent(cell) {
422
425
  if (!cell)
@@ -149,30 +149,30 @@ button {
149
149
  flex: 1;
150
150
  text-align: left;
151
151
  line-height: 1.5;
152
- color: var(--tct-detail-label-font-color, #141430);
152
+ color: var(--tct-detail-label-font-color, inherit);
153
153
  }
154
154
  .label-size-xsmall {
155
- color: var(--tct-detail-label-xsmall-font-color, #6f6f82);
155
+ color: var(--tct-detail-label-xsmall-font-color, var(--tct-detail-label-font-color, inherit));
156
156
  font-size: var(--tct-detail-label-xsmall-font-size, 14px);
157
157
  font-weight: var(--tct-detail-label-xsmall-font-weight, 400);
158
158
  }
159
159
  .label-size-small {
160
- color: var(--tct-detail-label-small-font-color);
160
+ color: var(--tct-detail-label-small-font-color, var(--tct-detail-label-font-color, inherit));
161
161
  font-size: var(--tct-detail-label-small-font-size, 14px);
162
162
  font-weight: var(--tct-detail-label-small-font-weight, 400);
163
163
  }
164
164
  .label-size-medium {
165
- color: var(--tct-detail-label-medium-font-color);
165
+ color: var(--tct-detail-label-medium-font-color, var(--tct-detail-label-font-color, inherit));
166
166
  font-size: var(--tct-detail-label-medium-font-size, 14px);
167
167
  font-weight: var(--tct-detail-label-medium-font-weight, 400);
168
168
  }
169
169
  .label-size-large {
170
- color: var(--tct-detail-label-large-font-color);
170
+ color: var(--tct-detail-label-large-font-color, var(--tct-detail-label-font-color, inherit));
171
171
  font-size: var(--tct-detail-label-large-font-size, 16px);
172
172
  font-weight: var(--tct-detail-label-large-font-weight, 400);
173
173
  }
174
174
  .label-size-xlarge {
175
- color: var(--tct-detail-label-xlarge-font-color);
175
+ color: var(--tct-detail-label-xlarge-font-color, var(--tct-detail-label-font-color, inherit));
176
176
  font-size: var(--tct-detail-label-xlarge-font-size, 18px);
177
177
  font-weight: var(--tct-detail-label-xlarge-font-weight, 400);
178
178
  }
@@ -187,34 +187,34 @@ button {
187
187
  display: flex;
188
188
  align-items: center;
189
189
  line-height: 1.5;
190
- color: var(--tct-detail-description-font-color, #141430);
190
+ color: var(--tct-detail-description-font-color, inherit);
191
191
  column-gap: var(--tct-detail-description-gap-column, var(--app-scale-1x, 5px));
192
192
  }
193
193
  .description-alignment-right {
194
194
  justify-content: flex-end;
195
195
  }
196
196
  .description-size-xsmall {
197
- color: var(--tct-detail-description-xsmall-font-color, #6f6f82);
197
+ color: var(--tct-detail-description-xsmall-font-color, var(--tct-detail-description-font-color, inherit));
198
198
  font-size: var(--tct-detail-description-xsmall-font-size, 14px);
199
199
  font-weight: var(--tct-detail-description-xsmall-font-weight, 400);
200
200
  }
201
201
  .description-size-small {
202
- color: var(--tct-detail-description-small-font-color);
202
+ color: var(--tct-detail-description-small-font-color, var(--tct-detail-description-font-color, inherit));
203
203
  font-size: var(--tct-detail-description-small-font-size, 14px);
204
204
  font-weight: var(--tct-detail-description-small-font-weight, 400);
205
205
  }
206
206
  .description-size-medium {
207
- color: var(--tct-detail-description-medium-font-color);
207
+ color: var(--tct-detail-description-medium-font-color, var(--tct-detail-description-font-color, inherit));
208
208
  font-size: var(--tct-detail-description-medium-font-size, 24px);
209
209
  font-weight: var(--tct-detail-description-medium-font-weight, 600);
210
210
  }
211
211
  .description-size-large {
212
- color: var(--tct-detail-description-large-font-color);
212
+ color: var(--tct-detail-description-large-font-color, var(--tct-detail-description-font-color, inherit));
213
213
  font-size: var(--tct-detail-description-large-font-size, 28px);
214
214
  font-weight: var(--tct-detail-description-large-font-weight, 600);
215
215
  }
216
216
  .description-size-xlarge {
217
- color: var(--tct-detail-description-xlarge-font-color);
217
+ color: var(--tct-detail-description-xlarge-font-color, var(--tct-detail-description-font-color, inherit));
218
218
  font-size: var(--tct-detail-description-xlarge-font-size, 32px);
219
219
  font-weight: var(--tct-detail-description-xlarge-font-weight, 700);
220
220
  }
@@ -238,7 +238,7 @@ export class Q2Dropdown {
238
238
  // #endregion
239
239
  // #region Local Methods
240
240
  get determineDropdownItemCount() {
241
- return this.hostElement.querySelectorAll(this.dropdownItemSelector).length;
241
+ return this.hostElement.querySelectorAll(`${this.dropdownItemSelector}, ${this.optionSelector}`).length;
242
242
  }
243
243
  get hasCustomControl() {
244
244
  return !!this.hostElement.querySelector('[slot=control]');
@@ -364,7 +364,7 @@ export class Q2Dropdown {
364
364
  // #region Render Methods
365
365
  render() {
366
366
  const btnProps = this.toggleButtonProps;
367
- return (h("click-elsewhere", { key: '1fb0465b5d0a0228c12e53161f795e9039c3e482', class: this.open ? 'dropdown-open' : '', onChange: this.onClickElsewhere, "test-id": "dropdownContainer" }, h("q2-btn", { key: 'ca2afb3f037229568969431724617e82f817d892', tabIndex: 0, ref: el => (this.controlElement = el), class: btnProps.className, onClick: this.onToggleClick, onKeyDown: this.onToggleKeydown, fab: btnProps.fab, intent: btnProps.intent, onFocusout: this.handleFocusOut, active: btnProps.active, disabled: btnProps.disabled, ariaExpanded: `${!!btnProps.ariaExpanded}`, label: this.hideLabel && this.label ? loc(this.label) : undefined, hideLabel: this.hideLabel, ariaHasPopup: "menu", "test-id": "dropdownButton", block: this.block, description: loc('tecton.element.dropdown.itemCount', [this.determineDropdownItemCount]) }, this.hasCustomControl ? (h("div", { "test-id": "dropdownControl", class: btnProps.custom ? '' : 'hidden' }, h("slot", { name: "control" }))) : (h(Fragment, null, this.label && !this.hideLabel && (h("span", { class: "dropdown-button-text" }, loc(this.label))), this.icon ? h("q2-icon", { type: this.icon }) : ' '))), h("q2-popover", { key: '5e65c0527e6f3950c1d02df536f336c2f5a63fed', ref: el => (this.popoverElement = el), controlElement: this.controlElement, open: this.open, "max-height": this.popoverMaxHeight, onFocusout: this.handleFocusOut, minHeight: this.popoverMinHeight, direction: this.popoverDirection, align: this.popoverAlignment, mode: this.popoverMode || undefined, block: this.block }, h("slot", { key: '6304f30a52d2a72359d78aef3ae1983560d8ad97', name: "popover-top" }), h("q2-option-list", { key: 'b4eee650726da0455eb8fe625f78b6bdcd4a6418', onPopoverState: this.onPopoverState, id: "option-list", ref: el => (this.optionList = el), type: "menu", label: loc('tecton.element.optionList.label', [this.optionListLabel]), "no-select": true }, h("slot", { key: '29e19ea60b40e3b52025c67161030000d2723a20' })), h("slot", { key: 'd9497a3f4f0d2f9624af5628d6a304d954f5461e', name: "popover-bottom" }))));
367
+ return (h("click-elsewhere", { key: '27e7a560b21894fb10175be18c9cb07e37f59db3', class: this.open ? 'dropdown-open' : '', onChange: this.onClickElsewhere, "test-id": "dropdownContainer" }, h("q2-btn", { key: 'b53dace27e75fdbcd87a1689470a1466ad9e07d3', tabIndex: 0, ref: el => (this.controlElement = el), class: btnProps.className, onClick: this.onToggleClick, onKeyDown: this.onToggleKeydown, fab: btnProps.fab, intent: btnProps.intent, onFocusout: this.handleFocusOut, active: btnProps.active, disabled: btnProps.disabled, ariaExpanded: `${!!btnProps.ariaExpanded}`, label: this.hideLabel && this.label ? loc(this.label) : undefined, hideLabel: this.hideLabel, ariaHasPopup: "menu", "test-id": "dropdownButton", block: this.block, description: loc('tecton.element.dropdown.itemCount', [this.determineDropdownItemCount]) }, this.hasCustomControl ? (h("div", { "test-id": "dropdownControl", class: btnProps.custom ? '' : 'hidden' }, h("slot", { name: "control" }))) : (h(Fragment, null, this.label && !this.hideLabel && (h("span", { class: "dropdown-button-text" }, loc(this.label))), this.icon ? h("q2-icon", { type: this.icon }) : ' '))), h("q2-popover", { key: '4a15e7d6d8f474c8464e39e35437cd8edcc9487d', ref: el => (this.popoverElement = el), controlElement: this.controlElement, open: this.open, "max-height": this.popoverMaxHeight, onFocusout: this.handleFocusOut, minHeight: this.popoverMinHeight, direction: this.popoverDirection, align: this.popoverAlignment, mode: this.popoverMode || undefined, block: this.block }, h("slot", { key: '7854254650f81b8d5a229acbec55aa8beab36882', name: "popover-top" }), h("q2-option-list", { key: 'a38c9411306ad8d39456dce81bb50e9af13bf1f6', onPopoverState: this.onPopoverState, id: "option-list", ref: el => (this.optionList = el), type: "menu", label: loc('tecton.element.optionList.label', [this.optionListLabel]), "no-select": true }, h("slot", { key: '7472127d019366f76eff86cd744d050d197b25c1' })), h("slot", { key: '5af670e8f5ed273175100ddc9202c44e2c06f7b3', name: "popover-bottom" }))));
368
368
  }
369
369
  static get is() { return "q2-dropdown"; }
370
370
  static get encapsulation() { return "shadow"; }
@@ -22,7 +22,10 @@ export class Q2EditableField {
22
22
  this.cancelClick = (event) => {
23
23
  event === null || event === void 0 ? void 0 : event.stopPropagation();
24
24
  mirrorEmit(this, ['change', 'tctChange'], { editing: false, name: 'cancel' });
25
- this.inputElement.setValue(this.defaultValue);
25
+ this.innerValue = undefined;
26
+ this.formattedValue = undefined;
27
+ this.inputElement.value = '';
28
+ this.inputElement.value = this.defaultValue;
26
29
  };
27
30
  this.editClick = (event) => {
28
31
  event === null || event === void 0 ? void 0 : event.stopPropagation();
@@ -55,7 +58,6 @@ export class Q2EditableField {
55
58
  this.saveClick = (event) => {
56
59
  event && event.stopPropagation();
57
60
  const valueFromInputProp = this.hostElement.shadowRoot.querySelector('q2-input').value;
58
- this.defaultValue = valueFromInputProp;
59
61
  mirrorEmit(this, ['change', 'tctChange'], {
60
62
  editing: false,
61
63
  name: 'save',
@@ -180,6 +182,9 @@ export class Q2EditableField {
180
182
  return;
181
183
  this.inputElement.focus();
182
184
  }
185
+ valueObserver(newValue) {
186
+ this.defaultValue = newValue;
187
+ }
183
188
  // #endregion
184
189
  // #region Local Methods
185
190
  get hasErrors() {
@@ -206,7 +211,7 @@ export class Q2EditableField {
206
211
  // #endregion
207
212
  // #region Render Methods
208
213
  render() {
209
- return (h("div", { key: 'bd5759fc666e43c948cf4826e2075ba5566038cc' }, this.generateEditStateDOM(), this.generateReadStateDOM()));
214
+ return (h("div", { key: '8231300cc04b5b2dce65d3c39ef2e4c0bc892696' }, this.generateEditStateDOM(), this.generateReadStateDOM()));
210
215
  }
211
216
  static get is() { return "q2-editable-field"; }
212
217
  static get encapsulation() { return "shadow"; }
@@ -673,6 +678,9 @@ export class Q2EditableField {
673
678
  }, {
674
679
  "propName": "errors",
675
680
  "methodName": "errorsObserver"
681
+ }, {
682
+ "propName": "value",
683
+ "methodName": "valueObserver"
676
684
  }];
677
685
  }
678
686
  static get listeners() {
@@ -121,6 +121,9 @@ button {
121
121
  * @prop --tct-input-error-prefix-background: (<color>) Controls the background color of the input prefix in the error state.
122
122
  * @prop --tct-input-error-prefix-font-color?: (<color>) Controls the optional text color of the input prefix in the error state.
123
123
  * @prop --tct-input-placeholder-font-color: (<color>) Controls the placeholder text color of the input.
124
+ * @prop --tct-input-placeholder-font-size?: (<length-percentage>) Controls the optional font size of the input placeholder text.
125
+ * @prop --tct-input-placeholder-font-weight?: (<number>) Controls the optional font weight of the input placeholder text.
126
+ * @prop --tct-input-placeholder-padding?: (<length-percentage>+) Controls the optional inner padding of the input placeholder text.
124
127
  * @prop --tct-input-autofill-background: (<color>) Controls the background color of the input field when autofilled.
125
128
  * @prop --tct-input-autofill-font-color?: (<color>) Controls the optional text color of the input field when autofilled.
126
129
  * @prop --tct-input-label-font-color?: (<color>) Controls the optional text color of the input label.
@@ -393,9 +396,11 @@ button {
393
396
  max-width: 100%;
394
397
  }
395
398
  .has-custom-display .custom-display-container {
399
+ width: 100%;
400
+ }
401
+ .has-custom-display .custom-display-container ::slotted([slot=custom-display]) {
396
402
  --comp-default-padding: var(--app-scale-2x, 10px) var(--app-scale-2x, 10px) var(--app-scale-3x, 15px);
397
403
  padding: var(--tct-input-padding, var(--t-input-padding, var(--comp-default-padding)));
398
- width: 100%;
399
404
  }
400
405
 
401
406
  .input-field::placeholder,
@@ -508,6 +513,11 @@ q2-icon {
508
513
  --tct-icon-stroke-primary: var(--tct-stoplight-error, var(--const-stoplight-alert, #d20a0a));
509
514
  }
510
515
 
516
+ .icon-valid {
517
+ color: var(--tct-stoplight-success, var(--const-stoplight-success, #0e8a00));
518
+ --tct-icon-stroke-primary: var(--tct-stoplight-success, var(--const-stoplight-success, #0e8a00));
519
+ }
520
+
511
521
  .messages-container {
512
522
  height: 0px;
513
523
  overflow: hidden;
@@ -86,6 +86,8 @@ export class Q2Input {
86
86
  this.showVisibilityToggle = false;
87
87
  /** Specifies the field's expected [input type](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#Form_%3Cinput%3E_types), and provides the optimal keyboard on mobile devices. */
88
88
  this.type = 'text';
89
+ /** Displays a success state icon when the field does not have active errors. */
90
+ this.valid = false;
89
91
  /**
90
92
  * Sets textSelectedForDeletion to true if the user has selected text for deletion
91
93
  * This is used to prevent other logic from running when text is deleted
@@ -442,6 +444,9 @@ export class Q2Input {
442
444
  get hasInputRightSlot() {
443
445
  return hasSlotContent(this.hostElement, 'input-right');
444
446
  }
447
+ get hasValidState() {
448
+ return this.valid && !this.hasError;
449
+ }
445
450
  get inputDescribedBy() {
446
451
  return this.showMessages ? `${this.inputId}-description` : undefined;
447
452
  }
@@ -515,6 +520,8 @@ export class Q2Input {
515
520
  const classNames = ['field-container'];
516
521
  if (this.hasError)
517
522
  classNames.push('has-error');
523
+ if (this.hasValidState)
524
+ classNames.push('has-valid');
518
525
  if (!!this.value)
519
526
  classNames.push('has-value');
520
527
  if (this.clearable && !!this.value)
@@ -708,7 +715,7 @@ export class Q2Input {
708
715
  }
709
716
  renderInputContainerDOM() {
710
717
  const { hasInputLeftSlot, hasInputRightSlot } = this;
711
- return (h("div", { class: "input-container", tabindex: -1, "test-id": "inputContainer" }, h("div", { class: "input-icons-container-left" }, this.formattedValueObject.prefix && (h("div", { class: "input-prefix" }, this.formattedValueObject.prefix)), this.computedIconLeft && (h("div", null, h("q2-icon", { type: this.computedIconLeft, class: this.computedClassForIconLeft }))), hasInputLeftSlot && h("slot", { name: "input-left" }), this.showIconSeparator && h("div", { class: "vertical-separator" }), this.hasError && this.type === 'currency' && (h("div", { "test-id": "divIconError", onClick: this.onRefocusInput }, h("q2-icon", { type: "error", class: "icon-error", "test-id": "iconError" })))), this.pseudo ? this.renderPseudoInputDOM() : this.renderStandardInputDOM(), h("div", { class: "input-icons-container-right" }, h("q2-btn", { class: this.clearClasses.join(' '), label: loc('tecton.element.input.clear', [this.label]), hideLabel: true, "test-id": "clearButton", onMouseDown: e => e.preventDefault(), onClick: this.onClearInput, onKeyDown: e => e.stopPropagation() }, h("q2-icon", { type: "close", class: "icon-clear" })), ['password', 'text', 'ssn', 'tin'].includes(this.type) && this.showVisibilityToggle && (h("q2-btn", { class: "btn-visibility-toggle", "test-id": "toggleVisibilityButton", onClick: this.onToggleVisibility, label: loc(this.visibilityToggleAriaLabel, { label: this.label }), "hide-label": true }, this.visibilityToggleText)), this.formattedValueObject.suffix && (h("span", { class: "input-suffix" }, this.formattedValueObject.suffix)), this.badgeValue && (h("q2-badge", { size: "large", theme: this.badgeTheme }, this.badgeValue)), this.hasError && this.type !== 'currency' && (h("div", { "test-id": "divIconError", onClick: this.onRefocusInput }, h("q2-icon", { type: "error", class: "icon-error", "test-id": "iconError" }))), this.iconRight && !this.formattedValueObject.suffix && (h("div", null, h("q2-icon", { type: this.iconRight, class: "icon-right" }))), hasInputRightSlot && h("slot", { name: "input-right" }))));
718
+ return (h("div", { class: "input-container", tabindex: -1, "test-id": "inputContainer" }, h("div", { class: "input-icons-container-left" }, this.formattedValueObject.prefix && (h("div", { class: "input-prefix" }, this.formattedValueObject.prefix)), this.computedIconLeft && (h("div", null, h("q2-icon", { type: this.computedIconLeft, class: this.computedClassForIconLeft }))), hasInputLeftSlot && h("slot", { name: "input-left" }), this.showIconSeparator && h("div", { class: "vertical-separator" }), this.hasError && this.type === 'currency' && (h("div", { "test-id": "divIconError", onClick: this.onRefocusInput }, h("q2-icon", { type: "error", class: "icon-error", "test-id": "iconError" }))), this.hasValidState && this.type === 'currency' && (h("div", { class: "input-valid-icon-container", "test-id": "divIconValid" }, h("q2-icon", { type: "success", class: "icon-valid", "test-id": "iconValid" })))), this.pseudo ? this.renderPseudoInputDOM() : this.renderStandardInputDOM(), h("div", { class: "input-icons-container-right" }, h("q2-btn", { class: this.clearClasses.join(' '), label: loc('tecton.element.input.clear', [this.label]), hideLabel: true, "test-id": "clearButton", onMouseDown: e => e.preventDefault(), onClick: this.onClearInput, onKeyDown: e => e.stopPropagation() }, h("q2-icon", { type: "close", class: "icon-clear" })), ['password', 'text', 'ssn', 'tin'].includes(this.type) && this.showVisibilityToggle && (h("q2-btn", { class: "btn-visibility-toggle", "test-id": "toggleVisibilityButton", onClick: this.onToggleVisibility, label: loc(this.visibilityToggleAriaLabel, { label: this.label }), "hide-label": true }, this.visibilityToggleText)), this.formattedValueObject.suffix && (h("span", { class: "input-suffix" }, this.formattedValueObject.suffix)), this.badgeValue && (h("q2-badge", { size: "large", theme: this.badgeTheme }, this.badgeValue)), this.hasValidState && this.type !== 'currency' && (h("div", { class: "input-valid-icon-container", "test-id": "divIconValid" }, h("q2-icon", { type: "success", class: "icon-valid", "test-id": "iconValid" }))), this.hasError && this.type !== 'currency' && (h("div", { "test-id": "divIconError", onClick: this.onRefocusInput }, h("q2-icon", { type: "error", class: "icon-error", "test-id": "iconError" }))), this.iconRight && !this.formattedValueObject.suffix && (h("div", null, h("q2-icon", { type: this.iconRight, class: "icon-right" }))), hasInputRightSlot && h("slot", { name: "input-right" }))));
712
719
  }
713
720
  renderPseudoInputDOM() {
714
721
  const showPlaceholder = !this.value && !!this.placeholder;
@@ -725,7 +732,7 @@ export class Q2Input {
725
732
  }
726
733
  render() {
727
734
  const { ariaControls, ariaExpanded } = this.ariaAttributes;
728
- return (h(Host, { key: '46cdbeba2566abda875c4aa2cf8e4faa9ea2c85c', role: this._role, "aria-controls": ariaControls, "aria-expanded": ariaExpanded }, h("div", { key: '024c8a9551a4ae3661109e30da7f651b1b8fc7af', class: this.wrapperClasses }, h("div", { key: '11c2a87970b4a32d2b2efa7f2bad892ac0db63bf', class: "label-wrapper" }, renderLabel(this), this.renderCountDOM()), this.renderInputContainerDOM(), renderMessages(this))));
735
+ return (h(Host, { key: 'edb58506d07e300340ece461b1788acfcbaf712a', role: this._role, "aria-controls": ariaControls, "aria-expanded": ariaExpanded }, h("div", { key: '10bcd4e4adb9614628958029aca0d7cb96593c31', class: this.wrapperClasses }, h("div", { key: 'bfad0e782b14bc1ab1c2fd01cacc79d76f82f6ab', class: "label-wrapper" }, renderLabel(this), this.renderCountDOM()), this.renderInputContainerDOM(), renderMessages(this))));
729
736
  }
730
737
  static get is() { return "q2-input"; }
731
738
  static get encapsulation() { return "shadow"; }
@@ -1564,6 +1571,26 @@ export class Q2Input {
1564
1571
  "attribute": "type",
1565
1572
  "defaultValue": "'text'"
1566
1573
  },
1574
+ "valid": {
1575
+ "type": "boolean",
1576
+ "mutable": false,
1577
+ "complexType": {
1578
+ "original": "boolean",
1579
+ "resolved": "boolean",
1580
+ "references": {}
1581
+ },
1582
+ "required": false,
1583
+ "optional": false,
1584
+ "docs": {
1585
+ "tags": [],
1586
+ "text": "Displays a success state icon when the field does not have active errors."
1587
+ },
1588
+ "getter": false,
1589
+ "setter": false,
1590
+ "reflect": true,
1591
+ "attribute": "valid",
1592
+ "defaultValue": "false"
1593
+ },
1567
1594
  "validity": {
1568
1595
  "type": "unknown",
1569
1596
  "mutable": true,
@@ -44,6 +44,14 @@ const VARIANTS = [
44
44
  html: '<q2-input label="My input" placeholder="Enter text here"></q2-input>',
45
45
  setup: 'errors',
46
46
  },
47
+ {
48
+ name: 'valid',
49
+ html: '<q2-input label="My input" placeholder="Enter text here" valid value="Valid value"></q2-input>',
50
+ },
51
+ {
52
+ name: 'valid-currency',
53
+ html: '<q2-input label="My input" placeholder="Enter text here" type="currency" valid value="12.34"></q2-input>',
54
+ },
47
55
  ];
48
56
  const FOCUS_VARIANTS = new Set(['default', 'hinted', 'errored']);
49
57
  const applyInputSetup = async (page, setup) => {
@@ -144,6 +144,7 @@ button {
144
144
  * @prop --tct-item-avatar-height: (<length>) Controls the height applied to an avatar rendered in the item bullet area.
145
145
  * @prop --tct-item-avatar-width: (<length>) Controls the width applied to an avatar rendered in the item bullet area.
146
146
  * @prop --tct-item-action-align-items: (<custom-ident>) Controls the align-items value of the item action (trailing) area.
147
+ * @prop --tct-item-action-btn-icon-padding: (<length>) Controls the padding of icon buttons in the item action area.
147
148
  * @prop --tct-item-action-icon-height: (<length>) Controls the height applied to icon buttons in the item action area.
148
149
  * @prop --tct-item-action-icon-width: (<length>) Controls the width applied to icon buttons in the item action area.
149
150
  * @prop --tct-item-action-icon-size: (<length>) Controls the icon size applied to icons in the item action area.
@@ -198,9 +199,6 @@ button {
198
199
  }
199
200
 
200
201
  .action {
201
- --tct-btn-icon-height: var(--tct-item-action-icon-height, var(--app-scale-6x, 30px));
202
- --tct-btn-icon-width: var(--tct-item-action-icon-width, var(--app-scale-6x, 30px));
203
- --tct-icon-size: var(--tct-item-action-icon-size, var(--app-scale-6x, 30px));
204
202
  --tct-radio-label-hidden-columns: 18px;
205
203
  --tct-radio-label-margin-right: 0;
206
204
  --tct-radio-margin: 0;
@@ -212,9 +210,16 @@ button {
212
210
  .action-no-bullet {
213
211
  grid-column: 2;
214
212
  }
213
+ .action ::slotted(q2-dropdown[type=icon]),
214
+ .action ::slotted(q2-btn:not([intent])) {
215
+ --tct-btn-icon-height: var(--tct-item-action-icon-height, var(--app-scale-6x, 30px));
216
+ --tct-btn-icon-width: var(--tct-item-action-icon-width, var(--app-scale-6x, 30px));
217
+ --tct-icon-size: var(--tct-item-action-icon-size, var(--app-scale-6x, 30px));
218
+ --tct-btn-icon-padding: var(--tct-item-action-btn-icon-padding, 0);
219
+ }
215
220
 
216
221
  .body {
217
- color: var(--tct-item-body-color, var(--t-textA, #747474));
222
+ color: var(--tct-item-body-color, inherit);
218
223
  font-size: var(--tct-item-body-font-size, var(--app-font-size, 14px));
219
224
  font-weight: var(--tct-item-body-font-weight, 400);
220
225
  font-style: var(--tct-item-body-font-style, inherit);
@@ -282,7 +287,7 @@ button {
282
287
  }
283
288
 
284
289
  .header {
285
- color: var(--tct-item-header-color, var(--t-text, #4d4d4d));
290
+ color: var(--tct-item-header-color, inherit);
286
291
  font-size: var(--tct-item-header-font-size, 16px);
287
292
  font-style: var(--tct-item-header-font-style, inherit);
288
293
  font-weight: var(--tct-item-header-font-weight, 600);