dsh-better-workspace 0.23.0 → 0.24.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 -0
- package/README_EN.md +1 -0
- package/dsh.plugin.json +1 -1
- package/package.json +1 -1
- package/src/client.js +271 -0
package/README.md
CHANGED
|
@@ -71,6 +71,7 @@
|
|
|
71
71
|
- **文件夹式收起**:点工作区行 = 收起/展开该工作区的全部会话(收起后行上保留会话数角标);会话分组同样可收起;搜索时自动全部展开。
|
|
72
72
|
- **拖拽还原原版能力**:工作区行可拖拽——拖到另一工作区行上/下半即调整顺序(写回宿主 registry 序),拖到分组行则移动进该分组(改写名称前缀);会话行可拖拽——同组内拖到另一会话上/下即调整顺序,拖到**别组的会话行**会把名字前缀改写到那个组(拖到根层的行 = 移出分组),拖到会话子分组行即移动进该分组,拖到**自己的工作区行**或**树里任何组外的地方**(含空白区域)同样移出分组 —— 拖拽期间工作区行整行高亮、树底部有一条淡虚线提示这个出口;带分组前缀的会话行右键还多一项「移出分组」。显示顺序 = 宿主手动序,拖拽结果立即生效。**磁盘层是文件系统事实,不随拖拽改变**:跨磁盘层的放置只重组名称分组(工作区落回自身磁盘层的末尾),同层放置才走锚点序。拖拽工作区期间,单链合并显示的行(如 工作/A)临时展开回文件夹树——路径里的每一级都是可投放的分组行,松手后自动合并回去。
|
|
73
73
|
- **不丢原生能力**:会话行(打开/重命名/分叉/归档)、每工作区「新会话」(点 + 总是先展开该工作区,让新会话立刻可见)、当前会话高亮、官方状态灯(蓝色运行环 / 琥珀待交互 / 绿色完成提醒)、**状态呼吸灯**(折叠藏起的状态灯向外冒泡:工作区/分组行图标按状态色呼吸发光——琥珀待交互/绿完成,自定义过发光的标题一起呼吸;运行中只在会话行本层蓝色呼吸,不外渗;可在设置关闭)、**活跃定时任务角标**(有活动 Schedule 的会话显示闹钟图标;v0.23.0 起直接渲染官方 `sidebar.session.row.leading` 座位的占用者,与官方行同源)、未分组会话兜底、界面文案跟随 DSH 的语言设置(内置 21 种语言,含简繁中文)。
|
|
74
|
+
- **新增项自动配色 + 图标(v0.24.0,默认关闭)**:设置卡里一个开关,打开后**新创建的会话**自动分到一个内置色、**新工作区**再额外分到一个图标,懒得逐个设置的人直接开箱即用。颜色来自**定死的 13 色调色板**,按「洗牌袋 + 近期回避窗口」抽取——一轮之内绝不重复,跨轮也不会立刻撞上刚出过的 3 个,连续新建几项肉眼可辨。可读性口径(说准确些):每个色在浅色与深色背景下的对比度**都 ≥3.0**(WCAG 图形/大字号阈值);**正文级 AA 需要 4.5,本池未达**——与插件里既有手动色板同档,并且已经排除了原色板中最淡的 5 个(白底仅 2.0~2.8)。单一固定色值不可能同时满足纯白与近黑两个极端背景,这是数学约束。**只影响打开开关之后新建的项**:你手动设置过外观的行永不被覆盖,关闭开关也不会回收已分配的样式,同一项不会被二次随机。图标从既有图标候选集里取、按宿主实际导出过滤;**图标只给工作区**——会话行的那个位置是官方状态灯与日程角标,没有图标位。
|
|
74
75
|
- **官方新语义与快捷键都接上(v0.23.0,对齐 dsh 0.1.7-rc.2)**:① 归档筛选是官方新版三态直选(**隐藏已归档** / **全部对话(显示已归档)** / **仅显示已归档**);选「仅显示已归档」时**没有归档会话的工作区整行隐藏**,空列表显示「暂无已归档会话」+「查看其他会话」一键回退;② 官方快捷键 **⌥⌘K 搜索 / ⌥⌘O 添加工作区 / ⌥⌘N 新会话**(桌面端为 ⌘K / ⌘O / ⌘N)在本插件的自绘侧栏里**真的生效**——搜索键打开并聚焦本插件的搜索框、添加键走同一个官方目录流(原生宿主弹系统选择器,browse 宿主弹应用内入口提示),按钮文案还会带上宿主当前的键位;③ 首次使用的工作区显示为本地化的「默认工作区」,不再露出磁盘目录名。
|
|
75
76
|
- **URL/斜杠标题不拆层**:宿主自动生成的会话标题落地时若含 `/`(如复述了 URL),整串自动包上 `“”` 原样显示,绝不解析成层级——只对本次启动后**新建的会话**生效,并等命名稳定(约 20 秒,让原生 AI 命名先落地)才处理;存量会话与你手动命名的 `/` 分组标题永不被改动。引号内(含手动添加)的 `/` 永不切分,孤立引号只当普通字符;无引号但含 URL 的旧标题也有平铺兜底。
|
|
76
77
|
- **新会话页的工作区选择器 = 侧栏那棵树(v0.22.0)**:会话空态页「工作区」按钮的弹层原本是官方的一层平铺标题列表(连磁盘目录嵌套都没有);本插件接管该座位后,弹层绘制与侧栏**同一棵**树——磁盘目录嵌套、「/」名称分组三态、单链合并全部读同一个视图 store,所以侧栏的视图选项一改,**这边立刻跟着变**;当前工作区带勾选标记,分组行可开合(选择器内本地记忆,默认全展开),标题按侧栏的层级叶子显示。底部「添加工作区」仍由**官方目录拾取占用者**承载(原生选择器 / 官方应用内浏览器),不是仿制品。
|
package/README_EN.md
CHANGED
|
@@ -71,6 +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.24.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 a **fixed 13-color palette** drawn with a shuffle bag plus a recent-draw window: nothing repeats inside a cycle, and a refill never starts with the last three colors, so items added in a row look clearly different. On readability, stated exactly: every entry keeps contrast **≥ 3.0** on both the light and the dark background (the WCAG graphics / large-text threshold); **normal-text AA asks for 4.5 and this pool does not reach it** — the same tier as the plugin's existing manual swatches, and the five weakest of those (2.0–2.8 on white) were excluded. A single fixed hex cannot satisfy pure white and near black at once; that is a mathematical constraint, not a missed tradeoff. **Only items created after you turn it on are touched**: rows you styled by hand 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.
|
|
74
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.
|
|
75
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.
|
|
76
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.24.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.24.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
|
@@ -99,6 +99,8 @@ window.__ModuleLoader__.load({
|
|
|
99
99
|
'settings.sessionMenu.hint': "开启时右键点击会话行即可打开操作菜单(包含官方的置顶、归档、停止并归档等);关闭后改为在行尾悬停显示官方样式的 ⋯ 按钮,点击打开同一个菜单。默认开启。",
|
|
100
100
|
'settings.rowActions': "会话行悬停按钮",
|
|
101
101
|
'settings.rowActions.hint': "悬停会话行时在行尾显示置顶 / 归档快捷按钮,与官方行保持一致;关闭后这些动作只保留在菜单里。默认开启。",
|
|
102
|
+
'settings.autoStyle': '新增项自动配色',
|
|
103
|
+
'settings.autoStyle.hint': '开启后,新创建的会话会自动分到一个内置色,新工作区还会分到一个图标;颜色从固定的 13 色调色板按「洗牌 + 近期去重」抽取,连续新增不会撞色。每个色在浅色与深色背景下对比度都 ≥3.0(WCAG 图形/大字号阈值);正文级 AA 需要 4.5,本池未达,与既有手动色板同档(已排除 5 个对比度更低的旧色)。只影响开启之后新建的项;你手动设置过外观的行永不被覆盖,关闭开关也不回收已分配的样式。默认关闭。',
|
|
102
104
|
'settings.appearance': '默认外观',
|
|
103
105
|
'settings.appearance.hint': '没有单独自定义过的行使用这套外观;字体描边默认开启——背景画面下不描边文字常常看不清。字体颜色留空即跟随主题。',
|
|
104
106
|
'settings.appearance.reset': '恢复默认外观',
|
|
@@ -247,6 +249,8 @@ window.__ModuleLoader__.load({
|
|
|
247
249
|
'settings.sessionMenu.hint': "On: right-click a session row to open its action menu (including the official pin, archive, and stop-and-archive). Off: the row shows the official-style ⋯ button on hover instead, opening the same menu. On by default.",
|
|
248
250
|
'settings.rowActions': "Session row hover buttons",
|
|
249
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
|
+
'settings.autoStyle': 'Auto color & icon for new items',
|
|
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 a fixed 13-color palette drawn with shuffle + recent-dedup, so consecutive items never look alike. Every entry keeps contrast ≥3.0 on both light and dark backgrounds (the WCAG graphics/large-text threshold); normal-text AA asks for 4.5, which this pool does not reach — the same tier as the existing manual palette (five weaker old swatches were excluded). 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.',
|
|
250
254
|
'settings.appearance': 'Default appearance',
|
|
251
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.',
|
|
252
256
|
'settings.appearance.reset': 'Reset to default',
|
|
@@ -403,6 +407,8 @@ window.__ModuleLoader__.load({
|
|
|
403
407
|
'settings.sessionMenu.hint': "عند التفعيل: انقر بزر الفأرة الأيمن على سطر الجلسة لفتح قائمة الإجراءات (بما في ذلك التثبيت والأرشفة الرسمية). عند الإيقاف: يظهر زر ⋯ بأسلوب رسمي عند تمرير المؤشر يفتح القائمة نفسها. مفعّل افتراضياً.",
|
|
404
408
|
'settings.rowActions': "أزرار تمرير سطر الجلسة",
|
|
405
409
|
'settings.rowActions.hint': "إظهار أزرار التثبيت / الأرشفة السريعة في نهاية سطر الجلسة عند تمرير المؤشر، مطابقة للأسطر الرسمية. عند الإيقاف: تبقى هذه الإجراءات في القائمة فقط. مفعّل افتراضياً.",
|
|
410
|
+
'settings.autoStyle': 'ألوان وأيقونات تلقائية للعناصر الجديدة',
|
|
411
|
+
'settings.autoStyle.hint': 'عند التفعيل يحصل كل جلسة جديدة على لون من لوحة مدمجة، ويحصل كل مساحة عمل جديدة أيضًا على أيقونة. تُسحب الألوان من 13 لونًا ثابتًا بترتيب عشوائي مع تجنّب التكرار القريب. يحافظ كل لون على تباين ≥3.0 على الخلفيتين الفاتحة والداكنة (عتبة WCAG للرسوم والنص الكبير)؛ أما AA للنص العادي فيتطلب 4.5 ولا تبلغه هذه اللوحة، وهي بمستوى اللوحة اليدوية الحالية (استُبعدت خمسة ألوان أضعف). يؤثر فقط على العناصر المنشأة بعد التفعيل، ولا يُستبدل أي سطر نسّقته يدويًا، والإيقاف لا يلغي ما تم تعيينه. معطّل افتراضيًا.',
|
|
406
412
|
'settings.appearance': 'المظهر الافتراضي',
|
|
407
413
|
'settings.appearance.hint': 'تستخدم الأسطر غير المخصصة هذا المظهر؛ حدّ النص مفعّل افتراضياً — فبدونه يصعب قراءة النص فوق صورة خلفية. اترك اللون فارغاً لاتباع السمة.',
|
|
408
414
|
'settings.appearance.reset': 'استعادة المظهر الافتراضي',
|
|
@@ -551,6 +557,8 @@ window.__ModuleLoader__.load({
|
|
|
551
557
|
'settings.sessionMenu.hint': "Ein: Rechtsklick auf eine Sitzungszeile öffnet das Aktionsmenü (inklusive offiziellem Anheften, Archivieren und Stoppen-und-Archivieren). Aus: beim Daraufzeigen erscheint stattdessen der offizielle ⋯-Knopf am Zeilenende und öffnet dasselbe Menü. Standardmäßig ein.",
|
|
552
558
|
'settings.rowActions': "Sitzungszeilen-Schnellknöpfe",
|
|
553
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
|
+
'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 Farben werden gemischt mit Vermeidung der letzten Treffer gezogen. Jeder Eintrag hält auf hellem wie dunklem Hintergrund Kontrast ≥3.0 (WCAG-Schwelle für Grafik/großen Text); Normaltext-AA verlangt 4.5 und wird von dieser Palette nicht erreicht – gleiche Stufe wie die vorhandene manuelle Palette (fünf schwächere alte Farben wurden entfernt). Nur danach erstellte Einträge werden erfasst; manuell gestaltete Zeilen werden nie überschrieben, und Ausschalten macht Zuweisungen nicht rückgängig. Standardmäßig aus.',
|
|
554
562
|
'settings.appearance': 'Standardaussehen',
|
|
555
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.',
|
|
556
564
|
'settings.appearance.reset': 'Standard wiederherstellen',
|
|
@@ -699,6 +707,8 @@ window.__ModuleLoader__.load({
|
|
|
699
707
|
'settings.sessionMenu.hint': "Activé : un clic droit sur une ligne de session ouvre son menu d’actions (épinglage, archivage et arrêt-avec-archivage officiels inclus). Désactivé : la ligne affiche plutôt le bouton ⋯ officiel au survol, ouvrant le même menu. Activé par défaut.",
|
|
700
708
|
'settings.rowActions': "Boutons de survol des sessions",
|
|
701
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
|
+
'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 couleurs sont tirées par mélange avec évitement des derniers tirages. Chaque couleur garde un contraste ≥3,0 sur fond clair comme sombre (seuil WCAG graphiques/grands textes) ; le niveau AA pour texte courant exige 4,5 et n’est pas atteint — même niveau que la palette manuelle existante (cinq anciennes couleurs plus faibles ont été écartées). 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.',
|
|
702
712
|
'settings.appearance': 'Apparence par défaut',
|
|
703
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.',
|
|
704
714
|
'settings.appearance.reset': 'Rétablir l\'apparence par défaut',
|
|
@@ -847,6 +857,8 @@ window.__ModuleLoader__.load({
|
|
|
847
857
|
'settings.sessionMenu.hint': "चालू: सेशन पंक्ति पर राइट-क्लिक करने से उसका क्रिया मेनू खुलता है (आधिकारिक पिन, आर्काइव और रोककर-आर्काइव सहित)। बंद: पंक्ति पर होवर करने पर आधिकारिक शैली का ⋯ बटन दिखता है, जो वही मेनू खोलता है। डिफ़ॉल्ट रूप से चालू।",
|
|
848
858
|
'settings.rowActions': "सेशन पंक्ति होवर बटन",
|
|
849
859
|
'settings.rowActions.hint': "होवर करने पर सेशन पंक्ति के अंत में पिन / आर्काइव क्विक बटन दिखाता है, आधिकारिक पंक्तियों जैसा। बंद: ये क्रियाएँ केवल मेनू में रहती हैं। डिफ़ॉल्ट रूप से चालू।",
|
|
860
|
+
'settings.autoStyle': 'नए आइटम के लिए स्वचालित रंग और आइकन',
|
|
861
|
+
'settings.autoStyle.hint': 'चालू होने पर हर नए सत्र को अंतर्निहित पैलेट से एक रंग मिलता है और हर नए कार्यस्थान को एक आइकन भी। 13 रंगों को शफ़ल और हाल के दोहराव से बचाकर निकाला जाता है। हर रंग हल्की और गहरी दोनों पृष्ठभूमियों पर ≥3.0 कंट्रास्ट बनाए रखता है (WCAG ग्राफ़िक्स/बड़े पाठ की सीमा); सामान्य पाठ के लिए AA को 4.5 चाहिए जो यह पैलेट नहीं देता — यह मौजूदा मैनुअल पैलेट के समान स्तर है (पाँच कमज़ोर पुराने रंग हटाए गए)। केवल चालू करने के बाद बने आइटम प्रभावित होते हैं; हाथ से सजाई गई पंक्तियाँ कभी नहीं बदली जातीं और बंद करने पर पहले दिए रंग हटते नहीं। डिफ़ॉल्ट रूप से बंद।',
|
|
850
862
|
'settings.appearance': 'डिफ़ॉल्ट रूप',
|
|
851
863
|
'settings.appearance.hint': 'जिन पंक्तियों को अलग से अनुकूलित नहीं किया गया वे यह रूप इस्तेमाल करती हैं; पाठ की रूपरेखा डिफ़ॉल्ट रूप से चालू है — पृष्ठभूमि छवि पर बिना रूपरेखा वाला पाठ अक्सर पढ़ा नहीं जाता। रंग खाली छोड़ने पर वह थीम का अनुसरण करता है।',
|
|
852
864
|
'settings.appearance.reset': 'डिफ़ॉल्ट रूप पर लौटें',
|
|
@@ -995,6 +1007,8 @@ window.__ModuleLoader__.load({
|
|
|
995
1007
|
'settings.sessionMenu.hint': "Aktif: klik kanan pada baris sesi untuk membuka menu aksinya (termasuk pin, arsip, dan henti-dan-arsip resmi). Nonaktif: baris menampilkan tombol ⋯ gaya resmi saat dihover, membuka menu yang sama. Aktif secara bawaan.",
|
|
996
1008
|
'settings.rowActions': "Tombol hover baris sesi",
|
|
997
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
|
+
'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 warna diambil dengan cara diacak sambil menghindari pengambilan terakhir. Setiap warna menjaga kontras ≥3,0 pada latar terang maupun gelap (ambang WCAG grafik/teks besar); AA untuk teks normal menuntut 4,5 dan tidak dicapai palet ini — setara palet manual yang ada (lima warna lama yang lebih lemah dikeluarkan). 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.',
|
|
998
1012
|
'settings.appearance': 'Tampilan bawaan',
|
|
999
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.',
|
|
1000
1014
|
'settings.appearance.reset': 'Kembalikan tampilan bawaan',
|
|
@@ -1143,6 +1157,8 @@ window.__ModuleLoader__.load({
|
|
|
1143
1157
|
'settings.sessionMenu.hint': "Attivo: il clic destro su una riga di sessione apre il menu azioni (con pin, archiviazione e ferma-e-archivia ufficiali). Disattivo: la riga mostra il pulsante ⋯ ufficiale al passaggio, aprendo lo stesso menu. Attivo per impostazione predefinita.",
|
|
1144
1158
|
'settings.rowActions': "Pulsanti al passaggio della sessione",
|
|
1145
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
|
+
'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 colori vengono estratti con mescolamento ed evitando gli ultimi estratti. Ogni colore mantiene un contrasto ≥3,0 su fondo chiaro e scuro (soglia WCAG per grafica/testo grande); il livello AA per il testo normale richiede 4,5 e non è raggiunto — stesso livello della palette manuale esistente (cinque vecchi colori più deboli sono stati esclusi). 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.',
|
|
1146
1162
|
'settings.appearance': 'Aspetto predefinito',
|
|
1147
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.',
|
|
1148
1164
|
'settings.appearance.reset': 'Ripristina l\'aspetto predefinito',
|
|
@@ -1291,6 +1307,8 @@ window.__ModuleLoader__.load({
|
|
|
1291
1307
|
'settings.sessionMenu.hint': "オン:セッション行を右クリックすると操作メニューを開きます(公式のピン留め・アーカイブ・停止してアーカイブを含む)。オフ:行にカーソルを合わせると公式スタイルの ⋯ ボタンが表示され、同じメニューを開きます。既定はオン。",
|
|
1292
1308
|
'settings.rowActions': "セッション行のホバーボタン",
|
|
1293
1309
|
'settings.rowActions.hint': "セッション行にカーソルを合わせると行末にピン / アーカイブのクイックボタンを表示し、公式の行と揃えます。オフ:これらの操作はメニュー内のみ。既定はオン。",
|
|
1310
|
+
'settings.autoStyle': '新規項目の色とアイコンを自動割り当て',
|
|
1311
|
+
'settings.autoStyle.hint': 'オンにすると、新しく作られたセッションには内蔵パレットから色が、新しいワークスペースにはさらにアイコンが割り当てられます。13 色はシャッフルと直近の重複回避で抽選されます。各色はライト/ダークどちらの背景でもコントラスト 3.0 以上を保ちます(WCAG の図形・大文字基準)。本文の AA は 4.5 が必要でこのパレットは未達です(既存の手動パレットと同水準、弱かった旧 5 色は除外)。オンにした後に作成された項目だけが対象で、手動で設定した行は上書きされず、オフにしても割り当て済みの色は元に戻りません。既定はオフです。',
|
|
1294
1312
|
'settings.appearance': '既定の外観',
|
|
1295
1313
|
'settings.appearance.hint': '個別にカスタマイズしていない行に適用される外観です;文字の縁取りは既定でオンです——背景画像の上では縁取りのない文字が読みにくいためです。色を空にするとテーマに従います。',
|
|
1296
1314
|
'settings.appearance.reset': '既定の外観に戻す',
|
|
@@ -1439,6 +1457,8 @@ window.__ModuleLoader__.load({
|
|
|
1439
1457
|
'settings.sessionMenu.hint': "켬: 세션 행을 우클릭하면 작업 메뉴가 열립니다(공식 고정, 보관, 중지 후 보관 포함). 끔: 행에 마우스를 올리면 공식 스타일의 ⋯ 버튼이 표시되어 같은 메뉴를 엽니다. 기본값은 켬.",
|
|
1440
1458
|
'settings.rowActions': "세션 행 호버 버튼",
|
|
1441
1459
|
'settings.rowActions.hint': "세션 행에 마우스를 올리면 행 끝에 고정 / 보관 빠른 버튼을 표시하여 공식 행과 일치시킵니다. 끔: 이 작업들은 메뉴에만 남습니다. 기본값은 켬.",
|
|
1460
|
+
'settings.autoStyle': '새 항목 자동 색상 및 아이콘',
|
|
1461
|
+
'settings.autoStyle.hint': '켜면 새로 만든 세션에 내장 팔레트의 색이, 새 워크스페이스에는 아이콘까지 자동으로 지정됩니다. 13가지 색은 섞기와 최근 중복 회피로 뽑습니다. 각 색은 밝은/어두운 배경 모두에서 대비 3.0 이상을 유지합니다(WCAG 그래픽/큰 텍스트 기준). 본문 AA는 4.5가 필요하며 이 팔레트는 미달입니다(기존 수동 팔레트와 같은 수준, 약했던 옛 색 5개는 제외). 켠 뒤에 만든 항목에만 적용되며, 직접 꾸민 행은 절대 덮어쓰지 않고, 끄더라도 이미 지정된 색은 되돌리지 않습니다. 기본값은 꺼짐입니다.',
|
|
1442
1462
|
'settings.appearance': '기본 모양',
|
|
1443
1463
|
'settings.appearance.hint': '따로 지정하지 않은 행에 적용되는 모양입니다; 글자 외곽선은 기본으로 켜져 있습니다——배경 이미지 위에서는 외곽선 없는 글자가 잘 보이지 않기 때문입니다. 색을 비우면 테마를 따릅니다.',
|
|
1444
1464
|
'settings.appearance.reset': '기본 모양으로 되돌리기',
|
|
@@ -1587,6 +1607,8 @@ window.__ModuleLoader__.load({
|
|
|
1587
1607
|
'settings.sessionMenu.hint': "Aan: rechtermuisklik op een sessierij opent het actiemenu (inclusief officieel vastmaken, archiveren en stoppen-en-archiveren). Uit: bij aanwijzen verschijnt in plaats daarvan de officiële ⋯-knop aan het rij-einde, die hetzelfde menu opent. Standaard aan.",
|
|
1588
1608
|
'settings.rowActions': "Sessierij-snelknoppen",
|
|
1589
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
|
+
'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 kleuren worden geschud en de laatst gebruikte worden vermeden. Elke kleur houdt contrast ≥3,0 op zowel lichte als donkere achtergrond (de WCAG-drempel voor grafiek/grote tekst); AA voor normale tekst vraagt 4,5 en dat haalt dit palet niet — hetzelfde niveau als het bestaande handmatige palet (vijf zwakkere oude kleuren zijn verwijderd). 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.',
|
|
1590
1612
|
'settings.appearance': 'Standaarduiterlijk',
|
|
1591
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.',
|
|
1592
1614
|
'settings.appearance.reset': 'Standaarduiterlijk herstellen',
|
|
@@ -1735,6 +1757,8 @@ window.__ModuleLoader__.load({
|
|
|
1735
1757
|
'settings.sessionMenu.hint': "Włączone: kliknięcie prawym przyciskiem wiersza sesji otwiera jego menu akcji (w tym oficjalne przypinanie, archiwizację i zatrzymanie z archiwizacją). Wyłączone: przy najechaniu wiersz pokazuje oficjalny przycisk ⋯ otwierający to samo menu. Domyślnie włączone.",
|
|
1736
1758
|
'settings.rowActions': "Przyciski najechania wiersza sesji",
|
|
1737
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
|
+
'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 kolorów losuje się tasowaniem z unikaniem ostatnich trafień. Każdy kolor zachowuje kontrast ≥3,0 na jasnym i ciemnym tle (próg WCAG dla grafiki/dużego tekstu); AA dla zwykłego tekstu wymaga 4,5 i ta paleta go nie osiąga — ten sam poziom co dotychczasowa paleta ręczna (pięć słabszych starych kolorów usunięto). 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.',
|
|
1738
1762
|
'settings.appearance': 'Domyślny wygląd',
|
|
1739
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.',
|
|
1740
1764
|
'settings.appearance.reset': 'Przywróć domyślny wygląd',
|
|
@@ -1883,6 +1907,8 @@ window.__ModuleLoader__.load({
|
|
|
1883
1907
|
'settings.sessionMenu.hint': "Ligado: clicar com o botão direito numa linha de sessão abre o menu de ações (incluindo fixar, arquivar e parar-e-arquivar oficiais). Desligado: a linha mostra o botão ⋯ oficial ao passar o cursor, abrindo o mesmo menu. Ligado por predefinição.",
|
|
1884
1908
|
'settings.rowActions': "Botões de passagem da sessão",
|
|
1885
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
|
+
'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. As 13 cores são sorteadas com embaralhamento e evitando as últimas. Cada cor mantém contraste ≥3,0 em fundo claro e escuro (o limite WCAG para gráficos/texto grande); o AA para texto normal exige 4,5 e esta paleta não o atinge — mesmo nível da paleta manual existente (cinco cores antigas mais fracas foram excluídas). 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.',
|
|
1886
1912
|
'settings.appearance': 'Aparência padrão',
|
|
1887
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.',
|
|
1888
1914
|
'settings.appearance.reset': 'Restaurar aparência padrão',
|
|
@@ -2031,6 +2057,8 @@ window.__ModuleLoader__.load({
|
|
|
2031
2057
|
'settings.sessionMenu.hint': "Вкл: правый клик по строке сессии открывает меню действий (включая официальные закрепление, архивацию и «остановить и архивировать»). Выкл: при наведении в строке появляется официальная кнопка ⋯, открывающая то же меню. Включено по умолчанию.",
|
|
2032
2058
|
'settings.rowActions': "Кнопки наведения строки сессии",
|
|
2033
2059
|
'settings.rowActions.hint': "Показывает быстрые кнопки закрепить / архивировать в конце строки при наведении, как в официальных строках. Выкл: эти действия остаются только в меню. Включено по умолчанию.",
|
|
2060
|
+
'settings.autoStyle': 'Автоцвет и значок для новых элементов',
|
|
2061
|
+
'settings.autoStyle.hint': 'Когда включено, каждый новый сеанс получает цвет из встроенной палитры, а новая рабочая область — ещё и значок. Тринадцать цветов вытягиваются перемешиванием с избеганием недавних. Каждый цвет сохраняет контраст ≥3,0 на светлом и тёмном фоне (порог WCAG для графики/крупного текста); AA для обычного текста требует 4,5, и эта палитра его не достигает — тот же уровень, что и существующая ручная палитра (пять более слабых старых цветов исключены). Затрагиваются только элементы, созданные после включения; строки, оформленные вручную, никогда не перезаписываются, а выключение не отменяет уже назначенное. По умолчанию выключено.',
|
|
2034
2062
|
'settings.appearance': 'Оформление по умолчанию',
|
|
2035
2063
|
'settings.appearance.hint': 'Строки без своей настройки используют это оформление; обводка текста включена по умолчанию — без неё текст на фоновом изображении часто нечитаем. Пустой цвет означает следование теме.',
|
|
2036
2064
|
'settings.appearance.reset': 'Вернуть оформление по умолчанию',
|
|
@@ -2179,6 +2207,8 @@ window.__ModuleLoader__.load({
|
|
|
2179
2207
|
'settings.sessionMenu.hint': "På: högerklick på en sessionsrad öppnar dess åtgärdsmeny (inklusive officiell fästning, arkivering och stoppa-och-arkivera). Av: raden visar istället den officiella ⋯-knappen vid hovring, som öppnar samma meny. På som standard.",
|
|
2180
2208
|
'settings.rowActions': "Hovringsknappar för sessionsraden",
|
|
2181
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
|
+
'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 färgerna dras med blandning och undvikande av de senaste. Varje färg håller kontrast ≥3,0 mot både ljus och mörk bakgrund (WCAG-tröskeln för grafik/stor text); AA för normal text kräver 4,5 och nås inte av paletten — samma nivå som den befintliga manuella paletten (fem svagare gamla färger togs bort). 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.',
|
|
2182
2212
|
'settings.appearance': 'Standardutseende',
|
|
2183
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.',
|
|
2184
2214
|
'settings.appearance.reset': 'Återställ standardutseende',
|
|
@@ -2327,6 +2357,8 @@ window.__ModuleLoader__.load({
|
|
|
2327
2357
|
'settings.sessionMenu.hint': "เปิด: คลิกขวาที่แถวเซสชันเพื่อเปิดเมนูการกระทำ (รวมปักหมุด, เก็บถาวร และหยุด-แล้ว-เก็บถาวรแบบทางการ) ปิด: เมื่อชี้ที่แถวจะแสดงปุ่ม ⋯ สไตล์ทางการเปิดเมนูเดียวกันแทน เปิดตามค่าเริ่มต้น",
|
|
2328
2358
|
'settings.rowActions': "ปุ่มเมื่อชี้แถวเซสชัน",
|
|
2329
2359
|
'settings.rowActions.hint': "แสดงปุ่มด่วนปักหมุด / เก็บถาวรท้ายแถวเมื่อชี้ ให้ตรงกับแถวทางการ ปิด: การกระทำเหล่านี้มีเฉพาะในเมนู เปิดตามค่าเริ่มต้น",
|
|
2360
|
+
'settings.autoStyle': 'สีและไอคอนอัตโนมัติสำหรับรายการใหม่',
|
|
2361
|
+
'settings.autoStyle.hint': 'เมื่อเปิด ทุกเซสชันที่สร้างใหม่จะได้สีจากชุดสีในตัว และพื้นที่ทำงานใหม่จะได้ไอคอนด้วย สี 13 สีจะถูกสุ่มแบบสลับพร้อมหลีกเลี่ยงสีที่เพิ่งใช้ ทุกสีรักษาคอนทราสต์ ≥3.0 บนพื้นสว่างและมืด (เกณฑ์ WCAG สำหรับภาพ/ตัวอักษรขนาดใหญ่) ส่วน AA สำหรับข้อความทั่วไปต้องใช้ 4.5 ซึ่งชุดนี้ยังไม่ถึง — อยู่ระดับเดียวกับชุดสีmanualที่มีอยู่ (ตัดสีเก่าที่อ่อนกว่า 5 สีออก) มีผลเฉพาะรายการที่สร้างหลังเปิดใช้ แถวที่คุณตั้งค่าเองจะไม่ถูกเขียนทับ และการปิดจะไม่เรียกคืนสิ่งที่แจกไปแล้ว ค่าเริ่มต้นคือปิด',
|
|
2330
2362
|
'settings.appearance': 'รูปลักษณ์เริ่มต้น',
|
|
2331
2363
|
'settings.appearance.hint': 'แถวที่ยังไม่ได้กำหนดเองจะใช้รูปลักษณ์นี้ เส้นขอบตัวอักษรเปิดไว้เป็นค่าเริ่มต้น — บนภาพพื้นหลัง ตัวอักษรที่ไม่มีเส้นขอบมักอ่านยาก เว้นสีว่างไว้เพื่อตามธีม',
|
|
2332
2364
|
'settings.appearance.reset': 'คืนค่ารูปลักษณ์เริ่มต้น',
|
|
@@ -2475,6 +2507,8 @@ window.__ModuleLoader__.load({
|
|
|
2475
2507
|
'settings.sessionMenu.hint': "Açık: oturum satırına sağ tıklayınca eylem menüsü açılır (resmî sabitleme, arşivleme ve durdurup-arşivleme dahil). Kapalı: satırın üzerine gelince resmî ⋯ düğmesi görünür ve aynı menüyü açar. Varsayılan açık.",
|
|
2476
2508
|
'settings.rowActions': "Oturum satırı düğmeleri",
|
|
2477
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
|
+
'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 üç renk karıştırma ve son kullanılanları atlama yöntemiyle çekilir. Her renk açık ve koyu zeminde ≥3,0 kontrast korur (WCAG grafik/büyük metin eşiği); normal metin için AA 4,5 ister ve bu palet bunu karşılamaz — mevcut elle paletiyle aynı seviyede (daha zayıf beş eski renk çıkarıldı). 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ı.',
|
|
2478
2512
|
'settings.appearance': 'Varsayılan görünüm',
|
|
2479
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.',
|
|
2480
2514
|
'settings.appearance.reset': 'Varsayılan görünüme dön',
|
|
@@ -2623,6 +2657,8 @@ window.__ModuleLoader__.load({
|
|
|
2623
2657
|
'settings.sessionMenu.hint': "Bật: nhấp chuột phải vào dòng phiên để mở menu thao tác (bao gồm ghim, lưu trữ và dừng-rồi-lưu trữ chính thức). Tắt: dòng hiển thị nút ⋯ kiểu chính thức khi di chuột, mở cùng menu đó. Bật theo mặc định.",
|
|
2624
2658
|
'settings.rowActions': "Nút hover dòng phiên",
|
|
2625
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
|
+
'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 màu được rút theo cách xáo trộn và tránh các màu vừa dùng. Mỗi màu giữ độ tương phản ≥3,0 trên cả nền sáng và nền tối (ngưỡng WCAG cho đồ họa/chữ lớn); AA cho chữ thường cần 4,5 và bảng màu này chưa đạt — ngang mức bảng màu thủ công hiện có (năm màu cũ yếu hơn đã bị loại). 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.',
|
|
2626
2662
|
'settings.appearance': 'Giao diện mặc định',
|
|
2627
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ủ đề.',
|
|
2628
2664
|
'settings.appearance.reset': 'Khôi phục giao diện mặc định',
|
|
@@ -2771,6 +2807,8 @@ window.__ModuleLoader__.load({
|
|
|
2771
2807
|
'settings.sessionMenu.hint': "開啟時右鍵點擊會話行即可開啟操作選單(包含官方的置頂、封存、停止並封存等);關閉後改為在行尾懸停顯示官方樣式的 ⋯ 按鈕,點擊開啟同一個選單。預設開啟。",
|
|
2772
2808
|
'settings.rowActions': "會話行懸停按鈕",
|
|
2773
2809
|
'settings.rowActions.hint': "懸停會話行時在行尾顯示置頂 / 封存快捷按鈕,與官方行保持一致;關閉後這些動作只保留在選單裡。預設開啟。",
|
|
2810
|
+
'settings.autoStyle': '新增項目自動配色',
|
|
2811
|
+
'settings.autoStyle.hint': '開啟後,新開嘅會話會自動分到一個內置色,新工作區仲會分到一個圖示;顏色由固定 13 色調色板以「洗牌 + 近期去重」抽出,連續新增唔會撞色。每個色喺淺色同深色背景嘅對比度都 ≥3.0(WCAG 圖形/大字號門檻);正文級 AA 要 4.5,本池未達,同現有手動色板同級(已剔走 5 個對比度更低嘅舊色)。只影響開啟之後新開嘅項;你手動設定過外觀嘅行永不被覆蓋,熄咗開關亦唔會回收已分配嘅樣式。預設關閉。',
|
|
2774
2812
|
'settings.appearance': '預設外觀',
|
|
2775
2813
|
'settings.appearance.hint': '未單獨自訂過嘅行會用呢套外觀;字體描邊預設開啟——有背景圖嗰陣唔描邊嘅字經常睇唔清。字體顏色留空就會跟主題。',
|
|
2776
2814
|
'settings.appearance.reset': '還原預設外觀',
|
|
@@ -2919,6 +2957,8 @@ window.__ModuleLoader__.load({
|
|
|
2919
2957
|
'settings.sessionMenu.hint': "開啟時右鍵點擊會話行即可開啟操作選單(包含官方的置頂、歸檔、停止並歸檔等);關閉後改為在行尾懸停顯示官方樣式的 ⋯ 按鈕,點擊開啟同一個選單。預設開啟。",
|
|
2920
2958
|
'settings.rowActions': "會話行懸停按鈕",
|
|
2921
2959
|
'settings.rowActions.hint': "懸停會話行時在行尾顯示置頂 / 歸檔快捷按鈕,與官方行保持一致;關閉後這些動作只保留在選單裡。預設開啟。",
|
|
2960
|
+
'settings.autoStyle': '新增項目自動配色',
|
|
2961
|
+
'settings.autoStyle.hint': '開啟後,新開嘅會話會自動分到一個內置色,新工作區仲會分到一個圖示;顏色由固定 13 色調色板以「洗牌 + 近期去重」抽出,連續新增唔會撞色。每個色喺淺色同深色背景嘅對比度都 ≥3.0(WCAG 圖形/大字號門檻);正文級 AA 要 4.5,本池未達,同現有手動色板同級(已剔走 5 個對比度更低嘅舊色)。只影響開啟之後新開嘅項;你手動設定過外觀嘅行永不被覆蓋,熄咗開關亦唔會回收已分配嘅樣式。預設關閉。',
|
|
2922
2962
|
'settings.appearance': '預設外觀',
|
|
2923
2963
|
'settings.appearance.hint': '未單獨自訂過嘅行會用呢套外觀;字體描邊預設開啟——有背景圖嗰陣唔描邊嘅字經常睇唔清。字體顏色留空就會跟主題。',
|
|
2924
2964
|
'settings.appearance.reset': '還原預設外觀',
|
|
@@ -3067,6 +3107,8 @@ window.__ModuleLoader__.load({
|
|
|
3067
3107
|
'settings.sessionMenu.hint': "開啟時右鍵點擊會話列即可開啟動作選單(包含官方的釘選、封存、停止並封存等);關閉後改為在列尾懸停顯示官方樣式的 ⋯ 按鈕,點擊開啟同一個選單。預設開啟。",
|
|
3068
3108
|
'settings.rowActions': "會話列懸停按鈕",
|
|
3069
3109
|
'settings.rowActions.hint': "懸停會話列時在列尾顯示釘選 / 封存快捷按鈕,與官方列保持一致;關閉後這些動作只保留在選單裡。預設開啟。",
|
|
3110
|
+
'settings.autoStyle': '新增項目自動配色與圖示',
|
|
3111
|
+
'settings.autoStyle.hint': '開啟後,新建立的工作階段會自動分到一個內建色,新工作區還會分到一個圖示;顏色從固定 13 色調色盤以「洗牌 + 近期去重」抽出,連續新增不會撞色。每個色在淺色與深色背景的對比度都 ≥3.0(WCAG 圖形/大字號門檻);正文級 AA 需要 4.5,本池未達,與現有手動色盤同級(已排除 5 個對比度更低的舊色)。只影響開啟之後新建的項目;你手動設定過外觀的列永遠不會被覆蓋,關閉開關也不會回收已分配的樣式。預設關閉。',
|
|
3070
3112
|
'settings.appearance': '預設外觀',
|
|
3071
3113
|
'settings.appearance.hint': '未個別自訂過的列會使用這套外觀;字型外框預設開啟——在背景圖片上沒有外框的文字常常看不清楚。字型顏色留空即跟隨佈景主題。',
|
|
3072
3114
|
'settings.appearance.reset': '還原預設外觀',
|
|
@@ -4406,6 +4448,25 @@ window.__ModuleLoader__.load({
|
|
|
4406
4448
|
else next[key] = value
|
|
4407
4449
|
scopeSet('styling', next)
|
|
4408
4450
|
},
|
|
4451
|
+
/**
|
|
4452
|
+
* Auto-assignment writes SEVERAL keys in one pass (every new item of a
|
|
4453
|
+
* snapshot). The host write is derived from the rendered snapshot, so
|
|
4454
|
+
* writing them one by one would leave the host copy holding only the
|
|
4455
|
+
* last one — batch them into a single local+host update instead.
|
|
4456
|
+
* @param entries - `[key, value]` pairs; null values delete.
|
|
4457
|
+
*/
|
|
4458
|
+
setStylingMany: (entries) => {
|
|
4459
|
+
if (!Array.isArray(entries) || entries.length === 0) return
|
|
4460
|
+
if (actions && typeof actions.setStyling === 'function') {
|
|
4461
|
+
for (const entry of entries) actions.setStyling(entry[0], entry[1])
|
|
4462
|
+
}
|
|
4463
|
+
const next = { ...stylingMap }
|
|
4464
|
+
for (const entry of entries) {
|
|
4465
|
+
if (entry[1] === null) delete next[entry[0]]
|
|
4466
|
+
else next[entry[0]] = entry[1]
|
|
4467
|
+
}
|
|
4468
|
+
scopeSet('styling', next)
|
|
4469
|
+
},
|
|
4409
4470
|
setPref: (key, value) => {
|
|
4410
4471
|
if (actions && typeof actions.setPref === 'function') actions.setPref(key, value)
|
|
4411
4472
|
scopeSet(key, value)
|
|
@@ -5306,6 +5367,116 @@ window.__ModuleLoader__.load({
|
|
|
5306
5367
|
})
|
|
5307
5368
|
})()
|
|
5308
5369
|
|
|
5370
|
+
/* ============== auto appearance for NEW items (v0.24.0) ============== */
|
|
5371
|
+
|
|
5372
|
+
/**
|
|
5373
|
+
* Built-in palette of the "auto color + icon for new items" toggle
|
|
5374
|
+
* (prefs.autoStyle, OFF by default). The row color is the row's TEXT color
|
|
5375
|
+
* (rowStyleOf → style.color) plus the default text outline, so every entry
|
|
5376
|
+
* has to stay visible on the light AND the dark sidebar — a decorative
|
|
5377
|
+
* accent that only works on one theme would make the name hard to read.
|
|
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".
|
|
5387
|
+
*
|
|
5388
|
+
* Four entries are the existing custom-appearance swatches verbatim
|
|
5389
|
+
* (#f85149 / #5b8def / #a371f7 / #6e7681). The five swatches that only
|
|
5390
|
+
* clear ~2.0–2.8 on white (#3fb950 / #d29922 / #39c5cf / #ff9f45 /
|
|
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.
|
|
5395
|
+
*/
|
|
5396
|
+
const AUTO_COLOR_POOL = [
|
|
5397
|
+
'#f85149', // 红 / red (existing swatch) 3.35 / 5.08
|
|
5398
|
+
'#d97706', // 琥珀 / amber 3.19 / 5.34
|
|
5399
|
+
'#65a30d', // 青柠 / lime 3.09 / 5.51
|
|
5400
|
+
'#46a758', // 绿 / green 3.03 / 5.61
|
|
5401
|
+
'#0d9488', // 蓝绿 / teal 3.74 / 4.54
|
|
5402
|
+
'#0891b2', // 青 / cyan 3.68 / 4.62
|
|
5403
|
+
'#0090ff', // 天蓝 / sky 3.26 / 5.21
|
|
5404
|
+
'#5b8def', // 蓝 / blue (existing swatch) 3.23 / 5.27
|
|
5405
|
+
'#7c66dc', // 靛 / indigo 4.38 / 3.88
|
|
5406
|
+
'#a371f7', // 紫 / violet (existing swatch) 3.35 / 5.07
|
|
5407
|
+
'#d6409f', // 品红 / magenta 4.12 / 4.13
|
|
5408
|
+
'#e93d82', // 粉 / pink 3.85 / 4.42
|
|
5409
|
+
'#6e7681', // 灰 / grey (existing swatch) 4.59 / 3.70
|
|
5410
|
+
]
|
|
5411
|
+
|
|
5412
|
+
/**
|
|
5413
|
+
* Icon pool of the same toggle: names from the EXISTING candidate list
|
|
5414
|
+
* (ICON_CHOICES), so the set stays the host's own and the runtime filter
|
|
5415
|
+
* below drops whatever this host does not export — exactly like the icon
|
|
5416
|
+
* picker. Legacy folder modes (solid/outline) and 'none' stay out: the
|
|
5417
|
+
* point is a visible, distinct glyph per item.
|
|
5418
|
+
*/
|
|
5419
|
+
const AUTO_ICON_POOL = [
|
|
5420
|
+
'IconBranchOutline16', 'IconCodeOutline16', 'IconDataOutline16', 'IconGoalOutline16',
|
|
5421
|
+
'IconGlobeOutline14', 'IconListPenOutline16', 'IconChecklistOutline14', 'IconBrowseOutline16',
|
|
5422
|
+
'IconDownloadOutline16', 'IconApiOutline14', 'IconSkillOutline16', 'IconSparkle16',
|
|
5423
|
+
]
|
|
5424
|
+
|
|
5425
|
+
/** How many recent draws the next draw tries to avoid (per pool). */
|
|
5426
|
+
const AUTO_RECENT_WINDOW = 3
|
|
5427
|
+
|
|
5428
|
+
/** Fisher-Yates on a copy; `random` is injectable so tests are deterministic. */
|
|
5429
|
+
const autoShuffle = (list, random) => {
|
|
5430
|
+
const out = list.slice()
|
|
5431
|
+
for (let i = out.length - 1; i > 0; i -= 1) {
|
|
5432
|
+
const j = Math.floor(random() * (i + 1))
|
|
5433
|
+
const swap = out[i]
|
|
5434
|
+
out[i] = out[j]
|
|
5435
|
+
out[j] = swap
|
|
5436
|
+
}
|
|
5437
|
+
return out
|
|
5438
|
+
}
|
|
5439
|
+
|
|
5440
|
+
/**
|
|
5441
|
+
* Draw-without-replacement drawer: a shuffled BAG per pool, refilled with
|
|
5442
|
+
* the pool minus the last AUTO_RECENT_WINDOW draws. One bag cycle never
|
|
5443
|
+
* repeats a value, and the refill keeps a value from coming back
|
|
5444
|
+
* immediately after the cycle boundary — consecutive new items therefore
|
|
5445
|
+
* look clearly different, which pure Math.random() would not guarantee.
|
|
5446
|
+
* Colors and icons draw from independent bags. (Pure; unit-tested.)
|
|
5447
|
+
* @param colors - fixed color pool.
|
|
5448
|
+
* @param icons - fixed icon pool (already filtered for this host).
|
|
5449
|
+
* @param random - [0,1) source, defaults to Math.random.
|
|
5450
|
+
* @returns `{ nextColor(), nextIcon() }`, each null when its pool is empty.
|
|
5451
|
+
*/
|
|
5452
|
+
const createAutoStyler = (colors, icons, random = Math.random) => {
|
|
5453
|
+
const bags = { color: [], icon: [] }
|
|
5454
|
+
const recent = { color: [], icon: [] }
|
|
5455
|
+
const draw = (kind, pool) => {
|
|
5456
|
+
if (!Array.isArray(pool) || pool.length === 0) return null
|
|
5457
|
+
if (bags[kind].length === 0) {
|
|
5458
|
+
const blocked = new Set(recent[kind])
|
|
5459
|
+
const fresh = pool.filter((value) => !blocked.has(value))
|
|
5460
|
+
bags[kind] = autoShuffle(fresh.length > 0 ? fresh : pool.slice(), random)
|
|
5461
|
+
recent[kind] = []
|
|
5462
|
+
}
|
|
5463
|
+
const value = bags[kind].pop()
|
|
5464
|
+
recent[kind].push(value)
|
|
5465
|
+
while (recent[kind].length > AUTO_RECENT_WINDOW) recent[kind].shift()
|
|
5466
|
+
return value
|
|
5467
|
+
}
|
|
5468
|
+
return {
|
|
5469
|
+
nextColor: () => draw('color', colors),
|
|
5470
|
+
nextIcon: () => draw('icon', icons),
|
|
5471
|
+
}
|
|
5472
|
+
}
|
|
5473
|
+
|
|
5474
|
+
/* ------------------ end of the pure auto-style block ------------------ */
|
|
5475
|
+
|
|
5476
|
+
/** What this host can actually render, resolved once (the icon set is fixed per page). */
|
|
5477
|
+
const AUTO_ICON_CHOICES = AUTO_ICON_POOL.filter((name) => resolveIconName(name) !== '')
|
|
5478
|
+
const autoStyler = createAutoStyler(AUTO_COLOR_POOL, AUTO_ICON_CHOICES)
|
|
5479
|
+
|
|
5309
5480
|
/**
|
|
5310
5481
|
* Appearance controls shared by the per-row dialog and the settings card's
|
|
5311
5482
|
* "default appearance" section: color, glow, weight, shadow, the text
|
|
@@ -5590,6 +5761,9 @@ window.__ModuleLoader__.load({
|
|
|
5590
5761
|
const statusPulse = prefs.statusPulse !== false
|
|
5591
5762
|
const sessionMenu = prefs.sessionMenu !== false
|
|
5592
5763
|
const rowActions = prefs.rowActions !== false
|
|
5764
|
+
// Auto color + icon for new items (v0.24.0): OFF unless explicitly on —
|
|
5765
|
+
// the switch is opt-in, and an absent key means off.
|
|
5766
|
+
const autoStyle = prefs.autoStyle === true
|
|
5593
5767
|
// Progressive listing quota (v0.21.0, issue #8): 0 = unlimited.
|
|
5594
5768
|
const rawLimit = Math.floor(Number(prefs.sessionLimit))
|
|
5595
5769
|
const sessionLimit = Number.isFinite(rawLimit) && rawLimit > 0 ? Math.min(rawLimit, 500) : 0
|
|
@@ -5712,6 +5886,18 @@ window.__ModuleLoader__.load({
|
|
|
5712
5886
|
}, E('span', { className: 'bw-switch-thumb' })),
|
|
5713
5887
|
),
|
|
5714
5888
|
E('div', { className: 'bw-hint' }, t('settings.rowActions.hint')),
|
|
5889
|
+
E('div', { className: 'bw-setting-row', style: { marginTop: 10 } },
|
|
5890
|
+
E('div', { className: 'bw-setting-label' }, t('settings.autoStyle')),
|
|
5891
|
+
E('button', {
|
|
5892
|
+
type: 'button',
|
|
5893
|
+
role: 'switch',
|
|
5894
|
+
'aria-checked': autoStyle,
|
|
5895
|
+
'aria-label': t('settings.autoStyle'),
|
|
5896
|
+
className: cls('bw-switch', autoStyle && 'bw-switch-on'),
|
|
5897
|
+
onClick: () => { setPref('autoStyle', !autoStyle) },
|
|
5898
|
+
}, E('span', { className: 'bw-switch-thumb' })),
|
|
5899
|
+
),
|
|
5900
|
+
E('div', { className: 'bw-hint' }, t('settings.autoStyle.hint')),
|
|
5715
5901
|
E('div', { className: 'bw-setting-row', style: { marginTop: 10 } },
|
|
5716
5902
|
E('div', { className: 'bw-setting-label' }, t('settings.sessionLimit')),
|
|
5717
5903
|
E('div', { className: 'bw-seg' },
|
|
@@ -6148,6 +6334,14 @@ window.__ModuleLoader__.load({
|
|
|
6148
6334
|
// the plugin's historical behavior (right-click on, quick buttons on).
|
|
6149
6335
|
const sessionMenuEnabled = prefsMap.sessionMenu !== false
|
|
6150
6336
|
const rowActionsEnabled = prefsMap.rowActions !== false
|
|
6337
|
+
// Auto color + icon for new items (v0.24.0). Default OFF: absent key =
|
|
6338
|
+
// off, so every existing snapshot keeps its behavior untouched.
|
|
6339
|
+
const autoStyle = prefsMap.autoStyle === true
|
|
6340
|
+
// Workspace stream state: a `ready` phase with a settled stream is the
|
|
6341
|
+
// first authoritative inventory — the point where "everything seen so
|
|
6342
|
+
// far is pre-existing" can be recorded once (older hosts without the
|
|
6343
|
+
// field simply report undefined, which is not 'loading').
|
|
6344
|
+
const workspaceStreamState = useWorkspaces(s => s.state)
|
|
6151
6345
|
// Archived-row visibility (v0.20.0, official ArchivedFilter mirror);
|
|
6152
6346
|
// persisted snapshots from older plugin versions lack the key.
|
|
6153
6347
|
const archivedFilter = useStore ? (useStore(s => s.archivedFilter) || 'default') : 'default'
|
|
@@ -6155,6 +6349,83 @@ window.__ModuleLoader__.load({
|
|
|
6155
6349
|
const pinnedSet = React.useMemo(() => new Set(pinnedSessionIds), [pinnedSessionIds])
|
|
6156
6350
|
const subCounts = React.useMemo(() => subagentRunningCounts(list ? list.byId : {}), [list ? list.byId : null])
|
|
6157
6351
|
|
|
6352
|
+
/* ------------- auto appearance for new items (v0.24.0) -------------- */
|
|
6353
|
+
// One mount-scoped ledger of what has already been accounted for, so an
|
|
6354
|
+
// item is NEVER assigned twice and NEVER overwritten:
|
|
6355
|
+
// · a session counts as new only while the wire still reports it blank —
|
|
6356
|
+
// the trustworthy birth mark this plugin already relies on elsewhere
|
|
6357
|
+
// (pre-existing sessions are never blank, so a reload can never restyle
|
|
6358
|
+
// the inventory, and a late-arriving old row is not restyled either);
|
|
6359
|
+
// · a workspace counts as new only once the FIRST authoritative inventory
|
|
6360
|
+
// has been recorded (`phase: 'ready'` with a settled stream), so the
|
|
6361
|
+
// progressive fill of the workspace list cannot masquerade as creation.
|
|
6362
|
+
// The ledger is maintained even while the toggle is OFF — that is exactly
|
|
6363
|
+
// what keeps items created during the off period from being styled later.
|
|
6364
|
+
// Existing styling wins: an entry the user set (or one pulled from the
|
|
6365
|
+
// host copy) makes the item skip, so nothing manual is ever repainted.
|
|
6366
|
+
const autoSeenRef = React.useRef(null)
|
|
6367
|
+
React.useEffect(() => {
|
|
6368
|
+
if (autoSeenRef.current === null) {
|
|
6369
|
+
autoSeenRef.current = {
|
|
6370
|
+
sessions: new Set(), workspaces: new Set(), sessionsSeeded: false, seeded: false,
|
|
6371
|
+
}
|
|
6372
|
+
}
|
|
6373
|
+
const seen = autoSeenRef.current
|
|
6374
|
+
const pending = []
|
|
6375
|
+
// Sessions: the FIRST authoritative session snapshot that actually
|
|
6376
|
+
// carries rows seeds the ledger — a blank row that already existed when
|
|
6377
|
+
// the toggle (or this mount) started is pre-existing, so it is recorded
|
|
6378
|
+
// WITHOUT being styled. That makes "only items created after you turn it
|
|
6379
|
+
// on" exact, and it is the same shape as the workspace seeding below.
|
|
6380
|
+
//
|
|
6381
|
+
// The seed flag is set only when a snapshot really registered something:
|
|
6382
|
+
// a cold-started Host can answer `ready` with an EMPTY list while the
|
|
6383
|
+
// real rows are still on their way, and a flag consumed there would style
|
|
6384
|
+
// every pre-existing row that shows up next (observed once in eight cold
|
|
6385
|
+
// starts). An intermediate snapshot therefore leaves the flag alone and
|
|
6386
|
+
// the next populated one seeds instead. `phase` is 'pending' | 'ready' in
|
|
6387
|
+
// the Host contract; an older host without the field counts as ready.
|
|
6388
|
+
if (list && list.byId && list.phase !== 'pending') {
|
|
6389
|
+
let sessionRowsSeen = false
|
|
6390
|
+
for (const id of Object.keys(list.byId)) {
|
|
6391
|
+
const summary = list.byId[id]
|
|
6392
|
+
if (!summary || summary.blank !== true || seen.sessions.has(id)) continue
|
|
6393
|
+
sessionRowsSeen = true
|
|
6394
|
+
if (!seen.sessionsSeeded) { seen.sessions.add(id); continue }
|
|
6395
|
+
seen.sessions.add(id)
|
|
6396
|
+
if (!autoStyle || stylingMap['session:' + id]) continue
|
|
6397
|
+
const color = autoStyler.nextColor()
|
|
6398
|
+
if (color) pending.push(['session:' + id, { color }])
|
|
6399
|
+
}
|
|
6400
|
+
if (sessionRowsSeen) seen.sessionsSeeded = true
|
|
6401
|
+
}
|
|
6402
|
+
// Workspaces: same rule — the first authoritative inventory that actually
|
|
6403
|
+
// has rows seeds; an empty `ready` snapshot must not consume the flag.
|
|
6404
|
+
if (phase === 'ready' && workspaceStreamState !== 'loading') {
|
|
6405
|
+
let workspaceRowsSeen = false
|
|
6406
|
+
for (const workspace of items || []) {
|
|
6407
|
+
const id = workspace ? workspace.workspaceId : undefined
|
|
6408
|
+
if (id === undefined || id === null) continue
|
|
6409
|
+
workspaceRowsSeen = true
|
|
6410
|
+
if (!seen.seeded) { seen.workspaces.add(id); continue }
|
|
6411
|
+
if (seen.workspaces.has(id)) continue
|
|
6412
|
+
seen.workspaces.add(id)
|
|
6413
|
+
if (!autoStyle || stylingMap['workspace:' + id]) continue
|
|
6414
|
+
// Colors and icons draw from independent bags; a host that exports
|
|
6415
|
+
// none of the pool icons still gets the color.
|
|
6416
|
+
const value = {}
|
|
6417
|
+
const color = autoStyler.nextColor()
|
|
6418
|
+
if (color) value.color = color
|
|
6419
|
+
const icon = autoStyler.nextIcon()
|
|
6420
|
+
if (icon) value.icon = icon
|
|
6421
|
+
if (Object.keys(value).length > 0) pending.push(['workspace:' + id, value])
|
|
6422
|
+
}
|
|
6423
|
+
if (workspaceRowsSeen) seen.seeded = true
|
|
6424
|
+
}
|
|
6425
|
+
// One batched write: local store + the host copy in a single update.
|
|
6426
|
+
if (pending.length > 0) shared.setStylingMany(pending)
|
|
6427
|
+
}, [autoStyle, list ? list.byId : null, items, phase, workspaceStreamState, stylingMap])
|
|
6428
|
+
|
|
6158
6429
|
/* --------------- shipped-browser channel (0.1.7-rc.2) --------------- */
|
|
6159
6430
|
// Read per render, never memoized: the shipped entry registers beside the
|
|
6160
6431
|
// slot declaration and the ledger must be re-read until it lands.
|