zeus-css 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 (105) hide show
  1. package/README.md +81 -0
  2. package/bin/init.js +89 -0
  3. package/dist/zeus.css +8456 -0
  4. package/dist/zeus.min.css +1 -0
  5. package/package.json +44 -0
  6. package/scss/.stylelintrc.json +41 -0
  7. package/scss/API.md +168 -0
  8. package/scss/CHANGELOG.md +281 -0
  9. package/scss/LICENSE +21 -0
  10. package/scss/README.md +160 -0
  11. package/scss/cheatsheet.md +249 -0
  12. package/scss/dist/zeus.css +8465 -0
  13. package/scss/dist/zeus.css.map +1 -0
  14. package/scss/dist/zeus.min.css +1 -0
  15. package/scss/dist/zeus.min.css.map +1 -0
  16. package/scss/foundation/core/_api.scss +10 -0
  17. package/scss/foundation/core/_design.scss +33 -0
  18. package/scss/foundation/core/_engine.scss +18 -0
  19. package/scss/foundation/core/buttons/variants.scss +72 -0
  20. package/scss/foundation/core/design/_design-system.scss +41 -0
  21. package/scss/foundation/core/design/_validate.scss +114 -0
  22. package/scss/foundation/core/design/borders/border-line.scss +29 -0
  23. package/scss/foundation/core/design/borders/border-radius.scss +31 -0
  24. package/scss/foundation/core/design/buttons/sizes.scss +32 -0
  25. package/scss/foundation/core/design/colors/_color-derivation.scss +80 -0
  26. package/scss/foundation/core/design/colors/base-colors.scss +31 -0
  27. package/scss/foundation/core/design/colors/semantic-colors.scss +130 -0
  28. package/scss/foundation/core/design/core/basic.scss +40 -0
  29. package/scss/foundation/core/design/dimensions/sizes.scss +29 -0
  30. package/scss/foundation/core/design/dimensions/spaces.scss +42 -0
  31. package/scss/foundation/core/design/effects/_z-index.scss +30 -0
  32. package/scss/foundation/core/design/effects/shadows.scss +65 -0
  33. package/scss/foundation/core/design/layout/grid.scss +86 -0
  34. package/scss/foundation/core/design/typography/typography.scss +435 -0
  35. package/scss/foundation/core/engine/_fluid-core.scss +54 -0
  36. package/scss/foundation/core/engine/animations.scss +91 -0
  37. package/scss/foundation/core/engine/buttons.scss +226 -0
  38. package/scss/foundation/core/engine/color-api.scss +37 -0
  39. package/scss/foundation/core/engine/helpers.scss +39 -0
  40. package/scss/foundation/core/engine/layout.scss +156 -0
  41. package/scss/foundation/core/engine/responsive.scss +67 -0
  42. package/scss/foundation/core/engine/shadows.scss +186 -0
  43. package/scss/foundation/core/engine/shortcuts.scss +30 -0
  44. package/scss/foundation/core/engine/sizing.scss +49 -0
  45. package/scss/foundation/core/engine/theme-builder.scss +83 -0
  46. package/scss/foundation/core/engine/typographics.scss +44 -0
  47. package/scss/foundation/core/engine/typography-calc.scss +71 -0
  48. package/scss/foundation/foundation.scss +29 -0
  49. package/scss/foundation/views/_render.scss +13 -0
  50. package/scss/foundation/views/components/_alert.scss +103 -0
  51. package/scss/foundation/views/components/_avatar.scss +84 -0
  52. package/scss/foundation/views/components/_badge.scss +100 -0
  53. package/scss/foundation/views/components/_breadcrumb.scss +70 -0
  54. package/scss/foundation/views/components/_card.scss +117 -0
  55. package/scss/foundation/views/components/_dropdown.scss +123 -0
  56. package/scss/foundation/views/components/_form.scss +209 -0
  57. package/scss/foundation/views/components/_index.scss +20 -0
  58. package/scss/foundation/views/components/_modal.scss +138 -0
  59. package/scss/foundation/views/components/_pagination.scss +82 -0
  60. package/scss/foundation/views/components/_skeleton.scss +69 -0
  61. package/scss/foundation/views/components/_table.scss +94 -0
  62. package/scss/foundation/views/components/_tabs.scss +96 -0
  63. package/scss/foundation/views/components/_toast.scss +139 -0
  64. package/scss/foundation/views/components/_tooltip.scss +100 -0
  65. package/scss/foundation/views/patterns/_hero.scss +121 -0
  66. package/scss/foundation/views/patterns/_index.scss +8 -0
  67. package/scss/foundation/views/patterns/_sidebar-layout.scss +83 -0
  68. package/scss/foundation/views/render/_layer-order.scss +11 -0
  69. package/scss/foundation/views/render/classes/_animations.scss +233 -0
  70. package/scss/foundation/views/render/classes/_aspect-ratio.scss +17 -0
  71. package/scss/foundation/views/render/classes/_borders.scss +31 -0
  72. package/scss/foundation/views/render/classes/_buttons.scss +40 -0
  73. package/scss/foundation/views/render/classes/_colors.scss +83 -0
  74. package/scss/foundation/views/render/classes/_compounds.scss +103 -0
  75. package/scss/foundation/views/render/classes/_containers.scss +20 -0
  76. package/scss/foundation/views/render/classes/_misc-utils.scss +51 -0
  77. package/scss/foundation/views/render/classes/_position.scss +56 -0
  78. package/scss/foundation/views/render/classes/_sections.scss +30 -0
  79. package/scss/foundation/views/render/classes/_shadows.scss +198 -0
  80. package/scss/foundation/views/render/classes/_sizes.scss +39 -0
  81. package/scss/foundation/views/render/classes/_sizing-utils.scss +53 -0
  82. package/scss/foundation/views/render/classes/_spacing.scss +91 -0
  83. package/scss/foundation/views/render/classes/_state-variants.scss +47 -0
  84. package/scss/foundation/views/render/classes/_typography.scss +32 -0
  85. package/scss/foundation/views/render/classes/_utilities.scss +103 -0
  86. package/scss/foundation/views/render/classes/_z-index.scss +22 -0
  87. package/scss/foundation/views/render/classes/flexbox.scss +56 -0
  88. package/scss/foundation/views/render/classes/grid.scss +195 -0
  89. package/scss/foundation/views/render/classes.scss +116 -0
  90. package/scss/foundation/views/render/html-body.scss +54 -0
  91. package/scss/foundation/views/render/property-registration.scss +77 -0
  92. package/scss/foundation/views/render/reset.scss +147 -0
  93. package/scss/foundation/views/render/root-generator.scss +166 -0
  94. package/scss/foundation/views/render/root.scss +19 -0
  95. package/scss/foundation/views/render/typography.scss +129 -0
  96. package/scss/llms.txt +247 -0
  97. package/scss/package.json +89 -0
  98. package/scss/scripts/gen-cheatsheet.mjs +178 -0
  99. package/scss/scripts/gen-tokens.mjs +91 -0
  100. package/scss/scripts/test-compile.mjs +474 -0
  101. package/scss/zeus.config.scss +99 -0
  102. package/scss/zeus.customize.scss +246 -0
  103. package/scss/zeus.scss +17 -0
  104. package/scss/zeus.token.sets.example.scss +176 -0
  105. package/scss/zeus.tokens.json +687 -0
