@attrus-ds/core 0.2.0 → 1.0.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/LICENSE +27 -27
- package/dist/assets/flags/Brazil-rounded.svg +15 -15
- package/dist/assets/flags/Brazil-square.svg +16 -16
- package/dist/assets/flags/Chile-rounded.svg +10 -10
- package/dist/assets/flags/Chile-square.svg +10 -10
- package/dist/assets/flags/Colombia-rounded.svg +9 -9
- package/dist/assets/flags/Colombia-square.svg +9 -9
- package/dist/assets/flags/EUA-rounded.svg +10 -10
- package/dist/assets/flags/EUA-square.svg +10 -10
- package/dist/assets/flags/EUR-rounded.svg +8 -8
- package/dist/assets/flags/EUR-square.svg +8 -8
- package/dist/assets/flags/Mexico-rounded.svg +18 -18
- package/dist/assets/flags/Mexico-square.svg +18 -18
- package/dist/assets/icon-attrus-dark.svg +2 -2
- package/dist/assets/icon-attrus-light.svg +2 -2
- package/dist/assets/logo-attrus-dark.svg +7 -7
- package/dist/assets/logo-attrus-light.svg +7 -7
- package/dist/css/components/buttons.css +301 -301
- package/dist/css/components/callout.css +195 -195
- package/dist/css/components/cards.css +272 -272
- package/dist/css/components/combobox.css +319 -319
- package/dist/css/components/empty-states.css +61 -61
- package/dist/css/components/inputs.css +975 -975
- package/dist/css/components/number-input.css +138 -138
- package/dist/css/components/overlays.css +374 -374
- package/dist/css/components/primitives.css +314 -314
- package/dist/css/components/sidebar.css +179 -179
- package/dist/css/components/smart-search.css +91 -91
- package/dist/css/components/status-pills.css +207 -207
- package/dist/css/components/stepper.css +309 -309
- package/dist/css/components/table.css +602 -602
- package/dist/css/components/tabs.css +319 -319
- package/dist/css/components/toast.css +243 -243
- package/dist/css/components/tooltip.css +231 -231
- package/dist/css/components/topbar.css +148 -148
- package/dist/css/tokens.css +713 -666
- package/dist/react/AppSidebar/AppSidebar.d.ts +50 -50
- package/dist/react/AppSidebar/AppSidebar.tsx +197 -197
- package/dist/react/AppTopbar/AppTopbar.d.ts +58 -58
- package/dist/react/AppTopbar/AppTopbar.tsx +203 -203
- package/dist/react/Atoms/Atoms.d.ts +149 -149
- package/dist/react/Atoms/Atoms.tsx +407 -407
- package/dist/react/Button/Button.d.ts +25 -25
- package/dist/react/Button/Button.tsx +83 -83
- package/dist/react/Callout/Callout.d.ts +29 -29
- package/dist/react/Callout/Callout.tsx +98 -98
- package/dist/react/Card/Card.d.ts +38 -38
- package/dist/react/Card/Card.tsx +93 -93
- package/dist/react/Combobox/Combobox.d.ts +52 -52
- package/dist/react/Combobox/Combobox.tsx +254 -254
- package/dist/react/DataTable/DataTable.d.ts +81 -81
- package/dist/react/DataTable/DataTable.tsx +308 -308
- package/dist/react/Drawer/Drawer.d.ts +35 -35
- package/dist/react/Drawer/Drawer.tsx +226 -226
- package/dist/react/Input/Input.d.ts +155 -155
- package/dist/react/Input/Input.tsx +478 -478
- package/dist/react/Modal/Modal.d.ts +27 -27
- package/dist/react/Modal/Modal.tsx +173 -173
- package/dist/react/NumberInput/NumberInput.d.ts +25 -25
- package/dist/react/NumberInput/NumberInput.tsx +117 -117
- package/dist/react/Pill/Pill.d.ts +31 -31
- package/dist/react/Pill/Pill.tsx +104 -104
- package/dist/react/SearchPill/SearchPill.d.ts +14 -14
- package/dist/react/SearchPill/SearchPill.tsx +40 -40
- package/dist/react/SmartSearch/SmartSearch.d.ts +65 -65
- package/dist/react/SmartSearch/SmartSearch.tsx +271 -271
- package/dist/react/Stepper/Stepper.d.ts +25 -25
- package/dist/react/Stepper/Stepper.tsx +94 -94
- package/dist/react/Tabs/Tabs.d.ts +32 -32
- package/dist/react/Tabs/Tabs.tsx +147 -147
- package/dist/react/Toast/Toast.d.ts +30 -30
- package/dist/react/Toast/Toast.tsx +94 -94
- package/dist/react/Tooltip/Tooltip.d.ts +23 -23
- package/dist/react/Tooltip/Tooltip.tsx +80 -80
- package/dist/react/ZeroState/ZeroState.d.ts +17 -17
- package/dist/react/ZeroState/ZeroState.tsx +45 -45
- package/dist/react/index.ts +35 -35
- package/dist/tokens/attrus-tokens.flat.json +1234 -1234
- package/dist/tokens/attrus-tokens.json +1089 -1089
- package/package.json +66 -64
|
@@ -1,148 +1,148 @@
|
|
|
1
|
-
/* ============================================================
|
|
2
|
-
TOP BAR — ATTRUS Design System
|
|
3
|
-
Canonical component CSS. SINGLE SOURCE consumed by the live app
|
|
4
|
-
shell (ui_kits/dashboard/Shell.jsx) and the doc page
|
|
5
|
-
(preview/topbar.html). Token-driven → themes automatically.
|
|
6
|
-
|
|
7
|
-
Class map:
|
|
8
|
-
.topbar component root (52px bar, surface)
|
|
9
|
-
.tb-control unified 32px control (button/pill base)
|
|
10
|
-
.tb-control.icon icon-only square 32×32
|
|
11
|
-
.tb-control.primary high-contrast CTA (inverse layer)
|
|
12
|
-
.tb-live live-session indicator (non-interactive)
|
|
13
|
-
.tb-live .dot pulsing status dot
|
|
14
|
-
.tb-clock mono elapsed-time readout
|
|
15
|
-
.tb-flag-label ENG / lang label inside a control
|
|
16
|
-
.tb-bell notification button wrapper (badge anchor)
|
|
17
|
-
.tb-bell .badge unread red dot
|
|
18
|
-
.tb-avatar user avatar chip (30px)
|
|
19
|
-
.tb-spacer margin-left:auto group wrapper
|
|
20
|
-
|
|
21
|
-
Canonical control height: var(--tb-control-h) (default 36px). All bar
|
|
22
|
-
items (controls, search, account) read it, so they scale together.
|
|
23
|
-
============================================================ */
|
|
24
|
-
|
|
25
|
-
.topbar {
|
|
26
|
-
height: 60px; flex-shrink: 0;
|
|
27
|
-
--tb-control-h: 36px;
|
|
28
|
-
background: var(--color-background-surface);
|
|
29
|
-
border-bottom: 1px solid var(--color-border-default);
|
|
30
|
-
display: flex; align-items: center; gap: var(--space-2-5);
|
|
31
|
-
padding: 0 var(--space-4);
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
/* Unified control — every interactive pill/button in the bar */
|
|
35
|
-
.tb-control {
|
|
36
|
-
height: var(--tb-control-h); min-height: var(--tb-control-h); box-sizing: border-box;
|
|
37
|
-
display: inline-flex; align-items: center; gap: var(--space-2-5);
|
|
38
|
-
padding: 0 var(--space-3-5);
|
|
39
|
-
border-radius: var(--radius-sm-md);
|
|
40
|
-
border: 1px solid var(--color-border-default);
|
|
41
|
-
background: var(--color-background-surface);
|
|
42
|
-
color: var(--color-foreground-secondary);
|
|
43
|
-
font-family: inherit; font-size: var(--fs-md); font-weight: var(--w-medium);
|
|
44
|
-
white-space: nowrap; cursor: pointer;
|
|
45
|
-
transition: var(--transition-fast);
|
|
46
|
-
}
|
|
47
|
-
.tb-control:hover { border-color: var(--color-border-strong); color: var(--color-foreground-default); background: var(--color-background-hover); }
|
|
48
|
-
.tb-control svg, .tb-control i { width: 14px; height: 14px; stroke-width: var(--icon-stroke); flex-shrink: 0; }
|
|
49
|
-
|
|
50
|
-
/* Icon-only square */
|
|
51
|
-
.tb-control.icon { width: var(--tb-control-h); padding: 0; justify-content: center; }
|
|
52
|
-
|
|
53
|
-
/* The bar's primary action is the canonical button — use `.btn .btn-primary .btn-sm`
|
|
54
|
-
(buttons.css), NOT a topbar-local style. Kept out of here on purpose for single source. */
|
|
55
|
-
|
|
56
|
-
/* Lang label inside a control */
|
|
57
|
-
.tb-control .tb-flag-label { font-size: var(--fs-sm); font-weight: var(--w-semibold); color: var(--color-foreground-secondary); }
|
|
58
|
-
.tb-control .chev { opacity: .6; }
|
|
59
|
-
.tb-control .chev svg, .tb-control .chev i { width: 11px; height: 11px; }
|
|
60
|
-
|
|
61
|
-
/* Live indicator — looks like a control but is not interactive */
|
|
62
|
-
.tb-live { cursor: default; color: var(--color-foreground-secondary); }
|
|
63
|
-
.tb-live:hover { border-color: var(--color-border-default); background: var(--color-background-surface); color: var(--color-foreground-secondary); }
|
|
64
|
-
.tb-live .dot {
|
|
65
|
-
width: 6px; height: 6px; border-radius: var(--radius-pill);
|
|
66
|
-
background: var(--color-success-500);
|
|
67
|
-
box-shadow: 0 0 0 3px color-mix(in srgb, var(--color-success-500) 15%, transparent);
|
|
68
|
-
}
|
|
69
|
-
.tb-live .lbl { font-size: var(--fs-sm); font-weight: var(--w-semibold); }
|
|
70
|
-
.tb-clock { font-family: var(--font-mono); font-size: var(--fs-xxs); color: var(--color-foreground-muted); margin-left: var(--space-1); }
|
|
71
|
-
|
|
72
|
-
/* Notification button + unread badge */
|
|
73
|
-
.tb-bell .badge-anchor { position: relative; display: inline-flex; }
|
|
74
|
-
.tb-bell .badge {
|
|
75
|
-
position: absolute; top: -3px; right: -3px;
|
|
76
|
-
width: 6px; height: 6px; border-radius: var(--radius-pill);
|
|
77
|
-
background: var(--color-danger-500);
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
/* Avatar chip */
|
|
81
|
-
.tb-avatar {
|
|
82
|
-
width: 30px; height: 30px; border-radius: var(--radius-pill);
|
|
83
|
-
background: var(--color-brand-secondary-500); color: var(--color-pure-white);
|
|
84
|
-
font-size: var(--fs-xs); font-weight: var(--w-bold);
|
|
85
|
-
display: inline-flex; align-items: center; justify-content: center;
|
|
86
|
-
flex-shrink: 0; margin-left: var(--space-1);
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
/* Right-aligned cluster */
|
|
90
|
-
.tb-spacer { margin-left: auto; display: flex; align-items: center; gap: var(--space-3); }
|
|
91
|
-
|
|
92
|
-
/* Search pill grows to fill the bar (component itself lives in inputs.css) */
|
|
93
|
-
.topbar .pill-search { height: var(--tb-control-h); box-sizing: border-box; flex: 1; max-width: 520px; min-width: 0; }
|
|
94
|
-
|
|
95
|
-
/* ===== Mobile ===== */
|
|
96
|
-
@media (max-width: 720px) {
|
|
97
|
-
.topbar { gap: var(--space-2); padding: 0 var(--space-3); }
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
/* ===== Account menu (avatar + identity → dropdown) ===== */
|
|
101
|
-
.tb-account-wrap { position: relative; margin-left: var(--space-1); }
|
|
102
|
-
.tb-account {
|
|
103
|
-
height: var(--tb-control-h); min-height: var(--tb-control-h); box-sizing: border-box;
|
|
104
|
-
display: inline-flex; align-items: center; gap: var(--space-2);
|
|
105
|
-
padding: 0 var(--space-3-5) 0 var(--space-2-5);
|
|
106
|
-
border: 1px solid var(--color-border-default);
|
|
107
|
-
border-radius: var(--radius-sm-md);
|
|
108
|
-
background: var(--color-background-surface);
|
|
109
|
-
cursor: pointer; font-family: inherit;
|
|
110
|
-
transition: var(--transition-fast);
|
|
111
|
-
}
|
|
112
|
-
.tb-account:hover { border-color: var(--color-border-strong); background: var(--color-background-hover); }
|
|
113
|
-
.tb-account.is-open { border-color: var(--color-border-strong); background: var(--color-background-hover); }
|
|
114
|
-
.tb-account .tb-avatar { width: 24px; height: 24px; font-size: 9px; margin-left: 0; }
|
|
115
|
-
.tb-account-id { display: flex; flex-direction: column; align-items: flex-start; line-height: 1.1; min-width: 0; }
|
|
116
|
-
.tb-account-id .nm { font-size: var(--fs-xs); font-weight: var(--w-semibold); color: var(--color-foreground-default); white-space: nowrap; }
|
|
117
|
-
.tb-account-id .co { font-size: var(--fs-xxs); color: var(--color-foreground-muted); white-space: nowrap; }
|
|
118
|
-
.tb-account .chev { display: inline-flex; color: var(--color-foreground-muted); margin-left: var(--space-1); }
|
|
119
|
-
.tb-account .chev svg, .tb-account .chev i { width: 12px; height: 12px; }
|
|
120
|
-
|
|
121
|
-
/* Dropdown */
|
|
122
|
-
.tb-account-menu {
|
|
123
|
-
position: absolute; top: calc(100% + var(--space-2)); right: 0; z-index: 200;
|
|
124
|
-
min-width: 240px; padding: var(--space-2);
|
|
125
|
-
background: var(--color-background-surface);
|
|
126
|
-
border: 1px solid var(--color-border-default);
|
|
127
|
-
border-radius: var(--radius-md); box-shadow: var(--shadow-lg);
|
|
128
|
-
}
|
|
129
|
-
.tb-account-menu-head { display: flex; align-items: center; gap: var(--space-3); padding: var(--space-2) var(--space-2) var(--space-3); }
|
|
130
|
-
.tb-account-menu .tb-avatar.lg { width: 36px; height: 36px; font-size: var(--fs-sm); margin-left: 0; }
|
|
131
|
-
.tb-account-menu-id { display: flex; flex-direction: column; line-height: 1.25; min-width: 0; }
|
|
132
|
-
.tb-account-menu-id .nm { font-size: var(--fs-md); font-weight: var(--w-semibold); color: var(--color-foreground-default); white-space: nowrap; }
|
|
133
|
-
.tb-account-menu-id .co { font-size: var(--fs-xs); color: var(--color-foreground-muted); white-space: nowrap; }
|
|
134
|
-
.tb-account-menu-sep { height: 1px; background: var(--color-border-subtle); margin: var(--space-1) calc(-1 * var(--space-2)); }
|
|
135
|
-
.tb-account-menu-item {
|
|
136
|
-
display: flex; align-items: center; gap: var(--space-3); width: 100%;
|
|
137
|
-
padding: var(--space-2-5) var(--space-2); margin: 1px 0;
|
|
138
|
-
border: 0; border-radius: var(--radius-sm); background: transparent; cursor: pointer;
|
|
139
|
-
font-family: inherit; font-size: var(--fs-sm); font-weight: var(--w-medium);
|
|
140
|
-
color: var(--color-foreground-secondary); text-align: left; white-space: nowrap;
|
|
141
|
-
transition: background var(--transition-fast), color var(--transition-fast);
|
|
142
|
-
}
|
|
143
|
-
.tb-account-menu-item:hover { background: var(--color-background-hover); color: var(--color-foreground-default); }
|
|
144
|
-
.tb-account-menu-item svg, .tb-account-menu-item i { width: 15px; height: 15px; stroke-width: var(--icon-stroke); color: var(--color-foreground-muted); flex-shrink: 0; }
|
|
145
|
-
.tb-account-menu-item:hover svg, .tb-account-menu-item:hover i { color: var(--color-foreground-secondary); }
|
|
146
|
-
.tb-account-menu-item.is-danger { color: var(--color-feedback-danger-foreground); }
|
|
147
|
-
.tb-account-menu-item.is-danger svg, .tb-account-menu-item.is-danger i { color: var(--color-feedback-danger-foreground); }
|
|
148
|
-
.tb-account-menu-item.is-danger:hover { background: var(--color-feedback-danger-background); color: var(--color-feedback-danger-foreground); }
|
|
1
|
+
/* ============================================================
|
|
2
|
+
TOP BAR — ATTRUS Design System
|
|
3
|
+
Canonical component CSS. SINGLE SOURCE consumed by the live app
|
|
4
|
+
shell (ui_kits/dashboard/Shell.jsx) and the doc page
|
|
5
|
+
(preview/topbar.html). Token-driven → themes automatically.
|
|
6
|
+
|
|
7
|
+
Class map:
|
|
8
|
+
.topbar component root (52px bar, surface)
|
|
9
|
+
.tb-control unified 32px control (button/pill base)
|
|
10
|
+
.tb-control.icon icon-only square 32×32
|
|
11
|
+
.tb-control.primary high-contrast CTA (inverse layer)
|
|
12
|
+
.tb-live live-session indicator (non-interactive)
|
|
13
|
+
.tb-live .dot pulsing status dot
|
|
14
|
+
.tb-clock mono elapsed-time readout
|
|
15
|
+
.tb-flag-label ENG / lang label inside a control
|
|
16
|
+
.tb-bell notification button wrapper (badge anchor)
|
|
17
|
+
.tb-bell .badge unread red dot
|
|
18
|
+
.tb-avatar user avatar chip (30px)
|
|
19
|
+
.tb-spacer margin-left:auto group wrapper
|
|
20
|
+
|
|
21
|
+
Canonical control height: var(--tb-control-h) (default 36px). All bar
|
|
22
|
+
items (controls, search, account) read it, so they scale together.
|
|
23
|
+
============================================================ */
|
|
24
|
+
|
|
25
|
+
.topbar {
|
|
26
|
+
height: 60px; flex-shrink: 0;
|
|
27
|
+
--tb-control-h: 36px;
|
|
28
|
+
background: var(--color-background-surface);
|
|
29
|
+
border-bottom: 1px solid var(--color-border-default);
|
|
30
|
+
display: flex; align-items: center; gap: var(--space-2-5);
|
|
31
|
+
padding: 0 var(--space-4);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/* Unified control — every interactive pill/button in the bar */
|
|
35
|
+
.tb-control {
|
|
36
|
+
height: var(--tb-control-h); min-height: var(--tb-control-h); box-sizing: border-box;
|
|
37
|
+
display: inline-flex; align-items: center; gap: var(--space-2-5);
|
|
38
|
+
padding: 0 var(--space-3-5);
|
|
39
|
+
border-radius: var(--radius-sm-md);
|
|
40
|
+
border: 1px solid var(--color-border-default);
|
|
41
|
+
background: var(--color-background-surface);
|
|
42
|
+
color: var(--color-foreground-secondary);
|
|
43
|
+
font-family: inherit; font-size: var(--fs-md); font-weight: var(--w-medium);
|
|
44
|
+
white-space: nowrap; cursor: pointer;
|
|
45
|
+
transition: var(--transition-fast);
|
|
46
|
+
}
|
|
47
|
+
.tb-control:hover { border-color: var(--color-border-strong); color: var(--color-foreground-default); background: var(--color-background-hover); }
|
|
48
|
+
.tb-control svg, .tb-control i { width: 14px; height: 14px; stroke-width: var(--icon-stroke); flex-shrink: 0; }
|
|
49
|
+
|
|
50
|
+
/* Icon-only square */
|
|
51
|
+
.tb-control.icon { width: var(--tb-control-h); padding: 0; justify-content: center; }
|
|
52
|
+
|
|
53
|
+
/* The bar's primary action is the canonical button — use `.btn .btn-primary .btn-sm`
|
|
54
|
+
(buttons.css), NOT a topbar-local style. Kept out of here on purpose for single source. */
|
|
55
|
+
|
|
56
|
+
/* Lang label inside a control */
|
|
57
|
+
.tb-control .tb-flag-label { font-size: var(--fs-sm); font-weight: var(--w-semibold); color: var(--color-foreground-secondary); }
|
|
58
|
+
.tb-control .chev { opacity: .6; }
|
|
59
|
+
.tb-control .chev svg, .tb-control .chev i { width: 11px; height: 11px; }
|
|
60
|
+
|
|
61
|
+
/* Live indicator — looks like a control but is not interactive */
|
|
62
|
+
.tb-live { cursor: default; color: var(--color-foreground-secondary); }
|
|
63
|
+
.tb-live:hover { border-color: var(--color-border-default); background: var(--color-background-surface); color: var(--color-foreground-secondary); }
|
|
64
|
+
.tb-live .dot {
|
|
65
|
+
width: 6px; height: 6px; border-radius: var(--radius-pill);
|
|
66
|
+
background: var(--color-success-500);
|
|
67
|
+
box-shadow: 0 0 0 3px color-mix(in srgb, var(--color-success-500) 15%, transparent);
|
|
68
|
+
}
|
|
69
|
+
.tb-live .lbl { font-size: var(--fs-sm); font-weight: var(--w-semibold); }
|
|
70
|
+
.tb-clock { font-family: var(--font-mono); font-size: var(--fs-xxs); color: var(--color-foreground-muted); margin-left: var(--space-1); }
|
|
71
|
+
|
|
72
|
+
/* Notification button + unread badge */
|
|
73
|
+
.tb-bell .badge-anchor { position: relative; display: inline-flex; }
|
|
74
|
+
.tb-bell .badge {
|
|
75
|
+
position: absolute; top: -3px; right: -3px;
|
|
76
|
+
width: 6px; height: 6px; border-radius: var(--radius-pill);
|
|
77
|
+
background: var(--color-danger-500);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/* Avatar chip */
|
|
81
|
+
.tb-avatar {
|
|
82
|
+
width: 30px; height: 30px; border-radius: var(--radius-pill);
|
|
83
|
+
background: var(--color-brand-secondary-500); color: var(--color-pure-white);
|
|
84
|
+
font-size: var(--fs-xs); font-weight: var(--w-bold);
|
|
85
|
+
display: inline-flex; align-items: center; justify-content: center;
|
|
86
|
+
flex-shrink: 0; margin-left: var(--space-1);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/* Right-aligned cluster */
|
|
90
|
+
.tb-spacer { margin-left: auto; display: flex; align-items: center; gap: var(--space-3); }
|
|
91
|
+
|
|
92
|
+
/* Search pill grows to fill the bar (component itself lives in inputs.css) */
|
|
93
|
+
.topbar .pill-search { height: var(--tb-control-h); box-sizing: border-box; flex: 1; max-width: 520px; min-width: 0; }
|
|
94
|
+
|
|
95
|
+
/* ===== Mobile ===== */
|
|
96
|
+
@media (max-width: 720px) {
|
|
97
|
+
.topbar { gap: var(--space-2); padding: 0 var(--space-3); }
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/* ===== Account menu (avatar + identity → dropdown) ===== */
|
|
101
|
+
.tb-account-wrap { position: relative; margin-left: var(--space-1); }
|
|
102
|
+
.tb-account {
|
|
103
|
+
height: var(--tb-control-h); min-height: var(--tb-control-h); box-sizing: border-box;
|
|
104
|
+
display: inline-flex; align-items: center; gap: var(--space-2);
|
|
105
|
+
padding: 0 var(--space-3-5) 0 var(--space-2-5);
|
|
106
|
+
border: 1px solid var(--color-border-default);
|
|
107
|
+
border-radius: var(--radius-sm-md);
|
|
108
|
+
background: var(--color-background-surface);
|
|
109
|
+
cursor: pointer; font-family: inherit;
|
|
110
|
+
transition: var(--transition-fast);
|
|
111
|
+
}
|
|
112
|
+
.tb-account:hover { border-color: var(--color-border-strong); background: var(--color-background-hover); }
|
|
113
|
+
.tb-account.is-open { border-color: var(--color-border-strong); background: var(--color-background-hover); }
|
|
114
|
+
.tb-account .tb-avatar { width: 24px; height: 24px; font-size: 9px; margin-left: 0; }
|
|
115
|
+
.tb-account-id { display: flex; flex-direction: column; align-items: flex-start; line-height: 1.1; min-width: 0; }
|
|
116
|
+
.tb-account-id .nm { font-size: var(--fs-xs); font-weight: var(--w-semibold); color: var(--color-foreground-default); white-space: nowrap; }
|
|
117
|
+
.tb-account-id .co { font-size: var(--fs-xxs); color: var(--color-foreground-muted); white-space: nowrap; }
|
|
118
|
+
.tb-account .chev { display: inline-flex; color: var(--color-foreground-muted); margin-left: var(--space-1); }
|
|
119
|
+
.tb-account .chev svg, .tb-account .chev i { width: 12px; height: 12px; }
|
|
120
|
+
|
|
121
|
+
/* Dropdown */
|
|
122
|
+
.tb-account-menu {
|
|
123
|
+
position: absolute; top: calc(100% + var(--space-2)); right: 0; z-index: 200;
|
|
124
|
+
min-width: 240px; padding: var(--space-2);
|
|
125
|
+
background: var(--color-background-surface);
|
|
126
|
+
border: 1px solid var(--color-border-default);
|
|
127
|
+
border-radius: var(--radius-md); box-shadow: var(--shadow-lg);
|
|
128
|
+
}
|
|
129
|
+
.tb-account-menu-head { display: flex; align-items: center; gap: var(--space-3); padding: var(--space-2) var(--space-2) var(--space-3); }
|
|
130
|
+
.tb-account-menu .tb-avatar.lg { width: 36px; height: 36px; font-size: var(--fs-sm); margin-left: 0; }
|
|
131
|
+
.tb-account-menu-id { display: flex; flex-direction: column; line-height: 1.25; min-width: 0; }
|
|
132
|
+
.tb-account-menu-id .nm { font-size: var(--fs-md); font-weight: var(--w-semibold); color: var(--color-foreground-default); white-space: nowrap; }
|
|
133
|
+
.tb-account-menu-id .co { font-size: var(--fs-xs); color: var(--color-foreground-muted); white-space: nowrap; }
|
|
134
|
+
.tb-account-menu-sep { height: 1px; background: var(--color-border-subtle); margin: var(--space-1) calc(-1 * var(--space-2)); }
|
|
135
|
+
.tb-account-menu-item {
|
|
136
|
+
display: flex; align-items: center; gap: var(--space-3); width: 100%;
|
|
137
|
+
padding: var(--space-2-5) var(--space-2); margin: 1px 0;
|
|
138
|
+
border: 0; border-radius: var(--radius-sm); background: transparent; cursor: pointer;
|
|
139
|
+
font-family: inherit; font-size: var(--fs-sm); font-weight: var(--w-medium);
|
|
140
|
+
color: var(--color-foreground-secondary); text-align: left; white-space: nowrap;
|
|
141
|
+
transition: background var(--transition-fast), color var(--transition-fast);
|
|
142
|
+
}
|
|
143
|
+
.tb-account-menu-item:hover { background: var(--color-background-hover); color: var(--color-foreground-default); }
|
|
144
|
+
.tb-account-menu-item svg, .tb-account-menu-item i { width: 15px; height: 15px; stroke-width: var(--icon-stroke); color: var(--color-foreground-muted); flex-shrink: 0; }
|
|
145
|
+
.tb-account-menu-item:hover svg, .tb-account-menu-item:hover i { color: var(--color-foreground-secondary); }
|
|
146
|
+
.tb-account-menu-item.is-danger { color: var(--color-feedback-danger-foreground); }
|
|
147
|
+
.tb-account-menu-item.is-danger svg, .tb-account-menu-item.is-danger i { color: var(--color-feedback-danger-foreground); }
|
|
148
|
+
.tb-account-menu-item.is-danger:hover { background: var(--color-feedback-danger-background); color: var(--color-feedback-danger-foreground); }
|