refactor: save popover

This commit is contained in:
luoxiao 2024-06-10 22:35:49 +08:00
parent 902da02e30
commit c41d177782
6 changed files with 77 additions and 136 deletions

View file

@ -67,6 +67,10 @@ impl ConfigInjection {
pub fn id(&self) -> &String { pub fn id(&self) -> &String {
&self.id &self.id
} }
pub fn use_() -> ConfigInjection {
expect_context()
}
} }
#[derive(Clone)] #[derive(Clone)]

View file

@ -1,8 +1,4 @@
mod theme; use crate::ConfigInjection;
pub use theme::PopoverTheme;
use crate::{use_theme, Theme};
use leptos::{leptos_dom::helpers::TimeoutHandle, *}; use leptos::{leptos_dom::helpers::TimeoutHandle, *};
use std::time::Duration; use std::time::Duration;
use thaw_components::{Binder, CSSTransition, Follower, FollowerPlacement}; use thaw_components::{Binder, CSSTransition, Follower, FollowerPlacement};
@ -25,27 +21,8 @@ pub fn Popover(
children: Children, children: Children,
) -> impl IntoView { ) -> impl IntoView {
mount_style("popover", include_str!("./popover.css")); mount_style("popover", include_str!("./popover.css"));
let theme = use_theme(Theme::light); let config_provider = ConfigInjection::use_();
let css_vars = create_memo(move |_| {
let mut css_vars = String::new();
theme.with(|theme| {
let background_color = if tooltip {
&theme.popover.tooltip_background_color
} else {
&theme.popover.background_color
};
css_vars.push_str(&format!("--thaw-background-color: {};", background_color));
let font_color = if tooltip {
"#fff"
} else {
// TODO
// &theme.common.font_color
""
};
css_vars.push_str(&format!("--thaw-font-color: {};", font_color));
});
css_vars
});
let popover_ref = create_node_ref::<html::Div>(); let popover_ref = create_node_ref::<html::Div>();
let target_ref = create_node_ref::<html::Div>(); let target_ref = create_node_ref::<html::Div>();
let is_show_popover = create_rw_signal(false); let is_show_popover = create_rw_signal(false);
@ -140,18 +117,20 @@ pub fn Popover(
let:display let:display
> >
<div <div
class=if tooltip { "thaw-popover thaw-popover--tooltip" } else { "thaw-popover" } class=if tooltip {
style=move || { "thaw-config-provider thaw-popover-surface thaw-popover--tooltip" }
display.get().map(|d| d.to_string()).unwrap_or_else(|| css_vars.get()) else {
"thaw-config-provider thaw-popover-surface"
} }
data-thaw-id=config_provider.id().clone()
style=move || display.get()
ref=popover_ref ref=popover_ref
on:mouseenter=on_mouse_enter on:mouseenter=on_mouse_enter
on:mouseleave=on_mouse_leave on:mouseleave=on_mouse_leave
> >
<div class=class.map(|c| move || c.get())>{children()}</div> <div class=class.map(|c| move || c.get())>{children()}</div>
<div class="thaw-popover__angle-container"> <div class="thaw-popover-surface__angle">
<div class="thaw-popover__angle"></div>
</div> </div>
</div> </div>
</CSSTransition> </CSSTransition>

View file

@ -1,75 +1,56 @@
.thaw-popover { div.thaw-popover-surface {
position: relative; position: relative;
padding: 8px 14px;
background-color: var(--thaw-background-color);
color: var(--thaw-font-color);
border-radius: 3px;
transform-origin: inherit; transform-origin: inherit;
padding: 16px;
border-radius: var(--borderRadiusMedium);
border: 1px solid var(--colorTransparentStroke);
box-shadow: var(--shadow16);
line-height: var(--lineHeightBase300);
font-weight: var(--fontWeightRegular);
font-size: var(--fontSizeBase300);
font-family: var(--fontFamilyBase);
background-color: var(--colorNeutralBackground1);
color: var(--colorNeutralForeground1);
}
.thaw-popover-surface__angle {
position: absolute;
background-color: inherit;
width: 10px;
height: 10px;
} }
.thaw-popover-trigger { .thaw-popover-trigger {
display: inline-block; display: inline-block;
} }
.thaw-popover__angle-container { [data-thaw-placement="top-start"] > .thaw-popover-surface,
position: absolute; [data-thaw-placement="top-end"] > .thaw-popover-surface,
} [data-thaw-placement="top"] > .thaw-popover-surface {
.thaw-popover__angle {
position: absolute;
background: var(--thaw-background-color);
width: 10px;
height: 10px;
}
[data-thaw-placement="top-start"] > .thaw-popover,
[data-thaw-placement="top-end"] > .thaw-popover,
[data-thaw-placement="top"] > .thaw-popover {
margin-bottom: 10px; margin-bottom: 10px;
box-shadow: 0 3px 6px -4px rgba(0, 0, 0, 0.12),
0 6px 16px 0 rgba(0, 0, 0, 0.08), 0 9px 28px 8px rgba(0, 0, 0, 0.05);
} }
[data-thaw-placement="top-start"] .thaw-popover__angle-container, [data-thaw-placement="top-start"] .thaw-popover-surface__angle,
[data-thaw-placement="top-end"] .thaw-popover__angle-container, [data-thaw-placement="top-end"] .thaw-popover-surface__angle,
[data-thaw-placement="top"] .thaw-popover__angle-container { [data-thaw-placement="top"] .thaw-popover-surface__angle {
width: 100%;
height: 10px;
bottom: -10px;
left: 0;
right: 0;
}
[data-thaw-placement="top-start"] .thaw-popover__angle,
[data-thaw-placement="top-end"] .thaw-popover__angle,
[data-thaw-placement="top"] .thaw-popover__angle {
left: 50%;
transform: rotate(45deg) translateX(-7px); transform: rotate(45deg) translateX(-7px);
} bottom: -10px;
[data-thaw-placement="bottom-start"] > .thaw-popover,
[data-thaw-placement="bottom-end"] > .thaw-popover,
[data-thaw-placement="bottom"] > .thaw-popover {
margin-top: 10px;
box-shadow: 0 -3px 6px -4px rgba(0, 0, 0, 0.12),
0 -6px 16px 0 rgba(0, 0, 0, 0.08), 0 -9px 28px 8px rgba(0, 0, 0, 0.05);
}
[data-thaw-placement="bottom-start"] .thaw-popover__angle-container,
[data-thaw-placement="bottom-end"] .thaw-popover__angle-container,
[data-thaw-placement="bottom"] .thaw-popover__angle-container {
width: 100%;
height: 10px;
top: -10px;
left: 0;
right: 0;
}
[data-thaw-placement="bottom-start"] .thaw-popover__angle,
[data-thaw-placement="bottom-end"] .thaw-popover__angle,
[data-thaw-placement="bottom"] .thaw-popover__angle {
left: 50%; left: 50%;
}
[data-thaw-placement="bottom-start"] > .thaw-popover-surface,
[data-thaw-placement="bottom-end"] > .thaw-popover-surface,
[data-thaw-placement="bottom"] > .thaw-popover-surface {
margin-top: 10px;
}
[data-thaw-placement="bottom-start"] .thaw-popover-surface__angle,
[data-thaw-placement="bottom-end"] .thaw-popover-surface__angle,
[data-thaw-placement="bottom"] .thaw-popover-surface__angle {
transform: rotate(45deg) translateY(7px); transform: rotate(45deg) translateY(7px);
top: -10px;
left: 50%;
} }
[data-thaw-placement="left-start"] > .thaw-popover, [data-thaw-placement="left-start"] > .thaw-popover,
@ -80,9 +61,9 @@
6px 0 16px 0 rgba(0, 0, 0, 0.08), 9px 0 28px 8px rgba(0, 0, 0, 0.05); 6px 0 16px 0 rgba(0, 0, 0, 0.08), 9px 0 28px 8px rgba(0, 0, 0, 0.05);
} }
[data-thaw-placement="left-start"] .thaw-popover__angle-container, [data-thaw-placement="left-start"] .thaw-popover-surface__angle,
[data-thaw-placement="left-end"] .thaw-popover__angle-container, [data-thaw-placement="left-end"] .thaw-popover-surface__angle,
[data-thaw-placement="left"] .thaw-popover__angle-container { [data-thaw-placement="left"] .thaw-popover-surface__angle {
width: 10px; width: 10px;
height: 100%; height: 100%;
right: -10px; right: -10px;
@ -90,9 +71,9 @@
bottom: 0; bottom: 0;
} }
[data-thaw-placement="left-start"] .thaw-popover__angle, [data-thaw-placement="left-start"] .thaw-popover-surface__angle::before,
[data-thaw-placement="left-end"] .thaw-popover__angle, [data-thaw-placement="left-end"] .thaw-popover-surface__angle::before,
[data-thaw-placement="left"] .thaw-popover__angle { [data-thaw-placement="left"] .thaw-popover-surface__angle::before {
top: 50%; top: 50%;
transform: rotate(45deg) translateX(-7px); transform: rotate(45deg) translateX(-7px);
} }
@ -105,9 +86,9 @@
-6px 0 16px 0 rgba(0, 0, 0, 0.08), -9px 0 28px 8px rgba(0, 0, 0, 0.05); -6px 0 16px 0 rgba(0, 0, 0, 0.08), -9px 0 28px 8px rgba(0, 0, 0, 0.05);
} }
[data-thaw-placement="right-start"] .thaw-popover__angle-container, [data-thaw-placement="right-start"] .thaw-popover-surface__angle,
[data-thaw-placement="right-end"] .thaw-popover__angle-container, [data-thaw-placement="right-end"] .thaw-popover-surface__angle,
[data-thaw-placement="right"] .thaw-popover__angle-container { [data-thaw-placement="right"] .thaw-popover-surface__angle {
width: 10px; width: 10px;
height: 100%; height: 100%;
left: -10px; left: -10px;
@ -115,28 +96,28 @@
bottom: 0; bottom: 0;
} }
[data-thaw-placement="right-start"] .thaw-popover__angle, [data-thaw-placement="right-start"] .thaw-popover-surface__angle::before,
[data-thaw-placement="right-end"] .thaw-popover__angle, [data-thaw-placement="right-end"] .thaw-popover-surface__angle::before,
[data-thaw-placement="right"] .thaw-popover__angle { [data-thaw-placement="right"] .thaw-popover-surface__angle::before {
top: 50%; top: 50%;
transform: rotate(45deg) translateY(-7px); transform: rotate(45deg) translateY(-7px);
} }
[data-thaw-placement="bottom-start"] .thaw-popover__angle, [data-thaw-placement="bottom-start"] .thaw-popover-surface__angle,
[data-thaw-placement="top-start"] .thaw-popover__angle { [data-thaw-placement="top-start"] .thaw-popover-surface__angle {
left: 16px; left: 16px;
} }
[data-thaw-placement="bottom-end"] .thaw-popover__angle, [data-thaw-placement="bottom-end"] .thaw-popover-surface__angle::before,
[data-thaw-placement="top-end"] .thaw-popover__angle { [data-thaw-placement="top-end"] .thaw-popover-surface__angle::before {
left: initial; left: initial;
right: 7px; right: 7px;
} }
[data-thaw-placement="right-start"] .thaw-popover__angle, [data-thaw-placement="right-start"] .thaw-popover-surface__angle::before,
[data-thaw-placement="left-start"] .thaw-popover__angle { [data-thaw-placement="left-start"] .thaw-popover-surface__angle::before {
top: 16px; top: 16px;
} }
[data-thaw-placement="right-end"] .thaw-popover__angle, [data-thaw-placement="right-end"] .thaw-popover-surface__angle::before,
[data-thaw-placement="left-end"] .thaw-popover__angle { [data-thaw-placement="left-end"] .thaw-popover-surface__angle::before {
top: initial; top: initial;
bottom: 7px; bottom: 7px;
} }

