T02 typography: text styles, keys, formatters, fit, links, math, motion text
Headings to overlines, Code, Kbd and KbdCombo on gpui keystrokes, Highlight, MiddleEllipsis and EllipsisTooltip, links, eight formatted values on jiff with a typographic minus, CopyableText, SelectableText, Emoji, a TeX subset, rolling AnimatedNumber, Typewriter, tonal GradientText, ShimmerText. Gallery probes now hug their targets. Codex gpt-6-astra (max): PASS in round 2.
This commit is contained in:
30 files changed
+3125
-58
No files matched your search
@@ -0,0 +1,49 @@
|
||||
use gpui::{App, IntoElement, ParentElement, RenderOnce, SharedString, Styled, Window, div};
|
||||
|
||||
use crate::theme::{ActiveTheme, TextSize};
|
||||
|
||||
/// One emoji in the system color font.
|
||||
#[derive(IntoElement)]
|
||||
pub struct Emoji {
|
||||
glyph: SharedString,
|
||||
size: TextSize,
|
||||
}
|
||||
|
||||
impl Emoji {
|
||||
pub fn new(glyph: impl Into<SharedString>) -> Self {
|
||||
Self {
|
||||
glyph: glyph.into(),
|
||||
size: TextSize::Lg,
|
||||
}
|
||||
}
|
||||
|
||||
/// GitHub shortcode without colons; `None` if unknown.
|
||||
pub fn shortcode(code: &str) -> Option<Self> {
|
||||
emojis::get_by_shortcode(code).map(|emoji| Self::new(emoji.as_str()))
|
||||
}
|
||||
|
||||
pub fn size(mut self, size: TextSize) -> Self {
|
||||
self.size = size;
|
||||
self
|
||||
}
|
||||
}
|
||||
|
||||
impl RenderOnce for Emoji {
|
||||
fn render(self, _: &mut Window, cx: &mut App) -> impl IntoElement {
|
||||
div()
|
||||
.text_size(cx.theme().text_size(self.size))
|
||||
.child(self.glyph)
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::Emoji;
|
||||
|
||||
#[test]
|
||||
fn shortcodes_resolve_or_refuse() {
|
||||
let glyph = Emoji::shortcode("sparkles").map(|emoji| emoji.glyph.to_string());
|
||||
assert_eq!(glyph.as_deref(), Some("✨"));
|
||||
assert!(Emoji::shortcode("not_an_emoji_name").is_none());
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user