@orion-ds/core 1.0.0 → 1.0.4

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 (2) hide show
  1. package/dist/theme.css +427 -71
  2. package/package.json +1 -1
package/dist/theme.css CHANGED
@@ -221,9 +221,13 @@
221
221
  --size-calendar-time-col: 80px;
222
222
 
223
223
  --shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
224
- --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -2px rgba(0, 0, 0, 0.1);
225
- --shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -4px rgba(0, 0, 0, 0.1);
226
- --shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 8px 10px -6px rgba(0, 0, 0, 0.1);
224
+ --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.08), 0 2px 4px -2px rgba(0, 0, 0, 0.08);
225
+ --shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.08), 0 4px 6px -4px rgba(0, 0, 0, 0.08);
226
+ --shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.06), 0 8px 10px -6px rgba(0, 0, 0, 0.06);
227
+
228
+ /* Minimal shadows for Product mode (ultra-flat) */
229
+ --shadow-flat: 0 1px 3px 0 rgba(0, 0, 0, 0.04);
230
+ --shadow-none: none;
227
231
 
228
232
  /* ─── Transitions ─── */
229
233
  --transition-fast: 150ms cubic-bezier(0.4, 0, 0.2, 1);
@@ -280,6 +284,30 @@
280
284
  --status-error-bg: rgba(239, 68, 68, 0.1);
281
285
  --status-success-bg: rgba(34, 197, 94, 0.1);
282
286
 
287
+ /* ─── Section Shadows (for card hover effects) ─── */
288
+ --shadow-card-hover: 0 12px 24px -8px rgba(0, 0, 0, 0.15);
289
+ --shadow-card-sm: 0 4px 12px rgba(0, 0, 0, 0.08);
290
+ --shadow-card-elevated: 0 8px 16px -4px rgba(0, 0, 0, 0.1);
291
+
292
+ /* ─── Overlay Colors (for dark overlays on images) ─── */
293
+ --overlay-dark: rgba(0, 0, 0, 0.5);
294
+ --overlay-dark-heavy: rgba(0, 0, 0, 0.7);
295
+ --overlay-dark-light: rgba(0, 0, 0, 0.3);
296
+
297
+ /* ─── Overlay Colors (for light overlays on dark backgrounds) ─── */
298
+ --overlay-light: rgba(255, 255, 255, 0.2);
299
+ --overlay-light-subtle: rgba(255, 255, 255, 0.1);
300
+ --overlay-light-strong: rgba(255, 255, 255, 0.3);
301
+
302
+ /* ─── Text on Dark Backgrounds ─── */
303
+ --text-on-dark: #ffffff;
304
+ --text-on-dark-primary: rgba(255, 255, 255, 0.9);
305
+ --text-on-dark-secondary: rgba(255, 255, 255, 0.7);
306
+ --text-on-dark-tertiary: rgba(255, 255, 255, 0.5);
307
+
308
+ /* ─── Text on Brand Backgrounds ─── */
309
+ --text-on-brand: #ffffff;
310
+
283
311
  /* ─── Soft State Colors (10-20% opacity for backgrounds) ─── */
284
312
  --color-brand-soft: color-mix(in srgb, var(--color-brand-500) 10%, transparent);
285
313
  --color-brand-soft-hover: color-mix(in srgb, var(--color-brand-500) 20%, transparent);
@@ -349,6 +377,30 @@
349
377
  --status-error-bg: rgba(239, 68, 68, 0.15);
350
378
  --status-success-bg: rgba(34, 197, 94, 0.15);
351
379
 
380
+ /* ─── Section Shadows (for card hover effects) ─── */
381
+ --shadow-card-hover: 0 12px 24px -8px rgba(0, 0, 0, 0.3);
382
+ --shadow-card-sm: 0 4px 12px rgba(0, 0, 0, 0.2);
383
+ --shadow-card-elevated: 0 8px 16px -4px rgba(0, 0, 0, 0.25);
384
+
385
+ /* ─── Overlay Colors (for dark overlays on images) ─── */
386
+ --overlay-dark: rgba(0, 0, 0, 0.6);
387
+ --overlay-dark-heavy: rgba(0, 0, 0, 0.8);
388
+ --overlay-dark-light: rgba(0, 0, 0, 0.4);
389
+
390
+ /* ─── Overlay Colors (for light overlays on dark backgrounds) ─── */
391
+ --overlay-light: rgba(255, 255, 255, 0.15);
392
+ --overlay-light-subtle: rgba(255, 255, 255, 0.08);
393
+ --overlay-light-strong: rgba(255, 255, 255, 0.25);
394
+
395
+ /* ─── Text on Dark Backgrounds ─── */
396
+ --text-on-dark: #ffffff;
397
+ --text-on-dark-primary: rgba(255, 255, 255, 0.95);
398
+ --text-on-dark-secondary: rgba(255, 255, 255, 0.8);
399
+ --text-on-dark-tertiary: rgba(255, 255, 255, 0.6);
400
+
401
+ /* ─── Text on Brand Backgrounds ─── */
402
+ --text-on-brand: #ffffff;
403
+
352
404
  /* ─── Soft State Colors (10-20% opacity for backgrounds) ─── */