View file

@ -1,23 +0,0 @@
use crate::theme::ThemeMethod;
#[derive(Clone)]
pub struct PopoverTheme {
pub background_color: String,
pub tooltip_background_color: String,
}
impl ThemeMethod for PopoverTheme {
fn light() -> Self {
Self {
background_color: "#fff".into(),
tooltip_background_color: "#262626".into(),
}
}
fn dark() -> Self {
Self {
background_color: "#48484e".into(),
tooltip_background_color: "#48484e".into(),
}
}
}

View file

@ -94,6 +94,7 @@ pub struct ColorTheme {
pub color_transparent_stroke: String, pub color_transparent_stroke: String,
pub shadow4: String, pub shadow4: String,
pub shadow16: String,
} }
impl ColorTheme { impl ColorTheme {
@ -192,6 +193,7 @@ impl ColorTheme {
color_transparent_stroke: "transparent".into(), color_transparent_stroke: "transparent".into(),
shadow4: "0 0 2px rgba(0,0,0,0.12), 0 2px 4px rgba(0,0,0,0.14)".into(), shadow4: "0 0 2px rgba(0,0,0,0.12), 0 2px 4px rgba(0,0,0,0.14)".into(),
shadow16: "0 0 2px rgba(0,0,0,0.12), 0 8px 16px rgba(0,0,0,0.14)".into(),
} }
} }
@ -290,6 +292,7 @@ impl ColorTheme {
color_transparent_stroke: "transparent".into(), color_transparent_stroke: "transparent".into(),
shadow4: "0 0 2px rgba(0,0,0,0.24), 0 2px 4px rgba(0,0,0,0.28)".into(), shadow4: "0 0 2px rgba(0,0,0,0.24), 0 2px 4px rgba(0,0,0,0.28)".into(),
shadow16: "0 0 2px rgba(0,0,0,0.24), 0 8px 16px rgba(0,0,0,0.28)".into(),
} }
} }
} }

