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.
- package/README.md +81 -0
- package/bin/init.js +89 -0
- package/dist/zeus.css +8456 -0
- package/dist/zeus.min.css +1 -0
- package/package.json +44 -0
- package/scss/.stylelintrc.json +41 -0
- package/scss/API.md +168 -0
- package/scss/CHANGELOG.md +281 -0
- package/scss/LICENSE +21 -0
- package/scss/README.md +160 -0
- package/scss/cheatsheet.md +249 -0
- package/scss/dist/zeus.css +8465 -0
- package/scss/dist/zeus.css.map +1 -0
- package/scss/dist/zeus.min.css +1 -0
- package/scss/dist/zeus.min.css.map +1 -0
- package/scss/foundation/core/_api.scss +10 -0
- package/scss/foundation/core/_design.scss +33 -0
- package/scss/foundation/core/_engine.scss +18 -0
- package/scss/foundation/core/buttons/variants.scss +72 -0
- package/scss/foundation/core/design/_design-system.scss +41 -0
- package/scss/foundation/core/design/_validate.scss +114 -0
- package/scss/foundation/core/design/borders/border-line.scss +29 -0
- package/scss/foundation/core/design/borders/border-radius.scss +31 -0
- package/scss/foundation/core/design/buttons/sizes.scss +32 -0
- package/scss/foundation/core/design/colors/_color-derivation.scss +80 -0
- package/scss/foundation/core/design/colors/base-colors.scss +31 -0
- package/scss/foundation/core/design/colors/semantic-colors.scss +130 -0
- package/scss/foundation/core/design/core/basic.scss +40 -0
- package/scss/foundation/core/design/dimensions/sizes.scss +29 -0
- package/scss/foundation/core/design/dimensions/spaces.scss +42 -0
- package/scss/foundation/core/design/effects/_z-index.scss +30 -0
- package/scss/foundation/core/design/effects/shadows.scss +65 -0
- package/scss/foundation/core/design/layout/grid.scss +86 -0
- package/scss/foundation/core/design/typography/typography.scss +435 -0
- package/scss/foundation/core/engine/_fluid-core.scss +54 -0
- package/scss/foundation/core/engine/animations.scss +91 -0
- package/scss/foundation/core/engine/buttons.scss +226 -0
- package/scss/foundation/core/engine/color-api.scss +37 -0
- package/scss/foundation/core/engine/helpers.scss +39 -0
- package/scss/foundation/core/engine/layout.scss +156 -0
- package/scss/foundation/core/engine/responsive.scss +67 -0
- package/scss/foundation/core/engine/shadows.scss +186 -0
- package/scss/foundation/core/engine/shortcuts.scss +30 -0
- package/scss/foundation/core/engine/sizing.scss +49 -0
- package/scss/foundation/core/engine/theme-builder.scss +83 -0
- package/scss/foundation/core/engine/typographics.scss +44 -0
- package/scss/foundation/core/engine/typography-calc.scss +71 -0
- package/scss/foundation/foundation.scss +29 -0
- package/scss/foundation/views/_render.scss +13 -0
- package/scss/foundation/views/components/_alert.scss +103 -0
- package/scss/foundation/views/components/_avatar.scss +84 -0
- package/scss/foundation/views/components/_badge.scss +100 -0
- package/scss/foundation/views/components/_breadcrumb.scss +70 -0
- package/scss/foundation/views/components/_card.scss +117 -0
- package/scss/foundation/views/components/_dropdown.scss +123 -0
- package/scss/foundation/views/components/_form.scss +209 -0
- package/scss/foundation/views/components/_index.scss +20 -0
- package/scss/foundation/views/components/_modal.scss +138 -0
- package/scss/foundation/views/components/_pagination.scss +82 -0
- package/scss/foundation/views/components/_skeleton.scss +69 -0
- package/scss/foundation/views/components/_table.scss +94 -0
- package/scss/foundation/views/components/_tabs.scss +96 -0
- package/scss/foundation/views/components/_toast.scss +139 -0
- package/scss/foundation/views/components/_tooltip.scss +100 -0
- package/scss/foundation/views/patterns/_hero.scss +121 -0
- package/scss/foundation/views/patterns/_index.scss +8 -0
- package/scss/foundation/views/patterns/_sidebar-layout.scss +83 -0
- package/scss/foundation/views/render/_layer-order.scss +11 -0
- package/scss/foundation/views/render/classes/_animations.scss +233 -0
- package/scss/foundation/views/render/classes/_aspect-ratio.scss +17 -0
- package/scss/foundation/views/render/classes/_borders.scss +31 -0
- package/scss/foundation/views/render/classes/_buttons.scss +40 -0
- package/scss/foundation/views/render/classes/_colors.scss +83 -0
- package/scss/foundation/views/render/classes/_compounds.scss +103 -0
- package/scss/foundation/views/render/classes/_containers.scss +20 -0
- package/scss/foundation/views/render/classes/_misc-utils.scss +51 -0
- package/scss/foundation/views/render/classes/_position.scss +56 -0
- package/scss/foundation/views/render/classes/_sections.scss +30 -0
- package/scss/foundation/views/render/classes/_shadows.scss +198 -0
- package/scss/foundation/views/render/classes/_sizes.scss +39 -0
- package/scss/foundation/views/render/classes/_sizing-utils.scss +53 -0
- package/scss/foundation/views/render/classes/_spacing.scss +91 -0
- package/scss/foundation/views/render/classes/_state-variants.scss +47 -0
- package/scss/foundation/views/render/classes/_typography.scss +32 -0
- package/scss/foundation/views/render/classes/_utilities.scss +103 -0
- package/scss/foundation/views/render/classes/_z-index.scss +22 -0
- package/scss/foundation/views/render/classes/flexbox.scss +56 -0
- package/scss/foundation/views/render/classes/grid.scss +195 -0
- package/scss/foundation/views/render/classes.scss +116 -0
- package/scss/foundation/views/render/html-body.scss +54 -0
- package/scss/foundation/views/render/property-registration.scss +77 -0
- package/scss/foundation/views/render/reset.scss +147 -0
- package/scss/foundation/views/render/root-generator.scss +166 -0
- package/scss/foundation/views/render/root.scss +19 -0
- package/scss/foundation/views/render/typography.scss +129 -0
- package/scss/llms.txt +247 -0
- package/scss/package.json +89 -0
- package/scss/scripts/gen-cheatsheet.mjs +178 -0
- package/scss/scripts/gen-tokens.mjs +91 -0
- package/scss/scripts/test-compile.mjs +474 -0
- package/scss/zeus.config.scss +99 -0
- package/scss/zeus.customize.scss +246 -0
- package/scss/zeus.scss +17 -0
- package/scss/zeus.token.sets.example.scss +176 -0
- package/scss/zeus.tokens.json +687 -0
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
// ╔══════════════════════════════════════════════════════════════╗
|
|
2
|
+
// ║ ⚡ Zeus CSS — Tabs ║
|
|
3
|
+
// ║ ║
|
|
4
|
+
// ║ Core structural and visual styles for the tabs component. ║
|
|
5
|
+
// ╚══════════════════════════════════════════════════════════════╝
|
|
6
|
+
|
|
7
|
+
@use "../../core/engine" as *;
|
|
8
|
+
@use "../../core/design" as *;
|
|
9
|
+
|
|
10
|
+
// ╔══════════════════════════════════════════════════════════════╗
|
|
11
|
+
// ║ 📑 Tabs Component ║
|
|
12
|
+
// ║ ║
|
|
13
|
+
// ║ No popover involved — tabs are inline content, not floating ║
|
|
14
|
+
// ║ UI, so there's nothing to anchor-position. Styles read the ║
|
|
15
|
+
// ║ same two ARIA/HTML states the browser already gives you ║
|
|
16
|
+
// ║ (aria-selected, hidden) — same "native attribute drives the ║
|
|
17
|
+
// ║ look" contract as .z-modal's [open]. Switching which tab is ║
|
|
18
|
+
// ║ selected is the consumer's job (a few lines of vanilla JS ║
|
|
19
|
+
// ║ or your framework's state) — Zeus CSS ships zero JS. ║
|
|
20
|
+
// ║ ║
|
|
21
|
+
// ║ Usage: ║
|
|
22
|
+
// ║ <div class="z-tabs"> ║
|
|
23
|
+
// ║ <div class="z-tabs__list" role="tablist"> ║
|
|
24
|
+
// ║ <button class="z-tabs__tab" role="tab" id="t1" ║
|
|
25
|
+
// ║ aria-selected="true" aria-controls="p1">One</button> ║
|
|
26
|
+
// ║ <button class="z-tabs__tab" role="tab" id="t2" ║
|
|
27
|
+
// ║ aria-selected="false" aria-controls="p2">Two</button> ║
|
|
28
|
+
// ║ </div> ║
|
|
29
|
+
// ║ <div class="z-tabs__panel" role="tabpanel" id="p1" ║
|
|
30
|
+
// ║ aria-labelledby="t1">…</div> ║
|
|
31
|
+
// ║ <div class="z-tabs__panel" role="tabpanel" id="p2" ║
|
|
32
|
+
// ║ aria-labelledby="t2" hidden>…</div> ║
|
|
33
|
+
// ║ </div> ║
|
|
34
|
+
// ╚══════════════════════════════════════════════════════════════╝
|
|
35
|
+
|
|
36
|
+
@layer components {
|
|
37
|
+
.z-tabs {
|
|
38
|
+
&__list {
|
|
39
|
+
display: flex;
|
|
40
|
+
gap: var(--space-xs);
|
|
41
|
+
border-bottom: var(--border-line-xs) solid var(--color-border);
|
|
42
|
+
overflow-x: auto;
|
|
43
|
+
// Hide the scrollbar on overflow without hiding the ability to
|
|
44
|
+
// scroll — a horizontally-scrolling tablist on narrow viewports
|
|
45
|
+
// should still feel like tabs, not a visible scroll pane.
|
|
46
|
+
scrollbar-width: none;
|
|
47
|
+
&::-webkit-scrollbar { display: none; }
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
&__tab {
|
|
51
|
+
appearance: none;
|
|
52
|
+
background: none;
|
|
53
|
+
border: none;
|
|
54
|
+
cursor: pointer;
|
|
55
|
+
@include padding("sm", "y");
|
|
56
|
+
@include padding("md", "x");
|
|
57
|
+
@include text("body-sm");
|
|
58
|
+
font-weight: 600;
|
|
59
|
+
color: var(--color-text-muted);
|
|
60
|
+
border-bottom: var(--border-line-sm) solid transparent;
|
|
61
|
+
// Pull the tab's own bottom border over the list's hairline so the
|
|
62
|
+
// active indicator reads as one continuous edge, not two stacked lines.
|
|
63
|
+
margin-bottom: calc(var(--border-line-xs) * -1);
|
|
64
|
+
white-space: nowrap;
|
|
65
|
+
transition: color 0.15s ease, border-color 0.15s ease;
|
|
66
|
+
|
|
67
|
+
&:hover {
|
|
68
|
+
color: var(--color-text);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
&:focus-visible {
|
|
72
|
+
outline: $focus-ring;
|
|
73
|
+
outline-offset: -2px;
|
|
74
|
+
border-radius: 2px;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
&[aria-selected="true"] {
|
|
78
|
+
color: var(--color-primary);
|
|
79
|
+
border-bottom-color: var(--color-primary);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
&[disabled] {
|
|
83
|
+
opacity: 0.5;
|
|
84
|
+
cursor: not-allowed;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
&__panel {
|
|
89
|
+
@include padding("lg", "y");
|
|
90
|
+
|
|
91
|
+
&[hidden] {
|
|
92
|
+
display: none;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
// ╔══════════════════════════════════════════════════════════════╗
|
|
2
|
+
// ║ ⚡ Zeus CSS — Toast ║
|
|
3
|
+
// ║ ║
|
|
4
|
+
// ║ Core structural and visual styles for the toast component. ║
|
|
5
|
+
// ╚══════════════════════════════════════════════════════════════╝
|
|
6
|
+
|
|
7
|
+
@use "../../core/engine" as *;
|
|
8
|
+
@use "../../core/design" as *;
|
|
9
|
+
|
|
10
|
+
// ╔══════════════════════════════════════════════════════════════╗
|
|
11
|
+
// ║ 🔔 Toast Component — Native Popover API ║
|
|
12
|
+
// ║ ║
|
|
13
|
+
// ║ The stack itself is popover="manual": it needs to render in ║
|
|
14
|
+
// ║ the top layer (above modals, dropdowns, everything — no ║
|
|
15
|
+
// ║ z-index arithmetic required) but must NOT light-dismiss on ║
|
|
16
|
+
// ║ outside click/Escape the way "auto" would — a toast auto- ║
|
|
17
|
+
// ║ disappears on its own timer, not because the user clicked ║
|
|
18
|
+
// ║ elsewhere. Call region.showPopover() once; individual ║
|
|
19
|
+
// ║ toasts are plain children you append/remove — their auto- ║
|
|
20
|
+
// ║ dismiss timer is the one piece of JS this component still ║
|
|
21
|
+
// ║ needs (CSS alone can't schedule "remove me in 4s"). ║
|
|
22
|
+
// ║ ║
|
|
23
|
+
// ║ Usage: ║
|
|
24
|
+
// ║ <div class="z-toast-region" id="toasts" popover="manual"> ║
|
|
25
|
+
// ║ <div class="z-toast z-toast--success" role="status"> ║
|
|
26
|
+
// ║ <p class="z-toast__message">Saved.</p> ║
|
|
27
|
+
// ║ <button class="z-toast__close" aria-label="Dismiss">×</button> ║
|
|
28
|
+
// ║ </div> ║
|
|
29
|
+
// ║ </div> ║
|
|
30
|
+
// ║ <script>toasts.showPopover();</script> ║
|
|
31
|
+
// ╚══════════════════════════════════════════════════════════════╝
|
|
32
|
+
|
|
33
|
+
@layer components {
|
|
34
|
+
// Private: background/border/icon-color for one variant from a single
|
|
35
|
+
// base color token — same soft-tint approach as .z-badge, so every
|
|
36
|
+
// variant clears WCAG AA without hand-picking a passing shade per color.
|
|
37
|
+
@mixin _toast-variant($css-var) {
|
|
38
|
+
border-inline-start-color: var(#{$css-var});
|
|
39
|
+
|
|
40
|
+
.z-toast__icon {
|
|
41
|
+
color: var(#{$css-var});
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
.z-toast-region {
|
|
46
|
+
// Reset the UA [popover] box — this is a plain flow container for its
|
|
47
|
+
// toast children, not a bordered/inset panel like a menu or dialog.
|
|
48
|
+
position: fixed;
|
|
49
|
+
inset: auto var(--space-lg) var(--space-lg) auto;
|
|
50
|
+
margin: 0;
|
|
51
|
+
border: none;
|
|
52
|
+
padding: 0;
|
|
53
|
+
overflow: visible;
|
|
54
|
+
background: none;
|
|
55
|
+
color: inherit;
|
|
56
|
+
max-height: none;
|
|
57
|
+
max-width: min(90dvw, 380px);
|
|
58
|
+
|
|
59
|
+
// The layout only applies once actually shown — setting `display`
|
|
60
|
+
// unconditionally here would override the UA's own
|
|
61
|
+
// `[popover]:not(:popover-open) { display: none; }` rule and leave
|
|
62
|
+
// the region permanently visible regardless of showPopover() state.
|
|
63
|
+
&:popover-open {
|
|
64
|
+
display: flex;
|
|
65
|
+
flex-direction: column;
|
|
66
|
+
gap: var(--space-sm);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
.z-toast {
|
|
71
|
+
display: flex;
|
|
72
|
+
align-items: flex-start;
|
|
73
|
+
gap: var(--space-sm);
|
|
74
|
+
@include padding("md");
|
|
75
|
+
@include border-radius("md");
|
|
76
|
+
@include apply-shadow("dropdown");
|
|
77
|
+
background: var(--color-surface);
|
|
78
|
+
border: var(--border-line-xs) solid var(--color-border);
|
|
79
|
+
border-inline-start: 3px solid var(--color-border-strong);
|
|
80
|
+
|
|
81
|
+
@include slide-in(right, 0.25s);
|
|
82
|
+
|
|
83
|
+
&--success { @include _toast-variant(--base-system-success); }
|
|
84
|
+
&--warning { @include _toast-variant(--base-system-warning); }
|
|
85
|
+
&--danger { @include _toast-variant(--base-system-error); }
|
|
86
|
+
&--info { @include _toast-variant(--color-primary); }
|
|
87
|
+
|
|
88
|
+
&__icon {
|
|
89
|
+
flex-shrink: 0;
|
|
90
|
+
width: 1.25em;
|
|
91
|
+
height: 1.25em;
|
|
92
|
+
color: var(--color-text-muted);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
&__body {
|
|
96
|
+
flex: 1 1 auto;
|
|
97
|
+
min-width: 0;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
&__title {
|
|
101
|
+
@include text("body-sm-bold");
|
|
102
|
+
color: var(--color-text);
|
|
103
|
+
margin: 0 0 var(--space-4xs);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
&__message {
|
|
107
|
+
@include text("body-sm");
|
|
108
|
+
color: var(--color-text-muted);
|
|
109
|
+
margin: 0;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
&__close {
|
|
113
|
+
flex-shrink: 0;
|
|
114
|
+
appearance: none;
|
|
115
|
+
border: none;
|
|
116
|
+
background: transparent;
|
|
117
|
+
cursor: pointer;
|
|
118
|
+
padding: 0;
|
|
119
|
+
@include text("body");
|
|
120
|
+
color: var(--color-text-muted);
|
|
121
|
+
line-height: 1;
|
|
122
|
+
|
|
123
|
+
&:hover {
|
|
124
|
+
color: var(--color-text);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
&:focus-visible {
|
|
128
|
+
outline: $focus-ring;
|
|
129
|
+
outline-offset: 2px;
|
|
130
|
+
border-radius: 2px;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
@media (prefers-reduced-motion: reduce) {
|
|
135
|
+
animation: none;
|
|
136
|
+
opacity: 1;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
// ╔══════════════════════════════════════════════════════════════╗
|
|
2
|
+
// ║ ⚡ Zeus CSS — Tooltip ║
|
|
3
|
+
// ║ ║
|
|
4
|
+
// ║ Core structural and visual styles for the tooltip component. ║
|
|
5
|
+
// ╚══════════════════════════════════════════════════════════════╝
|
|
6
|
+
|
|
7
|
+
@use "../../core/engine" as *;
|
|
8
|
+
|
|
9
|
+
// ╔══════════════════════════════════════════════════════════════╗
|
|
10
|
+
// ║ 💬 Tooltip Component — Native Popover API ║
|
|
11
|
+
// ║ ║
|
|
12
|
+
// ║ popover="hint" (not "auto"): showing a hint never closes an ║
|
|
13
|
+
// ║ already-open menu/dialog popover the way "auto" would — the ║
|
|
14
|
+
// ║ correct type for a description that can appear alongside ║
|
|
15
|
+
// ║ other floating UI. popovertarget alone gives you click-to- ║
|
|
16
|
+
// ║ toggle with zero JS — the browser owns dismiss/focus return ║
|
|
17
|
+
// ║ once wired, same "native does the work" contract as ║
|
|
18
|
+
// ║ .z-modal's <dialog>/.showModal(). A hover/focus-triggered ║
|
|
19
|
+
// ║ tooltip (the usual expectation) needs a few lines of your ║
|
|
20
|
+
// ║ own JS calling .showPopover()/.hidePopover() on ║
|
|
21
|
+
// ║ mouseenter/mouseleave/focus/blur — that trigger logic isn't ║
|
|
22
|
+
// ║ something popovertarget provides on its own. ║
|
|
23
|
+
// ║ ║
|
|
24
|
+
// ║ Positioning uses CSS anchor positioning (position-anchor + ║
|
|
25
|
+
// ║ position-area) — pair trigger and tooltip with a shared, ║
|
|
26
|
+
// ║ unique anchor-name per instance. Browsers without anchor ║
|
|
27
|
+
// ║ positioning support just fall back to the UA's default ║
|
|
28
|
+
// ║ top-layer placement — still a fully functional, just ║
|
|
29
|
+
// ║ unanchored, tooltip — same progressive-enhancement shape as ║
|
|
30
|
+
// ║ the modal's ::backdrop + .z-modal-backdrop dual path. ║
|
|
31
|
+
// ║ ║
|
|
32
|
+
// ║ Usage: ║
|
|
33
|
+
// ║ <button style="anchor-name:--tip1" popovertarget="tip1"> ║
|
|
34
|
+
// ║ Info ║
|
|
35
|
+
// ║ </button> ║
|
|
36
|
+
// ║ <div class="z-tooltip" id="tip1" popover="hint" role="tooltip" ║
|
|
37
|
+
// ║ style="position-anchor:--tip1"> ║
|
|
38
|
+
// ║ Helpful, short explanatory text. ║
|
|
39
|
+
// ║ </div> ║
|
|
40
|
+
// ╚══════════════════════════════════════════════════════════════╝
|
|
41
|
+
|
|
42
|
+
@layer components {
|
|
43
|
+
.z-tooltip {
|
|
44
|
+
// Reset the UA [popover] box (border/inset/margin/padding/colors) —
|
|
45
|
+
// color/background are set for real a few lines down, not reset here.
|
|
46
|
+
margin: 0;
|
|
47
|
+
border: none;
|
|
48
|
+
padding: 0;
|
|
49
|
+
overflow: visible;
|
|
50
|
+
|
|
51
|
+
@include padding("2xs", "y");
|
|
52
|
+
@include padding("sm", "x");
|
|
53
|
+
@include border-radius("sm");
|
|
54
|
+
@include text("caption");
|
|
55
|
+
@include apply-shadow("sm");
|
|
56
|
+
background: var(--color-text);
|
|
57
|
+
color: var(--color-text-inverse);
|
|
58
|
+
max-width: 240px;
|
|
59
|
+
width: max-content;
|
|
60
|
+
|
|
61
|
+
// No anchor by default — the consumer pairs trigger and tooltip by
|
|
62
|
+
// setting `position-anchor: --your-name` inline on this element (see
|
|
63
|
+
// usage above); that inline declaration outranks this class rule.
|
|
64
|
+
// Anchored above the trigger, with breathing room and flip fallbacks
|
|
65
|
+
// for when there's no room above.
|
|
66
|
+
position-anchor: none;
|
|
67
|
+
position-area: top;
|
|
68
|
+
position-try-fallbacks: flip-block, flip-inline;
|
|
69
|
+
margin-block-end: var(--space-2xs);
|
|
70
|
+
|
|
71
|
+
// No @supports guard needed: browsers without anchor positioning simply
|
|
72
|
+
// ignore the unrecognized position-anchor/position-area/position-try-
|
|
73
|
+
// fallbacks values (standard CSS forward-compatible parsing) and fall
|
|
74
|
+
// through to the UA's default top-layer placement — still a fully
|
|
75
|
+
// functional popover, just centered instead of anchored to the trigger.
|
|
76
|
+
&:popover-open {
|
|
77
|
+
opacity: 1;
|
|
78
|
+
transform: translateY(0) scale(1);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// Entrance/exit transition on the top layer — requires
|
|
82
|
+
// transition-behavior: allow-discrete to animate across the
|
|
83
|
+
// display: none <-> block flip that [popover] does internally.
|
|
84
|
+
opacity: 0;
|
|
85
|
+
transform: translateY(4px) scale(0.98);
|
|
86
|
+
transition: opacity 0.12s ease, transform 0.12s ease, overlay 0.12s allow-discrete, display 0.12s allow-discrete;
|
|
87
|
+
|
|
88
|
+
@starting-style {
|
|
89
|
+
&:popover-open {
|
|
90
|
+
opacity: 0;
|
|
91
|
+
transform: translateY(4px) scale(0.98);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
@media (prefers-reduced-motion: reduce) {
|
|
96
|
+
transition: none;
|
|
97
|
+
transform: none;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
// ╔══════════════════════════════════════════════════════════════╗
|
|
2
|
+
// ║ ⚡ Zeus CSS — Hero ║
|
|
3
|
+
// ║ ║
|
|
4
|
+
// ║ Core styles and definitions for hero. ║
|
|
5
|
+
// ╚══════════════════════════════════════════════════════════════╝
|
|
6
|
+
|
|
7
|
+
@use "../../../zeus.config" as config;
|
|
8
|
+
@use "../../core/engine" as *;
|
|
9
|
+
|
|
10
|
+
// ╔══════════════════════════════════════════════════════════════╗
|
|
11
|
+
// ║ 🦸 Hero Pattern ║
|
|
12
|
+
// ║ ║
|
|
13
|
+
// ║ Full-width introductory section with title, subtitle, ║
|
|
14
|
+
// ║ optional CTA and background image support. ║
|
|
15
|
+
// ║ ║
|
|
16
|
+
// ║ Usage: ║
|
|
17
|
+
// ║ <section class="z-hero"> ║
|
|
18
|
+
// ║ <div class="z-hero__content"> ║
|
|
19
|
+
// ║ <h1 class="z-hero__title">…</h1> ║
|
|
20
|
+
// ║ <p class="z-hero__subtitle">…</p> ║
|
|
21
|
+
// ║ <div class="z-hero__actions"> ║
|
|
22
|
+
// ║ <a class="z-hero__cta">Get Started</a> ║
|
|
23
|
+
// ║ </div> ║
|
|
24
|
+
// ║ </div> ║
|
|
25
|
+
// ║ </section> ║
|
|
26
|
+
// ╚══════════════════════════════════════════════════════════════╝
|
|
27
|
+
|
|
28
|
+
@layer components {
|
|
29
|
+
.z-hero {
|
|
30
|
+
position: relative;
|
|
31
|
+
display: flex;
|
|
32
|
+
align-items: center;
|
|
33
|
+
justify-content: center;
|
|
34
|
+
min-height: 60svh;
|
|
35
|
+
@include padding("4xl", "y");
|
|
36
|
+
@include padding("xl", "x");
|
|
37
|
+
text-align: center;
|
|
38
|
+
overflow: hidden;
|
|
39
|
+
|
|
40
|
+
// ── Content wrapper ──────────────────────────────────────
|
|
41
|
+
&__content {
|
|
42
|
+
position: relative;
|
|
43
|
+
z-index: 1;
|
|
44
|
+
max-width: 800px;
|
|
45
|
+
margin-inline: auto;
|
|
46
|
+
display: flex;
|
|
47
|
+
flex-direction: column;
|
|
48
|
+
align-items: center;
|
|
49
|
+
gap: var(--space-lg);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// ── Title ────────────────────────────────────────────────
|
|
53
|
+
&__title {
|
|
54
|
+
@include text("display-lg");
|
|
55
|
+
color: var(--color-text);
|
|
56
|
+
margin: 0;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// ── Subtitle ─────────────────────────────────────────────
|
|
60
|
+
&__subtitle {
|
|
61
|
+
@include text("body-xl");
|
|
62
|
+
color: var(--color-text-muted);
|
|
63
|
+
margin: 0;
|
|
64
|
+
max-width: 640px;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// ── Actions row ──────────────────────────────────────────
|
|
68
|
+
&__actions {
|
|
69
|
+
display: flex;
|
|
70
|
+
flex-wrap: wrap;
|
|
71
|
+
gap: var(--space-md);
|
|
72
|
+
justify-content: center;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// ── Background image overlay ─────────────────────────────
|
|
76
|
+
&--with-bg {
|
|
77
|
+
color: var(--color-text-inverse);
|
|
78
|
+
background-size: cover;
|
|
79
|
+
background-position: center;
|
|
80
|
+
|
|
81
|
+
&::before {
|
|
82
|
+
content: "";
|
|
83
|
+
position: absolute;
|
|
84
|
+
inset: 0;
|
|
85
|
+
background: rgba(0, 0, 0, 0.55);
|
|
86
|
+
z-index: 0;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
.z-hero__title,
|
|
90
|
+
.z-hero__subtitle {
|
|
91
|
+
color: var(--color-text-inverse);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
.z-hero__subtitle {
|
|
95
|
+
opacity: 0.85;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// ── Alignment modifiers ──────────────────────────────────
|
|
100
|
+
&--start {
|
|
101
|
+
text-align: start;
|
|
102
|
+
|
|
103
|
+
.z-hero__content {
|
|
104
|
+
align-items: flex-start;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
.z-hero__actions {
|
|
108
|
+
justify-content: flex-start;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// ── Height modifiers ─────────────────────────────────────
|
|
113
|
+
&--full {
|
|
114
|
+
min-height: 100svh;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
&--compact {
|
|
118
|
+
min-height: 40svh;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
// ╔══════════════════════════════════════════════════════════════╗
|
|
2
|
+
// ║ ⚡ Zeus CSS — Index ║
|
|
3
|
+
// ║ ║
|
|
4
|
+
// ║ Core styles and definitions for index. ║
|
|
5
|
+
// ╚══════════════════════════════════════════════════════════════╝
|
|
6
|
+
|
|
7
|
+
@forward "./hero";
|
|
8
|
+
@forward "./sidebar-layout";
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
// ╔══════════════════════════════════════════════════════════════╗
|
|
2
|
+
// ║ ⚡ Zeus CSS — Sidebar Layout ║
|
|
3
|
+
// ║ ║
|
|
4
|
+
// ║ Core styles and definitions for sidebar layout. ║
|
|
5
|
+
// ╚══════════════════════════════════════════════════════════════╝
|
|
6
|
+
|
|
7
|
+
@use "../../../zeus.config" as config;
|
|
8
|
+
@use "../../core/engine" as *;
|
|
9
|
+
|
|
10
|
+
// ╔══════════════════════════════════════════════════════════════╗
|
|
11
|
+
// ║ 📐 Sidebar Layout Pattern ║
|
|
12
|
+
// ║ ║
|
|
13
|
+
// ║ Classic content + sidebar layout with fluid breakpoint. ║
|
|
14
|
+
// ║ Uses CSS Grid — sidebar collapses below content on mobile. ║
|
|
15
|
+
// ║ ║
|
|
16
|
+
// ║ Usage: ║
|
|
17
|
+
// ║ <div class="z-sidebar-layout"> ║
|
|
18
|
+
// ║ <main class="z-sidebar-layout__main">…</main> ║
|
|
19
|
+
// ║ <aside class="z-sidebar-layout__aside">…</aside> ║
|
|
20
|
+
// ║ </div> ║
|
|
21
|
+
// ╚══════════════════════════════════════════════════════════════╝
|
|
22
|
+
|
|
23
|
+
@layer components {
|
|
24
|
+
.z-sidebar-layout {
|
|
25
|
+
display: grid;
|
|
26
|
+
gap: var(--col-gap-md);
|
|
27
|
+
@include padding("lg");
|
|
28
|
+
|
|
29
|
+
// On small screens: single column, sidebar below content.
|
|
30
|
+
// minmax(0, 1fr) — not bare 1fr — so wide min-content children
|
|
31
|
+
// (code blocks, long monospace strings) can't blow the grid out
|
|
32
|
+
// past its container. The __main min-width: 0 below handles the
|
|
33
|
+
// grid ITEM; this handles the track itself.
|
|
34
|
+
grid-template-columns: minmax(0, 1fr);
|
|
35
|
+
|
|
36
|
+
// When there's enough space: content + sidebar side by side
|
|
37
|
+
@include screen-above(md) {
|
|
38
|
+
grid-template-columns: minmax(0, 1fr) 300px;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
@include screen-above(lg) {
|
|
42
|
+
grid-template-columns: minmax(0, 1fr) 360px;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// ── Main content ─────────────────────────────────────────
|
|
46
|
+
&__main {
|
|
47
|
+
min-width: 0; // prevent grid blowout
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// ── Sidebar ──────────────────────────────────────────────
|
|
51
|
+
&__aside {
|
|
52
|
+
display: flex;
|
|
53
|
+
flex-direction: column;
|
|
54
|
+
gap: var(--space-lg);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// ── Modifiers ────────────────────────────────────────────
|
|
58
|
+
&--sidebar-left {
|
|
59
|
+
@include screen-above(md) {
|
|
60
|
+
grid-template-columns: 300px minmax(0, 1fr);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
@include screen-above(lg) {
|
|
64
|
+
grid-template-columns: 360px minmax(0, 1fr);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// Place sidebar first visually
|
|
68
|
+
.z-sidebar-layout__aside {
|
|
69
|
+
order: -1;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
&--sticky-aside {
|
|
74
|
+
.z-sidebar-layout__aside {
|
|
75
|
+
@include screen-above(md) {
|
|
76
|
+
position: sticky;
|
|
77
|
+
top: var(--space-lg);
|
|
78
|
+
align-self: start;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
// ╔══════════════════════════════════════════════════════════════╗
|
|
2
|
+
// ║ ⚡ Zeus CSS — Layer Order ║
|
|
3
|
+
// ║ ║
|
|
4
|
+
// ║ Establishes the cascade layer order BEFORE any layer receives ║
|
|
5
|
+
// ║ rules. Must be @forward'ed FIRST from views/_render.scss — ║
|
|
6
|
+
// ║ a @layer order statement only reliably fixes the cascade ║
|
|
7
|
+
// ║ order if it is the first time any of the named layers are ║
|
|
8
|
+
// ║ mentioned anywhere in the compiled output. ║
|
|
9
|
+
// ╚══════════════════════════════════════════════════════════════╝
|
|
10
|
+
|
|
11
|
+
@layer reset, tokens, base, layout, components, utilities;
|