@nordcode/ui 2.1.6 → 2.1.8

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
@@ -1,3 +1,16 @@
1
+ ## 2.1.8 (2026-01-02)
2
+
3
+ ### features
4
+
5
+ - use starting style & new animation for dialogs
6
+
7
+ ## 2.1.7 (2025-12-18)
8
+
9
+ ### features
10
+
11
+ - add subtle transitions to buttons and clickable cards
12
+ - update old transitions for active buttons and radios and checkboxes
13
+
1
14
  ## 2.1.6 (2025-12-12)
2
15
 
3
16
  ### fixes
package/out/complete.css CHANGED
@@ -1566,7 +1566,7 @@
1566
1566
  font-size: inherit;
1567
1567
  cursor: pointer;
1568
1568
  text-align: center;
1569
- transition: var(--transition-duration-quick-2) var(--ease-2);
1569
+ transition: var(--transition-duration-quick-1) var(--ease-2);
1570
1570
  -webkit-text-decoration: unset;
1571
1571
  text-decoration: unset;
1572
1572
  box-shadow: var(--_button-box-shadow);
@@ -1579,7 +1579,7 @@
1579
1579
  -webkit-touch-callout: none;
1580
1580
  line-height: var(--line-height-base);
1581
1581
  padding-block: 0;
1582
- transition-property: box-shadow, transform;
1582
+ transition-property: box-shadow, transform, scale;
1583
1583
  display: inline-flex;
1584
1584
  position: relative;
1585
1585
  }
@@ -1605,11 +1605,7 @@
1605
1605
  background-color: var(--_button-background-hover);
1606
1606
  color: var(--_button-color-hover);
1607
1607
  border-color: var(--_button-border-color-hover);
1608
- box-shadow: none;
1609
- filter: contrast(1.2) saturate(1.1);
1610
- -webkit-backdrop-filter: contrast(2);
1611
- backdrop-filter: contrast(2);
1612
- transform: none;
1608
+ scale: .98;
1613
1609
  }
1614
1610
 
1615
1611
  :where(button, button[type], input[type="button"], input[type="submit"], input[type="reset"], .nc-button).-outline {
@@ -1821,6 +1817,7 @@
1821
1817
 
1822
1818
  :where(.nc-clickable-card) {
1823
1819
  cursor: pointer;
1820
+ transition: scale var(--transition-duration-quick-2) var(--ease-out-2);
1824
1821
  position: relative;
1825
1822
  }
1826
1823
 
@@ -1846,6 +1843,10 @@
1846
1843
  :where(.nc-clickable-card) a[data-link="extra"] {
1847
1844
  position: relative;
1848
1845
  }
1846
+
1847
+ :where(.nc-clickable-card):has(a[data-link="main"]:active) {
1848
+ transform: scale(.99);
1849
+ }
1849
1850
  }
1850
1851
 
1851
1852
  @layer components.dialogs {
@@ -1853,13 +1854,10 @@
1853
1854
  --_dialog-padding-inline: var(--dialog-padding-inline, var(--spacing-base));
1854
1855
  --_dialog-layout-padding: var(--layout-padding, var(--spacing-base));
1855
1856
  --_dialog-close-size: var(--dialog-close-size, var(--control-height-base));
1856
- --_dialog-transition-duration: var(--dialog-transition-duration, var(--transition-duration-moderate-2));
1857
1857
  --_dialog-max-block-size: var(--dialog-max-block-size, 90dvh);
1858
1858
  --_dialog-max-inline-size: var(--dialog-max-inline-size, 28rem);
1859
1859
  --_dialog-radius: 0;
1860
1860
  z-index: var(--layer-important);
1861
- animation: close-dialog var(--_dialog-transition-duration) var(--easing-exit) forwards;
1862
- transition: opacity var(--_dialog-transition-duration) var(--easing-exit);
1863
1861
  border: var(--border-width-thin) solid var(--color-border-base);
1864
1862
  block-size: max-content;
1865
1863
  inline-size: 100dvw;
@@ -1887,13 +1885,46 @@
1887
1885
  }
