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,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;