廖力工作日志 2025-12-19 09:40:25 星期五

上周主线:规范色板,更改部分旧 ui的尺寸单位并完成分辨率适配,修复部分旧组件的样式和尺寸不准确的问题,完成聊天欢迎页面,完成聊天消息发送框的静态重构和组件化
本周主线:纯静态重构,先不考虑组件化,等抽一两天时间专门搞组件化(也许周四和周五)

##今天的任务:

1.组件化任务列表:第二期

    1.完成一个脚本编辑表格组件 -- 已经完成
    2.完成一个脚本画面描述编辑组件 -- 已经完成
    3.完成一个文本focus/blur textarea编辑组件 -- 已经完成
    4.完成一个Ai画面描述生成组件 --- 已经完成
    5.完成一个文本块编辑组件,带勾叉 --- 已经完成
    6.完成一个视频播放组件的放大版本  -- 已经完成
    7.完成一个 tab + container组件  --  已经完成
    8.完成一个buttonlist组件 -- 已经完成
    9.完成一个点分页组件     -- 已经完成
    10.完成一个selectionList组件此组件允许放入任意子组件 - 已经完成
    11.完成一个创作记录列表卡片组件 -- 延后
    12.完成一个radiobutton组件 -- 延后
    13.完成一个时间选择器组件 -- 延后
    14.完成一个普通的文本框组件 -- 延后
    15.完成一个普通的textarea组件 -- 延后
    16.完成一个文件上传组件 -- 延后

##明天的任务:
1.组件化任务列表:第三期
1.完成一个创作记录列表卡片组件
2.完成一个radiobutton组件
3.完成一个时间选择器组件
4.完成一个普通的文本框组件
5.完成一个普通的textarea组件
6.完成一个文件上传组件
2.完成ai会话单例模式的搭建
3.大概梳理一下现有接口和新需求接口的对齐度

长期任务:
1.大概梳理一下现有接口和新需求接口的对齐度 – 把界面重构完就做这个
2.把现有的工作台的功能和业务理通 – 把界面重构完就做这个
3.修复主界面的边栏收起 ~– 已经确认不需要修改
4.适配一个移动端版本
5.selectionList组件的分页换行的感觉不太对,可能需要优化

设计稿规格为:1440*900
需要重构的页面数量:
1.工作台初始界面 – 已经完成
1.1.工作台初始界面聊天对话框 – 聊天对话框中多个样式看起来有冲突,需要找产品经理询问 – 已经完成
1.2.重新整理一个多选下拉框组件 – 已经完成
2.工作台主界面
2.1 工作台主界面左边聊天序列 – 已经完成
2.2 工作台主界面中间文件选择 – 已经完成
2.3 工作台主界面右边脚本编辑界面
2.3.1 镜头列表编辑组件
2.3.2 画面描述ai对话框
2.4 工作台主界面右边视频编辑界面
2.4.1 单选框列表组件
2.4.2 点状分页
2.4.3 支持宽/窄 两种视图模式

    2.5 工作台主界面右边影片编辑界面
    --明天让产品讲一下这个界面的设计和想法

当前计划是先快速重构静态页面,不要关心组件化的问题,
把业务模块用静态也重构的方式先快速过一遍,之后又结构
上的问题还能留下考虑时间及时更改

—————————————————————-其它内容———————————————————————–
<Icon
name=”fileIcon”
width={21.6}
height={24}
style={{
color: “var(–color-brand-accent)”,
}}
/>

                    className={styles.videoItemUnselected}
                    style={{
                        backgroundPosition: "center center",
                        backgroundRepeat: "no-repeat",
                        backgroundSize: "contain",
                        backgroundImage: `url(${
                            require("@/app/(workBanchV2)/asset/images/vFile.jpg").default
                                .src
                        })`,
                    }}

                        <div
                        className={styles.videoPlayButton}
                        style={{
                            backgroundSize: "0.3125rem 0.365rem",
                            backgroundPosition: "center center",
                            backgroundRepeat: "no-repeat",
                            backgroundImage: `url(${
                                require("@/app/(workBanchV2)/asset/images/playIcon_2.svg")
                                    .default.src
                            })`,
                        }}
                    ></div>


                    <Icon
                        name="imageIcon"
                        width={24}
                        height={24}
                        style={{
                            color: "var(--color-icon-secondary)",
                        }}
                    />

