@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.
Files changed (80) hide show
  1. package/LICENSE +27 -27
  2. package/dist/assets/flags/Brazil-rounded.svg +15 -15
  3. package/dist/assets/flags/Brazil-square.svg +16 -16
  4. package/dist/assets/flags/Chile-rounded.svg +10 -10
  5. package/dist/assets/flags/Chile-square.svg +10 -10
  6. package/dist/assets/flags/Colombia-rounded.svg +9 -9
  7. package/dist/assets/flags/Colombia-square.svg +9 -9
  8. package/dist/assets/flags/EUA-rounded.svg +10 -10
  9. package/dist/assets/flags/EUA-square.svg +10 -10
  10. package/dist/assets/flags/EUR-rounded.svg +8 -8
  11. package/dist/assets/flags/EUR-square.svg +8 -8
  12. package/dist/assets/flags/Mexico-rounded.svg +18 -18
  13. package/dist/assets/flags/Mexico-square.svg +18 -18
  14. package/dist/assets/icon-attrus-dark.svg +2 -2
  15. package/dist/assets/icon-attrus-light.svg +2 -2
  16. package/dist/assets/logo-attrus-dark.svg +7 -7
  17. package/dist/assets/logo-attrus-light.svg +7 -7
  18. package/dist/css/components/buttons.css +301 -301
  19. package/dist/css/components/callout.css +195 -195
  20. package/dist/css/components/cards.css +272 -272
  21. package/dist/css/components/combobox.css +319 -319
  22. package/dist/css/components/empty-states.css +61 -61
  23. package/dist/css/components/inputs.css +975 -975
  24. package/dist/css/components/number-input.css +138 -138
  25. package/dist/css/components/overlays.css +374 -374
  26. package/dist/css/components/primitives.css +314 -314
  27. package/dist/css/components/sidebar.css +179 -179
  28. package/dist/css/components/smart-search.css +91 -91
  29. package/dist/css/components/status-pills.css +207 -207
  30. package/dist/css/components/stepper.css +309 -309
  31. package/dist/css/components/table.css +602 -602
  32. package/dist/css/components/tabs.css +319 -319
  33. package/dist/css/components/toast.css +243 -243
  34. package/dist/css/components/tooltip.css +231 -231
  35. package/dist/css/components/topbar.css +148 -148
  36. package/dist/css/tokens.css +713 -666
  37. package/dist/react/AppSidebar/AppSidebar.d.ts +50 -50
  38. package/dist/react/AppSidebar/AppSidebar.tsx +197 -197
  39. package/dist/react/AppTopbar/AppTopbar.d.ts +58 -58
  40. package/dist/react/AppTopbar/AppTopbar.tsx +203 -203
  41. package/dist/react/Atoms/Atoms.d.ts +149 -149
  42. package/dist/react/Atoms/Atoms.tsx +407 -407
  43. package/dist/react/Button/Button.d.ts +25 -25
  44. package/dist/react/Button/Button.tsx +83 -83
  45. package/dist/react/Callout/Callout.d.ts +29 -29
  46. package/dist/react/Callout/Callout.tsx +98 -98
  47. package/dist/react/Card/Card.d.ts +38 -38
  48. package/dist/react/Card/Card.tsx +93 -93
  49. package/dist/react/Combobox/Combobox.d.ts +52 -52
  50. package/dist/react/Combobox/Combobox.tsx +254 -254
  51. package/dist/react/DataTable/DataTable.d.ts +81 -81
  52. package/dist/react/DataTable/DataTable.tsx +308 -308
  53. package/dist/react/Drawer/Drawer.d.ts +35 -35
  54. package/dist/react/Drawer/Drawer.tsx +226 -226
  55. package/dist/react/Input/Input.d.ts +155 -155
  56. package/dist/react/Input/Input.tsx +478 -478
  57. package/dist/react/Modal/Modal.d.ts +27 -27
  58. package/dist/react/Modal/Modal.tsx +173 -173
  59. package/dist/react/NumberInput/NumberInput.d.ts +25 -25
  60. package/dist/react/NumberInput/NumberInput.tsx +117 -117
  61. package/dist/react/Pill/Pill.d.ts +31 -31
  62. package/dist/react/Pill/Pill.tsx +104 -104
  63. package/dist/react/SearchPill/SearchPill.d.ts +14 -14
  64. package/dist/react/SearchPill/SearchPill.tsx +40 -40
  65. package/dist/react/SmartSearch/SmartSearch.d.ts +65 -65
  66. package/dist/react/SmartSearch/SmartSearch.tsx +271 -271
  67. package/dist/react/Stepper/Stepper.d.ts +25 -25
  68. package/dist/react/Stepper/Stepper.tsx +94 -94
  69. package/dist/react/Tabs/Tabs.d.ts +32 -32
  70. package/dist/react/Tabs/Tabs.tsx +147 -147
  71. package/dist/react/Toast/Toast.d.ts +30 -30
  72. package/dist/react/Toast/Toast.tsx +94 -94
  73. package/dist/react/Tooltip/Tooltip.d.ts +23 -23
  74. package/dist/react/Tooltip/Tooltip.tsx +80 -80
  75. package/dist/react/ZeroState/ZeroState.d.ts +17 -17
  76. package/dist/react/ZeroState/ZeroState.tsx +45 -45
  77. package/dist/react/index.ts +35 -35
  78. package/dist/tokens/attrus-tokens.flat.json +1234 -1234
  79. package/dist/tokens/attrus-tokens.json +1089 -1089
  80. package/package.json +66 -64
