diff --git a/design-system/apps/design-lab/src/i18n/componentMetadata.ts b/design-system/apps/design-lab/src/i18n/componentMetadata.ts index f5145ec5fd..7e771f2c1b 100644 --- a/design-system/apps/design-lab/src/i18n/componentMetadata.ts +++ b/design-system/apps/design-lab/src/i18n/componentMetadata.ts @@ -75,6 +75,7 @@ const descriptionKeys: Readonly> = { ProminentToolCard: "component.ProminentToolCard.description", ReadFileToolCard: "component.ReadFileToolCard.description", ReviewSummaryToolCard: "component.ReviewSummaryToolCard.description", + RollingText: "component.RollingText.description", RunCodeToolCard: "component.RunCodeToolCard.description", SearchField: "component.SearchField.description", SegmentedControl: "component.SegmentedControl.description", diff --git a/design-system/apps/design-lab/src/i18n/messages.ts b/design-system/apps/design-lab/src/i18n/messages.ts index 53aae20b83..e8a7318e65 100644 --- a/design-system/apps/design-lab/src/i18n/messages.ts +++ b/design-system/apps/design-lab/src/i18n/messages.ts @@ -129,6 +129,10 @@ export const enUSMessages = { "component.Spinner.description": "A compact activity indicator with matrix and bar presentations.", "component.Switch.description": "Toggles a single setting between on and off with native checkbox semantics.", "component.TabGroup.description": "A compact single-selection tab list with optional leading icons, end actions, and automatic keyboard activation.", + "component.RollingText.description": "Vertical text replacement with coordinated width, interruption handling, and reduced-motion support. Try repeated clicks in the replacement specimen.", + "components.preview.replaceText": "Replace title", + "components.preview.rollingTextLong": "Review workspace navigation and session switching", + "detail.option.replacing": "Replacement", "component.TerminalControlToolCard.description": "An ambient trace for interrupting or terminating a terminal session.", "component.TodoToolCard.description": "An ambient task-progress card with compact and expandable list presentations.", "component.Toolbar.description": "A responsive bar with independent leading, centered, trailing, and horizontally scrollable composition regions.", @@ -865,6 +869,10 @@ export const zhCNMessages = { "component.Spinner.description": "提供点阵与条形样式的紧凑活动指示器。", "component.Switch.description": "通过原生复选框语义在开启与关闭之间切换单项设置。", "component.TabGroup.description": "紧凑的单选标签组,支持前置图标、尾部操作与方向键自动切换。", + "component.RollingText.description": "垂直滚动替换文本,宽度同步过渡,支持连续切换与减少动态效果。可在替换示例中连续点击体验。", + "components.preview.replaceText": "替换标题", + "components.preview.rollingTextLong": "检查工作区导航与会话切换时的交互行为", + "detail.option.replacing": "替换", "component.TerminalControlToolCard.description": "低关注终端控制轨迹,用于呈现中断或终止终端会话的结果。", "component.TodoToolCard.description": "低关注任务进度卡片,支持紧凑摘要与可展开列表两种呈现。", "component.Toolbar.description": "具备独立前置、居中、尾部与横向滚动区域的响应式工具栏。", @@ -1635,6 +1643,10 @@ export const zhTWMessages = { "component.Spinner.description": "提供點陣與條形樣式的緊湊活動指示器。", "component.Switch.description": "以原生核取方塊語意在開啟與關閉之間切換單一設定。", "component.TabGroup.description": "緊湊的單選標籤群組,支援前置圖示、尾端操作與方向鍵自動切換。", + "component.RollingText.description": "垂直捲動替換文字,寬度同步過渡,支援連續切換與減少動態效果。可在替換範例中連續點擊體驗。", + "components.preview.replaceText": "替換標題", + "components.preview.rollingTextLong": "檢查工作區導覽與工作階段切換時的互動行為", + "detail.option.replacing": "替換", "component.TerminalControlToolCard.description": "低關注終端控制軌跡,用於呈現中斷或終止終端工作階段的結果。", "component.TodoToolCard.description": "低關注任務進度卡片,支援緊湊摘要與可展開列表兩種呈現。", "component.Toolbar.description": "具備獨立前置、置中、尾端與橫向捲動區域的響應式工具列。", diff --git a/design-system/apps/design-lab/src/pages/ComponentDetailPage.tsx b/design-system/apps/design-lab/src/pages/ComponentDetailPage.tsx index a691451490..d26957c5d5 100644 --- a/design-system/apps/design-lab/src/pages/ComponentDetailPage.tsx +++ b/design-system/apps/design-lab/src/pages/ComponentDetailPage.tsx @@ -121,6 +121,7 @@ import { import type { ComponentMeta } from "@openbitfun/ui/registry"; import previewImage from "../assets/design-system-hero.webp"; import { IconCompositionPreview } from "../preview/IconCompositionPreview"; +import { RollingTextPreview } from "../preview/RollingTextPreview"; import { NestedMenuPattern } from "./ReferencePatterns"; import { useI18n, type MessageKey } from "../i18n"; import { @@ -174,6 +175,7 @@ const optionLabelKeys: Readonly> = { chevron: "detail.option.chevron", center: "detail.option.center", default: "detail.option.default", + replacing: "detail.option.replacing", disabled: "detail.option.disabled", display: "detail.option.display", error: "detail.option.error", @@ -437,6 +439,9 @@ export function ComponentDetailPage({ : states; const codeSample = useMemo(() => { + if (component.name === "RollingText") { + return 'import { RollingText, TabGroup } from "@openbitfun/ui";\n\n// Keep the identity stable for title edits; change it when replacing the resource.\n{record.title}\n\n// TabGroup owns the text slot and composes RollingText without nested clipping.\n\n'; + } if (component.name === "MobileActionSheet") return `import { MobileActionSheet } from "@openbitfun/ui/mobile";\n\n setOpen(false)}\n open={open}\n title="${t("components.preview.session")}"\n/>`; if (component.name === "MobileComposer") return `import { MobileComposer } from "@openbitfun/ui/mobile";\n\n}\n startActions={}\n endActions={}\n>\n