@mshuja288/aksuicore 0.3.0 → 0.4.1

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/CHANGELOG.md CHANGED
@@ -7,6 +7,30 @@ Versioning follows [VERSIONING.md](./VERSIONING.md).
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.4.1] — 2026-10-12
11
+
12
+ ### Fixed
13
+
14
+ - Row ⋯ menu no longer hidden under the hover tooltip (portal + higher z-index; tooltips only on fine-pointer hover)
15
+ - Mobile tools no longer render as a sprawling icon strip above the table
16
+
17
+ ### Changed
18
+
19
+ - Small screens: compact **Add + Tools** bar; Tools opens a right-side drawer (preview, columns, download, filters)
20
+
21
+ ## [0.4.0] — 2026-10-12
22
+
23
+ ### Added
24
+
25
+ - `RecordWorkspace` column picker: toggle visible columns (default all), optional `columnPrefsKey` persistence, `exportKey` / `ExportColumnRef`
26
+ - `onDownload(format, columns)` now passes the currently visible columns for smart exports
27
+ - `AppShell` mobile drawer navigation (`mobileNav="drawer"` default) with topbar hamburger — avoids crowded bottom nav on many sections
28
+ - Compact mobile row actions (⋯ menu) in `RecordWorkspace`
29
+
30
+ ### Changed
31
+
32
+ - Small screens: side-rail actions sit above the table; sticky Actions column; bottom nav only when `mobileNav` is `bottom` or `hybrid`
33
+
10
34
  ## [0.3.0] — 2026-10-12
11
35
 
12
36
  ### Added
package/dist/aksui.css CHANGED
@@ -101,13 +101,19 @@ button.ghost:hover,
101
101
  button.app-select-trigger:hover,
102
102
  button.date-field-trigger:hover,
103
103
  button.avatar-button:hover,
104
+ button.topbar-menu-button:hover,
104
105
  button.sort-header:hover,
105
106
  button.row-action:hover,
107
+ button.row-action-menu-trigger:hover,
106
108
  button.date-picker-day:hover,
107
109
  button.side-rail-toggle:hover,
108
110
  button.side-rail-icon:hover,
111
+ button.side-rail-columns-toggle:hover,
109
112
  button.filter-clear:hover,
