@@ -9,6 +9,12 @@ use super::Empty;
pub trait GeneralComponent {
fn render<V: View>(self, v: &mut V, cx: &mut ViewContext<V>) -> AnyElement<V>;
+ fn element<V: View>(self) -> ComponentAdapter<V, Self>
+ where
+ Self: Sized,
+ {
+ ComponentAdapter::new(self)
+ }
}
pub trait StyleableComponent {
@@ -36,7 +42,7 @@ impl StyleableComponent for () {
pub trait Component<V: View> {
fn render(self, v: &mut V, cx: &mut ViewContext<V>) -> AnyElement<V>;
- fn into_element(self) -> ComponentAdapter<V, Self>
+ fn element(self) -> ComponentAdapter<V, Self>
where
Self: Sized,
{
@@ -50,6 +56,53 @@ impl<V: View, C: GeneralComponent> Component<V> for C {
}
}
+// StylableComponent -> GeneralComponent
+pub struct StylableComponentAdapter<C: Component<V>, V: View> {
+ component: C,
+ phantom: std::marker::PhantomData<V>,
+}
+
+impl<C: Component<V>, V: View> StylableComponentAdapter<C, V> {
+ pub fn new(component: C) -> Self {
+ Self {
+ component,
+ phantom: std::marker::PhantomData,
+ }
+ }
+}
+
+impl<C: GeneralComponent, V: View> StyleableComponent for StylableComponentAdapter<C, V> {
+ type Style = ();
+
+ type Output = C;
+
+ fn with_style(self, _: Self::Style) -> Self::Output {
+ self.component
+ }
+}
+
+// Element -> Component
+pub struct ElementAdapter<V: View> {
+ element: AnyElement<V>,
+ _phantom: std::marker::PhantomData<V>,
+}
+
+impl<V: View> ElementAdapter<V> {
+ pub fn new(element: AnyElement<V>) -> Self {
+ Self {
+ element,
+ _phantom: std::marker::PhantomData,
+ }
+ }
+}
+
+impl<V: View> Component<V> for ElementAdapter<V> {
+ fn render(self, _: &mut V, _: &mut ViewContext<V>) -> AnyElement<V> {
+ self.element
+ }
+}
+
+// Component -> Element
pub struct ComponentAdapter<V: View, E> {
component: Option<E>,
element: Option<AnyElement<V>>,
@@ -37,7 +37,7 @@ export default function contacts_panel(): any {
width: 14,
},
name: {
- ...text(layer, "ui_sans", { size: "sm" }),
+ ...text(layer, "sans", { size: "sm" }),
margin: {
left: NAME_MARGIN,
right: 4,
@@ -69,7 +69,7 @@ export default function contacts_panel(): any {
const subheader_row = toggleable({
base: interactive({
base: {
- ...text(layer, "ui_sans", { size: "sm" }),
+ ...text(layer, "sans", { size: "sm" }),
padding: {
left: SPACING,
right: SPACING,
@@ -87,7 +87,7 @@ export default function contacts_panel(): any {
state: {
active: {
default: {
- ...text(theme.lowest, "ui_sans", { size: "sm" }),
+ ...text(theme.lowest, "sans", { size: "sm" }),
background: background(theme.lowest),
},
clicked: {
@@ -100,8 +100,8 @@ export default function contacts_panel(): any {
const filter_input = {
background: background(layer, "on"),
corner_radius: 6,
- text: text(layer, "ui_sans", "base"),
- placeholder_text: text(layer, "ui_sans", "base", "disabled", {
+ text: text(layer, "sans", "base"),
+ placeholder_text: text(layer, "sans", "base", "disabled", {
size: "xs",
}),
selection: theme.players[0],
@@ -140,7 +140,7 @@ export default function contacts_panel(): any {
},
active: {
default: {
- ...text(theme.lowest, "ui_sans", { size: "sm" }),
+ ...text(theme.lowest, "sans", { size: "sm" }),
background: background(theme.lowest),
},
clicked: {
@@ -194,10 +194,10 @@ export default function contacts_panel(): any {
add_channel_button: header_icon_button,
leave_call_button: header_icon_button,
row_height: ITEM_HEIGHT,
- channel_indent: INDENT_SIZE,
+ channel_indent: INDENT_SIZE * 2,
section_icon_size: 14,
header_row: {
- ...text(layer, "ui_sans", { size: "sm", weight: "bold" }),
+ ...text(layer, "sans", { size: "sm", weight: "bold" }),
margin: { top: SPACING },
padding: {
left: SPACING,
@@ -251,7 +251,7 @@ export default function contacts_panel(): any {
},
active: {
default: {
- ...text(theme.lowest, "ui_sans", { size: "sm" }),
+ ...text(theme.lowest, "sans", { size: "sm" }),
background: background(theme.lowest),
},
clicked: {
@@ -262,7 +262,7 @@ export default function contacts_panel(): any {
}),
channel_row: item_row,
channel_name: {
- ...text(layer, "ui_sans", { size: "sm" }),
+ ...text(layer, "sans", { size: "sm" }),
margin: {
left: NAME_MARGIN,
},
@@ -279,7 +279,7 @@ export default function contacts_panel(): any {
list_empty_state: toggleable({
base: interactive({
base: {
- ...text(layer, "ui_sans", "variant", { size: "sm" }),
+ ...text(layer, "sans", "variant", { size: "sm" }),
padding: {
top: SPACING / 2,
bottom: SPACING / 2,
@@ -301,7 +301,7 @@ export default function contacts_panel(): any {
},
active: {
default: {
- ...text(theme.lowest, "ui_sans", { size: "sm" }),
+ ...text(theme.lowest, "sans", { size: "sm" }),
background: background(theme.lowest),
},
clicked: {
@@ -325,12 +325,12 @@ export default function contacts_panel(): any {
right: 4,
},
background: background(layer, "hovered"),
- ...text(layer, "ui_sans", "hovered", { size: "xs" })
+ ...text(layer, "sans", "hovered", { size: "xs" })
},
contact_status_free: indicator({ layer, color: "positive" }),
contact_status_busy: indicator({ layer, color: "negative" }),
contact_username: {
- ...text(layer, "ui_sans", { size: "sm" }),
+ ...text(layer, "sans", { size: "sm" }),
margin: {
left: NAME_MARGIN,
},
@@ -347,7 +347,7 @@ export default function contacts_panel(): any {
color: foreground(layer, "on"),
},
calling_indicator: {
- ...text(layer, "mono", "variant", { size: "xs" }),
+ ...text(layer, "sans", "variant", { size: "xs" }),
},
tree_branch: toggleable({
base: interactive({
@@ -380,7 +380,7 @@ export default function contacts_panel(): any {
},
name: {
...project_row.name,
- ...text(layer, "mono", { size: "sm" }),
+ ...text(layer, "sans", { size: "sm" }),
},
},
state: {