@zeyos/zx 4.0.0 → 4.1.1

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 (51) hide show
  1. package/CHANGELOG.md +61 -0
  2. package/DESIGN-SYSTEM.md +59 -3
  3. package/dist/types/components/app-icon/app-icon.d.ts +88 -0
  4. package/dist/types/components/filter/filter-model.d.ts +87 -0
  5. package/dist/types/components/filter/filter.d.ts +331 -0
  6. package/dist/types/components/select/select.d.ts +46 -4
  7. package/dist/types/components/table/table.d.ts +103 -0
  8. package/dist/types/components/tag-picker/tag-picker.d.ts +16 -0
  9. package/dist/types/core/dom.d.ts +1 -1
  10. package/dist/types/core/util.d.ts +9 -0
  11. package/dist/types/index.d.ts +4 -1
  12. package/dist/types/zeyos/icons.d.ts +21 -4
  13. package/dist/types/zeyos/index.d.ts +1 -1
  14. package/dist/types/zeyos/select.d.ts +2 -0
  15. package/dist/zx-zeyos.esm.js +703 -75
  16. package/dist/zx-zeyos.esm.min.js +1 -1
  17. package/dist/zx.css +564 -9
  18. package/dist/zx.esm.js +1569 -115
  19. package/dist/zx.esm.min.js +3 -3
  20. package/dist/zx.global.js +1569 -115
  21. package/dist/zx.global.min.js +3 -3
  22. package/dist/zx.min.css +1 -1
  23. package/docs/api.json +379 -0
  24. package/docs/llms.md +97 -18
  25. package/docs/llms.txt +11 -9
  26. package/package.json +1 -1
  27. package/src/components/app-icon/app-icon.css +189 -0
  28. package/src/components/app-icon/app-icon.js +137 -0
  29. package/src/components/button/button.css +34 -2
  30. package/src/components/card/card.css +25 -3
  31. package/src/components/filter/filter-model.js +226 -0
  32. package/src/components/filter/filter.css +147 -0
  33. package/src/components/filter/filter.js +554 -0
  34. package/src/components/grid/grid.css +1 -1
  35. package/src/components/grid/grid.js +4 -1
  36. package/src/components/message/message.css +40 -3
  37. package/src/components/select/select.css +17 -0
  38. package/src/components/select/select.js +105 -24
  39. package/src/components/table/table.css +85 -0
  40. package/src/components/table/table.js +418 -24
  41. package/src/components/tag-picker/tag-picker.css +19 -0
  42. package/src/components/tag-picker/tag-picker.js +42 -5
  43. package/src/core/dom.js +1 -1
  44. package/src/core/util.js +20 -0
  45. package/src/index.js +7 -1
  46. package/src/zeyos/icons.js +37 -24
  47. package/src/zeyos/index.js +1 -1
  48. package/src/zeyos/select.js +6 -5
  49. package/styles/tokens/semantic.css +17 -0
  50. package/styles/tokens/themes.css +2 -2
  51. package/styles/zx.css +2 -0
package/dist/zx.css CHANGED
@@ -143,6 +143,8 @@
143
143
  --zx-color-text-muted: var(--zx-gray-500);
144
144
  --zx-color-text-placeholder: var(--zx-gray-400);
145
145
  --zx-color-text-invert: var(--zx-gray-50);
146
+ --zx-color-app-icon-glyph: var(--zx-gray-0);
147
+ --zx-color-app-icon-shade: var(--zx-gray-950);
146
148
  --zx-color-accent: var(--zx-accent-600);
147
149
  --zx-color-accent-hover: var(--zx-accent-700);
148
150
  --zx-color-accent-active: var(--zx-accent-700);
@@ -165,6 +167,27 @@
165
167
  --zx-control-font-weight: 500;
166
168
  --zx-overlay-shadow: var(--zx-shadow-3);
167
169
  --zx-overlay-blur: 8px;
