DOM 与 CSS
组件之下的类型化 DOM 层——原始 HTML 元素、Styles、Color、 DomEvent 负载,以及底层拖拽原语。从 neony.dom 导入。
Color
Color(name="white")
Color(hex="#ff6b6b")
Color(rgb=(255, 107, 107))
Color(rgba=(255, 107, 107, 0.5))
Color(var="--color-accent") # 主题令牌Styles
类型化 CSS 属性模型 — 颜色、尺寸、弹性布局、间距、排版、边框(含单角圆角)、 backdrop-filter 等。
Styles(
display="flex",
flex_direction="column",
gap="12px",
padding="24px",
background_color=Color(var="--color-surface-glass-bg"),
backdrop_filter="blur(16px)",
border_radius="12px",
border_top_right_radius="12px",
user_select="none", # 自动输出 user-select + -webkit/-moz 前缀
)需要浏览器前缀的属性(backdrop-filter、user-select)会自动输出带 前缀的变体——一个 Python 字段,覆盖全部写法。
DomEvent
交付给事件处理器的事件负载:
async def handler(event: DomEvent) -> None:
event.key # 元素标识
event.type # "click" | "input" | "scroll" | ...
event.value # 元素相关值
event.source # "user" | "program"携带这些字段的事件会带上相应富字段:修饰键(ctrl_key / shift_key / alt_key / meta_key)、鼠标坐标(x / y / offset_x / offset_y)、 指针增量(movement_x / movement_y / pointer_type)、滚轮增量 (delta_x / delta_y / delta_mode)、滚动位置(scroll_top / scroll_left —— 实际滚动元素的位置,派发到最近的带 key 祖先)、剪贴板数据 (clipboard_text / clipboard_html)、 应用内拖拽载荷(drag_payload)、以及拖放文件(drop_files)。
原始元素
每个 HTML 元素都是类:Div、Span、Body、H1–H6、 Input、Button、Form、Table … 共享链式事件 API, 支持 build()(HTML 字符串)和 to_node()(可挂载节点)。
from neony.dom import Color, Div, Styles
card = Div(
styles=Styles(padding="24px", background_color=Color(var="--color-surface")),
container=["Hello"],
)拖拽与重排
低层拖拽 API 可用于任意元素。设置 drag_payload 让元素可拖拽,并为其 声明稳定的载荷;drop 时载荷通过 DomEvent.drag_payload 交回,位置由 event.x / event.y / offset_x / offset_y 给出:
item = Div(key="row-1", drag_payload="row-1") # 可拖拽 + 声明载荷
item.on_dragstart(lambda e: print("dragging", e.drag_payload))
item.on_dragend(lambda e: print("drag finished"))
drop_zone.on_drop(lambda e: reorder(e.drag_payload, e.key, e.offset_y)) # 读回载荷- 元素与组件均可监听
dragstart/dragenter/dragover/dragleave/drop/dragend。 dragover/drop已被处理,任意带 key 元素都是合法 drop 目标, 拖入文件也不会让 webview 导航离开。- 应用内拖拽过程中,插入点显示虚线落点槽;drop 时卡片动画重排到最终顺序。