soltana-ui 0.1.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 +158 -0
- package/dist/config/index.d.ts +3 -0
- package/dist/config/index.js +7 -0
- package/dist/config/register.d.ts +27 -0
- package/dist/config/stylesheet.d.ts +13 -0
- package/dist/config/types.d.ts +177 -0
- package/dist/config/types.js +7 -0
- package/dist/config/validation.d.ts +29 -0
- package/dist/config/validation.js +59 -0
- package/dist/enhancers/accordion.d.ts +19 -0
- package/dist/enhancers/carousel.d.ts +21 -0
- package/dist/enhancers/collapsible.d.ts +14 -0
- package/dist/enhancers/color-picker.d.ts +20 -0
- package/dist/enhancers/combobox.d.ts +17 -0
- package/dist/enhancers/context-menu.d.ts +19 -0
- package/dist/enhancers/date-picker.d.ts +8 -0
- package/dist/enhancers/drawer.d.ts +11 -0
- package/dist/enhancers/dropdown.d.ts +17 -0
- package/dist/enhancers/hover-card.d.ts +15 -0
- package/dist/enhancers/index.d.ts +42 -0
- package/dist/enhancers/modal.d.ts +16 -0
- package/dist/enhancers/scroll-area.d.ts +14 -0
- package/dist/enhancers/tabs.d.ts +26 -0
- package/dist/enhancers/test-helpers.d.ts +20 -0
- package/dist/enhancers/test-utils.d.ts +10 -0
- package/dist/enhancers/toast.d.ts +24 -0
- package/dist/enhancers/tooltip.d.ts +15 -0
- package/dist/enhancers/tree.d.ts +24 -0
- package/dist/enhancers/utils/click-away.d.ts +7 -0
- package/dist/enhancers/utils/create-overlay-enhancer.d.ts +14 -0
- package/dist/enhancers/utils/focus-trap.d.ts +9 -0
- package/dist/enhancers/utils/generate-id.d.ts +6 -0
- package/dist/enhancers/utils/keyboard-nav.d.ts +21 -0
- package/dist/enhancers/utils/position.d.ts +30 -0
- package/dist/fonts/index.d.ts +20 -0
- package/dist/index.d.ts +9 -0
- package/dist/init.d.ts +16 -0
- package/dist/plugins/index.d.ts +2 -0
- package/dist/plugins/index.js +1 -0
- package/dist/plugins/postcss-soltana-treeshake.d.ts +10 -0
- package/dist/plugins/postcss-soltana-treeshake.js +149 -0
- package/dist/plugins/types.d.ts +9 -0
- package/dist/plugins/types.js +4 -0
- package/dist/soltana-ui.css +1 -0
- package/dist/soltana-ui.js +1702 -0
- package/dist/soltana-ui.umd.cjs +1 -0
- package/package.json +90 -0
- package/src/styles/_variables.scss +348 -0
- package/src/styles/base/_accessibility.scss +146 -0
- package/src/styles/base/_index.scss +12 -0
- package/src/styles/base/_register.scss +84 -0
- package/src/styles/base/_relief-system.scss +53 -0
- package/src/styles/base/_scrollbar.scss +40 -0
- package/src/styles/base/_transitions.scss +75 -0
- package/src/styles/base/_typography.scss +442 -0
- package/src/styles/components/_alert-dialogs.scss +75 -0
- package/src/styles/components/_badges.scss +215 -0
- package/src/styles/components/_buttons.scss +293 -0
- package/src/styles/components/_callouts.scss +99 -0
- package/src/styles/components/_cards.scss +97 -0
- package/src/styles/components/_carousels.scss +108 -0
- package/src/styles/components/_closes.scss +63 -0
- package/src/styles/components/_code.scss +75 -0
- package/src/styles/components/_collapsibles.scss +61 -0
- package/src/styles/components/_color-pickers.scss +211 -0
- package/src/styles/components/_comboboxes.scss +88 -0
- package/src/styles/components/_context-menus.scss +82 -0
- package/src/styles/components/_date-pickers.scss +165 -0
- package/src/styles/components/_feedback.scss +354 -0
- package/src/styles/components/_figures.scss +52 -0
- package/src/styles/components/_heros.scss +83 -0
- package/src/styles/components/_hover-cards.scss +55 -0
- package/src/styles/components/_images.scss +71 -0
- package/src/styles/components/_index.scss +41 -0
- package/src/styles/components/_indicators.scss +403 -0
- package/src/styles/components/_inputs.scss +409 -0
- package/src/styles/components/_layouts.scss +139 -0
- package/src/styles/components/_lists.scss +135 -0
- package/src/styles/components/_menus.scss +195 -0
- package/src/styles/components/_navigation.scss +325 -0
- package/src/styles/components/_overlays.scss +233 -0
- package/src/styles/components/_scroll-areas.scss +53 -0
- package/src/styles/components/_segmented-controls.scss +75 -0
- package/src/styles/components/_tables.scss +137 -0
- package/src/styles/components/_toasts.scss +111 -0
- package/src/styles/components/_toggles.scss +57 -0
- package/src/styles/components/_trees.scss +123 -0
- package/src/styles/decorative/_classical.scss +196 -0
- package/src/styles/decorative/_index.scss +7 -0
- package/src/styles/finishes/_index.scss +55 -0
- package/src/styles/index.scss +30 -0
- package/src/styles/reliefs/_index.scss +66 -0
- package/src/styles/reliefs/_neumorphic-tables.scss +92 -0
- package/src/styles/themes/_dark.scss +130 -0
- package/src/styles/themes/_index.scss +3 -0
- package/src/styles/themes/_light.scss +122 -0
- package/src/styles/themes/_sepia.scss +121 -0
- package/src/styles/utilities/_index.scss +13 -0
- package/src/styles/utilities/_layout.scss +100 -0
- package/src/styles/utilities/_mixins.scss +410 -0
- package/src/styles/utilities/_responsive.scss +46 -0
- package/src/styles/utilities/_sizing.scss +62 -0
- package/src/styles/utilities/_spacing.scss +12 -0
- package/src/styles/utilities/_visual.scss +436 -0
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// Tree View Component
|
|
3
|
+
// ---------------------------------------------------------------------------
|
|
4
|
+
// Hierarchical tree structure with expandable branches and selectable nodes.
|
|
5
|
+
// Uses --relief-* and --finish-* variables for tier integration.
|
|
6
|
+
// ---------------------------------------------------------------------------
|
|
7
|
+
|
|
8
|
+
@use '../base/register' as *;
|
|
9
|
+
@use '../base/accessibility' as *;
|
|
10
|
+
@use '../base/transitions' as *;
|
|
11
|
+
|
|
12
|
+
// ============================================================================
|
|
13
|
+
// CONTAINER
|
|
14
|
+
// ============================================================================
|
|
15
|
+
|
|
16
|
+
.tree {
|
|
17
|
+
font-family: var(--font-sans);
|
|
18
|
+
font-size: var(--text-sm);
|
|
19
|
+
color: var(--text-primary);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
// ============================================================================
|
|
23
|
+
// NODES
|
|
24
|
+
// ============================================================================
|
|
25
|
+
|
|
26
|
+
.tree-node {
|
|
27
|
+
display: flex;
|
|
28
|
+
flex-direction: column;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
.tree-node-content {
|
|
32
|
+
display: flex;
|
|
33
|
+
align-items: center;
|
|
34
|
+
gap: 0.25rem;
|
|
35
|
+
padding: 0.25rem 0.5rem;
|
|
36
|
+
border-radius: var(--radius-md);
|
|
37
|
+
cursor: pointer;
|
|
38
|
+
user-select: none;
|
|
39
|
+
@include transition-interactive(var(--transition-normal));
|
|
40
|
+
|
|
41
|
+
@include hover-state;
|
|
42
|
+
|
|
43
|
+
&:focus-visible {
|
|
44
|
+
@include focus-ring-outline($inset: true);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
&.selected {
|
|
48
|
+
background-color: var(--state-active);
|
|
49
|
+
color: var(--accent-primary);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// ============================================================================
|
|
54
|
+
// BRANCHES & LEAVES
|
|
55
|
+
// ============================================================================
|
|
56
|
+
|
|
57
|
+
.tree-branch > .tree-children {
|
|
58
|
+
overflow: hidden;
|
|
59
|
+
max-height: 0;
|
|
60
|
+
transition: max-height var(--transition-slow) var(--easing-in-out);
|
|
61
|
+
padding-left: 1.25rem;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
.tree-branch.active > .tree-children {
|
|
65
|
+
max-height: 999rem;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
.tree-leaf {
|
|
69
|
+
padding-left: 1.25rem;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// ============================================================================
|
|
73
|
+
// TOGGLE CHEVRON
|
|
74
|
+
// ============================================================================
|
|
75
|
+
|
|
76
|
+
.tree-toggle {
|
|
77
|
+
display: inline-flex;
|
|
78
|
+
align-items: center;
|
|
79
|
+
justify-content: center;
|
|
80
|
+
width: 1.25rem;
|
|
81
|
+
height: 1.25rem;
|
|
82
|
+
border: none;
|
|
83
|
+
background: none;
|
|
84
|
+
color: var(--text-muted);
|
|
85
|
+
cursor: pointer;
|
|
86
|
+
flex-shrink: 0;
|
|
87
|
+
padding: 0;
|
|
88
|
+
transition: transform var(--transition-normal) var(--easing-in-out);
|
|
89
|
+
|
|
90
|
+
&::after {
|
|
91
|
+
content: '';
|
|
92
|
+
display: inline-block;
|
|
93
|
+
width: 0.375em;
|
|
94
|
+
height: 0.375em;
|
|
95
|
+
border-right: 1.5px solid currentcolor;
|
|
96
|
+
border-bottom: 1.5px solid currentcolor;
|
|
97
|
+
transform: rotate(-45deg);
|
|
98
|
+
transition: transform var(--transition-normal) var(--easing-in-out);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
.tree-branch.active > .tree-node-content > &::after {
|
|
102
|
+
transform: rotate(45deg);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// ============================================================================
|
|
107
|
+
// INDENTATION GUIDES
|
|
108
|
+
// ============================================================================
|
|
109
|
+
|
|
110
|
+
.tree-indent {
|
|
111
|
+
position: relative;
|
|
112
|
+
padding-left: 1.25rem;
|
|
113
|
+
|
|
114
|
+
&::before {
|
|
115
|
+
content: '';
|
|
116
|
+
position: absolute;
|
|
117
|
+
top: 0;
|
|
118
|
+
bottom: 0;
|
|
119
|
+
left: 0.625rem;
|
|
120
|
+
width: 1px;
|
|
121
|
+
background-color: var(--border-subtle);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
@use 'sass:math';
|
|
2
|
+
@use '../base/register' as *;
|
|
3
|
+
|
|
4
|
+
// ---------------------------------------------------------------------------
|
|
5
|
+
// Classical Layout Utilities
|
|
6
|
+
// ---------------------------------------------------------------------------
|
|
7
|
+
// Golden ratio spacing, column-inspired layouts, and architectural
|
|
8
|
+
// section elements (pediment, entablature, plinth).
|
|
9
|
+
// These are thematic layout utilities (.space-golden-*, .columns-classical,
|
|
10
|
+
// .pediment, .plinth, etc.) intended for consumer application templates.
|
|
11
|
+
// These utilities are not consumed by the core component library.
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
13
|
+
|
|
14
|
+
// ---- Golden Ratio Spacing ----
|
|
15
|
+
// 1.618 : 1 ratio scale based on 1rem unit
|
|
16
|
+
$golden-ratio: 1.618;
|
|
17
|
+
|
|
18
|
+
// Exponent mapping: step 1 → φ⁻¹, step 2 → φ⁰ (base), step 3 → φ¹, ... step 6 → φ⁴
|
|
19
|
+
@for $i from 1 through 6 {
|
|
20
|
+
.space-golden-#{$i} {
|
|
21
|
+
--golden-space: #{math.pow($golden-ratio, $i - 2) * 1rem};
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// Golden ratio padding/margin utilities
|
|
26
|
+
.p-golden {
|
|
27
|
+
padding: var(--golden-space, #{$golden-ratio * 1rem});
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
.px-golden {
|
|
31
|
+
padding-left: var(--golden-space, #{$golden-ratio * 1rem});
|
|
32
|
+
padding-right: var(--golden-space, #{$golden-ratio * 1rem});
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
.py-golden {
|
|
36
|
+
padding-top: var(--golden-space, #{$golden-ratio * 1rem});
|
|
37
|
+
padding-bottom: var(--golden-space, #{$golden-ratio * 1rem});
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
.m-golden {
|
|
41
|
+
margin: var(--golden-space, #{$golden-ratio * 1rem});
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
.mx-golden {
|
|
45
|
+
margin-left: var(--golden-space, #{$golden-ratio * 1rem});
|
|
46
|
+
margin-right: var(--golden-space, #{$golden-ratio * 1rem});
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
.my-golden {
|
|
50
|
+
margin-top: var(--golden-space, #{$golden-ratio * 1rem});
|
|
51
|
+
margin-bottom: var(--golden-space, #{$golden-ratio * 1rem});
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
.gap-golden {
|
|
55
|
+
gap: var(--golden-space, #{$golden-ratio * 1rem});
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// ---- Golden Ratio Container ----
|
|
59
|
+
.ratio-golden {
|
|
60
|
+
max-width: 100%;
|
|
61
|
+
aspect-ratio: #{$golden-ratio} / 1;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
.ratio-golden-portrait {
|
|
65
|
+
max-width: 100%;
|
|
66
|
+
aspect-ratio: 1 / #{$golden-ratio};
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// ---- Classical Column Layout ----
|
|
70
|
+
// Multi-column layout with elegant proportions
|
|
71
|
+
.columns-classical,
|
|
72
|
+
.columns-classical-3 {
|
|
73
|
+
column-gap: math.pow($golden-ratio, 2) * 1rem;
|
|
74
|
+
column-rule: 1px solid var(--border-decorative);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
.columns-classical {
|
|
78
|
+
column-count: 2;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
.columns-classical-3 {
|
|
82
|
+
column-count: 3;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// ---- Pediment — triangular/arched top section ----
|
|
86
|
+
// Note: .pediment and .entablature intentionally use direct styling without tier
|
|
87
|
+
// bridge mixins. These represent structural and layout elements where tier-responsive
|
|
88
|
+
// surface treatment is not applicable. Only .plinth uses tier composition.
|
|
89
|
+
.pediment {
|
|
90
|
+
position: relative;
|
|
91
|
+
padding: math.pow($golden-ratio, 2) * 1rem $golden-ratio * 1rem $golden-ratio * 1rem;
|
|
92
|
+
text-align: center;
|
|
93
|
+
|
|
94
|
+
&::before {
|
|
95
|
+
content: '';
|
|
96
|
+
position: absolute;
|
|
97
|
+
top: 0;
|
|
98
|
+
left: 50%;
|
|
99
|
+
transform: translateX(-50%);
|
|
100
|
+
width: 80%;
|
|
101
|
+
height: 3px;
|
|
102
|
+
background: linear-gradient(
|
|
103
|
+
90deg,
|
|
104
|
+
transparent,
|
|
105
|
+
var(--accent-decorative) 20%,
|
|
106
|
+
color-mix(in srgb, var(--accent-decorative), white 40%) 50%,
|
|
107
|
+
var(--accent-decorative) 80%,
|
|
108
|
+
transparent
|
|
109
|
+
);
|
|
110
|
+
border-radius: 2px;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
&::after {
|
|
114
|
+
content: '';
|
|
115
|
+
position: absolute;
|
|
116
|
+
top: -6px;
|
|
117
|
+
left: 50%;
|
|
118
|
+
transform: translateX(-50%) rotate(45deg);
|
|
119
|
+
width: 12px;
|
|
120
|
+
height: 12px;
|
|
121
|
+
background: var(--accent-decorative);
|
|
122
|
+
border-radius: 2px;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// ---- Entablature — horizontal band (for headers/footers) ----
|
|
127
|
+
.entablature {
|
|
128
|
+
position: relative;
|
|
129
|
+
padding: 1rem $golden-ratio * 1rem;
|
|
130
|
+
border-top: 2px solid var(--border-decorative-strong);
|
|
131
|
+
border-bottom: 1px solid var(--border-decorative);
|
|
132
|
+
|
|
133
|
+
&::before {
|
|
134
|
+
content: '';
|
|
135
|
+
position: absolute;
|
|
136
|
+
top: -5px;
|
|
137
|
+
left: 0;
|
|
138
|
+
right: 0;
|
|
139
|
+
height: 1px;
|
|
140
|
+
background: var(--border-decorative);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
// ---- Plinth — base section ----
|
|
145
|
+
.plinth {
|
|
146
|
+
padding: $golden-ratio * 1rem;
|
|
147
|
+
@include finish-surface(var(--relief-surface-raised));
|
|
148
|
+
border-top: 1px solid var(--border-default);
|
|
149
|
+
position: relative;
|
|
150
|
+
|
|
151
|
+
&::before {
|
|
152
|
+
content: '';
|
|
153
|
+
position: absolute;
|
|
154
|
+
top: 0;
|
|
155
|
+
left: 5%;
|
|
156
|
+
right: 5%;
|
|
157
|
+
height: 2px;
|
|
158
|
+
background: linear-gradient(
|
|
159
|
+
90deg,
|
|
160
|
+
transparent,
|
|
161
|
+
var(--accent-decorative) 30%,
|
|
162
|
+
var(--accent-decorative) 70%,
|
|
163
|
+
transparent
|
|
164
|
+
);
|
|
165
|
+
opacity: 0.3;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
// ---- Architectural Section ----
|
|
170
|
+
// Combines pediment (top) + content + plinth (base) pattern
|
|
171
|
+
.section-classical {
|
|
172
|
+
position: relative;
|
|
173
|
+
padding: math.pow($golden-ratio, 3) * 1rem $golden-ratio * 1rem;
|
|
174
|
+
|
|
175
|
+
&::before {
|
|
176
|
+
content: '';
|
|
177
|
+
position: absolute;
|
|
178
|
+
top: 0;
|
|
179
|
+
left: 10%;
|
|
180
|
+
right: 10%;
|
|
181
|
+
height: 1px;
|
|
182
|
+
background: linear-gradient(90deg, transparent, var(--accent-decorative), transparent);
|
|
183
|
+
opacity: 0.3;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
&::after {
|
|
187
|
+
content: '';
|
|
188
|
+
position: absolute;
|
|
189
|
+
bottom: 0;
|
|
190
|
+
left: 10%;
|
|
191
|
+
right: 10%;
|
|
192
|
+
height: 1px;
|
|
193
|
+
background: linear-gradient(90deg, transparent, var(--accent-decorative), transparent);
|
|
194
|
+
opacity: 0.2;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// Decorative Index
|
|
3
|
+
// ---------------------------------------------------------------------------
|
|
4
|
+
// Classical layout utilities.
|
|
5
|
+
// ---------------------------------------------------------------------------
|
|
6
|
+
|
|
7
|
+
@forward 'classical';
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// Finish Selectors
|
|
3
|
+
// ---------------------------------------------------------------------------
|
|
4
|
+
// Surface treatments orthogonal to reliefs. Each finish sets blur, saturation,
|
|
5
|
+
// opacity, overlay, and sheen tokens consumed by components via the
|
|
6
|
+
// finish-surface() mixin.
|
|
7
|
+
// ---------------------------------------------------------------------------
|
|
8
|
+
|
|
9
|
+
@use '../base/register' as *;
|
|
10
|
+
|
|
11
|
+
@include register-finish('matte') {
|
|
12
|
+
--finish-blur: 0px;
|
|
13
|
+
--finish-saturation: 100%;
|
|
14
|
+
--finish-opacity: 1;
|
|
15
|
+
--finish-overlay: none;
|
|
16
|
+
--finish-sheen: none;
|
|
17
|
+
--bridge-backdrop-blur: 0px;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
@include register-finish('frosted') {
|
|
21
|
+
--finish-blur: 32px;
|
|
22
|
+
--finish-saturation: 80%;
|
|
23
|
+
--finish-opacity: 0.45;
|
|
24
|
+
--finish-overlay: none;
|
|
25
|
+
--finish-sheen: none;
|
|
26
|
+
--bridge-backdrop-blur: 32px;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
@include register-finish('tinted') {
|
|
30
|
+
--finish-blur: 0px;
|
|
31
|
+
--finish-saturation: 100%;
|
|
32
|
+
--finish-opacity: 1;
|
|
33
|
+
--finish-overlay: linear-gradient(
|
|
34
|
+
135deg,
|
|
35
|
+
rgb(var(--channel-tint-color) / 22%) 0%,
|
|
36
|
+
transparent 50%,
|
|
37
|
+
rgb(var(--shadow-color) / 14%) 100%
|
|
38
|
+
);
|
|
39
|
+
--finish-sheen: none;
|
|
40
|
+
--bridge-backdrop-blur: 0px;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
@include register-finish('glossy') {
|
|
44
|
+
--finish-blur: 0px;
|
|
45
|
+
--finish-saturation: 100%;
|
|
46
|
+
--finish-opacity: 1;
|
|
47
|
+
--finish-overlay: none;
|
|
48
|
+
--finish-sheen: linear-gradient(
|
|
49
|
+
135deg,
|
|
50
|
+
rgb(var(--channel-sheen-color) / 40%) 0%,
|
|
51
|
+
rgb(var(--channel-sheen-color) / 6%) 50%,
|
|
52
|
+
rgb(var(--channel-sheen-color) / 18%) 100%
|
|
53
|
+
);
|
|
54
|
+
--bridge-backdrop-blur: 0px;
|
|
55
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// Soltana Design System — Main Entry
|
|
3
|
+
// ---------------------------------------------------------------------------
|
|
4
|
+
// Layered architecture: variables → themes → base → components →
|
|
5
|
+
// reliefs → decorative → utilities.
|
|
6
|
+
// ---------------------------------------------------------------------------
|
|
7
|
+
|
|
8
|
+
// Foundation — Design tokens and CSS custom properties
|
|
9
|
+
@use 'variables';
|
|
10
|
+
|
|
11
|
+
// Themes — Color schemes (dark, light, sepia)
|
|
12
|
+
@use 'themes';
|
|
13
|
+
|
|
14
|
+
// Base — Typography and accessibility
|
|
15
|
+
@use 'base';
|
|
16
|
+
|
|
17
|
+
// Components — UI elements (buttons, inputs, cards, etc.)
|
|
18
|
+
@use 'components';
|
|
19
|
+
|
|
20
|
+
// Reliefs — Shadow and depth models
|
|
21
|
+
@use 'reliefs';
|
|
22
|
+
|
|
23
|
+
// Finishes — Surface treatments (blur, opacity, sheen)
|
|
24
|
+
@use 'finishes';
|
|
25
|
+
|
|
26
|
+
// Decorative — Classical layout utilities
|
|
27
|
+
@use 'decorative';
|
|
28
|
+
|
|
29
|
+
// Utilities — Helper classes (layout, spacing, sizing, visual)
|
|
30
|
+
@use 'utilities';
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// Relief Selectors
|
|
3
|
+
// ---------------------------------------------------------------------------
|
|
4
|
+
// Data-attribute selectors activated by initSoltana(). Class selectors
|
|
5
|
+
// available for per-element overrides. Each relief defines depth/shadow
|
|
6
|
+
// tokens consumed by all components.
|
|
7
|
+
// ---------------------------------------------------------------------------
|
|
8
|
+
|
|
9
|
+
@use '../base/register' as *;
|
|
10
|
+
@use 'neumorphic-tables';
|
|
11
|
+
|
|
12
|
+
@include register-relief('flat') {
|
|
13
|
+
--relief-bg: var(--relief-surface-flat);
|
|
14
|
+
--relief-shadow-sm: none;
|
|
15
|
+
--relief-shadow: none;
|
|
16
|
+
--relief-shadow-lg: none;
|
|
17
|
+
--relief-shadow-inset-sm: none;
|
|
18
|
+
--relief-shadow-inset: none;
|
|
19
|
+
--relief-shadow-inset-lg: none;
|
|
20
|
+
--relief-border: var(--relief-border-default);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
@include register-relief('glassmorphic') {
|
|
24
|
+
--relief-bg: var(--relief-surface-raised);
|
|
25
|
+
--relief-opacity: var(--glass-opacity);
|
|
26
|
+
--relief-shadow-sm: 0 2px 8px rgb(var(--shadow-color) / 8%);
|
|
27
|
+
--relief-shadow:
|
|
28
|
+
0 4px 16px rgb(var(--shadow-color) / 10%), 0 1px 4px rgb(var(--shadow-color) / 6%);
|
|
29
|
+
--relief-shadow-lg:
|
|
30
|
+
0 8px 32px rgb(var(--shadow-color) / 12%), 0 2px 8px rgb(var(--shadow-color) / 6%);
|
|
31
|
+
--relief-shadow-inset-sm: inset 0 0.5px 0 rgb(var(--highlight-color) / 10%);
|
|
32
|
+
--relief-shadow-inset: inset 0 1px 0 rgb(var(--highlight-color) / 12%);
|
|
33
|
+
--relief-shadow-inset-lg:
|
|
34
|
+
inset 0 1px 0 rgb(var(--highlight-color) / 15%), inset 0 -0.5px 0 rgb(var(--shadow-color) / 4%);
|
|
35
|
+
--relief-border: var(--relief-border-default);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
@include register-relief('skeuomorphic') {
|
|
39
|
+
--relief-bg: var(--relief-surface-raised);
|
|
40
|
+
--relief-shadow-sm:
|
|
41
|
+
0 1px 3px rgb(var(--shadow-color) / 14%), 0 1px 2px rgb(var(--shadow-color) / 24%);
|
|
42
|
+
--relief-shadow:
|
|
43
|
+
0 3px 6px rgb(var(--shadow-color) / 18%), 0 3px 6px rgb(var(--shadow-color) / 24%);
|
|
44
|
+
--relief-shadow-lg:
|
|
45
|
+
0 10px 20px rgb(var(--shadow-color) / 22%), 0 6px 6px rgb(var(--shadow-color) / 24%);
|
|
46
|
+
--relief-shadow-inset-sm:
|
|
47
|
+
inset 0 1px 0 rgb(var(--highlight-color) / 12%), inset 0 -1px 2px rgb(var(--shadow-color) / 10%);
|
|
48
|
+
--relief-shadow-inset:
|
|
49
|
+
inset 0 1px 0 rgb(var(--highlight-color) / 15%), inset 0 -2px 4px rgb(var(--shadow-color) / 14%);
|
|
50
|
+
--relief-shadow-inset-lg:
|
|
51
|
+
inset 0 2px 0 rgb(var(--highlight-color) / 18%), inset 0 -4px 8px rgb(var(--shadow-color) / 18%);
|
|
52
|
+
--relief-border: rgb(var(--shadow-color) / 8%);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
@include register-relief('neumorphic') {
|
|
56
|
+
--relief-bg: var(--relief-surface-deep);
|
|
57
|
+
--relief-shadow-sm: 2px 2px 5px var(--neu-shadow), -2px -2px 5px var(--neu-light);
|
|
58
|
+
--relief-shadow: 3px 3px 8px var(--neu-shadow), -3px -3px 8px var(--neu-light);
|
|
59
|
+
--relief-shadow-lg: 6px 6px 16px var(--neu-shadow), -5px -5px 14px var(--neu-light);
|
|
60
|
+
--relief-shadow-inset-sm:
|
|
61
|
+
inset 1px 1px 3px var(--neu-shadow), inset -1px -1px 3px var(--neu-light);
|
|
62
|
+
--relief-shadow-inset: inset 2px 2px 5px var(--neu-shadow), inset -2px -2px 5px var(--neu-light);
|
|
63
|
+
--relief-shadow-inset-lg:
|
|
64
|
+
inset 4px 4px 10px var(--neu-shadow), inset -4px -4px 10px var(--neu-light);
|
|
65
|
+
--relief-border: var(--relief-border-default);
|
|
66
|
+
}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// Neumorphic Table Override
|
|
3
|
+
// ---------------------------------------------------------------------------
|
|
4
|
+
// Cross-layer override: This relief selector modifies component-level table
|
|
5
|
+
// styles to support the neumorphic shadow model.
|
|
6
|
+
// Component styles overridden:
|
|
7
|
+
// - border-collapse: Changed from 'collapse' to 'separate' to enable
|
|
8
|
+
// per-cell shadow rendering (neumorphic shadows require discrete borders)
|
|
9
|
+
// - border-spacing: Set to '0 0.75rem' to create vertical gaps between rows,
|
|
10
|
+
// allowing inset shadows to render distinctly on each row
|
|
11
|
+
// - Row styling: Replaces default flat borders with gradient fills and
|
|
12
|
+
// multi-layer inset shadows to achieve the neumorphic depth effect
|
|
13
|
+
// This is an intentional cross-layer override, not accidental coupling. The
|
|
14
|
+
// neumorphic shadow model fundamentally conflicts with standard table
|
|
15
|
+
// border-collapse behavior, requiring relief-specific component overrides.
|
|
16
|
+
// ---------------------------------------------------------------------------
|
|
17
|
+
|
|
18
|
+
@use '../base/register' as *;
|
|
19
|
+
|
|
20
|
+
@mixin neu-table-gradient($highlight-opacity, $shadow-opacity) {
|
|
21
|
+
background: linear-gradient(
|
|
22
|
+
145deg,
|
|
23
|
+
rgb(var(--highlight-color) / $highlight-opacity),
|
|
24
|
+
rgb(var(--shadow-color) / $shadow-opacity)
|
|
25
|
+
);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
@include register-relief('neumorphic') {
|
|
29
|
+
.table {
|
|
30
|
+
border-collapse: separate;
|
|
31
|
+
border-spacing: 0 0.75rem;
|
|
32
|
+
|
|
33
|
+
th,
|
|
34
|
+
td {
|
|
35
|
+
border-bottom: none;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// Header row
|
|
39
|
+
thead th {
|
|
40
|
+
position: sticky;
|
|
41
|
+
top: 0;
|
|
42
|
+
z-index: 1;
|
|
43
|
+
background-color: var(--relief-surface-deep);
|
|
44
|
+
|
|
45
|
+
// Bridge token: --bridge-backdrop-blur is set by the finish tier and
|
|
46
|
+
// consumed here to compose relief + finish visual effects. The fallback
|
|
47
|
+
// (0) ensures the relief works independently when no finish is active.
|
|
48
|
+
backdrop-filter: blur(var(--bridge-backdrop-blur, 0));
|
|
49
|
+
|
|
50
|
+
&:first-child {
|
|
51
|
+
border-radius: var(--radius-lg) 0 0 var(--radius-lg);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
&:last-child {
|
|
55
|
+
border-radius: 0 var(--radius-lg) var(--radius-lg) 0;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// Body rows — gapped inset style
|
|
60
|
+
tbody tr {
|
|
61
|
+
@include neu-table-gradient(4%, 8%);
|
|
62
|
+
box-shadow:
|
|
63
|
+
var(--relief-shadow-inset-lg),
|
|
64
|
+
inset 0 0.5px 0 rgb(var(--highlight-color) / 10%),
|
|
65
|
+
inset 0 -0.5px 0 rgb(var(--shadow-color) / 8%);
|
|
66
|
+
|
|
67
|
+
td:first-child {
|
|
68
|
+
border-radius: var(--radius-lg) 0 0 var(--radius-lg);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
td:last-child {
|
|
72
|
+
border-radius: 0 var(--radius-lg) var(--radius-lg) 0;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
&:nth-child(even) {
|
|
76
|
+
@include neu-table-gradient(3%, 5%);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
&:hover:not(:disabled) {
|
|
80
|
+
@include neu-table-gradient(6%, 10%);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
&.active {
|
|
84
|
+
box-shadow:
|
|
85
|
+
var(--relief-shadow-inset-lg),
|
|
86
|
+
inset 4px 0 0 var(--relief-accent),
|
|
87
|
+
inset 0 0.5px 0 rgb(var(--highlight-color) / 10%),
|
|
88
|
+
inset 0 -0.5px 0 rgb(var(--shadow-color) / 8%);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|