osi-cards-lib 1.5.32 → 1.5.34

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 (87) hide show
  1. package/fesm2022/osi-cards-lib.mjs +31889 -0
  2. package/fesm2022/osi-cards-lib.mjs.map +1 -0
  3. package/index.d.ts +11528 -0
  4. package/package.json +25 -13
  5. package/scripts/setup-angular-styles.js +169 -0
  6. package/styles/_components.scss +38 -0
  7. package/styles/_index.scss +25 -0
  8. package/styles/_osi-cards-mixins.scss +459 -0
  9. package/styles/_osi-cards-tokens.scss +333 -0
  10. package/styles/_styles-scoped.scss +81 -0
  11. package/styles/_styles.scss +26 -0
  12. package/styles/bundles/_ai-card.scss +245 -0
  13. package/styles/bundles/_all.scss +68 -0
  14. package/styles/bundles/_base.scss +60 -0
  15. package/styles/bundles/_card-skeleton.scss +290 -0
  16. package/styles/bundles/_index.scss +25 -0
  17. package/styles/bundles/_sections.scss +48 -0
  18. package/styles/bundles/_tokens-only.scss +139 -0
  19. package/styles/components/_ai-card-renderer.scss +104 -0
  20. package/styles/components/_badges.scss +317 -0
  21. package/styles/components/_card-actions.scss +169 -0
  22. package/styles/components/_card-footer.scss +47 -0
  23. package/styles/components/_component-styles.scss +205 -0
  24. package/styles/components/_empty-state.scss +630 -0
  25. package/styles/components/_hero-card.scss +422 -0
  26. package/styles/components/_image-fallback.scss +28 -0
  27. package/styles/components/_streaming-effects.scss +518 -0
  28. package/styles/components/cards/_ai-card.scss +718 -0
  29. package/styles/components/sections/_all-sections.generated.scss +41 -0
  30. package/styles/components/sections/_all-sections.scss +1086 -0
  31. package/styles/components/sections/_balanced-compact-system.scss +186 -0
  32. package/styles/components/sections/_compact-mixins.scss +180 -0
  33. package/styles/components/sections/_component-mixins.scss +454 -0
  34. package/styles/components/sections/_design-system.scss +477 -0
  35. package/styles/components/sections/_design-tokens.scss +308 -0
  36. package/styles/components/sections/_enhanced-design-variables.scss +147 -0
  37. package/styles/components/sections/_master-compact-system.scss +302 -0
  38. package/styles/components/sections/_master-dense-system.scss +239 -0
  39. package/styles/components/sections/_minimalistic-design.scss +268 -0
  40. package/styles/components/sections/_modern-effects.scss +392 -0
  41. package/styles/components/sections/_modern-sections.scss +351 -0
  42. package/styles/components/sections/_perfect-system.scss +204 -0
  43. package/styles/components/sections/_section-animations.scss +331 -0
  44. package/styles/components/sections/_section-shell.scss +337 -0
  45. package/styles/components/sections/_section-types.generated.scss +30 -0
  46. package/styles/components/sections/_sections-all.scss +26 -0
  47. package/styles/components/sections/_sections-base.scss +334 -0
  48. package/styles/components/sections/_typography-system.scss +327 -0
  49. package/styles/components/sections/_ultra-compact-tokens.scss +375 -0
  50. package/styles/components/sections/_unified-section-style.scss +157 -0
  51. package/styles/components/sections/_utility-classes.scss +567 -0
  52. package/styles/components/sections/_visual-effects-library.scss +374 -0
  53. package/styles/core/_animations.scss +1498 -0
  54. package/styles/core/_bootstrap-reset.scss +445 -0
  55. package/styles/core/_color-helpers.scss +46 -0
  56. package/styles/core/_global-unified.scss +118 -0
  57. package/styles/core/_global.scss +73 -0
  58. package/styles/core/_mixins.scss +491 -0
  59. package/styles/core/_surface-layers.scss +76 -0
  60. package/styles/core/_utilities.scss +326 -0
  61. package/styles/core/_variables-unified.scss +57 -0
  62. package/styles/core/_variables.scss +36 -0
  63. package/styles/core/variables/_colors-source.scss +34 -0
  64. package/styles/core/variables/_colors-unified.scss +26 -0
  65. package/styles/core/variables/_colors.scss +21 -0
  66. package/styles/critical.scss +353 -0
  67. package/styles/design-system/_compact-theme.scss +159 -0
  68. package/styles/design-system/_section-base.scss +426 -0
  69. package/styles/design-system/_tokens.scss +237 -0
  70. package/styles/design-system/_unified-sections.scss +215 -0
  71. package/styles/layout/_feature-grid.scss +322 -0
  72. package/styles/layout/_masonry.scss +734 -0
  73. package/styles/layout/_tilt.scss +244 -0
  74. package/styles/micro-interactions.scss +583 -0
  75. package/styles/mixins/_section-mixins.scss +280 -0
  76. package/styles/non-critical.scss +643 -0
  77. package/styles/reset/_framework-reset.scss +457 -0
  78. package/styles/reset/_index.scss +14 -0
  79. package/styles/reset/_shadow-reset.scss +383 -0
  80. package/styles/responsive.scss +326 -0
  81. package/styles/themes.scss +573 -0
  82. package/styles/tokens/_index.scss +92 -0
  83. package/styles/tokens/_master.scss +1404 -0
  84. package/styles/tokens/_section-tokens.generated.scss +140 -0
  85. package/postcss.config.js +0 -81
  86. package/section-registry.json +0 -3864
  87. package/section-registry.schema.json +0 -264
