@gemboss/ui 0.35.0 → 0.35.7
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/CHANGELOG.md +109 -0
- package/catalog/editor.html +1 -1
- package/catalog/index.html +3 -3
- package/gemboss-ui.css +3 -3
- package/package.json +1 -1
- package/parts/components.css +1 -1
- package/parts/core.css +1 -1
- package/parts/shell.css +2 -2
- package/src/assistant/chat-markdown.ts +5 -0
- package/src/assistant/chat.tsx +5 -2
- package/src/chat-plain.js +3 -3
- package/src/chat.css +1 -1
- package/src/collections.css +1 -1
- package/src/editor.css +1 -1
- package/src/shell.css +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,115 @@
|
|
|
2
2
|
|
|
3
3
|
Versions up to 0.9.0 are described in the README, each in the section that introduced it.
|
|
4
4
|
|
|
5
|
+
## 0.35.7 (15/10/2026)
|
|
6
|
+
|
|
7
|
+
**The rail's scrollbar runs down the rail's edge.** The 12px side gutter was padding on `.icon-nav`, so the scroll box
|
|
8
|
+
(`.gnav-scroll`) ended 12px short of the rail's border and its bar ran down the middle of the gutter, right against the
|
|
9
|
+
count pills. GemFactory's rail is long enough to scroll and showed it (Chris 15/10/2026: "cái vertical scroll bar nó
|
|
10
|
+
không đúng vị trí"); the admin's rail rarely scrolls, which is why nobody saw it there. Measured on GemFactory's own
|
|
11
|
+
rail at 1280: scroll box 12–227, rail 0–239.
|
|
12
|
+
|
|
13
|
+
Fixed
|
|
14
|
+
- The gutter pads `.gnav-scroll` (`padding-inline: 12px`) and `.gnav-bottom` (`padding: 0 12px 12px`) instead of
|
|
15
|
+
`.icon-nav` (now `padding: 12px 0 0`). The scroll box spans the rail (0–239), so the bar sits on the edge; every row
|
|
16
|
+
stays where it was (12–227 at 1280, 12–287 in the 300px phone drawer), and the bottom part too.
|
|
17
|
+
|
|
18
|
+
Note
|
|
19
|
+
- `Rail` holds `RailScroll` and `RailBottom`. Something placed straight inside `Rail` (not in either) no longer gets the
|
|
20
|
+
12px gutter from the rail; no surface in this repo or GemFactory does that.
|
|
21
|
+
|
|
22
|
+
Tests: `rail-scrollbar-browser.test.tsx` (Chromium, built gemboss-ui.css, real `AppShell` on a rail that scrolls: the
|
|
23
|
+
scroll box spans the rail and rows keep their gutter at 1280 and in the open drawer at 390; negative control: the 0.35.6
|
|
24
|
+
rule appended over the sheet must fail). `launcher.test.tsx` measured "a full row" as the rail's width minus the rail's
|
|
25
|
+
own padding, which is no longer where the gutter is: it now measures the row box the launcher sits in, and also holds the
|
|
26
|
+
launcher to a real rail item's width (both 215 at every desktop width, as before).
|
|
27
|
+
|
|
28
|
+
## 0.35.6 (14/10/2026)
|
|
29
|
+
|
|
30
|
+
**A link inside bold is a bold link.** Bold and italic were drawn as plain text whatever they held, so a link or a code
|
|
31
|
+
span inside them reached the reader as raw brackets and a path: `**[Proof listicle](/app/funnels?open=cmp_2): B won.**`
|
|
32
|
+
drew `[Proof listicle](/app/funnels?open=cmp_2): B won.` in bold. A model bolds the line that leads a list item, and that is
|
|
33
|
+
the line it puts its link on (the weekly market loop's report in GemBoss admin, 14/10/2026).
|
|
34
|
+
|
|
35
|
+
Fixed
|
|
36
|
+
- `ChatMarkdown` and `chat-plain.js` draw the inside of `**…**` and `*…*` as inline markdown: one `<strong>` holding the
|
|
37
|
+
link and the text around it, as GitHub draws it. A link the parser refuses is still refused, its words kept; plain
|
|
38
|
+
emphasis is drawn as before. One level deep: the inside of `**…**` / `*…*` holds no `*`.
|
|
39
|
+
- A link inside `<strong>` is as bold as the words around it: `strong > .gemboss-ec-md-link { font-weight: inherit }`
|
|
40
|
+
(its own `600` drew it thinner than the 700 around it).
|
|
41
|
+
- `parseInline` is unchanged: a `bold` / `italic` token still carries its inside as written. A renderer of its own (the
|
|
42
|
+
GemBoss admin's `MarkdownLite`) draws the same by rendering that text through `parseInline` again.
|
|
43
|
+
|
|
44
|
+
Changed
|
|
45
|
+
- A picture inside emphasis (`****`) was bold text with its brackets; it now follows the rules it follows
|
|
46
|
+
anywhere: drawn from a fleet host, else a link labelled with its alt.
|
|
47
|
+
|
|
48
|
+
## 0.35.5 (14/10/2026)
|
|
49
|
+
|
|
50
|
+
**The ← Back is a plain arrow when it is a button.** `EditorBack` draws a `<button>` unless it is given a link (`as={Link}`),
|
|
51
|
+
and `.gemboss-editor-back` set its size and colours but not the button's own border and background: as a button it wore
|
|
52
|
+
the browser's default, a 2px outset border on grey. Seen in the Studio's bar, whose way out became a ← on 14/10/2026.
|
|
53
|
+
|
|
54
|
+
Fixed
|
|
55
|
+
- `.gemboss-editor-back` resets `border`, `background`, `padding` and `font-family`; hover, active and focus are unchanged.
|
|
56
|
+
|
|
57
|
+
## 0.35.4 (13/10/2026)
|
|
58
|
+
|
|
59
|
+
**What the seller wrote reads on their own bubble, and an answer reads in dark theme.** The admin chat draws the seller's
|
|
60
|
+
words as markdown, inside the dark user bubble, with the answer bubble's colours: a pasted link was black on near-black
|
|
61
|
+
(1.23:1), and a `code`, a quote, a heading, a table or a code block 1.07 to 2.75:1. Those markdown parts read three tokens
|
|
62
|
+
no theme defines (`--gemboss-text-subdued`, `--gemboss-border`, `--gemboss-surface-subdued`), so the answer bubble in dark
|
|
63
|
+
theme had the same fault (1.12 to 2.89:1).
|
|
64
|
+
|
|
65
|
+
Fixed
|
|
66
|
+
- `.gemboss-ec-msg.user .gemboss-ec-md-link` takes the bubble's own text colour, underlined in it: 17:1 in both themes.
|
|
67
|
+
- The seller's bubble, and the answer bubble in dark theme, derive the three tokens from their own text colour: every part
|
|
68
|
+
9.4:1 or more. A light answer bubble keeps the old values exactly.
|
|
69
|
+
- A chat link has a focus ring in its own colour (`outline: 2px solid currentColor`), not the browser's default.
|
|
70
|
+
|
|
71
|
+
Also in this release: 0.35.3 (#4118), merged and not published until now.
|
|
72
|
+
|
|
73
|
+
## 0.35.3 (12/10/2026)
|
|
74
|
+
|
|
75
|
+
**An inspector field's controls are a finger's size.** A picked element's own panel on the funnel canvas (Settings |
|
|
76
|
+
Advanced) drew its controls small on a phone: number boxes, selects and toggles 21 to 27px tall, the sides-link and clear
|
|
77
|
+
buttons 16 to 20px (measured 12/10/2026 at 320 and 390 with touch). The tabs, group heads and swatches were 44px already
|
|
78
|
+
(0.30.3); the fields were not.
|
|
79
|
+
|
|
80
|
+
Fixed
|
|
81
|
+
- Under `(pointer: coarse)`: every input (not a checkbox or radio), select and button inside a `.gemboss-ei-fld` has
|
|
82
|
+
`min-height: 44px`, and a button or a colour well (`input[type=color]`) `min-width: 44px`. A mouse sees no change. A
|
|
83
|
+
section's fields in the same inspector get it too.
|
|
84
|
+
|
|
85
|
+
## 0.35.2 (12/10/2026)
|
|
86
|
+
|
|
87
|
+
**A folded index table's title is a 24px target.** visual-gate on partner-radar's list pages (/companies, /invites, /posts,
|
|
88
|
+
12/10/2026) flagged `a.ui-table__title` at 20px at every narrow width (a link in a list is 24px at least, WCAG 2.5.8).
|
|
89
|
+
|
|
90
|
+
Fixed
|
|
91
|
+
- Folded (container ≤ 768px): `a.ui-table__title` gets `padding-block: 2px; margin-block: -2px` and is drawn above the line
|
|
92
|
+
under it (`position: relative; z-index: 1`). Its box is 24px, every line of the row stays where it was, and a press on the
|
|
93
|
+
2px it reaches into the next line is the link's. A press anywhere else on the row still opens it through the script
|
|
94
|
+
(kit-plain.js / IndexTable), not an overlay, so text in the row stays selectable. Unfolded (a table) nothing changes.
|
|
95
|
+
|
|
96
|
+
Also in this release: 0.35.1 (#4086), merged and not published until now.
|
|
97
|
+
|
|
98
|
+
## 0.35.1 (12/10/2026)
|
|
99
|
+
|
|
100
|
+
**The left column has one inset.** An editor's left column (`.gemboss-ec`) padded its parts differently: the chat 16px,
|
|
101
|
+
the Configure body and the tab row 12px, a PanelHeader 12px (Chris 12/10/2026, the funnel Studio: "cần consistency về
|
|
102
|
+
padding"). They now all read `--gemboss-ec-inset`, declared on `.gemboss-ec`: 16px, 12px at ≤640px (the chat's phone
|
|
103
|
+
value). Outside a `.gemboss-ec` each rule falls back to the value it had.
|
|
104
|
+
|
|
105
|
+
Changed
|
|
106
|
+
- `.gemboss-ec`: declares `--gemboss-ec-inset` in `chat.css`, on the chat's root class. A surface with `editor.css` and no
|
|
107
|
+
`chat.css` keeps each rule's fallback, the value it had.
|
|
108
|
+
- Every chat whose root is `.gemboss-ec`, not only an editor's (the admin's Assistant page, the operator chat): at ≤640px
|
|
109
|
+
the head's sides go from 16px to 12px, in line with its message list, which was 12px there already.
|
|
110
|
+
- `.gemboss-ec-head`, `.gemboss-ec-scroll` (chat.css), `.gemboss-ec-tabs` (sides), `.gemboss-ec-dock-body` (editor.css) read it.
|
|
111
|
+
- `.gemboss-ec > .gemboss-ei-head`: a PanelHeader in the column keeps the column's inset at its sides; floating, 12px.
|
|
112
|
+
- A docked inspector in the column (`.gemboss-ec .gemboss-ei--docked`): its head, tabs and pane read it too.
|
|
113
|
+
|
|
5
114
|
## 0.35.0 (12/10/2026)
|
|
6
115
|
|
|
7
116
|
**Sheet: a record opened beside its list.** The kit popup docked to the right edge (Chris 12/10/2026, partner-radar: "bấm
|
package/catalog/editor.html
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
.cat-code summary{padding:10px 16px;font-size:13px;cursor:pointer;color:var(--gemboss-text-muted);border-top:1px solid var(--gemboss-divider);min-height:24px}
|
|
9
9
|
.cat-code pre,.cat-api{margin:0;padding:12px 16px;overflow:auto;background:#0f1012;color:#e8e8e6;font-size:12px;line-height:1.5;border-radius:0}
|
|
10
10
|
.cat-api{border-radius:12px;margin:0 0 16px}</style></head><body><div class="cat">
|
|
11
|
-
<h1>@gemboss/ui 0.35.
|
|
11
|
+
<h1>@gemboss/ui 0.35.7 · Editor</h1>
|
|
12
12
|
<p>Khung của mọi editor: <code>EditorFrame</code> (cột trái · khe kéo · preview · cột phải dock trên mép phải preview) và <code>EditorTopbar</code> (← · tiêu đề · cụm giữa · cụm phải · dòng trạng thái). Là đúng khung của theme / page / section editor trong admin. Gói chỉ vẽ KHUNG; chat, Configure, canvas, page picker, menu, Publish là của editor, đi vào bằng slot. Trang HTML thuần nạp <code>editor.css</code> + <code>editor-plain.js</code> rồi gọi <code>gembossUI.initEditorFrame()</code>: kéo khe (chuột, chạm, phím mũi tên / Home / End), đổi thiết bị, mở ⋯ và Publish ▾, ẩn cột trái, Chat | Preview trên điện thoại. <a href="index.html">← Catalog</a></p>
|
|
13
13
|
<h2>React</h2><pre class="cat-api"><code>import "@gemboss/ui/editor.css";
|
|
14
14
|
import { EditorFrame, EditorTopbar, EditorBack, EditorChatToggle, EditorPaneTabs, EditorSaveState, DeviceToggle } from "@gemboss/ui/editor";
|
package/catalog/index.html
CHANGED
|
@@ -27,7 +27,7 @@ body{margin:0;background:var(--gemboss-app-bg,#f1f1f1);color:var(--gemboss-text)
|
|
|
27
27
|
@media (max-width:760px){.cat{grid-template-columns:1fr;padding:16px}.cat-nav{position:static;flex-direction:row;flex-wrap:wrap}}
|
|
28
28
|
</style></head><body>
|
|
29
29
|
<div class="cat"><nav class="cat-nav" aria-label="Mục"><a href="#tokens">Token</a><a href="#buttons">Nút</a><a href="#fields">Ô nhập</a><a href="#choice">Tab, nhóm nút, thẻ</a><a href="#surfaces">Thẻ, số liệu, bảng, trạng thái trống</a><a href="#report">Báo cáo</a><a href="#collections">Bảng, list, lưới, board</a><a href="#resizer">Thanh kéo giữa hai cột</a><a href="#modal">Hộp thoại, toast, menu (JS thuần)</a><a href="#sheet">Ngăn trượt cạnh phải</a><a href="#settings">Hộp cài đặt</a><a href="#shell">Khung app</a><a href="#nav">Chờ điều hướng</a><a href="#page">Bề rộng nội dung</a><a href="#portal">Cổng công khai: tab trên topbar, tìm kiếm, sáng / tối, người dẫn đầu</a><a href="#auth">Đăng nhập</a><a href="#setup">Hướng dẫn thiết lập</a><a href="#chat">Thân chat</a><a href="#reactions">Reactions</a><a href="#action-card">Thẻ hành động</a><a href="#assistant-engine">Trợ lý: chọn engine</a><a href="#assistant-bridge">Trợ lý: cầu nối trên máy (0.32.0)</a><a href="#assistant-chat">Trợ lý: khung chat (0.29.0)</a><a href="#assistant">Trợ lý: cột phiên</a><a href="#icons">Icon</a><a href="#editor">Editor</a></nav>
|
|
30
|
-
<main><header class="cat-head"><h1>@gemboss/ui 0.35.
|
|
30
|
+
<main><header class="cat-head"><h1>@gemboss/ui 0.35.7</h1><p>Ngôn ngữ thiết kế chung của các công cụ GemBoss. Markup dưới mỗi ví dụ là đúng thứ package render ra; bề mặt không dùng React (HTML tĩnh, Python) chép markup này và nạp <code>gemboss-ui.css</code>. Dựng từ gemboss <code>2b39ddd48ea9</code>.</p></header>
|
|
31
31
|
<section id="tokens"><h2>Token</h2><p>Đổi giao diện một bề mặt bằng cách đặt lại token, không viết đè class. Tên và giá trị đọc thẳng từ gemboss-ui.css.</p><div class="cat-swatches"><div class="cat-swatch"><i style="background:var(--gemboss-primary)"></i><code>--gemboss-primary</code><span>#1b1c1e</span></div><div class="cat-swatch"><i style="background:var(--gemboss-primary-dark)"></i><code>--gemboss-primary-dark</code><span>#000000</span></div><div class="cat-swatch"><i style="background:var(--gemboss-primary-soft)"></i><code>--gemboss-primary-soft</code><span>#f2f3f5</span></div><div class="cat-swatch"><i style="background:var(--gemboss-accent)"></i><code>--gemboss-accent</code><span>#5661f5</span></div><div class="cat-swatch"><i style="background:var(--gemboss-accent-strong)"></i><code>--gemboss-accent-strong</code><span>#3a44de</span></div><div class="cat-swatch"><i style="background:var(--gemboss-accent-soft)"></i><code>--gemboss-accent-soft</code><span>#eef0fe</span></div><div class="cat-swatch"><i style="background:var(--gemboss-text-strong)"></i><code>--gemboss-text-strong</code><span>#1b1c1e</span></div><div class="cat-swatch"><i style="background:var(--gemboss-text)"></i><code>--gemboss-text</code><span>#1b1c1e</span></div><div class="cat-swatch"><i style="background:var(--gemboss-text-muted)"></i><code>--gemboss-text-muted</code><span>#686b71</span></div><div class="cat-swatch"><i style="background:var(--gemboss-surface)"></i><code>--gemboss-surface</code><span>#ffffff</span></div><div class="cat-swatch"><i style="background:var(--gemboss-canvas)"></i><code>--gemboss-canvas</code><span>#ffffff</span></div><div class="cat-swatch"><i style="background:var(--gemboss-preview-canvas)"></i><code>--gemboss-preview-canvas</code><span>#eceef1</span></div><div class="cat-swatch"><i style="background:var(--gemboss-rail-bg)"></i><code>--gemboss-rail-bg</code><span>#ffffff</span></div><div class="cat-swatch"><i style="background:var(--gemboss-panel-bg)"></i><code>--gemboss-panel-bg</code><span>#ffffff</span></div><div class="cat-swatch"><i style="background:var(--gemboss-divider)"></i><code>--gemboss-divider</code><span>#e5e7ea</span></div><div class="cat-swatch"><i style="background:var(--gemboss-divider-soft)"></i><code>--gemboss-divider-soft</code><span>#edeff2</span></div><div class="cat-swatch"><i style="background:var(--gemboss-hover)"></i><code>--gemboss-hover</code><span>#eceef2</span></div><div class="cat-swatch"><i style="background:var(--gemboss-active-bg)"></i><code>--gemboss-active-bg</code><span>#f0f1f4</span></div><div class="cat-swatch"><i style="background:var(--gemboss-active-fg)"></i><code>--gemboss-active-fg</code><span>#1b1c1e</span></div><div class="cat-swatch"><i style="background:var(--gemboss-danger)"></i><code>--gemboss-danger</code><span>#d72c0d</span></div><div class="cat-swatch"><i style="background:var(--gemboss-danger-strong)"></i><code>--gemboss-danger-strong</code><span>#b42318</span></div><div class="cat-swatch"><i style="background:var(--gemboss-danger-soft)"></i><code>--gemboss-danger-soft</code><span>#fff0e9</span></div><div class="cat-swatch"><i style="background:var(--gemboss-danger-border)"></i><code>--gemboss-danger-border</code><span>#f5c9bc</span></div><div class="cat-swatch"><i style="background:var(--gemboss-success)"></i><code>--gemboss-success</code><span>#007f5f</span></div><div class="cat-swatch"><i style="background:var(--gemboss-success-strong)"></i><code>--gemboss-success-strong</code><span>#0a6a4c</span></div><div class="cat-swatch"><i style="background:var(--gemboss-success-soft)"></i><code>--gemboss-success-soft</code><span>#e3f1df</span></div><div class="cat-swatch"><i style="background:var(--gemboss-success-border)"></i><code>--gemboss-success-border</code><span>#b7dfcd</span></div><div class="cat-swatch"><i style="background:var(--gemboss-warning)"></i><code>--gemboss-warning</code><span>#9a6700</span></div><div class="cat-swatch"><i style="background:var(--gemboss-warning-soft)"></i><code>--gemboss-warning-soft</code><span>#fff8e0</span></div><div class="cat-swatch"><i style="background:var(--gemboss-warning-border)"></i><code>--gemboss-warning-border</code><span>#f5d569</span></div><div class="cat-swatch"><i style="background:var(--gemboss-dark-bg)"></i><code>--gemboss-dark-bg</code><span>#0a0a0c</span></div><div class="cat-swatch"><i style="background:var(--gemboss-dark-rail)"></i><code>--gemboss-dark-rail</code><span>#0e0e11</span></div><div class="cat-swatch"><i style="background:var(--gemboss-dark-surface)"></i><code>--gemboss-dark-surface</code><span>#16161a</span></div><div class="cat-swatch"><i style="background:var(--gemboss-dark-surface-2)"></i><code>--gemboss-dark-surface-2</code><span>#1e1e24</span></div><div class="cat-swatch"><i style="background:var(--gemboss-dark-divider)"></i><code>--gemboss-dark-divider</code><span>#2a2a31</span></div><div class="cat-swatch"><i style="background:var(--gemboss-dark-text)"></i><code>--gemboss-dark-text</code><span>#ededf0</span></div><div class="cat-swatch"><i style="background:var(--gemboss-dark-muted)"></i><code>--gemboss-dark-muted</code><span>#9a9aa4</span></div><div class="cat-swatch"><i style="background:var(--gemboss-field-bg)"></i><code>--gemboss-field-bg</code><span>#fdfdfd</span></div><div class="cat-swatch"><i style="background:var(--gemboss-field-bg-hover)"></i><code>--gemboss-field-bg-hover</code><span>#fafafa</span></div><div class="cat-swatch"><i style="background:var(--gemboss-field-ink)"></i><code>--gemboss-field-ink</code><span>#303030</span></div><div class="cat-swatch"><i style="background:var(--gemboss-field-placeholder)"></i><code>--gemboss-field-placeholder</code><span>#616161</span></div><div class="cat-swatch"><i style="background:var(--gemboss-field-line)"></i><code>--gemboss-field-line</code><span>#8a8a8a</span></div><div class="cat-swatch"><i style="background:var(--gemboss-field-line-hover)"></i><code>--gemboss-field-line-hover</code><span>#616161</span></div><div class="cat-swatch"><i style="background:var(--gemboss-field-line-active)"></i><code>--gemboss-field-line-active</code><span>#1a1a1a</span></div><div class="cat-swatch"><i style="background:var(--gemboss-chip-ink)"></i><code>--gemboss-chip-ink</code><span>#303633</span></div><div class="cat-swatch"><i style="background:var(--gemboss-chip-line)"></i><code>--gemboss-chip-line</code><span>#cfd6ce</span></div><div class="cat-swatch"><i style="background:var(--gemboss-chip-line-hover)"></i><code>--gemboss-chip-line-hover</code><span>#aab4ad</span></div><div class="cat-swatch"><i style="background:var(--gemboss-chip-bg-hover)"></i><code>--gemboss-chip-bg-hover</code><span>#f6f7f5</span></div><div class="cat-swatch"><i style="background:var(--gemboss-on-primary)"></i><code>--gemboss-on-primary</code><span>#ffffff</span></div><div class="cat-swatch"><i style="background:var(--gemboss-app-bg)"></i><code>--gemboss-app-bg</code><span>#ffffff</span></div></div><table class="ui-table cat-scale"><thead><tr><th>Token</th><th>Giá trị</th><th>Mẫu</th></tr></thead><tbody><tr><td><code>--gemboss-fs-micro</code></td><td>11px</td><td style="font-size:var(--gemboss-fs-micro)">Ngôn ngữ thiết kế chung</td></tr><tr><td><code>--gemboss-fs-caption</code></td><td>12px</td><td style="font-size:var(--gemboss-fs-caption)">Ngôn ngữ thiết kế chung</td></tr><tr><td><code>--gemboss-fs-body</code></td><td>14px</td><td style="font-size:var(--gemboss-fs-body)">Ngôn ngữ thiết kế chung</td></tr><tr><td><code>--gemboss-fs-body-lg</code></td><td>16px</td><td style="font-size:var(--gemboss-fs-body-lg)">Ngôn ngữ thiết kế chung</td></tr><tr><td><code>--gemboss-fs-h3</code></td><td>16px</td><td style="font-size:var(--gemboss-fs-h3)">Ngôn ngữ thiết kế chung</td></tr><tr><td><code>--gemboss-fs-h2</code></td><td>20px</td><td style="font-size:var(--gemboss-fs-h2)">Ngôn ngữ thiết kế chung</td></tr><tr><td><code>--gemboss-fs-h1</code></td><td>24px</td><td style="font-size:var(--gemboss-fs-h1)">Ngôn ngữ thiết kế chung</td></tr><tr><td><code>--gemboss-fs-display</code></td><td>30px</td><td style="font-size:var(--gemboss-fs-display)">Ngôn ngữ thiết kế chung</td></tr><tr><td><code>--gemboss-radius-xs</code></td><td>4px</td><td><i class="cat-radius" style="border-radius:var(--gemboss-radius-xs)"></i></td></tr><tr><td><code>--gemboss-radius-sm</code></td><td>6px</td><td><i class="cat-radius" style="border-radius:var(--gemboss-radius-sm)"></i></td></tr><tr><td><code>--gemboss-radius-md</code></td><td>8px</td><td><i class="cat-radius" style="border-radius:var(--gemboss-radius-md)"></i></td></tr><tr><td><code>--gemboss-radius-lg</code></td><td>12px</td><td><i class="cat-radius" style="border-radius:var(--gemboss-radius-lg)"></i></td></tr><tr><td><code>--gemboss-radius-xl</code></td><td>16px</td><td><i class="cat-radius" style="border-radius:var(--gemboss-radius-xl)"></i></td></tr><tr><td><code>--gemboss-radius-2xl</code></td><td>20px</td><td><i class="cat-radius" style="border-radius:var(--gemboss-radius-2xl)"></i></td></tr><tr><td><code>--gemboss-radius-full</code></td><td>999px</td><td><i class="cat-radius" style="border-radius:var(--gemboss-radius-full)"></i></td></tr><tr><td><code>--gemboss-shadow-resting</code></td><td class="cat-small">0 1px 2px rgba(31, 30, 29, 0.04), 0 2px 6px rgba(31, 30, 29, 0.06)</td><td><i class="cat-radius" style="box-shadow:var(--gemboss-shadow-resting);border:0"></i></td></tr><tr><td><code>--gemboss-shadow-raised</code></td><td class="cat-small">0 4px 16px rgba(31, 30, 29, 0.10)</td><td><i class="cat-radius" style="box-shadow:var(--gemboss-shadow-raised);border:0"></i></td></tr><tr><td><code>--gemboss-shadow-overlay</code></td><td class="cat-small">0 16px 48px rgba(31, 30, 29, 0.18)</td><td><i class="cat-radius" style="box-shadow:var(--gemboss-shadow-overlay);border:0"></i></td></tr></tbody></table></section>
|
|
32
32
|
<section id="buttons"><h2>Nút</h2><p>Một lớp <code>ui-btn</code>, ba biến thể, tông đỏ, một cỡ nhỏ. Cao 28px dưới chuột như Button của Polaris (ô nhập và ô chọn 32, như TextField), 44px dưới ngón tay và ở khổ điện thoại, cỡ nhỏ cũng vậy. Dùng được trên <code><button></code> lẫn <code><a></code> (căn giữa sẵn).</p><figure class="cat-demo"><figcaption>Mặc định · chính · ghost · nhỏ · tắt</figcaption><div class="cat-live"><div class="cat-row"><button type="button" class="ui-btn">Lưu nháp</button><button type="button" class="ui-btn ui-btn--primary">Xuất bản</button><button type="button" class="ui-btn ui-btn--ghost">Huỷ</button><button type="button" class="ui-btn ui-btn--sm">Nhỏ</button><button type="button" class="ui-btn ui-btn--primary" disabled>Đang lưu…</button><a class="ui-btn" href="#buttons">Link dạng nút</a></div></div><details class="cat-code"><summary>Markup</summary><pre><code><div class="cat-row">
|
|
33
33
|
<button type="button" class="ui-btn">Lưu nháp</button>
|
|
@@ -5856,7 +5856,7 @@ body{margin:0;background:var(--gemboss-app-bg,#f1f1f1);color:var(--gemboss-text)
|
|
|
5856
5856
|
</div>
|
|
5857
5857
|
</div>
|
|
5858
5858
|
</div></code></pre></details></figure></section>
|
|
5859
|
-
<section id="assistant"><h2>Trợ lý: cột phiên</h2><p><code>SessionRail</code> (React). Khung toàn màn hình / cửa sổ nổi / cột phải cao hết màn (<code>allowSide</code>) / thanh là <code>AssistantHost</code>, cần React vì có trạng thái.</p><figure class="cat-demo"><figcaption>SessionRail</figcaption><div class="cat-live"><div style="height:360px;display:flex"><aside class="gemboss-assistant-rail"><div class="gemboss-assistant-rail-top"><button type="button" class="gemboss-assistant-newchat" title="Phiên mới"><svg viewBox="0 0 20 20" aria-hidden="true" focusable="false"><g fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"><path d="M11 4H5.5A1.5 1.5 0 0 0 4 5.5v9A1.5 1.5 0 0 0 5.5 16h9a1.5 1.5 0 0 0 1.5-1.5V9"></path><path d="M14.5 3.5l2 2L10 12H8v-2z"></path></g></svg><span>Phiên mới</span></button><button type="button" class="gemboss-assistant-collapse" aria-label="Collapse sidebar" title="Collapse"><svg viewBox="0 0 20 20" aria-hidden="true" focusable="false"><g fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"><path d="M12 5l-5 5 5 5"></path></g></svg></button></div><div class="gemboss-assistant-search gemboss-field gemboss-field--group"><svg viewBox="0 0 20 20" aria-hidden="true" focusable="false"><g fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"><circle cx="9" cy="9" r="5"></circle><path d="M13 13l3.5 3.5"></path></g></svg><input class="gemboss-field__bare" placeholder="Tìm phiên…" aria-label="Search history" value=""/><kbd class="gemboss-assistant-kbd">/</kbd></div><div class="gemboss-assistant-threads"><div class="gemboss-assistant-group"><div class="gemboss-assistant-group-label">Đã ghim</div><div class="gemboss-assistant-thread"><button type="button" class="gemboss-assistant-thread-main" title="So sánh advertorial với listicle"><span class="gemboss-assistant-thread-titlerow"><svg viewBox="0 0 20 20" class="gemboss-assistant-pin-dot" aria-hidden="true" focusable="false"><path d="M8 3.5h4l-.5 5 2.5 2.5H6l2.5-2.5z" fill="currentColor"></path><path d="M10 11v5.5" stroke="currentColor" stroke-width="1.6" stroke-linecap="round"></path></svg><span class="gemboss-assistant-thread-title">So sánh advertorial với listicle</span></span><span class="gemboss-assistant-thread-meta">
|
|
5859
|
+
<section id="assistant"><h2>Trợ lý: cột phiên</h2><p><code>SessionRail</code> (React). Khung toàn màn hình / cửa sổ nổi / cột phải cao hết màn (<code>allowSide</code>) / thanh là <code>AssistantHost</code>, cần React vì có trạng thái.</p><figure class="cat-demo"><figcaption>SessionRail</figcaption><div class="cat-live"><div style="height:360px;display:flex"><aside class="gemboss-assistant-rail"><div class="gemboss-assistant-rail-top"><button type="button" class="gemboss-assistant-newchat" title="Phiên mới"><svg viewBox="0 0 20 20" aria-hidden="true" focusable="false"><g fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"><path d="M11 4H5.5A1.5 1.5 0 0 0 4 5.5v9A1.5 1.5 0 0 0 5.5 16h9a1.5 1.5 0 0 0 1.5-1.5V9"></path><path d="M14.5 3.5l2 2L10 12H8v-2z"></path></g></svg><span>Phiên mới</span></button><button type="button" class="gemboss-assistant-collapse" aria-label="Collapse sidebar" title="Collapse"><svg viewBox="0 0 20 20" aria-hidden="true" focusable="false"><g fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"><path d="M12 5l-5 5 5 5"></path></g></svg></button></div><div class="gemboss-assistant-search gemboss-field gemboss-field--group"><svg viewBox="0 0 20 20" aria-hidden="true" focusable="false"><g fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"><circle cx="9" cy="9" r="5"></circle><path d="M13 13l3.5 3.5"></path></g></svg><input class="gemboss-field__bare" placeholder="Tìm phiên…" aria-label="Search history" value=""/><kbd class="gemboss-assistant-kbd">/</kbd></div><div class="gemboss-assistant-threads"><div class="gemboss-assistant-group"><div class="gemboss-assistant-group-label">Đã ghim</div><div class="gemboss-assistant-thread"><button type="button" class="gemboss-assistant-thread-main" title="So sánh advertorial với listicle"><span class="gemboss-assistant-thread-titlerow"><svg viewBox="0 0 20 20" class="gemboss-assistant-pin-dot" aria-hidden="true" focusable="false"><path d="M8 3.5h4l-.5 5 2.5 2.5H6l2.5-2.5z" fill="currentColor"></path><path d="M10 11v5.5" stroke="currentColor" stroke-width="1.6" stroke-linecap="round"></path></svg><span class="gemboss-assistant-thread-title">So sánh advertorial với listicle</span></span><span class="gemboss-assistant-thread-meta">5/9/2026</span></button><div class="gemboss-assistant-thread-actions"><button type="button" class="gemboss-assistant-thread-act" aria-label="Options"><svg viewBox="0 0 20 20" aria-hidden="true" focusable="false"><g fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"><circle cx="5" cy="10" r=".8"></circle><circle cx="10" cy="10" r=".8"></circle><circle cx="15" cy="10" r=".8"></circle></g></svg></button></div></div></div><div class="gemboss-assistant-group"><div class="gemboss-assistant-group-label">Hôm nay</div><div class="gemboss-assistant-thread active"><button type="button" class="gemboss-assistant-thread-main" title="Store nào đang dựng loạt landing?"><span class="gemboss-assistant-thread-titlerow"><span class="gemboss-assistant-thread-title">Store nào đang dựng loạt landing?</span></span><span class="gemboss-assistant-thread-meta">3 giờ trước</span></button><div class="gemboss-assistant-thread-actions"><button type="button" class="gemboss-assistant-thread-act" aria-label="Options"><svg viewBox="0 0 20 20" aria-hidden="true" focusable="false"><g fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"><circle cx="5" cy="10" r=".8"></circle><circle cx="10" cy="10" r=".8"></circle><circle cx="15" cy="10" r=".8"></circle></g></svg></button></div></div></div><div class="gemboss-assistant-group"><div class="gemboss-assistant-group-label">Hôm qua</div><div class="gemboss-assistant-thread"><button type="button" class="gemboss-assistant-thread-main" title="Landing điểm cao nhất của corpus"><span class="gemboss-assistant-thread-titlerow"><span class="gemboss-assistant-thread-title">Landing điểm cao nhất của corpus</span></span><span class="gemboss-assistant-thread-meta">1 ngày trước</span></button><div class="gemboss-assistant-thread-actions"><button type="button" class="gemboss-assistant-thread-act" aria-label="Options"><svg viewBox="0 0 20 20" aria-hidden="true" focusable="false"><g fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"><circle cx="5" cy="10" r=".8"></circle><circle cx="10" cy="10" r=".8"></circle><circle cx="15" cy="10" r=".8"></circle></g></svg></button></div></div></div></div></aside></div></div><details class="cat-code"><summary>Markup</summary><pre><code><div style="height:360px;display:flex">
|
|
5860
5860
|
<aside class="gemboss-assistant-rail">
|
|
5861
5861
|
<div class="gemboss-assistant-rail-top">
|
|
5862
5862
|
<button type="button" class="gemboss-assistant-newchat" title="Phiên mới">
|
|
@@ -5905,7 +5905,7 @@ body{margin:0;background:var(--gemboss-app-bg,#f1f1f1);color:var(--gemboss-text)
|
|
|
5905
5905
|
</svg>
|
|
5906
5906
|
<span class="gemboss-assistant-thread-title">So sánh advertorial với listicle</span>
|
|
5907
5907
|
</span>
|
|
5908
|
-
<span class="gemboss-assistant-thread-meta">
|
|
5908
|
+
<span class="gemboss-assistant-thread-meta">5/9/2026</span>
|
|
5909
5909
|
</button>
|
|
5910
5910
|
<div class="gemboss-assistant-thread-actions">
|
|
5911
5911
|
<button type="button" class="gemboss-assistant-thread-act" aria-label="Options">
|