@ptengine/design-components 0.5.1 → 0.5.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/ui/prompt-picker.d.ts +15 -0
- package/dist/components/ui/prompt-picker.d.ts.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.js +1702 -1680
- package/package.json +1 -1
- package/src/components/ui/prompt-picker.tsx +59 -12
package/package.json
CHANGED
|
@@ -63,6 +63,21 @@ export interface PromptPickerItem {
|
|
|
63
63
|
* **只支持两层,不要做递归多层。**
|
|
64
64
|
*/
|
|
65
65
|
children?: PromptPickerItem[];
|
|
66
|
+
/**
|
|
67
|
+
* 可选:条目右端的小徽标,如「即将上线」。**只放短枚举**(1-4 字),它是给整条加限定,
|
|
68
|
+
* 不是第二行说明 —— 长说明走 `hint`(悬停)。
|
|
69
|
+
*
|
|
70
|
+
* 用扁平 chip(`rounded-sm bg-muted`)而不是库的 `Badge` 组件:后者是
|
|
71
|
+
* `rounded-full font-semibold` 胶囊,在 32px 高的条目里显得过重,且 lin 已裁定
|
|
72
|
+
* Badge 只留给短枚举场景的独立标签。此处写法与 apps/x 的 ⋮ 菜单出口组一致。
|
|
73
|
+
*/
|
|
74
|
+
badge?: string;
|
|
75
|
+
/**
|
|
76
|
+
* 可选:该条不可选(常与 `badge: '即将上线'` 搭配)。
|
|
77
|
+
* 整条降到辅助色、不响应点击、不进 Tab 序,也不给 hover 反馈 ——
|
|
78
|
+
* **点了没反应比灰着更伤**,所以连状态层都不挂。
|
|
79
|
+
*/
|
|
80
|
+
disabled?: boolean;
|
|
66
81
|
/**
|
|
67
82
|
* 可选图标。⚠️ **一组条目全用同一个图标时不要传** —— 它不携带任何用于选择的信息,
|
|
68
83
|
* 只会在每行左边留一段空白。只有各条图标不同、且图标在编码类别时才传。
|
|
@@ -124,6 +139,16 @@ const CHIP_IDLE =
|
|
|
124
139
|
'state-layer [--pt-state-layer-border:1px] border-input bg-background text-foreground ' +
|
|
125
140
|
'hover:border-neutral';
|
|
126
141
|
|
|
142
|
+
/* 未上线/不可选的条目:整条降辅助色,**不挂 state-layer、不给 hover** ——
|
|
143
|
+
灰着不给反馈,好过给了反馈却什么都不发生。 */
|
|
144
|
+
const CHIP_DISABLED = 'border-input bg-background text-[rgb(var(--pt-text-tage))]';
|
|
145
|
+
|
|
146
|
+
/* 条目右端的小徽标。扁平 chip,不是库 Badge(理由见 PromptPickerItem.badge 的注释)。
|
|
147
|
+
11px/16 是辅助字号档,比条目正文 13px 低一档,不与之争夺注意力。 */
|
|
148
|
+
const CHIP_BADGE =
|
|
149
|
+
'ml-[8px] shrink-0 whitespace-nowrap rounded-[var(--pt-radius-sm)] bg-muted ' +
|
|
150
|
+
'px-[6px] text-[11px] leading-[16px] text-[rgb(var(--pt-text-tage))]';
|
|
151
|
+
|
|
127
152
|
/* 第二层顶部的分类项 —— 面包屑,不是选中态(见头注释规则 2)。
|
|
128
153
|
持久态底色 = 中性 8%(库规范:选中/激活用 --pt-bg-selected,不用彩色);
|
|
129
154
|
它自己不可点,所以不挂 state-layer。 */
|
|
@@ -221,18 +246,40 @@ const PromptPicker = React.forwardRef<HTMLDivElement, PromptPickerProps>(
|
|
|
221
246
|
{lead}
|
|
222
247
|
</p>
|
|
223
248
|
)}
|
|
224
|
-
{visibleItems.map(item =>
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
249
|
+
{visibleItems.map(item =>
|
|
250
|
+
item.disabled ? (
|
|
251
|
+
/* 不可选:用 div + aria-disabled,不是 <button disabled> ——
|
|
252
|
+
后者仍会被读屏念成「命令,已禁用」且占 Tab 序。
|
|
253
|
+
有 badge 时 label 撑开、badge 贴右;无 badge 时不加 flex-1,
|
|
254
|
+
胶囊仍按内容收窄(不撑满)。 */
|
|
255
|
+
<div
|
|
256
|
+
key={item.id}
|
|
257
|
+
aria-disabled="true"
|
|
258
|
+
title={item.hint ?? item.label}
|
|
259
|
+
className={cn(CHIP_BASE, CHIP_DISABLED)}
|
|
260
|
+
>
|
|
261
|
+
{item.icon}
|
|
262
|
+
<span className={cn('min-w-0 truncate', item.badge && 'flex-1')}>
|
|
263
|
+
{item.label}
|
|
264
|
+
</span>
|
|
265
|
+
{item.badge && <span className={CHIP_BADGE}>{item.badge}</span>}
|
|
266
|
+
</div>
|
|
267
|
+
) : (
|
|
268
|
+
<button
|
|
269
|
+
key={item.id}
|
|
270
|
+
type="button"
|
|
271
|
+
title={item.hint ?? item.label}
|
|
272
|
+
onClick={() => handleChipClick(item)}
|
|
273
|
+
className={cn(CHIP_BASE, CHIP_IDLE)}
|
|
274
|
+
>
|
|
275
|
+
{item.icon}
|
|
276
|
+
<span className={cn('min-w-0 truncate', item.badge && 'flex-1')}>
|
|
277
|
+
{item.label}
|
|
278
|
+
</span>
|
|
279
|
+
{item.badge && <span className={CHIP_BADGE}>{item.badge}</span>}
|
|
280
|
+
</button>
|
|
281
|
+
)
|
|
282
|
+
)}
|
|
236
283
|
</div>
|
|
237
284
|
</div>
|
|
238
285
|
);
|