@index.tsx (153-181) 请为此结构编写tw样式代码到@styles.ts
这是一个buttonList 用于对素材列表进行分类
整体高度为:29px
flex 横向排列 纵向子元素居中
tab宽度自适应

buttonListItem(默认):
整体高度为:29px
行高为29px
font-size: 12px
字体颜色:var(–color-text-buttonList)
没有背景颜色
padding:0 8px;

tab项目(items)(选中):
字体颜色 :var(–color-brand-accent)
背景颜色:var(–color-button-ghost-hover-bg)

searchBtn :
整体往右靠
flex布局
间距27.42px
子项目垂直居中

@index.tsx (153-181) 请为此结构编写tw样式代码到@styles.ts
这是一个tab栏
tab赠题高度为:40px
tab宽度自适应

tab项目(items)(默认):
高度为40px
行高为40px
font-size: 16px;
font-weight: 500;
字体颜色:var(–color-text-strong)
没有背景颜色
padding:0 16px;

tab项目(items)(选中):
背景颜色:var(–color-bg-surface)

tabContros :
整体往右靠
flex布局
间距27.42px
子项目垂直居中

我现在需要一个树形多选下下拉框列表(仅列表)
它支持将以下数据类型:
[
{
label:”11111”
id:”1”
children:[
{
label:”1_11111”
id:”1_1”
children:[
{
label:”1_1_11111”
id:”1_1_1”
}
]
},
{
label:”1_22222”
id:”1_2”
},
{
label:”1_333333”
id:”1_3”
},
]
},
{
label:”22222”
id:”2”
},
{
label:”333333”
id:”3”
children:[
{
label:”3_111111”
id:”3_1”
},
{
label:”3_222222”
id:”3_2”
},
]
},
]
显示成这样
11111
1_11111
1_1_11111
1_22222
1_333333
22222
333333
3_111111
3_222222

使用起来像这样 :
//用“treeDropdownList”包围目标触发组件
<treeDropdownList
value={“2”} //当前id
treeItems={…}

    onChange={function(value){
        //更改值处理
    }}
>
    //目标触发组件
    <div>点击选择</div>
</treeDropdownList>

我希望这个里面大概是这样

return (
//这是背景层 zindex = 1


//这是弹出层 zindex=2

{title}


//下面渲染TreeCheckItem组件
{treeItems.map(function(index,item){
return <TreeCheckItem key={index} {…item} checkedIdArr={checkedIdArr} />
})}
)

每次完成一个check就返回:
{
allCheckedIdArr:[“1”,”2”,”3”]
allCheckedItem:[
{
label:”11111”
id:”1”
},
{
label:”11111”
id:”2”
}
,
{
label:”11111”
id:”3”
}
],
//这一组只输出没有子节点的项目
bottomCheckedIdArr:[“1”,”2”,”3”]
bottomcheckedItem:[
{
label:”11111”
id:”1”
},
{
label:”11111”
id:”2”
}
,
{
label:”11111”
id:”3”
}
],
//这一组只输出有子节点的项目
parentCheckedIdArr:[“1”,”2”,”3”]
parentcheckedItem:[
{
label:”11111”
id:”1”
},
{
label:”11111”
id:”2”
}
,
{
label:”11111”
id:”3”
}
]
}

范式要求
    依照chadcn/ui的范式编写
    不要编写类似 isEnabled && (<div>...</div>) 这种代码
    应该写成 (function(){ if(isEnabled === true){ return (<div>...</div>)}return null; })()
    不要写三元表达式
    判断空必须这样写 if(typeof value !== 'undefined' && value !== null){}
    不能写作 if(!value){} 这种判断非常模糊
    编写匿名函数时尽量不要使用肩头函数,应该使用(function(){  })()
    请在编写参数的interface中写好注释,调用时可以看到
    请在每个函数上方写好注释

样式要求(所有像素高度转换成 rem 以16px字体为基础进行转换)(所有下面说明的样式尽量使用tw格式编写)
    选中的节点前方打勾
    本节点下子节点选中部分:本节点打横杠. 子选中全部:本直接打勾
    选中文字和 横杠/勾 的 颜色为 var(--color-brand-accent)
    未选中文字颜色为 var(--color-pagination-dot-active) 横杠/勾 的 颜色为 var(--color-button-disabled-bg)
    容器整体背景色为 var(--color-bg-surface)
    容器边框颜色为 var(--color-border-subtle)
    容器padding为8px