353
405
  --color-brand-soft: color-mix(in srgb, var(--color-brand-500) 15%, transparent);
354
406
  --color-brand-soft-hover: color-mix(in srgb, var(--color-brand-500) 25%, transparent);
@@ -688,6 +740,15 @@
688
740
  --mode-effect-glass: blur(12px);
689
741
  --mode-effect-shadow: var(--shadow-xl);
690
742
  --mode-visual-style: "atmospheric";
743
+
744
+ /* Visual System (NEW): Shadows & Interactions */
745
+ --mode-shadow-default: var(--shadow-md);
746
+ --mode-shadow-hover: var(--shadow-lg);
747
+ --mode-shadow-active: var(--shadow-md);
748
+ --mode-hover-lift: -4px;
749
+ --mode-hover-duration: 250ms;
750
+ --mode-glass-enabled: 1;
751
+ --mode-blur-amount: var(--blur-lg);
691
752
  }
692
753
 
693
754
  /* ─── Product Mode: SaaS & Dashboards ─── */
@@ -713,6 +774,15 @@
713
774
  --mode-effect-glass: none;
714
775
  --mode-effect-shadow: var(--shadow-sm);
715
776
  --mode-visual-style: "functional";
777
+
778
+ /* Visual System (NEW): Ultra-flat (Linear/Figma style) */
779
+ --mode-shadow-default: var(--shadow-flat);
780
+ --mode-shadow-hover: var(--shadow-sm);
781
+ --mode-shadow-active: none;
782
+ --mode-hover-lift: 0px; /* NO lift in Product mode */
783
+ --mode-hover-duration: 150ms;
784
+ --mode-glass-enabled: 0; /* NO glassmorphism */
785
+ --mode-blur-amount: 0px;
716
786
  }
717
787
 
718
788
  /* ─── App Mode: Touch-First Mobile Interfaces ─── */
@@ -745,6 +815,15 @@
745
815
  --mode-safe-area-bottom: env(safe-area-inset-bottom, 0);
746
816
  --mode-safe-area-left: env(safe-area-inset-left, 0);
747
817
  --mode-safe-area-right: env(safe-area-inset-right, 0);
818
+
819
+ /* Visual System (NEW): Native elevation (Material 3) */
820
+ --mode-shadow-default: var(--shadow-md);
821
+ --mode-shadow-hover: var(--shadow-lg);
822
+ --mode-shadow-active: var(--shadow-sm);
823
+ --mode-hover-lift: -2px;
824
+ --mode-hover-duration: 200ms;
825
+ --mode-glass-enabled: 0; /* NO glassmorphism */
826
+ --mode-blur-amount: 0px;
748
827
  }
749
828
 