@@ -0,0 +1,84 @@
1
+ // ╔══════════════════════════════════════════════════════════════╗
2
+ // ║ ⚡ Zeus CSS — Avatar ║
3
+ // ║ ║
4
+ // ║ Core structural and visual styles for the avatar component. ║
5
+ // ╚══════════════════════════════════════════════════════════════╝
6
+
7
+ @use "../../core/engine" as *;
8
+
9
+ // ╔══════════════════════════════════════════════════════════════╗
10
+ // ║ 🙂 Avatar Component ║
11
+ // ║ ║
12
+ // ║ Fixed-size circular image or initials. Deliberately NOT ║
13
+ // ║ fluid (clamp-based) like the rest of the token system — ║
14
+ // ║ avatars anchor to a person/entity's identity and should stay ║
15
+ // ║ visually stable across breakpoints, same reasoning as every ║
16
+ // ║ other design system's avatar scale. ║
17
+ // ║ ║
18
+ // ║ Usage: ║
19
+ // ║ <img class="z-avatar z-avatar--md" src="…" alt="Jane Doe" /> ║
20
+ // ║ <div class="z-avatar z-avatar--md">JD</div> ║
21
+ // ╚══════════════════════════════════════════════════════════════╝
22
+
23
+ @layer components {
24
+ $_avatar-sizes: (
25
+ "xs": 1.5rem,
26
+ "sm": 2rem,
27
+ "md": 2.5rem,
28
+ "lg": 3.5rem,
29
+ "xl": 5rem,
30
+ );
31
+
32
+ .z-avatar {
33
+ display: inline-flex;
34
+ align-items: center;
35
+ justify-content: center;
36
+ flex-shrink: 0;
37
+ @include border-radius("rounded");
38
+ overflow: hidden;
39
+ background: var(--color-surface-subtle);
40
+ color: var(--color-text-muted);
41
+ @include text("label-bold");
42
+ object-fit: cover;
43
+ user-select: none;
44
+
45
+ @each $name, $size in $_avatar-sizes {
46
+ &--#{$name} {
47
+ width: $size;
48
+ height: $size;
49
+ }
50
+ }
51
+
52
+ // ── Status dot — e.g. online/offline indicator ──────────────
53
+ // Wrap the image/initials + dot in a positioned .z-avatar-group
54
+ // item, or use directly on a position:relative parent.
55
+ &__status {
56
+ position: absolute;
57
+ inset-block-end: 0;
58
+ inset-inline-end: 0;
59
+ width: 25%;
60
+ aspect-ratio: 1;
61
+ border-radius: 50%;
62
+ border: var(--border-line-sm) solid var(--color-surface);
63
+ background: var(--color-border-strong);
64
+
65
+ &--online { background: var(--base-system-success); }
66
+ &--busy { background: var(--base-system-error); }
67
+ &--away { background: var(--base-system-warning); }
68
+ }
69
+ }
70
+
71
+ // ── Group — overlapping stack of avatars ──────────────────────
72
+ .z-avatar-group {
73
+ display: flex;
74
+
75
+ .z-avatar {
76
+ border: var(--border-line-sm) solid var(--color-surface);
77
+ margin-inline-start: -0.6em;
78
+
79
+ &:first-child {
80
+ margin-inline-start: 0;
81
+ }
82
+ }
83
+ }
84
+ }
@@ -0,0 +1,100 @@
1
+ // ╔══════════════════════════════════════════════════════════════╗
2
+ // ║ ⚡ Zeus CSS — Badge ║
3
+ // ║ ║
4
+ // ║ Core structural and visual styles for the badge component. ║
5
+ // ╚══════════════════════════════════════════════════════════════╝
6
+
7
+ @use "../../core/engine" as *;
8
+ @use "../../core/design/colors/color-derivation" as derive;
9
+
10
+ // ╔══════════════════════════════════════════════════════════════╗
11
+ // ║ 🏷️ Badge Component ║
12
+ // ║ ║
13
+ // ║ A small status/count pill. Soft-tint style by design: text ║
14
+ // ║ is always darkened via color-mix() toward black regardless ║
15
+ // ║ of how light the base hue is, so every variant clears WCAG ║
16
+ // ║ AA on its own tinted background without hand-picking a ║
17
+ // ║ passing shade per color (the trap that caught .btn-primary ║
18
+ // ║ originally — see the audit report P1-3). ║
19
+ // ║ ║
20
+ // ║ Usage: ║
21
+ // ║ <span class="z-badge z-badge--success">Active</span> ║
22
+ // ╚══════════════════════════════════════════════════════════════╝
23
+
24
+ @layer components {
25
+ // Private: background/text/border for one variant from a single CSS
26
+ // custom property. Mixed toward `transparent`, not `--color-surface`:
27
+ // surface has ~0 chroma but a *defined* (not "none") hue, and mixing a
28
+ // vivid color into a heavily-weighted near-zero-chroma-but-hued color
29
+ // does a real circular hue interpolation that can land far from the
30
+ // intended hue (verified live — every variant rendered as the same
31
+ // pinkish tint before this fix). Mixing toward transparent instead
32
+ // preserves the source hue exactly; the alpha shows the tint through
33
+ // whatever's actually behind the badge.
34
+ //
35
+ // Text is mixed 55% toward black so it stays dark (high contrast) even
36
+ // for light base hues like accent/secondary — verified via OKLab->sRGB:
37
+ // the lightest hue (accent, L 71.8%) still clears 7.3:1 against its own
38
+ // 12%-tint background at this ratio.
39
+ @mixin _badge-variant($css-var) {
40
+ background: color-mix(in oklch, var(#{$css-var}) 12%, transparent);
41
+ color: color-mix(in oklch, var(#{$css-var}) 55%, black);
42
+ border-color: color-mix(in oklch, var(#{$css-var}) 30%, transparent);
43
+ }
44
+
45
+ .z-badge {
46
+ display: inline-flex;
47
+ align-items: center;
48
+ gap: var(--space-3xs);
49
+ @include padding("3xs", "y");
50
+ @include padding("sm", "x");
51
+ @include border-radius("rounded");
52
+ @include text("caption-bold");
53
+ line-height: 1.4;
54
+ white-space: nowrap;
55
+ border: var(--border-line-xs) solid transparent;
56
+ background: var(--color-surface-subtle);
57
+ color: var(--color-text-muted);
58
+
59
+ &--primary { @include _badge-variant(--color-primary); }
60
+ &--secondary { @include _badge-variant(--color-secondary); }
61
+ &--accent { @include _badge-variant(--color-accent); }
62
+ &--success { @include _badge-variant(--base-system-success); }
63
+ &--warning { @include _badge-variant(--base-system-warning); }
64
+ &--error { @include _badge-variant(--base-system-error); }
65
+
66
+ // Private: full-strength fill for the --solid modifier. The foreground is
67
+ // NOT a fixed --color-text-inverse: it's derived per color, because the
68
+ // palette legitimately contains both dark colors that need light text
69
+ // (primary, accent, error) and light ones that need dark text (secondary,
70
+ // warning, success). Hardcoding white here shipped 2.20:1 on the brand
71
+ // secondary; derive-on-color() picks the readable side automatically and
72
+ // keeps following runtime overrides of the base color.
73
+ @mixin _badge-solid($css-var) {
74
+ background: var(#{$css-var});
75
+ border-color: var(#{$css-var});
76
+ color: #{derive.derive-on-color("var(#{$css-var})")};
77
+ }
78
+
79
+ // ── Solid modifier — max emphasis. Every variant clears WCAG AA
80
+ // (4.55–7.40:1, asserted by scripts/test-compile.mjs check 8) because
81
+ // the text color is derived from each fill rather than assumed white.
82
+ &--solid {
83
+ &.z-badge--primary { @include _badge-solid(--color-primary); }
84
+ &.z-badge--secondary { @include _badge-solid(--color-secondary); }
85
+ &.z-badge--accent { @include _badge-solid(--color-accent); }
86
+ &.z-badge--success { @include _badge-solid(--base-system-success); }
87
+ &.z-badge--warning { @include _badge-solid(--base-system-warning); }
88
+ &.z-badge--error { @include _badge-solid(--base-system-error); }
89
+ }
90
+
91
+ // ── Dot — leading status indicator, e.g. <span class="z-badge__dot"></span>
92
+ &__dot {
93
+ width: 6px;
94
+ height: 6px;
95
+ border-radius: 50%;
96
+ background: currentColor;
97
+ flex-shrink: 0;
98
+ }
99
+ }
100
+ }
@@ -0,0 +1,70 @@
1
+ // ╔══════════════════════════════════════════════════════════════╗
2
+ // ║ ⚡ Zeus CSS — Breadcrumb ║
3
+ // ║ ║
4
+ // ║ Core structural and visual styles for the breadcrumb. ║
5
+ // ╚══════════════════════════════════════════════════════════════╝
6
+
7
+ @use "../../core/engine" as *;
8
+ @use "../../core/design" as *;
9
+
10
+ // ╔══════════════════════════════════════════════════════════════╗
11
+ // ║ 🧭 Breadcrumb Component ║
12
+ // ║ ║
13
+ // ║ Usage: ║
14
+ // ║ <nav class="z-breadcrumb" aria-label="Breadcrumb"> ║
15
+ // ║ <ol> ║
16
+ // ║ <li><a href="/">Home</a></li> ║
17
+ // ║ <li><a href="/docs">Docs</a></li> ║
18
+ // ║ <li aria-current="page">API</li> ║
19
+ // ║ </ol> ║
20
+ // ║ </nav> ║
21
+ // ╚══════════════════════════════════════════════════════════════╝
22
+
23
+ @layer components {
24
+ .z-breadcrumb {
25
+ ol {
26
+ display: flex;
27
+ flex-wrap: wrap;
28
+ align-items: center;
29
+ list-style: none;
30
+ margin: 0;
31
+ padding: 0;
32
+ @include text("body-sm");
33
+ }
34
+
35
+ li {
36
+ display: flex;
37
+ align-items: center;
38
+ color: var(--color-text-muted);
39
+
40
+ // Separator before every item except the first.
41
+ &:not(:first-child)::before {
42
+ content: "/";
43
+ margin-inline: var(--space-2xs);
44
+ color: var(--color-border-strong);
45
+ }
46
+
47
+ // Current page — the only item without an <a> inside.
48
+ &[aria-current="page"] {
49
+ color: var(--color-text);
50
+ font-weight: 600;
51
+ }
52
+ }
53
+
54
+ a {
55
+ color: var(--color-text-muted);
56
+ text-decoration: none;
57
+
58
+ &:hover {
59
+ color: var(--color-primary);
60
+ text-decoration: underline;
61
+ }
62
+
63
+ &:focus-visible {
64
+ outline: $focus-ring;
65
+ outline-offset: 2px;
66
+ border-radius: 2px;
67
+ }
68
+ }
69
+ }
70
+ }
@@ -0,0 +1,117 @@
1
+ // ╔══════════════════════════════════════════════════════════════╗
2
+ // ║ ⚡ Zeus CSS — Card ║
3
+ // ║ ║
4
+ // ║ Core structural and visual styles for the card component. ║
5
+ // ╚══════════════════════════════════════════════════════════════╝
6
+
7
+ @use "../../../zeus.config" as config;
8
+ @use "../../core/engine" as *;
9
+
10
+ // ╔══════════════════════════════════════════════════════════════╗
11
+ // ║ 🃏 Card Component ║
12
+ // ║ ║
13
+ // ║ A self-contained content block with optional image, ║
14
+ // ║ header, body and footer sections. ║
15
+ // ║ ║
16
+ // ║ Usage: ║
17
+ // ║ <article class="z-card"> ║
18
+ // ║ <img class="z-card__media" src="…" alt="…" /> ║
19
+ // ║ <div class="z-card__body"> ║
20
+ // ║ <h3 class="z-card__title">…</h3> ║
21
+ // ║ <p class="z-card__text">…</p> ║
22
+ // ║ </div> ║
23
+ // ║ <footer class="z-card__footer">…</footer> ║
24
+ // ║ </article> ║
25
+ // ╚══════════════════════════════════════════════════════════════╝
26
+ // NOTE: .surface (views/render/classes/_compounds.scss, renamed from
27
+ // .zeus-card 25.07) is a separate, intentional single-class utility card for
28
+ // quick composition with other utility classes — not a duplicate of this
29
+ // BEM component. See its own header.
30
+
31
+ @layer components {
32
+ .z-card {
33
+ display: flex;
34
+ flex-direction: column;
35
+ @include border-radius("md");
36
+ @include card-shadow();
37
+ background: var(--color-surface);
38
+ border: var(--border-line-xs) solid var(--color-border);
39
+ overflow: hidden;
40
+ transition: box-shadow 0.25s ease, transform 0.25s ease;
41
+
42
+ &:hover {
43
+ box-shadow: var(--shadow-lg);
44
+ transform: translateY(-2px);
45
+ }
46
+
47
+ // ── Media (image/video at top) ───────────────────────────
48
+ &__media {
49
+ width: 100%;
50
+ aspect-ratio: 16 / 9;
51
+ object-fit: cover;
52
+ display: block;
53
+ }
54
+
55
+ // ── Inner Container & Structural Content ────────────────
56
+ &__body {
57
+ @include padding("lg");
58
+ flex: 1 1 auto;
59
+ display: flex;
60
+ flex-direction: column;
61
+ gap: var(--space-sm);
62
+ }
63
+
64
+ // ── Title ────────────────────────────────────────────────
65
+ &__title {
66
+ @include text("h5");
67
+ color: var(--color-text);
68
+ margin: 0;
69
+ }
70
+
71
+ // ── Card Description Copy ──────────────────────────────
72
+ &__text {
73
+ @include text("body-sm");
74
+ color: var(--color-text-muted);
75
+ margin: 0;
76
+ }
77
+
78
+ // ── Footer ───────────────────────────────────────────────
79
+ &__footer {
80
+ @include padding("md", "x");
81
+ @include padding("sm", "y");
82
+ border-top: var(--border-line-xs) solid var(--color-border);
83
+ display: flex;
84
+ align-items: center;
85
+ justify-content: flex-end;
86
+ gap: var(--space-sm);
87
+ }
88
+
89
+ // ── Modifiers ────────────────────────────────────────────
90
+ &--flat {
91
+ box-shadow: none;
92
+ &:hover {
93
+ box-shadow: none;
94
+ transform: none;
95
+ }
96
+ }
97
+
98
+ &--outlined {
99
+ box-shadow: none;
100
+ border: var(--border-line-md) solid var(--color-border-strong);
101
+ &:hover {
102
+ box-shadow: none;
103
+ transform: none;
104
+ }
105
+ }
106
+
107
+ &--horizontal {
108
+ flex-direction: row;
109
+
110
+ .z-card__media {
111
+ inline-size: 40%;
112
+ aspect-ratio: auto;
113
+ min-height: 100%;
114
+ }
115
+ }
116
+ }
117
+ }
@@ -0,0 +1,123 @@
1
+ // ╔══════════════════════════════════════════════════════════════╗
2
+ // ║ ⚡ Zeus CSS — Dropdown ║
3
+ // ║ ║
4
+ // ║ Core structural and visual styles for the dropdown component.║
5
+ // ╚══════════════════════════════════════════════════════════════╝
6
+
7
+ @use "../../core/engine" as *;
8
+ @use "../../core/design" as *;
9
+
10
+ // ╔══════════════════════════════════════════════════════════════╗
11
+ // ║ 📋 Dropdown Component — Native Popover API ║
12
+ // ║ ║
13
+ // ║ popover="auto" (the default): light-dismiss on outside ║
14
+ // ║ click/Escape, and opening this one closes any other "auto" ║
15
+ // ║ popover already open — exactly what a menu should do. Zero ║
16
+ // ║ JS for open/close/dismiss/focus-return. ║
17
+ // ║ ║
18
+ // ║ Positioning: same anchor-positioning contract as .z-tooltip ║
19
+ // ║ — pair trigger and menu with a shared, unique anchor-name. ║
20
+ // ║ ║
21
+ // ║ Usage: ║
22
+ // ║ <button class="z-btn" style="anchor-name:--menu1" ║
23
+ // ║ popovertarget="menu1">Options</button> ║
24
+ // ║ <div class="z-dropdown" id="menu1" popover ║
25
+ // ║ style="position-anchor:--menu1"> ║
26
+ // ║ <ul class="z-dropdown__list" role="menu"> ║
27
+ // ║ <li role="none"><a class="z-dropdown__item" role="menuitem" href="#">Edit</a></li> ║
28
+ // ║ <li role="none"><a class="z-dropdown__item z-dropdown__item--danger" role="menuitem" href="#">Delete</a></li> ║
29
+ // ║ </ul> ║
30
+ // ║ </div> ║
31
+ // ╚══════════════════════════════════════════════════════════════╝
32
+
33
+ @layer components {
34
+ .z-dropdown {
35
+ // Reset the UA [popover] box.
36
+ margin: 0;
37
+ border: var(--border-line-xs) solid var(--color-border);
38
+ padding: 0;
39
+ overflow: hidden;
40
+ color: inherit;
41
+
42
+ @include border-radius("md");
43
+ @include apply-shadow("dropdown");
44
+ background: var(--color-surface);
45
+ min-width: 180px;
46
+ max-width: 320px;
47
+
48
+ // Anchored below and toward the inline-end (right in LTR, left in
49
+ // RTL) of the trigger, with a small gap — falls back to opening
50
+ // upward when there's no room below.
51
+ position-anchor: none;
52
+ position-area: block-end inline-end;
53
+ position-try-fallbacks: flip-block;
54
+ margin-block-start: var(--space-3xs);
55
+
56
+ &__list {
57
+ list-style: none;
58
+ margin: 0;
59
+ @include padding("2xs", "y");
60
+ }
61
+
62
+ &__item {
63
+ display: flex;
64
+ align-items: center;
65
+ gap: var(--space-xs);
66
+ width: 100%;
67
+ @include padding("xs", "y");
68
+ @include padding("md", "x");
69
+ @include text("body-sm");
70
+ color: var(--color-text);
71
+ text-decoration: none;
72
+ background: none;
73
+ border: none;
74
+ cursor: pointer;
75
+
76
+ &:hover,
77
+ &:focus-visible {
78
+ background: var(--color-surface-subtle);
79
+ }
80
+
81
+ &:focus-visible {
82
+ outline: $focus-ring;
83
+ outline-offset: -2px;
84
+ }
85
+
86
+ &--danger {
87
+ color: var(--base-system-error);
88
+ }
89
+
90
+ &[aria-disabled="true"] {
91
+ opacity: 0.5;
92
+ pointer-events: none;
93
+ }
94
+ }
95
+
96
+ &__divider {
97
+ border: none;
98
+ border-top: var(--border-line-xs) solid var(--color-border);
99
+ @include margin("2xs", "y");
100
+ }
101
+
102
+ opacity: 0;
103
+ transform: translateY(-4px) scale(0.98);
104
+ transition: opacity 0.15s ease, transform 0.15s ease, overlay 0.15s allow-discrete, display 0.15s allow-discrete;
105
+
106
+ &:popover-open {
107
+ opacity: 1;
108
+ transform: translateY(0) scale(1);
109
+ }
110
+
111
+ @starting-style {
112
+ &:popover-open {
113
+ opacity: 0;
114
+ transform: translateY(-4px) scale(0.98);
115
+ }
116
+ }
117
+
118
+ @media (prefers-reduced-motion: reduce) {
119
+ transition: none;
120
+ transform: none;
121
+ }
122
+ }
123
+ }