TOAST UI Calendar视图组件深度剖析
本文深入解析TOAST UI Calendar的核心视图组件实现原理,涵盖月视图、周视图、日视图的架构设计与渲染机制。月视图采用分层网格结构和智能事件布局算法;周视图基于精密的时间网格数据结构和事件碰撞检测系统;日视图实现精确的时间位置映射和实时指示器功能。文章还将详细分析面板调整器的拖拽交互和响应式布局策略,揭示其高性能渲染和优化的用户体验设计。
月视图组件结构与渲染机制
TOAST UI Calendar的月视图组件是其核心功能之一,提供了直观的月度事件展示和交互体验。月视图采用分层架构设计,通过精密的网格计算和事件布局算法,实现了高效的事件渲染和用户交互。
组件层级结构
月视图的组件结构采用分层设计,各组件职责明确:
classDiagram
class Month {
+renderDate: Date
+options: MonthOptions
+getMonthDayNames()
+render()
}
class Layout {
+className: string
+children: ReactNode
}
class GridHeader {
+type: string
+dayNames: DayNameInfo[]
+options: MonthOptions
+rowStyleInfo: CellStyleInfo[]
}
class DayGridMonth {
+dateMatrix: Date[][]
+rowInfo: CellInfo[]
+cellWidthMap: string[][]
+useCellContentAreaHeight()
+useGridSelection()
+render()
}
class GridRow {
+week: Date[]
+rowInfo: CellInfo[]
+gridDateEventModelMap: Record~string, EventUIModel[]~
+contentAreaHeight: number
}
class MonthEvents {
+name: string
+events: EventUIModel[]
+contentAreaHeight: number
+eventHeight: number
+className: string
}
Month --> Layout
Layout --> GridHeader
Layout --> DayGridMonth
DayGridMonth --> GridRow
DayGridMonth --> MonthEvents
核心渲染流程
月视图的渲染过程涉及多个关键步骤,从日期矩阵生成到事件布局计算:
flowchart TD
A[Month组件初始化] --> B[获取当前渲染日期]
B --> C[生成日期矩阵]
C --> D[计算网格样式信息]
D --> E[创建网格位置查找器]
E --> F[获取渲染事件数据]
F --> G[计算单元格内容区域高度]
G --> H[渲染网格行和事件]
H --> I[应用交互功能]
日期矩阵生成
月视图的核心是日期矩阵的生成,通过createDateMatrixOfMonth函数实现:
const dateMatrix = useMemo(
() => createDateMatrixOfMonth(renderDate, monthOptions),
[monthOptions, renderDate]
);
该函数根据当前渲染日期和月份选项生成一个二维日期数组,确保月份显示的正确布局,包括处理跨月日期和固定的6周显示模式。
网格样式计算
网格样式信息通过getRowStyleInfo函数计算,考虑窄周末和工作日选项:
const { rowStyleInfo, cellWidthMap } = useMemo(
() => getRowStyleInfo(dayNames.length, narrowWeekend, startDayOfWeek, workweek),
[dayNames.length, narrowWeekend, startDayOfWeek, workweek]
);
事件布局算法
事件在月视图中的布局采用智能算法,确保事件显示的美观性和功能性:
| 布局参数 | 默认值 | 说明 |
|---|---|---|
| MONTH_EVENT_HEIGHT | 22px | 单个事件的高度 |
| MONTH_EVENT_MARGIN_TOP | 2px | 事件间的垂直间距 |
| MONTH_CELL_PADDING_TOP | 4px | 单元格顶部内边距 |
| MONTH_CELL_BAR_HEIGHT | 18px | 单元格标题栏高度 |
function useCellContentAreaHeight(eventHeight: number) {
const visibleEventCount = useStore(monthVisibleEventCountSelector);
const { headerHeight: themeHeaderHeight, footerHeight: themeFooterHeight } =
useTheme(monthGridCellSelector);
const ref = useRef<HTMLDivElement>(null);
const [cellContentAreaHeight, setCellContentAreaHeight] = useState(0);
useEffect(() => {
if (ref.current) {
const rowHeight = getSize(ref.current).height;
const headerHeight = MONTH_CELL_PADDING_TOP + (themeHeaderHeight ?? MONTH_CELL_BAR_HEIGHT);
const footerHeight = themeFooterHeight ?? 0;
const baseContentAreaHeight = rowHeight - headerHeight - footerHeight;
const visibleEventCountHeight = visibleEventCount * (eventHeight + MONTH_EVENT_MARGIN_TOP);
setCellContentAreaHeight(Math.min(baseContentAreaHeight, visibleEventCountHeight));
}
}, [themeFooterHeight, themeHeaderHeight, eventHeight, visibleEventCount]);
return { ref, cellContentAreaHeight };
}
交互功能实现
月视图支持丰富的交互功能,包括网格选择、事件拖拽和调整大小:
网格选择机制
网格选择通过useGridSelection钩子实现,提供精确的日期范围选择:
const onMouseDown = useGridSelection({
type: 'dayGridMonth',
gridPositionFinder,
dateCollection: dateMatrix,
dateGetter: dayGridMonthSelectionHelper.getDateFromCollection,
selectionSorter: dayGridMonthSelectionHelper.sortSelection,
});
事件位置计算
事件在网格中的位置通过复杂的算法计算,考虑事件的开始结束时间和网格布局:
export const getEventLeftAndWidth = (
start: TZDate,
end: TZDate,
row: TZDate[],
narrowWeekend: boolean
) => {
const { widthList } = getGridWidthAndLeftPercentValues(row, narrowWeekend, TOTAL_WIDTH);
let gridStartIndex = 0;
let gridEndIndex = row.length - 1;
row.forEach((cell, index) => {
if (cell <= start) {
gridStartIndex = index;
}
if (cell <= end) {
gridEndIndex = index;
}
});
return {
width: getWidth(widthList, gridStartIndex, gridEndIndex),
left: !gridStartIndex ? 0 : getWidth(widthList, 0, gridStartIndex - 1),
};
};
性能优化策略
月视图采用多种性能优化策略确保流畅的用户体验:
- Memoization优化:使用useMemo缓存计算结果,避免不必要的重计算
- 虚拟滚动:只渲染可见区域的事件内容
- 事件聚合:对超出显示范围的事件进行聚合显示
- 按需渲染:根据容器尺寸动态计算可见事件数量
const renderedEventUIModels = useMemo(
() => dateMatrix.map((week) => getRenderedEventUIModels(week, calendarData, narrowWeekend)),
[calendarData, dateMatrix, narrowWeekend]
);
月视图组件的设计体现了TOAST UI Calendar对用户体验和性能的深度考量,通过精密的算法和优化的架构,实现了既美观又高效的日历展示功能。
周视图时间网格与事件布局算法
TOAST UI Calendar的周视图时间网格系统是其核心功能之一,它通过精密的算法实现了时间段的精确划分和事件的智能布局。本文将深入剖析时间网格的构建原理、事件布局算法以及性能优化策略。
时间网格数据结构
时间网格采用分层数据结构来组织时间信息,主要包含以下核心组件:
interface TimeGridData {
rows: TimeGridRow[];
columns: TimeGridColumn[];
}
interface TimeGridRow {
startTime: string; // 格式: "HH:MM"
endTime: string; // 格式: "HH:MM"
height: number; // 行高度百分比
top: number; // 顶部位置百分比
}
interface TimeGridColumn {
date: TZDate; // 日期对象
width: number; // 列宽度百分比
left: number; // 左侧位置百分比
}
网格生成算法
时间网格的生成采用分治策略,通过以下步骤构建:
- 时间行划分:根据配置的起始小时和结束小时,将一天划分为等间隔的时间段
- 日期列划分:根据周视图的日期范围,创建对应的日期列
- 空间分配:计算每个时间格和日期格的精确位置和尺寸
flowchart TD
A[配置参数<br>hourStart, hourEnd] --> B[生成时间行序列]
C[周日期范围] --> D[生成日期列序列]
B --> E[计算行高和垂直位置]
D --> F[计算列宽和水平位置]
E --> G[构建TimeGridData结构]
F --> G
G --> H[返回完整网格数据]
事件布局算法
事件在时间网格中的布局采用基于时间跨度的精确计算:
1. 时间位置映射算法
function getTopPercentByTime(
eventTime: TZDate,
startTime: TZDate,
endTime: TZDate
): number {
const totalMinutes = (endTime.getTime() - startTime.getTime()) / (1000 * 60);
const eventMinutes = (eventTime.getTime() - startTime.getTime()) / (1000 * 60);
return (eventMinutes / totalMinutes) * 100;
}
2. 跨日期事件处理
对于跨越多个日期的事件,系统采用分段渲染策略:
flowchart LR
A[多日期事件] --> B{日期跨度分析}
B --> C[单日期事件]
B --> D[多日期事件]
C --> E[完整渲染在当前日期]
D --> F[按日期分段计算]
F --> G[计算各段起始位置]
F --> H[计算各段宽度比例]
G --> I[生成分段渲染信息]
H --> I
碰撞检测与重叠处理
时间网格中的事件重叠处理采用分层布局算法:
| 重叠类型 | 处理策略 | 实现复杂度 |
|---|---|---|
| 完全重叠 | 垂直堆叠 | ⭐⭐ |
| 部分重叠 | 智能避让 | ⭐⭐⭐ |
| 跨日期重叠 | 分段处理 | ⭐⭐⭐⭐ |
// 重叠检测算法
function detectOverlaps(events: EventUIModel[]): OverlapGroup[] {
const groups: OverlapGroup[] = [];
const sortedEvents = events.sort((a, b) => a.top - b.top);
let currentGroup: EventUIModel[] = [];
let currentBottom = 0;
sortedEvents.forEach(event => {
if (event.top >= currentBottom) {
if (currentGroup.length > 0) {
groups.push([...currentGroup]);
currentGroup = [];
}
}
currentGroup.push(event);
currentBottom = Math.max(currentBottom, event.top + event.height);
});
if (currentGroup.length > 0) {
groups.push(currentGroup);
}
return groups;
}
性能优化策略
TOAST UI Calendar在时间网格渲染中采用了多项性能优化技术:
1. 虚拟滚动优化
const VISIBLE_TIME_RANGE = 4; // 小时
const BUFFER_SIZE = 2; // 缓冲区域
function getVisibleRows(
scrollTop: number,
containerHeight: number,
allRows: TimeGridRow[]
): { startIndex: number; endIndex: number } {
const rowHeight = containerHeight / allRows.length;
const visibleStart = Math.max(0, Math.floor(scrollTop / rowHeight) - BUFFER_SIZE);
const visibleEnd = Math.min(
allRows.length - 1,
Math.ceil((scrollTop + containerHeight) / rowHeight) + BUFFER_SIZE
);
return { startIndex: visibleStart, endIndex: visibleEnd };
}
2. 事件渲染缓存
flowchart TB
A[事件数据变更] --> B{缓存有效性检查}
B -->|缓存有效| C[使用缓存数据]
B -->|缓存失效| D[重新计算布局]
D --> E[更新缓存<br>hash-based存储]
E --> F[返回渲染数据]
C --> F
3. 增量更新机制
当事件发生变化时,系统采用增量更新策略:
function updateEvents(
oldEvents: EventUIModel[],
newEvents: EventUIModel[]
): UpdateResult {
const added = newEvents.filter(newEvent =>
!oldEvents.some(oldEvent => oldEvent.cid() === newEvent.cid())
);
const removed = oldEvents.filter(oldEvent =>
!newEvents.some(newEvent => newEvent.cid() === oldEvent.cid())
);
const updated = newEvents.filter(newEvent => {
const oldEvent = oldEvents.find(e => e.cid() === newEvent.cid());
return oldEvent && !isEqual(oldEvent, newEvent);
});
return { added, removed, updated };
}
响应式布局适应
时间网格系统具备强大的响应式布局能力,能够适应不同的屏幕尺寸和显示需求:
function adjustLayoutForViewport(
timeGridData: TimeGridData,
containerWidth: number,
containerHeight: number
): AdjustedLayout {
const aspectRatio = containerWidth / containerHeight;
if (aspectRatio > 2) {
// 宽屏模式:增加时间列宽度
return adjustForWideScreen(timeGridData);
} else if (aspectRatio < 1) {
// 窄屏模式:优化时间行高度
return adjustForNarrowScreen(timeGridData);
} else {
// 标准比例
return timeGridData;
}
}
时间网格与事件布局算法是TOAST UI Calendar周视图的核心技术,通过精密的数学计算和智能的布局策略,确保了事件显示的准确性和用户体验的流畅性。这些算法的优化和实施体现了现代Web应用中对性能和人机交互细节的高度重视。
日视图详细时间轴实现原理
TOAST UI Calendar的日视图时间轴是其核心功能之一,通过精密的网格系统和时间计算算法,为用户提供直观的时间管理和事件安排体验。本文将深入剖析日视图时间轴的实现原理,包括网格布局、时间计算、事件渲染和交互处理等关键技术细节。
时间网格数据结构
日视图的时间轴基于一个精心设计的网格数据结构,该结构通过TimeGridData类型定义:
interface TimeGridData {
columns: Array<{
date: TZDate;
width: number;
}>;
rows: Array<{
startTime: string;
endTime: string;
top: number;
height: number;
}>;
}
这个数据结构包含两个主要部分:
- columns: 表示时间轴上的日期列,每个列包含日期信息和宽度百分比
- rows: 表示时间轴上的时间行,每行包含开始时间、结束时间、顶部位置和高度
网格创建算法
时间网格的创建通过createTimeGridData函数实现,该函数根据配置参数生成精确的时间网格:
function createTimeGridData(days: TZDate[], options: {
hourStart: number;
hourEnd: number;
narrowWeekend: boolean;
}): TimeGridData {
const rows = [];
const timeInterval = 30; // 30分钟间隔
const totalMinutes = (options.hourEnd - options.hourStart) * 60;
const rowCount = totalMinutes / timeInterval;
for (let i = 0; i < rowCount; i++) {
const startHour = options.hourStart + Math.floor(i * timeInterval / 60);
const startMinute = (i * timeInterval) % 60;
const endMinute = startMinute + timeInterval;
rows.push({
startTime: `${String(startHour).padStart(2, '0')}:${String(startMinute).padStart(2, '0')}`,
endTime: endMinute === 60
? `${String(startHour + 1).padStart(2, '0')}:00`
: `${String(startHour).padStart(2, '0')}:${String(endMinute).padStart(2, '0')}`,
top: (i / rowCount) * 100,
height: 100 / rowCount
});
}
const columns = days.map(date => ({
date,
width: 100 / days.length
}));
return { columns, rows };
}
时间位置映射系统
时间轴的核心功能是将具体时间映射到网格上的精确位置,这是通过getTopPercentByTime函数实现的:
function getTopPercentByTime(
targetTime: TZDate,
startTime: TZDate,
endTime: TZDate
): number {
const totalMs = endTime.getTime() - startTime.getTime();
const elapsedMs = targetTime.getTime() - startTime.getTime();
return Math.max(0, Math.min(100, (elapsedMs / totalMs) * 100));
}
这个计算过程可以用以下流程图表示:
flowchart TD
A[输入目标时间] --> B[计算时间范围总毫秒数]
A --> C[计算已过毫秒数]
B --> D[计算时间百分比]
C --> D
D --> E[限制百分比在0-100范围内]
E --> F[返回顶部位置百分比]
事件渲染机制
事件在时间轴上的渲染涉及复杂的布局计算,主要通过setRenderInfoOfUIModels函数处理:
function setRenderInfoOfUIModels(
uiModels: EventUIModel[],
gridStartTime: TZDate,
gridEndTime: TZDate,
selectedDuplicateEventCid: string | null,
collapseOptions: CollapseDuplicateEventsOptions
): EventUIModel[] {
return uiModels.map(uiModel => {
const event = uiModel.model;
const startTime = Math.max(event.start.getTime(), gridStartTime.getTime());
const endTime = Math.min(event.end.getTime(), gridEndTime.getTime());
if (startTime >= endTime) {
return uiModel.setRenderInfo(null);
}
const top = getTopPercentByTime(new Date(startTime), gridStartTime, gridEndTime);
const height = getTopPercentByTime(new Date(endTime), gridStartTime, gridEndTime) - top;
return uiModel.setRenderInfo({
top,
height,
left: 0,
width: 100,
// 其他布局信息...
});
});
}
实时时间指示器
日视图包含一个实时更新的当前时间指示器,其实现涉及复杂的定时器和状态管理:
function useTimeGridIndicator(timeGridData: TimeGridData) {
const [indicatorState, setIndicatorState] = useState<{
top: number;
now: TZDate;
} | null>(null);
const updateIndicator = useCallback(() => {
const now = new TZDate();
const currentDateIndex = timeGridData.columns.findIndex(col =>
isSameDate(col.date, now)
);
if (currentDateIndex >= 0) {
const columnDate = timeGridData.columns[currentDateIndex].date;
const gridStart = setTimeStrToDate(columnDate, timeGridData.rows[0].startTime);
const gridEnd = setTimeStrToDate(columnDate, last(timeGridData.rows).endTime);
if (gridStart <= now && now <= gridEnd) {
setIndicatorState({
top: getTopPercentByTime(now, gridStart, gridEnd),
now
});
}
}
}, [timeGridData]);
useInterval(updateIndicator, 60000); // 每分钟更新一次
return indicatorState;
}
网格选择交互
时间轴支持鼠标选择时间范围的功能,这是通过网格位置查找器和选择处理器实现的:
const gridPositionFinder = createGridPositionFinder({
rowsCount: timeGridData.rows.length,
columnsCount: timeGridData.columns.length,
container: columnsContainer,
narrowWeekend,
startDayOfWeek
});
const onMouseDown = useGridSelection({
type: 'timeGrid',
gridPositionFinder,
selectionSorter: timeGridSelectionHelper.sortSelection,
dateGetter: timeGridSelectionHelper.getDateFromCollection,
dateCollection: timeGridData
});
性能优化策略
为了确保日视图的流畅性能,TOAST UI Calendar采用了多种优化策略:
- 虚拟滚动: 只渲染可视区域的时间行和事件
- 事件过滤: 根据时间范围预先过滤不在当前视图的事件
- 记忆化计算: 使用useMemo缓存昂贵的计算结果
- 批量更新: 减少不必要的重渲染
时间轴布局表格
以下是时间轴布局的关键参数表格:
| 参数 | 类型 | 默认值 | 描述 |
|---|---|---|---|
| hourStart | number | 0 | 时间轴开始小时(0-23) |
| hourEnd | number | 24 | 时间轴结束小时(0-24) |
| timeInterval | number | 30 | 时间间隔(分钟) |
| rowHeight | number | 自动计算 | 每行高度百分比 |
| columnWidth | number | 100% | 单日列宽度 |
时区处理机制
日视图支持多时区显示,时区处理通过专门的时区钩子实现:
const usePrimaryTimezone = () => {
const timezoneName = useStore(primaryTimezoneSelector);
const getNow = useCallback(() => {
return timezoneName === 'Local'
? new TZDate()
: new TZDate().convertToTimezone(timezoneName);
}, [timezoneName]);
return [timezoneName, getNow];
};
日视图时间轴的实现体现了TOAST UI Calendar对细节的精益求精,通过精密的算法和优化的架构,为用户提供了流畅、直观的时间管理体验。每个组件都经过精心设计,确保在各种使用场景下都能保持高性能和良好的用户体验。
面板调整器与响应式布局设计
TOAST UI Calendar 的面板调整器(Panel Resizer)是一个精巧的交互组件,它允许用户通过拖拽来动态调整周视图和日视图中各个面板的高度。这一功能不仅提升了用户体验,还体现了现代 Web 应用对响应式设计的深度思考。
面板调整器的核心实现
面板调整器的核心组件位于 panelResizer.tsx,它采用了 Preact 框架构建,具备完整的拖拽交互逻辑:
export function PanelResizer({ name, height }: Props) {
const border = useTheme(useCallback((theme) => theme.week.panelResizer.border, []));
const style = getDefaultStyle(height, border);
const [guideStyle, setGuideStyle] = useState<StyleProp>(defaultGuideStyle);
const startPos = useRef<{ left: number; top: number } | null>(null);
const { updateDayGridRowHeightByDiff } = useDispatch('weekViewLayout');
const onMouseDown = useDrag(DRAGGING_TYPE_CONSTANTS.panelResizer, {
onDragStart: (e) => {
startPos.current = { left: e.pageX, top: e.pageY };
},
onDrag: (e) => {
if (startPos.current) {
const top = e.pageY - startPos.current.top;
setGuideStyle((prev) => ({ ...prev, top, display: null }));
}
},
onMouseUp: (e) => {
if (startPos.current) {
const diff = e.pageY - startPos.current.top;
startPos.current = null;
setGuideStyle(defaultGuideStyle);
updateDayGridRowHeightByDiff({ rowName: name, diff });
}
},
});
}
拖拽交互的状态管理
面板调整器的拖拽过程涉及多个状态变化,通过状态机可以清晰地描述这一过程:
stateDiagram-v2
[*] --> Idle: 初始化
Idle --> DragStart: 鼠标按下
DragStart --> Dragging: 开始拖拽
Dragging --> Dragging: 持续拖拽
Dragging --> DragEnd: 鼠标释放
DragEnd --> Idle: 重置状态
DragEnd --> UpdateLayout: 更新布局
state UpdateLayout {
[*] --> CalculateDiff
CalculateDiff --> UpdateStore
UpdateStore --> [*]
}
响应式布局算法
TOAST UI Calendar 采用智能的布局分配算法,确保在调整一个面板高度时,其他面板能够自动适应剩余空间:
function getRestPanelHeight(
dayGridRowsState: WeekViewLayoutSlice['weekViewLayout']['dayGridRows'],
lastPanelType: string,
initHeight: number
) {
return Object.keys(dayGridRowsState).reduce((acc, rowName) => {
if (rowName === lastPanelType) {
return acc;
}
return acc - dayGridRowsState[rowName].height - DEFAULT_RESIZER_LENGTH;
}, initHeight);
}
样式系统与视觉反馈
面板调整器的样式系统经过精心设计,提供清晰的视觉反馈:
.layout .panel-resizer {
user-select: none;
}
.layout .panel-resizer:hover {
border-color: #999;
}
.layout .panel-resizer-guide {
position: absolute;
}
.layout.horizontal .panel,
.layout.horizontal .panel-resizer {
display: inline-block;
vertical-align: middle;
}
多面板协调机制
TOAST UI Calendar 支持多种面板类型,包括里程碑(milestone)、任务(task)、全天事件(allday)和时间网格(time)。调整器需要协调这些面板之间的关系:
| 面板类型 | 默认高度 | 可调整性 | 主要功能 |
|---|---|---|---|
| milestone | 自动计算 | 可调整 | 显示里程碑事件 |
| task | 自动计算 | 可调整 | 显示任务事件 |
| allday | 自动计算 | 可调整 | 显示全天事件 |
| time | 剩余空间 | 自动适应 | 显示时间网格事件 |
性能优化策略
为了确保拖拽过程的流畅性,TOAST UI Calendar 采用了多项性能优化措施:
- 使用 useRef 存储起始位置:避免在每次渲染时重新创建对象
- 批量状态更新:通过 Immer.js 实现不可变数据更新
- CSS 硬件加速:利用 transform 和 opacity 属性提升渲染性能
- 事件委托:减少事件监听器的数量
响应式设计的最佳实践
面板调整器的实现体现了现代响应式设计的多个最佳实践:
flowchart TD
A[用户拖拽调整器] --> B[计算位置差异]
B --> C{是否有效操作?}
C -->|是| D[更新状态存储]
C -->|否| E[恢复原状态]
D --> F[重新计算布局]
F --> G[触发重渲染]
G --> H[完成调整]
E --> H
主题系统集成
面板调整器深度集成到 TOAST UI Calendar 的主题系统中,支持自定义样式:
const border = useTheme(useCallback((theme) => theme.week.panelResizer.border, []));
这种设计使得开发者可以轻松地定制调整器的外观,包括边框颜色、悬停效果、引导线样式等,同时保持功能的一致性。
面板调整器不仅是 TOAST UI Calendar 的一个交互功能,更是响应式设计理念的完美体现。它通过精巧的状态管理、流畅的拖拽体验和智能的布局算法,为用户提供了直观而强大的日历视图定制能力。
TOAST UI Calendar的视图组件体系展现了现代Web应用对用户体验和性能优化的深度考量。月视图的分层架构、周视图的时间网格算法、日视图的精密时间计算以及面板调整器的智能响应式设计,共同构成了一个高性能、可定制的日历解决方案。这些组件通过精密的数学计算、智能的布局策略和多项性能优化技术,确保了在各种使用场景下都能提供流畅、直观的交互体验,为开发者提供了强大的日历功能实现参考。
Kimi-K2.5Kimi K2.5 是一款开源的原生多模态智能体模型,它在 Kimi-K2-Base 的基础上,通过对约 15 万亿混合视觉和文本 tokens 进行持续预训练构建而成。该模型将视觉与语言理解、高级智能体能力、即时模式与思考模式,以及对话式与智能体范式无缝融合。Python00- QQwen3-Coder-Next2026年2月4日,正式发布的Qwen3-Coder-Next,一款专为编码智能体和本地开发场景设计的开源语言模型。Python00
xw-cli实现国产算力大模型零门槛部署,一键跑通 Qwen、GLM-4.7、Minimax-2.1、DeepSeek-OCR 等模型Go06
PaddleOCR-VL-1.5PaddleOCR-VL-1.5 是 PaddleOCR-VL 的新一代进阶模型,在 OmniDocBench v1.5 上实现了 94.5% 的全新 state-of-the-art 准确率。 为了严格评估模型在真实物理畸变下的鲁棒性——包括扫描伪影、倾斜、扭曲、屏幕拍摄和光照变化——我们提出了 Real5-OmniDocBench 基准测试集。实验结果表明,该增强模型在新构建的基准测试集上达到了 SOTA 性能。此外,我们通过整合印章识别和文本检测识别(text spotting)任务扩展了模型的能力,同时保持 0.9B 的超紧凑 VLM 规模,具备高效率特性。Python00
KuiklyUI基于KMP技术的高性能、全平台开发框架,具备统一代码库、极致易用性和动态灵活性。 Provide a high-performance, full-platform development framework with unified codebase, ultimate ease of use, and dynamic flexibility. 注意:本仓库为Github仓库镜像,PR或Issue请移步至Github发起,感谢支持!Kotlin08
VLOOKVLOOK™ 是优雅好用的 Typora/Markdown 主题包和增强插件。 VLOOK™ is an elegant and practical THEME PACKAGE × ENHANCEMENT PLUGIN for Typora/Markdown.Less00