codexly-ui 0.10.77 → 0.10.78

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.
@@ -925,14 +925,16 @@ class ClxButtonComponent {
925
925
  const shapeClass = s === 'rounded'
926
926
  ? resolveRadius(this._themeSvc.config().borderRadius)
927
927
  : BUTTON_SHAPE_FIXED[s];
928
- const overflowClass = (this.badge() !== undefined && this.badge() !== null) ? 'overflow-visible' : 'overflow-hidden';
928
+ // The host no longer needs to toggle overflow-hidden/-visible for the badge — the ripple has
929
+ // its own clipped container (.clx-ripple-clip) independent of the host's overflow, so the host
930
+ // can stay overflow-visible unconditionally without ripple waves escaping the button shape.
929
931
  // If the consumer already positions the button (absolute/fixed/sticky), don't force
930
932
  // `relative` — same-specificity utility classes are resolved by CSS source order, not
931
933
  // template order, so `relative` from the base class can silently win over a consumer's
932
934
  // `absolute`, leaving the button positioned in-flow instead of where it was placed.
933
935
  const isPositioned = /(^|\s)(absolute|fixed|sticky)(\s|$)/.test(this._consumerClass);
934
936
  const base = (isPositioned ? BUTTON_BASE_CLASS.replace(/^relative\s/, '') : BUTTON_BASE_CLASS)
935
- .replace('overflow-hidden', overflowClass);
937
+ .replace('overflow-hidden', 'overflow-visible');
936
938
  const consumer = this._consumerClass ? ` ${this._consumerClass}` : '';
937
939
  return `${base} ${colorClass} ${sizeClass} ${shapeClass}${this.block() ? ' w-full' : ''}${consumer}`.trimEnd();
938
940
  }, ...(ngDevMode ? [{ debugName: "_hostClass" }] : /* istanbul ignore next */ []));
