dsh-better-workspace 0.24.0 → 0.25.0
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/README.md +1 -1
- package/README_EN.md +1 -1
- package/dsh.plugin.json +1 -1
- package/package.json +1 -1
- package/src/client.js +162 -62
package/README.md
CHANGED
|
@@ -71,7 +71,7 @@
|
|
|
71
71
|
- **文件夹式收起**:点工作区行 = 收起/展开该工作区的全部会话(收起后行上保留会话数角标);会话分组同样可收起;搜索时自动全部展开。
|
|
72
72
|
- **拖拽还原原版能力**:工作区行可拖拽——拖到另一工作区行上/下半即调整顺序(写回宿主 registry 序),拖到分组行则移动进该分组(改写名称前缀);会话行可拖拽——同组内拖到另一会话上/下即调整顺序,拖到**别组的会话行**会把名字前缀改写到那个组(拖到根层的行 = 移出分组),拖到会话子分组行即移动进该分组,拖到**自己的工作区行**或**树里任何组外的地方**(含空白区域)同样移出分组 —— 拖拽期间工作区行整行高亮、树底部有一条淡虚线提示这个出口;带分组前缀的会话行右键还多一项「移出分组」。显示顺序 = 宿主手动序,拖拽结果立即生效。**磁盘层是文件系统事实,不随拖拽改变**:跨磁盘层的放置只重组名称分组(工作区落回自身磁盘层的末尾),同层放置才走锚点序。拖拽工作区期间,单链合并显示的行(如 工作/A)临时展开回文件夹树——路径里的每一级都是可投放的分组行,松手后自动合并回去。
|
|
73
73
|
- **不丢原生能力**:会话行(打开/重命名/分叉/归档)、每工作区「新会话」(点 + 总是先展开该工作区,让新会话立刻可见)、当前会话高亮、官方状态灯(蓝色运行环 / 琥珀待交互 / 绿色完成提醒)、**状态呼吸灯**(折叠藏起的状态灯向外冒泡:工作区/分组行图标按状态色呼吸发光——琥珀待交互/绿完成,自定义过发光的标题一起呼吸;运行中只在会话行本层蓝色呼吸,不外渗;可在设置关闭)、**活跃定时任务角标**(有活动 Schedule 的会话显示闹钟图标;v0.23.0 起直接渲染官方 `sidebar.session.row.leading` 座位的占用者,与官方行同源)、未分组会话兜底、界面文案跟随 DSH 的语言设置(内置 21 种语言,含简繁中文)。
|
|
74
|
-
- **新增项自动配色 + 图标(v0.
|
|
74
|
+
- **新增项自动配色 + 图标(v0.25.0,默认关闭)**:设置卡里一个开关,打开后**新创建的会话**自动分到一个内置色、**新工作区**再额外分到一个图标,懒得逐个设置的人直接开箱即用。颜色来自**定死的 13 个槽位**,每个槽位配**两色**——浅色主题用深色系、深色主题用亮色系——按「洗牌袋 + 近期回避窗口」抽取:一轮之内绝不重复,跨轮也不会立刻撞上刚出过的 3 个,连续新建几项肉眼可辨。**可读性是真达标**:每个色在**对应主题**背景下的对比度都 **≥4.5**,即 WCAG **正文级 AA**(对比度是脚本真算的,测试逐色断言;浅色主题按比纯白更暗的悬停面、深色主题按最亮的面这种保守取值)。行里存的是**槽位 id(`auto:3`)而不是色值**,所以**切换深浅主题时颜色自动换成同色系的另一套**,既不用重新设置,也不会失配。**只影响打开开关之后新建的项**:你手动设置过外观的行(存的是 hex)永不被覆盖,关闭开关也不回收已分配的样式,同一项不会被二次随机。图标从既有图标候选集里取、按宿主实际导出过滤;**图标只给工作区**——会话行的那个位置是官方状态灯与日程角标,没有图标位。
|
|
75
75
|
- **官方新语义与快捷键都接上(v0.23.0,对齐 dsh 0.1.7-rc.2)**:① 归档筛选是官方新版三态直选(**隐藏已归档** / **全部对话(显示已归档)** / **仅显示已归档**);选「仅显示已归档」时**没有归档会话的工作区整行隐藏**,空列表显示「暂无已归档会话」+「查看其他会话」一键回退;② 官方快捷键 **⌥⌘K 搜索 / ⌥⌘O 添加工作区 / ⌥⌘N 新会话**(桌面端为 ⌘K / ⌘O / ⌘N)在本插件的自绘侧栏里**真的生效**——搜索键打开并聚焦本插件的搜索框、添加键走同一个官方目录流(原生宿主弹系统选择器,browse 宿主弹应用内入口提示),按钮文案还会带上宿主当前的键位;③ 首次使用的工作区显示为本地化的「默认工作区」,不再露出磁盘目录名。
|
|
76
76
|
- **URL/斜杠标题不拆层**:宿主自动生成的会话标题落地时若含 `/`(如复述了 URL),整串自动包上 `“”` 原样显示,绝不解析成层级——只对本次启动后**新建的会话**生效,并等命名稳定(约 20 秒,让原生 AI 命名先落地)才处理;存量会话与你手动命名的 `/` 分组标题永不被改动。引号内(含手动添加)的 `/` 永不切分,孤立引号只当普通字符;无引号但含 URL 的旧标题也有平铺兜底。
|
|
77
77
|
- **新会话页的工作区选择器 = 侧栏那棵树(v0.22.0)**:会话空态页「工作区」按钮的弹层原本是官方的一层平铺标题列表(连磁盘目录嵌套都没有);本插件接管该座位后,弹层绘制与侧栏**同一棵**树——磁盘目录嵌套、「/」名称分组三态、单链合并全部读同一个视图 store,所以侧栏的视图选项一改,**这边立刻跟着变**;当前工作区带勾选标记,分组行可开合(选择器内本地记忆,默认全展开),标题按侧栏的层级叶子显示。底部「添加工作区」仍由**官方目录拾取占用者**承载(原生选择器 / 官方应用内浏览器),不是仿制品。
|
package/README_EN.md
CHANGED
|
@@ -71,7 +71,7 @@ Session titles nest on `/` too (e.g. `test1/plugin maintenance`). Session groups
|
|
|
71
71
|
- **Folder-style collapse**: clicking a workspace row collapses/expands all of its sessions (the row keeps a session counter when collapsed); session groups collapse too; search force-expands everything.
|
|
72
72
|
- **Native drag restored**: drag a workspace row above/below another to reorder (writes back the host registry order) or onto a folder row to move it into that group (rewrites the title prefix); drag session rows to reorder inside their group, onto a row of ANOTHER group to move into that group (onto a root-level row to leave the group), onto a session-group row to move into it, or onto their OWN workspace row / anywhere outside a group (empty space included) to leave it — the workspace row highlights and the tree shows a faint dashed hint while such a drag is in flight; a grouped session row also offers "Move out of group" in its context menu. Display order = host manual order, drag results are visible immediately. **The disk layer is a filesystem fact and never changes through dragging**: a cross-level drop only re-groups the name prefix (the workspace lands at the end of its own disk level), same-level drops take the anchor order. While dragging a workspace, merged single-chain rows (e.g. work/A) temporarily re-expand into folder rows — every level of the path becomes a drop target, and chains merge back when the drag ends.
|
|
73
73
|
- **Native capabilities kept**: open/rename/fork/archive sessions, per-workspace new-session (the + button always expands the workspace first so the new session is immediately visible), current-session highlight, official status dots (blue running ring / amber pending / green done), **status breathing lights** (dots hidden by collapse bubble outward: workspace/folder rows breathe on their icon in the status color — amber pending / green done, custom-glow labels breathe along; running breathes blue only on the session row itself and never relays; off-able in settings), **active-schedule badge** (alarm clock icon for sessions with active Schedule records; since v0.23.0 it renders the occupant of the shipped `sidebar.session.row.leading` seat, so it is the same mark the official row would show), ungrouped-session fallback, UI copy in 21 languages following the DSH language preference (Simplified and Traditional Chinese included).
|
|
74
|
-
- **Auto color + icon for new items (v0.
|
|
74
|
+
- **Auto color + icon for new items (v0.25.0, off by default)**: one switch in the plugin settings card. Turn it on and every newly created session gets a built-in color while every new workspace additionally gets an icon — for anyone who would rather not style rows one by one. Colors come from **13 fixed slots**, each shipping **two colors** — a darker one for the light theme, a lighter one for the dark theme — drawn with a shuffle bag plus a recent-draw window: nothing repeats inside a cycle, a refill never starts with the last three colors, and items added in a row look clearly different. **The readability claim is real**: every entry keeps contrast **≥ 4.5** on its own theme's background, i.e. WCAG **normal-text AA** (computed by script and asserted per color in the test suite, measured against conservative surfaces: a hovered row darker than pure white in the light theme, the brightest surface in the dark theme). A row stores the **slot id (`auto:3`), not a hex**, so **switching between light and dark repaints it with the matching sibling color** — nothing to reconfigure and no mismatch. **Only items created after you turn it on are touched**: rows you styled by hand (stored as hex) are never overwritten, turning it off does not undo assignments, and an item is never randomized twice. Icons come from the existing icon candidate set, filtered by what the host actually exports — and **workspaces only**: the session row's cell belongs to the official status dot and schedule mark, so it has no icon slot.
|
|
75
75
|
- **Official semantics and shortcuts wired up (v0.23.0, aligned with dsh 0.1.7-rc.2)**: ① the archived filter is the shipped three-way pick (**Hide archived** / **All conversations (show archived)** / **Archived only**); under "Archived only" a workspace without archived sessions disappears entirely, and an empty list offers "No archived sessions yet" + **View other sessions** as the way back. ② The shipped shortcuts **⌥⌘K search / ⌥⌘O add workspace / ⌥⌘N new session** (⌘K / ⌘O / ⌘N on desktop) really work in this plugin's own sidebar — the search key opens and focuses this sidebar's filter field, the add key runs the very same official directory flow (native chooser on a native host, the in-app pointer on a browse host), and the buttons show the host's current keybindings. ③ A first-use workspace reads as the localized "Default workspace" instead of the on-disk directory name.
|
|
76
76
|
- **Slash-bearing titles never nest from URLs**: when a host-generated session title lands containing `/` (e.g. echoing a pasted URL), it is auto-wrapped in `“”` and shown verbatim — only for sessions **created after this launch**, and only once the name stays stable for ~20s (letting the native AI naming land first); pre-existing sessions and your manually named `/` groupings are never touched. Quotes (manual ones too) never split on `/`, and a lone quote is just an ordinary character; unquoted URL tails still fall back flat.
|
|
77
77
|
- **The New Session workspace picker IS the sidebar tree (v0.22.0)**: the empty-state "Workspace" chip used to open the shipped one-level list of flat titles (no disk nesting at all). This plugin shadows that seat (lowest priority renders) and draws the **same** tree the sidebar draws — disk nesting, the tri-state "/" name layer, chain compression — all from the one view store, so changing a view option on the sidebar moves this popover immediately. The current workspace carries a check, folder rows fold (picker-local, fully expanded by default), and the pinned "Add workspace" action still renders the **shipped directory-picking occupant** (native chooser / official in-app browser) instead of a copy.
|
package/dsh.plugin.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"id": "dsh-external/dsh-better-workspace",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.25.0",
|
|
4
4
|
"main": "./src/index.js",
|
|
5
5
|
"description": "侧边栏工作区树:按官方磁盘目录嵌套(官方 workspace-tree 语义),可选按名称中的 / 分组(默认关闭,设置里开启);新会话页的工作区选择器同树。Workspace tree for the DSH sidebar workspace list, nested by official disk folders with optional \"/\"-name grouping; the New Session workspace picker shows the same tree.",
|
|
6
6
|
"engines": {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-better-workspace",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.25.0",
|
|
4
4
|
"description": "侧边栏工作区树:按官方磁盘目录嵌套(官方 workspace-tree 语义),可选按名称中的 / 分组(默认关闭,设置里开启);新会话页的工作区选择器同树(同一份视图选项即时同步);添加工作区走官方目录流。Workspace tree for the DSH sidebar: disk-path nesting (official workspace-tree semantics), with optional \"/\"-name grouping (off by default), and the same tree in the New Session workspace picker; add-workspace rides the official directory flow.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"repository": {
|
package/src/client.js
CHANGED
|
@@ -100,7 +100,7 @@ window.__ModuleLoader__.load({
|
|
|
100
100
|
'settings.rowActions': "会话行悬停按钮",
|
|
101
101
|
'settings.rowActions.hint': "悬停会话行时在行尾显示置顶 / 归档快捷按钮,与官方行保持一致;关闭后这些动作只保留在菜单里。默认开启。",
|
|
102
102
|
'settings.autoStyle': '新增项自动配色',
|
|
103
|
-
'settings.autoStyle.hint': '开启后,新创建的会话会自动分到一个内置色,新工作区还会分到一个图标;颜色从固定的 13
|
|
103
|
+
'settings.autoStyle.hint': '开启后,新创建的会话会自动分到一个内置色,新工作区还会分到一个图标;颜色从固定的 13 个槽位按「洗牌 + 近期去重」抽取,连续新增不会撞色。每个槽位配了两色 —— 浅色主题用深色系、深色主题用亮色系 —— 每个色在**对应主题**背景下的对比度都 ≥4.5,达到 WCAG 正文级 AA;切换主题时同一个槽位会自动换成另一套色,不需要重新设置。只影响开启之后新建的项;你手动设置过外观的行永不被覆盖,关闭开关也不回收已分配的样式。默认关闭。',
|
|
104
104
|
'settings.appearance': '默认外观',
|
|
105
105
|
'settings.appearance.hint': '没有单独自定义过的行使用这套外观;字体描边默认开启——背景画面下不描边文字常常看不清。字体颜色留空即跟随主题。',
|
|
106
106
|
'settings.appearance.reset': '恢复默认外观',
|
|
@@ -250,7 +250,7 @@ window.__ModuleLoader__.load({
|
|
|
250
250
|
'settings.rowActions': "Session row hover buttons",
|
|
251
251
|
'settings.rowActions.hint': "Show pin / archive quick buttons at the end of a hovered session row, matching the official rows. Off: these actions stay in the menu only. On by default.",
|
|
252
252
|
'settings.autoStyle': 'Auto color & icon for new items',
|
|
253
|
-
'settings.autoStyle.hint':
|
|
253
|
+
'settings.autoStyle.hint': "When on, every newly created session gets a built-in color and every new workspace also gets an icon. Colors come from 13 fixed slots drawn with shuffle + recent-dedup, so consecutive items never look alike. Every slot ships two colors — a darker one for the light theme, a lighter one for the dark theme — and each clears WCAG normal-text AA (contrast ≥4.5) on its own theme's background; switching themes repaints the same slot automatically, with nothing to redo. Only items created after you turn it on are touched; rows you styled by hand are never overwritten, and turning it off does not undo what was already assigned. Off by default.",
|
|
254
254
|
'settings.appearance': 'Default appearance',
|
|
255
255
|
'settings.appearance.hint': 'Rows that were never customized use this appearance; the outline is on by default — text without it is often unreadable over a background image. Leave the color empty to follow the theme.',
|
|
256
256
|
'settings.appearance.reset': 'Reset to default',
|
|
@@ -408,7 +408,7 @@ window.__ModuleLoader__.load({
|
|
|
408
408
|
'settings.rowActions': "أزرار تمرير سطر الجلسة",
|
|
409
409
|
'settings.rowActions.hint': "إظهار أزرار التثبيت / الأرشفة السريعة في نهاية سطر الجلسة عند تمرير المؤشر، مطابقة للأسطر الرسمية. عند الإيقاف: تبقى هذه الإجراءات في القائمة فقط. مفعّل افتراضياً.",
|
|
410
410
|
'settings.autoStyle': 'ألوان وأيقونات تلقائية للعناصر الجديدة',
|
|
411
|
-
'settings.autoStyle.hint': 'عند التفعيل يحصل كل جلسة جديدة على لون من لوحة مدمجة، ويحصل كل مساحة عمل جديدة أيضًا على أيقونة. تُسحب الألوان من 13
|
|
411
|
+
'settings.autoStyle.hint': 'عند التفعيل يحصل كل جلسة جديدة على لون من لوحة مدمجة، ويحصل كل مساحة عمل جديدة أيضًا على أيقونة. تُسحب الألوان من 13 خانة ثابتة بترتيب عشوائي مع تجنّب التكرار القريب. لكل خانة لونان — أغمق للسمة الفاتحة وأفتح للسمة الداكنة — وكل لون يبلغ تباين ≥4.5 (معيار AA للنص العادي) على خلفية سمته؛ وعند تبديل السمة تُرسم الخانة نفسها تلقائيًا دون أي إعداد. يؤثر فقط على العناصر المنشأة بعد التفعيل، ولا يُستبدل أي سطر نسّقته يدويًا، والإيقاف لا يلغي ما تم تعيينه. معطّل افتراضيًا.',
|
|
412
412
|
'settings.appearance': 'المظهر الافتراضي',
|
|
413
413
|
'settings.appearance.hint': 'تستخدم الأسطر غير المخصصة هذا المظهر؛ حدّ النص مفعّل افتراضياً — فبدونه يصعب قراءة النص فوق صورة خلفية. اترك اللون فارغاً لاتباع السمة.',
|
|
414
414
|
'settings.appearance.reset': 'استعادة المظهر الافتراضي',
|
|
@@ -558,7 +558,7 @@ window.__ModuleLoader__.load({
|
|
|
558
558
|
'settings.rowActions': "Sitzungszeilen-Schnellknöpfe",
|
|
559
559
|
'settings.rowActions.hint': "Zeigt beim Daraufzeigen Schnellknöpfe zum Anheften / Archivieren am Zeilenende – wie die offiziellen Zeilen. Aus: diese Aktionen bleiben nur im Menü. Standardmäßig ein.",
|
|
560
560
|
'settings.autoStyle': 'Automatische Farbe & Symbol für neue Einträge',
|
|
561
|
-
'settings.autoStyle.hint': 'Wenn aktiviert, erhält jede neu erstellte Sitzung eine Farbe aus einer festen Palette und jeder neue Arbeitsbereich zusätzlich ein Symbol. Die 13
|
|
561
|
+
'settings.autoStyle.hint': 'Wenn aktiviert, erhält jede neu erstellte Sitzung eine Farbe aus einer festen Palette und jeder neue Arbeitsbereich zusätzlich ein Symbol. Die 13 festen Plätze werden gemischt mit Vermeidung der letzten Treffer gezogen. Jeder Platz hat zwei Farben — dunkler für das helle Thema, heller für das dunkle — und jede erreicht auf dem Hintergrund ihres eigenen Themas Kontrast ≥4.5 (AA für Fließtext); beim Themewechsel wird derselbe Platz automatisch neu eingefärbt. Nur danach erstellte Einträge werden erfasst; manuell gestaltete Zeilen werden nie überschrieben, und Ausschalten macht Zuweisungen nicht rückgängig. Standardmäßig aus.',
|
|
562
562
|
'settings.appearance': 'Standardaussehen',
|
|
563
563
|
'settings.appearance.hint': 'Zeilen ohne eigene Anpassung nutzen dieses Aussehen; die Textkontur ist standardmäßig an – ohne sie ist Text über einem Hintergrundbild oft kaum lesbar. Bleibt die Farbe leer, folgt sie dem Thema.',
|
|
564
564
|
'settings.appearance.reset': 'Standard wiederherstellen',
|
|
@@ -708,7 +708,7 @@ window.__ModuleLoader__.load({
|
|
|
708
708
|
'settings.rowActions': "Boutons de survol des sessions",
|
|
709
709
|
'settings.rowActions.hint': "Affiche des boutons rapides d’épinglage / d’archivage en fin de ligne au survol, comme les lignes officielles. Désactivé : ces actions restent dans le menu uniquement. Activé par défaut.",
|
|
710
710
|
'settings.autoStyle': 'Couleur et icône automatiques pour les nouveaux éléments',
|
|
711
|
-
'settings.autoStyle.hint': 'Activé, chaque nouvelle session reçoit une couleur de la palette intégrée et chaque nouvel espace de travail aussi une icône. Les 13
|
|
711
|
+
'settings.autoStyle.hint': 'Activé, chaque nouvelle session reçoit une couleur de la palette intégrée et chaque nouvel espace de travail aussi une icône. Les 13 emplacements fixes sont tirés par mélange avec évitement des derniers tirages. Chaque emplacement a deux couleurs — plus sombre pour le thème clair, plus claire pour le thème sombre — et chacune atteint un contraste ≥4,5 (AA pour le texte courant) sur le fond de son propre thème ; changer de thème recolore le même emplacement automatiquement. Seuls les éléments créés après l’activation sont traités ; les lignes personnalisées à la main ne sont jamais écrasées et désactiver n’annule pas les attributions. Désactivé par défaut.',
|
|
712
712
|
'settings.appearance': 'Apparence par défaut',
|
|
713
713
|
'settings.appearance.hint': 'Les lignes sans personnalisation utilisent cette apparence; le contour du texte est activé par défaut — sans lui, le texte reste souvent illisible sur une image de fond. Laissez la couleur vide pour suivre le thème.',
|
|
714
714
|
'settings.appearance.reset': 'Rétablir l\'apparence par défaut',
|
|
@@ -858,7 +858,7 @@ window.__ModuleLoader__.load({
|
|
|
858
858
|
'settings.rowActions': "सेशन पंक्ति होवर बटन",
|
|
859
859
|
'settings.rowActions.hint': "होवर करने पर सेशन पंक्ति के अंत में पिन / आर्काइव क्विक बटन दिखाता है, आधिकारिक पंक्तियों जैसा। बंद: ये क्रियाएँ केवल मेनू में रहती हैं। डिफ़ॉल्ट रूप से चालू।",
|
|
860
860
|
'settings.autoStyle': 'नए आइटम के लिए स्वचालित रंग और आइकन',
|
|
861
|
-
'settings.autoStyle.hint': 'चालू होने पर हर नए सत्र को अंतर्निहित पैलेट से एक रंग मिलता है और हर नए कार्यस्थान को एक आइकन भी। 13
|
|
861
|
+
'settings.autoStyle.hint': 'चालू होने पर हर नए सत्र को अंतर्निहित पैलेट से एक रंग मिलता है और हर नए कार्यस्थान को एक आइकन भी। 13 स्थिर स्लॉट शफ़ल और हाल के दोहराव से बचाकर निकाले जाते हैं। हर स्लॉट में दो रंग हैं — हल्की थीम के लिए गहरा और गहरी थीम के लिए हल्का — और हर रंग अपनी थीम की पृष्ठभूमि पर ≥4.5 कंट्रास्ट (सामान्य पाठ के लिए AA) रखता है; थीम बदलने पर वही स्लॉट अपने आप रंग बदल लेता है। केवल चालू करने के बाद बने आइटम प्रभावित होते हैं; हाथ से सजाई गई पंक्तियाँ कभी नहीं बदली जातीं और बंद करने पर पहले दिए रंग हटते नहीं। डिफ़ॉल्ट रूप से बंद।',
|
|
862
862
|
'settings.appearance': 'डिफ़ॉल्ट रूप',
|
|
863
863
|
'settings.appearance.hint': 'जिन पंक्तियों को अलग से अनुकूलित नहीं किया गया वे यह रूप इस्तेमाल करती हैं; पाठ की रूपरेखा डिफ़ॉल्ट रूप से चालू है — पृष्ठभूमि छवि पर बिना रूपरेखा वाला पाठ अक्सर पढ़ा नहीं जाता। रंग खाली छोड़ने पर वह थीम का अनुसरण करता है।',
|
|
864
864
|
'settings.appearance.reset': 'डिफ़ॉल्ट रूप पर लौटें',
|
|
@@ -1008,7 +1008,7 @@ window.__ModuleLoader__.load({
|
|
|
1008
1008
|
'settings.rowActions': "Tombol hover baris sesi",
|
|
1009
1009
|
'settings.rowActions.hint': "Menampilkan tombol cepat pin / arsip di ujung baris sesi saat dihover, mengikuti baris resmi. Nonaktif: aksi ini hanya ada di menu. Aktif secara bawaan.",
|
|
1010
1010
|
'settings.autoStyle': 'Warna & ikon otomatis untuk item baru',
|
|
1011
|
-
'settings.autoStyle.hint': 'Saat aktif, setiap sesi baru mendapat warna dari palet bawaan dan setiap ruang kerja baru juga mendapat ikon. Tiga belas
|
|
1011
|
+
'settings.autoStyle.hint': 'Saat aktif, setiap sesi baru mendapat warna dari palet bawaan dan setiap ruang kerja baru juga mendapat ikon. Tiga belas slot tetap diambil dengan cara diacak sambil menghindari pengambilan terakhir. Setiap slot punya dua warna — lebih gelap untuk tema terang dan lebih terang untuk tema gelap — dan setiap warna mencapai kontras ≥4,5 (AA untuk teks biasa) pada latar temanya sendiri; mengganti tema otomatis mewarnai ulang slot yang sama. Hanya item yang dibuat setelah diaktifkan yang diproses; baris yang Anda atur sendiri tidak pernah ditimpa, dan menonaktifkannya tidak membatalkan yang sudah diberikan. Nonaktif secara bawaan.',
|
|
1012
1012
|
'settings.appearance': 'Tampilan bawaan',
|
|
1013
1013
|
'settings.appearance.hint': 'Baris yang belum disesuaikan memakai tampilan ini; garis luar teks aktif secara bawaan — tanpa itu teks sering tak terbaca di atas gambar latar. Biarkan warna kosong agar mengikuti tema.',
|
|
1014
1014
|
'settings.appearance.reset': 'Kembalikan tampilan bawaan',
|
|
@@ -1158,7 +1158,7 @@ window.__ModuleLoader__.load({
|
|
|
1158
1158
|
'settings.rowActions': "Pulsanti al passaggio della sessione",
|
|
1159
1159
|
'settings.rowActions.hint': "Mostra pulsanti rapidi di pin / archiviazione in fondo alla riga al passaggio, come le righe ufficiali. Disattivo: queste azioni restano solo nel menu. Attivo per impostazione predefinita.",
|
|
1160
1160
|
'settings.autoStyle': 'Colore e icona automatici per i nuovi elementi',
|
|
1161
|
-
'settings.autoStyle.hint': 'Se attivo, ogni nuova sessione riceve un colore dalla palette integrata e ogni nuovo spazio di lavoro anche un’icona. I 13
|
|
1161
|
+
'settings.autoStyle.hint': 'Se attivo, ogni nuova sessione riceve un colore dalla palette integrata e ogni nuovo spazio di lavoro anche un’icona. I 13 slot fissi vengono estratti con mescolamento ed evitando gli ultimi estratti. Ogni slot ha due colori — più scuro per il tema chiaro, più chiaro per il tema scuro — e ognuno raggiunge un contrasto ≥4,5 (AA per il testo normale) sullo sfondo del proprio tema; cambiando tema lo stesso slot viene ricolorato automaticamente. Sono interessati solo gli elementi creati dopo l’attivazione; le righe personalizzate a mano non vengono mai sovrascritte e disattivare non annulla quanto assegnato. Disattivo per impostazione predefinita.',
|
|
1162
1162
|
'settings.appearance': 'Aspetto predefinito',
|
|
1163
1163
|
'settings.appearance.hint': 'Le righe mai personalizzate usano questo aspetto; il contorno del testo è attivo per impostazione predefinita — senza di esso il testo è spesso illeggibile sopra un\'immagine di sfondo. Lascia il colore vuoto per seguire il tema.',
|
|
1164
1164
|
'settings.appearance.reset': 'Ripristina l\'aspetto predefinito',
|
|
@@ -1308,7 +1308,7 @@ window.__ModuleLoader__.load({
|
|
|
1308
1308
|
'settings.rowActions': "セッション行のホバーボタン",
|
|
1309
1309
|
'settings.rowActions.hint': "セッション行にカーソルを合わせると行末にピン / アーカイブのクイックボタンを表示し、公式の行と揃えます。オフ:これらの操作はメニュー内のみ。既定はオン。",
|
|
1310
1310
|
'settings.autoStyle': '新規項目の色とアイコンを自動割り当て',
|
|
1311
|
-
'settings.autoStyle.hint': 'オンにすると、新しく作られたセッションには内蔵パレットから色が、新しいワークスペースにはさらにアイコンが割り当てられます。13
|
|
1311
|
+
'settings.autoStyle.hint': 'オンにすると、新しく作られたセッションには内蔵パレットから色が、新しいワークスペースにはさらにアイコンが割り当てられます。13 の固定スロットをシャッフルと直近の重複回避で抽選します。各スロットは 2 色(ライトテーマ用の濃い色とダークテーマ用の明るい色)を持ち、どちらも自分のテーマの背景でコントラスト 4.5 以上(本文の AA)を満たします。テーマを切り替えると、同じスロットが自動的に塗り替えられます。オンにした後に作成された項目だけが対象で、手動で設定した行は上書きされず、オフにしても割り当て済みの色は元に戻りません。既定はオフです。',
|
|
1312
1312
|
'settings.appearance': '既定の外観',
|
|
1313
1313
|
'settings.appearance.hint': '個別にカスタマイズしていない行に適用される外観です;文字の縁取りは既定でオンです——背景画像の上では縁取りのない文字が読みにくいためです。色を空にするとテーマに従います。',
|
|
1314
1314
|
'settings.appearance.reset': '既定の外観に戻す',
|
|
@@ -1458,7 +1458,7 @@ window.__ModuleLoader__.load({
|
|
|
1458
1458
|
'settings.rowActions': "세션 행 호버 버튼",
|
|
1459
1459
|
'settings.rowActions.hint': "세션 행에 마우스를 올리면 행 끝에 고정 / 보관 빠른 버튼을 표시하여 공식 행과 일치시킵니다. 끔: 이 작업들은 메뉴에만 남습니다. 기본값은 켬.",
|
|
1460
1460
|
'settings.autoStyle': '새 항목 자동 색상 및 아이콘',
|
|
1461
|
-
'settings.autoStyle.hint': '켜면 새로 만든 세션에 내장 팔레트의 색이, 새 워크스페이스에는 아이콘까지 자동으로 지정됩니다. 13
|
|
1461
|
+
'settings.autoStyle.hint': '켜면 새로 만든 세션에 내장 팔레트의 색이, 새 워크스페이스에는 아이콘까지 자동으로 지정됩니다. 13개의 고정 슬롯을 섞기와 최근 중복 회피로 뽑습니다. 슬롯마다 두 가지 색(밝은 테마용 진한 색, 어두운 테마용 밝은 색)이 있고, 각각 자기 테마 배경에서 대비 4.5 이상(본문 AA)을 만족합니다. 테마를 바꾸면 같은 슬롯이 자동으로 다시 칠해집니다. 켠 뒤에 만든 항목에만 적용되며, 직접 꾸민 행은 절대 덮어쓰지 않고, 끄더라도 이미 지정된 색은 되돌리지 않습니다. 기본값은 꺼짐입니다.',
|
|
1462
1462
|
'settings.appearance': '기본 모양',
|
|
1463
1463
|
'settings.appearance.hint': '따로 지정하지 않은 행에 적용되는 모양입니다; 글자 외곽선은 기본으로 켜져 있습니다——배경 이미지 위에서는 외곽선 없는 글자가 잘 보이지 않기 때문입니다. 색을 비우면 테마를 따릅니다.',
|
|
1464
1464
|
'settings.appearance.reset': '기본 모양으로 되돌리기',
|
|
@@ -1608,7 +1608,7 @@ window.__ModuleLoader__.load({
|
|
|
1608
1608
|
'settings.rowActions': "Sessierij-snelknoppen",
|
|
1609
1609
|
'settings.rowActions.hint': "Toont snelknoppen voor vastmaken / archiveren aan het einde van een aangewezen sessierij, gelijk aan de officiële rijen. Uit: deze acties blijven alleen in het menu. Standaard aan.",
|
|
1610
1610
|
'settings.autoStyle': 'Automatische kleur en pictogram voor nieuwe items',
|
|
1611
|
-
'settings.autoStyle.hint': 'Als dit aanstaat krijgt elke nieuwe sessie een kleur uit het ingebouwde palet en elke nieuwe werkruimte ook een pictogram. De dertien
|
|
1611
|
+
'settings.autoStyle.hint': 'Als dit aanstaat krijgt elke nieuwe sessie een kleur uit het ingebouwde palet en elke nieuwe werkruimte ook een pictogram. De dertien vaste sleuven worden geschud en de laatst gebruikte worden vermeden. Elke sleuf heeft twee kleuren — donkerder voor het lichte thema, lichter voor het donkere — en elk haalt op de achtergrond van zijn eigen thema contrast ≥4,5 (AA voor normale tekst); bij een themawissel wordt dezelfde sleuf automatisch opnieuw gekleurd. Alleen items die daarna worden gemaakt worden aangepast; rijen die u zelf hebt opgemaakt worden nooit overschreven en uitzetten draait eerdere toewijzingen niet terug. Standaard uit.',
|
|
1612
1612
|
'settings.appearance': 'Standaarduiterlijk',
|
|
1613
1613
|
'settings.appearance.hint': 'Regels zonder eigen aanpassing gebruiken dit uiterlijk; de tekstomtrek staat standaard aan — zonder omtrek is tekst op een achtergrondafbeelding vaak slecht leesbaar. Laat de kleur leeg om het thema te volgen.',
|
|
1614
1614
|
'settings.appearance.reset': 'Standaarduiterlijk herstellen',
|
|
@@ -1758,7 +1758,7 @@ window.__ModuleLoader__.load({
|
|
|
1758
1758
|
'settings.rowActions': "Przyciski najechania wiersza sesji",
|
|
1759
1759
|
'settings.rowActions.hint': "Pokazuje szybkie przyciski przypnij / archiwizuj na końcu najechanego wiersza sesji, jak w oficjalnych wierszach. Wyłączone: te akcje zostają tylko w menu. Domyślnie włączone.",
|
|
1760
1760
|
'settings.autoStyle': 'Automatyczny kolor i ikona dla nowych elementów',
|
|
1761
|
-
'settings.autoStyle.hint': 'Po włączeniu każda nowa sesja otrzymuje kolor z wbudowanej palety, a każda nowa przestrzeń robocza także ikonę. Trzynaście
|
|
1761
|
+
'settings.autoStyle.hint': 'Po włączeniu każda nowa sesja otrzymuje kolor z wbudowanej palety, a każda nowa przestrzeń robocza także ikonę. Trzynaście stałych slotów losuje się tasowaniem z unikaniem ostatnich trafień. Każdy slot ma dwa kolory — ciemniejszy dla jasnego motywu, jaśniejszy dla ciemnego — i każdy osiąga na tle swojego motywu kontrast ≥4,5 (AA dla zwykłego tekstu); zmiana motywu automatycznie przemalowuje ten sam slot. Dotyczy tylko elementów utworzonych po włączeniu; ręcznie ostylowane wiersze nigdy nie są nadpisywane, a wyłączenie nie cofa przypisań. Domyślnie wyłączone.',
|
|
1762
1762
|
'settings.appearance': 'Domyślny wygląd',
|
|
1763
1763
|
'settings.appearance.hint': 'Wiersze bez własnych ustawień używają tego wyglądu; obrys tekstu jest domyślnie włączony — bez niego tekst na obrazie tła bywa nieczytelny. Puste pole koloru oznacza podążanie za motywem.',
|
|
1764
1764
|
'settings.appearance.reset': 'Przywróć domyślny wygląd',
|
|
@@ -1908,7 +1908,7 @@ window.__ModuleLoader__.load({
|
|
|
1908
1908
|
'settings.rowActions': "Botões de passagem da sessão",
|
|
1909
1909
|
'settings.rowActions.hint': "Mostra botões rápidos de fixar / arquivar no fim da linha ao passar o cursor, como nas linhas oficiais. Desligado: essas ações ficam apenas no menu. Ligado por predefinição.",
|
|
1910
1910
|
'settings.autoStyle': 'Cor e ícone automáticos para novos itens',
|
|
1911
|
-
'settings.autoStyle.hint': 'Quando ligado, cada nova sessão recebe uma cor da paleta embutida e cada novo espaço de trabalho também um ícone.
|
|
1911
|
+
'settings.autoStyle.hint': 'Quando ligado, cada nova sessão recebe uma cor da paleta embutida e cada novo espaço de trabalho também um ícone. Os 13 slots fixos são sorteados com embaralhamento e evitando as últimas escolhas. Cada slot tem duas cores — mais escura para o tema claro, mais clara para o tema escuro — e cada uma atinge no fundo do seu próprio tema contraste ≥4,5 (AA para texto normal); trocar de tema recolore o mesmo slot automaticamente. Só os itens criados depois de ligar são afetados; linhas que você estilizou à mão nunca são sobrescritas e desligar não desfaz o que já foi atribuído. Desligado por padrão.',
|
|
1912
1912
|
'settings.appearance': 'Aparência padrão',
|
|
1913
1913
|
'settings.appearance.hint': 'Linhas sem personalização usam esta aparência; o contorno do texto vem ativado por padrão — sem ele, o texto costuma ficar ilegível sobre uma imagem de fundo. Deixe a cor vazia para seguir o tema.',
|
|
1914
1914
|
'settings.appearance.reset': 'Restaurar aparência padrão',
|
|
@@ -2058,7 +2058,7 @@ window.__ModuleLoader__.load({
|
|
|
2058
2058
|
'settings.rowActions': "Кнопки наведения строки сессии",
|
|
2059
2059
|
'settings.rowActions.hint': "Показывает быстрые кнопки закрепить / архивировать в конце строки при наведении, как в официальных строках. Выкл: эти действия остаются только в меню. Включено по умолчанию.",
|
|
2060
2060
|
'settings.autoStyle': 'Автоцвет и значок для новых элементов',
|
|
2061
|
-
'settings.autoStyle.hint': 'Когда включено, каждый новый сеанс получает цвет из встроенной палитры, а новая рабочая область — ещё и значок. Тринадцать
|
|
2061
|
+
'settings.autoStyle.hint': 'Когда включено, каждый новый сеанс получает цвет из встроенной палитры, а новая рабочая область — ещё и значок. Тринадцать фиксированных слотов вытягиваются перемешиванием с избеганием недавних. У каждого слота два цвета — темнее для светлой темы, светлее для тёмной, — и каждый даёт на фоне своей темы контраст ≥4,5 (AA для обычного текста); при смене темы тот же слот перекрашивается автоматически. Затрагиваются только элементы, созданные после включения; строки, оформленные вручную, никогда не перезаписываются, а выключение не отменяет уже назначенное. По умолчанию выключено.',
|
|
2062
2062
|
'settings.appearance': 'Оформление по умолчанию',
|
|
2063
2063
|
'settings.appearance.hint': 'Строки без своей настройки используют это оформление; обводка текста включена по умолчанию — без неё текст на фоновом изображении часто нечитаем. Пустой цвет означает следование теме.',
|
|
2064
2064
|
'settings.appearance.reset': 'Вернуть оформление по умолчанию',
|
|
@@ -2208,7 +2208,7 @@ window.__ModuleLoader__.load({
|
|
|
2208
2208
|
'settings.rowActions': "Hovringsknappar för sessionsraden",
|
|
2209
2209
|
'settings.rowActions.hint': "Visar snabbknappar för fäst / arkivera i radens slut vid hovring, som de officiella raderna. Av: åtgärderna finns bara i menyn. På som standard.",
|
|
2210
2210
|
'settings.autoStyle': 'Automatisk färg och ikon för nya objekt',
|
|
2211
|
-
'settings.autoStyle.hint': 'När den är på får varje ny session en färg från den inbyggda paletten och varje ny arbetsyta även en ikon. De tretton
|
|
2211
|
+
'settings.autoStyle.hint': 'När den är på får varje ny session en färg från den inbyggda paletten och varje ny arbetsyta även en ikon. De tretton fasta platserna dras med blandning och undvikande av de senaste. Varje plats har två färger — mörkare för ljust tema, ljusare för mörkt — och båda når mot sin egen temas bakgrund kontrast ≥4,5 (AA för normal text); vid temabyte färgas samma plats om automatiskt. Endast objekt som skapas efter att du slagit på påverkas; rader du stilt själv skrivs aldrig över och att stänga av ångrar inte det som tilldelats. Av som standard.',
|
|
2212
2212
|
'settings.appearance': 'Standardutseende',
|
|
2213
2213
|
'settings.appearance.hint': 'Rader utan egen anpassning använder detta utseende; textkonturen är på som standard — utan den är texten ofta oläslig ovanpå en bakgrundsbild. Lämna färgen tom för att följa temat.',
|
|
2214
2214
|
'settings.appearance.reset': 'Återställ standardutseende',
|
|
@@ -2358,7 +2358,7 @@ window.__ModuleLoader__.load({
|
|
|
2358
2358
|
'settings.rowActions': "ปุ่มเมื่อชี้แถวเซสชัน",
|
|
2359
2359
|
'settings.rowActions.hint': "แสดงปุ่มด่วนปักหมุด / เก็บถาวรท้ายแถวเมื่อชี้ ให้ตรงกับแถวทางการ ปิด: การกระทำเหล่านี้มีเฉพาะในเมนู เปิดตามค่าเริ่มต้น",
|
|
2360
2360
|
'settings.autoStyle': 'สีและไอคอนอัตโนมัติสำหรับรายการใหม่',
|
|
2361
|
-
'settings.autoStyle.hint': 'เมื่อเปิด ทุกเซสชันที่สร้างใหม่จะได้สีจากชุดสีในตัว และพื้นที่ทำงานใหม่จะได้ไอคอนด้วย
|
|
2361
|
+
'settings.autoStyle.hint': 'เมื่อเปิด ทุกเซสชันที่สร้างใหม่จะได้สีจากชุดสีในตัว และพื้นที่ทำงานใหม่จะได้ไอคอนด้วย สล็อตคงที่ 13 ช่องจะถูกสุ่มแบบสลับพร้อมหลีกเลี่ยงสีที่เพิ่งใช้ แต่ละช่องมีสองสี — สีเข้มสำหรับธีมสว่างและสีอ่อนสำหรับธีมมืด — และทุกสีมีคอนทราสต์ ≥4.5 (AA สำหรับข้อความทั่วไป) บนพื้นของธีมนั้น เมื่อสลับธีมช่องเดิมจะถูกระบายสีใหม่ให้อัตโนมัติ มีผลเฉพาะรายการที่สร้างหลังเปิดใช้ แถวที่คุณตั้งค่าเองจะไม่ถูกเขียนทับ และการปิดจะไม่เรียกคืนสิ่งที่แจกไปแล้ว ค่าเริ่มต้นคือปิด',
|
|
2362
2362
|
'settings.appearance': 'รูปลักษณ์เริ่มต้น',
|
|
2363
2363
|
'settings.appearance.hint': 'แถวที่ยังไม่ได้กำหนดเองจะใช้รูปลักษณ์นี้ เส้นขอบตัวอักษรเปิดไว้เป็นค่าเริ่มต้น — บนภาพพื้นหลัง ตัวอักษรที่ไม่มีเส้นขอบมักอ่านยาก เว้นสีว่างไว้เพื่อตามธีม',
|
|
2364
2364
|
'settings.appearance.reset': 'คืนค่ารูปลักษณ์เริ่มต้น',
|
|
@@ -2508,7 +2508,7 @@ window.__ModuleLoader__.load({
|
|
|
2508
2508
|
'settings.rowActions': "Oturum satırı düğmeleri",
|
|
2509
2509
|
'settings.rowActions.hint': "Üzerine gelince satır sonunda sabitle / arşivle hızlı düğmelerini gösterir, resmî satırlarla aynı. Kapalı: bu eylemler yalnızca menüde kalır. Varsayılan açık.",
|
|
2510
2510
|
'settings.autoStyle': 'Yeni öğeler için otomatik renk ve simge',
|
|
2511
|
-
'settings.autoStyle.hint': 'Açıkken yeni oluşturulan her oturuma yerleşik paletten bir renk, her yeni çalışma alanına ayrıca bir simge atanır. On üç
|
|
2511
|
+
'settings.autoStyle.hint': 'Açıkken yeni oluşturulan her oturuma yerleşik paletten bir renk, her yeni çalışma alanına ayrıca bir simge atanır. On üç sabit yuva karıştırma ve son kullanılanları atlama yöntemiyle çekilir. Her yuvanın iki rengi vardır — açık tema için daha koyu, koyu tema için daha açık — ve her biri kendi temasının zemininde ≥4,5 kontrast (normal metin için AA) sağlar; tema değiştiğinde aynı yuva otomatik olarak yeniden renklendirilir. Yalnızca açtıktan sonra oluşturulan öğeler etkilenir; elle biçimlendirdiğiniz satırlar hiçbir zaman üzerine yazılmaz ve kapatmak verilmiş stilleri geri almaz. Varsayılan olarak kapalı.',
|
|
2512
2512
|
'settings.appearance': 'Varsayılan görünüm',
|
|
2513
2513
|
'settings.appearance.hint': 'Özel olarak uyarlanmamış satırlar bu görünümü kullanır; metin konturu varsayılan olarak açıktır — arka plan görseli üzerinde kontursuz metin çoğu zaman okunmaz. Rengi boş bırakırsanız temayı izler.',
|
|
2514
2514
|
'settings.appearance.reset': 'Varsayılan görünüme dön',
|
|
@@ -2658,7 +2658,7 @@ window.__ModuleLoader__.load({
|
|
|
2658
2658
|
'settings.rowActions': "Nút hover dòng phiên",
|
|
2659
2659
|
'settings.rowActions.hint': "Hiện nút nhanh ghim / lưu trữ ở cuối dòng khi di chuột, giống các dòng chính thức. Tắt: các thao tác này chỉ còn trong menu. Bật theo mặc định.",
|
|
2660
2660
|
'settings.autoStyle': 'Tự động tô màu và biểu tượng cho mục mới',
|
|
2661
|
-
'settings.autoStyle.hint': 'Khi bật, mỗi phiên mới nhận một màu từ bảng màu tích hợp và mỗi không gian làm việc mới còn nhận thêm biểu tượng. Mười ba
|
|
2661
|
+
'settings.autoStyle.hint': 'Khi bật, mỗi phiên mới nhận một màu từ bảng màu tích hợp và mỗi không gian làm việc mới còn nhận thêm biểu tượng. Mười ba ô cố định được rút theo cách xáo trộn và tránh các màu vừa dùng. Mỗi ô có hai màu — đậm hơn cho giao diện sáng và nhạt hơn cho giao diện tối — và mỗi màu đạt độ tương phản ≥4,5 (AA cho chữ thường) trên nền của giao diện tương ứng; khi đổi giao diện, chính ô đó được tô lại tự động. Chỉ những mục tạo sau khi bật mới bị ảnh hưởng; hàng bạn tự tô màu không bao giờ bị ghi đè, và tắt đi không thu hồi những gì đã gán. Mặc định tắt.',
|
|
2662
2662
|
'settings.appearance': 'Giao diện mặc định',
|
|
2663
2663
|
'settings.appearance.hint': 'Những hàng chưa tùy chỉnh riêng dùng giao diện này; viền chữ mặc định bật — trên ảnh nền, chữ không viền thường khó đọc. Để trống màu để theo chủ đề.',
|
|
2664
2664
|
'settings.appearance.reset': 'Khôi phục giao diện mặc định',
|
|
@@ -2808,7 +2808,7 @@ window.__ModuleLoader__.load({
|
|
|
2808
2808
|
'settings.rowActions': "會話行懸停按鈕",
|
|
2809
2809
|
'settings.rowActions.hint': "懸停會話行時在行尾顯示置頂 / 封存快捷按鈕,與官方行保持一致;關閉後這些動作只保留在選單裡。預設開啟。",
|
|
2810
2810
|
'settings.autoStyle': '新增項目自動配色',
|
|
2811
|
-
'settings.autoStyle.hint': '
|
|
2811
|
+
'settings.autoStyle.hint': '開啟後,新開嘅會話會自動分到一個內置色,新工作區仲會分到一個圖示;顏色由 13 個固定槽位以「洗牌 + 近期去重」抽出,連續新增唔會撞色。每個槽位有兩隻色 —— 淺色主題用深色系、深色主題用亮色系 —— 兩隻喺各自主題嘅背景上對比度都 ≥4.5,達到 WCAG 正文級 AA;換主題會自動為同一個槽位換色,唔使重新設定。只影響開啟之後新開嘅項;你手動設定過外觀嘅行永不被覆蓋,熄咗開關亦唔會回收已分配嘅樣式。預設關閉。',
|
|
2812
2812
|
'settings.appearance': '預設外觀',
|
|
2813
2813
|
'settings.appearance.hint': '未單獨自訂過嘅行會用呢套外觀;字體描邊預設開啟——有背景圖嗰陣唔描邊嘅字經常睇唔清。字體顏色留空就會跟主題。',
|
|
2814
2814
|
'settings.appearance.reset': '還原預設外觀',
|
|
@@ -2958,7 +2958,7 @@ window.__ModuleLoader__.load({
|
|
|
2958
2958
|
'settings.rowActions': "會話行懸停按鈕",
|
|
2959
2959
|
'settings.rowActions.hint': "懸停會話行時在行尾顯示置頂 / 歸檔快捷按鈕,與官方行保持一致;關閉後這些動作只保留在選單裡。預設開啟。",
|
|
2960
2960
|
'settings.autoStyle': '新增項目自動配色',
|
|
2961
|
-
'settings.autoStyle.hint': '
|
|
2961
|
+
'settings.autoStyle.hint': '開啟後,新開嘅會話會自動分到一個內置色,新工作區仲會分到一個圖示;顏色由 13 個固定槽位以「洗牌 + 近期去重」抽出,連續新增唔會撞色。每個槽位有兩隻色 —— 淺色主題用深色系、深色主題用亮色系 —— 兩隻喺各自主題嘅背景上對比度都 ≥4.5,達到 WCAG 正文級 AA;換主題會自動為同一個槽位換色,唔使重新設定。只影響開啟之後新開嘅項;你手動設定過外觀嘅行永不被覆蓋,熄咗開關亦唔會回收已分配嘅樣式。預設關閉。',
|
|
2962
2962
|
'settings.appearance': '預設外觀',
|
|
2963
2963
|
'settings.appearance.hint': '未單獨自訂過嘅行會用呢套外觀;字體描邊預設開啟——有背景圖嗰陣唔描邊嘅字經常睇唔清。字體顏色留空就會跟主題。',
|
|
2964
2964
|
'settings.appearance.reset': '還原預設外觀',
|
|
@@ -3108,7 +3108,7 @@ window.__ModuleLoader__.load({
|
|
|
3108
3108
|
'settings.rowActions': "會話列懸停按鈕",
|
|
3109
3109
|
'settings.rowActions.hint': "懸停會話列時在列尾顯示釘選 / 封存快捷按鈕,與官方列保持一致;關閉後這些動作只保留在選單裡。預設開啟。",
|
|
3110
3110
|
'settings.autoStyle': '新增項目自動配色與圖示',
|
|
3111
|
-
'settings.autoStyle.hint': '
|
|
3111
|
+
'settings.autoStyle.hint': '開啟後,新建立的工作階段會自動分到一個內建色,新工作區還會分到一個圖示;顏色從 13 個固定槽位以「洗牌 + 近期去重」抽出,連續新增不會撞色。每個槽位各有兩色 —— 淺色主題用深色系、深色主題用亮色系 —— 兩色在各自主題背景下對比度都 ≥4.5,達到 WCAG 正文級 AA;切換主題時同一個槽位會自動換色,不需重新設定。只影響開啟之後新建的項目;你手動設定過外觀的列永遠不會被覆蓋,關閉開關也不會回收已分配的樣式。預設關閉。',
|
|
3112
3112
|
'settings.appearance': '預設外觀',
|
|
3113
3113
|
'settings.appearance.hint': '未個別自訂過的列會使用這套外觀;字型外框預設開啟——在背景圖片上沒有外框的文字常常看不清楚。字型顏色留空即跟隨佈景主題。',
|
|
3114
3114
|
'settings.appearance.reset': '還原預設外觀',
|
|
@@ -4869,6 +4869,70 @@ window.__ModuleLoader__.load({
|
|
|
4869
4869
|
.map(n => Math.max(0, Math.min(255, Math.round(n))).toString(16).padStart(2, '0'))
|
|
4870
4870
|
.join('')
|
|
4871
4871
|
|
|
4872
|
+
/* ---------- auto palette slots + theme resolution (v0.25.0, pure) ---------- */
|
|
4873
|
+
/**
|
|
4874
|
+
* Two palettes, one slot table — the "auto color" of a row is stored as the
|
|
4875
|
+
* SLOT TOKEN (`auto:3`), never as a hex. Rendering resolves it against the
|
|
4876
|
+
* live theme, so a theme flip re-colours every auto-assigned row with no
|
|
4877
|
+
* migration, no rewrite of stored data and no cross-device mismatch (the
|
|
4878
|
+
* host settings copy carries the token, and each device paints its own
|
|
4879
|
+
* theme). Manual colours stay plain hex and are never touched.
|
|
4880
|
+
*
|
|
4881
|
+
* APPEND-ONLY, like ICON_CHOICES / ICON_ALIASES: a stored token must keep
|
|
4882
|
+
* resolving forever, so never reorder or delete a slot (an out-of-range index
|
|
4883
|
+
* clamps to slot 0 rather than rendering nothing).
|
|
4884
|
+
*
|
|
4885
|
+
* Contrast rule: each slot's LIGHT colour clears WCAG **4.5 (normal-text AA)**
|
|
4886
|
+
* against the measured light row surface, and each slot's DARK colour clears
|
|
4887
|
+
* 4.5 against the measured dark row surface. Backgrounds are not guesses —
|
|
4888
|
+
* they were read off a live instance (see CHANGELOG v0.25.0): light
|
|
4889
|
+
* `--dsw-alias-bg-base` #ffffff with a hover/current overlay around #f7f8fa,
|
|
4890
|
+
* dark base #151517 with tokens up to #2c2c2e. The pairs below are computed
|
|
4891
|
+
* against the CONSERVATIVE ends (#ebedf0 light, #2c2c2e dark), which is why
|
|
4892
|
+
* the numbers in the comments sit above 5.0 — on the real surfaces they are
|
|
4893
|
+
* higher still. Change a hex ⇒ re-run the contrast test in tests/smoke.mjs.
|
|
4894
|
+
*/
|
|
4895
|
+
const AUTO_COLOR_SLOTS = [
|
|
4896
|
+
{ name: 'red', light: '#c40d00', dark: '#ff7369' }, // h=4 5.26 / 5.25
|
|
4897
|
+
{ name: 'amber', light: '#965000', dark: '#f08000' }, // h=32 5.20 / 5.17
|
|
4898
|
+
{ name: 'lime', light: '#496e00', dark: '#74ad00' }, // h=80 5.10 / 5.12
|
|
4899
|
+
{ name: 'green', light: '#007330', dark: '#00b54b' }, // h=145 5.12 / 5.12
|
|
4900
|
+
{ name: 'teal', light: '#006e65', dark: '#00b0a1' }, // h=175 5.24 / 5.13
|
|
4901
|
+
{ name: 'cyan', light: '#006a85', dark: '#00abd6' }, // h=192 5.27 / 5.17
|
|
4902
|
+
{ name: 'sky', light: '#0065ad', dark: '#24a4ff' }, // h=205 5.17 / 5.20
|
|
4903
|
+
{ name: 'blue', light: '#0055e8', dark: '#669eff' }, // h=218 5.17 / 5.24
|
|
4904
|
+
{ name: 'indigo', light: '#5938ff', dark: '#a28fff' }, // h=250 5.21 / 5.25
|
|
4905
|
+
{ name: 'violet', light: '#8700fc', dark: '#c480ff' }, // h=272 5.21 / 5.23
|
|
4906
|
+
{ name: 'magenta', light: '#b50097', dark: '#ff59e3' }, // h=310 5.25 / 5.17
|
|
4907
|
+
{ name: 'pink', light: '#c40052', dark: '#ff69a7' }, // h=335 5.16 / 5.20
|
|
4908
|
+
{ name: 'grey', light: '#5e6268', dark: '#9b9ea4' }, // h=220 5.23 / 5.19
|
|
4909
|
+
]
|
|
4910
|
+
/** The values the shuffle bag draws — slot tokens, not colours. */
|
|
4911
|
+
const AUTO_COLOR_TOKENS = AUTO_COLOR_SLOTS.map((slot, index) => 'auto:' + index)
|
|
4912
|
+
const AUTO_TOKEN_RE = /^auto:(\d+)$/
|
|
4913
|
+
const isAutoColorToken = (value) => typeof value === 'string' && AUTO_TOKEN_RE.test(value)
|
|
4914
|
+
/**
|
|
4915
|
+
* Token → hex for one theme. `dark` is explicit so the same function serves
|
|
4916
|
+
* rendering (live flag), tests (both themes) and the pickers (preview).
|
|
4917
|
+
*/
|
|
4918
|
+
const resolveAutoColor = (token, dark) => {
|
|
4919
|
+
const match = AUTO_TOKEN_RE.exec(typeof token === 'string' ? token : '')
|
|
4920
|
+
if (!match) return ''
|
|
4921
|
+
const index = Number(match[1])
|
|
4922
|
+
// Append-only table: an unknown index clamps to slot 0 instead of painting
|
|
4923
|
+
// an invalid CSS colour (a row must never end up colourless by accident).
|
|
4924
|
+
const slot = AUTO_COLOR_SLOTS[index] || AUTO_COLOR_SLOTS[0]
|
|
4925
|
+
if (!slot) return ''
|
|
4926
|
+
return dark === true ? slot.dark : slot.light
|
|
4927
|
+
}
|
|
4928
|
+
/** Any stored colour value → the hex to paint: tokens resolve, hexes pass. */
|
|
4929
|
+
const resolveColorValue = (value, dark) => {
|
|
4930
|
+
if (typeof value !== 'string' || value === '') return ''
|
|
4931
|
+
return isAutoColorToken(value) ? resolveAutoColor(value, dark === undefined ? autoThemeDarkNow() : dark) : value
|
|
4932
|
+
}
|
|
4933
|
+
/* ---------- end of the auto palette slot block ---------- */
|
|
4934
|
+
|
|
4935
|
+
|
|
4872
4936
|
/* ------------------- appearance: defaults + outline ------------------- */
|
|
4873
4937
|
|
|
4874
4938
|
// Text outline. Width and color are DERIVED, never hand-picked: an outline
|
|
@@ -4950,7 +5014,8 @@ window.__ModuleLoader__.load({
|
|
|
4950
5014
|
? appearance.strokeColor
|
|
4951
5015
|
: DEFAULT_APPEARANCE.strokeColor
|
|
4952
5016
|
if (picked === STROKE_AUTO) {
|
|
4953
|
-
const
|
|
5017
|
+
const fontColor = resolveColorValue(appearance.color)
|
|
5018
|
+
const rgb = fontColor ? colorToRgb(fontColor) : null
|
|
4954
5019
|
return rgb ? contrastStrokeColor(rgb) : STROKE_FALLBACK
|
|
4955
5020
|
}
|
|
4956
5021
|
return colorToRgb(picked) ? picked : DEFAULT_APPEARANCE.strokeColor
|
|
@@ -5367,47 +5432,55 @@ window.__ModuleLoader__.load({
|
|
|
5367
5432
|
})
|
|
5368
5433
|
})()
|
|
5369
5434
|
|
|
5370
|
-
/*
|
|
5435
|
+
/* ========= theme-aware auto appearance for NEW items (v0.25.0) ========= */
|
|
5371
5436
|
|
|
5372
5437
|
/**
|
|
5373
|
-
*
|
|
5374
|
-
*
|
|
5375
|
-
* (
|
|
5376
|
-
*
|
|
5377
|
-
*
|
|
5378
|
-
*
|
|
5379
|
-
* Rule: WCAG contrast ≥ 3.0 against #ffffff AND against #1c1c1e — the
|
|
5380
|
-
* graphics / large-text threshold, which is the usable bar in both themes.
|
|
5381
|
-
* Normal-text AA (4.5) is NOT reached by any entry on both backgrounds, and
|
|
5382
|
-
* cannot be: a single fixed hex has to clear both pure white and near black,
|
|
5383
|
-
* and those two demands pull luminance in opposite directions. This pool is
|
|
5384
|
-
* therefore the same tier as the shipped manual swatches (four of them are
|
|
5385
|
-
* in it verbatim, and the five that were weaker than 3.0 on white are
|
|
5386
|
-
* excluded), not an AA-grade text palette. Copy must say ≥3.0, never "AA".
|
|
5438
|
+
* Live light/dark signal. The shipped theme runtime toggles the BOOLEAN
|
|
5439
|
+
* attribute `data-ds-dark-theme` on <body>
|
|
5440
|
+
* (packages/client/ui-theme/src/boot-theme.ts), so that attribute — not a
|
|
5441
|
+
* luminance guess and not `prefers-color-scheme` (the host resolves `system`
|
|
5442
|
+
* itself and may disagree with the OS) — is the authority.
|
|
5387
5443
|
*
|
|
5388
|
-
*
|
|
5389
|
-
*
|
|
5390
|
-
*
|
|
5391
|
-
* #ec6cb9) are represented by their same-hue, one-step-darker siblings
|
|
5392
|
-
* (#46a758 / #d97706 / #0891b2 and the pink/violet neighbours), so the
|
|
5393
|
-
* palette keeps the shipped style while lifting every entry over 3.0 on both
|
|
5394
|
-
* backgrounds. One dozen-plus distinct hues, fixed in code — never generated.
|
|
5444
|
+
* A module-level store lets every row re-render on a flip without threading a
|
|
5445
|
+
* prop through the tree, and it keeps the pure resolvers below testable:
|
|
5446
|
+
* they take the flag as an argument.
|
|
5395
5447
|
*/
|
|
5396
|
-
|
|
5397
|
-
|
|
5398
|
-
|
|
5399
|
-
|
|
5400
|
-
'
|
|
5401
|
-
|
|
5402
|
-
|
|
5403
|
-
|
|
5404
|
-
|
|
5405
|
-
|
|
5406
|
-
|
|
5407
|
-
|
|
5408
|
-
|
|
5409
|
-
|
|
5410
|
-
|
|
5448
|
+
let autoThemeDark = false
|
|
5449
|
+
const autoThemeListeners = new Set()
|
|
5450
|
+
let autoThemeObserver = null
|
|
5451
|
+
const readThemeDark = () => {
|
|
5452
|
+
try { return document.body.hasAttribute('data-ds-dark-theme') === true } catch (error) { return false }
|
|
5453
|
+
}
|
|
5454
|
+
// getSnapshot must stay cheap and stable: a boolean read per render.
|
|
5455
|
+
const autoThemeDarkNow = () => {
|
|
5456
|
+
const next = readThemeDark()
|
|
5457
|
+
if (next !== autoThemeDark) autoThemeDark = next
|
|
5458
|
+
return autoThemeDark
|
|
5459
|
+
}
|
|
5460
|
+
const subscribeAutoTheme = (listener) => {
|
|
5461
|
+
autoThemeListeners.add(listener)
|
|
5462
|
+
if (autoThemeObserver === null) {
|
|
5463
|
+
autoThemeDarkNow()
|
|
5464
|
+
try {
|
|
5465
|
+
autoThemeObserver = new MutationObserver(() => {
|
|
5466
|
+
const next = readThemeDark()
|
|
5467
|
+
if (next === autoThemeDark) return
|
|
5468
|
+
autoThemeDark = next
|
|
5469
|
+
for (const fn of [...autoThemeListeners]) {
|
|
5470
|
+
try { fn() } catch (error) { /* a listener must never break the flip */ }
|
|
5471
|
+
}
|
|
5472
|
+
})
|
|
5473
|
+
autoThemeObserver.observe(document.body, { attributes: true, attributeFilter: ['data-ds-dark-theme'] })
|
|
5474
|
+
} catch (error) { autoThemeObserver = undefined }
|
|
5475
|
+
}
|
|
5476
|
+
return () => { autoThemeListeners.delete(listener) }
|
|
5477
|
+
}
|
|
5478
|
+
/** Subscribe a component to the theme flip (rows repaint with the other pool). */
|
|
5479
|
+
const useAutoThemeDark = () => {
|
|
5480
|
+
if (typeof React.useSyncExternalStore !== 'function') return autoThemeDarkNow()
|
|
5481
|
+
return React.useSyncExternalStore(subscribeAutoTheme, autoThemeDarkNow, autoThemeDarkNow)
|
|
5482
|
+
}
|
|
5483
|
+
|
|
5411
5484
|
|
|
5412
5485
|
/**
|
|
5413
5486
|
* Icon pool of the same toggle: names from the EXISTING candidate list
|
|
@@ -5475,7 +5548,9 @@ window.__ModuleLoader__.load({
|
|
|
5475
5548
|
|
|
5476
5549
|
/** What this host can actually render, resolved once (the icon set is fixed per page). */
|
|
5477
5550
|
const AUTO_ICON_CHOICES = AUTO_ICON_POOL.filter((name) => resolveIconName(name) !== '')
|
|
5478
|
-
|
|
5551
|
+
// The bag draws SLOT TOKENS (not colours): the same draw stays valid in both
|
|
5552
|
+
// themes, so a theme flip never invalidates the recent-draw window.
|
|
5553
|
+
const autoStyler = createAutoStyler(AUTO_COLOR_TOKENS, AUTO_ICON_CHOICES)
|
|
5479
5554
|
|
|
5480
5555
|
/**
|
|
5481
5556
|
* Appearance controls shared by the per-row dialog and the settings card's
|
|
@@ -5488,7 +5563,13 @@ window.__ModuleLoader__.load({
|
|
|
5488
5563
|
*/
|
|
5489
5564
|
function AppearanceControls({ value, onChange, allowIcon, t }) {
|
|
5490
5565
|
const appearance = readAppearance(value)
|
|
5491
|
-
|
|
5566
|
+
// Subscribe to the theme flip: a row may carry an `auto:N` token, and the
|
|
5567
|
+
// controls must show/preview the colour that token paints right now.
|
|
5568
|
+
useAutoThemeDark()
|
|
5569
|
+
// Displayed/every control below uses the RESOLVED hex; the raw value stays
|
|
5570
|
+
// in the draft, so committing without touching the colour keeps the token
|
|
5571
|
+
// (and with it the theme-following behaviour).
|
|
5572
|
+
const color = resolveColorValue(appearance.color || '')
|
|
5492
5573
|
const glow = appearance.glow
|
|
5493
5574
|
const weight = appearance.weight
|
|
5494
5575
|
const shadow = appearance.shadow
|
|
@@ -6337,6 +6418,21 @@ window.__ModuleLoader__.load({
|
|
|
6337
6418
|
// Auto color + icon for new items (v0.24.0). Default OFF: absent key =
|
|
6338
6419
|
// off, so every existing snapshot keeps its behavior untouched.
|
|
6339
6420
|
const autoStyle = prefsMap.autoStyle === true
|
|
6421
|
+
// Subscribe the ROW renderer to the theme flip (v0.25.0 P1): resolving a
|
|
6422
|
+
// stored `auto:N` token reads the live theme, but a read alone never
|
|
6423
|
+
// repaints — without this subscription the rows kept the light pool after
|
|
6424
|
+
// the Host switched to dark, so normal-text AA was broken on the switch
|
|
6425
|
+
// path (measured 2.49). The value is passed explicitly into the resolver
|
|
6426
|
+
// below so the colour and the outline pole come from one snapshot.
|
|
6427
|
+
//
|
|
6428
|
+
// Placement: this sits before every OTHER hook, so the hook order is fixed
|
|
6429
|
+
// for a mount. The one branch above it is the injected-hook shape gate
|
|
6430
|
+
// (`typeof useWorkspaces !== 'function' → return null`), which is constant
|
|
6431
|
+
// for the lifetime of a mount — the hook count therefore never varies, and
|
|
6432
|
+
// that branch renders no rows at all. If anyone ever turns that gate into a
|
|
6433
|
+
// condition that can CHANGE mid-mount, this subscription must move above it
|
|
6434
|
+
// first, or React sees a varying hook count.
|
|
6435
|
+
const autoDarkTheme = useAutoThemeDark()
|
|
6340
6436
|
// Workspace stream state: a `ready` phase with a settled stream is the
|
|
6341
6437
|
// first authoritative inventory — the point where "everything seen so
|
|
6342
6438
|
// far is pre-existing" can be recorded once (older hosts without the
|
|
@@ -6734,7 +6830,11 @@ window.__ModuleLoader__.load({
|
|
|
6734
6830
|
const appearanceOf = (key) => mergeAppearance(defaultAppearance, styleEntry(key))
|
|
6735
6831
|
const rowStyleOf = (key) => {
|
|
6736
6832
|
const appearance = appearanceOf(key)
|
|
6737
|
-
|
|
6833
|
+
// `auto:N` tokens resolve against the LIVE theme here, which is what makes
|
|
6834
|
+
// a theme flip re-colour every auto-assigned row. `autoDarkTheme` is the
|
|
6835
|
+
// subscribed snapshot, passed explicitly: reading the DOM would give the
|
|
6836
|
+
// same value, but only the subscription guarantees the repaint.
|
|
6837
|
+
const color = resolveColorValue(appearance.color || '', autoDarkTheme)
|
|
6738
6838
|
const glow = Number(appearance.glow) || 0
|
|
6739
6839
|
const weight = Number(appearance.weight) || 0
|
|
6740
6840
|
const shadow = appearance.shadow === true
|