View file

@ -5,7 +5,7 @@ use self::common::CommonTheme;
use crate::{ use crate::{
mobile::{NavBarTheme, TabbarTheme}, mobile::{NavBarTheme, TabbarTheme},
AlertTheme, AnchorTheme, AutoCompleteTheme, BackTopTheme, CalendarTheme, ColorPickerTheme, AlertTheme, AnchorTheme, AutoCompleteTheme, BackTopTheme, CalendarTheme, ColorPickerTheme,
DatePickerTheme, InputTheme, MessageTheme, PopoverTheme, ProgressTheme, ScrollbarTheme, DatePickerTheme, InputTheme, MessageTheme, ProgressTheme, ScrollbarTheme,
SelectTheme, TimePickerTheme, UploadTheme, SelectTheme, TimePickerTheme, UploadTheme,
}; };
pub use color::ColorTheme; pub use color::ColorTheme;
@ -34,7 +34,6 @@ pub struct Theme {
pub calendar: CalendarTheme, pub calendar: CalendarTheme,
pub time_picker: TimePickerTheme, pub time_picker: TimePickerTheme,
pub date_picker: DatePickerTheme, pub date_picker: DatePickerTheme,
pub popover: PopoverTheme,
pub scrollbar: ScrollbarTheme, pub scrollbar: ScrollbarTheme,
pub back_top: BackTopTheme, pub back_top: BackTopTheme,
pub anchor: AnchorTheme, pub anchor: AnchorTheme,
@ -59,7 +58,6 @@ impl Theme {
calendar: CalendarTheme::light(), calendar: CalendarTheme::light(),
time_picker: TimePickerTheme::light(), time_picker: TimePickerTheme::light(),
date_picker: DatePickerTheme::light(), date_picker: DatePickerTheme::light(),
popover: PopoverTheme::light(),
scrollbar: ScrollbarTheme::light(), scrollbar: ScrollbarTheme::light(),
back_top: BackTopTheme::light(), back_top: BackTopTheme::light(),
anchor: AnchorTheme::light(), anchor: AnchorTheme::light(),
@ -83,7 +81,6 @@ impl Theme {
calendar: CalendarTheme::dark(), calendar: CalendarTheme::dark(),
time_picker: TimePickerTheme::dark(), time_picker: TimePickerTheme::dark(),
date_picker: DatePickerTheme::dark(), date_picker: DatePickerTheme::dark(),
popover: PopoverTheme::dark(),
scrollbar: ScrollbarTheme::dark(), scrollbar: ScrollbarTheme::dark(),
back_top: BackTopTheme::dark(), back_top: BackTopTheme::dark(),
anchor: AnchorTheme::dark(), anchor: AnchorTheme::dark(),