From 47ed4f7de66ed2eaa9ecb3a87aadd4c2f19a9c06 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=90=E6=B6=9B?= Date: Thu, 28 Dec 2023 08:56:03 +0800 Subject: [PATCH] =?UTF-8?q?feat(compo):=E5=A2=9E=E5=8A=A0=E5=8A=A8?= =?UTF-8?q?=E4=BD=9C=E5=9B=BE=E6=A0=87=E6=8C=89=E9=92=AE=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/ActionIcon/ActionIcon.jsx | 43 ++++++++++++++++ .../ActionIcon/ActionIcon.module.css | 51 +++++++++++++++++++ 2 files changed, 94 insertions(+) create mode 100644 src/components/ActionIcon/ActionIcon.jsx create mode 100644 src/components/ActionIcon/ActionIcon.module.css diff --git a/src/components/ActionIcon/ActionIcon.jsx b/src/components/ActionIcon/ActionIcon.jsx new file mode 100644 index 0000000..9775460 --- /dev/null +++ b/src/components/ActionIcon/ActionIcon.jsx @@ -0,0 +1,43 @@ +import cx from "clsx"; +import { prop } from "ramda"; +import { mergeProps } from "solid-js"; +import classes from "./ActionIcon.module.css"; + +/** + * @typedef {object} ActionIconProps + * @property {"s" | "m" | "l" | "xl" | "xxl"} [size] + * @property {"filled" | "subtle" | "transparent"} [variant] + * @property {"primary" | "secondary" | "danger" | "warn" | "success" | "info"} [color] + * @property {string[]} [additionalClasses] + * @property {JSX.EventHandler} [onClick] + */ + +/** + * @param {import("solid-js").ParentProps} props + */ +export default function ActionIcon(props) { + const mergedProps = mergeProps( + { + size: "m", + color: "secondary", + variant: "transparent", + additionalClasses: [], + onClick: (e) => {}, + }, + props + ); + return ( + + ); +} diff --git a/src/components/ActionIcon/ActionIcon.module.css b/src/components/ActionIcon/ActionIcon.module.css new file mode 100644 index 0000000..7c0ae34 --- /dev/null +++ b/src/components/ActionIcon/ActionIcon.module.css @@ -0,0 +1,51 @@ +.action-icon-button { + --size: calc(var(--border-radius-xxs) * 2); + border: none; + @util padding(0); + @each $size in (s, m, l, xl, xxl) { + &.size-#{$size} { + --size: calc(var(--border-radius-#{$size}) * 2); + @util size(calc(var(--size) * 2), calc(var(--size) * 2)); + border-radius: var(--size); + & svg { + @util size(var(--size), var(--size)); + } + } + } + @each $color in (primary, secondary, danger, warn, success, info) { + &.color-#{$color} { + color: var(--palette-white-3); + &.variant-transparent { + color: var(--color-#{$color}); + background-color: transparent; + } + &.variant-subtle { + background-color: color-mod(var(--color-#{$color}) a(50%)); + } + &.variant-fill { + background-color: var(--color-#{$color}); + } + &:hover { + color: var(--palette-white-0); + &.variant-transparent, + &.variant-subtle, + &.variant-fill { + background-color: var(--color-#{$color}-hover); + } + } + &:active { + color: var(--palette-white-2); + &.variant-transparent { + color: var(--color-#{$color}-active); + background-color: transparent; + } + &.variant-subtle { + background-color: color-mod(var(--color-#{$color}-active) a(50%)); + } + &.variant-fill { + background-color: var(--color-#{$color}-active); + } + } + } + } +}