行为
    点击锚定元素时显示
    显示在锚定元素的下方
    如果下拉框显示在锚定元素下方时超过当前显示范围就显示在锚定元素的上方
    点击某个CheckItem后 使用onChange函数告诉父级当前选中的id是哪个

参数:
    checkedIdArr(values) :string[]
    treeItems
    onChange
    distance (距离锚定元素多远 默认10px)

文件要求:
这个组件需要创建两个文件:
index.tsx -- treeDropdown组件主文件
treeCheckItem.tsx -- 项目/列表组件
如果有的话就不用创建了,没有的话再创建

@textArea.tsx 帮忙在这里实现一个textArea文本框

范式要求
依照chadcn/ui的范式编写
不要编写类似 isEnabled && (<div>...</div>) 这种代码
应该写成 (function(){ if(isEnabled === true){ return (<div>...</div>)}return null; })()
不要写三元表达式
判断空必须这样写 if(typeof value !== 'undefined' && value !== null){}
不能写作 if(!value){} 这种判断非常模糊

样式要求(所有像素高度转换成 rem 以16px字体为基础进行转换)
初始高度为20px
默认就是一行字所以默认行高为20px
输入框背景色为var(--color-bg-surface)
placeholder颜色为var(--color-text-muted)
正文颜色为var(--color-text-ai)
placeholder默认为"请输入内容"

行为
当用户输入的文字大于一行时,行高设为自动适应高度
当用户输入的文字大于一行时,文本框高度随文字内容自适应高度
当用户输入的文字小于一行时,行高设为20px
当用户输入的文字为空时,行高设为20px
当用户输入的文字为空时,placeholder显示"请输入内容"

输入参数:
value: 
onChange: 
onKeyDown:
onFocus:
onBlur:






我看到了你给出的组件的使用方式
看起来非常复杂且充满了冗余代码
我希望实现一个tooltip组件,这样的组件使用时类似于mui提供的tioolTip组件:
import Tooltip from "../../tooltip"

使用就这么使用就行:
<Tooltip title="点击查看详情"  >
    <span>查看详情</span>
</Tooltip>
你可以帮忙在这里实现一个tooltip吗

范式要求
依照chadcn/ui的范式编写
不要编写类似 isEnabled && (<div>...</div>) 这种代码
应该写成 (function(){ if(isEnabled === true){ return (<div>...</div>)}return null; })()
不要写三元表达式
判断空必须这样写 if(typeof value !== 'undefined' && value !== null){}
不能写作 if(!value){} 这种判断非常模糊
编写匿名函数时尽量不要使用肩头函数,应该使用(function(){  })()

样式要求(所有像素高度转换成 rem 以16px字体为基础进行转换)
高度 22px
行高 22px
字体大小 16px
默认文字颜色 var(--color-button-primary-fg)
默认背景颜色 var(--color-brand-accent)
默认和children元素的距离 10px
默认的border-radius 为 8px

行为
鼠标放到children中时显示tooltip 离开时tooltip消失
显示和消失时淡入淡出

输入参数:
children
//tooltip这一边应该出现在children上的左边还是右边
position-x: left | right
//tooltip这一边应该出现在children上的上面还是下面
position-y: top | bottom

//tooltip这一边应该挂在children上的左边缘还是右边缘
attch-x: left | right
//tooltip这一边应该挂在children上的上边缘还是下边缘
attch-y: top | bottom

className

我需要实现一个下拉框组件
这个组件可以套在任意组件上
点击后打开
使用起来像这样 :
//用“dropdownList”包围目标触发组件
<dropdownList
title=”选择”
value={“2”}
items={
[
{
value:”1”
name:”功能1”
iconName:”xxxx”
},
{
value:”2”
name:”功能1”
iconName:”xxxx”
}
]
}

    onChange={function(value){
        //更改值处理
    }}
>
    //目标触发组件
    <div>点击选择</div>
</dropDownList>

我希望这个里面大概是这样

return (
//这是背景层 zindex = 1


//这是弹出层 zindex=2

{title}


//下面渲染checkItem组件
{items.map(function(index,item){
return <CheckItem key={index} {…item} isSelected={…} />
})}
)

这是checkItem组件的使用方式:
<CheckItem
value=”taskMode”
name=”任务模式”
iconName=”commandKeyIcon”
isChecked={false}
disabled={true}
onClick={function (
event: React.MouseEvent,
value: string
) {
console.log(value);
}}
/>