170
+ --zx-color-glass-border: color-mix(in srgb, var(--zx-gray-0) 24%, transparent);
171
+ --zx-color-glass-highlight: color-mix(in srgb, var(--zx-gray-0) 24%, transparent);
172
+ --zx-color-glass-highlight-strong: color-mix(in srgb, var(--zx-gray-0) 38%, transparent);
173
+ --zx-color-app-icon-depth: color-mix(in srgb, var(--zx-color-app-icon-shade) 26%, transparent);
174
+ --zx-color-glass-surface: color-mix(in srgb, var(--zx-color-bg-raised) 78%, transparent);
175
+ --zx-color-glass-control: color-mix(in srgb, var(--zx-color-bg-control) 88%, transparent);
176
+ --zx-color-glass-control-hover: color-mix(in srgb, var(--zx-color-bg-hover) 76%, var(--zx-color-glass-surface));
177
+ --zx-glass-blur: 8px;
178
+ --zx-glass-saturation: 130%;
179
+ --zx-glass-color-strength: 82%;
180
+ --zx-app-icon-shadow:
181
+ inset 0 1px 0 color-mix(in srgb, var(--zx-gray-0) 28%, transparent),
182
+ inset 0 -1px 0 color-mix(in srgb, var(--zx-gray-950) 16%, transparent),
183
+ 0 5px 14px color-mix(in srgb, var(--zx-color-app-icon-shade) 28%, transparent);
184
+ --zx-app-icon-shadow-hover:
185
+ inset 0 1px 0 color-mix(in srgb, var(--zx-gray-0) 40%, transparent),
186
+ inset 0 -1px 0 color-mix(in srgb, var(--zx-gray-950) 20%, transparent),
187
+ 0 9px 22px color-mix(in srgb, var(--zx-color-app-icon-shade) 36%, transparent);
188
+ --zx-glass-control-shadow: inset 0 1px 0 color-mix(in srgb, var(--zx-gray-0) 18%, transparent), var(--zx-shadow-1);
189
+ --zx-glass-raised-shadow: inset 0 1px 0 color-mix(in srgb, var(--zx-gray-0) 18%, transparent), var(--zx-overlay-shadow);
190
+ --zx-glass-glyph-shadow: 0 1px 2px color-mix(in srgb, var(--zx-gray-950) 58%, transparent);
168
191
  --zx-header-bg: var(--zx-gray-900);
169
192
  --zx-header-text: var(--zx-gray-50);
170
193
  }
