/* * Copyright 2023 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.google.ux.material.libmonet.dynamiccolor; import androidx.annotation.NonNull; /** * Documents a constraint between two DynamicColors, in which their tones must have a certain * distance from each other. * *

Prefer a DynamicColor with a background, this is for special cases when designers want tonal * distance, literally contrast, between two colors that don't have a background / foreground * relationship or a contrast guarantee. */ public final class ToneDeltaPair { /** The first role in a pair. */ private final DynamicColor roleA; /** The second role in a pair. */ private final DynamicColor roleB; /** Required difference between tones. Absolute value, negative values have undefined behavior. */ private final double delta; /** The relative relation between tones of roleA and roleB, as described above. */ private final TonePolarity polarity; /** * Whether these two roles should stay on the same side of the "awkward zone" (T50-59). This is * necessary for certain cases where one role has two backgrounds. */ private final boolean stayTogether; /** * Documents a constraint in tone distance between two DynamicColors. * *

The polarity is an adjective that describes "A", compared to "B". * *

For instance, ToneDeltaPair(A, B, 15, 'darker', stayTogether) states that A's tone should be * at least 15 darker than B's. * *

'nearer' and 'farther' describes closeness to the surface roles. For instance, * ToneDeltaPair(A, B, 10, 'nearer', stayTogether) states that A should be 10 lighter than B in * light mode, and 10 darker than B in dark mode. * * @param roleA The first role in a pair. * @param roleB The second role in a pair. * @param delta Required difference between tones. Absolute value, negative values have undefined * behavior. * @param polarity The relative relation between tones of roleA and roleB, as described above. * @param stayTogether Whether these two roles should stay on the same side of the "awkward zone" * (T50-59). This is necessary for certain cases where one role has two backgrounds. */ public ToneDeltaPair( DynamicColor roleA, DynamicColor roleB, double delta, TonePolarity polarity, boolean stayTogether) { this.roleA = roleA; this.roleB = roleB; this.delta = delta; this.polarity = polarity; this.stayTogether = stayTogether; } @NonNull public DynamicColor getRoleA() { return roleA; } @NonNull public DynamicColor getRoleB() { return roleB; } @NonNull public double getDelta() { return delta; } @NonNull public TonePolarity getPolarity() { return polarity; } @NonNull public boolean getStayTogether() { return stayTogether; } }