osi-cards-lib 1.5.30 → 1.5.32
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 +58 -20
- package/package.json +13 -25
- package/postcss.config.js +81 -0
- package/section-registry.json +3864 -0
- package/section-registry.schema.json +264 -0
- package/fesm2022/osi-cards-lib.mjs +0 -31878
- package/fesm2022/osi-cards-lib.mjs.map +0 -1
- package/index.d.ts +0 -11522
- package/scripts/setup-angular-styles.js +0 -169
- package/styles/_components.scss +0 -38
- package/styles/_index.scss +0 -25
- package/styles/_osi-cards-mixins.scss +0 -459
- package/styles/_osi-cards-tokens.scss +0 -333
- package/styles/_styles-scoped.scss +0 -81
- package/styles/_styles.scss +0 -26
- package/styles/bundles/_ai-card.scss +0 -245
- package/styles/bundles/_all.scss +0 -68
- package/styles/bundles/_base.scss +0 -60
- package/styles/bundles/_card-skeleton.scss +0 -290
- package/styles/bundles/_index.scss +0 -25
- package/styles/bundles/_sections.scss +0 -48
- package/styles/bundles/_tokens-only.scss +0 -139
- package/styles/components/_ai-card-renderer.scss +0 -104
- package/styles/components/_badges.scss +0 -317
- package/styles/components/_card-actions.scss +0 -169
- package/styles/components/_card-footer.scss +0 -47
- package/styles/components/_component-styles.scss +0 -205
- package/styles/components/_empty-state.scss +0 -630
- package/styles/components/_hero-card.scss +0 -422
- package/styles/components/_image-fallback.scss +0 -28
- package/styles/components/_streaming-effects.scss +0 -518
- package/styles/components/cards/_ai-card.scss +0 -718
- package/styles/components/sections/_all-sections.generated.scss +0 -41
- package/styles/components/sections/_all-sections.scss +0 -1086
- package/styles/components/sections/_balanced-compact-system.scss +0 -186
- package/styles/components/sections/_compact-mixins.scss +0 -180
- package/styles/components/sections/_component-mixins.scss +0 -454
- package/styles/components/sections/_design-system.scss +0 -477
- package/styles/components/sections/_design-tokens.scss +0 -308
- package/styles/components/sections/_enhanced-design-variables.scss +0 -147
- package/styles/components/sections/_master-compact-system.scss +0 -302
- package/styles/components/sections/_master-dense-system.scss +0 -239
- package/styles/components/sections/_minimalistic-design.scss +0 -268
- package/styles/components/sections/_modern-effects.scss +0 -392
- package/styles/components/sections/_modern-sections.scss +0 -351
- package/styles/components/sections/_perfect-system.scss +0 -204
- package/styles/components/sections/_section-animations.scss +0 -331
- package/styles/components/sections/_section-shell.scss +0 -337
- package/styles/components/sections/_section-types.generated.scss +0 -30
- package/styles/components/sections/_sections-all.scss +0 -26
- package/styles/components/sections/_sections-base.scss +0 -334
- package/styles/components/sections/_typography-system.scss +0 -327
- package/styles/components/sections/_ultra-compact-tokens.scss +0 -375
- package/styles/components/sections/_unified-section-style.scss +0 -157
- package/styles/components/sections/_utility-classes.scss +0 -567
- package/styles/components/sections/_visual-effects-library.scss +0 -374
- package/styles/core/_animations.scss +0 -1498
- package/styles/core/_bootstrap-reset.scss +0 -445
- package/styles/core/_color-helpers.scss +0 -46
- package/styles/core/_global-unified.scss +0 -118
- package/styles/core/_global.scss +0 -73
- package/styles/core/_mixins.scss +0 -491
- package/styles/core/_surface-layers.scss +0 -76
- package/styles/core/_utilities.scss +0 -326
- package/styles/core/_variables-unified.scss +0 -57
- package/styles/core/_variables.scss +0 -36
- package/styles/core/variables/_colors-source.scss +0 -34
- package/styles/core/variables/_colors-unified.scss +0 -26
- package/styles/core/variables/_colors.scss +0 -21
- package/styles/critical.scss +0 -353
- package/styles/design-system/_compact-theme.scss +0 -159
- package/styles/design-system/_section-base.scss +0 -426
- package/styles/design-system/_tokens.scss +0 -237
- package/styles/design-system/_unified-sections.scss +0 -215
- package/styles/layout/_feature-grid.scss +0 -322
- package/styles/layout/_masonry.scss +0 -734
- package/styles/layout/_tilt.scss +0 -244
- package/styles/micro-interactions.scss +0 -583
- package/styles/mixins/_section-mixins.scss +0 -280
- package/styles/non-critical.scss +0 -643
- package/styles/reset/_framework-reset.scss +0 -457
- package/styles/reset/_index.scss +0 -14
- package/styles/reset/_shadow-reset.scss +0 -383
- package/styles/responsive.scss +0 -326
- package/styles/themes.scss +0 -573
- package/styles/tokens/_index.scss +0 -92
- package/styles/tokens/_master.scss +0 -1404
- package/styles/tokens/_section-tokens.generated.scss +0 -140
|
@@ -1,734 +0,0 @@
|
|
|
1
|
-
/* ============================================================
|
|
2
|
-
MASONRY LAYOUT STYLES
|
|
3
|
-
Standardized: 200px min column width, 12px gap
|
|
4
|
-
|
|
5
|
-
Supports:
|
|
6
|
-
- CSS native masonry (when browser supports it)
|
|
7
|
-
- JavaScript-based fallback with absolute positioning
|
|
8
|
-
- CSS Grid with dense packing as intermediate fallback
|
|
9
|
-
============================================================ */
|
|
10
|
-
|
|
11
|
-
/* ============================================================
|
|
12
|
-
CSS NATIVE MASONRY (Progressive Enhancement)
|
|
13
|
-
Use when browser supports grid-template-rows: masonry
|
|
14
|
-
============================================================ */
|
|
15
|
-
@supports (grid-template-rows: masonry) {
|
|
16
|
-
.masonry-container--native {
|
|
17
|
-
display: grid !important;
|
|
18
|
-
grid-template-columns: repeat(auto-fill, minmax(var(--section-grid-min-width, 260px), 1fr));
|
|
19
|
-
grid-template-rows: masonry;
|
|
20
|
-
gap: var(--section-card-gap, 12px);
|
|
21
|
-
align-tracks: stretch;
|
|
22
|
-
|
|
23
|
-
/* Native masonry doesn't need absolute positioning */
|
|
24
|
-
.masonry-item {
|
|
25
|
-
position: relative !important;
|
|
26
|
-
left: auto !important;
|
|
27
|
-
top: auto !important;
|
|
28
|
-
width: auto !important;
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
/* ============================================================
|
|
34
|
-
CSS GRID DENSE PACKING FALLBACK
|
|
35
|
-
Better than simple grid, handles varying heights
|
|
36
|
-
============================================================ */
|
|
37
|
-
.masonry-container--grid {
|
|
38
|
-
display: grid;
|
|
39
|
-
grid-template-columns: repeat(auto-fill, minmax(var(--section-grid-min-width, 260px), 1fr));
|
|
40
|
-
grid-auto-rows: minmax(100px, auto);
|
|
41
|
-
grid-auto-flow: dense;
|
|
42
|
-
gap: var(--section-card-gap, 12px);
|
|
43
|
-
|
|
44
|
-
/* Items span based on col-span data attribute */
|
|
45
|
-
.masonry-item {
|
|
46
|
-
position: relative;
|
|
47
|
-
|
|
48
|
-
&[data-col-span="2"] {
|
|
49
|
-
grid-column: span 2;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
&[data-col-span="3"] {
|
|
53
|
-
grid-column: span 3;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
&[data-col-span="4"] {
|
|
57
|
-
grid-column: span 4;
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
/* Ensure wide items don't overflow on small screens */
|
|
62
|
-
@media (max-width: 600px) {
|
|
63
|
-
.masonry-item[data-col-span] {
|
|
64
|
-
grid-column: span 1;
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
/* ============================================================
|
|
70
|
-
CSS SUBGRID SUPPORT (for aligned headers/bodies)
|
|
71
|
-
============================================================ */
|
|
72
|
-
@supports (grid-template-rows: subgrid) {
|
|
73
|
-
.masonry-container--subgrid .masonry-item {
|
|
74
|
-
display: grid;
|
|
75
|
-
grid-template-rows: subgrid;
|
|
76
|
-
grid-row: span 2; /* Header + body */
|
|
77
|
-
|
|
78
|
-
.ai-section__header {
|
|
79
|
-
grid-row: 1;
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
.ai-section__body {
|
|
83
|
-
grid-row: 2;
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
/* ============================================================
|
|
89
|
-
JAVASCRIPT-BASED MASONRY (Default/Fallback)
|
|
90
|
-
Uses absolute positioning calculated by component
|
|
91
|
-
============================================================ */
|
|
92
|
-
.masonry-grid-container {
|
|
93
|
-
position: relative;
|
|
94
|
-
width: 100%;
|
|
95
|
-
height: auto;
|
|
96
|
-
min-height: 200px;
|
|
97
|
-
|
|
98
|
-
/* GPU acceleration for smooth height changes */
|
|
99
|
-
will-change: height;
|
|
100
|
-
transform: translateZ(0);
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
.masonry-grid-container .masonry-item {
|
|
104
|
-
position: absolute;
|
|
105
|
-
width: auto;
|
|
106
|
-
height: auto;
|
|
107
|
-
box-sizing: border-box;
|
|
108
|
-
transform-origin: top left;
|
|
109
|
-
|
|
110
|
-
/* FLIP animation support */
|
|
111
|
-
will-change: transform, opacity;
|
|
112
|
-
backface-visibility: hidden;
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
.masonry-item {
|
|
116
|
-
height: fit-content;
|
|
117
|
-
min-height: fit-content;
|
|
118
|
-
width: 100%;
|
|
119
|
-
break-inside: avoid;
|
|
120
|
-
page-break-inside: avoid;
|
|
121
|
-
display: flex;
|
|
122
|
-
flex-direction: column;
|
|
123
|
-
overflow: visible;
|
|
124
|
-
box-sizing: border-box;
|
|
125
|
-
overflow-wrap: break-word;
|
|
126
|
-
word-wrap: break-word;
|
|
127
|
-
|
|
128
|
-
/* Performance optimization: CSS containment */
|
|
129
|
-
contain: layout style paint;
|
|
130
|
-
|
|
131
|
-
/* Performance optimization: content-visibility for off-screen items */
|
|
132
|
-
content-visibility: auto;
|
|
133
|
-
contain-intrinsic-size: auto 200px;
|
|
134
|
-
|
|
135
|
-
/* Smooth transitions for position and size changes */
|
|
136
|
-
transition:
|
|
137
|
-
top 0.4s cubic-bezier(0.4, 0, 0.2, 1),
|
|
138
|
-
left 0.4s cubic-bezier(0.4, 0, 0.2, 1),
|
|
139
|
-
width 0.4s cubic-bezier(0.4, 0, 0.2, 1),
|
|
140
|
-
opacity 0.35s ease-out;
|
|
141
|
-
|
|
142
|
-
/* GLOBALLY DEFINED: Use shared mixins for discrete section borders */
|
|
143
|
-
@include surface-section-base;
|
|
144
|
-
padding: var(--section-container-padding) !important;
|
|
145
|
-
|
|
146
|
-
/* Gap between header and body - standardized to 12px */
|
|
147
|
-
gap: var(--section-card-gap);
|
|
148
|
-
|
|
149
|
-
&:hover {
|
|
150
|
-
@include surface-section-hover;
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
.masonry-item > * {
|
|
155
|
-
height: auto !important;
|
|
156
|
-
min-height: fit-content !important;
|
|
157
|
-
max-height: none !important;
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
/* ============================================================
|
|
161
|
-
LEGACY GRID CLASSES
|
|
162
|
-
Using standardized 200px min width, 12px gap
|
|
163
|
-
============================================================ */
|
|
164
|
-
|
|
165
|
-
.masonry-grid {
|
|
166
|
-
display: grid;
|
|
167
|
-
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
|
|
168
|
-
grid-gap: 12px;
|
|
169
|
-
grid-auto-rows: minmax(100px, auto);
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
.card-grid {
|
|
173
|
-
display: grid;
|
|
174
|
-
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
|
|
175
|
-
grid-gap: 12px;
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
/* ============================================================
|
|
179
|
-
SECTION ORIENTATION MODIFIERS
|
|
180
|
-
Controls how content is arranged within sections
|
|
181
|
-
============================================================ */
|
|
182
|
-
|
|
183
|
-
/* Vertical orientation (default) - stack items in a column */
|
|
184
|
-
.masonry-item--vertical .ai-section__body {
|
|
185
|
-
display: flex !important;
|
|
186
|
-
flex-direction: column !important;
|
|
187
|
-
flex-wrap: nowrap !important;
|
|
188
|
-
align-items: stretch !important;
|
|
189
|
-
gap: var(--section-card-gap) !important;
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
/* Horizontal orientation - arrange items in a row */
|
|
193
|
-
.masonry-item--horizontal .ai-section__body {
|
|
194
|
-
display: flex !important;
|
|
195
|
-
flex-direction: row !important;
|
|
196
|
-
flex-wrap: wrap !important;
|
|
197
|
-
align-items: flex-start !important;
|
|
198
|
-
gap: var(--section-card-gap) !important;
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
/* Horizontal card sizing within horizontal sections */
|
|
202
|
-
.masonry-item--horizontal .ai-section__body > * {
|
|
203
|
-
flex: 1 1 200px !important;
|
|
204
|
-
min-width: 180px !important;
|
|
205
|
-
max-width: 100% !important;
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
/* Contact cards in horizontal mode */
|
|
209
|
-
.masonry-item--horizontal .contact-card,
|
|
210
|
-
.masonry-item--horizontal .network-card {
|
|
211
|
-
flex: 1 1 220px !important;
|
|
212
|
-
min-width: 200px !important;
|
|
213
|
-
max-width: 320px !important;
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
/* Metrics in horizontal mode - more compact */
|
|
217
|
-
.masonry-item--horizontal .analytics-metric,
|
|
218
|
-
.masonry-item--horizontal .financial-metric {
|
|
219
|
-
flex: 1 1 160px !important;
|
|
220
|
-
min-width: 140px !important;
|
|
221
|
-
max-width: 260px !important;
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
/* Overview cards in horizontal mode */
|
|
225
|
-
.masonry-item--horizontal .overview-card {
|
|
226
|
-
flex: 1 1 180px !important;
|
|
227
|
-
min-width: 160px !important;
|
|
228
|
-
max-width: 280px !important;
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
/* Auto orientation - let container queries decide */
|
|
232
|
-
.masonry-item--auto .ai-section__body {
|
|
233
|
-
display: flex !important;
|
|
234
|
-
flex-direction: column !important;
|
|
235
|
-
flex-wrap: wrap !important;
|
|
236
|
-
gap: var(--section-card-gap) !important;
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
/* Auto orientation switches to row on wide sections */
|
|
240
|
-
@container (min-width: 500px) {
|
|
241
|
-
.masonry-item--auto .ai-section__body {
|
|
242
|
-
flex-direction: row !important;
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
.masonry-item--auto .ai-section__body > * {
|
|
246
|
-
flex: 1 1 200px !important;
|
|
247
|
-
min-width: 180px !important;
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
/* Responsive orientation switching */
|
|
252
|
-
/* At narrow widths, horizontal sections become vertical */
|
|
253
|
-
@media (max-width: 480px) {
|
|
254
|
-
.masonry-item--horizontal .ai-section__body {
|
|
255
|
-
flex-direction: column !important;
|
|
256
|
-
flex-wrap: nowrap !important;
|
|
257
|
-
}
|
|
258
|
-
|
|
259
|
-
.masonry-item--horizontal .ai-section__body > * {
|
|
260
|
-
flex: 1 1 auto !important;
|
|
261
|
-
min-width: 100% !important;
|
|
262
|
-
max-width: 100% !important;
|
|
263
|
-
}
|
|
264
|
-
}
|
|
265
|
-
|
|
266
|
-
/* Container query support for per-section responsiveness */
|
|
267
|
-
.masonry-item {
|
|
268
|
-
container-type: inline-size;
|
|
269
|
-
container-name: section;
|
|
270
|
-
}
|
|
271
|
-
|
|
272
|
-
/* Priority-based visual indicators */
|
|
273
|
-
.masonry-item--priority-critical {
|
|
274
|
-
/* Critical sections get subtle emphasis */
|
|
275
|
-
&::before {
|
|
276
|
-
content: "";
|
|
277
|
-
position: absolute;
|
|
278
|
-
left: 0;
|
|
279
|
-
top: 0;
|
|
280
|
-
bottom: 0;
|
|
281
|
-
width: 3px;
|
|
282
|
-
background: var(--color-brand, #ff7900);
|
|
283
|
-
border-radius: 0 2px 2px 0;
|
|
284
|
-
}
|
|
285
|
-
}
|
|
286
|
-
|
|
287
|
-
.masonry-item--priority-important {
|
|
288
|
-
/* Important sections - no special border, use unified styling */
|
|
289
|
-
/* Left accent border removed for consistency */
|
|
290
|
-
}
|
|
291
|
-
|
|
292
|
-
/* Sticky sections */
|
|
293
|
-
.masonry-item--sticky {
|
|
294
|
-
position: sticky !important;
|
|
295
|
-
top: 0 !important;
|
|
296
|
-
z-index: 10 !important;
|
|
297
|
-
background: var(--card-background) !important;
|
|
298
|
-
}
|
|
299
|
-
|
|
300
|
-
/* Flex grow sections - expand to fill space */
|
|
301
|
-
.masonry-item--flex-grow {
|
|
302
|
-
flex-grow: 1 !important;
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
/* ============================================================
|
|
306
|
-
REDUCED MOTION SUPPORT
|
|
307
|
-
============================================================ */
|
|
308
|
-
|
|
309
|
-
@media (prefers-reduced-motion: reduce) {
|
|
310
|
-
.masonry-item,
|
|
311
|
-
.masonry-grid-container .masonry-item {
|
|
312
|
-
transition: none;
|
|
313
|
-
}
|
|
314
|
-
}
|
|
315
|
-
|
|
316
|
-
/* ============================================================
|
|
317
|
-
LAYOUT MODE MODIFIERS
|
|
318
|
-
============================================================ */
|
|
319
|
-
|
|
320
|
-
/* Compact mode - tighter spacing */
|
|
321
|
-
.masonry-container--compact {
|
|
322
|
-
--section-card-gap: 8px;
|
|
323
|
-
|
|
324
|
-
.masonry-item {
|
|
325
|
-
padding: calc(var(--section-container-padding) * 0.75) !important;
|
|
326
|
-
}
|
|
327
|
-
}
|
|
328
|
-
|
|
329
|
-
/* Comfortable mode - more spacing */
|
|
330
|
-
.masonry-container--comfortable {
|
|
331
|
-
--section-card-gap: 16px;
|
|
332
|
-
|
|
333
|
-
.masonry-item {
|
|
334
|
-
padding: calc(var(--section-container-padding) * 1.25) !important;
|
|
335
|
-
}
|
|
336
|
-
}
|
|
337
|
-
|
|
338
|
-
/* Track-aligned mode - sections snap to row tracks */
|
|
339
|
-
.masonry-container--track-aligned {
|
|
340
|
-
/* Use CSS Grid for track alignment */
|
|
341
|
-
display: grid;
|
|
342
|
-
grid-template-columns: repeat(var(--masonry-columns, 4), 1fr);
|
|
343
|
-
grid-auto-rows: minmax(50px, auto);
|
|
344
|
-
gap: var(--section-card-gap, 12px);
|
|
345
|
-
|
|
346
|
-
.masonry-item {
|
|
347
|
-
position: relative !important;
|
|
348
|
-
left: auto !important;
|
|
349
|
-
top: auto !important;
|
|
350
|
-
width: auto !important;
|
|
351
|
-
|
|
352
|
-
/* Align to nearest row track */
|
|
353
|
-
align-self: start;
|
|
354
|
-
}
|
|
355
|
-
}
|
|
356
|
-
|
|
357
|
-
/* ============================================================
|
|
358
|
-
VISUAL DEBUGGING MODE
|
|
359
|
-
============================================================ */
|
|
360
|
-
|
|
361
|
-
.masonry-container--debug {
|
|
362
|
-
/* Show grid lines */
|
|
363
|
-
background-image:
|
|
364
|
-
linear-gradient(to right, rgba(255, 121, 0, 0.1) 1px, transparent 1px),
|
|
365
|
-
linear-gradient(to bottom, rgba(255, 121, 0, 0.1) 1px, transparent 1px);
|
|
366
|
-
background-size: calc(100% / var(--masonry-columns, 4)) 50px;
|
|
367
|
-
|
|
368
|
-
.masonry-item {
|
|
369
|
-
outline: 2px dashed rgba(255, 121, 0, 0.5) !important;
|
|
370
|
-
outline-offset: -2px;
|
|
371
|
-
|
|
372
|
-
/* Show col-span as badge */
|
|
373
|
-
&::after {
|
|
374
|
-
content: attr(data-col-span) " col";
|
|
375
|
-
position: absolute;
|
|
376
|
-
top: 4px;
|
|
377
|
-
right: 4px;
|
|
378
|
-
background: rgba(255, 121, 0, 0.9);
|
|
379
|
-
color: white;
|
|
380
|
-
font-size: 10px;
|
|
381
|
-
font-weight: 600;
|
|
382
|
-
padding: 2px 6px;
|
|
383
|
-
border-radius: 4px;
|
|
384
|
-
z-index: 100;
|
|
385
|
-
pointer-events: none;
|
|
386
|
-
}
|
|
387
|
-
|
|
388
|
-
/* Show priority badge */
|
|
389
|
-
&[data-priority="critical"]::before {
|
|
390
|
-
content: "★ Critical";
|
|
391
|
-
position: absolute;
|
|
392
|
-
top: 4px;
|
|
393
|
-
left: 4px;
|
|
394
|
-
background: #ef4444;
|
|
395
|
-
color: white;
|
|
396
|
-
font-size: 9px;
|
|
397
|
-
font-weight: 600;
|
|
398
|
-
padding: 2px 4px;
|
|
399
|
-
border-radius: 3px;
|
|
400
|
-
z-index: 100;
|
|
401
|
-
}
|
|
402
|
-
|
|
403
|
-
&[data-priority="important"]::before {
|
|
404
|
-
content: "◆ Important";
|
|
405
|
-
position: absolute;
|
|
406
|
-
top: 4px;
|
|
407
|
-
left: 4px;
|
|
408
|
-
background: #f59e0b;
|
|
409
|
-
color: white;
|
|
410
|
-
font-size: 9px;
|
|
411
|
-
font-weight: 600;
|
|
412
|
-
padding: 2px 4px;
|
|
413
|
-
border-radius: 3px;
|
|
414
|
-
z-index: 100;
|
|
415
|
-
}
|
|
416
|
-
|
|
417
|
-
&[data-priority="optional"]::before {
|
|
418
|
-
content: "○ Optional";
|
|
419
|
-
position: absolute;
|
|
420
|
-
top: 4px;
|
|
421
|
-
left: 4px;
|
|
422
|
-
background: #6b7280;
|
|
423
|
-
color: white;
|
|
424
|
-
font-size: 9px;
|
|
425
|
-
font-weight: 600;
|
|
426
|
-
padding: 2px 4px;
|
|
427
|
-
border-radius: 3px;
|
|
428
|
-
z-index: 100;
|
|
429
|
-
}
|
|
430
|
-
}
|
|
431
|
-
}
|
|
432
|
-
|
|
433
|
-
/* ============================================================
|
|
434
|
-
STAGGERED ANIMATION SUPPORT
|
|
435
|
-
============================================================ */
|
|
436
|
-
|
|
437
|
-
.masonry-container--stagger-animations {
|
|
438
|
-
.masonry-item {
|
|
439
|
-
animation: masonry-item-appear 0.4s cubic-bezier(0.4, 0, 0.2, 1) backwards;
|
|
440
|
-
|
|
441
|
-
@for $i from 1 through 20 {
|
|
442
|
-
&:nth-child(#{$i}) {
|
|
443
|
-
animation-delay: #{($i - 1) * 50}ms;
|
|
444
|
-
}
|
|
445
|
-
}
|
|
446
|
-
}
|
|
447
|
-
}
|
|
448
|
-
|
|
449
|
-
@keyframes masonry-item-appear {
|
|
450
|
-
from {
|
|
451
|
-
opacity: 0;
|
|
452
|
-
transform: translate3d(0, 20px, 0) scale(0.95);
|
|
453
|
-
}
|
|
454
|
-
to {
|
|
455
|
-
opacity: 1;
|
|
456
|
-
transform: translate3d(0, 0, 0) scale(1);
|
|
457
|
-
}
|
|
458
|
-
}
|
|
459
|
-
|
|
460
|
-
/* ============================================================
|
|
461
|
-
CSS TRANSITIONS FOR REFLOW (Point 86)
|
|
462
|
-
Enhanced smooth transitions for position changes during reflow
|
|
463
|
-
============================================================ */
|
|
464
|
-
|
|
465
|
-
.masonry-item--transitioning {
|
|
466
|
-
/* Use GPU acceleration during transitions */
|
|
467
|
-
will-change: transform, left, top, width;
|
|
468
|
-
|
|
469
|
-
transition:
|
|
470
|
-
top 0.35s cubic-bezier(0.4, 0, 0.2, 1),
|
|
471
|
-
left 0.35s cubic-bezier(0.4, 0, 0.2, 1),
|
|
472
|
-
width 0.35s cubic-bezier(0.4, 0, 0.2, 1),
|
|
473
|
-
transform 0.35s cubic-bezier(0.4, 0, 0.2, 1),
|
|
474
|
-
opacity 0.25s ease-out;
|
|
475
|
-
}
|
|
476
|
-
|
|
477
|
-
/* Disable transitions during initial render */
|
|
478
|
-
.masonry-container--initializing .masonry-item {
|
|
479
|
-
transition: none !important;
|
|
480
|
-
}
|
|
481
|
-
|
|
482
|
-
/* Disable transitions when user prefers reduced motion */
|
|
483
|
-
@media (prefers-reduced-motion: reduce) {
|
|
484
|
-
.masonry-item,
|
|
485
|
-
.masonry-item--transitioning {
|
|
486
|
-
transition: none !important;
|
|
487
|
-
animation: none !important;
|
|
488
|
-
}
|
|
489
|
-
}
|
|
490
|
-
|
|
491
|
-
/* ============================================================
|
|
492
|
-
COLUMN HEIGHT BALANCING (Point 87)
|
|
493
|
-
Visual indicators for balanced columns
|
|
494
|
-
============================================================ */
|
|
495
|
-
|
|
496
|
-
.masonry-container--balanced {
|
|
497
|
-
/* Container shows balanced state */
|
|
498
|
-
&::after {
|
|
499
|
-
content: "";
|
|
500
|
-
position: absolute;
|
|
501
|
-
bottom: 0;
|
|
502
|
-
left: 0;
|
|
503
|
-
right: 0;
|
|
504
|
-
height: 2px;
|
|
505
|
-
background: linear-gradient(
|
|
506
|
-
to right,
|
|
507
|
-
transparent,
|
|
508
|
-
rgba(var(--primary-rgb, 59, 130, 246), 0.3),
|
|
509
|
-
transparent
|
|
510
|
-
);
|
|
511
|
-
opacity: 0;
|
|
512
|
-
transition: opacity 0.3s ease;
|
|
513
|
-
}
|
|
514
|
-
|
|
515
|
-
&:hover::after {
|
|
516
|
-
opacity: 1;
|
|
517
|
-
}
|
|
518
|
-
}
|
|
519
|
-
|
|
520
|
-
/* Column balance debug visualization */
|
|
521
|
-
.masonry-container--debug-balance {
|
|
522
|
-
.masonry-item {
|
|
523
|
-
position: relative;
|
|
524
|
-
|
|
525
|
-
&::after {
|
|
526
|
-
content: attr(data-column);
|
|
527
|
-
position: absolute;
|
|
528
|
-
top: -20px;
|
|
529
|
-
left: 50%;
|
|
530
|
-
transform: translateX(-50%);
|
|
531
|
-
background: rgba(0, 0, 0, 0.6);
|
|
532
|
-
color: white;
|
|
533
|
-
font-size: 10px;
|
|
534
|
-
padding: 2px 6px;
|
|
535
|
-
border-radius: 4px;
|
|
536
|
-
pointer-events: none;
|
|
537
|
-
}
|
|
538
|
-
}
|
|
539
|
-
}
|
|
540
|
-
|
|
541
|
-
/* ============================================================
|
|
542
|
-
SKELETON PLACEHOLDERS (Point 88)
|
|
543
|
-
Show approximate shapes while layout is calculating
|
|
544
|
-
============================================================ */
|
|
545
|
-
|
|
546
|
-
.masonry-skeleton {
|
|
547
|
-
position: relative;
|
|
548
|
-
background: linear-gradient(
|
|
549
|
-
90deg,
|
|
550
|
-
var(--skeleton-base, rgba(200, 200, 200, 0.2)) 25%,
|
|
551
|
-
var(--skeleton-highlight, rgba(200, 200, 200, 0.4)) 50%,
|
|
552
|
-
var(--skeleton-base, rgba(200, 200, 200, 0.2)) 75%
|
|
553
|
-
);
|
|
554
|
-
background-size: 200% 100%;
|
|
555
|
-
animation: skeleton-shimmer 1.5s infinite;
|
|
556
|
-
border-radius: var(--section-border-radius, 8px);
|
|
557
|
-
overflow: hidden;
|
|
558
|
-
}
|
|
559
|
-
|
|
560
|
-
.masonry-skeleton--single {
|
|
561
|
-
width: calc((100% - var(--masonry-gap, 12px) * 3) / 4);
|
|
562
|
-
height: 180px;
|
|
563
|
-
}
|
|
564
|
-
|
|
565
|
-
.masonry-skeleton--double {
|
|
566
|
-
width: calc((100% - var(--masonry-gap, 12px) * 3) / 4 * 2 + var(--masonry-gap, 12px));
|
|
567
|
-
height: 200px;
|
|
568
|
-
}
|
|
569
|
-
|
|
570
|
-
.masonry-skeleton--triple {
|
|
571
|
-
width: calc((100% - var(--masonry-gap, 12px) * 3) / 4 * 3 + var(--masonry-gap, 12px) * 2);
|
|
572
|
-
height: 220px;
|
|
573
|
-
}
|
|
574
|
-
|
|
575
|
-
.masonry-skeleton--full {
|
|
576
|
-
width: 100%;
|
|
577
|
-
height: 250px;
|
|
578
|
-
}
|
|
579
|
-
|
|
580
|
-
@keyframes skeleton-shimmer {
|
|
581
|
-
0% {
|
|
582
|
-
background-position: -200% 0;
|
|
583
|
-
}
|
|
584
|
-
100% {
|
|
585
|
-
background-position: 200% 0;
|
|
586
|
-
}
|
|
587
|
-
}
|
|
588
|
-
|
|
589
|
-
/* Skeleton content lines */
|
|
590
|
-
.masonry-skeleton__header {
|
|
591
|
-
height: 24px;
|
|
592
|
-
width: 60%;
|
|
593
|
-
margin: 16px;
|
|
594
|
-
background: rgba(0, 0, 0, 0.1);
|
|
595
|
-
border-radius: 4px;
|
|
596
|
-
}
|
|
597
|
-
|
|
598
|
-
.masonry-skeleton__line {
|
|
599
|
-
height: 16px;
|
|
600
|
-
margin: 8px 16px;
|
|
601
|
-
background: rgba(0, 0, 0, 0.08);
|
|
602
|
-
border-radius: 4px;
|
|
603
|
-
|
|
604
|
-
&:nth-child(2) {
|
|
605
|
-
width: 90%;
|
|
606
|
-
}
|
|
607
|
-
&:nth-child(3) {
|
|
608
|
-
width: 75%;
|
|
609
|
-
}
|
|
610
|
-
&:nth-child(4) {
|
|
611
|
-
width: 60%;
|
|
612
|
-
}
|
|
613
|
-
}
|
|
614
|
-
|
|
615
|
-
/* Skeleton container while loading */
|
|
616
|
-
.masonry-container--loading {
|
|
617
|
-
min-height: 400px;
|
|
618
|
-
|
|
619
|
-
.masonry-skeleton {
|
|
620
|
-
position: absolute;
|
|
621
|
-
|
|
622
|
-
@for $i from 1 through 8 {
|
|
623
|
-
&:nth-child(#{$i}) {
|
|
624
|
-
animation-delay: #{($i - 1) * 100}ms;
|
|
625
|
-
}
|
|
626
|
-
}
|
|
627
|
-
}
|
|
628
|
-
}
|
|
629
|
-
|
|
630
|
-
/* ============================================================
|
|
631
|
-
PRESERVE ORDER MODE (Point 89)
|
|
632
|
-
Classes for strict data order layout
|
|
633
|
-
============================================================ */
|
|
634
|
-
|
|
635
|
-
.masonry-container--preserve-order {
|
|
636
|
-
/* Items follow natural flow order */
|
|
637
|
-
.masonry-item {
|
|
638
|
-
order: var(--item-order, 0);
|
|
639
|
-
}
|
|
640
|
-
|
|
641
|
-
/* Show order numbers in debug mode */
|
|
642
|
-
&.masonry-container--debug {
|
|
643
|
-
.masonry-item::before {
|
|
644
|
-
content: "#" attr(data-index);
|
|
645
|
-
position: absolute;
|
|
646
|
-
top: 4px;
|
|
647
|
-
right: 4px;
|
|
648
|
-
background: rgba(0, 0, 0, 0.7);
|
|
649
|
-
color: white;
|
|
650
|
-
font-size: 10px;
|
|
651
|
-
padding: 2px 6px;
|
|
652
|
-
border-radius: 4px;
|
|
653
|
-
z-index: 100;
|
|
654
|
-
}
|
|
655
|
-
}
|
|
656
|
-
}
|
|
657
|
-
|
|
658
|
-
/* ============================================================
|
|
659
|
-
ACCESSIBILITY - ARIA FLOW (Point 90)
|
|
660
|
-
Visual indicators for reading order
|
|
661
|
-
============================================================ */
|
|
662
|
-
|
|
663
|
-
/* Focus styles for keyboard navigation following aria-flowto */
|
|
664
|
-
.masonry-item:focus-visible {
|
|
665
|
-
outline: 2px solid var(--focus-color, #3b82f6);
|
|
666
|
-
outline-offset: 2px;
|
|
667
|
-
z-index: 10;
|
|
668
|
-
}
|
|
669
|
-
|
|
670
|
-
/* Reading order indicator (debug mode) */
|
|
671
|
-
.masonry-container--show-reading-order {
|
|
672
|
-
.masonry-item {
|
|
673
|
-
&::after {
|
|
674
|
-
content: attr(data-reading-order);
|
|
675
|
-
position: absolute;
|
|
676
|
-
bottom: 4px;
|
|
677
|
-
right: 4px;
|
|
678
|
-
background: var(--reading-order-bg, #6366f1);
|
|
679
|
-
color: white;
|
|
680
|
-
font-size: 12px;
|
|
681
|
-
font-weight: bold;
|
|
682
|
-
width: 24px;
|
|
683
|
-
height: 24px;
|
|
684
|
-
display: flex;
|
|
685
|
-
align-items: center;
|
|
686
|
-
justify-content: center;
|
|
687
|
-
border-radius: 50%;
|
|
688
|
-
z-index: 100;
|
|
689
|
-
}
|
|
690
|
-
}
|
|
691
|
-
|
|
692
|
-
/* Connect items with visual flow lines */
|
|
693
|
-
.masonry-item[data-next-id]::before {
|
|
694
|
-
content: "";
|
|
695
|
-
position: absolute;
|
|
696
|
-
bottom: 16px;
|
|
697
|
-
right: -6px;
|
|
698
|
-
width: 20px;
|
|
699
|
-
height: 2px;
|
|
700
|
-
background: var(--reading-order-line, rgba(99, 102, 241, 0.3));
|
|
701
|
-
z-index: 99;
|
|
702
|
-
}
|
|
703
|
-
}
|
|
704
|
-
|
|
705
|
-
/* Skip link for keyboard users */
|
|
706
|
-
.masonry-skip-link {
|
|
707
|
-
position: absolute;
|
|
708
|
-
top: -9999px;
|
|
709
|
-
left: -9999px;
|
|
710
|
-
z-index: 1000;
|
|
711
|
-
padding: 12px 24px;
|
|
712
|
-
background: var(--skip-link-bg, #1e40af);
|
|
713
|
-
color: white;
|
|
714
|
-
text-decoration: none;
|
|
715
|
-
border-radius: 4px;
|
|
716
|
-
|
|
717
|
-
&:focus {
|
|
718
|
-
top: 12px;
|
|
719
|
-
left: 12px;
|
|
720
|
-
}
|
|
721
|
-
}
|
|
722
|
-
|
|
723
|
-
/* Screen reader only text */
|
|
724
|
-
.masonry-sr-only {
|
|
725
|
-
position: absolute;
|
|
726
|
-
width: 1px;
|
|
727
|
-
height: 1px;
|
|
728
|
-
padding: 0;
|
|
729
|
-
margin: -1px;
|
|
730
|
-
overflow: hidden;
|
|
731
|
-
clip: rect(0, 0, 0, 0);
|
|
732
|
-
white-space: nowrap;
|
|
733
|
-
border: 0;
|
|
734
|
-
}
|