feat(comp):增加可激活链接组件。
This commit is contained in:
parent
5a419915b0
commit
6d406f8ee3
40
src/components/ActivatableLink/ActivatableLink.jsx
Normal file
40
src/components/ActivatableLink/ActivatableLink.jsx
Normal file
|
@ -0,0 +1,40 @@
|
|||
import { A } from "@solidjs/router";
|
||||
import { defaultTo, isNil, pick, pipe, prop } from "ramda";
|
||||
import { Show } from "solid-js";
|
||||
import classes from "./ActivatableLink.module.css";
|
||||
|
||||
/**
|
||||
* @typedef {import("@solidjs/router").AnchorProps} AnchorProps
|
||||
* @typedef {import("solid-js").ParentProps} ParentProps
|
||||
* @typedef {Partial<AnchorProps> & ParentProps} ActivatableLinkBase
|
||||
*
|
||||
* @typedef {Object} ActivatableLinkExtends
|
||||
* @property {string} href
|
||||
* @property {boolean} [activatable]
|
||||
* @property {JSX.Element} [leftIcon]
|
||||
* @property {JSX.Element} [rightIcon]
|
||||
*
|
||||
* @typedef {ActivatableLinkBase & ActivatableLinkExtends} ActivatableLinkProps
|
||||
*/
|
||||
|
||||
const defaultActivatable = pipe(defaultTo(true), prop("activatable"));
|
||||
|
||||
/**
|
||||
* @param {ActivatableLinkProps} props
|
||||
* @returns {import("solid-js").Component<ActivatableLinkProps>}
|
||||
*/
|
||||
export default function ActivatableLink(props) {
|
||||
return (
|
||||
<A
|
||||
class={prop("activatable-link", classes)}
|
||||
{...(defaultActivatable(props) && {
|
||||
activeClass: "activated",
|
||||
})}
|
||||
{...pick(["replace", "end", "href"], props)}
|
||||
>
|
||||
<Show when={!isNil(props.leftIcon)}>{props.leftIcon}</Show>
|
||||
<Show when={!isNil(props.children)}>{props.children}</Show>
|
||||
<Show when={!isNil(props.rightIcon)}>{props.rightIcon}</Show>
|
||||
</A>
|
||||
);
|
||||
}
|
28
src/components/ActivatableLink/ActivatableLink.module.css
Normal file
28
src/components/ActivatableLink/ActivatableLink.module.css
Normal file
|
@ -0,0 +1,28 @@
|
|||
@import "@/mixins.css";
|
||||
|
||||
.activatable-link {
|
||||
@include flex(row, flex-start, center, --spacing-xs);
|
||||
@util padding(var(--spacing-s) var(--spacing-xs));
|
||||
@util size(100% auto);
|
||||
border-radius: var(--border-radius-xs);
|
||||
color: var(--palette-white-8);
|
||||
@include dark-mode {
|
||||
color: var(--palette-white-3);
|
||||
}
|
||||
&:hover {
|
||||
color: var(--palette-white-8);
|
||||
background-color: var(--palette-bright-blue-3);
|
||||
@include dark-mode {
|
||||
color: var(--palette-white-0);
|
||||
background-color: var(--palette-bright-blue-4);
|
||||
}
|
||||
}
|
||||
&.activated {
|
||||
color: var(--palette-gray-1);
|
||||
background-color: var(--palette-bright-blue-5);
|
||||
@include dark-mode {
|
||||
color: var(--palette-white-0);
|
||||
background-color: var(--palette-bright-blue-8);
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user