1888
1886
  }
1889
1887
 
1890
- :where(.nc-dialog)[open] {
1891
- animation: open-dialog var(--_dialog-transition-duration) var(--easing-entry);
1888
+ :where(.nc-dialog) {
1889
+ --transform-in: perspective(80px) rotateX(.5deg) scale(.9);
1890
+ --transform-out: perspective(80px) rotateX(.5deg) scale(.95);
1891
+ --transition-time-in: var(--transition-duration-gentle-1);
1892
+ --transition-time-out: var(--transition-duration-moderate-1);
1893
+ transform: var(--transform-in);
1892
1894
  }
1893
1895
 
1894
- :where(.nc-dialog):not([open]) {
1896
+ :where(.nc-dialog), :where(.nc-dialog)::backdrop {
1897
+ transition: display var(--transition-time-out) allow-discrete, overlay var(--transition-time-out) allow-discrete, transform var(--transition-time-out) var(--ease-in-out-2), opacity var(--transition-duration-moderate-1) var(--ease-in-out-2);
1895
1898
  opacity: 0;
1896
- pointer-events: none;
1899
+ }
1900
+
1901
+ :where(.nc-dialog) {
1902
+ transform: var(--transform-out);
1903
+ }
1904
+
1905
+ :where(.nc-dialog)[open] {
1906
+ opacity: 1;
1907
+ transform: perspective(80px)rotateX(0)scale(1);
1908
+ }
1909
+
1910
+ :where(.nc-dialog)[open], :where(.nc-dialog)[open]::backdrop {
1911
+ transition: display var(--transition-time-in) allow-discrete, overlay var(--transition-time-in) allow-discrete, transform var(--transition-time-in) var(--ease-in-out-2), opacity var(--transition-time-in) var(--ease-in-out-2);
1912
+ }
1913
+
1914
+ :where(.nc-dialog)[open]::backdrop {
1915
+ -webkit-backdrop-filter: blur(20px);
1916
+ backdrop-filter: blur(20px);
1917
+ opacity: 1;
1918
+ }
1919
+
1920
+ @starting-style {
1921
+ :where(.nc-dialog)[open], :where(.nc-dialog)[open]::backdrop {
1922
+ opacity: 0;
1923
+ }
1924
+
1925
+ :where(.nc-dialog)[open] {
1926
+ transform: var(--transform-in);
1927
+ }
1897
1928
  }
1898
1929
 
1899
1930
  :where(.nc-dialog)::backdrop {
@@ -1966,26 +1997,6 @@
1966
1997
  align-items: flex-start;
1967
1998
  display: flex;
1968
1999
  }
1969
-
1970
- @keyframes open-dialog {
1971
- from {
1972
- transform: translate(0%, 100dvh)rotate(0);
1973
- }
1974
-
1975
- to {
1976
- transform: translate(0)rotate(0);
1977
- }
1978
- }
1979
-
1980
- @keyframes close-dialog {
1981
- from {
1982
- transform: translate(0)rotate(0);
1983
- }
1984
-
1985
- to {
1986
- transform: translate(0%, 100dvh)rotate(10deg);
1987
- }
1988
- }
1989
2000
  }
1990
2001
 
1991
2002
  @layer components.forms {
@@ -2275,11 +2286,11 @@
2275
2286
  align-items: center;
2276
2287
  line-height: 1;
2277
2288
  display: inline-flex;
2278
- transform: scale(.8)translateY(2em);
2289
+ transform: scale(.85)translateX(2em);
2279
2290
  }
2280
2291
 
2281
2292
  :where(input[type="checkbox"], .nc-input-checkbox):checked:before {
2282
- transform: scale(1)translateY(0%);
2293
+ transform: scale(1)translateX(0%);
2283
2294
  }
2284
2295
 
2285
2296
  :where(input[type="radio"], .nc-input-radio) {
@@ -2295,11 +2306,11 @@
2295
2306
  inline-size: 50%;
2296
2307
  transition: transform var(--ease-out-2) var(--transition-duration-quick-1);
2297
2308
  display: inline-flex;
2298
- transform: scale(.8)translateY(2em);
2309
+ transform: scale(.85)translateX(2em);
2299
2310
  }
2300
2311
 
2301
2312
  :where(input[type="radio"], .nc-input-radio):checked:before {
2302
- transform: scale(1)translateY(0%);
2313
+ transform: scale(1)translateX(0%);
2303
2314
  }
2304
2315
 
2305
2316
  :where(input[type="color"], .nc-input-color) {
@@ -1350,7 +1350,7 @@
1350
1350
  font-size: inherit;
1351
1351
  cursor: pointer;
1352
1352
  text-align: center;
1353
- transition: var(--transition-duration-quick-2) var(--ease-2);
1353
+ transition: var(--transition-duration-quick-1) var(--ease-2);
1354
1354
  -webkit-text-decoration: unset;
1355
1355
  text-decoration: unset;
1356
1356
  box-shadow: var(--_button-box-shadow);
@@ -1363,7 +1363,7 @@
1363
1363
  -webkit-touch-callout: none;
1364
1364
  line-height: var(--line-height-base);
1365
1365
  padding-block: 0;
1366
- transition-property: box-shadow, transform;
1366
+ transition-property: box-shadow, transform, scale;
1367
1367
  display: inline-flex;
1368
1368
  position: relative;
1369
1369
  }
@@ -1389,11 +1389,7 @@
1389
1389
  background-color: var(--_button-background-hover);
1390
1390
  color: var(--_button-color-hover);
1391
1391
  border-color: var(--_button-border-color-hover);
1392
- box-shadow: none;
1393
- filter: contrast(1.2) saturate(1.1);
1394
- -webkit-backdrop-filter: contrast(2);
1395
- backdrop-filter: contrast(2);
1396
- transform: none;
1392
+ scale: .98;
1397
1393
  }
