• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// Copyright (C) 2023 The Android Open Source Project
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7//      http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15// It's common to want to have a class depending on a boolean flag, in which
16// case we use `flag && className` which evaluates to either false or a string,
17// which is why false is included in definition of ArgType.
18type ArgType = string | false | undefined | ArgType[];
19
20// Join class names together into valid HTML class attributes
21// Falsy elements are ignored
22// Nested arrays are flattened
23// If all elements are falsy, returns undefined
24export function classNames(...args: ArgType[]): string | undefined {
25  const filtered = args.flat().filter((x) => x);
26  if (filtered.length === 0) {
27    return undefined;
28  } else {
29    return filtered.join(' ');
30  }
31}
32