750
829
  /* ═══════════════════════════════════════════════════════════════════════════
@@ -927,12 +1006,14 @@ body {
927
1006
  }
928
1007
 
929
1008
  .btn:hover:not(:disabled) {
930
- transform: translateY(-1px);
931
- box-shadow: var(--shadow-md);
1009
+ transform: translateY(var(--mode-hover-lift, -2px));
1010
+ box-shadow: var(--mode-shadow-hover, var(--shadow-md));
1011
+ transition-duration: var(--mode-hover-duration, 150ms);
932
1012
  }
933
1013
 
934
1014
  .btn:active:not(:disabled) {
935
- transform: translateY(0);
1015
+ transform: scale(0.98) translateY(0);
1016
+ box-shadow: var(--mode-shadow-active, none);
936
1017
  transition-duration: 100ms;
937
1018
  }
938
1019
 
@@ -1015,6 +1096,69 @@ body {
1015
1096
  margin-left: calc(var(--spacing-1) * -1);
1016
1097
  }
1017
1098
 
1099
+ /* ═══════════════════════════════════════════════════════════════════════════
1100
+ MODE-AWARE BUTTON SIZING
1101
+ Proportional scaling: Each mode has its own size hierarchy (sm/md/lg)
1102
+ respecting the tri-modal philosophy (Display=spatial, Product=compact, App=tactile)
1103
+ ═══════════════════════════════════════════════════════════════════════════ */
1104
+
1105
+ /* ─── Display Mode: Atmospheric (spacious) ─── */
1106
+ [data-mode="display"] .btn-sm {
1107
+ font-size: var(--font-size-14);
1108
+ padding: var(--spacing-3) var(--spacing-6);
1109
+ min-height: 40px;
1110
+ }
1111
+
1112
+ [data-mode="display"] .btn:not(.btn-sm):not(.btn-lg) {
1113
+ font-size: var(--font-size-18);
1114
+ padding: var(--spacing-4) var(--spacing-8);
1115
+ min-height: 56px;
1116
+ }
1117
+
1118
+ [data-mode="display"] .btn-lg {
1119
+ font-size: var(--font-size-20);
1120
+ padding: var(--spacing-5) var(--spacing-10);
1121
+ min-height: 64px;
1122
+ }
1123
+
1124
+ /* ─── Product Mode: Geometric Precision (compact) ─── */
1125
+ [data-mode="product"] .btn-sm {
1126
+ font-size: var(--font-size-12);
1127
+ padding: var(--spacing-1) var(--spacing-3);
1128
+ min-height: 28px;
1129
+ }
1130
+
1131
+ [data-mode="product"] .btn:not(.btn-sm):not(.btn-lg) {
1132
+ font-size: var(--font-size-14);
1133
+ padding: var(--spacing-2) var(--spacing-4);
1134
+ min-height: 32px;
1135
+ }
1136
+
1137
+ [data-mode="product"] .btn-lg {
1138
+ font-size: var(--font-size-16);
1139
+ padding: var(--spacing-2) var(--spacing-5);
1140
+ min-height: 36px;
1141
+ }
1142
+
1143
+ /* ─── App Mode: Tactile (touch-friendly) ─── */
1144
+ [data-mode="app"] .btn-sm {
1145
+ font-size: var(--font-size-14);
1146
+ padding: var(--spacing-2) var(--spacing-5);
1147
+ min-height: 40px;
1148
+ }
1149
+
1150
+ [data-mode="app"] .btn:not(.btn-sm):not(.btn-lg) {
1151
+ font-size: var(--font-size-16);
1152
+ padding: var(--spacing-3) var(--spacing-6);
1153
+ min-height: 44px;
1154
+ }
1155
+
1156
+ [data-mode="app"] .btn-lg {
1157
+ font-size: var(--font-size-18);
1158
+ padding: var(--spacing-4) var(--spacing-6);
1159
+ min-height: 48px;
1160
+ }
1161
+
1018
1162
  .btn .icon:last-child {
1019
1163
  margin-right: calc(var(--spacing-1) * -1);
1020
1164
  }
@@ -1294,20 +1438,40 @@ body {
1294
1438
  display: flex;
1295
1439
  flex-direction: column;
1296
1440
  width: var(--size-sidebar-width, 280px);
1297
- background: var(--surface-glass);
1298
- backdrop-filter: blur(var(--blur-lg));
1299
- -webkit-backdrop-filter: blur(var(--blur-lg));
1441
+ background: var(--surface-sunken);
1442
+ border: 1px solid var(--border-subtle);
1300
1443
  padding: var(--spacing-5);
1301
1444
  overflow-y: auto;
1302
1445
  }
1303
1446
 
1447
+ /* Glass effect ONLY in Display mode */
1448
+ [data-mode="display"] .sidebar {
1449
+ background: var(--surface-glass);
1450
+ backdrop-filter: blur(var(--mode-blur-amount, var(--blur-lg)));
1451
+ -webkit-backdrop-filter: blur(var(--mode-blur-amount, var(--blur-lg)));
1452
+ }
1453
+
1454
+ /* Product mode: solid background */
1455
+ [data-mode="product"] .sidebar {
1456
+ background: var(--surface-subtle);
1457
+ border-right: 1px solid var(--border-subtle);
1458
+ }
1459
+
1460
+ /* App mode: no borders */
1461
+ [data-mode="app"] .sidebar {
1462
+ border: none;
1463
+ }
1464
+
1304
1465
  /* Variant: Floating (Card Style) */
