mirror of
https://github.com/tailscale/tailscale.git
synced 2025-05-12 18:28:30 +00:00

Style changes made in live pairing session. Updates #10261 Co-authored-by: Will Norris <will@tailscale.com> Co-authored-by: Alessandro Mingione <alessandro@tailscale.com> Signed-off-by: Sonia Appasamy <sonia@tailscale.com>
45 lines
1.2 KiB
TypeScript
45 lines
1.2 KiB
TypeScript
// Copyright (c) Tailscale Inc & AUTHORS
|
|
// SPDX-License-Identifier: BSD-3-Clause
|
|
|
|
import cx from "classnames"
|
|
import React, { cloneElement } from "react"
|
|
|
|
type Props = {
|
|
action?: React.ReactNode
|
|
className?: string
|
|
description: string
|
|
icon?: React.ReactElement
|
|
title?: string
|
|
}
|
|
|
|
/**
|
|
* EmptyState shows some text and an optional action when some area that can
|
|
* house content is empty (eg. no search results, empty tables).
|
|
*/
|
|
export default function EmptyState(props: Props) {
|
|
const { action, className, description, icon, title } = props
|
|
const iconColor = "text-gray-500"
|
|
const iconComponent = getIcon(icon, iconColor)
|
|
|
|
return (
|
|
<div
|
|
className={cx("flex justify-center", className, {
|
|
"flex-col items-center": action || icon || title,
|
|
})}
|
|
>
|
|
{icon && <div className="mb-2">{iconComponent}</div>}
|
|
{title && (
|
|
<h3 className="text-xl font-medium text-center mb-2">{title}</h3>
|
|
)}
|
|
<div className="w-full text-center max-w-xl text-gray-500">
|
|
{description}
|
|
</div>
|
|
{action && <div className="mt-3.5">{action}</div>}
|
|
</div>
|
|
)
|
|
}
|
|
|
|
function getIcon(icon: React.ReactElement | undefined, iconColor: string) {
|
|
return icon ? cloneElement(icon, { className: iconColor }) : null
|
|
}
|