1398
1394
 
1399
1395
  :where(button, button[type], input[type="button"], input[type="submit"], input[type="reset"], .nc-button).-outline {
@@ -1605,6 +1601,7 @@
1605
1601
 
1606
1602
  :where(.nc-clickable-card) {
1607
1603
  cursor: pointer;
1604
+ transition: scale var(--transition-duration-quick-2) var(--ease-out-2);
1608
1605
  position: relative;
1609
1606
  }
1610
1607
 
@@ -1630,6 +1627,10 @@
1630
1627
  :where(.nc-clickable-card) a[data-link="extra"] {
1631
1628
  position: relative;
1632
1629
  }
1630
+
1631
+ :where(.nc-clickable-card):has(a[data-link="main"]:active) {
1632
+ transform: scale(.99);
1633
+ }
1633
1634
  }
1634
1635
 
1635
1636
  @layer components.dialogs {
@@ -1637,13 +1638,10 @@
1637
1638
  --_dialog-padding-inline: var(--dialog-padding-inline, var(--spacing-base));
1638
1639
  --_dialog-layout-padding: var(--layout-padding, var(--spacing-base));
1639
1640
  --_dialog-close-size: var(--dialog-close-size, var(--control-height-base));
1640
- --_dialog-transition-duration: var(--dialog-transition-duration, var(--transition-duration-moderate-2));
1641
1641
  --_dialog-max-block-size: var(--dialog-max-block-size, 90dvh);
1642
1642
  --_dialog-max-inline-size: var(--dialog-max-inline-size, 28rem);
1643
1643
  --_dialog-radius: 0;
1644
1644
  z-index: var(--layer-important);
1645
- animation: close-dialog var(--_dialog-transition-duration) var(--easing-exit) forwards;
1646
- transition: opacity var(--_dialog-transition-duration) var(--easing-exit);
1647
1645
  border: var(--border-width-thin) solid var(--color-border-base);
1648
1646
  block-size: max-content;
1649
1647
  inline-size: 100dvw;
@@ -1671,13 +1669,46 @@
1671
1669
  }