1305
1466
  .sidebar-floating {
1306
1467
  border: 1px solid var(--border-subtle);
1307
1468
  border-radius: var(--radius-control);
1308
- box-shadow: var(--shadow-md);
1309
- /* Glass effect inherited from .sidebar base */
1310
- /* Remove default margin/positioning - controlled by parent context */
1469
+ box-shadow: var(--mode-shadow-default, var(--shadow-md));
1470
+ }
1471
+
1472
+ /* Product mode floating */
1473
+ [data-mode="product"] .sidebar-floating {
1474
+ box-shadow: var(--shadow-flat);
1311
1475
  }
1312
1476
 
1313
1477
  /* Variant: Classic (Edge-to-Edge) */
@@ -1369,7 +1533,7 @@ body {
1369
1533
  COMPONENT BLUEPRINTS — Navigation (Header)
1370
1534
  ═══════════════════════════════════════════════════════════════════════════ */
1371
1535
 
1372
- /* Base Navbar */
1536
+ /* Base Navbar - Mode-aware */
1373
1537
  .navbar {
1374
1538
  position: fixed;
1375
1539
  top: 0;
@@ -1381,12 +1545,30 @@ body {
1381
1545
  justify-content: space-between;
1382
1546
  height: 64px;
1383
1547
  padding: 0 var(--spacing-6);
1384
- background: var(--surface-glass);
1385
- backdrop-filter: blur(var(--blur-lg));
1386
- -webkit-backdrop-filter: blur(var(--blur-lg));
1548
+ background: var(--surface-base);
1549
+ border-bottom: 1px solid var(--border-subtle);
1387
1550
  transition: all var(--transition-normal);
1388
1551
  }
1389
1552
 
1553
+ /* Glass effect ONLY in Display mode */
1554
+ [data-mode="display"] .navbar {
1555
+ background: var(--surface-glass);
1556
+ backdrop-filter: blur(var(--mode-blur-amount, var(--blur-lg)));
1557
+ -webkit-backdrop-filter: blur(var(--mode-blur-amount, var(--blur-lg)));
1558
+ }
1559
+
1560
+ /* Product mode: solid background */
1561
+ [data-mode="product"] .navbar {
1562
+ background: var(--surface-base);
1563
+ border-bottom-color: var(--border-subtle);
1564
+ }
1565
+
1566
+ /* App mode: no borders */
1567
+ [data-mode="app"] .navbar {
1568
+ border-bottom: none;
1569
+ background: var(--surface-base);
1570
+ }
1571
+
1390
1572
  /* Variant: Classic (Edge-to-Edge) */
1391
1573
  .navbar-classic {
1392
1574
  width: 100%;
@@ -1402,7 +1584,12 @@ body {
1402
1584
  width: auto;
1403
1585
  border: 1px solid var(--border-subtle);
1404
1586
  border-radius: var(--radius-container);
1405
- box-shadow: var(--shadow-sm);
1587
+ box-shadow: var(--mode-shadow-default, var(--shadow-sm));
1588
+ }
1589
+
1590
+ /* Product mode floating */
1591
+ [data-mode="product"] .navbar-floating {
1592
+ box-shadow: var(--shadow-flat);
1406
1593
  }
1407
1594
 
1408
1595
  /* Navbar Elements */
@@ -1665,6 +1852,54 @@ a.navbar-link:focus:not(:focus-visible) {
1665
1852
  border-radius: var(--radius-full);
1666
1853
  }
1667
1854
 
1855
+ /* ═══════════════════════════════════════════════════════════════════════════
1856
+ BRAND VISUAL DIFFERENTIATION — Unitec vs Laureate
1857
+ ═══════════════════════════════════════════════════════════════════════════ */
1858
+
1859
+ /* Unitec: Bold & Energetic personality */
1860
+ [data-brand="unitec"] .btn,
1861
+ [data-brand="unitec"] .card {
1862
+ border-width: 2px;
1863
+ /* More prominent borders */
1864
+ }
1865
+
1866
+ [data-brand="unitec"] .card-interactive:hover {
1867
+ box-shadow: 0 12px 20px -4px rgba(246, 139, 31, 0.3);
1868
+ /* Orange-tinted shadow */
1869
+ }
1870
+
1871
+ [data-brand="unitec"] .btn:hover:not(:disabled) {
1872
+ box-shadow: 0 8px 12px -2px rgba(246, 139, 31, 0.25);
1873
+ }
1874
+
1875
+ /* Laureate: Refined & Professional personality */
1876
+ [data-brand="laureate"] .btn,
1877
+ [data-brand="laureate"] .card {
1878
+ border-width: 1px;
1879
+ /* Subtle borders */
1880
+ }
1881
+
1882
+ [data-brand="laureate"] .card-interactive:hover {
1883
+ box-shadow: 0 8px 16px -4px rgba(241, 93, 34, 0.2);
1884
+ /* Red-orange tinted shadow, more subtle */
1885
+ }
1886
+
1887
+ [data-brand="laureate"] .btn:hover:not(:disabled) {
1888
+ box-shadow: 0 6px 10px -2px rgba(241, 93, 34, 0.2);
1889
+ transition-duration: 300ms;
1890
+ /* Slower, more deliberate interaction */
1891
+ }
1892
+
1893
+ [data-brand="laureate"] .btn:active:not(:disabled) {
1894
+ transition-duration: 150ms;
1895
+ /* Slightly slower press response */
1896
+ }
1897
+
1898
+ /* Laureate refined modal appearance */
1899
+ [data-brand="laureate"] .modal {
1900
+ box-shadow: 0 16px 24px -4px rgba(241, 93, 34, 0.15);
1901
+ }
1902
+
1668
1903
  .sidebar-item.is-active .sidebar-item-icon {
1669
1904
  opacity: 1;
1670
1905
  }
@@ -1687,6 +1922,7 @@ a.navbar-link:focus:not(:focus-visible) {
1687
1922
  border: 1px solid var(--border-subtle);
1688
1923
  border-radius: var(--radius-container);
1689
1924
  padding: var(--spacing-6);
1925
+ box-shadow: var(--mode-shadow-default, var(--shadow-sm));
1690
1926
  transition: all 250ms cubic-bezier(0.4, 0, 0.2, 1);
1691
1927
  }
1692
1928
 
@@ -1695,31 +1931,51 @@ a.navbar-link:focus:not(:focus-visible) {
1695
1931
  }
1696
1932
 
1697
1933
  .card-interactive:hover {
1698
- transform: translateY(-2px);
1699
- box-shadow: var(--shadow-lg);
1934
+ transform: translateY(var(--mode-hover-lift, -2px));
1935
+ box-shadow: var(--mode-shadow-hover, var(--shadow-lg));
1700
1936
  border-color: var(--border-strong);
1937
+ transition-duration: var(--mode-hover-duration, 250ms);
1701
1938
  }
1702
1939
 
1703
1940
  .card-interactive:active {
1704
- transform: translateY(0);
1941
+ transform: scale(0.98) translateY(0);
1942
+ box-shadow: var(--mode-shadow-active, none);
1705
1943
  transition-duration: 100ms;
1706
1944
  }
1707
1945
 
1946
+ /* Glass card - Only enabled in Display mode */
1708
1947
  .card-glass {
1709
- background: var(--surface-glass);
1710
- backdrop-filter: blur(var(--blur-lg));
1711
- -webkit-backdrop-filter: blur(var(--blur-lg));
1948
+ background: var(--surface-base);
1712
1949
  border: 1px solid var(--border-subtle);
1713
1950
  border-radius: var(--radius-container);
1714
1951
  padding: var(--spacing-6);
1952
+ box-shadow: var(--mode-shadow-default, var(--shadow-sm));
1715
1953
  transition: all 250ms cubic-bezier(0.4, 0, 0.2, 1);
1716
1954
  }
1717
1955
 
1956
+ /* Glass effect ONLY in Display mode */
1957
+ [data-mode="display"] .card-glass {
1958
+ background: var(--surface-glass);
1959
+ backdrop-filter: blur(var(--mode-blur-amount, var(--blur-lg)));
1960
+ -webkit-backdrop-filter: blur(var(--mode-blur-amount, var(--blur-lg)));
1961
+ }
1962
+
1718
1963
  .card-glass.card-interactive:hover {
1719
- backdrop-filter: blur(var(--blur-xl));
1720
- -webkit-backdrop-filter: blur(var(--blur-xl));
1721
- transform: translateY(-2px);
1722
- box-shadow: var(--shadow-xl);
1964
+ transform: translateY(var(--mode-hover-lift, -2px));
1965
+ box-shadow: var(--mode-shadow-hover, var(--shadow-lg));
1966
+ transition-duration: var(--mode-hover-duration, 250ms);
1967
+ }
1968
+
1969
+ /* Product mode: solid background */
1970
+ [data-mode="product"] .card-glass {
1971
+ background: var(--surface-subtle);
1972
+ box-shadow: var(--shadow-flat);
1973
+ }
1974
+
1975
+ /* App mode: no borders */
1976
+ [data-mode="app"] .card-glass {
1977
+ border: none;
1978
+ box-shadow: var(--shadow-md);
1723
1979
  }
1724
1980
 
1725
1981
 
@@ -2698,7 +2954,7 @@ a.navbar-link:focus:not(:focus-visible) {
2698
2954
  -webkit-backdrop-filter: blur(var(--blur-lg));
2699
2955
  }
2700
2956
 
2701
- /* Modal */
2957
+ /* Modal - Mode-aware backdrop blur */
2702
2958
  .modal-backdrop {
2703
2959
  position: fixed;
2704
2960
  top: 0;
@@ -2710,11 +2966,18 @@ a.navbar-link:focus:not(:focus-visible) {
2710
2966
  align-items: center;
2711
2967
  justify-content: center;
2712
2968
  background: rgba(0, 0, 0, 0.5);
2713
- backdrop-filter: blur(4px);
2969
+ backdrop-filter: blur(var(--mode-blur-amount, 4px));
2970
+ -webkit-backdrop-filter: blur(var(--mode-blur-amount, 4px));
2714
2971
  padding: var(--spacing-4);
2715
2972
  animation: fadeIn 200ms ease;
2716
2973
  }
2717
2974
 
2975
+ /* Product mode: no backdrop blur */
2976
+ [data-mode="product"] .modal-backdrop {
2977
+ backdrop-filter: none;
2978
+ -webkit-backdrop-filter: none;
2979
+ }
2980
+
2718
2981
  @keyframes fadeIn {
2719
2982
  from { opacity: 0; }
2720
2983
  to { opacity: 1; }
@@ -2929,14 +3192,14 @@ a.navbar-link:focus:not(:focus-visible) {
2929
3192
  font-size: var(--font-size-48);
2930
3193
  font-weight: var(--font-weight-bold);
2931
3194
  line-height: var(--line-height-tight);
2932
- color: white;
3195
+ color: var(--text-inverse);
2933
3196
  margin: 0;
2934
3197
  }
2935
3198
 
2936
3199
  .card-visual-text {
2937
3200
  font-size: var(--font-size-16);
2938
3201
  line-height: var(--line-height-normal);
2939
- color: rgba(255, 255, 255, 0.9);
3202
+ color: color-mix(in srgb, var(--text-inverse) 90%, transparent);
2940
3203
  margin: 0;
2941
3204
  }
2942
3205
 
@@ -3231,29 +3494,38 @@ a.navbar-link:focus:not(:focus-visible) {
3231
3494
  border-width: 4px;
3232
3495
  }
3233
3496
 
3234
- /* Skeleton */
3497
+ /* Skeleton Loading Framework (Mode-aware) */
3235
3498
  .skeleton {
3236
- background: linear-gradient(90deg,
3237
- var(--surface-layer) 25%,
3238
- var(--surface-subtle) 50%,
3239
- var(--surface-layer) 75%);
3240
- background-size: 200% 100%;
3241
- animation: shimmer 1.5s infinite;
3242
- border-radius: var(--radius-control);
3499
+ background: var(--surface-layer);
3500
+ border-radius: var(--radius-sm);
3501
+ position: relative;
3502
+ overflow: hidden;
3503
+ animation: skeleton-pulse 1.5s ease-in-out infinite;
3243
3504
  }
3244
3505
 
3245
- @keyframes shimmer {
3246
- 0% {
3247
- background-position: 200% 0;
3248
- }
3506
+ @keyframes skeleton-pulse {
3507
+ 0%, 100% { opacity: 1; }
3508
+ 50% { opacity: 0.6; }
3509
+ }
3249
3510
 
3250
- 100% {
3251
- background-position: -200% 0;
3252
- }
3511
+ /* Shimmer effect (Display mode only - high polish) */
3512
+ [data-mode="display"] .skeleton::after {
3513
+ content: "";
3514
+ position: absolute;
3515
+ top: 0; right: 0; bottom: 0; left: 0;
3516
+ transform: translateX(-100%);
3517
+ background: linear-gradient(90deg, transparent 0%, rgba(255, 255, 255, 0.4) 50%, transparent 100%);
3518
+ animation: skeleton-shimmer 1.5s infinite;
3253
3519
  }
3254
3520
 
3521
+ @keyframes skeleton-shimmer {
3522
+ 100% { transform: translateX(100%); }
3523
+ }
3524
+
3525
+ /* Variants - Text */
3255
3526
  .skeleton-text {
3256
3527
  height: 1em;
3528
+ width: 100%;
3257
3529
  margin-bottom: var(--spacing-2);
3258
3530
  }
3259
3531
 
@@ -3261,25 +3533,32 @@ a.navbar-link:focus:not(:focus-visible) {
3261
3533
  width: 60%;
3262
3534
  }
3263
3535
 
3536
+ /* Variants - Title */
3264
3537
  .skeleton-title {
3265
- height: 1.5em;
3266
- width: 40%;
3538
+ height: 2em;
3539
+ width: 60%;
3267
3540
  margin-bottom: var(--spacing-3);
3268
3541
  }
3269
3542
 
3543
+ /* Variants - Avatar */
3270
3544
  .skeleton-avatar {
3271
- width: 40px;
3272
- height: 40px;
3545
+ width: 48px;
3546
+ height: 48px;
3273
3547
  border-radius: var(--radius-full);
3274
3548
  }
3275
3549
 
3550
+ /* Variants - Button */
3276
3551
  .skeleton-button {
3277
3552
  height: 40px;
3278
- width: 100px;
3553
+ width: 120px;
3554
+ border-radius: var(--radius-control);
3279
3555
  }
3280
3556
 
3557
+ /* Variants - Card */
3281
3558
  .skeleton-card {
3282
3559
  height: 200px;
3560
+ width: 100%;
3561
+ border-radius: var(--radius-container);
3283
3562
  }
3284
3563
 
3285
3564
 
@@ -3287,6 +3566,53 @@ a.navbar-link:focus:not(:focus-visible) {
3287
3566
  DATA DISPLAY — Table, Empty State
3288
3567
  ═══════════════════════════════════════════════════════════════════════════ */
3289
3568
 
3569
+ /* ─── Empty State Framework ─── */
3570
+ .empty-state {
3571
+ display: flex;
3572
+ flex-direction: column;
3573
+ align-items: center;
3574
+ justify-content: center;
3575
+ text-align: center;
3576
+ padding: var(--spacing-32);
3577
+ gap: var(--spacing-6);
3578
+ min-height: 300px;
3579
+ }
3580
+
3581
+ .empty-state-icon {
3582
+ width: 80px;
3583
+ height: 80px;
3584
+ color: var(--text-tertiary);
3585
+ opacity: 0.6;
3586
+ }
3587
+
3588
+ [data-mode="product"] .empty-state-icon {
3589
+ width: 64px;
3590
+ height: 64px;
3591
+ }
3592
+
3593
+ .empty-state-title {
3594
+ font-size: var(--font-size-24);
3595
+ font-weight: var(--font-weight-bold);
3596
+ color: var(--text-primary);
3597
+ margin: 0;
3598
+ }
3599
+
3600
+ .empty-state-description {
3601
+ font-size: var(--font-size-16);
3602
+ color: var(--text-secondary);
3603
+ max-width: 400px;
3604
+ margin: 0;
3605
+ line-height: var(--line-height-relaxed);
3606
+ }
3607
+
3608
+ .empty-state-actions {
3609
+ display: flex;
3610
+ gap: var(--spacing-3);
3611
+ margin-top: var(--spacing-4);
3612
+ flex-wrap: wrap;
3613
+ justify-content: center;
3614
+ }
3615
+
3290
3616
  /* Table */
3291
3617
  .table-wrapper {
3292
3618
  overflow-x: auto;
@@ -5282,9 +5608,12 @@ a.navbar-link:focus:not(:focus-visible) {
5282
5608
  box-shadow: 0 0 0 4px var(--color-brand-soft-hover);
5283
5609
  }
5284
5610
 
5285
- /* Reduced Motion */
5286
- @media (prefers-reduced-motion: reduce) {
5611
+ /* ═══════════════════════════════════════════════════════════════════════════
5612
+ ACCESSIBILITY Reduced Motion Preferences
5613
+ ═══════════════════════════════════════════════════════════════════════════ */
5287
5614
 
5615
+ @media (prefers-reduced-motion: reduce) {
5616
+ /* Disable ALL animations and transitions */
5288
5617
  *,
5289
5618
  *::before,
5290
5619
  *::after {
@@ -5293,6 +5622,30 @@ a.navbar-link:focus:not(:focus-visible) {
5293
5622
  transition-duration: 0.01ms !important;
5294
5623
  scroll-behavior: auto !important;
5295
5624
  }
5625
+
5626
+ /* Remove ALL transform-based interactions */
5627
+ .btn:hover:not(:disabled),
5628
+ .btn:active:not(:disabled),
5629
+ .card-interactive:hover,
5630
+ .card-interactive:active,
5631
+ .card-visual:hover,
5632
+ .card-glass.card-interactive:hover {
5633
+ transform: none !important;
5634
+ }
5635
+
5636
+ /* Keep blur effects (not motion-inducing) */
5637
+ [data-mode="display"] .sidebar,
5638
+ [data-mode="display"] .navbar,
5639
+ [data-mode="display"] .card-glass,
5640
+ [data-mode="display"] .modal-backdrop {
5641
+ backdrop-filter: blur(var(--mode-blur-amount, var(--blur-lg))) !important;
5642
+ -webkit-backdrop-filter: blur(var(--mode-blur-amount, var(--blur-lg))) !important;
5643
+ }
5644
+
5645
+ /* Reduce skeleton pulse to just opacity change (no motion) */
5646
+ .skeleton {
5647
+ animation: skeleton-pulse 1.5s ease-in-out infinite !important;
5648
+ }
5296
5649
  }
5297
5650
 
5298
5651
  /* ═══════════════════════════════════════════════════════════════════════════
@@ -5336,24 +5689,8 @@ a.navbar-link:focus:not(:focus-visible) {
5336
5689
  min-height: var(--mode-touch-target, 40px);
5337
5690
  }
5338
5691
 
5339
- /* Mode-aware Buttons */
5340
- [data-mode="display"] .btn {
5341
- font-size: var(--font-size-18);
5342
- padding: var(--spacing-4) var(--spacing-8);
5343
- min-height: 56px;
5344
- }
5345
-
5346
- [data-mode="product"] .btn {
5347
- font-size: var(--font-size-14);
5348
- padding: var(--spacing-2) var(--spacing-4);
5349
- min-height: 32px;
5350
- }
5351
-
5352
- [data-mode="app"] .btn {
5353
- font-size: var(--font-size-16);
5354
- padding: var(--spacing-3) var(--spacing-6);
5355
- min-height: 44px;
5356
- }
5692
+ /* Mode-aware Buttons - Removed */
5693
+ /* (Replaced with proportional scaling system below) */
5357
5694
 
5358
5695
  /* Mode-aware Cards */
5359
5696
  [data-mode="display"] .card {
@@ -6336,6 +6673,25 @@ a.navbar-link:focus:not(:focus-visible) {
6336
6673
  display: inline-block;
6337
6674
  }
6338
6675
 
6676
+ /* Brand-aware gradient text (mode & brand aware) */
6677
+ .gradient-text-brand {
6678
+ background: linear-gradient(135deg, var(--color-brand-400), var(--color-brand-600));
6679
+ -webkit-background-clip: text;
6680
+ -webkit-text-fill-color: transparent;
6681
+ background-clip: text;
6682
+ display: inline-block;
6683
+ }
6684
+
6685
+ /* Display mode: more dramatic */
6686
+ [data-mode="display"] .gradient-text-brand {
6687
+ background: linear-gradient(135deg, var(--color-brand-300), var(--color-brand-700));
6688
+ }
6689
+
6690
+ /* Product mode: more subtle */
6691
+ [data-mode="product"] .gradient-text-brand {
6692
+ background: linear-gradient(135deg, var(--color-brand-500), var(--color-brand-600));
6693
+ }
6694
+
6339
6695
 
6340
6696
  /* ─── Section Header ─── */
6341
6697
  .section-header {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@orion-ds/core",
3
- "version": "1.0.0",
3
+ "version": "1.0.4",
4
4
  "description": "Orion Design System - Core tokens and utilities",
5
5
  "author": "Orion Design System Team",
6
6
  "main": "dist/index.js",