@@ -1,179 +1,179 @@
1
- /* ============================================================
2
- SIDEBAR NAVIGATION — ATTRUS Design System
3
- Canonical component CSS. SINGLE SOURCE consumed by BOTH the
4
- live app shell (ui_kits/dashboard/Shell.jsx) and the doc page
5
- (preview/sidebar-nav.html). Token-driven → themes automatically.
6
-
7
- Class map:
8
- .sb component root (card framing — doc demos)
9
- .sb.sb-app app modifier: full-height rail, border-right only
10
- .sb.collapsed 60px icon rail
11
- .sb-head/-body/-section/-item/-foot
12
- .sb-item.active · .ic · .label · .badge · .count
13
- .sb-group / .sb-children / .sb-subitem (collapsible groups)
14
-
15
- Canonical row height: 36px (comfortable — operational platform).
16
- ============================================================ */
17
-
18
- .sb {
19
- width: 216px;
20
- background: var(--color-background-surface);
21
- border: 1px solid var(--color-border-default);
22
- border-radius: var(--radius-md);
23
- box-shadow: var(--shadow-sm);
24
- display: flex; flex-direction: column;
25
- overflow: hidden;
26
- }
27
- /* App rail: full-height, no card framing, animates width */
28
- .sb.sb-app {
29
- border: 0;
30
- border-right: 1px solid var(--color-border-default);
31
- border-radius: 0;
32
- box-shadow: none;
33
- height: 100%;
34
- transition: width var(--duration-base) var(--ease-standard);
35
- }
36
-
37
- /* Header — matches TopBar (60px) so logos align */
38
- .sb-head {
39
- height: 60px; padding: 0 var(--space-2-5) 0 18px;
40
- display: flex; align-items: center; justify-content: space-between;
41
- border-bottom: 1px solid var(--color-border-subtle);
42
- flex-shrink: 0;
43
- }
44
- .sb-head img { height: 14px; width: auto; }
45
- .sb-head .toggle {
46
- width: 26px; height: 26px; border-radius: var(--radius-sm); border: 0; padding: 0;
47
- background: transparent; color: var(--color-foreground-muted); cursor: pointer;
48
- display: inline-flex; align-items: center; justify-content: center;
49
- transition: var(--transition-fast);
50
- }
51
- .sb-head .toggle:hover { background: var(--color-background-hover); color: var(--color-foreground-secondary); }
52
- .sb-head .toggle svg, .sb-head .toggle i { width: 14px; height: 14px; stroke-width: var(--icon-stroke); }
53
-
54
- .sb-body { flex: 1; padding: var(--space-3) 0; overflow-y: auto; overflow-x: hidden; }
55
-
56
- .sb-section {
57
- padding: var(--space-6) var(--space-5) var(--space-2);
58
- font-family: var(--font-sans);
59
- font-size: var(--fs-xxs); font-weight: var(--w-semibold);
60
- color: var(--color-foreground-muted);
61
- letter-spacing: var(--ls-caps); text-transform: uppercase;
62
- }
63
-
64
- .sb-item {
65
- display: flex; align-items: center; gap: 11px;
66
- padding: 8px 10px; margin: 3px 10px;
67
- height: 36px; box-sizing: border-box;
68
- border-radius: var(--radius-sm);
69
- color: var(--color-foreground-secondary);
70
- font-size: var(--fs-md); font-weight: var(--w-medium);
71
- cursor: pointer; position: relative;
72
- white-space: nowrap; overflow: hidden;
73
- transition: background .15s, color .15s;
74
- }
75
- .sb-item:hover { background: var(--color-background-hover); color: var(--color-foreground-default); }
76
- .sb-item.active {
77
- background: var(--color-background-selected);
78
- color: var(--color-foreground-brand);
79
- font-weight: var(--w-semibold);
80
- }
81
- .sb-item.active::before {
82
- content: ""; position: absolute; left: -10px; top: 9px; bottom: 9px;
83
- width: 2px; border-radius: var(--radius-pill);
84
- background: var(--color-brand-secondary-500);
85
- }
86
- .sb-item .ic { width: 15px; height: 15px; stroke-width: var(--icon-stroke); flex-shrink: 0; opacity: 0.85; }
87
- .sb-item.active .ic { color: var(--color-brand-secondary-500); opacity: 1; }
88
- .sb-item .label { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
89
- .sb-item.disabled { color: var(--color-foreground-placeholder); cursor: not-allowed; }
90
- .sb-item.disabled:hover { background: transparent; }
91
-
92
- /* Trailing decoration — badge (status) OR count (numeric), never both */
93
- .sb-badge {
94
- font-family: var(--font-sans); font-size: 9px; font-weight: var(--w-bold);
95
- letter-spacing: .06em; line-height: 1.4;
96
- padding: 1px var(--space-2-5); border-radius: var(--radius-pill);
97
- background: var(--color-brand-secondary-500); color: var(--color-pure-white);
98
- }
99
- .sb-badge.alert { background: var(--color-danger-500); }
100
- .sb-badge.warning { background: var(--color-warning-500); }
101
- .sb-count {
102
- font-family: var(--font-mono); font-size: var(--fs-xxs);
103
- color: var(--color-foreground-muted);
104
- background: var(--color-background-subtle);
105
- padding: 1px 6px; border-radius: var(--radius-xs);
106
- }
107
- .sb-item.active .sb-count { background: color-mix(in srgb, var(--color-brand-secondary-200) 70%, transparent); color: var(--color-brand-secondary-700); }
108
-
109
- /* Footer — user mini-card */
110
- .sb-foot {
111
- border-top: 1px solid var(--color-border-subtle);
112
- padding: var(--space-3);
113
- display: flex; align-items: center; gap: var(--space-3);
114
- flex-shrink: 0;
115
- }
116
- .sb-foot .avatar {
117
- width: 26px; height: 26px; border-radius: var(--radius-pill);
118
- background: var(--color-brand-secondary-500); color: var(--color-pure-white);
119
- font-size: 10px; font-weight: var(--w-bold);
120
- display: inline-flex; align-items: center; justify-content: center; flex-shrink: 0;
121
- }
122
- .sb-foot .meta { flex: 1; min-width: 0; }
123
- .sb-foot .meta .name { font-size: var(--fs-sm); font-weight: var(--w-semibold); color: var(--color-foreground-default); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
124
- .sb-foot .meta .role { font-size: var(--fs-xxs); color: var(--color-foreground-muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
125
- .sb-foot .logout { color: var(--color-foreground-muted); cursor: pointer; flex-shrink: 0; display: inline-flex; }
126
- .sb-foot .logout svg, .sb-foot .logout i { width: 14px; height: 14px; stroke-width: var(--icon-stroke); }
127
-
128
- /* ===== Collapsed (60px icon rail) ===== */
129
- .sb.collapsed { width: 60px; }
130
- .sb.collapsed .sb-head { padding: 0 var(--space-3); justify-content: center; }
131
- .sb.collapsed .sb-section { padding: 0; margin: var(--space-3) var(--space-4); height: 1px; background: var(--color-border-subtle); font-size: 0; color: transparent; }
132
- .sb.collapsed .sb-item { justify-content: center; padding: 8px 0; gap: 0; margin: 1px 10px; }
133
- .sb.collapsed .sb-item .label, .sb.collapsed .sb-badge, .sb.collapsed .sb-count, .sb.collapsed .sb-item .chev { display: none; }
134
- .sb.collapsed .sb-item.active::before { display: none; }
135
- .sb.collapsed .sb-foot { justify-content: center; padding: var(--space-3) 0; }
136
- .sb.collapsed .sb-foot .meta, .sb.collapsed .sb-foot .logout { display: none; }
137
-
138
- /* ===== Groups & dropdowns ===== */
139
- .sb-group { position: relative; }
140
- .sb-group > .sb-item .chev {
141
- width: 14px; height: 14px; stroke-width: var(--icon-stroke);
142
- margin-left: auto; opacity: 0.7;
143
- transition: transform var(--duration-base) var(--ease-standard);
144
- }
145
- .sb-group[aria-expanded="true"] > .sb-item .chev { transform: rotate(90deg); opacity: 1; }
146
- .sb-children {
147
- overflow: hidden; display: grid; grid-template-rows: 0fr;
148
- transition: grid-template-rows var(--duration-base) var(--ease-standard);
149
- }
150
- .sb-children > .sb-children-inner { min-height: 0; }
151
- .sb-group[aria-expanded="true"] .sb-children { grid-template-rows: 1fr; }
152
- .sb-children-inner { padding: var(--space-1) 0; }
153
- .sb-children .sb-subitem {
154
- display: flex; align-items: center; gap: 10px;
155
- padding: 8px 12px 8px 38px; margin: 2px 10px;
156
- height: 38px; box-sizing: border-box;
157
- border-radius: var(--radius-sm);
158
- color: var(--color-foreground-secondary);
159
- font-size: var(--fs-sm); font-weight: var(--w-medium);
160
- cursor: pointer; position: relative;
161
- transition: var(--transition-fast);
162
- }
163
- .sb-children .sb-subitem::before {
164
- content: ""; position: absolute; left: 26px; top: 50%; transform: translateY(-50%);
165
- width: 5px; height: 5px; border-radius: var(--radius-pill);
166
- background: var(--color-border-strong); opacity: .55;
167
- transition: var(--transition-fast);
168
- }
169
- .sb-children .sb-subitem:hover { background: var(--color-background-hover); color: var(--color-foreground-default); }
170
- .sb-children .sb-subitem:hover::before { opacity: 1; background: var(--color-foreground-muted); }
171
- .sb-children .sb-subitem.active { color: var(--color-foreground-brand); font-weight: var(--w-semibold); background: var(--color-background-selected); }
172
- .sb-children .sb-subitem.active::before { background: var(--color-brand-secondary-500); opacity: 1; }
173
- .sb-children .sb-subitem .count, .sb-children .sb-subitem .sb-count {
174
- margin-left: auto;
175
- font-family: var(--font-mono); font-size: var(--fs-xxs);
176
- color: var(--color-foreground-muted);
177
- background: var(--color-background-subtle);
178
- padding: 1px 6px; border-radius: var(--radius-xs);
179
- }
1
+ /* ============================================================
2
+ SIDEBAR NAVIGATION — ATTRUS Design System
3
+ Canonical component CSS. SINGLE SOURCE consumed by BOTH the
4
+ live app shell (ui_kits/dashboard/Shell.jsx) and the doc page
5
+ (preview/sidebar-nav.html). Token-driven → themes automatically.
6
+
7
+ Class map:
8
+ .sb component root (card framing — doc demos)
9
+ .sb.sb-app app modifier: full-height rail, border-right only
10
+ .sb.collapsed 60px icon rail
11
+ .sb-head/-body/-section/-item/-foot
12
+ .sb-item.active · .ic · .label · .badge · .count
13
+ .sb-group / .sb-children / .sb-subitem (collapsible groups)
14
+
15
+ Canonical row height: 36px (comfortable — operational platform).
16
+ ============================================================ */
17
+
18
+ .sb {
19
+ width: 216px;
20
+ background: var(--color-background-surface);
21
+ border: 1px solid var(--color-border-default);
22
+ border-radius: var(--radius-md);
23
+ box-shadow: var(--shadow-sm);
24
+ display: flex; flex-direction: column;
25
+ overflow: hidden;
26
+ }
27
+ /* App rail: full-height, no card framing, animates width */
28
+ .sb.sb-app {
29
+ border: 0;
30
+ border-right: 1px solid var(--color-border-default);
31
+ border-radius: 0;
32
+ box-shadow: none;
33
+ height: 100%;
34
+ transition: width var(--duration-base) var(--ease-standard);
35
+ }
36
+
37
+ /* Header — matches TopBar (60px) so logos align */
38
+ .sb-head {
39
+ height: 60px; padding: 0 var(--space-2-5) 0 18px;
40
+ display: flex; align-items: center; justify-content: space-between;
41
+ border-bottom: 1px solid var(--color-border-subtle);
42
+ flex-shrink: 0;
43
+ }
44
+ .sb-head img { height: 14px; width: auto; }
45
+ .sb-head .toggle {
46
+ width: 26px; height: 26px; border-radius: var(--radius-sm); border: 0; padding: 0;
47
+ background: transparent; color: var(--color-foreground-muted); cursor: pointer;
48
+ display: inline-flex; align-items: center; justify-content: center;
49
+ transition: var(--transition-fast);
50
+ }
51
+ .sb-head .toggle:hover { background: var(--color-background-hover); color: var(--color-foreground-secondary); }
52
+ .sb-head .toggle svg, .sb-head .toggle i { width: 14px; height: 14px; stroke-width: var(--icon-stroke); }
53
+
54
+ .sb-body { flex: 1; padding: var(--space-3) 0; overflow-y: auto; overflow-x: hidden; }
55
+
56
+ .sb-section {
57
+ padding: var(--space-6) var(--space-5) var(--space-2);
58
+ font-family: var(--font-sans);
59
+ font-size: var(--fs-xxs); font-weight: var(--w-semibold);
60
+ color: var(--color-foreground-muted);
61
+ letter-spacing: var(--ls-caps); text-transform: uppercase;
62
+ }
63
+
64
+ .sb-item {
65
+ display: flex; align-items: center; gap: 11px;
66
+ padding: 8px 10px; margin: 3px 10px;
67
+ height: 36px; box-sizing: border-box;
68
+ border-radius: var(--radius-sm);
69
+ color: var(--color-foreground-secondary);
70
+ font-size: var(--fs-md); font-weight: var(--w-medium);
71
+ cursor: pointer; position: relative;
72
+ white-space: nowrap; overflow: hidden;
73
+ transition: background .15s, color .15s;
74
+ }
75
+ .sb-item:hover { background: var(--color-background-hover); color: var(--color-foreground-default); }
76
+ .sb-item.active {
77
+ background: var(--color-background-selected);
78
+ color: var(--color-foreground-brand);
79
+ font-weight: var(--w-semibold);
80
+ }
81
+ .sb-item.active::before {
82
+ content: ""; position: absolute; left: -10px; top: 9px; bottom: 9px;
83
+ width: 2px; border-radius: var(--radius-pill);
84
+ background: var(--color-brand-secondary-500);
85
+ }
86
+ .sb-item .ic { width: 15px; height: 15px; stroke-width: var(--icon-stroke); flex-shrink: 0; opacity: 0.85; }
87
+ .sb-item.active .ic { color: var(--color-brand-secondary-500); opacity: 1; }
88
+ .sb-item .label { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
89
+ .sb-item.disabled { color: var(--color-foreground-placeholder); cursor: not-allowed; }
90
+ .sb-item.disabled:hover { background: transparent; }
91
+
92
+ /* Trailing decoration — badge (status) OR count (numeric), never both */
93
+ .sb-badge {
94
+ font-family: var(--font-sans); font-size: 9px; font-weight: var(--w-bold);
95
+ letter-spacing: .06em; line-height: 1.4;
96
+ padding: 1px var(--space-2-5); border-radius: var(--radius-pill);
97
+ background: var(--color-brand-secondary-500); color: var(--color-pure-white);
98
+ }
99
+ .sb-badge.alert { background: var(--color-danger-500); }
100
+ .sb-badge.warning { background: var(--color-warning-500); }
101
+ .sb-count {
102
+ font-family: var(--font-mono); font-size: var(--fs-xxs);
103
+ color: var(--color-foreground-muted);
104
+ background: var(--color-background-subtle);
105
+ padding: 1px 6px; border-radius: var(--radius-xs);
106
+ }
107
+ .sb-item.active .sb-count { background: color-mix(in srgb, var(--color-brand-secondary-200) 70%, transparent); color: var(--color-brand-secondary-700); }
108
+
109
+ /* Footer — user mini-card */
110
+ .sb-foot {
111
+ border-top: 1px solid var(--color-border-subtle);
112
+ padding: var(--space-3);
113
+ display: flex; align-items: center; gap: var(--space-3);
114
+ flex-shrink: 0;
115
+ }
116
+ .sb-foot .avatar {
117
+ width: 26px; height: 26px; border-radius: var(--radius-pill);
118
+ background: var(--color-brand-secondary-500); color: var(--color-pure-white);
119
+ font-size: 10px; font-weight: var(--w-bold);
120
+ display: inline-flex; align-items: center; justify-content: center; flex-shrink: 0;
121
+ }
122
+ .sb-foot .meta { flex: 1; min-width: 0; }
123
+ .sb-foot .meta .name { font-size: var(--fs-sm); font-weight: var(--w-semibold); color: var(--color-foreground-default); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
124
+ .sb-foot .meta .role { font-size: var(--fs-xxs); color: var(--color-foreground-muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
125
+ .sb-foot .logout { color: var(--color-foreground-muted); cursor: pointer; flex-shrink: 0; display: inline-flex; }
126
+ .sb-foot .logout svg, .sb-foot .logout i { width: 14px; height: 14px; stroke-width: var(--icon-stroke); }
127
+
128
+ /* ===== Collapsed (60px icon rail) ===== */
129
+ .sb.collapsed { width: 60px; }
130
+ .sb.collapsed .sb-head { padding: 0 var(--space-3); justify-content: center; }
131
+ .sb.collapsed .sb-section { padding: 0; margin: var(--space-3) var(--space-4); height: 1px; background: var(--color-border-subtle); font-size: 0; color: transparent; }
132
+ .sb.collapsed .sb-item { justify-content: center; padding: 8px 0; gap: 0; margin: 1px 10px; }
133
+ .sb.collapsed .sb-item .label, .sb.collapsed .sb-badge, .sb.collapsed .sb-count, .sb.collapsed .sb-item .chev { display: none; }
134
+ .sb.collapsed .sb-item.active::before { display: none; }
135
+ .sb.collapsed .sb-foot { justify-content: center; padding: var(--space-3) 0; }
136
+ .sb.collapsed .sb-foot .meta, .sb.collapsed .sb-foot .logout { display: none; }
137
+
138
+ /* ===== Groups & dropdowns ===== */
139
+ .sb-group { position: relative; }
140
+ .sb-group > .sb-item .chev {
141
+ width: 14px; height: 14px; stroke-width: var(--icon-stroke);
142
+ margin-left: auto; opacity: 0.7;
143
+ transition: transform var(--duration-base) var(--ease-standard);
144
+ }
145
+ .sb-group[aria-expanded="true"] > .sb-item .chev { transform: rotate(90deg); opacity: 1; }
146
+ .sb-children {
147
+ overflow: hidden; display: grid; grid-template-rows: 0fr;
148
+ transition: grid-template-rows var(--duration-base) var(--ease-standard);
149
+ }
150
+ .sb-children > .sb-children-inner { min-height: 0; }
151
+ .sb-group[aria-expanded="true"] .sb-children { grid-template-rows: 1fr; }
152
+ .sb-children-inner { padding: var(--space-1) 0; }
153
+ .sb-children .sb-subitem {
154
+ display: flex; align-items: center; gap: 10px;
155
+ padding: 8px 12px 8px 38px; margin: 2px 10px;
156
+ height: 38px; box-sizing: border-box;
157
+ border-radius: var(--radius-sm);
158
+ color: var(--color-foreground-secondary);
159
+ font-size: var(--fs-sm); font-weight: var(--w-medium);
160
+ cursor: pointer; position: relative;
161
+ transition: var(--transition-fast);
162
+ }
163
+ .sb-children .sb-subitem::before {
164
+ content: ""; position: absolute; left: 26px; top: 50%; transform: translateY(-50%);
165
+ width: 5px; height: 5px; border-radius: var(--radius-pill);
166
+ background: var(--color-border-strong); opacity: .55;
167
+ transition: var(--transition-fast);
168
+ }
169
+ .sb-children .sb-subitem:hover { background: var(--color-background-hover); color: var(--color-foreground-default); }
170
+ .sb-children .sb-subitem:hover::before { opacity: 1; background: var(--color-foreground-muted); }
171
+ .sb-children .sb-subitem.active { color: var(--color-foreground-brand); font-weight: var(--w-semibold); background: var(--color-background-selected); }
172
+ .sb-children .sb-subitem.active::before { background: var(--color-brand-secondary-500); opacity: 1; }
173
+ .sb-children .sb-subitem .count, .sb-children .sb-subitem .sb-count {
174
+ margin-left: auto;
175
+ font-family: var(--font-mono); font-size: var(--fs-xxs);
176
+ color: var(--color-foreground-muted);
177
+ background: var(--color-background-subtle);
178
+ padding: 1px 6px; border-radius: var(--radius-xs);
179
+ }
@@ -1,91 +1,91 @@
1
- /* ============================================================
2
- SMART SEARCH — global command palette (⌘K) shell
3
- Promoted from combobox.html §03 (2026-06-11): the 8 canonical
4
- states (inactive · active · word · similar · id · partial-id ·
5
- no-results · loading · error) compose from these pieces.
6
- Consumed by the SmartSearch TSX component.
7
- ============================================================ */
8
- /* Smart-search combobox */
9
- .ss { width: 100%; max-width: 380px; background: var(--color-background-surface); border: 1px solid var(--color-border-default); border-radius: var(--radius-md); box-shadow: var(--shadow-sm); overflow: hidden; font-size: var(--fs-sm); }
10
- .ss-input { display: flex; align-items: center; gap: var(--space-3); padding: var(--space-3) var(--space-4); border-bottom: 1px solid var(--color-border-subtle); }
11
- .ss-input.ss-input-flat { border-bottom: 0; }
12
- .ss-input svg, .ss-input i { width: var(--icon-sm); height: var(--icon-sm); stroke-width: var(--icon-stroke); color: var(--color-foreground-muted); flex-shrink: 0; }
13
- .ss-input input { flex: 1; border: 0; outline: 0; background: transparent; font: inherit; color: var(--color-foreground-default); }
14
- .ss-input input::placeholder { color: var(--color-foreground-placeholder); }
15
- .ss-clear { display: inline-flex; align-items: center; justify-content: center; width: 18px; height: 18px; border: 0; padding: 0; border-radius: var(--radius-pill); background: transparent; color: var(--color-foreground-muted); cursor: pointer; }
16
- .ss-clear:hover { background: var(--color-background-hover); color: var(--color-foreground-default); }
17
- .ss-clear svg, .ss-clear i { width: 12px; height: 12px; }
18
-
19
- .ss-section { padding: var(--space-3) var(--space-2); border-bottom: 1px solid var(--color-border-subtle); }
20
- .ss-section:last-of-type { border-bottom: 0; }
21
- .ss-section-label { font-size: var(--fs-xxs); font-weight: var(--w-semibold); letter-spacing: var(--ls-caps); text-transform: uppercase; color: var(--color-foreground-muted); padding: 0 var(--space-2); margin-bottom: var(--space-2); }
22
-
23
- /* Suggestion chips (active state) */
24
- .ss-chips { display: flex; flex-wrap: wrap; gap: var(--space-2); padding: 0 var(--space-2); }
25
- .ss-chip { display: inline-flex; align-items: center; gap: var(--space-2); padding: 4px var(--space-3); background: var(--color-background-canvas); border: 1px solid var(--color-border-default); border-radius: var(--radius-pill); font-size: var(--fs-xs); font-weight: var(--w-medium); color: var(--color-foreground-default); cursor: pointer; transition: var(--transition-fast); }
26
- .ss-chip:hover { background: var(--color-background-hover); border-color: var(--color-border-strong); }
27
- .ss-chip svg, .ss-chip i { width: 11px; height: 11px; stroke-width: var(--icon-stroke); color: var(--color-foreground-muted); }
28
-
29
- /* List rows */
30
- .ss-list { list-style: none; margin: 0; padding: 0; }
31
- .ss-list-item { display: flex; align-items: center; gap: var(--space-3); padding: var(--space-2) var(--space-3); border-radius: var(--radius-sm); cursor: pointer; transition: var(--transition-fast); }
32
- .ss-list-item:hover, .ss-list-item.is-active { background: var(--color-background-hover); }
33
- .ss-list-item .icon-leading { width: 28px; height: 28px; border-radius: var(--radius-sm); background: var(--color-background-canvas); display: inline-flex; align-items: center; justify-content: center; color: var(--color-foreground-secondary); flex-shrink: 0; }
34
- .ss-list-item .icon-leading svg, .ss-list-item .icon-leading i { width: 14px; height: 14px; stroke-width: var(--icon-stroke); }
35
- .ss-list-item .icon-leading.brand { background: var(--color-brand-secondary-50); color: var(--color-brand-secondary-700); }
36
- .ss-list-item .text { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 1px; }
37
- .ss-list-item .text .label { font-size: var(--fs-sm); font-weight: var(--w-semibold); color: var(--color-foreground-default); }
38
- .ss-list-item .text .meta { font-size: var(--fs-xs); color: var(--color-foreground-muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
39
- .ss-list-item .icon-trailing { display: inline-flex; align-items: center; justify-content: center; width: 16px; height: 16px; flex-shrink: 0; color: var(--color-foreground-muted); }
40
- .ss-list-item .icon-trailing svg, .ss-list-item .icon-trailing i { width: 14px; height: 14px; stroke-width: var(--icon-stroke); }
41
-
42
- /* Recent searches — clock icon + dim text */
43
- .ss-recent .ss-list-item .icon-leading { background: transparent; border: 0; width: 18px; height: 18px; }
44
- .ss-recent .ss-list-item .icon-leading svg, .ss-recent .ss-list-item .icon-leading i { width: 13px; height: 13px; color: var(--color-foreground-muted); }
45
- .ss-recent .ss-list-item .text .label { font-weight: var(--w-regular); color: var(--color-foreground-secondary); }
46
-
47
- /* Empty/result label */
48
- .ss-result-label { padding: 0 var(--space-2) var(--space-2); }
49
- .ss-result-label .l { font-size: var(--fs-xxs); font-weight: var(--w-semibold); letter-spacing: var(--ls-caps); text-transform: uppercase; color: var(--color-foreground-muted); }
50
- .ss-no-result { padding: 0 var(--space-2); font-size: var(--fs-sm); color: var(--color-foreground-muted); }
51
- .ss-no-result strong { color: var(--color-foreground-default); font-weight: var(--w-semibold); }
52
-
53
- /* Tip / hint card (similar match suggestion, ID format hint) */
54
- .ss-hint { display: flex; align-items: center; gap: var(--space-3); padding: var(--space-3); background: var(--color-background-subtle); border: 1px solid var(--color-border-subtle); border-radius: var(--radius-sm); margin: var(--space-3) var(--space-2) 0; }
55
- .ss-hint .icon-leading { color: var(--color-foreground-muted); flex-shrink: 0; display: inline-flex; align-items: center; justify-content: center; width: 14px; height: 14px; }
56
- .ss-hint .icon-leading svg, .ss-hint .icon-leading i { width: 14px; height: 14px; stroke-width: var(--icon-stroke); }
57
- .ss-hint .body { font-size: var(--fs-sm); color: var(--color-foreground-secondary); line-height: var(--lh-relaxed); }
58
- .ss-hint .body strong { color: var(--color-foreground-default); font-weight: var(--w-semibold); }
59
- .ss-hint .body code { font-family: var(--font-mono); font-size: var(--fs-xs); color: var(--color-foreground-accent); background: color-mix(in srgb, var(--color-brand-secondary-500) 12%, transparent); padding: 1px var(--space-2); border-radius: var(--radius-xs); }
60
-
61
- /* ID type-picker buttons */
62
- .ss-typebtns { display: flex; flex-direction: column; gap: var(--space-2); padding: 0 var(--space-2); }
63
- .ss-typebtn { display: flex; align-items: center; gap: var(--space-3); padding: var(--space-3) var(--space-3); background: var(--color-background-canvas); border: 1px solid var(--color-border-default); border-radius: var(--radius-sm); font-size: var(--fs-sm); font-weight: var(--w-medium); color: var(--color-foreground-default); cursor: pointer; transition: var(--transition-fast); text-align: left; width: 100%; }
64
- .ss-typebtn:hover { background: var(--color-background-hover); border-color: var(--color-border-strong); }
65
- .ss-typebtn svg, .ss-typebtn i { width: 16px; height: 16px; stroke-width: var(--icon-stroke); color: var(--color-foreground-muted); }
66
- .ss-typebtn .grow { flex: 1; }
67
- .ss-typebtn .chev { color: var(--color-foreground-muted); }
68
-
69
- /* Loading skeleton + spinner illustration */
70
- .ss-skeleton { padding: var(--space-3) var(--space-2); display: flex; flex-direction: column; gap: var(--space-3); }
71
- .ss-skel-row { display: flex; align-items: center; gap: var(--space-3); }
72
- .ss-skel-circle { width: 28px; height: 28px; border-radius: var(--radius-sm); background: var(--color-border-default); flex-shrink: 0; }
73
- .ss-skel-bars { flex: 1; display: flex; flex-direction: column; gap: 5px; }
74
- .ss-skel-bar { height: 8px; border-radius: var(--radius-xs); background: var(--color-border-default); }
75
- .ss-skel-bar.short { width: 40%; }
76
- .ss-skel-bar.long { width: 70%; }
77
- .ss-skel-shimmer { background: linear-gradient(90deg, var(--color-border-default) 0%, var(--color-border-subtle) 50%, var(--color-border-default) 100%); background-size: 200% 100%; animation: skel 1.4s linear infinite; }
78
- @keyframes skel { 0% { background-position: 200% 0; } 100% { background-position: -200% 0; } }
79
-
80
- .ss-illo { display: flex; flex-direction: column; align-items: center; gap: var(--space-3); padding: var(--space-7) var(--space-5); text-align: center; }
81
- .ss-illo svg.illustration { width: 84px; height: 60px; }
82
- .ss-illo .title { font-size: var(--fs-md); font-weight: var(--w-semibold); color: var(--color-foreground-default); }
83
- .ss-illo .body { font-size: var(--fs-xs); color: var(--color-foreground-muted); max-width: 32ch; line-height: var(--lh-relaxed); }
84
-
85
- /* Footer with keyboard shortcuts */
86
- .ss-foot { display: flex; align-items: center; gap: var(--space-4); padding: var(--space-2) var(--space-3); background: var(--color-background-subtle); border-top: 1px solid var(--color-border-subtle); font-size: var(--fs-xxs); color: var(--color-foreground-muted); }
87
- .ss-foot .kbd-group { display: inline-flex; align-items: center; gap: 4px; }
88
- kbd.ss-kbd { display: inline-flex; align-items: center; justify-content: center; min-width: 18px; height: 18px; padding: 0 4px; background: var(--color-background-surface); border: 1px solid var(--color-border-default); border-radius: var(--radius-xs); font-family: var(--font-mono); font-size: 10px; font-weight: var(--w-semibold); color: var(--color-foreground-secondary); }
89
- .ss-foot .sep { width: 1px; height: 12px; background: var(--color-border-default); }
90
-
91
-
1
+ /* ============================================================
2
+ SMART SEARCH — global command palette (⌘K) shell
3
+ Promoted from combobox.html §03 (2026-06-11): the 8 canonical
4
+ states (inactive · active · word · similar · id · partial-id ·
5
+ no-results · loading · error) compose from these pieces.
6
+ Consumed by the SmartSearch TSX component.
7
+ ============================================================ */
8
+ /* Smart-search combobox */
9
+ .ss { width: 100%; max-width: 380px; background: var(--color-background-surface); border: 1px solid var(--color-border-default); border-radius: var(--radius-md); box-shadow: var(--shadow-sm); overflow: hidden; font-size: var(--fs-sm); }
10
+ .ss-input { display: flex; align-items: center; gap: var(--space-3); padding: var(--space-3) var(--space-4); border-bottom: 1px solid var(--color-border-subtle); }
11
+ .ss-input.ss-input-flat { border-bottom: 0; }
12
+ .ss-input svg, .ss-input i { width: var(--icon-sm); height: var(--icon-sm); stroke-width: var(--icon-stroke); color: var(--color-foreground-muted); flex-shrink: 0; }
13
+ .ss-input input { flex: 1; border: 0; outline: 0; background: transparent; font: inherit; color: var(--color-foreground-default); }
14
+ .ss-input input::placeholder { color: var(--color-foreground-placeholder); }
15
+ .ss-clear { display: inline-flex; align-items: center; justify-content: center; width: 18px; height: 18px; border: 0; padding: 0; border-radius: var(--radius-pill); background: transparent; color: var(--color-foreground-muted); cursor: pointer; }
16
+ .ss-clear:hover { background: var(--color-background-hover); color: var(--color-foreground-default); }
17
+ .ss-clear svg, .ss-clear i { width: 12px; height: 12px; }
18
+
19
+ .ss-section { padding: var(--space-3) var(--space-2); border-bottom: 1px solid var(--color-border-subtle); }
20
+ .ss-section:last-of-type { border-bottom: 0; }
21
+ .ss-section-label { font-size: var(--fs-xxs); font-weight: var(--w-semibold); letter-spacing: var(--ls-caps); text-transform: uppercase; color: var(--color-foreground-muted); padding: 0 var(--space-2); margin-bottom: var(--space-2); }
22
+
23
+ /* Suggestion chips (active state) */
24
+ .ss-chips { display: flex; flex-wrap: wrap; gap: var(--space-2); padding: 0 var(--space-2); }
25
+ .ss-chip { display: inline-flex; align-items: center; gap: var(--space-2); padding: 4px var(--space-3); background: var(--color-background-canvas); border: 1px solid var(--color-border-default); border-radius: var(--radius-pill); font-size: var(--fs-xs); font-weight: var(--w-medium); color: var(--color-foreground-default); cursor: pointer; transition: var(--transition-fast); }
26
+ .ss-chip:hover { background: var(--color-background-hover); border-color: var(--color-border-strong); }
27
+ .ss-chip svg, .ss-chip i { width: 11px; height: 11px; stroke-width: var(--icon-stroke); color: var(--color-foreground-muted); }
28
+
29
+ /* List rows */
30
+ .ss-list { list-style: none; margin: 0; padding: 0; }
31
+ .ss-list-item { display: flex; align-items: center; gap: var(--space-3); padding: var(--space-2) var(--space-3); border-radius: var(--radius-sm); cursor: pointer; transition: var(--transition-fast); }
32
+ .ss-list-item:hover, .ss-list-item.is-active { background: var(--color-background-hover); }
33
+ .ss-list-item .icon-leading { width: 28px; height: 28px; border-radius: var(--radius-sm); background: var(--color-background-canvas); display: inline-flex; align-items: center; justify-content: center; color: var(--color-foreground-secondary); flex-shrink: 0; }
34
+ .ss-list-item .icon-leading svg, .ss-list-item .icon-leading i { width: 14px; height: 14px; stroke-width: var(--icon-stroke); }
35
+ .ss-list-item .icon-leading.brand { background: var(--color-brand-secondary-50); color: var(--color-brand-secondary-700); }
36
+ .ss-list-item .text { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 1px; }
37
+ .ss-list-item .text .label { font-size: var(--fs-sm); font-weight: var(--w-semibold); color: var(--color-foreground-default); }
38
+ .ss-list-item .text .meta { font-size: var(--fs-xs); color: var(--color-foreground-muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
39
+ .ss-list-item .icon-trailing { display: inline-flex; align-items: center; justify-content: center; width: 16px; height: 16px; flex-shrink: 0; color: var(--color-foreground-muted); }
40
+ .ss-list-item .icon-trailing svg, .ss-list-item .icon-trailing i { width: 14px; height: 14px; stroke-width: var(--icon-stroke); }
41
+
42
+ /* Recent searches — clock icon + dim text */
43
+ .ss-recent .ss-list-item .icon-leading { background: transparent; border: 0; width: 18px; height: 18px; }
44
+ .ss-recent .ss-list-item .icon-leading svg, .ss-recent .ss-list-item .icon-leading i { width: 13px; height: 13px; color: var(--color-foreground-muted); }
45
+ .ss-recent .ss-list-item .text .label { font-weight: var(--w-regular); color: var(--color-foreground-secondary); }
46
+
47
+ /* Empty/result label */
48
+ .ss-result-label { padding: 0 var(--space-2) var(--space-2); }
49
+ .ss-result-label .l { font-size: var(--fs-xxs); font-weight: var(--w-semibold); letter-spacing: var(--ls-caps); text-transform: uppercase; color: var(--color-foreground-muted); }
50
+ .ss-no-result { padding: 0 var(--space-2); font-size: var(--fs-sm); color: var(--color-foreground-muted); }
51
+ .ss-no-result strong { color: var(--color-foreground-default); font-weight: var(--w-semibold); }
52
+
53
+ /* Tip / hint card (similar match suggestion, ID format hint) */
54
+ .ss-hint { display: flex; align-items: center; gap: var(--space-3); padding: var(--space-3); background: var(--color-background-subtle); border: 1px solid var(--color-border-subtle); border-radius: var(--radius-sm); margin: var(--space-3) var(--space-2) 0; }
55
+ .ss-hint .icon-leading { color: var(--color-foreground-muted); flex-shrink: 0; display: inline-flex; align-items: center; justify-content: center; width: 14px; height: 14px; }
56
+ .ss-hint .icon-leading svg, .ss-hint .icon-leading i { width: 14px; height: 14px; stroke-width: var(--icon-stroke); }
57
+ .ss-hint .body { font-size: var(--fs-sm); color: var(--color-foreground-secondary); line-height: var(--lh-relaxed); }
58
+ .ss-hint .body strong { color: var(--color-foreground-default); font-weight: var(--w-semibold); }
59
+ .ss-hint .body code { font-family: var(--font-mono); font-size: var(--fs-xs); color: var(--color-foreground-accent); background: color-mix(in srgb, var(--color-brand-secondary-500) 12%, transparent); padding: 1px var(--space-2); border-radius: var(--radius-xs); }
60
+
61
+ /* ID type-picker buttons */
62
+ .ss-typebtns { display: flex; flex-direction: column; gap: var(--space-2); padding: 0 var(--space-2); }
63
+ .ss-typebtn { display: flex; align-items: center; gap: var(--space-3); padding: var(--space-3) var(--space-3); background: var(--color-background-canvas); border: 1px solid var(--color-border-default); border-radius: var(--radius-sm); font-size: var(--fs-sm); font-weight: var(--w-medium); color: var(--color-foreground-default); cursor: pointer; transition: var(--transition-fast); text-align: left; width: 100%; }
64
+ .ss-typebtn:hover { background: var(--color-background-hover); border-color: var(--color-border-strong); }
65
+ .ss-typebtn svg, .ss-typebtn i { width: 16px; height: 16px; stroke-width: var(--icon-stroke); color: var(--color-foreground-muted); }
66
+ .ss-typebtn .grow { flex: 1; }
67
+ .ss-typebtn .chev { color: var(--color-foreground-muted); }
68
+
69
+ /* Loading skeleton + spinner illustration */
70
+ .ss-skeleton { padding: var(--space-3) var(--space-2); display: flex; flex-direction: column; gap: var(--space-3); }
71
+ .ss-skel-row { display: flex; align-items: center; gap: var(--space-3); }
72
+ .ss-skel-circle { width: 28px; height: 28px; border-radius: var(--radius-sm); background: var(--color-border-default); flex-shrink: 0; }
73
+ .ss-skel-bars { flex: 1; display: flex; flex-direction: column; gap: 5px; }
74
+ .ss-skel-bar { height: 8px; border-radius: var(--radius-xs); background: var(--color-border-default); }
75
+ .ss-skel-bar.short { width: 40%; }
76
+ .ss-skel-bar.long { width: 70%; }
77
+ .ss-skel-shimmer { background: linear-gradient(90deg, var(--color-border-default) 0%, var(--color-border-subtle) 50%, var(--color-border-default) 100%); background-size: 200% 100%; animation: skel 1.4s linear infinite; }
78
+ @keyframes skel { 0% { background-position: 200% 0; } 100% { background-position: -200% 0; } }
79
+
80
+ .ss-illo { display: flex; flex-direction: column; align-items: center; gap: var(--space-3); padding: var(--space-7) var(--space-5); text-align: center; }
81
+ .ss-illo svg.illustration { width: 84px; height: 60px; }
82
+ .ss-illo .title { font-size: var(--fs-md); font-weight: var(--w-semibold); color: var(--color-foreground-default); }
83
+ .ss-illo .body { font-size: var(--fs-xs); color: var(--color-foreground-muted); max-width: 32ch; line-height: var(--lh-relaxed); }
84
+
85
+ /* Footer with keyboard shortcuts */
86
+ .ss-foot { display: flex; align-items: center; gap: var(--space-4); padding: var(--space-2) var(--space-3); background: var(--color-background-subtle); border-top: 1px solid var(--color-border-subtle); font-size: var(--fs-xxs); color: var(--color-foreground-muted); }
87
+ .ss-foot .kbd-group { display: inline-flex; align-items: center; gap: 4px; }
88
+ kbd.ss-kbd { display: inline-flex; align-items: center; justify-content: center; min-width: 18px; height: 18px; padding: 0 4px; background: var(--color-background-surface); border: 1px solid var(--color-border-default); border-radius: var(--radius-xs); font-family: var(--font-mono); font-size: 10px; font-weight: var(--w-semibold); color: var(--color-foreground-secondary); }
89
+ .ss-foot .sep { width: 1px; height: 12px; background: var(--color-border-default); }
90
+
91
+