@@ -958,20 +960,22 @@ class ClxButtonComponent {
958
960
  @if (icon() && iconPosition() === 'right' && !loading()) {
959
961
  <span clx-icon [name]="icon()!" [size]="_iconSize()"></span>
960
962
  }
961
- @for (r of _ripples(); track r.id) {
962
- <span
963
- class="clx-ripple-wave"
964
- [style.background-color]="_rippleColor()"
965
- [style.width.px]="r.diameter"
966
- [style.height.px]="r.diameter"
967
- [style.left.px]="r.x - r.diameter / 2"
968
- [style.top.px]="r.y - r.diameter / 2"
969
- ></span>
970
- }
963
+ <span class="clx-ripple-clip">
964
+ @for (r of _ripples(); track r.id) {
965
+ <span
966
+ class="clx-ripple-wave"
967
+ [style.background-color]="_rippleColor()"
968
+ [style.width.px]="r.diameter"
969
+ [style.height.px]="r.diameter"
970
+ [style.left.px]="r.x - r.diameter / 2"
971
+ [style.top.px]="r.y - r.diameter / 2"
972
+ ></span>
973
+ }
974
+ </span>
971
975
  @if (badge() !== undefined && badge() !== null) {
972
976
  <span [class]="_badgeClass()">{{ badge() }}</span>
973
977
  }
974
- `, isInline: true, styles: ["@keyframes clx-ripple-anim{to{transform:scale(4);opacity:0}}.clx-ripple-wave{position:absolute;border-radius:50%;transform:scale(0);animation:clx-ripple-anim .6s linear;pointer-events:none}\n"], dependencies: [{ kind: "component", type: ClxIconComponent, selector: "span[clx-icon]", inputs: ["name", "size", "color", "fill"] }, { kind: "component", type: ClxSpinnerComponent, selector: "clx-spinner", inputs: ["size", "color", "variant"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
978
+ `, isInline: true, styles: ["@keyframes clx-ripple-anim{to{transform:scale(4);opacity:0}}.clx-ripple-clip{position:absolute;inset:0;overflow:hidden;border-radius:inherit;pointer-events:none}.clx-ripple-wave{position:absolute;border-radius:50%;transform:scale(0);animation:clx-ripple-anim .6s linear;pointer-events:none}\n"], dependencies: [{ kind: "component", type: ClxIconComponent, selector: "span[clx-icon]", inputs: ["name", "size", "color", "fill"] }, { kind: "component", type: ClxSpinnerComponent, selector: "clx-spinner", inputs: ["size", "color", "variant"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
975
979
  }
976
980
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.15", ngImport: i0, type: ClxButtonComponent, decorators: [{
977
981
  type: Component,
@@ -986,16 +990,18 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.15", ngImpo
986
990
  @if (icon() && iconPosition() === 'right' && !loading()) {
987
991
  <span clx-icon [name]="icon()!" [size]="_iconSize()"></span>
988
992
  }
989
- @for (r of _ripples(); track r.id) {
990
- <span
991
- class="clx-ripple-wave"
992
- [style.background-color]="_rippleColor()"
993
- [style.width.px]="r.diameter"
994
- [style.height.px]="r.diameter"
995
- [style.left.px]="r.x - r.diameter / 2"
996
- [style.top.px]="r.y - r.diameter / 2"
997
- ></span>
998
- }
993
+ <span class="clx-ripple-clip">
994
+ @for (r of _ripples(); track r.id) {
995
+ <span
996
+ class="clx-ripple-wave"
997
+ [style.background-color]="_rippleColor()"
998
+ [style.width.px]="r.diameter"
999
+ [style.height.px]="r.diameter"
1000
+ [style.left.px]="r.x - r.diameter / 2"
1001
+ [style.top.px]="r.y - r.diameter / 2"
1002
+ ></span>
1003
+ }
1004
+ </span>
999
1005
  @if (badge() !== undefined && badge() !== null) {
1000
1006
  <span [class]="_badgeClass()">{{ badge() }}</span>
1001
1007
  }
@@ -1006,7 +1012,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.15", ngImpo
1006
1012
  '[attr.disabled]': '_inactive() ? true : null',
1007
1013
  '[attr.aria-busy]': 'loading()',
1008
1014
  '(click)': '_onRipple($event)',
1009
- }, styles: ["@keyframes clx-ripple-anim{to{transform:scale(4);opacity:0}}.clx-ripple-wave{position:absolute;border-radius:50%;transform:scale(0);animation:clx-ripple-anim .6s linear;pointer-events:none}\n"] }]
1015
+ }, styles: ["@keyframes clx-ripple-anim{to{transform:scale(4);opacity:0}}.clx-ripple-clip{position:absolute;inset:0;overflow:hidden;border-radius:inherit;pointer-events:none}.clx-ripple-wave{position:absolute;border-radius:50%;transform:scale(0);animation:clx-ripple-anim .6s linear;pointer-events:none}\n"] }]
1010
1016
  }], propDecorators: { variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], color: [{ type: i0.Input, args: [{ isSignal: true, alias: "color", required: false }] }], textColor: [{ type: i0.Input, args: [{ isSignal: true, alias: "textColor", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], shape: [{ type: i0.Input, args: [{ isSignal: true, alias: "shape", required: false }] }], loading: [{ type: i0.Input, args: [{ isSignal: true, alias: "loading", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], block: [{ type: i0.Input, args: [{ isSignal: true, alias: "block", required: false }] }], icon: [{ type: i0.Input, args: [{ isSignal: true, alias: "icon", required: false }] }], iconPosition: [{ type: i0.Input, args: [{ isSignal: true, alias: "iconPosition", required: false }] }], iconOnly: [{ type: i0.Input, args: [{ isSignal: true, alias: "iconOnly", required: false }] }], badge: [{ type: i0.Input, args: [{ isSignal: true, alias: "badge", required: false }] }], badgeColor: [{ type: i0.Input, args: [{ isSignal: true, alias: "badgeColor", required: false }] }] } });
1011
1017
 
1012
1018
  class ClxButtonGroupComponent {