范式要求
    依照chadcn/ui的范式编写
    不要编写类似 isEnabled && (<div>...</div>) 这种代码
    应该写成 (function(){ if(isEnabled === true){ return (<div>...</div>)}return null; })()
    不要写三元表达式
    判断空必须这样写 if(typeof value !== 'undefined' && value !== null){}
    不能写作 if(!value){} 这种判断非常模糊
    编写匿名函数时尽量不要使用肩头函数,应该使用(function(){  })()
    请在编写参数的interface中写好注释,调用时可以看到

样式要求(所有像素高度转换成 rem 以16px字体为基础进行转换)(所有下面说明的样式尽量使用tw格式编写)
    高度为 自动
    宽度为 自动
    默认背景颜色为 var(--color-bg-dropDown)
    padding:4
    box-shadow: 0px 0px 5px 0px rgba(0, 0, 0, 0.3);
    border-radius: 8px;
    组件内容分为三个部分
        1.标题
            padding-left:4px
            height:20px
            line-height:20px
            font-size:10px;
            color:--color-text-muted
        2.CheckItem列表
            间隔 4px

行为
    点击锚定元素时显示
    显示在锚定元素的下方
    如果下拉框显示在锚定元素下方时超过当前显示范围就显示在锚定元素的上方
    点击某个CheckItem后 使用onChange函数告诉父级当前选中的id是哪个

参数:
    title
    value
    items
    onChange
    distance (距离锚定元素多远 默认10px)




我需要一个CheckItem组件:
范式要求
    依照chadcn/ui的范式编写
    不要编写类似 isEnabled && (<div>...</div>) 这种代码
    应该写成 (function(){ if(isEnabled === true){ return (<div>...</div>)}return null; })()
    不要写三元表达式
    判断空必须这样写 if(typeof value !== 'undefined' && value !== null){}
    不能写作 if(!value){} 这种判断非常模糊
    编写匿名函数时尽量不要使用肩头函数,应该使用(function(){  })()
    请在编写参数的interface中写好注释,调用时可以看到

样式要求(所有像素高度转换成 rem 以16px字体为基础进行转换)(所有下面说明的样式尽量使用tw格式编写)
    高度为 24px
    行高为 24px
    默认背景颜色为 透明
    选中时背景为 var(--color-brand-accent)
    容器的padding为  上下2px 左边6px 右边10px
    border-radius: 4px;
    组件内容分为三个部分
        1.图标(Icon组件)
            10px * 10px
        2.文字 
            字体颜色为 var(--color-text-inverse)
            字体大小 14px
        3.是否选中的那个勾勾
            图片为:../../../startPage/images/checkIcon.svg 图片大小为 9.9px * 7.01px
            请使用div + 背景的方式设置图片,不要用image
            未选中时不显示它(opacity:0)但要占位
行为
    可点击

参数
    value:string
    name:string
    iconName:string
    isChecked:boolean

需要在这里写一个taglist textArea
总的来说就是一个正常textarea的样子
刚开始里面没内容
输入某些内容后,比如”123123”
然后按下回车,123123就会成为一个标签 并带个x号,可以用TagDeleteableBtn来做
当用户使用退格键的时候,不仅可以像普通的textarea那样删除未变成标签的文字,也可以将TagDeleteableBtn 标签删掉

范式要求
依照chadcn/ui的范式编写
不要编写类似 isEnabled && (

) 这种代码
应该写成 (function(){ if(isEnabled === true){ return (
)}return null; })()
不要写三元表达式
判断空必须这样写 if(typeof value !== ‘undefined’ && value !== null){}
不能写作 if(!value){} 这种判断非常模糊
编写匿名函数时尽量不要使用肩头函数,应该使用(function(){ })()
请在编写参数的interface中写好注释,调用时可以看到
样式要求(所有像素高度转换成 rem 以16px字体为基础进行转换)(所有下面说明的样式尽量使用tw格式编写)
textarea的部分:
w-full
h-[1.375rem]
leading-[1.375rem]
text-indent-[.5rem]
border-[.0625rem]
border-[var(–color-border-subtle)]
rounded-[.25rem]
p-[.5rem]
min-h-[90px]
box-border
text-[.875rem]
text-[var(–color-text-strong)]
outline-none
行为
用户输入文字,点击Enter键在里面创建tag
tag可通过鼠标点击删除
也可以通过退格键删除
在显示tag的同时不影响文字编辑

输入参数
value=[
{tagName:”123123”}
{tagName:”123123”}

]
onchange //只在用户创建了tag的情况下响应这个回调函数
className
style

要求将组件本体的ref暴露出去