|
@@ -0,0 +1,1276 @@
|
|
|
+/**
|
|
|
+ * Convert a font size to a dynamic font size.
|
|
|
+ * Fonts that participate in Dynamic Type should use
|
|
|
+ * dynamic font sizes.
|
|
|
+ * @param size - The initial font size including the unit (i.e. px or pt)
|
|
|
+ * @param unit (optional) - The unit to convert to. Use this if you want to
|
|
|
+ * convert to a unit other than $baselineUnit.
|
|
|
+ */
|
|
|
+/**
|
|
|
+ * Convert a font size to a dynamic font size but impose
|
|
|
+ * a maximum font size.
|
|
|
+ * @param size - The initial font size including the unit (i.e. px or pt)
|
|
|
+ * @param maxScale - The maximum scale of the font (i.e. 2.5 for a maximum 250% scale).
|
|
|
+ * @param unit (optional) - The unit to convert the initial font size to. Use this if you want to
|
|
|
+ * convert to a unit other than $baselineUnit.
|
|
|
+ */
|
|
|
+/**
|
|
|
+ * Convert a font size to a dynamic font size but impose
|
|
|
+ * a minimum font size.
|
|
|
+ * @param size - The initial font size including the unit (i.e. px or pt)
|
|
|
+ * @param minScale - The minimum scale of the font (i.e. 0.8 for a minimum 80% scale).
|
|
|
+ * @param unit (optional) - The unit to convert the initial font size to. Use this if you want to
|
|
|
+ * convert to a unit other than $baselineUnit.
|
|
|
+ */
|
|
|
+/**
|
|
|
+ * Convert a font size to a dynamic font size but impose
|
|
|
+ * maximum and minimum font sizes.
|
|
|
+ * @param size - The initial font size including the unit (i.e. px or pt)
|
|
|
+ * @param minScale - The minimum scale of the font (i.e. 0.8 for a minimum 80% scale).
|
|
|
+ * @param maxScale - The maximum scale of the font (i.e. 2.5 for a maximum 250% scale).
|
|
|
+ * @param unit (optional) - The unit to convert the initial font size to. Use this if you want to
|
|
|
+ * convert to a unit other than $baselineUnit.
|
|
|
+ */
|
|
|
+/**
|
|
|
+ * A heuristic that applies CSS to tablet
|
|
|
+ * viewports.
|
|
|
+ *
|
|
|
+ * Usage:
|
|
|
+ * @include tablet-viewport() {
|
|
|
+ * :host {
|
|
|
+ * background-color: green;
|
|
|
+ * }
|
|
|
+ * }
|
|
|
+ */
|
|
|
+/**
|
|
|
+ * A heuristic that applies CSS to mobile
|
|
|
+ * viewports (i.e. phones, not tablets).
|
|
|
+ *
|
|
|
+ * Usage:
|
|
|
+ * @include mobile-viewport() {
|
|
|
+ * :host {
|
|
|
+ * background-color: blue;
|
|
|
+ * }
|
|
|
+ * }
|
|
|
+ */
|
|
|
+:host {
|
|
|
+ /**
|
|
|
+ * @prop --background: Background of the input
|
|
|
+ *
|
|
|
+ * @prop --color: Color of the input text
|
|
|
+ *
|
|
|
+ * @prop --padding-top: Top padding of the input
|
|
|
+ * @prop --padding-end: Right padding if direction is left-to-right, and left padding if direction is right-to-left of the input
|
|
|
+ * @prop --padding-bottom: Bottom padding of the input
|
|
|
+ * @prop --padding-start: Left padding if direction is left-to-right, and right padding if direction is right-to-left of the input
|
|
|
+ *
|
|
|
+ * @prop --placeholder-color: Color of the input placeholder text
|
|
|
+ * @prop --placeholder-font-style: Font style of the input placeholder text
|
|
|
+ * @prop --placeholder-font-weight: Font weight of the input placeholder text
|
|
|
+ * @prop --placeholder-opacity: Opacity of the input placeholder text
|
|
|
+ *
|
|
|
+ * @prop --highlight-height: The height of the highlight on the input. Only applies to md mode.
|
|
|
+ * @prop --highlight-color-focused: The color of the highlight on the input when focused
|
|
|
+ * @prop --highlight-color-valid: The color of the highlight on the input when valid
|
|
|
+ * @prop --highlight-color-invalid: The color of the highlight on the input when invalid
|
|
|
+ *
|
|
|
+ * @prop --border-color: Color of the border below the input when using helper text, error text, or counter
|
|
|
+ * @prop --border-radius: Radius of the input. A large radius may display unevenly when using fill="outline"; if needed, use shape="round" instead or increase --padding-start.
|
|
|
+ * @prop --border-style: Style of the border below the input when using helper text, error text, or counter
|
|
|
+ * @prop --border-width: Width of the border below the input when using helper text, error text, or counter
|
|
|
+ */
|
|
|
+ --placeholder-color: initial;
|
|
|
+ --placeholder-font-style: initial;
|
|
|
+ --placeholder-font-weight: initial;
|
|
|
+ --placeholder-opacity: var(--ion-placeholder-opacity, 0.6);
|
|
|
+ --padding-top: 0px;
|
|
|
+ --padding-end: 0px;
|
|
|
+ --padding-bottom: 0px;
|
|
|
+ --padding-start: 0px;
|
|
|
+ --background: transparent;
|
|
|
+ --color: initial;
|
|
|
+ --border-style: solid;
|
|
|
+ --highlight-color-focused: var(--ion-color-primary, #0054e9);
|
|
|
+ --highlight-color-valid: var(--ion-color-success, #2dd55b);
|
|
|
+ --highlight-color-invalid: var(--ion-color-danger, #c5000f);
|
|
|
+ /**
|
|
|
+ * This is a private API that is used to switch
|
|
|
+ * out the highlight color based on the state
|
|
|
+ * of the component without having to write
|
|
|
+ * different selectors for different fill variants.
|
|
|
+ */
|
|
|
+ --highlight-color: var(--highlight-color-focused);
|
|
|
+ display: block;
|
|
|
+ position: relative;
|
|
|
+ width: 100%;
|
|
|
+ min-height: 44px;
|
|
|
+ /* stylelint-disable-next-line all */
|
|
|
+ padding: 0 !important;
|
|
|
+ color: var(--color);
|
|
|
+ font-family: var(--ion-font-family, inherit);
|
|
|
+ z-index: 2;
|
|
|
+}
|
|
|
+
|
|
|
+:host-context(ion-item)[slot=start],
|
|
|
+:host-context(ion-item)[slot=end] {
|
|
|
+ width: auto;
|
|
|
+}
|
|
|
+
|
|
|
+:host(.ion-color) {
|
|
|
+ --highlight-color-focused: var(--ion-color-base);
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * Since the label sits on top of the element,
|
|
|
+ * the component needs to be taller otherwise the
|
|
|
+ * label will appear too close to the input text.
|
|
|
+ */
|
|
|
+:host(.input-label-placement-floating),
|
|
|
+:host(.input-label-placement-stacked) {
|
|
|
+ min-height: 56px;
|
|
|
+}
|
|
|
+
|
|
|
+.native-input {
|
|
|
+ padding-left: 0;
|
|
|
+ padding-right: 0;
|
|
|
+ padding-top: 0;
|
|
|
+ padding-bottom: 0;
|
|
|
+ font-family: inherit;
|
|
|
+ font-size: inherit;
|
|
|
+ font-style: inherit;
|
|
|
+ font-weight: inherit;
|
|
|
+ letter-spacing: inherit;
|
|
|
+ text-decoration: inherit;
|
|
|
+ text-indent: inherit;
|
|
|
+ text-overflow: inherit;
|
|
|
+ text-transform: inherit;
|
|
|
+ text-align: inherit;
|
|
|
+ white-space: inherit;
|
|
|
+ color: inherit;
|
|
|
+ display: inline-block;
|
|
|
+ position: relative;
|
|
|
+ flex: 1;
|
|
|
+ width: 100%;
|
|
|
+ max-width: 100%;
|
|
|
+ max-height: 100%;
|
|
|
+ border: 0;
|
|
|
+ outline: none;
|
|
|
+ background: transparent;
|
|
|
+ box-sizing: border-box;
|
|
|
+ appearance: none;
|
|
|
+ /**
|
|
|
+ * This ensures the input
|
|
|
+ * remains on top of any decoration
|
|
|
+ * that we render (particularly the
|
|
|
+ * outline border when fill="outline").
|
|
|
+ * If we did not do this then Axe would
|
|
|
+ * be unable to determine the color
|
|
|
+ * contrast of the input.
|
|
|
+ */
|
|
|
+ z-index: 1;
|
|
|
+}
|
|
|
+.native-input::placeholder {
|
|
|
+ color: var(--placeholder-color);
|
|
|
+ font-family: inherit;
|
|
|
+ font-style: var(--placeholder-font-style);
|
|
|
+ font-weight: var(--placeholder-font-weight);
|
|
|
+ opacity: var(--placeholder-opacity);
|
|
|
+}
|
|
|
+.native-input:-webkit-autofill {
|
|
|
+ background-color: transparent;
|
|
|
+}
|
|
|
+.native-input:invalid {
|
|
|
+ box-shadow: none;
|
|
|
+}
|
|
|
+.native-input::-ms-clear {
|
|
|
+ display: none;
|
|
|
+}
|
|
|
+
|
|
|
+.cloned-input {
|
|
|
+ top: 0;
|
|
|
+ bottom: 0;
|
|
|
+ position: absolute;
|
|
|
+ pointer-events: none;
|
|
|
+}
|
|
|
+.cloned-input {
|
|
|
+ inset-inline-start: 0;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * The cloned input needs to be disabled on
|
|
|
+ * Android otherwise the viewport will still
|
|
|
+ * shift when running scroll assist.
|
|
|
+ */
|
|
|
+.cloned-input:disabled {
|
|
|
+ opacity: 1;
|
|
|
+}
|
|
|
+
|
|
|
+.input-clear-icon {
|
|
|
+ -webkit-margin-start: auto;
|
|
|
+ margin-inline-start: auto;
|
|
|
+ -webkit-margin-end: auto;
|
|
|
+ margin-inline-end: auto;
|
|
|
+ margin-top: auto;
|
|
|
+ margin-bottom: auto;
|
|
|
+ padding-left: 0;
|
|
|
+ padding-right: 0;
|
|
|
+ padding-top: 0;
|
|
|
+ padding-bottom: 0;
|
|
|
+ background-position: center;
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: center;
|
|
|
+ width: 30px;
|
|
|
+ height: 30px;
|
|
|
+ border: 0;
|
|
|
+ outline: none;
|
|
|
+ background-color: transparent;
|
|
|
+ background-repeat: no-repeat;
|
|
|
+ color: var(--ion-color-step-600, var(--ion-text-color-step-400, #666666));
|
|
|
+ visibility: hidden;
|
|
|
+ appearance: none;
|
|
|
+}
|
|
|
+
|
|
|
+:host(.in-item-color) .input-clear-icon {
|
|
|
+ color: inherit;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * Normally, we would not want to use :focus
|
|
|
+ * here because that would mean tapping the button
|
|
|
+ * on mobile would focus it (and keep it focused).
|
|
|
+ * However, the clear button always disappears after
|
|
|
+ * being activated, so we never get to that state.
|
|
|
+ */
|
|
|
+.input-clear-icon:focus {
|
|
|
+ opacity: 0.5;
|
|
|
+}
|
|
|
+
|
|
|
+:host(.has-value) .input-clear-icon {
|
|
|
+ visibility: visible;
|
|
|
+}
|
|
|
+
|
|
|
+.input-wrapper {
|
|
|
+ -webkit-padding-start: var(--padding-start);
|
|
|
+ padding-inline-start: var(--padding-start);
|
|
|
+ -webkit-padding-end: var(--padding-end);
|
|
|
+ padding-inline-end: var(--padding-end);
|
|
|
+ padding-top: var(--padding-top);
|
|
|
+ padding-bottom: var(--padding-bottom);
|
|
|
+ border-radius: var(--border-radius);
|
|
|
+ display: flex;
|
|
|
+ position: relative;
|
|
|
+ flex-grow: 1;
|
|
|
+ align-items: stretch;
|
|
|
+ height: inherit;
|
|
|
+ min-height: inherit;
|
|
|
+ transition: background-color 15ms linear;
|
|
|
+ background: var(--background);
|
|
|
+ line-height: normal;
|
|
|
+}
|
|
|
+
|
|
|
+.native-wrapper {
|
|
|
+ display: flex;
|
|
|
+ position: relative;
|
|
|
+ flex-grow: 1;
|
|
|
+ align-items: center;
|
|
|
+ width: 100%;
|
|
|
+}
|
|
|
+
|
|
|
+:host(.ion-touched.ion-invalid) {
|
|
|
+ --highlight-color: var(--highlight-color-invalid);
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * The component highlight is only shown
|
|
|
+ * on focus, so we can safely set the valid
|
|
|
+ * color state when valid. If we
|
|
|
+ * set it when .has-focus is present then
|
|
|
+ * the highlight color would change
|
|
|
+ * from the valid color to the component's
|
|
|
+ * color during the transition after the
|
|
|
+ * component loses focus.
|
|
|
+ */
|
|
|
+:host(.ion-valid) {
|
|
|
+ --highlight-color: var(--highlight-color-valid);
|
|
|
+}
|
|
|
+
|
|
|
+.input-bottom {
|
|
|
+ /**
|
|
|
+ * The bottom content should take on the start and end
|
|
|
+ * padding so it is always aligned with either the label
|
|
|
+ * or the start of the text input.
|
|
|
+ */
|
|
|
+ -webkit-padding-start: var(--padding-start);
|
|
|
+ padding-inline-start: var(--padding-start);
|
|
|
+ -webkit-padding-end: var(--padding-end);
|
|
|
+ padding-inline-end: var(--padding-end);
|
|
|
+ padding-top: 5px;
|
|
|
+ padding-bottom: 0;
|
|
|
+ display: flex;
|
|
|
+ justify-content: space-between;
|
|
|
+ border-top: var(--border-width) var(--border-style) var(--border-color);
|
|
|
+ font-size: 0.75rem;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * If the input has a validity state, the
|
|
|
+ * border and label should reflect that as a color.
|
|
|
+ * The invalid state should show if the input is
|
|
|
+ * invalid and has already been touched.
|
|
|
+ * The valid state should show if the input
|
|
|
+ * is valid, has already been touched, and
|
|
|
+ * is currently focused. Do not show the valid
|
|
|
+ * highlight when the input is blurred.
|
|
|
+ */
|
|
|
+:host(.has-focus.ion-valid),
|
|
|
+:host(.ion-touched.ion-invalid) {
|
|
|
+ --border-color: var(--highlight-color);
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * Error text should only be shown when .ion-invalid is
|
|
|
+ * present on the input. Otherwise the helper text should
|
|
|
+ * be shown.
|
|
|
+ */
|
|
|
+.input-bottom .error-text {
|
|
|
+ display: none;
|
|
|
+ color: var(--highlight-color-invalid);
|
|
|
+}
|
|
|
+
|
|
|
+.input-bottom .helper-text {
|
|
|
+ display: block;
|
|
|
+ color: var(--ion-color-step-550, var(--ion-text-color-step-450, #737373));
|
|
|
+}
|
|
|
+
|
|
|
+:host(.ion-touched.ion-invalid) .input-bottom .error-text {
|
|
|
+ display: block;
|
|
|
+}
|
|
|
+
|
|
|
+:host(.ion-touched.ion-invalid) .input-bottom .helper-text {
|
|
|
+ display: none;
|
|
|
+}
|
|
|
+
|
|
|
+.input-bottom .counter {
|
|
|
+ /**
|
|
|
+ * Counter should always be at
|
|
|
+ * the end of the container even
|
|
|
+ * when no helper/error texts are used.
|
|
|
+ */
|
|
|
+ -webkit-margin-start: auto;
|
|
|
+ margin-inline-start: auto;
|
|
|
+ color: var(--ion-color-step-550, var(--ion-text-color-step-450, #737373));
|
|
|
+ white-space: nowrap;
|
|
|
+ padding-inline-start: 16px;
|
|
|
+}
|
|
|
+
|
|
|
+:host(.has-focus) input {
|
|
|
+ caret-color: var(--highlight-color);
|
|
|
+}
|
|
|
+
|
|
|
+.label-text-wrapper {
|
|
|
+ /**
|
|
|
+ * This causes the label to take up
|
|
|
+ * the entire height of its container
|
|
|
+ * while still keeping the text centered.
|
|
|
+ */
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ /**
|
|
|
+ * Label text should not extend
|
|
|
+ * beyond the bounds of the input.
|
|
|
+ * However, we do not set the max
|
|
|
+ * width to 100% because then
|
|
|
+ * only the label would show and users
|
|
|
+ * would not be able to see what they are typing.
|
|
|
+ */
|
|
|
+ max-width: 200px;
|
|
|
+ transition: color 150ms cubic-bezier(0.4, 0, 0.2, 1), transform 150ms cubic-bezier(0.4, 0, 0.2, 1);
|
|
|
+ /**
|
|
|
+ * This ensures that double tapping this text
|
|
|
+ * clicks the <label> and focuses the input
|
|
|
+ * when a screen reader is enabled.
|
|
|
+ */
|
|
|
+ pointer-events: none;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * We need to use two elements instead of
|
|
|
+ * one. The .label-text-wrapper is responsible
|
|
|
+ * for centering the label text vertically regardless
|
|
|
+ * of the input height using flexbox.
|
|
|
+ *
|
|
|
+ * The .label-text element is responsible for controlling
|
|
|
+ * overflow when label-placement="fixed".
|
|
|
+ * We want the ellipses to show up when the
|
|
|
+ * fixed label overflows, but text-overflow: ellipsis only
|
|
|
+ * works on block-level elements. A flex item is
|
|
|
+ * considered blockified (https://www.w3.org/TR/css-display-3/#blockify).
|
|
|
+ */
|
|
|
+.label-text,
|
|
|
+::slotted([slot=label]) {
|
|
|
+ text-overflow: ellipsis;
|
|
|
+ white-space: nowrap;
|
|
|
+ overflow: hidden;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * If no label text is placed into the slot
|
|
|
+ * then the element should be hidden otherwise
|
|
|
+ * there will be additional margins added.
|
|
|
+ */
|
|
|
+.label-text-wrapper-hidden,
|
|
|
+.input-outline-notch-hidden {
|
|
|
+ display: none;
|
|
|
+}
|
|
|
+
|
|
|
+.input-wrapper input {
|
|
|
+ /**
|
|
|
+ * When the floating label appears on top of the
|
|
|
+ * input, we need to fade the input out so that the
|
|
|
+ * label does not overlap with the placeholder.
|
|
|
+ */
|
|
|
+ transition: opacity 150ms cubic-bezier(0.4, 0, 0.2, 1);
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * Label is on the left of the input in LTR and
|
|
|
+ * on the right in RTL.
|
|
|
+ */
|
|
|
+:host(.input-label-placement-start) .input-wrapper {
|
|
|
+ flex-direction: row;
|
|
|
+}
|
|
|
+
|
|
|
+:host(.input-label-placement-start) .label-text-wrapper {
|
|
|
+ /**
|
|
|
+ * The margin between the label and
|
|
|
+ * the input should be on the end
|
|
|
+ * when the label sits at the start.
|
|
|
+ */
|
|
|
+ -webkit-margin-start: 0;
|
|
|
+ margin-inline-start: 0;
|
|
|
+ -webkit-margin-end: 16px;
|
|
|
+ margin-inline-end: 16px;
|
|
|
+ margin-top: 0;
|
|
|
+ margin-bottom: 0;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * Label is on the right of the input in LTR and
|
|
|
+ * on the left in RTL.
|
|
|
+ */
|
|
|
+:host(.input-label-placement-end) .input-wrapper {
|
|
|
+ flex-direction: row-reverse;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * The margin between the label and
|
|
|
+ * the input should be on the start
|
|
|
+ * when the label sits at the end.
|
|
|
+ */
|
|
|
+:host(.input-label-placement-end) .label-text-wrapper {
|
|
|
+ -webkit-margin-start: 16px;
|
|
|
+ margin-inline-start: 16px;
|
|
|
+ -webkit-margin-end: 0;
|
|
|
+ margin-inline-end: 0;
|
|
|
+ margin-top: 0;
|
|
|
+ margin-bottom: 0;
|
|
|
+}
|
|
|
+
|
|
|
+:host(.input-label-placement-fixed) .label-text-wrapper {
|
|
|
+ /**
|
|
|
+ * The margin between the label and
|
|
|
+ * the input should be on the end
|
|
|
+ * when the label sits at the start.
|
|
|
+ */
|
|
|
+ -webkit-margin-start: 0;
|
|
|
+ margin-inline-start: 0;
|
|
|
+ -webkit-margin-end: 16px;
|
|
|
+ margin-inline-end: 16px;
|
|
|
+ margin-top: 0;
|
|
|
+ margin-bottom: 0;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * Label is on the left of the input in LTR and
|
|
|
+ * on the right in RTL. Label also has a fixed width.
|
|
|
+ */
|
|
|
+:host(.input-label-placement-fixed) .label-text {
|
|
|
+ flex: 0 0 100px;
|
|
|
+ width: 100px;
|
|
|
+ min-width: 100px;
|
|
|
+ max-width: 200px;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * Stacked: Label sits above the input and is scaled down.
|
|
|
+ * Floating: Label sits over the input when the input has no
|
|
|
+ * value and is blurred. Label sits above the input and is scaled
|
|
|
+ * down when the input is focused or has a value.
|
|
|
+ *
|
|
|
+ */
|
|
|
+:host(.input-label-placement-stacked) .input-wrapper,
|
|
|
+:host(.input-label-placement-floating) .input-wrapper {
|
|
|
+ flex-direction: column;
|
|
|
+ align-items: start;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * Ensures that the label animates
|
|
|
+ * up and to the left in LTR or
|
|
|
+ * up and to the right in RTL.
|
|
|
+ */
|
|
|
+:host(.input-label-placement-stacked) .label-text-wrapper,
|
|
|
+:host(.input-label-placement-floating) .label-text-wrapper {
|
|
|
+ transform-origin: left top;
|
|
|
+ max-width: 100%;
|
|
|
+ /**
|
|
|
+ * The 2 ensures the label
|
|
|
+ * remains on top of any browser
|
|
|
+ * autofill background too.
|
|
|
+ */
|
|
|
+ z-index: 2;
|
|
|
+}
|
|
|
+:host-context([dir=rtl]):host(.input-label-placement-stacked) .label-text-wrapper, :host-context([dir=rtl]).input-label-placement-stacked .label-text-wrapper, :host-context([dir=rtl]):host(.input-label-placement-floating) .label-text-wrapper, :host-context([dir=rtl]).input-label-placement-floating .label-text-wrapper {
|
|
|
+ transform-origin: right top;
|
|
|
+}
|
|
|
+
|
|
|
+@supports selector(:dir(rtl)) {
|
|
|
+ :host(.input-label-placement-stacked:dir(rtl)) .label-text-wrapper, :host(.input-label-placement-floating:dir(rtl)) .label-text-wrapper {
|
|
|
+ transform-origin: right top;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * Ensures the input does not
|
|
|
+ * overlap the label.
|
|
|
+ */
|
|
|
+:host(.input-label-placement-stacked) input,
|
|
|
+:host(.input-label-placement-floating) input {
|
|
|
+ margin-left: 0;
|
|
|
+ margin-right: 0;
|
|
|
+ margin-top: 1px;
|
|
|
+ margin-bottom: 0;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * This makes the label sit over the input
|
|
|
+ * when the input is blurred and has no value.
|
|
|
+ */
|
|
|
+:host(.input-label-placement-floating) .label-text-wrapper {
|
|
|
+ transform: translateY(100%) scale(1);
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * The input should be hidden when the label
|
|
|
+ * is on top of the input. This prevents the label
|
|
|
+ * from overlapping any placeholder value.
|
|
|
+ */
|
|
|
+:host(.input-label-placement-floating) input {
|
|
|
+ opacity: 0;
|
|
|
+}
|
|
|
+
|
|
|
+:host(.has-focus.input-label-placement-floating) input,
|
|
|
+:host(.has-value.input-label-placement-floating) input {
|
|
|
+ opacity: 1;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * This makes the label sit above the input.
|
|
|
+ */
|
|
|
+:host(.label-floating) .label-text-wrapper {
|
|
|
+ transform: translateY(50%) scale(0.75);
|
|
|
+ /**
|
|
|
+ * Label text should not extend
|
|
|
+ * beyond the bounds of the input.
|
|
|
+ */
|
|
|
+ max-width: calc(100% / 0.75);
|
|
|
+}
|
|
|
+
|
|
|
+::slotted([slot=start]:last-of-type) {
|
|
|
+ margin-inline-end: 16px;
|
|
|
+ margin-inline-start: 0;
|
|
|
+}
|
|
|
+
|
|
|
+::slotted([slot=end]:first-of-type) {
|
|
|
+ margin-inline-start: 16px;
|
|
|
+ margin-inline-end: 0;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * The input password toggle component should be hidden when the input is readonly/disabled
|
|
|
+ * because it is not possible to edit a password.
|
|
|
+ */
|
|
|
+:host([disabled]) ::slotted(ion-input-password-toggle),
|
|
|
+:host([readonly]) ::slotted(ion-input-password-toggle) {
|
|
|
+ display: none;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * Convert a font size to a dynamic font size.
|
|
|
+ * Fonts that participate in Dynamic Type should use
|
|
|
+ * dynamic font sizes.
|
|
|
+ * @param size - The initial font size including the unit (i.e. px or pt)
|
|
|
+ * @param unit (optional) - The unit to convert to. Use this if you want to
|
|
|
+ * convert to a unit other than $baselineUnit.
|
|
|
+ */
|
|
|
+/**
|
|
|
+ * Convert a font size to a dynamic font size but impose
|
|
|
+ * a maximum font size.
|
|
|
+ * @param size - The initial font size including the unit (i.e. px or pt)
|
|
|
+ * @param maxScale - The maximum scale of the font (i.e. 2.5 for a maximum 250% scale).
|
|
|
+ * @param unit (optional) - The unit to convert the initial font size to. Use this if you want to
|
|
|
+ * convert to a unit other than $baselineUnit.
|
|
|
+ */
|
|
|
+/**
|
|
|
+ * Convert a font size to a dynamic font size but impose
|
|
|
+ * a minimum font size.
|
|
|
+ * @param size - The initial font size including the unit (i.e. px or pt)
|
|
|
+ * @param minScale - The minimum scale of the font (i.e. 0.8 for a minimum 80% scale).
|
|
|
+ * @param unit (optional) - The unit to convert the initial font size to. Use this if you want to
|
|
|
+ * convert to a unit other than $baselineUnit.
|
|
|
+ */
|
|
|
+/**
|
|
|
+ * Convert a font size to a dynamic font size but impose
|
|
|
+ * maximum and minimum font sizes.
|
|
|
+ * @param size - The initial font size including the unit (i.e. px or pt)
|
|
|
+ * @param minScale - The minimum scale of the font (i.e. 0.8 for a minimum 80% scale).
|
|
|
+ * @param maxScale - The maximum scale of the font (i.e. 2.5 for a maximum 250% scale).
|
|
|
+ * @param unit (optional) - The unit to convert the initial font size to. Use this if you want to
|
|
|
+ * convert to a unit other than $baselineUnit.
|
|
|
+ */
|
|
|
+/**
|
|
|
+ * A heuristic that applies CSS to tablet
|
|
|
+ * viewports.
|
|
|
+ *
|
|
|
+ * Usage:
|
|
|
+ * @include tablet-viewport() {
|
|
|
+ * :host {
|
|
|
+ * background-color: green;
|
|
|
+ * }
|
|
|
+ * }
|
|
|
+ */
|
|
|
+/**
|
|
|
+ * A heuristic that applies CSS to mobile
|
|
|
+ * viewports (i.e. phones, not tablets).
|
|
|
+ *
|
|
|
+ * Usage:
|
|
|
+ * @include mobile-viewport() {
|
|
|
+ * :host {
|
|
|
+ * background-color: blue;
|
|
|
+ * }
|
|
|
+ * }
|
|
|
+ */
|
|
|
+/**
|
|
|
+ * Convert a font size to a dynamic font size.
|
|
|
+ * Fonts that participate in Dynamic Type should use
|
|
|
+ * dynamic font sizes.
|
|
|
+ * @param size - The initial font size including the unit (i.e. px or pt)
|
|
|
+ * @param unit (optional) - The unit to convert to. Use this if you want to
|
|
|
+ * convert to a unit other than $baselineUnit.
|
|
|
+ */
|
|
|
+/**
|
|
|
+ * Convert a font size to a dynamic font size but impose
|
|
|
+ * a maximum font size.
|
|
|
+ * @param size - The initial font size including the unit (i.e. px or pt)
|
|
|
+ * @param maxScale - The maximum scale of the font (i.e. 2.5 for a maximum 250% scale).
|
|
|
+ * @param unit (optional) - The unit to convert the initial font size to. Use this if you want to
|
|
|
+ * convert to a unit other than $baselineUnit.
|
|
|
+ */
|
|
|
+/**
|
|
|
+ * Convert a font size to a dynamic font size but impose
|
|
|
+ * a minimum font size.
|
|
|
+ * @param size - The initial font size including the unit (i.e. px or pt)
|
|
|
+ * @param minScale - The minimum scale of the font (i.e. 0.8 for a minimum 80% scale).
|
|
|
+ * @param unit (optional) - The unit to convert the initial font size to. Use this if you want to
|
|
|
+ * convert to a unit other than $baselineUnit.
|
|
|
+ */
|
|
|
+/**
|
|
|
+ * Convert a font size to a dynamic font size but impose
|
|
|
+ * maximum and minimum font sizes.
|
|
|
+ * @param size - The initial font size including the unit (i.e. px or pt)
|
|
|
+ * @param minScale - The minimum scale of the font (i.e. 0.8 for a minimum 80% scale).
|
|
|
+ * @param maxScale - The maximum scale of the font (i.e. 2.5 for a maximum 250% scale).
|
|
|
+ * @param unit (optional) - The unit to convert the initial font size to. Use this if you want to
|
|
|
+ * convert to a unit other than $baselineUnit.
|
|
|
+ */
|
|
|
+/**
|
|
|
+ * A heuristic that applies CSS to tablet
|
|
|
+ * viewports.
|
|
|
+ *
|
|
|
+ * Usage:
|
|
|
+ * @include tablet-viewport() {
|
|
|
+ * :host {
|
|
|
+ * background-color: green;
|
|
|
+ * }
|
|
|
+ * }
|
|
|
+ */
|
|
|
+/**
|
|
|
+ * A heuristic that applies CSS to mobile
|
|
|
+ * viewports (i.e. phones, not tablets).
|
|
|
+ *
|
|
|
+ * Usage:
|
|
|
+ * @include mobile-viewport() {
|
|
|
+ * :host {
|
|
|
+ * background-color: blue;
|
|
|
+ * }
|
|
|
+ * }
|
|
|
+ */
|
|
|
+/**
|
|
|
+ * Convert a font size to a dynamic font size.
|
|
|
+ * Fonts that participate in Dynamic Type should use
|
|
|
+ * dynamic font sizes.
|
|
|
+ * @param size - The initial font size including the unit (i.e. px or pt)
|
|
|
+ * @param unit (optional) - The unit to convert to. Use this if you want to
|
|
|
+ * convert to a unit other than $baselineUnit.
|
|
|
+ */
|
|
|
+/**
|
|
|
+ * Convert a font size to a dynamic font size but impose
|
|
|
+ * a maximum font size.
|
|
|
+ * @param size - The initial font size including the unit (i.e. px or pt)
|
|
|
+ * @param maxScale - The maximum scale of the font (i.e. 2.5 for a maximum 250% scale).
|
|
|
+ * @param unit (optional) - The unit to convert the initial font size to. Use this if you want to
|
|
|
+ * convert to a unit other than $baselineUnit.
|
|
|
+ */
|
|
|
+/**
|
|
|
+ * Convert a font size to a dynamic font size but impose
|
|
|
+ * a minimum font size.
|
|
|
+ * @param size - The initial font size including the unit (i.e. px or pt)
|
|
|
+ * @param minScale - The minimum scale of the font (i.e. 0.8 for a minimum 80% scale).
|
|
|
+ * @param unit (optional) - The unit to convert the initial font size to. Use this if you want to
|
|
|
+ * convert to a unit other than $baselineUnit.
|
|
|
+ */
|
|
|
+/**
|
|
|
+ * Convert a font size to a dynamic font size but impose
|
|
|
+ * maximum and minimum font sizes.
|
|
|
+ * @param size - The initial font size including the unit (i.e. px or pt)
|
|
|
+ * @param minScale - The minimum scale of the font (i.e. 0.8 for a minimum 80% scale).
|
|
|
+ * @param maxScale - The maximum scale of the font (i.e. 2.5 for a maximum 250% scale).
|
|
|
+ * @param unit (optional) - The unit to convert the initial font size to. Use this if you want to
|
|
|
+ * convert to a unit other than $baselineUnit.
|
|
|
+ */
|
|
|
+/**
|
|
|
+ * A heuristic that applies CSS to tablet
|
|
|
+ * viewports.
|
|
|
+ *
|
|
|
+ * Usage:
|
|
|
+ * @include tablet-viewport() {
|
|
|
+ * :host {
|
|
|
+ * background-color: green;
|
|
|
+ * }
|
|
|
+ * }
|
|
|
+ */
|
|
|
+/**
|
|
|
+ * A heuristic that applies CSS to mobile
|
|
|
+ * viewports (i.e. phones, not tablets).
|
|
|
+ *
|
|
|
+ * Usage:
|
|
|
+ * @include mobile-viewport() {
|
|
|
+ * :host {
|
|
|
+ * background-color: blue;
|
|
|
+ * }
|
|
|
+ * }
|
|
|
+ */
|
|
|
+:host(.input-fill-solid) {
|
|
|
+ --background: var(--ion-color-step-50, var(--ion-background-color-step-50, #f2f2f2));
|
|
|
+ --border-color: var(--ion-color-step-500, var(--ion-background-color-step-500, gray));
|
|
|
+ --border-radius: 4px;
|
|
|
+ --padding-start: 16px;
|
|
|
+ --padding-end: 16px;
|
|
|
+ min-height: 56px;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * The solid fill style has a border
|
|
|
+ * at the bottom of the input wrapper.
|
|
|
+ * As a result, the border on the "bottom
|
|
|
+ * content" is not needed.
|
|
|
+ */
|
|
|
+:host(.input-fill-solid) .input-wrapper {
|
|
|
+ border-bottom: var(--border-width) var(--border-style) var(--border-color);
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * If the input has a validity state, the
|
|
|
+ * border should reflect that as a color.
|
|
|
+ */
|
|
|
+:host(.has-focus.input-fill-solid.ion-valid),
|
|
|
+:host(.input-fill-solid.ion-touched.ion-invalid) {
|
|
|
+ --border-color: var(--highlight-color);
|
|
|
+}
|
|
|
+
|
|
|
+:host(.input-fill-solid) .input-bottom {
|
|
|
+ border-top: none;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * Background and border should be
|
|
|
+ * slightly darker on hover.
|
|
|
+ */
|
|
|
+@media (any-hover: hover) {
|
|
|
+ :host(.input-fill-solid:hover) {
|
|
|
+ --background: var(--ion-color-step-100, var(--ion-background-color-step-100, #e6e6e6));
|
|
|
+ --border-color: var(--ion-color-step-750, var(--ion-background-color-step-750, #404040));
|
|
|
+ }
|
|
|
+}
|
|
|
+/**
|
|
|
+ * Background and border should be
|
|
|
+ * much darker on focus.
|
|
|
+ */
|
|
|
+:host(.input-fill-solid.has-focus) {
|
|
|
+ --background: var(--ion-color-step-150, var(--ion-background-color-step-150, #d9d9d9));
|
|
|
+ --border-color: var(--ion-color-step-750, var(--ion-background-color-step-750, #404040));
|
|
|
+}
|
|
|
+
|
|
|
+:host(.input-fill-solid) .input-wrapper {
|
|
|
+ /**
|
|
|
+ * Only the top left and top right borders should.
|
|
|
+ * have a radius when using a solid fill.
|
|
|
+ */
|
|
|
+ border-start-start-radius: var(--border-radius);
|
|
|
+ border-start-end-radius: var(--border-radius);
|
|
|
+ border-end-end-radius: 0px;
|
|
|
+ border-end-start-radius: 0px;
|
|
|
+}
|
|
|
+
|
|
|
+:host(.label-floating.input-fill-solid.input-label-placement-floating) .label-text-wrapper {
|
|
|
+ /**
|
|
|
+ * Label text should not extend
|
|
|
+ * beyond the bounds of the input.
|
|
|
+ */
|
|
|
+ max-width: calc(100% / 0.75);
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * Convert a font size to a dynamic font size.
|
|
|
+ * Fonts that participate in Dynamic Type should use
|
|
|
+ * dynamic font sizes.
|
|
|
+ * @param size - The initial font size including the unit (i.e. px or pt)
|
|
|
+ * @param unit (optional) - The unit to convert to. Use this if you want to
|
|
|
+ * convert to a unit other than $baselineUnit.
|
|
|
+ */
|
|
|
+/**
|
|
|
+ * Convert a font size to a dynamic font size but impose
|
|
|
+ * a maximum font size.
|
|
|
+ * @param size - The initial font size including the unit (i.e. px or pt)
|
|
|
+ * @param maxScale - The maximum scale of the font (i.e. 2.5 for a maximum 250% scale).
|
|
|
+ * @param unit (optional) - The unit to convert the initial font size to. Use this if you want to
|
|
|
+ * convert to a unit other than $baselineUnit.
|
|
|
+ */
|
|
|
+/**
|
|
|
+ * Convert a font size to a dynamic font size but impose
|
|
|
+ * a minimum font size.
|
|
|
+ * @param size - The initial font size including the unit (i.e. px or pt)
|
|
|
+ * @param minScale - The minimum scale of the font (i.e. 0.8 for a minimum 80% scale).
|
|
|
+ * @param unit (optional) - The unit to convert the initial font size to. Use this if you want to
|
|
|
+ * convert to a unit other than $baselineUnit.
|
|
|
+ */
|
|
|
+/**
|
|
|
+ * Convert a font size to a dynamic font size but impose
|
|
|
+ * maximum and minimum font sizes.
|
|
|
+ * @param size - The initial font size including the unit (i.e. px or pt)
|
|
|
+ * @param minScale - The minimum scale of the font (i.e. 0.8 for a minimum 80% scale).
|
|
|
+ * @param maxScale - The maximum scale of the font (i.e. 2.5 for a maximum 250% scale).
|
|
|
+ * @param unit (optional) - The unit to convert the initial font size to. Use this if you want to
|
|
|
+ * convert to a unit other than $baselineUnit.
|
|
|
+ */
|
|
|
+/**
|
|
|
+ * A heuristic that applies CSS to tablet
|
|
|
+ * viewports.
|
|
|
+ *
|
|
|
+ * Usage:
|
|
|
+ * @include tablet-viewport() {
|
|
|
+ * :host {
|
|
|
+ * background-color: green;
|
|
|
+ * }
|
|
|
+ * }
|
|
|
+ */
|
|
|
+/**
|
|
|
+ * A heuristic that applies CSS to mobile
|
|
|
+ * viewports (i.e. phones, not tablets).
|
|
|
+ *
|
|
|
+ * Usage:
|
|
|
+ * @include mobile-viewport() {
|
|
|
+ * :host {
|
|
|
+ * background-color: blue;
|
|
|
+ * }
|
|
|
+ * }
|
|
|
+ */
|
|
|
+:host(.input-fill-outline) {
|
|
|
+ --border-color: var(--ion-color-step-300, var(--ion-background-color-step-300, #b3b3b3));
|
|
|
+ --border-radius: 4px;
|
|
|
+ --padding-start: 16px;
|
|
|
+ --padding-end: 16px;
|
|
|
+ min-height: 56px;
|
|
|
+}
|
|
|
+
|
|
|
+:host(.input-fill-outline.input-shape-round) {
|
|
|
+ --border-radius: 28px;
|
|
|
+ --padding-start: 32px;
|
|
|
+ --padding-end: 32px;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * If the input has a validity state, the
|
|
|
+ * border should reflect that as a color.
|
|
|
+ */
|
|
|
+:host(.has-focus.input-fill-outline.ion-valid),
|
|
|
+:host(.input-fill-outline.ion-touched.ion-invalid) {
|
|
|
+ --border-color: var(--highlight-color);
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * Border should be
|
|
|
+ * slightly darker on hover.
|
|
|
+ */
|
|
|
+@media (any-hover: hover) {
|
|
|
+ :host(.input-fill-outline:hover) {
|
|
|
+ --border-color: var(--ion-color-step-750, var(--ion-background-color-step-750, #404040));
|
|
|
+ }
|
|
|
+}
|
|
|
+/**
|
|
|
+ * The border should get thicker
|
|
|
+ * and take on component color when
|
|
|
+ * the input is focused.
|
|
|
+ */
|
|
|
+:host(.input-fill-outline.has-focus) {
|
|
|
+ --border-width: var(--highlight-height);
|
|
|
+ --border-color: var(--highlight-color);
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * The bottom content should never have
|
|
|
+ * a border with the outline style.
|
|
|
+ */
|
|
|
+:host(.input-fill-outline) .input-bottom {
|
|
|
+ border-top: none;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * Outline inputs do not have a bottom border.
|
|
|
+ * Instead, they have a border that wraps the
|
|
|
+ * input + label.
|
|
|
+ */
|
|
|
+:host(.input-fill-outline) .input-wrapper {
|
|
|
+ border-bottom: none;
|
|
|
+}
|
|
|
+
|
|
|
+:host(.input-fill-outline.input-label-placement-stacked) .label-text-wrapper,
|
|
|
+:host(.input-fill-outline.input-label-placement-floating) .label-text-wrapper {
|
|
|
+ transform-origin: left top;
|
|
|
+ position: absolute;
|
|
|
+ /**
|
|
|
+ * Label text should not extend
|
|
|
+ * beyond the bounds of the input.
|
|
|
+ */
|
|
|
+ max-width: calc(100% - var(--padding-start) - var(--padding-end));
|
|
|
+}
|
|
|
+:host-context([dir=rtl]):host(.input-fill-outline.input-label-placement-stacked) .label-text-wrapper, :host-context([dir=rtl]).input-fill-outline.input-label-placement-stacked .label-text-wrapper, :host-context([dir=rtl]):host(.input-fill-outline.input-label-placement-floating) .label-text-wrapper, :host-context([dir=rtl]).input-fill-outline.input-label-placement-floating .label-text-wrapper {
|
|
|
+ transform-origin: right top;
|
|
|
+}
|
|
|
+
|
|
|
+@supports selector(:dir(rtl)) {
|
|
|
+ :host(.input-fill-outline.input-label-placement-stacked:dir(rtl)) .label-text-wrapper, :host(.input-fill-outline.input-label-placement-floating:dir(rtl)) .label-text-wrapper {
|
|
|
+ transform-origin: right top;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * The label should appear on top of an outline
|
|
|
+ * container that overlaps it so it is always clickable.
|
|
|
+ */
|
|
|
+:host(.input-fill-outline) .label-text-wrapper,
|
|
|
+:host(.input-fill-outline) .label-text-wrapper {
|
|
|
+ position: relative;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * This makes the label sit above the input.
|
|
|
+ */
|
|
|
+:host(.label-floating.input-fill-outline) .label-text-wrapper {
|
|
|
+ transform: translateY(-32%) scale(0.75);
|
|
|
+ margin-left: 0;
|
|
|
+ margin-right: 0;
|
|
|
+ margin-top: 0;
|
|
|
+ margin-bottom: 0;
|
|
|
+ /**
|
|
|
+ * Label text should not extend
|
|
|
+ * beyond the bounds of the input.
|
|
|
+ */
|
|
|
+ max-width: calc((100% - var(--padding-start) - var(--padding-end) - 8px) / 0.75);
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * This ensures that the input does not
|
|
|
+ * overlap the floating label while still
|
|
|
+ * remaining visually centered.
|
|
|
+ */
|
|
|
+:host(.input-fill-outline.input-label-placement-stacked) input,
|
|
|
+:host(.input-fill-outline.input-label-placement-floating) input {
|
|
|
+ margin-left: 0;
|
|
|
+ margin-right: 0;
|
|
|
+ margin-top: 6px;
|
|
|
+ margin-bottom: 6px;
|
|
|
+}
|
|
|
+
|
|
|
+:host(.input-fill-outline) .input-outline-container {
|
|
|
+ left: 0;
|
|
|
+ right: 0;
|
|
|
+ top: 0;
|
|
|
+ bottom: 0;
|
|
|
+ display: flex;
|
|
|
+ position: absolute;
|
|
|
+ width: 100%;
|
|
|
+ height: 100%;
|
|
|
+}
|
|
|
+
|
|
|
+:host(.input-fill-outline) .input-outline-start,
|
|
|
+:host(.input-fill-outline) .input-outline-end {
|
|
|
+ pointer-events: none;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * By default, each piece of the container should have
|
|
|
+ * a top and bottom border. This gives the appearance
|
|
|
+ * of a unified container with a border.
|
|
|
+ */
|
|
|
+:host(.input-fill-outline) .input-outline-start,
|
|
|
+:host(.input-fill-outline) .input-outline-notch,
|
|
|
+:host(.input-fill-outline) .input-outline-end {
|
|
|
+ border-top: var(--border-width) var(--border-style) var(--border-color);
|
|
|
+ border-bottom: var(--border-width) var(--border-style) var(--border-color);
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * Ensures long labels do not cause the notch to flow
|
|
|
+ * out of bounds.
|
|
|
+ */
|
|
|
+:host(.input-fill-outline) .input-outline-notch {
|
|
|
+ max-width: calc(100% - var(--padding-start) - var(--padding-end));
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * This element ensures that the notch used
|
|
|
+ * the size of the scaled text so that the
|
|
|
+ * border cut out is the correct width.
|
|
|
+ * The text in this element should not
|
|
|
+ * be interactive.
|
|
|
+ */
|
|
|
+:host(.input-fill-outline) .notch-spacer {
|
|
|
+ /**
|
|
|
+ * We need $input-md-floating-label-padding of padding on the right.
|
|
|
+ * However, we also subtracted $input-md-floating-label-padding from
|
|
|
+ * the width of .input-outline-start
|
|
|
+ * to create space, so we need to take
|
|
|
+ * that into consideration here.
|
|
|
+ */
|
|
|
+ -webkit-padding-end: 8px;
|
|
|
+ padding-inline-end: 8px;
|
|
|
+ font-size: calc(1em * 0.75);
|
|
|
+ opacity: 0;
|
|
|
+ pointer-events: none;
|
|
|
+ /**
|
|
|
+ * The spacer currently inherits
|
|
|
+ * border-box sizing from the Ionic reset styles.
|
|
|
+ * However, we do not want to include padding in
|
|
|
+ * the calculation of the element dimensions.
|
|
|
+ * This code can be removed if input is updated
|
|
|
+ * to use the Shadow DOM.
|
|
|
+ */
|
|
|
+ box-sizing: content-box;
|
|
|
+}
|
|
|
+
|
|
|
+:host(.input-fill-outline) .input-outline-start {
|
|
|
+ border-start-start-radius: var(--border-radius);
|
|
|
+ border-start-end-radius: 0px;
|
|
|
+ border-end-end-radius: 0px;
|
|
|
+ border-end-start-radius: var(--border-radius);
|
|
|
+ -webkit-border-start: var(--border-width) var(--border-style) var(--border-color);
|
|
|
+ border-inline-start: var(--border-width) var(--border-style) var(--border-color);
|
|
|
+ /**
|
|
|
+ * There should be spacing between the translated text
|
|
|
+ * and .input-outline-start. However, we can't add this
|
|
|
+ * spacing onto the notch because it would cause the
|
|
|
+ * label to look like it is not aligned with the
|
|
|
+ * text input. Instead, we subtract a few pixels from
|
|
|
+ * this element.
|
|
|
+ */
|
|
|
+ width: calc(var(--padding-start) - 4px);
|
|
|
+}
|
|
|
+
|
|
|
+:host(.input-fill-outline) .input-outline-end {
|
|
|
+ -webkit-border-end: var(--border-width) var(--border-style) var(--border-color);
|
|
|
+ border-inline-end: var(--border-width) var(--border-style) var(--border-color);
|
|
|
+ border-start-start-radius: 0px;
|
|
|
+ border-start-end-radius: var(--border-radius);
|
|
|
+ border-end-end-radius: var(--border-radius);
|
|
|
+ border-end-start-radius: 0px;
|
|
|
+ /**
|
|
|
+ * The ending outline fragment
|
|
|
+ * should take up the remaining free space.
|
|
|
+ */
|
|
|
+ flex-grow: 1;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * When the input either has focus or a value,
|
|
|
+ * there should be a "cut out" at the top for
|
|
|
+ * the floating/stacked label. We simulate this "cut out"
|
|
|
+ * by removing the top border from the notch fragment.
|
|
|
+ */
|
|
|
+:host(.label-floating.input-fill-outline) .input-outline-notch {
|
|
|
+ border-top: none;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * Convert a font size to a dynamic font size.
|
|
|
+ * Fonts that participate in Dynamic Type should use
|
|
|
+ * dynamic font sizes.
|
|
|
+ * @param size - The initial font size including the unit (i.e. px or pt)
|
|
|
+ * @param unit (optional) - The unit to convert to. Use this if you want to
|
|
|
+ * convert to a unit other than $baselineUnit.
|
|
|
+ */
|
|
|
+/**
|
|
|
+ * Convert a font size to a dynamic font size but impose
|
|
|
+ * a maximum font size.
|
|
|
+ * @param size - The initial font size including the unit (i.e. px or pt)
|
|
|
+ * @param maxScale - The maximum scale of the font (i.e. 2.5 for a maximum 250% scale).
|
|
|
+ * @param unit (optional) - The unit to convert the initial font size to. Use this if you want to
|
|
|
+ * convert to a unit other than $baselineUnit.
|
|
|
+ */
|
|
|
+/**
|
|
|
+ * Convert a font size to a dynamic font size but impose
|
|
|
+ * a minimum font size.
|
|
|
+ * @param size - The initial font size including the unit (i.e. px or pt)
|
|
|
+ * @param minScale - The minimum scale of the font (i.e. 0.8 for a minimum 80% scale).
|
|
|
+ * @param unit (optional) - The unit to convert the initial font size to. Use this if you want to
|
|
|
+ * convert to a unit other than $baselineUnit.
|
|
|
+ */
|
|
|
+/**
|
|
|
+ * Convert a font size to a dynamic font size but impose
|
|
|
+ * maximum and minimum font sizes.
|
|
|
+ * @param size - The initial font size including the unit (i.e. px or pt)
|
|
|
+ * @param minScale - The minimum scale of the font (i.e. 0.8 for a minimum 80% scale).
|
|
|
+ * @param maxScale - The maximum scale of the font (i.e. 2.5 for a maximum 250% scale).
|
|
|
+ * @param unit (optional) - The unit to convert the initial font size to. Use this if you want to
|
|
|
+ * convert to a unit other than $baselineUnit.
|
|
|
+ */
|
|
|
+/**
|
|
|
+ * A heuristic that applies CSS to tablet
|
|
|
+ * viewports.
|
|
|
+ *
|
|
|
+ * Usage:
|
|
|
+ * @include tablet-viewport() {
|
|
|
+ * :host {
|
|
|
+ * background-color: green;
|
|
|
+ * }
|
|
|
+ * }
|
|
|
+ */
|
|
|
+/**
|
|
|
+ * A heuristic that applies CSS to mobile
|
|
|
+ * viewports (i.e. phones, not tablets).
|
|
|
+ *
|
|
|
+ * Usage:
|
|
|
+ * @include mobile-viewport() {
|
|
|
+ * :host {
|
|
|
+ * background-color: blue;
|
|
|
+ * }
|
|
|
+ * }
|
|
|
+ */
|
|
|
+:host {
|
|
|
+ --border-width: 1px;
|
|
|
+ --border-color: var(--ion-item-border-color, var(--ion-border-color, var(--ion-color-step-150, var(--ion-background-color-step-150, rgba(0, 0, 0, 0.13)))));
|
|
|
+ --highlight-height: 2px;
|
|
|
+ font-size: inherit;
|
|
|
+}
|
|
|
+
|
|
|
+.input-clear-icon ion-icon {
|
|
|
+ width: 22px;
|
|
|
+ height: 22px;
|
|
|
+}
|
|
|
+
|
|
|
+:host(.input-disabled) {
|
|
|
+ opacity: 0.38;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * If the input has a validity state, the
|
|
|
+ * border and label should reflect that as a color.
|
|
|
+ */
|
|
|
+:host(.has-focus.ion-valid),
|
|
|
+:host(.ion-touched.ion-invalid) {
|
|
|
+ --border-color: var(--highlight-color);
|
|
|
+}
|
|
|
+
|
|
|
+.input-bottom .counter {
|
|
|
+ letter-spacing: 0.0333333333em;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * When the input is focused the label should
|
|
|
+ * take on the highlight color. This should
|
|
|
+ * only apply to floating or stacked labels.
|
|
|
+ */
|
|
|
+:host(.input-label-placement-floating.has-focus) .label-text-wrapper,
|
|
|
+:host(.input-label-placement-stacked.has-focus) .label-text-wrapper {
|
|
|
+ color: var(--highlight-color);
|
|
|
+}
|
|
|
+
|
|
|
+:host(.has-focus.input-label-placement-floating.ion-valid) .label-text-wrapper,
|
|
|
+:host(.input-label-placement-floating.ion-touched.ion-invalid) .label-text-wrapper,
|
|
|
+:host(.has-focus.input-label-placement-stacked.ion-valid) .label-text-wrapper,
|
|
|
+:host(.input-label-placement-stacked.ion-touched.ion-invalid) .label-text-wrapper {
|
|
|
+ color: var(--highlight-color);
|
|
|
+}
|
|
|
+
|
|
|
+.input-highlight {
|
|
|
+ bottom: -1px;
|
|
|
+ position: absolute;
|
|
|
+ width: 100%;
|
|
|
+ height: var(--highlight-height);
|
|
|
+ transform: scale(0);
|
|
|
+ transition: transform 200ms;
|
|
|
+ background: var(--highlight-color);
|
|
|
+}
|
|
|
+.input-highlight {
|
|
|
+ inset-inline-start: 0;
|
|
|
+}
|
|
|
+
|
|
|
+:host(.has-focus) .input-highlight {
|
|
|
+ transform: scale(1);
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * Adjust the highlight up by 1px
|
|
|
+ * so it is not cut off by the
|
|
|
+ * the item's line (if one is present).
|
|
|
+ */
|
|
|
+:host(.in-item) .input-highlight {
|
|
|
+ bottom: 0;
|
|
|
+}
|
|
|
+:host(.in-item) .input-highlight {
|
|
|
+ inset-inline-start: 0;
|
|
|
+}
|
|
|
+
|
|
|
+:host(.input-shape-round) {
|
|
|
+ --border-radius: 16px;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * Slotted buttons have a lot of default padding that can
|
|
|
+ * cause them to look misaligned from other pieces such
|
|
|
+ * as the control's label, especially when using a clear
|
|
|
+ * fill. We also make them circular to ensure that non-
|
|
|
+ * clear buttons and the focus/hover state on clear ones
|
|
|
+ * don't look too crowded.
|
|
|
+ */
|
|
|
+::slotted(ion-button[slot=start].button-has-icon-only),
|
|
|
+::slotted(ion-button[slot=end].button-has-icon-only) {
|
|
|
+ --border-radius: 50%;
|
|
|
+ --padding-start: 8px;
|
|
|
+ --padding-end: 8px;
|
|
|
+ --padding-top: 8px;
|
|
|
+ --padding-bottom: 8px;
|
|
|
+ aspect-ratio: 1;
|
|
|
+ min-height: 40px;
|
|
|
+}
|