1672
1670
  }
1673
1671
 
1674
- :where(.nc-dialog)[open] {
1675
- animation: open-dialog var(--_dialog-transition-duration) var(--easing-entry);
1672
+ :where(.nc-dialog) {
1673
+ --transform-in: perspective(80px) rotateX(.5deg) scale(.9);
1674
+ --transform-out: perspective(80px) rotateX(.5deg) scale(.95);
1675
+ --transition-time-in: var(--transition-duration-gentle-1);
1676
+ --transition-time-out: var(--transition-duration-moderate-1);
1677
+ transform: var(--transform-in);
1676
1678
  }
1677
1679
 
1678
- :where(.nc-dialog):not([open]) {
1680
+ :where(.nc-dialog), :where(.nc-dialog)::backdrop {
1681
+ transition: display var(--transition-time-out) allow-discrete, overlay var(--transition-time-out) allow-discrete, transform var(--transition-time-out) var(--ease-in-out-2), opacity var(--transition-duration-moderate-1) var(--ease-in-out-2);
1679
1682
  opacity: 0;
1680
- pointer-events: none;
1683
+ }
1684
+
1685
+ :where(.nc-dialog) {
1686
+ transform: var(--transform-out);
1687
+ }
1688
+
1689
+ :where(.nc-dialog)[open] {
1690
+ opacity: 1;
1691
+ transform: perspective(80px)rotateX(0)scale(1);
1692
+ }
1693
+
1694
+ :where(.nc-dialog)[open], :where(.nc-dialog)[open]::backdrop {
1695
+ transition: display var(--transition-time-in) allow-discrete, overlay var(--transition-time-in) allow-discrete, transform var(--transition-time-in) var(--ease-in-out-2), opacity var(--transition-time-in) var(--ease-in-out-2);
1696
+ }
1697
+
1698
+ :where(.nc-dialog)[open]::backdrop {
1699
+ -webkit-backdrop-filter: blur(20px);
1700
+ backdrop-filter: blur(20px);
1701
+ opacity: 1;
1702
+ }
1703
+
1704
+ @starting-style {
1705
+ :where(.nc-dialog)[open], :where(.nc-dialog)[open]::backdrop {
1706
+ opacity: 0;
1707
+ }
1708
+
1709
+ :where(.nc-dialog)[open] {
1710
+ transform: var(--transform-in);
1711
+ }
1681
1712
  }
1682
1713
 
1683
1714
  :where(.nc-dialog)::backdrop {
@@ -1750,26 +1781,6 @@
1750
1781
  align-items: flex-start;
1751
1782
  display: flex;
1752
1783
  }
1753
-
1754
- @keyframes open-dialog {
1755
- from {
1756
- transform: translate(0%, 100dvh)rotate(0);
1757
- }
1758
-
1759
- to {
1760
- transform: translate(0)rotate(0);
1761
- }
1762
- }
1763
-
1764
- @keyframes close-dialog {
1765
- from {
1766
- transform: translate(0)rotate(0);
1767
- }
1768
-
1769
- to {
1770
- transform: translate(0%, 100dvh)rotate(10deg);
1771
- }
1772
- }
1773
1784
  }
1774
1785
 
1775
1786
  @layer components.forms {
@@ -2059,11 +2070,11 @@
2059
2070
  align-items: center;
2060
2071
  line-height: 1;
2061
2072
  display: inline-flex;
2062
- transform: scale(.8)translateY(2em);
2073
+ transform: scale(.85)translateX(2em);
2063
2074
  }
2064
2075
 
2065
2076
  :where(input[type="checkbox"], .nc-input-checkbox):checked:before {
2066
- transform: scale(1)translateY(0%);
2077
+ transform: scale(1)translateX(0%);
2067
2078
  }
2068
2079
 
2069
2080
  :where(input[type="radio"], .nc-input-radio) {
@@ -2079,11 +2090,11 @@
2079
2090
  inline-size: 50%;
2080
2091
  transition: transform var(--ease-out-2) var(--transition-duration-quick-1);
2081
2092
  display: inline-flex;
2082
- transform: scale(.8)translateY(2em);
2093
+ transform: scale(.85)translateX(2em);
2083
2094
  }
2084
2095
 
2085
2096
  :where(input[type="radio"], .nc-input-radio):checked:before {
2086
- transform: scale(1)translateY(0%);
2097
+ transform: scale(1)translateX(0%);
2087
2098
  }
2088
2099
 
2089
2100
  :where(input[type="color"], .nc-input-color) {
package/package.json CHANGED
@@ -12,7 +12,7 @@
12
12
  "type": "git",
13
13
  "url": "https://github.com/nordcode-agency/nordcode/tree/main/packages/ui"
14
14
  },
15
- "version": "2.1.6",
15
+ "version": "2.1.8",
16
16
  "publishConfig": {
17
17
  "access": "public"
18
18
  },
@@ -35,8 +35,8 @@
35
35
  justify-content: center;
36
36
  text-align: center;
37
37
  position: relative;
38
- transition: var(--transition-duration-quick-2) var(--ease-2);
39
- transition-property: box-shadow, transform;
38
+ transition: var(--transition-duration-quick-1) var(--ease-2);
39
+ transition-property: box-shadow, transform, scale;
40
40
  text-decoration: unset;
41
41
  box-shadow: var(--_button-box-shadow);
42
42
  user-select: none;
@@ -69,11 +69,7 @@
69
69
  background-color: var(--_button-background-hover);
70
70
  color: var(--_button-color-hover);
71
71
  border-color: var(--_button-border-color-hover);
72
-
73
- box-shadow: none;
74
- transform: none;
75
- filter: contrast(1.2) saturate(1.1);
76
- backdrop-filter: contrast(2);
72
+ scale: 0.98;
77
73
  }
