Files
Manu Mtz.-Almeida 0dc70f7f6d fix(tap-click): works inside shadow-dom
adds private ion-activable attribute

fixes #15128
2018-08-12 22:48:58 +02:00

83 lines
2.0 KiB
TypeScript

import { Component, Element, Event, EventEmitter, Prop, Watch } from '@stencil/core';
import { Color, Mode } from '../../interface';
import { createColorClasses } from '../../utils/theme';
let ids = 0;
@Component({
tag: 'ion-segment-button',
styleUrl: 'segment-button.scss',
shadow: true
})
export class SegmentButton {
@Element() el!: HTMLElement;
/**
* The color to use from your application's color palette.
* Default options are: `"primary"`, `"secondary"`, `"tertiary"`, `"success"`, `"warning"`, `"danger"`, `"light"`, `"medium"`, and `"dark"`.
* For more information on colors, see [theming](/docs/theming/basics).
*/
@Prop() color?: Color;
/**
* The mode determines which platform styles to use.
* Possible values are: `"ios"` or `"md"`.
*/
@Prop() mode!: Mode;
/**
* If true, the segment button is selected. Defaults to `false`.
*/
@Prop({ mutable: true }) checked = false;
/*
* If true, the user cannot interact with the segment button. Default false.
*/
@Prop() disabled = false;
/**
* The value of the segment button.
*/
@Prop() value: string = 'ion-sb-' + (ids++);
/**
* Emitted when the segment button is clicked.
*/
@Event() ionSelect!: EventEmitter<void>;
@Watch('checked')
checkedChanged(checked: boolean, prev: boolean) {
if (checked && !prev) {
this.ionSelect.emit();
}
}
hostData() {
const { disabled, checked, color } = this;
return {
class: {
...createColorClasses(color),
'segment-button-disabled': disabled,
'segment-checked': checked,
},
'ion-activable': true,
};
}
render() {
return [
<button
type="button"
aria-pressed={this.checked ? 'true' : null}
class="segment-button-native"
disabled={this.disabled}
onClick={() => this.checked = true }>
<slot></slot>
{ this.mode === 'md' && <ion-ripple-effect tapClick={true} parent={this.el}/> }
</button>
];
}
}