110
- button.snackbar-close:hover {
113
+ button.snackbar-close:hover,
114
+ button.nav-drawer-close:hover,
115
+ button.tools-mobile-toggle:hover,
116
+ button.tools-drawer-close:hover {
111
117
  transform: none;
112
118
  }
113
119
 
@@ -225,6 +231,10 @@ select:disabled {
225
231
  min-width: 0;
226
232
  }
227
233
 
234
+ button.topbar-menu-button {
235
+ flex: 0 0 auto;
236
+ }
237
+
228
238
  .topbar-logo {
229
239
  width: 40px;
230
240
  height: 40px;
@@ -1211,11 +1221,81 @@ button.side-rail-add:hover {
1211
1221
  background: #2a3546;
1212
1222
  }
1213
1223
 
1224
+ .side-rail-columns,
1214
1225
  .side-rail-download {
1215
1226
  display: grid;
1216
1227
  gap: 8px;
1217
1228
  }
1218
1229
 
1230
+ button.side-rail-columns-toggle {
1231
+ display: inline-flex;
1232
+ align-items: center;
1233
+ justify-content: center;
1234
+ gap: 8px;
1235
+ width: 100%;
1236
+ padding: 10px 12px;
1237
+ border: 1px solid var(--aks-border, #d7dde5);
1238
+ border-radius: var(--aks-radius);
1239
+ background: #fff;
1240
+ color: var(--aks-brand);
1241
+ box-shadow: none;
1242
+ }
1243
+
1244
+ button.side-rail-columns-toggle svg {
1245
+ width: 18px;
1246
+ height: 18px;
1247
+ }
1248
+
1249
+ button.side-rail-columns-toggle:hover {
1250
+ background: #f5f7fa;
1251
+ }
1252
+
1253
+ .side-rail-columns-panel {
1254
+ display: grid;
1255
+ gap: 8px;
1256
+ padding: 8px;
1257
+ border: 1px solid var(--aks-line);
1258
+ border-radius: var(--aks-radius);
1259
+ background: #faf9f7;
1260
+ }
1261
+
1262
+ .side-rail-columns-actions {
1263
+ display: flex;
1264
+ gap: 6px;
1265
+ }
1266
+
1267
+ .side-rail-columns-actions button {
1268
+ flex: 1 1 auto;
1269
+ padding: 6px 8px;
1270
+ font-size: 12px;
1271
+ box-shadow: none;
1272
+ }
1273
+
1274
+ .side-rail-columns-list {
1275
+ display: grid;
1276
+ gap: 6px;
1277
+ max-height: 220px;
1278
+ overflow: auto;
1279
+ }
1280
+
1281
+ label.side-rail-column-option {
1282
+ display: flex;
1283
+ align-items: center;
1284
+ gap: 8px;
1285
+ margin: 0;
1286
+ padding: 4px 2px;
1287
+ color: var(--aks-brand);
1288
+ font-size: 13px;
1289
+ font-weight: 500;
1290
+ }
1291
+
1292
+ label.side-rail-column-option input {
1293
+ width: auto;
1294
+ min-height: 0;
1295
+ margin: 0;
1296
+ accent-color: var(--aks-accent);
1297
+ }
1298
+
1219
1299
  button.side-rail-download-toggle {
1220
1300
  display: inline-flex;
1221
1301
  align-items: center;
@@ -1471,6 +1551,73 @@ button.sort-header.active .sort-indicator {
1471
1551
  gap: 6px;
1472
1552
  }
1473
1553
 
1554
+ .row-actions-mobile {
1555
+ display: none;
1556
+ }
1557
+
1558
+ button.row-action-menu-trigger {
1559
+ width: 36px;
1560
+ height: 32px;
1561
+ padding: 0;
1562
+ color: var(--aks-muted);
1563
+ box-shadow: none;
1564
+ }
1565
+
1566
+ button.row-action-menu-trigger svg {
1567
+ width: 18px;
1568
+ height: 18px;
1569
+ }
1570
+
1571
+ button.row-action-menu-trigger:hover,
1572
+ button.row-action-menu-trigger.open {
1573
+ transform: none;
1574
+ background: #f4f2ef;
1575
+ color: var(--aks-brand);
1576
+ box-shadow: none;
1577
+ }
1578
+
1579
+ .row-action-menu {
1580
+ display: grid;
1581
+ min-width: 160px;
1582
+ padding: 6px;
1583
+ border: 1px solid var(--aks-line);
1584
+ border-radius: var(--aks-radius);
1585
+ background: #fff;
1586
+ box-shadow: 0 12px 28px rgba(30, 39, 53, 0.14);
1587
+ }
1588
+
1589
+ .row-action-menu-portal {
1590
+ position: fixed;
1591
+ z-index: 90;
1592
+ }
1593
+
1594
+ .row-action-menu button {
1595
+ justify-content: flex-start;
1596
+ width: 100%;
1597
+ padding: 10px 12px;
1598
+ font-size: 13px;
1599
+ font-weight: 600;
1600
+ color: var(--aks-brand);
1601
+ box-shadow: none;
1602
+ }
1603
+
1604
+ .row-action-menu button.danger:not(:disabled) {
1605
+ color: #a33b2b;
1606
+ }
1607
+
1608
+ .row-action-menu button:hover:not(:disabled) {
1609
+ transform: none;
1610
+ background: #f4f2ef;
1611
+ box-shadow: none;
1612
+ }
1613
+
1614
+ /* Mobile tools bar + right drawer — hidden on desktop */
1615
+ .tools-mobile-bar,
1616
+ .tools-drawer-backdrop,
1617
+ .tools-drawer {
1618
+ display: none;
1619
+ }
1620
+
1474
1621
  button.row-action {
1475
1622
  padding: 4px 8px;
1476
1623
  font-size: 12px;
@@ -1568,33 +1715,228 @@ button.row-action.danger:not(:disabled):hover {
1568
1715
  }
1569
1716
 
1570
1717
  @media (max-width: 900px) {
1718
+ .list-workspace {
1719
+ gap: 10px;
1720
+ }
1721
+
1722
+ .tools-mobile-bar {
1723
+ display: flex;
1724
+ align-items: center;
1725
+ justify-content: space-between;
1726
+ gap: 10px;
1727
+ flex: 0 0 auto;
1728
+ min-height: 48px;
1729
+ padding: 6px 8px 6px 10px;
1730
+ border: 1px solid var(--aks-line);
1731
+ border-radius: var(--aks-radius);
1732
+ background: #fff;
1733
+ }
1734
+
1735
+ .tools-mobile-bar-start {
1736
+ min-width: 0;
1737
+ flex: 1 1 auto;
1738
+ }
1739
+
1740
+ .tools-mobile-title {
1741
+ margin: 0;
1742
+ color: var(--aks-brand);
1743
+ font-size: 13px;
1744
+ font-weight: 700;
1745
+ white-space: nowrap;
1746
+ overflow: hidden;
1747
+ text-overflow: ellipsis;
1748
+ }
1749
+
1750
+ button.tools-mobile-add {
1751
+ display: inline-flex;
1752
+ align-items: center;
1753
+ gap: 6px;
1754
+ min-height: 36px;
1755
+ padding: 6px 12px;
1756
+ border-radius: var(--aks-radius);
1757
+ background: var(--aks-brand);
1758
+ color: #fff;
1759
+ font-size: 13px;
1760
+ font-weight: 600;
1761
+ box-shadow: none;
1762
+ }
1763
+
1764
+ button.tools-mobile-add svg {
1765
+ width: 16px;
1766
+ height: 16px;
1767
+ }
1768
+
1769
+ button.tools-mobile-add:hover {
1770
+ transform: none;
1771
+ background: #2a3546;
1772
+ box-shadow: none;
1773
+ }
1774
+
1775
+ button.tools-mobile-toggle {
1776
+ position: relative;
1777
+ display: inline-flex;
1778
+ align-items: center;
1779
+ gap: 6px;
1780
+ min-height: 36px;
1781
+ padding: 6px 12px;
1782
+ border: 1px solid var(--aks-line);
1783
+ border-radius: var(--aks-radius);
1784
+ background: #faf9f7;
1785
+ color: var(--aks-brand);
1786
+ font-size: 13px;
1787
+ font-weight: 600;
1788
+ box-shadow: none;
1789
+ }
1790
+
1791
+ button.tools-mobile-toggle svg {
1792
+ width: 16px;
1793
+ height: 16px;
1794
+ }
1795
+
1796
+ button.tools-mobile-toggle:hover {
1797
+ transform: none;
1798
+ background: #f0eeea;
1799
+ box-shadow: none;
1800
+ }
1801
+
1802
+ button.tools-mobile-toggle .filter-badge {
1803
+ position: static;
1804
+ margin-left: 2px;
1805
+ }
1806
+
1807
+ .list-body {
1808
+ flex-direction: column;
1809
+ }
1810
+
1571
1811
  .list-body.side-open,
1572
1812
  .list-body.preview-open {
1573
1813
  flex-direction: column;
1574
1814
  }
1575
1815
 
1576
- .preview-panel,
1577
- .side-rail,
1578
- .side-rail.open {
1579
- width: 100%;
1580
- flex-basis: auto;
1816
+ /* Desktop side-rail becomes a right drawer on small screens */
1817
+ .list-body > .side-rail {
1818
+ display: none;
1581
1819
  }
1582
1820
 
1583
- .side-rail:not(.open) {
1584
- flex-direction: row;
1585
- align-items: center;
1821
+ .preview-panel {
1586
1822
  width: 100%;
1587
1823
  flex-basis: auto;
1824
+ order: 2;
1588
1825
  }
1589
1826
 
1590
- .side-rail:not(.open) .side-rail-icons {
1591
- display: inline-flex;
1592
- margin-left: auto;
1827
+ .tools-drawer-backdrop {
1828
+ display: block;
1829
+ position: fixed;
1830
+ inset: 0;
1831
+ z-index: 55;
1832
+ border: 0;
1833
+ padding: 0;
1834
+ margin: 0;
1835
+ background: rgba(30, 39, 53, 0.42);
1836
+ opacity: 0;
1837
+ pointer-events: none;
1838
+ transition: opacity 160ms ease;
1839
+ box-shadow: none;
1840
+ }
1841
+
1842
+ .tools-drawer-backdrop.open {
1843
+ opacity: 1;
1844
+ pointer-events: auto;
1845
+ }
1846
+
1847
+ .tools-drawer {
1848
+ display: flex;
1849
+ flex-direction: column;
1850
+ position: fixed;
1851
+ top: 0;
1852
+ right: 0;
1853
+ bottom: 0;
1854
+ z-index: 60;
1855
+ width: min(320px, calc(100vw - 40px));
1856
+ background: #fff;
1857
+ border-left: 1px solid var(--aks-line);
1858
+ box-shadow: -12px 0 32px rgba(30, 39, 53, 0.18);
1859
+ transform: translateX(105%);
1860
+ transition: transform 180ms ease;
1861
+ pointer-events: none;
1862
+ }
1863
+
1864
+ .tools-drawer.open {
1865
+ transform: translateX(0);
1866
+ pointer-events: auto;
1867
+ }
1868
+
1869
+ .tools-drawer-head {
1870
+ display: flex;
1871
+ align-items: flex-start;
1872
+ justify-content: space-between;
1873
+ gap: 12px;
1874
+ flex: 0 0 auto;
1875
+ padding: 16px 16px 12px;
1876
+ border-bottom: 1px solid var(--aks-line);
1877
+ background: #faf9f7;
1878
+ }
1879
+
1880
+ .tools-drawer-kicker {
1881
+ margin: 0;
1882
+ color: var(--aks-accent);
1883
+ font-size: 11px;
1884
+ font-weight: 700;
1885
+ letter-spacing: 0.06em;
1886
+ text-transform: uppercase;
1887
+ }
1888
+
1889
+ .tools-drawer-head h3 {
1890
+ margin: 2px 0 0;
1891
+ color: var(--aks-brand);
1892
+ font-size: 16px;
1893
+ font-weight: 700;
1894
+ }
1895
+
1896
+ button.tools-drawer-close {
1897
+ padding: 6px 10px;
1898
+ font-size: 12px;
1899
+ box-shadow: none;
1900
+ }
1901
+
1902
+ .tools-drawer-body {
1903
+ flex: 1 1 auto;
1904
+ min-height: 0;
1905
+ overflow: auto;
1906
+ padding: 14px;
1907
+ }
1908
+
1909
+ .tools-drawer-body .side-rail-body {
1910
+ padding: 0;
1593
1911
  }
1594
1912
 
1595
1913
  .table-card-bar {
1596
1914
  flex-wrap: wrap;
1597
1915
  }
1916
+
1917
+ .data-table {
1918
+ min-width: 520px;
1919
+ }
1920
+
1921
+ .row-actions-desktop {
1922
+ display: none;
1923
+ }
1924
+
1925
+ .row-actions-mobile {
1926
+ display: inline-flex;
1927
+ }
1928
+
1929
+ .data-table .actions-col {
1930
+ position: sticky;
1931
+ right: 0;
1932
+ z-index: 1;
1933
+ background: #fff;
1934
+ box-shadow: -8px 0 12px rgba(30, 39, 53, 0.04);
1935
+ }
1936
+
1937
+ .data-table thead .actions-col {
1938
+ background: #f6f5f3;
1939
+ }
1598
1940
  }
1599
1941
 
1600
1942
  /* src\theme\shell.css */
@@ -1633,20 +1975,146 @@ button.row-action.danger:not(:disabled):hover {
1633
1975
  display: none;
1634
1976
  }
1635
1977
 
1978
+ /* Mobile drawer — hidden on desktop */
1979
+ .nav-drawer-backdrop,
1980
+ .nav-drawer {
1981
+ display: none;
1982
+ }
1983
+
1984
+ button.topbar-menu-button {
1985
+ display: none;
1986
+ width: 40px;
1987
+ height: 40px;
1988
+ padding: 0;
1989
+ border-radius: var(--aks-radius);
1990
+ background: transparent;
1991
+ color: var(--aks-brand);
1992
+ box-shadow: none;
1993
+ }
1994
+
1995
+ button.topbar-menu-button svg {
1996
+ width: 22px;
1997
+ height: 22px;
1998
+ }
1999
+
2000
+ button.topbar-menu-button:hover {
2001
+ transform: none;
2002
+ background: #f4f2ef;
2003
+ box-shadow: none;
2004
+ }
2005
+
1636
2006
  @media (max-width: 900px) {
1637
2007
  .app-body {
1638
2008
  grid-template-columns: 1fr;
1639
2009
  }
1640
2010
 
1641
- .app-shell .side-nav {
2011
+ .app-shell .app-body > .side-nav {
1642
2012
  display: none;
1643
2013
  }
1644
2014
 
1645
- .app-shell .screen {
2015
+ button.topbar-menu-button {
2016
+ display: inline-grid;
2017
+ place-items: center;
2018
+ }
2019
+
2020
+ .app-shell.mobile-nav-drawer .screen,
2021
+ .app-shell.mobile-nav-hybrid:not(.has-bottom-nav) .screen {
2022
+ padding: 10px;
2023
+ }
2024
+
2025
+ .app-shell.has-bottom-nav .screen {
1646
2026
  padding: 10px 10px 88px;
1647
2027
  }
1648
2028
 
1649
- .bottom-nav {
2029
+ /* Drawer overlay */
2030
+ .nav-drawer-backdrop {
2031
+ display: block;
2032
+ position: fixed;
2033
+ inset: 0;
2034
+ z-index: 40;
2035
+ border: 0;
2036
+ padding: 0;
2037
+ margin: 0;
2038
+ background: rgba(30, 39, 53, 0.42);
2039
+ opacity: 0;
2040
+ pointer-events: none;
2041
+ transition: opacity 160ms ease;
2042
+ box-shadow: none;
2043
+ }
2044
+
2045
+ .nav-drawer-backdrop.open {
2046
+ opacity: 1;
2047
+ pointer-events: auto;
2048
+ }
2049
+
2050
+ .nav-drawer {
2051
+ display: flex;
2052
+ flex-direction: column;
2053
+ position: fixed;
2054
+ top: 0;
2055
+ left: 0;
2056
+ bottom: 0;
2057
+ z-index: 50;
2058
+ width: min(300px, calc(100vw - 48px));
2059
+ background: #fff;
2060
+ border-right: 1px solid var(--aks-line);
2061
+ box-shadow: 12px 0 32px rgba(30, 39, 53, 0.18);
2062
+ transform: translateX(-105%);
2063
+ transition: transform 180ms ease;
2064
+ pointer-events: none;
2065
+ }
2066
+
2067
+ .nav-drawer.open {
2068
+ transform: translateX(0);
2069
+ pointer-events: auto;
2070
+ }
2071
+
2072
+ .nav-drawer-head {
2073
+ display: flex;
2074
+ align-items: center;
2075
+ justify-content: space-between;
2076
+ gap: 12px;
2077
+ flex: 0 0 auto;
2078
+ padding: 14px 14px 10px;
2079
+ border-bottom: 1px solid var(--aks-line);
2080
+ }
2081
+
2082
+ .nav-drawer-title {
2083
+ margin: 0;
2084
+ color: var(--aks-brand);
2085
+ font-size: 12px;
2086
+ font-weight: 700;
2087
+ letter-spacing: 0.06em;
2088
+ text-transform: uppercase;
2089
+ }
2090
+
2091
+ button.nav-drawer-close {
2092
+ padding: 6px 10px;
2093
+ font-size: 12px;
2094
+ box-shadow: none;
2095
+ }
2096
+
2097
+ .nav-drawer .side-nav,
2098
+ .nav-drawer-nav {
2099
+ display: flex !important;
2100
+ flex-direction: column;
2101
+ flex: 1 1 auto;
2102
+ min-height: 0;
2103
+ overflow: auto;
2104
+ padding: 10px;
2105
+ gap: 4px;
2106
+ border: 0;
2107
+ background: transparent;
2108
+ }
2109
+
2110
+ .nav-drawer .side-nav button {
2111
+ justify-content: flex-start;
2112
+ width: 100%;
2113
+ text-align: left;
2114
+ }
2115
+
2116
+ /* Legacy / optional bottom nav */
2117
+ .app-shell.has-bottom-nav .bottom-nav {
1650
2118
  position: fixed;
1651
2119
  left: 0;
1652
2120
  right: 0;
@@ -1661,6 +2129,10 @@ button.row-action.danger:not(:disabled):hover {
1661
2129
  box-shadow: 0 -8px 24px rgba(30, 39, 53, 0.18);
1662
2130
  }
1663
2131
 
2132
+ .app-shell.mobile-nav-hybrid.has-bottom-nav .bottom-nav {
2133
+ grid-template-columns: 1fr auto;
2134
+ }
2135
+
1664
2136
  .bottom-nav button {
1665
2137
  display: flex;
1666
2138
  flex-direction: column;
@@ -1674,18 +2146,37 @@ button.row-action.danger:not(:disabled):hover {
1674
2146
  font-size: 10px;
1675
2147
  line-height: 1.1;
1676
2148
  white-space: nowrap;
2149
+ overflow: hidden;
2150
+ text-overflow: ellipsis;
1677
2151
  box-shadow: none;
1678
2152
  }
1679
2153
 
2154
+ .bottom-nav button.bottom-nav-current {
2155
+ align-items: flex-start;
2156
+ padding-left: 14px;
2157
+ font-size: 12px;
2158
+ font-weight: 600;
2159
+ color: #fff;
2160
+ opacity: 1;
2161
+ }
2162
+
2163
+ .bottom-nav button.bottom-nav-menu {
2164
+ min-width: 72px;
2165
+ background: var(--aks-accent);
2166
+ color: #fff;
2167
+ font-size: 12px;
2168
+ font-weight: 700;
2169
+ }
2170
+
1680
2171
  .bottom-nav button.active,
1681
- .bottom-nav button:hover {
2172
+ .bottom-nav button:hover:not(:disabled) {
1682
2173
  transform: none;
1683
2174
  background: var(--aks-accent);
1684
2175
  color: #fff;
1685
2176
  box-shadow: none;
1686
2177
  }
1687
2178
 
1688
- .snackbar-host {
2179
+ .app-shell.has-bottom-nav .snackbar-host {
1689
2180
  right: 16px;
1690
2181
  bottom: calc(78px + env(safe-area-inset-bottom));
1691
2182
  }