78
74
 
79
75
  &.-outline {
@@ -56,6 +56,7 @@
56
56
  :where(.nc-clickable-card) {
57
57
  cursor: pointer;
58
58
  position: relative;
59
+ transition: scale var(--transition-duration-quick-2) var(--ease-out-2);
59
60
 
60
61
  &:focus-within,
61
62
  &:hover {
@@ -82,5 +83,9 @@
82
83
  & a[data-link="extra"] {
83
84
  position: relative;
84
85
  }
86
+
87
+ &:has(a[data-link="main"]:active) {
88
+ transform: scale(0.99);
89
+ }
85
90
  }
86
91
  }
@@ -3,18 +3,13 @@
3
3
  --_dialog-padding-inline: var(--dialog-padding-inline, var(--spacing-base));
4
4
  --_dialog-layout-padding: var(--layout-padding, var(--spacing-base));
5
5
  --_dialog-close-size: var(--dialog-close-size, var(--control-height-base));
6
- --_dialog-transition-duration: var(
7
- --dialog-transition-duration,
8
- var(--transition-duration-moderate-2)
9
- );
6
+
10
7
  --_dialog-max-block-size: var(--dialog-max-block-size, 90dvh);
11
8
  --_dialog-max-inline-size: var(--dialog-max-inline-size, 28rem);
12
9
 
13
10
  --_dialog-radius: 0;
14
11
  display: block;
15
12
  z-index: var(--layer-important);
16
- animation: close-dialog var(--_dialog-transition-duration) var(--easing-exit) forwards;
17
- transition: opacity var(--_dialog-transition-duration) var(--easing-exit);
18
13
  position: fixed;
19
14
  inset: 0;
20
15
  border: var(--border-width-thin) solid var(--color-border-base);
@@ -38,13 +33,60 @@
38
33
  box-shadow: var(--shadow-medium);
39
34
  }
40
35
 