@@ -496,7 +519,7 @@ svg.zx-icon {
496
519
  min-block-size: var(--zx-control-height);
497
520
  border: 1px solid var(--zx-color-border-control);
498
521
  border-radius: var(--zx-button-radius, var(--zx-control-radius));
499
- background: var(--zx-color-bg-control);
522
+ background: var(--zx-color-glass-control);
500
523
  color: var(--zx-color-text);
501
524
  padding-inline: var(--zx-control-pad-x);
502
525
  font: inherit;
@@ -504,6 +527,9 @@ svg.zx-icon {
504
527
  font-weight: var(--zx-control-font-weight);
505
528
  line-height: 1;
506
529
  cursor: pointer;
530
+ -webkit-backdrop-filter: blur(var(--zx-glass-blur)) saturate(var(--zx-glass-saturation));
531
+ backdrop-filter: blur(var(--zx-glass-blur)) saturate(var(--zx-glass-saturation));
532
+ box-shadow: var(--zx-glass-control-shadow);
507
533
  transition:
508
534
  color var(--zx-dur-fast) var(--zx-ease),
509
535
  background-color var(--zx-dur-fast) var(--zx-ease),
@@ -511,7 +537,7 @@ svg.zx-icon {
511
537
  box-shadow var(--zx-dur-fast) var(--zx-ease);
512
538
  }
513
539
  .zx-btn:hover:not(:disabled) {
514
- background: var(--zx-color-bg-hover);
540
+ background: var(--zx-color-glass-control-hover);
515
541
  }
516
542
  .zx-btn:active:not(:disabled) {
517
543
  border-color: var(--zx-color-border-strong);
@@ -547,6 +573,9 @@ svg.zx-icon {
547
573
  .zx-btn[data-kind=ghost] {
548
574
  border-color: transparent;
549
575
  background: none;
576
+ -webkit-backdrop-filter: none;
577
+ backdrop-filter: none;
578
+ box-shadow: none;
550
579
  }
551
580
  .zx-btn[data-kind=ghost]:hover:not(:disabled) {
552
581
  border-color: transparent;
@@ -575,6 +604,29 @@ svg.zx-icon {
575
604
  .zx-btn-group > .zx-btn:focus-visible {
576
605
  z-index: 1;
577
606
  }
607
+ @media (prefers-reduced-transparency: reduce) {
608
+ .zx-btn {
609
+ background: var(--zx-color-bg-control);
610
+ -webkit-backdrop-filter: none;
611
+ backdrop-filter: none;
612
+ box-shadow: none;
613
+ }
614
+ }
615
+ @media (forced-colors: active) {
616
+ .zx-btn {
617
+ border-color: ButtonText;
618
+ background: ButtonFace;
619
+ color: ButtonText;
620
+ box-shadow: none;
621
+ -webkit-backdrop-filter: none;
622
+ backdrop-filter: none;
623
+ }
624
+ .zx-btn[data-kind=primary] {
625
+ border-color: Highlight;
626
+ background: Highlight;
627
+ color: HighlightText;
628
+ }
629
+ }
578
630
 
579
631
  /* src/components/badge/badge.css */
580
632
  .zx-badge {
@@ -1407,14 +1459,34 @@ svg.zx-icon {
1407
1459
  background: var(--zx-color-bg-surface);
1408
1460
  }
1409
1461
  .zx-card[data-variant=raised] {
1410
- border: 1px solid transparent;
1411
- background: var(--zx-color-bg-surface);
1412
- box-shadow: var(--zx-overlay-shadow);
1462
+ border: 1px solid var(--zx-color-glass-border);
1463
+ background: var(--zx-color-glass-surface);
1464
+ -webkit-backdrop-filter: blur(var(--zx-glass-blur)) saturate(var(--zx-glass-saturation));
1465
+ backdrop-filter: blur(var(--zx-glass-blur)) saturate(var(--zx-glass-saturation));
1466
+ box-shadow: var(--zx-glass-raised-shadow);
1413
1467
  }
1414
1468
  .zx-card[data-variant=filled] {
1415
1469
  border: 1px solid transparent;
1416
1470
  background: var(--zx-color-bg-muted);
1417
1471
  }
1472
+ @media (prefers-reduced-transparency: reduce) {
1473
+ .zx-card[data-variant=raised] {
1474
+ border-color: var(--zx-color-border);
1475
+ background: var(--zx-color-bg-surface);
1476
+ -webkit-backdrop-filter: none;
1477
+ backdrop-filter: none;
1478
+ box-shadow: var(--zx-overlay-shadow);
1479
+ }
1480
+ }
1481
+ @media (forced-colors: active) {
1482
+ .zx-card[data-variant=raised] {
1483
+ border-color: ButtonText;
1484
+ background: Canvas;
1485
+ box-shadow: none;
1486
+ -webkit-backdrop-filter: none;
1487
+ backdrop-filter: none;
1488
+ }
1489
+ }
1418
1490
  .zx-card[data-linked=true]:hover {
1419
1491
  background: var(--zx-color-bg-hover);
1420
1492
  }
@@ -2051,6 +2123,193 @@ button.zx-panel__toggle:focus-visible {
2051
2123
  display: none;
2052
2124
  }
2053
2125
 
2126
+ /* src/components/app-icon/app-icon.css */
2127
+ .zx-app-icon {
2128
+ --zx-app-icon-size: 36px;
2129
+ --zx-app-icon-glyph-size: 52%;
2130
+ --zx-app-icon-color: var(--zx-color-accent);
2131
+ position: relative;
2132
+ isolation: isolate;
2133
+ display: inline-grid;
2134
+ place-items: center;
2135
+ flex: none;
2136
+ inline-size: var(--zx-app-icon-size);
2137
+ block-size: var(--zx-app-icon-size);
2138
+ overflow: hidden;
2139
+ border: 1px solid var(--zx-color-glass-border);
2140
+ border-radius: max(var(--zx-radius-sm), calc(var(--zx-app-icon-size) * .12));
2141
+ background: var(--zx-app-icon-color);
2142
+ box-shadow: var(--zx-app-icon-shadow);
2143
+ color: var(--zx-app-icon-glyph, var(--zx-color-app-icon-glyph));
2144
+ font-size: var(--zx-app-icon-size);
2145
+ vertical-align: middle;
2146
+ transform: translateZ(0);
2147
+ }
2148
+ .zx-app-icon[data-glass=subtle],
2149
+ .zx-app-icon[data-glass=strong] {
2150
+ background:
2151
+ linear-gradient(
2152
+ 145deg,
2153
+ var(--zx-color-glass-highlight-strong),
2154
+ transparent 38%),
2155
+ linear-gradient(
2156
+ to bottom right,
2157
+ transparent 42%,
2158
+ var(--zx-color-app-icon-depth)),
2159
+ color-mix(in srgb, var(--zx-app-icon-color) var(--zx-glass-color-strength), transparent);
2160
+ -webkit-backdrop-filter: blur(calc(var(--zx-glass-blur) * .55)) saturate(var(--zx-glass-saturation));
2161
+ backdrop-filter: blur(calc(var(--zx-glass-blur) * .55)) saturate(var(--zx-glass-saturation));
2162
+ }
2163
+ .zx-app-icon[data-glass=strong] {
2164
+ -webkit-backdrop-filter: blur(var(--zx-glass-blur)) saturate(var(--zx-glass-saturation));
2165
+ backdrop-filter: blur(var(--zx-glass-blur)) saturate(var(--zx-glass-saturation));
2166
+ }
2167
+ .zx-app-icon[data-glass=none] {
2168
+ border-color: var(--zx-color-border);
2169
+ box-shadow: none;
2170
+ }
2171
+ .zx-app-icon[data-glass=none] .zx-app-icon__shine {
2172
+ display: none;
2173
+ }
2174
+ .zx-app-icon[data-glass=none]::after {
2175
+ display: none;
2176
+ }
2177
+ .zx-app-icon[data-selected] {
2178
+ outline: 2px solid var(--zx-color-bg-page);
2179
+ box-shadow: 0 0 0 3px var(--zx-color-ring), var(--zx-overlay-shadow);
2180
+ }
2181
+ .zx-app-icon__shine {
2182
+ position: absolute;
2183
+ z-index: 1;
2184
+ inset: 1px 13% auto;
2185
+ block-size: 38%;
2186
+ border-radius: 999px;
2187
+ background:
2188
+ linear-gradient(
2189
+ to bottom,
2190
+ var(--zx-color-glass-highlight-strong),
2191
+ transparent);
2192
+ filter: blur(1px);
2193
+ pointer-events: none;
2194
+ }
2195
+ .zx-app-icon::after {
2196
+ content: "";
2197
+ position: absolute;
2198
+ z-index: 1;
2199
+ inset: 0;
2200
+ border-radius: inherit;
2201
+ box-shadow: inset 0 0 0 1px var(--zx-color-glass-highlight);
2202
+ pointer-events: none;
2203
+ }
2204
+ .zx-app-icon__glyph {
2205
+ position: absolute;
2206
+ z-index: 2;
2207
+ inset-block-start: 50%;
2208
+ inset-inline-start: 50%;
2209
+ display: grid;
2210
+ place-items: center;
2211
+ inline-size: var(--zx-app-icon-glyph-size);
2212
+ block-size: var(--zx-app-icon-glyph-size);
2213
+ margin: 0;
2214
+ padding: 0;
2215
+ font-size: var(--zx-app-icon-glyph-size);
2216
+ line-height: 1;
2217
+ filter: drop-shadow(var(--zx-glass-glyph-shadow));
2218
+ transform: translate(-50%, -50%);
2219
+ }
2220
+ .zx-app-icon__glyph > .zx-icon,
2221
+ .zx-app-icon__glyph > svg,
2222
+ .zx-app-icon__glyph > i {
2223
+ display: grid;
2224
+ place-items: center;
2225
+ inline-size: 1em;
2226
+ block-size: 1em;
2227
+ margin: 0;
2228
+ color: inherit;
2229
+ font-size: 1em;
2230
+ line-height: 1;
2231
+ text-align: center;
2232
+ vertical-align: middle;
2233
+ }
2234
+ .zx-app-icon__glyph > i::before {
2235
+ display: block;
2236
+ line-height: 1;
2237
+ }
2238
+ .zx-app-icon__glyph svg [fill]:not([fill=none]) {
2239
+ fill: currentColor;
2240
+ }
2241
+ .zx-app-icon__glyph svg [stroke]:not([stroke=none]) {
2242
+ stroke: currentColor;
2243
+ }
2244
+ .zx-app-icon__badge {
2245
+ position: absolute;
2246
+ z-index: 3;
2247
+ inset-block-end: 1px;
2248
+ inset-inline-end: 1px;
2249
+ display: grid;
2250
+ place-items: center;
2251
+ min-inline-size: 14px;
2252
+ block-size: 14px;
2253
+ padding-inline: 3px;
2254
+ border: 1px solid var(--zx-color-bg-raised);
2255
+ border-radius: var(--zx-radius-full);
2256
+ background: var(--zx-color-danger);
2257
+ color: var(--zx-color-text-invert);
2258
+ font-size: 9px;
2259
+ font-weight: 700;
2260
+ line-height: 1;
2261
+ }
2262
+ .zx-app-icon:hover {
2263
+ border-color: var(--zx-color-glass-highlight-strong);
2264
+ box-shadow: var(--zx-app-icon-shadow-hover);
2265
+ filter: brightness(1.06) saturate(1.08);
2266
+ }
2267
+ .zx-app-icon:focus-visible,
2268
+ :is(a, button, [role=button]):focus-visible > .zx-app-icon {
2269
+ outline: none;
2270
+ box-shadow: var(--zx-focus-ring), var(--zx-app-icon-shadow-hover);
2271
+ }
2272
+ @media (prefers-reduced-motion: no-preference) {
2273
+ .zx-app-icon {
2274
+ transition:
2275
+ border-color var(--zx-dur-fast) var(--zx-ease),
2276
+ box-shadow var(--zx-dur-fast) var(--zx-ease),
2277
+ filter var(--zx-dur-fast) var(--zx-ease),
2278
+ transform var(--zx-dur-fast) var(--zx-ease);
2279
+ }
2280
+ .zx-app-icon:hover {
2281
+ transform: translateY(-2px) scale(1.035);
2282
+ }
2283
+ }
2284
+ @media (prefers-reduced-transparency: reduce) {
2285
+ .zx-app-icon[data-glass=strong] {
2286
+ background: var(--zx-app-icon-color);
2287
+ -webkit-backdrop-filter: none;
2288
+ backdrop-filter: none;
2289
+ }
2290
+ .zx-app-icon[data-glass=subtle] {
2291
+ background: var(--zx-app-icon-color);
2292
+ -webkit-backdrop-filter: none;
2293
+ backdrop-filter: none;
2294
+ }
2295
+ }
2296
+ @media (forced-colors: active) {
2297
+ .zx-app-icon {
2298
+ border-color: ButtonText;
2299
+ background: ButtonFace;
2300
+ color: ButtonText;
2301
+ box-shadow: none;
2302
+ filter: none;
2303
+ transform: none;
2304
+ -webkit-backdrop-filter: none;
2305
+ backdrop-filter: none;
2306
+ }
2307
+ .zx-app-icon::after,
2308
+ .zx-app-icon__shine {
2309
+ display: none;
2310
+ }
2311
+ }
2312
+
2054
2313
  /* src/components/launcher/launcher.css */
2055
2314
  .zx-launcher {
2056
2315
  inline-size: min(760px, calc(100vw - (2 * var(--zx-space-4))));
@@ -2677,11 +2936,14 @@ button.zx-panel__toggle:focus-visible {
2677
2936
  }
2678
2937
  .zx-message-region {
2679
2938
  position: fixed;
2680
- inset-block: var(--zx-space-4) auto;
2681
- inset-inline: var(--zx-space-4);
2939
+ inset-block-start: var(--zx-space-4);
2940
+ inset-block-end: auto;
2941
+ inset-inline-start: auto;
2942
+ inset-inline-end: var(--zx-space-4);
2682
2943
  inline-size: min(420px, calc(100% - (2 * var(--zx-space-4))));
2944
+ block-size: max-content;
2683
2945
  max-block-size: calc(100% - (2 * var(--zx-space-4)));
2684
- margin: 0 auto;
2946
+ margin: 0;
2685
2947
  overflow: visible;
2686
2948
  border: 0;
2687
2949
  background: none;
@@ -2689,6 +2951,8 @@ button.zx-panel__toggle:focus-visible {
2689
2951
  }
2690
2952
  .zx-message-region:popover-open {
2691
2953
  display: grid;
2954
+ grid-auto-rows: max-content;
2955
+ align-content: start;
2692
2956
  }
2693
2957
  .zx-message__toast {
2694
2958
  --zx-message-kind: var(--zx-color-info);
@@ -2717,6 +2981,41 @@ button.zx-panel__toggle:focus-visible {
2717
2981
  --zx-message-kind: var(--zx-color-danger);
2718
2982
  background: var(--zx-color-danger-bg);
2719
2983
  }
2984
+ @supports (backdrop-filter: blur(1px)) {
2985
+ .zx-message__toast {
2986
+ background: color-mix(in srgb, var(--zx-color-info-bg) 38%, var(--zx-color-glass-surface));
2987
+ -webkit-backdrop-filter: blur(var(--zx-glass-blur)) saturate(var(--zx-glass-saturation));
2988
+ backdrop-filter: blur(var(--zx-glass-blur)) saturate(var(--zx-glass-saturation));
2989
+ box-shadow: var(--zx-glass-raised-shadow);
2990
+ }
2991
+ .zx-message__toast[data-kind=success] {
2992
+ background: color-mix(in srgb, var(--zx-color-success-bg) 38%, var(--zx-color-glass-surface));
2993
+ }
2994
+ .zx-message__toast[data-kind=warning] {
2995
+ background: color-mix(in srgb, var(--zx-color-warning-bg) 38%, var(--zx-color-glass-surface));
2996
+ }
2997
+ .zx-message__toast[data-kind=error] {
2998
+ background: color-mix(in srgb, var(--zx-color-danger-bg) 38%, var(--zx-color-glass-surface));
2999
+ }
3000
+ }
3001
+ @media (prefers-reduced-transparency: reduce) {
3002
+ .zx-message__toast {
3003
+ -webkit-backdrop-filter: none;
3004
+ backdrop-filter: none;
3005
+ }
3006
+ .zx-message__toast[data-kind=info] {
3007
+ background: var(--zx-color-info-bg);
3008
+ }
3009
+ .zx-message__toast[data-kind=success] {
3010
+ background: var(--zx-color-success-bg);
3011
+ }
3012
+ .zx-message__toast[data-kind=warning] {
3013
+ background: var(--zx-color-warning-bg);
3014
+ }
3015
+ .zx-message__toast[data-kind=error] {
3016
+ background: var(--zx-color-danger-bg);
3017
+ }
3018
+ }
2720
3019
  .zx-message__icon {
2721
3020
  display: inline-grid;
2722
3021
  place-items: center;
@@ -3613,6 +3912,7 @@ body:has(> .zx-modal:modal) {
3613
3912
  }
3614
3913
  .zx-select__value-adornment {
3615
3914
  display: inline-flex;
3915
+ grid-column: 1;
3616
3916
  align-items: center;
3617
3917
  padding-inline-start: var(--zx-control-pad-x);
3618
3918
  }
@@ -3626,6 +3926,7 @@ body:has(> .zx-modal:modal) {
3626
3926
  box-shadow: var(--zx-focus-ring);
3627
3927
  }
3628
3928
  .zx-select__input {
3929
+ grid-column: 2;
3629
3930
  inline-size: 100%;
3630
3931
  min-inline-size: 0;
3631
3932
  min-block-size: calc(var(--zx-control-height) - 2px) !important;
@@ -3649,6 +3950,20 @@ body:has(> .zx-modal:modal) {
3649
3950
  color: var(--zx-color-text-muted);
3650
3951
  padding: 0 !important;
3651
3952
  }
3953
+ .zx-select__clear {
3954
+ grid-column: 3;
3955
+ }
3956
+ .zx-select__loading {
3957
+ grid-column: 4;
3958
+ justify-self: center;
3959
+ }
3960
+ .zx-select__toggle {
3961
+ grid-column: 5;
3962
+ align-self: stretch;
3963
+ }
3964
+ .zx-select__toggle > .zx-icon {
3965
+ display: block;
3966
+ }
3652
3967
  .zx-select__clear:hover,
3653
3968
  .zx-select__toggle:hover {
3654
3969
  color: var(--zx-color-text);
@@ -3775,6 +4090,15 @@ body:has(> .zx-modal:modal) {
3775
4090
  align-items: center;
3776
4091
  gap: var(--zx-space-2);
3777
4092
  }
4093
+ .zx-select__entity-glyph {
4094
+ display: inline-grid;
4095
+ place-items: center;
4096
+ inline-size: 20px;
4097
+ block-size: 20px;
4098
+ border-radius: var(--zx-radius-sm);
4099
+ background: var(--zx-select-entity-color, var(--zx-color-accent-subtle));
4100
+ color: var(--zx-color-text-invert);
4101
+ }
3778
4102
  .zx-select__status-copy,
3779
4103
  .zx-select__action-copy {
3780
4104
  display: grid;
@@ -4013,6 +4337,20 @@ body:has(> .zx-modal:modal) {
4013
4337
  font-size: var(--zx-text-sm);
4014
4338
  line-height: 1.5;
4015
4339
  }
4340
+ .zx-tag-picker__tag[data-colored=true] {
4341
+ border-color: color-mix(in srgb, var(--zx-tag-color) 48%, var(--zx-color-border));
4342
+ background: color-mix(in srgb, var(--zx-tag-color) 14%, var(--zx-color-bg-muted));
4343
+ }
4344
+ .zx-tag-picker__visual {
4345
+ display: inline-grid;
4346
+ place-items: center;
4347
+ flex: none;
4348
+ inline-size: 18px;
4349
+ block-size: 18px;
4350
+ border-radius: var(--zx-radius-sm);
4351
+ background: color-mix(in srgb, var(--zx-tag-color, var(--zx-color-accent)) 16%, transparent);
4352
+ color: var(--zx-tag-color, var(--zx-color-accent));
4353
+ }
4016
4354
  .zx-tag-picker__tag:not(:has(.zx-tag-picker__remove)) {
4017
4355
  padding-inline-end: var(--zx-space-2);
4018
4356
  }
@@ -4103,6 +4441,9 @@ body:has(> .zx-modal:modal) {
4103
4441
  color: var(--zx-color-accent);
4104
4442
  }
4105
4443
  .zx-tag-picker__option-label {
4444
+ display: flex;
4445
+ align-items: center;
4446
+ gap: var(--zx-space-2);
4106
4447
  overflow: hidden;
4107
4448
  text-overflow: ellipsis;
4108
4449
  white-space: nowrap;
@@ -5173,6 +5514,88 @@ body:has(> .zx-modal:modal) {
5173
5514
  .zx-table {
5174
5515
  min-inline-size: 0;
5175
5516
  }
5517
+ .zx-table__column-controls {
5518
+ position: relative;
5519
+ inline-size: max-content;
5520
+ margin: 0 0 var(--zx-space-2) auto;
5521
+ }
5522
+ .zx-table__reorder-status {
5523
+ position: absolute;
5524
+ inline-size: 1px;
5525
+ block-size: 1px;
5526
+ overflow: hidden;
5527
+ clip-path: inset(50%);
5528
+ }
5529
+ .zx-table__column-controls > summary {
5530
+ display: inline-flex;
5531
+ align-items: center;
5532
+ gap: var(--zx-space-2);
5533
+ list-style: none;
5534
+ cursor: pointer;
5535
+ }
5536
+ .zx-table__column-controls > summary::-webkit-details-marker {
5537
+ display: none;
5538
+ }
5539
+ .zx-table__column-list {
5540
+ position: absolute;
5541
+ z-index: 4;
5542
+ inset-block-start: calc(100% + var(--zx-space-1));
5543
+ inset-inline-end: 0;
5544
+ display: grid;
5545
+ min-inline-size: 190px;
5546
+ border: 1px solid var(--zx-color-border-strong);
5547
+ border-radius: var(--zx-radius-md);
5548
+ background: var(--zx-color-bg-raised);
5549
+ box-shadow: var(--zx-overlay-shadow);
5550
+ padding: var(--zx-space-2);
5551
+ }
5552
+ .zx-table__column-option {
5553
+ display: flex;
5554
+ align-items: center;
5555
+ gap: var(--zx-space-2);
5556
+ min-block-size: var(--zx-control-height);
5557
+ border-radius: var(--zx-radius-sm);
5558
+ padding-inline: var(--zx-space-2);
5559
+ }
5560
+ .zx-table__column-option:hover {
5561
+ background: var(--zx-color-bg-hover);
5562
+ }
5563
+ .zx-table__reorder-column,
5564
+ .zx-table__reorder-header,
5565
+ .zx-table__reorder-cell {
5566
+ inline-size: var(--zx-control-height);
5567
+ text-align: center;
5568
+ }
5569
+ .zx-table__row-handle {
5570
+ display: inline-grid;
5571
+ place-items: center;
5572
+ inline-size: 26px;
5573
+ block-size: 26px;
5574
+ min-block-size: 0;
5575
+ border: 0;
5576
+ border-radius: var(--zx-radius-sm);
5577
+ background: transparent;
5578
+ padding: 0;
5579
+ color: var(--zx-color-text-muted);
5580
+ cursor: grab;
5581
+ }
5582
+ .zx-table__row-handle:hover,
5583
+ .zx-table__row-handle[aria-pressed=true] {
5584
+ background: var(--zx-color-bg-hover);
5585
+ color: var(--zx-color-text);
5586
+ }
5587
+ .zx-table__row-handle:active {
5588
+ cursor: grabbing;
5589
+ }
5590
+ .zx-table__body tr[data-dragging] {
5591
+ opacity: .55;
5592
+ }
5593
+ .zx-table__body tr[data-drop=before] {
5594
+ box-shadow: inset 0 2px 0 var(--zx-color-accent);
5595
+ }
5596
+ .zx-table__body tr[data-drop=after] {
5597
+ box-shadow: inset 0 -2px 0 var(--zx-color-accent);
5598
+ }
5176
5599
  .zx-table__scroll {
5177
5600
  position: relative;
5178
5601
  max-inline-size: 100%;
@@ -5462,6 +5885,9 @@ body:has(> .zx-modal:modal) {
5462
5885
  .zx-table[data-stacked] .zx-table__selection-cell {
5463
5886
  justify-content: flex-start;
5464
5887
  }
5888
+ .zx-table[data-stacked] .zx-table__reorder-cell {
5889
+ justify-content: flex-start;
5890
+ }
5465
5891
  .zx-table[data-stacked] .zx-table__empty-row {
5466
5892
  display: block;
5467
5893
  }
@@ -5482,7 +5908,7 @@ body:has(> .zx-modal:modal) {
5482
5908
 
5483
5909
  /* src/components/grid/grid.css */
5484
5910
  .zx-table[data-preset=billing-items] tr.zx-grid-billing__summary > td {
5485
- background: var(--zx-color-bg-subtle);
5911
+ background: var(--zx-color-bg-muted);
5486
5912
  font-weight: 700;
5487
5913
  }
5488
5914
 
@@ -5775,6 +6201,135 @@ body:has(> .zx-modal:modal) {
5775
6201
  display: none;
5776
6202
  }
5777
6203
 
6204
+ /* src/components/filter/filter.css */
6205
+ .zx-filter {
6206
+ display: grid;
6207
+ gap: var(--zx-space-3);
6208
+ color: var(--zx-color-text);
6209
+ }
6210
+ .zx-filter__status {
6211
+ position: absolute;
6212
+ inline-size: 1px;
6213
+ block-size: 1px;
6214
+ overflow: hidden;
6215
+ clip-path: inset(50%);
6216
+ }
6217
+ .zx-filter__group,
6218
+ .zx-filter__group > fieldset {
6219
+ min-inline-size: 0;
6220
+ margin: 0;
6221
+ border: 1px solid var(--zx-color-border);
6222
+ border-radius: var(--zx-radius-lg);
6223
+ background: var(--zx-color-bg-surface);
6224
+ padding: var(--zx-space-3);
6225
+ }
6226
+ .zx-filter__group .zx-filter__group {
6227
+ border: 0;
6228
+ border-inline-start: 3px solid var(--zx-color-border-strong);
6229
+ border-radius: 0;
6230
+ background: transparent;
6231
+ padding: 0 0 0 var(--zx-space-3);
6232
+ }
6233
+ .zx-filter__legend {
6234
+ display: inline-flex;
6235
+ align-items: center;
6236
+ gap: var(--zx-space-2);
6237
+ padding-inline: var(--zx-space-1);
6238
+ color: var(--zx-color-text-muted);
6239
+ font-size: var(--zx-text-sm);
6240
+ }
6241
+ .zx-filter__logic,
6242
+ .zx-filter__field,
6243
+ .zx-filter__operator,
6244
+ .zx-filter__value input,
6245
+ .zx-filter__value select {
6246
+ min-block-size: var(--zx-control-height);
6247
+ border: 1px solid var(--zx-color-border-control);
6248
+ border-radius: var(--zx-control-radius);
6249
+ background: var(--zx-color-bg-control);
6250
+ padding-inline: var(--zx-control-pad-x);
6251
+ color: var(--zx-color-text);
6252
+ font: inherit;
6253
+ }
6254
+ .zx-filter__logic {
6255
+ inline-size: auto;
6256
+ min-block-size: 28px;
6257
+ font-size: var(--zx-text-sm);
6258
+ }
6259
+ .zx-filter__children {
6260
+ display: grid;
6261
+ gap: var(--zx-space-2);
6262
+ margin: var(--zx-space-2) 0;
6263
+ padding: 0;
6264
+ list-style: none;
6265
+ }
6266
+ .zx-filter__condition {
6267
+ display: grid;
6268
+ grid-template-columns: minmax(9rem, 1fr) minmax(9rem, 1fr) minmax(10rem, 1.4fr) auto;
6269
+ align-items: start;
6270
+ gap: var(--zx-space-2);
6271
+ border-radius: var(--zx-radius-md);
6272
+ }
6273
+ .zx-filter__condition[data-invalid] {
6274
+ outline: 1px solid var(--zx-color-danger);
6275
+ outline-offset: var(--zx-space-1);
6276
+ }
6277
+ .zx-filter__value {
6278
+ display: grid;
6279
+ grid-template-columns: repeat(2, minmax(0, 1fr));
6280
+ gap: var(--zx-space-2);
6281
+ min-inline-size: 0;
6282
+ }
6283
+ .zx-filter__value-control,
6284
+ .zx-filter__value-control > input {
6285
+ inline-size: 100%;
6286
+ min-inline-size: 0;
6287
+ }
6288
+ .zx-filter__value > :only-child,
6289
+ .zx-filter__value--empty {
6290
+ grid-column: 1 / -1;
6291
+ }
6292
+ .zx-filter__value--empty {
6293
+ display: flex;
6294
+ align-items: center;
6295
+ min-block-size: var(--zx-control-height);
6296
+ padding-inline: var(--zx-control-pad-x);
6297
+ color: var(--zx-color-text-muted);
6298
+ font-size: var(--zx-text-sm);
6299
+ }
6300
+ .zx-filter__group-actions,
6301
+ .zx-filter__actions {
6302
+ display: flex;
6303
+ flex-wrap: wrap;
6304
+ gap: var(--zx-space-2);
6305
+ }
6306
+ .zx-filter__actions {
6307
+ justify-content: flex-end;
6308
+ }
6309
+ .zx-filter[data-readonly] .zx-filter__group-actions,
6310
+ .zx-filter[data-readonly] .zx-filter__actions,
6311
+ .zx-filter[data-disabled] .zx-filter__group-actions,
6312
+ .zx-filter[data-disabled] .zx-filter__actions {
6313
+ display: none;
6314
+ }
6315
+ @media (max-width: 680px) {
6316
+ .zx-filter__condition {
6317
+ grid-template-columns: minmax(0, 1fr);
6318
+ }
6319
+ .zx-filter__group .zx-filter__group {
6320
+ padding-inline-start: var(--zx-space-2);
6321
+ }
6322
+ .zx-filter__value {
6323
+ grid-template-columns: minmax(0, 1fr);
6324
+ }
6325
+ }
6326
+ @media (forced-colors: active) {
6327
+ .zx-filter__group,
6328
+ .zx-filter__condition[data-invalid] {
6329
+ border-color: CanvasText;
6330
+ }
6331
+ }
6332
+
5778
6333
  /* src/components/pagination/pagination.css */
5779
6334
  .zx-pagination {
5780
6335
  display: flex;