@@ -0,0 +1,383 @@
1
+ // ============================================
2
+ // SHADOW DOM RESET
3
+ // ============================================
4
+ //
5
+ // Comprehensive reset for Shadow DOM encapsulated components.
6
+ // This ensures components are completely isolated from host app styles.
7
+ //
8
+ // Usage: Include at the top of component style bundles
9
+ //
10
+ // ============================================
11
+
12
+ @use "../tokens/master" as tokens;
13
+
14
+ // ============================================
15
+ // HOST ELEMENT RESET
16
+ // ============================================
17
+
18
+ :host {
19
+ // Reset ALL inherited properties to initial state
20
+ // This prevents any host app styles from leaking in
21
+ all: initial;
22
+
23
+ // Re-establish essential display properties
24
+ display: block !important;
25
+ position: relative;
26
+ box-sizing: border-box;
27
+ width: 100% !important;
28
+ min-height: 0; // Allow content to determine height
29
+ visibility: visible !important;
30
+ opacity: 1 !important;
31
+
32
+ // Transparent container with 8px padding (library default)
33
+ // Must be set here immediately after all:initial to ensure application
34
+ padding: 8px;
35
+ background: transparent !important;
36
+ background-color: transparent !important;
37
+
38
+ // Typography - inherit from host but with fallbacks
39
+ font-family:
40
+ Helvetica,
41
+ "Helvetica Neue",
42
+ -apple-system,
43
+ BlinkMacSystemFont,
44
+ "Segoe UI",
45
+ Roboto,
46
+ Arial,
47
+ sans-serif;
48
+ font-size: var(--font-size-base, 14px);
49
+ line-height: 1.5;
50
+ color: var(--foreground, #{tokens.$osi-foreground-light});
51
+
52
+ // Text rendering
53
+ -webkit-font-smoothing: antialiased;
54
+ -moz-osx-font-smoothing: grayscale;
55
+ text-rendering: optimizeLegibility;
56
+ font-feature-settings: "kern" 1;
57
+
58
+ // Prevent text selection issues
59
+ -webkit-tap-highlight-color: transparent;
60
+
61
+ // Contain styles within shadow boundary
62
+ contain: layout style;
63
+
64
+ // Responsive: reduce padding on mobile
65
+ @media (max-width: 480px) {
66
+ padding: 4px;
67
+ }
68
+ }
69
+
70
+ // Host context variations
71
+ :host([hidden]) {
72
+ display: none !important;
73
+ }
74
+
75
+ :host([disabled]) {
76
+ pointer-events: none;
77
+ opacity: 0.6;
78
+ }
79
+
80
+ // ============================================
81
+ // UNIVERSAL BOX MODEL RESET
82
+ // ============================================
83
+
84
+ *,
85
+ *::before,
86
+ *::after {
87
+ box-sizing: border-box;
88
+ margin: 0;
89
+ padding: 0;
90
+
91
+ // Reset borders
92
+ border-width: 0;
93
+ border-style: solid;
94
+ border-color: currentColor;
95
+ }
96
+
97
+ // ============================================
98
+ // TYPOGRAPHY RESET
99
+ // ============================================
100
+
101
+ // Headings - with explicit font sizes matching demo app
102
+ h1,
103
+ h2,
104
+ h3,
105
+ h4,
106
+ h5,
107
+ h6 {
108
+ margin: 0;
109
+ line-height: 1.2;
110
+ font-family: inherit;
111
+ }
112
+
113
+ h1 {
114
+ font-size: var(--text-2xl, 1.5rem);
115
+ font-weight: var(--font-weight-medium, 500);
116
+ }
117
+
118
+ h2 {
119
+ font-size: var(--text-xl, 1.25rem);
120
+ font-weight: var(--font-weight-medium, 500);
121
+ }
122
+
123
+ h3 {
124
+ font-size: var(--text-lg, 1.125rem);
125
+ font-weight: var(--font-weight-medium, 500);
126
+ }
127
+
128
+ h4 {
129
+ font-size: var(--text-base, 1rem);
130
+ font-weight: var(--font-weight-medium, 500);
131
+ }
132
+
133
+ h5 {
134
+ font-size: var(--text-sm, 0.875rem);
135
+ font-weight: var(--font-weight-medium, 500);
136
+ }
137
+
138
+ h6 {
139
+ font-size: var(--text-xs, 0.75rem);
140
+ font-weight: var(--font-weight-medium, 500);
141
+ }
142
+
143
+ // Paragraphs and text
144
+ p {
145
+ font-size: var(--text-base, 1rem);
146
+ font-weight: var(--font-weight-normal, 400);
147
+ line-height: 1.5;
148
+ margin: 0;
149
+ }
150
+
151
+ span,
152
+ div {
153
+ margin: 0;
154
+ padding: 0;
155
+ }
156
+
157
+ // Links
158
+ a {
159
+ color: inherit;
160
+ text-decoration: inherit;
161
+ cursor: pointer;
162
+
163
+ &:focus-visible {
164
+ outline: 2px solid var(--color-brand, #{tokens.$osi-color-brand});
165
+ outline-offset: 2px;
166
+ border-radius: 2px;
167
+ }
168
+ }
169
+
170
+ // Lists
171
+ ul,
172
+ ol {
173
+ list-style: none;
174
+ margin: 0;
175
+ padding: 0;
176
+ }
177
+
178
+ li {
179
+ margin: 0;
180
+ padding: 0;
181
+ }
182
+
183
+ // ============================================
184
+ // FORM ELEMENTS RESET
185
+ // ============================================
186
+
187
+ button,
188
+ input,
189
+ optgroup,
190
+ select,
191
+ textarea {
192
+ font-family: inherit;
193
+ font-size: 100%;
194
+ font-weight: inherit;
195
+ line-height: inherit;
196
+ color: inherit;
197
+ margin: 0;
198
+ padding: 0;
199
+ background: transparent;
200
+ border: none;
201
+ }
202
+
203
+ button,
204
+ [type="button"],
205
+ [type="reset"],
206
+ [type="submit"] {
207
+ cursor: pointer;
208
+ -webkit-appearance: button;
209
+ background-color: transparent;
210
+ background-image: none;
211
+
212
+ &:focus-visible {
213
+ outline: 2px solid var(--color-brand, #{tokens.$osi-color-brand});
214
+ outline-offset: 2px;
215
+ }
216
+ }
217
+
218
+ // Remove default button styles
219
+ button::-moz-focus-inner,
220
+ [type="button"]::-moz-focus-inner,
221
+ [type="reset"]::-moz-focus-inner,
222
+ [type="submit"]::-moz-focus-inner {
223
+ border-style: none;
224
+ padding: 0;
225
+ }
226
+
227
+ // ============================================
228
+ // MEDIA ELEMENTS RESET
229
+ // ============================================
230
+
231
+ img,
232
+ svg,
233
+ video,
234
+ canvas,
235
+ audio,
236
+ iframe,
237
+ embed,
238
+ object {
239
+ display: block;
240
+ vertical-align: middle;
241
+ max-width: 100%;
242
+ height: auto;
243
+ }
244
+
245
+ img,
246
+ video {
247
+ max-width: 100%;
248
+ height: auto;
249
+ }
250
+
251
+ svg {
252
+ fill: currentColor;
253
+ }
254
+
255
+ // ============================================
256
+ // LUCIDE ICON SPECIFIC STYLES
257
+ // ============================================
258
+
259
+ // Lucide icons use stroke-based SVGs, not fill
260
+ lucide-icon,
261
+ lucide-angular {
262
+ display: inline-flex !important;
263
+ align-items: center !important;
264
+ justify-content: center !important;
265
+ vertical-align: middle !important;
266
+ flex-shrink: 0;
267
+
268
+ svg {
269
+ display: block !important;
270
+ width: inherit !important;
271
+ height: inherit !important;
272
+ stroke: currentColor !important;
273
+ fill: none !important;
274
+ stroke-width: 2 !important;
275
+ stroke-linecap: round !important;
276
+ stroke-linejoin: round !important;
277
+ }
278
+ }
279
+
280
+ // ============================================
281
+ // TABLE RESET
282
+ // ============================================
283
+
284
+ table {
285
+ text-indent: 0;
286
+ border-color: inherit;
287
+ border-collapse: collapse;
288
+ }
289
+
290
+ // ============================================
291
+ // INTERACTIVE ELEMENTS
292
+ // ============================================
293
+
294
+ // Summary element (disclosure widget)
295
+ summary {
296
+ display: list-item;
297
+ cursor: pointer;
298
+ }
299
+
300
+ // Prevent text selection on interactive elements
301
+ [role="button"] {
302
+ cursor: pointer;
303
+ }
304
+
305
+ // ============================================
306
+ // ACCESSIBILITY ENHANCEMENTS
307
+ // ============================================
308
+
309
+ // Focus visible styles for keyboard navigation
310
+ :focus-visible {
311
+ outline: 2px solid var(--color-brand, #{tokens.$osi-color-brand});
312
+ outline-offset: 2px;
313
+ }
314
+
315
+ // Remove focus outline for mouse users
316
+ :focus:not(:focus-visible) {
317
+ outline: none;
318
+ }
319
+
320
+ // Reduced motion support
321
+ @media (prefers-reduced-motion: reduce) {
322
+ *,
323
+ *::before,
324
+ *::after {
325
+ animation-duration: 0.01ms !important;
326
+ animation-iteration-count: 1 !important;
327
+ transition-duration: 0.01ms !important;
328
+ scroll-behavior: auto !important;
329
+ }
330
+ }
331
+
332
+ // High contrast mode support
333
+ @media (prefers-contrast: high) {
334
+ * {
335
+ border-color: currentColor !important;
336
+ }
337
+ }
338
+
339
+ // ============================================
340
+ // SCROLLBAR STYLING
341
+ // ============================================
342
+
343
+ // Webkit scrollbar styling (Chrome, Safari, Edge)
344
+ ::-webkit-scrollbar {
345
+ width: 8px;
346
+ height: 8px;
347
+ }
348
+
349
+ ::-webkit-scrollbar-track {
350
+ background: var(--muted, #{tokens.$osi-gray-200});
351
+ border-radius: 4px;
352
+ }
353
+
354
+ ::-webkit-scrollbar-thumb {
355
+ background: var(--muted-foreground, #{tokens.$osi-gray-400});
356
+ border-radius: 4px;
357
+
358
+ &:hover {
359
+ background: var(--foreground, #{tokens.$osi-foreground-light});
360
+ }
361
+ }
362
+
363
+ // Firefox scrollbar styling
364
+ * {
365
+ scrollbar-width: thin;
366
+ scrollbar-color: var(--muted-foreground, #{tokens.$osi-gray-400})
367
+ var(--muted, #{tokens.$osi-gray-200});
368
+ }
369
+
370
+ // ============================================
371
+ // PRINT STYLES
372
+ // ============================================
373
+
374
+ @media print {
375
+ *,
376
+ *::before,
377
+ *::after {
378
+ background: transparent !important;
379
+ color: black !important;
380
+ box-shadow: none !important;
381
+ text-shadow: none !important;
382
+ }
383
+ }
@@ -0,0 +1,326 @@
1
+ /**
2
+ * OSI Cards - Responsive Design System
3
+ *
4
+ * Breakpoints and responsive utilities for cards and sections.
5
+ */
6
+
7
+ // ============================================
8
+ // Breakpoint Variables
9
+ // ============================================
10
+
11
+ $breakpoints: (
12
+ "xs": 320px,
13
+ "sm": 480px,
14
+ "md": 768px,
15
+ "lg": 1024px,
16
+ "xl": 1280px,
17
+ "2xl": 1536px,
18
+ );
19
+
20
+ // ============================================
21
+ // Responsive Mixins
22
+ // ============================================
23
+
24
+ /// Media query for minimum width (mobile-first)
25
+ @mixin responsive($breakpoint) {
26
+ @if map-has-key($breakpoints, $breakpoint) {
27
+ @media (min-width: map-get($breakpoints, $breakpoint)) {
28
+ @content;
29
+ }
30
+ } @else {
31
+ @media (min-width: $breakpoint) {
32
+ @content;
33
+ }
34
+ }
35
+ }
36
+
37
+ /// Media query for maximum width
38
+ @mixin responsive-down($breakpoint) {
39
+ @if map-has-key($breakpoints, $breakpoint) {
40
+ @media (max-width: #{map-get($breakpoints, $breakpoint) - 1px}) {
41
+ @content;
42
+ }
43
+ } @else {
44
+ @media (max-width: #{$breakpoint - 1px}) {
45
+ @content;
46
+ }
47
+ }
48
+ }
49
+
50
+ /// Media query for range
51
+ @mixin responsive-between($min, $max) {
52
+ $min-width: if(map-has-key($breakpoints, $min), map-get($breakpoints, $min), $min);
53
+ $max-width: if(map-has-key($breakpoints, $max), map-get($breakpoints, $max), $max);
54
+
55
+ @media (min-width: $min-width) and (max-width: #{$max-width - 1px}) {
56
+ @content;
57
+ }
58
+ }
59
+
60
+ // ============================================
61
+ // Container Queries
62
+ // ============================================
63
+
64
+ @mixin container($name: card) {
65
+ container-type: inline-size;
66
+ container-name: $name;
67
+ }
68
+
69
+ @mixin container-query($name, $min-width: null, $max-width: null) {
70
+ @if $min-width and $max-width {
71
+ @container #{$name} (min-width: #{$min-width}) and (max-width: #{$max-width}) {
72
+ @content;
73
+ }
74
+ } @else if $min-width {
75
+ @container #{$name} (min-width: #{$min-width}) {
76
+ @content;
77
+ }
78
+ } @else if $max-width {
79
+ @container #{$name} (max-width: #{$max-width}) {
80
+ @content;
81
+ }
82
+ }
83
+ }
84
+
85
+ // ============================================
86
+ // Card Responsive Styles
87
+ // ============================================
88
+
89
+ .osi-card-container {
90
+ @include container(card);
91
+
92
+ // Base mobile styles
93
+ --card-padding: 0.75rem;
94
+ --card-gap: 0.5rem;
95
+ --card-title-size: 1rem;
96
+ --section-title-size: 0.875rem;
97
+ --field-label-size: 0.75rem;
98
+ --field-value-size: 0.875rem;
99
+
100
+ @include responsive("sm") {
101
+ --card-padding: 1rem;
102
+ --card-gap: 0.75rem;
103
+ --card-title-size: 1.125rem;
104
+ }
105
+
106
+ @include responsive("md") {
107
+ --card-padding: 1.25rem;
108
+ --card-gap: 1rem;
109
+ --card-title-size: 1.25rem;
110
+ --section-title-size: 1rem;
111
+ }
112
+
113
+ @include responsive("lg") {
114
+ --card-padding: 1.5rem;
115
+ --card-gap: 1.25rem;
116
+ --card-title-size: 1.375rem;
117
+ }
118
+ }
119
+
120
+ // ============================================
121
+ // Grid Responsive Utilities
122
+ // ============================================
123
+
124
+ .masonry-container {
125
+ // Mobile: 1 column
126
+ --masonry-columns: 1;
127
+
128
+ @include responsive("sm") {
129
+ --masonry-columns: 2;
130
+ }
131
+
132
+ @include responsive("lg") {
133
+ --masonry-columns: 3;
134
+ }
135
+
136
+ @include responsive("xl") {
137
+ --masonry-columns: 4;
138
+ }
139
+ }
140
+
141
+ // Container query based columns
142
+ .masonry-container--container-responsive {
143
+ @include container-query(card, $min-width: 400px) {
144
+ --masonry-columns: 2;
145
+ }
146
+
147
+ @include container-query(card, $min-width: 700px) {
148
+ --masonry-columns: 3;
149
+ }
150
+
151
+ @include container-query(card, $min-width: 1000px) {
152
+ --masonry-columns: 4;
153
+ }
154
+ }
155
+
156
+ // ============================================
157
+ // Section Responsive Styles
158
+ // ============================================
159
+
160
+ .ai-section {
161
+ // Info section: stack fields on mobile
162
+ &--info {
163
+ .section-field-grid {
164
+ grid-template-columns: 1fr;
165
+
166
+ @include responsive("sm") {
167
+ grid-template-columns: repeat(2, 1fr);
168
+ }
169
+
170
+ @include responsive("lg") {
171
+ grid-template-columns: repeat(3, 1fr);
172
+ }
173
+ }
174
+ }
175
+
176
+ // Analytics section: adjust metric sizes
177
+ &--analytics {
178
+ .metric-grid {
179
+ grid-template-columns: 1fr;
180
+
181
+ @include responsive("xs") {
182
+ grid-template-columns: repeat(2, 1fr);
183
+ }
184
+
185
+ @include responsive("md") {
186
+ grid-template-columns: repeat(3, 1fr);
187
+ }
188
+ }
189
+
190
+ .metric-value {
191
+ font-size: 1.5rem;
192
+
193
+ @include responsive("md") {
194
+ font-size: 2rem;
195
+ }
196
+ }
197
+ }
198
+
199
+ // Timeline section: horizontal on desktop
200
+ &--timeline {
201
+ .timeline-items {
202
+ flex-direction: column;
203
+
204
+ @include responsive("lg") {
205
+ flex-direction: row;
206
+ overflow-x: auto;
207
+ scroll-snap-type: x mandatory;
208
+
209
+ > * {
210
+ scroll-snap-align: start;
211
+ min-width: 280px;
212
+ }
213
+ }
214
+ }
215
+ }
216
+
217
+ // Contact section: adjust layout
218
+ &--contact {
219
+ .contact-grid {
220
+ grid-template-columns: 1fr;
221
+
222
+ @include responsive("sm") {
223
+ grid-template-columns: repeat(2, 1fr);
224
+ }
225
+ }
226
+ }
227
+ }
228
+
229
+ // ============================================
230
+ // Typography Responsive Utilities
231
+ // ============================================
232
+
233
+ .text-responsive {
234
+ font-size: clamp(0.875rem, 2vw, 1rem);
235
+ line-height: 1.5;
236
+ }
237
+
238
+ .heading-responsive {
239
+ font-size: clamp(1.25rem, 4vw, 2rem);
240
+ line-height: 1.2;
241
+ }
242
+
243
+ // ============================================
244
+ // Spacing Responsive Utilities
245
+ // ============================================
246
+
247
+ .space-responsive {
248
+ padding: clamp(0.5rem, 2vw, 1.5rem);
249
+ }
250
+
251
+ .gap-responsive {
252
+ gap: clamp(0.5rem, 2vw, 1rem);
253
+ }
254
+
255
+ // ============================================
256
+ // Touch Target Utilities
257
+ // ============================================
258
+
259
+ .touch-target {
260
+ min-height: 44px;
261
+ min-width: 44px;
262
+
263
+ @include responsive("lg") {
264
+ min-height: 36px;
265
+ min-width: 36px;
266
+ }
267
+ }
268
+
269
+ // ============================================
270
+ // Visibility Utilities
271
+ // ============================================
272
+
273
+ .hide-mobile {
274
+ @include responsive-down("md") {
275
+ display: none !important;
276
+ }
277
+ }
278
+
279
+ .hide-desktop {
280
+ @include responsive("md") {
281
+ display: none !important;
282
+ }
283
+ }
284
+
285
+ .show-mobile {
286
+ display: none !important;
287
+
288
+ @include responsive-down("md") {
289
+ display: block !important;
290
+ }
291
+ }
292
+
293
+ .show-desktop {
294
+ display: none !important;
295
+
296
+ @include responsive("md") {
297
+ display: block !important;
298
+ }
299
+ }
300
+
301
+ // ============================================
302
+ // Print Styles
303
+ // ============================================
304
+
305
+ @media print {
306
+ .osi-card-container {
307
+ --card-padding: 1rem;
308
+ box-shadow: none;
309
+ border: 1px solid #ddd;
310
+ break-inside: avoid;
311
+ }
312
+
313
+ .masonry-container {
314
+ --masonry-columns: 2;
315
+ display: block;
316
+
317
+ .masonry-item {
318
+ break-inside: avoid;
319
+ margin-bottom: 1rem;
320
+ }
321
+ }
322
+
323
+ .hide-print {
324
+ display: none !important;
325
+ }
326
+ }