36
+ /* Credits to Adam Argyle. Modified from: https://nerdy.dev/notebook/dialog-starter.html */
37
+
38
+ /* Exit Stage To */
39
+ --transform-in: perspective(80px) rotateX(0.5deg) scale(0.9);
40
+ --transform-out: perspective(80px) rotateX(0.5deg) scale(0.95);
41
+ --transition-time-in: var(--transition-duration-gentle-1);
42
+ --transition-time-out: var(--transition-duration-moderate-1);
43
+
44
+ transform: var(--transform-in);
45
+
46
+ &, &::backdrop {
47
+ transition:
48
+ display var(--transition-time-out) allow-discrete,
49
+ overlay var(--transition-time-out) allow-discrete,
50
+ transform var(--transition-time-out) var(--ease-in-out-2),
51
+ opacity var(--transition-duration-moderate-1) var(--ease-in-out-2);
52
+
53
+ /* Exit Stage To */
54
+ opacity: 0;
55
+ }
56
+
57
+ & {
58
+ transform: var(--transform-out);
59
+ }
60
+
61
+ /* On Stage */
41
62
  &[open] {
42
- animation: open-dialog var(--_dialog-transition-duration) var(--easing-entry);
63
+ opacity: 1;
64
+ transform: perspective(80px) rotateX(0deg) scale(1);
65
+
66
+ &, &::backdrop {
67
+ transition:
68
+ display var(--transition-time-in) allow-discrete,
69
+ overlay var(--transition-time-in) allow-discrete,
70
+ transform var(--transition-time-in) var(--ease-in-out-2),
71
+ opacity var(--transition-time-in) var(--ease-in-out-2);
72
+ }
73
+
74
+ &::backdrop {
75
+ backdrop-filter: blur(20px);
76
+ opacity: 1;
77
+ }
43
78
  }
44
79
 
45
- &:not([open]) {
46
- opacity: 0;
47
- pointer-events: none;
80
+ /* Enter Stage From */
81
+ @starting-style {
82
+ &[open],
83
+ &[open]::backdrop {
84
+ opacity: 0;
85
+ }
86
+
87
+ &[open] {
88
+ transform: var(--transform-in);
89
+ }
48
90
  }
49
91
 
50
92
  &::backdrop {
@@ -117,24 +159,4 @@
117
159
  background-color: var(--color-surface-subtle);
118
160
  }
119
161
  }
120
-
121
- @keyframes open-dialog {
122
- from {
123
- transform: translate(0%, 100dvh) rotate(0deg);
124
- }
125
-
126
- to {
127
- transform: translate(0dvh, 0%) rotate(0deg);
128
- }
129
- }
130
-
131
- @keyframes close-dialog {
132
- from {
133
- transform: translate(0dvh, 0%) rotate(0deg);
134
- }
135
-
136
- to {
137
- transform: translate(0%, 100dvh) rotate(10deg);
138
- }
139
- }
140
162
  }
@@ -143,7 +143,7 @@
143
143
  inline-size: 0.75lh;
144
144
  block-size: 0.75lh;
145
145
  background-color: var(--color-brand-primary-contrast);
146
- transform: scale(0.8) translateY(2em);
146
+ transform: scale(0.85) translateX(2em);
147
147
  transition: transform var(--ease-out-2) var(--transition-duration-quick-1);
148
148
  font-family: var(--font-family-sans);
149
149
  --font-weight: var(--font-weight-active);
@@ -153,7 +153,7 @@
153
153
  }
154
154
 
155
155
  &:checked:before {
156
- transform: scale(1) translateY(0%);
156
+ transform: scale(1) translateX(0%);
157
157
  }
158
158
  }
159
159
 
@@ -167,13 +167,13 @@
167
167
  block-size: 50%;
168
168
  inline-size: 50%;
169
169
  border-radius: var(--border-radius-round);
170
- transform: scale(0.8) translateY(2em);
170
+ transform: scale(0.85) translateX(2em);
171
171
  background-color: var(--color-brand-primary-contrast);
172
172
  transition: transform var(--ease-out-2) var(--transition-duration-quick-1);
173
173
  }
174
174
 
175
175
  &:checked:before {
176
- transform: scale(1) translateY(0%);
176
+ transform: scale(1) translateX(0%);
177
177
  }
178
178
  }
179
179