sakana-element 2.2.0 → 2.4.0

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 (155) hide show
  1. package/README.md +98 -25
  2. package/dist/es/{Alert-C76ZWSVk.js → Alert-DfLsJvQD.js} +2 -2
  3. package/dist/es/Avatar-Ci4OKsv7.js +9 -0
  4. package/dist/es/{Badge-CoFWwBwv.js → Badge-B4wEToK6.js} +2 -2
  5. package/dist/es/{Breadcrumb-BtrwTVKW.js → Breadcrumb-BFzww8jd.js} +2 -2
  6. package/dist/es/{Button-S_31-UWJ.js → Button-DbFviVWb.js} +3 -3
  7. package/dist/es/{Card-DcW6nHYD.js → Card-ClRqKkc_.js} +2 -2
  8. package/dist/es/ChatBubble-DFEV_lVI.js +9 -0
  9. package/dist/es/Checkbox-l86YI3Fr.js +51 -0
  10. package/dist/es/{Collapse-DsS7M-m3.js → Collapse-B67v6RSE.js} +4 -4
  11. package/dist/es/{ConfigProvider-BgIewHXP.js → ConfigProvider-BCoGbcS5.js} +2 -2
  12. package/dist/es/Diff-BLiniLom.js +64 -0
  13. package/dist/es/Divider-DDSOHv8G.js +9 -0
  14. package/dist/es/Drawer-apeXw6EO.js +40 -0
  15. package/dist/es/Dropdown-By9qIErf.js +104 -0
  16. package/dist/es/{FileInput-BQ59woas.js → FileInput-CZ5jTfB_.js} +3 -3
  17. package/dist/es/Filter-B_1zU4Dq.js +40 -0
  18. package/dist/es/Form-B_XDnSjK.js +123 -0
  19. package/dist/es/{Icon-DpJyuj7c.js → Icon-D6qRB3pq.js} +1 -1
  20. package/dist/es/Indicator-C6Ip4dpP.js +9 -0
  21. package/dist/es/{Input-CiE4bPJN.js → Input-bThwBbNZ.js} +7 -7
  22. package/dist/es/Kbd-DXNjs7at.js +13 -0
  23. package/dist/es/{Link-B9B2APZq.js → Link-08Ee61Fv.js} +1 -1
  24. package/dist/es/{Loading-BW99pE5N.js → Loading-ByI9mjss.js} +13 -13
  25. package/dist/es/Message-CGG-lV5I.js +152 -0
  26. package/dist/es/Notification-B4clKY5h.js +69 -0
  27. package/dist/es/{Overlay-BRDSWspM.js → Overlay-6iPenJB1.js} +1 -1
  28. package/dist/es/Pixelate-A8J7jxDW.js +39 -0
  29. package/dist/es/Popconfirm-gcHGcOTz.js +23 -0
  30. package/dist/es/Progress-DFUBJQ4X.js +12 -0
  31. package/dist/es/Radio-CLBa1XIM.js +33 -0
  32. package/dist/es/Resizable-BWrFr2oj.js +151 -0
  33. package/dist/es/{Select-Dwqv8isB.js → Select-BtLqds1d.js} +20 -20
  34. package/dist/es/Skeleton-CGUQv3nQ.js +15 -0
  35. package/dist/es/{Switch-B1Gnv1tB.js → Switch-CZJ-S77_.js} +3 -3
  36. package/dist/es/Table-lHbxiyGq.js +10 -0
  37. package/dist/es/Tooltip-CdPqNYdn.js +74 -0
  38. package/dist/es/Validator-7ZT_nXDZ.js +40 -0
  39. package/dist/es/hooks-pU4JmsO3.js +171 -0
  40. package/dist/es/index.js +107 -70
  41. package/dist/es/utils-BXICIEsD.js +139 -0
  42. package/dist/es/{vendor-DXmGx29U.js → vendor-DrBJKLFW.js} +254 -210
  43. package/dist/index.css +1 -1
  44. package/dist/theme/Avatar.css +13 -43
  45. package/dist/theme/Badge.css +151 -151
  46. package/dist/theme/Breadcrumb.css +46 -4
  47. package/dist/theme/Button.css +72 -8
  48. package/dist/theme/Card.css +177 -93
  49. package/dist/theme/ChatBubble.css +218 -0
  50. package/dist/theme/Checkbox.css +604 -0
  51. package/dist/theme/Collapse.css +96 -96
  52. package/dist/theme/Diff.css +110 -0
  53. package/dist/theme/Divider.css +150 -0
  54. package/dist/theme/Drawer.css +206 -0
  55. package/dist/theme/Dropdown.css +359 -75
  56. package/dist/theme/FileInput.css +32 -0
  57. package/dist/theme/Filter.css +598 -0
  58. package/dist/theme/Indicator.css +159 -0
  59. package/dist/theme/Input.css +414 -406
  60. package/dist/theme/Kbd.css +104 -0
  61. package/dist/theme/Link.css +22 -3
  62. package/dist/theme/Loading.css +50 -12
  63. package/dist/theme/Message.css +250 -41
  64. package/dist/theme/Notification.css +232 -42
  65. package/dist/theme/Popconfirm.css +23 -7
  66. package/dist/theme/Progress.css +278 -0
  67. package/dist/theme/Radio.css +492 -0
  68. package/dist/theme/Resizable.css +95 -0
  69. package/dist/theme/Select.css +198 -88
  70. package/dist/theme/Skeleton.css +192 -0
  71. package/dist/theme/Switch.css +22 -3
  72. package/dist/theme/Table.css +680 -0
  73. package/dist/theme/Tooltip.css +150 -26
  74. package/dist/theme/Validator.css +25 -0
  75. package/dist/types/components/Avatar/types.d.ts +0 -2
  76. package/dist/types/components/ChatBubble/constants.d.ts +2 -0
  77. package/dist/types/components/ChatBubble/index.d.ts +27 -0
  78. package/dist/types/components/ChatBubble/types.d.ts +10 -0
  79. package/dist/types/components/Checkbox/constants.d.ts +5 -0
  80. package/dist/types/components/Checkbox/index.d.ts +94 -0
  81. package/dist/types/components/Checkbox/types.d.ts +46 -0
  82. package/dist/types/components/Collapse/index.d.ts +5 -5
  83. package/dist/types/components/Diff/constants.d.ts +4 -0
  84. package/dist/types/components/Diff/index.d.ts +67 -0
  85. package/dist/types/components/Diff/types.d.ts +29 -0
  86. package/dist/types/components/Divider/index.d.ts +30 -0
  87. package/dist/types/components/Divider/types.d.ts +10 -0
  88. package/dist/types/components/Drawer/constants.d.ts +1 -0
  89. package/dist/types/components/Drawer/index.d.ts +72 -0
  90. package/dist/types/components/Drawer/types.d.ts +20 -0
  91. package/dist/types/components/Dropdown/index.d.ts +13 -3
  92. package/dist/types/components/Dropdown/types.d.ts +3 -0
  93. package/dist/types/components/Dropdown/useDropdownKeyboard.d.ts +8 -0
  94. package/dist/types/components/FileInput/index.d.ts +5 -5
  95. package/dist/types/components/Filter/constants.d.ts +5 -0
  96. package/dist/types/components/Filter/index.d.ts +59 -0
  97. package/dist/types/components/Filter/types.d.ts +38 -0
  98. package/dist/types/components/Indicator/constants.d.ts +2 -0
  99. package/dist/types/components/Indicator/index.d.ts +28 -0
  100. package/dist/types/components/Indicator/types.d.ts +10 -0
  101. package/dist/types/components/Input/index.d.ts +10 -10
  102. package/dist/types/components/Kbd/constants.d.ts +3 -0
  103. package/dist/types/components/Kbd/index.d.ts +24 -0
  104. package/dist/types/components/Kbd/types.d.ts +10 -0
  105. package/dist/types/components/Message/methods.d.ts +2 -0
  106. package/dist/types/components/Message/types.d.ts +7 -1
  107. package/dist/types/components/MessageBox/types.d.ts +14 -2
  108. package/dist/types/components/Notification/methods.d.ts +3 -0
  109. package/dist/types/components/Notification/types.d.ts +8 -2
  110. package/dist/types/components/Pixelate/constants.d.ts +2 -0
  111. package/dist/types/components/Pixelate/index.d.ts +71 -0
  112. package/dist/types/components/Pixelate/types.d.ts +23 -0
  113. package/dist/types/components/Popconfirm/index.d.ts +18 -9
  114. package/dist/types/components/Popconfirm/types.d.ts +2 -1
  115. package/dist/types/components/Progress/constants.d.ts +2 -0
  116. package/dist/types/components/Progress/index.d.ts +50 -0
  117. package/dist/types/components/Progress/types.d.ts +22 -0
  118. package/dist/types/components/Radio/constants.d.ts +5 -0
  119. package/dist/types/components/Radio/index.d.ts +88 -0
  120. package/dist/types/components/Radio/types.d.ts +43 -0
  121. package/dist/types/components/Resizable/constants.d.ts +3 -0
  122. package/dist/types/components/Resizable/index.d.ts +135 -0
  123. package/dist/types/components/Resizable/types.d.ts +52 -0
  124. package/dist/types/components/Select/index.d.ts +32 -23
  125. package/dist/types/components/Skeleton/index.d.ts +36 -0
  126. package/dist/types/components/Skeleton/types.d.ts +12 -0
  127. package/dist/types/components/Switch/index.d.ts +5 -5
  128. package/dist/types/components/Table/index.d.ts +27 -0
  129. package/dist/types/components/Table/types.d.ts +20 -0
  130. package/dist/types/components/Tooltip/index.d.ts +9 -3
  131. package/dist/types/components/Tooltip/types.d.ts +7 -0
  132. package/dist/types/components/Validator/index.d.ts +52 -0
  133. package/dist/types/components/Validator/types.d.ts +13 -0
  134. package/dist/types/components/index.d.ts +15 -0
  135. package/dist/types/hooks/index.d.ts +3 -1
  136. package/dist/types/hooks/useDraggable.d.ts +7 -0
  137. package/dist/types/hooks/useFocusTrap.d.ts +5 -0
  138. package/dist/types/utils/index.d.ts +2 -0
  139. package/dist/types/utils/instance-management.d.ts +40 -0
  140. package/dist/types/utils/pixelate.d.ts +10 -0
  141. package/dist/types/utils/style.d.ts +1 -0
  142. package/dist/umd/index.css +1 -1
  143. package/dist/umd/index.css.gz +0 -0
  144. package/dist/umd/index.umd.cjs +4 -4
  145. package/dist/umd/index.umd.cjs.gz +0 -0
  146. package/package.json +59 -59
  147. package/dist/es/Avatar-CxsRW-wl.js +0 -9
  148. package/dist/es/Dropdown-GcomGMAI.js +0 -40
  149. package/dist/es/Form-j90EzLXU.js +0 -122
  150. package/dist/es/Message-DCNnTUje.js +0 -123
  151. package/dist/es/Notification-CBzY5904.js +0 -58
  152. package/dist/es/Popconfirm-DF6d2ORS.js +0 -23
  153. package/dist/es/Tooltip-k6gKnMyt.js +0 -74
  154. package/dist/es/hooks-BaG7l8K5.js +0 -116
  155. package/dist/es/utils-bsCscZfS.js +0 -84
@@ -0,0 +1,104 @@
1
+ /* Kbd Variables */
2
+ .px-kbd[data-v-fa07bd0e] {
3
+ --px-kbd-text-color: var(--px-text-color-primary);
4
+ --px-kbd-bg-color: var(--px-fill-color-blank);
5
+ --px-kbd-border-color: var(--px-border-color);
6
+ --px-kbd-shadow-color: var(--px-shadow-color);
7
+ --px-kbd-font-size: var(--px-font-size-extra-small);
8
+ --px-kbd-height: 24px;
9
+ --px-kbd-padding: 0 6px;
10
+ --px-kbd-inset-shadow: inset 2px 2px 0 0 rgba(0, 0, 0, 0.08);
11
+ --px-kbd-inset-highlight: inset -2px -2px 0 0 rgba(255, 255, 255, 0.15);
12
+ }
13
+ /* Base Kbd Styles - Pixel Keycap Aesthetic */
14
+ .px-kbd[data-v-fa07bd0e] {
15
+ display: inline-flex;
16
+ align-items: center;
17
+ gap: 4px;
18
+ font-family: var(--px-font-family);
19
+ vertical-align: middle;
20
+ }
21
+ /* Individual key element */
22
+ .px-kbd__key[data-v-fa07bd0e] {
23
+ display: inline-flex;
24
+ justify-content: center;
25
+ align-items: center;
26
+ height: var(--px-kbd-height);
27
+ min-width: var(--px-kbd-height);
28
+ padding: var(--px-kbd-padding);
29
+ font-size: var(--px-kbd-font-size);
30
+ font-family: var(--px-font-family);
31
+ font-weight: 500;
32
+ color: var(--px-kbd-text-color);
33
+ line-height: 1;
34
+ white-space: nowrap;
35
+ box-sizing: border-box;
36
+ position: relative;
37
+ background: transparent;
38
+
39
+ border: none;
40
+
41
+ /* Pixel shadow via drop-shadow */
42
+ filter: drop-shadow(2px 2px 0px var(--px-kbd-shadow-color));
43
+
44
+ transition: none;
45
+ }
46
+ /* Border layer — pixel shape with 2px staircase corners */
47
+ .px-kbd__key[data-v-fa07bd0e]::before {
48
+ content: '';
49
+ position: absolute;
50
+ inset: 0;
51
+ background: var(--px-kbd-border-color);
52
+ clip-path: polygon(
53
+ 0 2px, 2px 2px, 2px 0,
54
+ calc(100% - 2px) 0, calc(100% - 2px) 2px, 100% 2px,
55
+ 100% calc(100% - 2px), calc(100% - 2px) calc(100% - 2px), calc(100% - 2px) 100%,
56
+ 2px 100%, 2px calc(100% - 2px), 0 calc(100% - 2px)
57
+ );
58
+ z-index: -1;
59
+ }
60
+ /* Fill layer — sunken keycap bevel */
61
+ .px-kbd__key[data-v-fa07bd0e]::after {
62
+ content: '';
63
+ position: absolute;
64
+ inset: 2px;
65
+ background: var(--px-kbd-bg-color);
66
+ clip-path: polygon(
67
+ 0 2px, 2px 2px, 2px 0,
68
+ calc(100% - 2px) 0, calc(100% - 2px) 2px, 100% 2px,
69
+ 100% calc(100% - 2px), calc(100% - 2px) calc(100% - 2px), calc(100% - 2px) 100%,
70
+ 2px 100%, 2px calc(100% - 2px), 0 calc(100% - 2px)
71
+ );
72
+ box-shadow: var(--px-kbd-inset-shadow), var(--px-kbd-inset-highlight);
73
+ z-index: -1;
74
+ }
75
+ /* Abbr element — remove default underline */
76
+ .px-kbd__abbr[data-v-fa07bd0e] {
77
+ text-decoration: none;
78
+ position: relative;
79
+ z-index: 1;
80
+ }
81
+ /* Icon inside key */
82
+ .px-kbd__key .px-icon[data-v-fa07bd0e] {
83
+ position: relative;
84
+ z-index: 1;
85
+ }
86
+ /* Size variants */
87
+ .px-kbd--large[data-v-fa07bd0e] {
88
+ --px-kbd-height: 30px;
89
+ --px-kbd-padding: 0 10px;
90
+ --px-kbd-font-size: var(--px-font-size-base);
91
+ }
92
+ .px-kbd--small[data-v-fa07bd0e] {
93
+ --px-kbd-height: 20px;
94
+ --px-kbd-padding: 0 4px;
95
+ --px-kbd-font-size: 10px;
96
+ }
97
+ .px-kbd--small .px-kbd__key[data-v-fa07bd0e] {
98
+ filter: drop-shadow(1px 1px 0px var(--px-kbd-shadow-color));
99
+ }
100
+ /* Dark mode */
101
+ html.dark .px-kbd[data-v-fa07bd0e] {
102
+ --px-kbd-inset-shadow: inset 2px 2px 0 0 rgba(0, 0, 0, 0.2);
103
+ --px-kbd-inset-highlight: inset -2px -2px 0 0 rgba(255, 255, 255, 0.08);
104
+ }
@@ -15,17 +15,36 @@
15
15
  text-decoration: none;
16
16
  transition: none;
17
17
  }
18
+ .px-link.is-underline[data-v-d754ba7d] {
19
+ text-decoration: none;
20
+ background-image: repeating-linear-gradient(
21
+ to right,
22
+ var(--px-link-text-color) 0px,
23
+ var(--px-link-text-color) 4px,
24
+ transparent 4px,
25
+ transparent 8px
26
+ );
27
+ background-repeat: no-repeat;
28
+ background-position: bottom 0 left 0;
29
+ background-size: 100% 2px;
30
+ padding-bottom: 2px;
31
+ }
18
32
  .px-link[data-v-d754ba7d]:hover {
19
33
  color: var(--px-link-hover-color);
34
+ transform: translate(-1px, -1px);
20
35
  }
21
- .px-link.is-underline[data-v-d754ba7d] {
22
- text-decoration: underline;
23
- text-underline-offset: 3px;
36
+ .px-link[data-v-d754ba7d]:focus-visible {
37
+ outline: 2px dashed var(--px-color-primary);
38
+ outline-offset: 2px;
39
+ }
40
+ .px-link[data-v-d754ba7d]:active {
41
+ transform: translate(1px, 1px);
24
42
  }
25
43
  .px-link.is-disabled[data-v-d754ba7d] {
26
44
  opacity: 0.5;
27
45
  cursor: not-allowed;
28
46
  pointer-events: none;
47
+ outline: none;
29
48
  }
30
49
  /* Type variants */
31
50
  .px-link--primary[data-v-d754ba7d] {
@@ -43,16 +43,27 @@
43
43
  .px-loading-indicator--danger[data-v-1435ecee] {
44
44
  --px-loading-indicator-color: var(--px-color-danger);
45
45
  }
46
+ /* ─── Pixel-art ring mask (24×24 Bresenham circle with 2×2 blocks) ─── */
47
+ .px-loading-indicator--spinner .px-loading-indicator__inner[data-v-1435ecee],
48
+ .px-loading-indicator--ring .px-loading-indicator__inner[data-v-1435ecee] {
49
+ --px-ring-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Crect x='8' y='2' width='8' height='2' fill='white'/%3E%3Crect x='16' y='4' width='2' height='2' fill='white'/%3E%3Crect x='18' y='6' width='2' height='2' fill='white'/%3E%3Crect x='20' y='8' width='2' height='8' fill='white'/%3E%3Crect x='18' y='16' width='2' height='2' fill='white'/%3E%3Crect x='16' y='18' width='2' height='2' fill='white'/%3E%3Crect x='8' y='20' width='8' height='2' fill='white'/%3E%3Crect x='6' y='18' width='2' height='2' fill='white'/%3E%3Crect x='4' y='16' width='2' height='2' fill='white'/%3E%3Crect x='2' y='8' width='2' height='8' fill='white'/%3E%3Crect x='4' y='6' width='2' height='2' fill='white'/%3E%3Crect x='6' y='4' width='2' height='2' fill='white'/%3E%3C/svg%3E");
50
+ }
46
51
  /* ─── Spinner variant ─── */
47
52
  .px-loading-indicator--spinner .px-loading-indicator__inner[data-v-1435ecee] {
48
53
  display: block;
49
54
  width: 100%;
50
55
  height: 100%;
51
- border: 2px solid transparent;
52
- border-top-color: var(--px-loading-indicator-color);
53
- border-right-color: var(--px-loading-indicator-color);
54
- border-radius: 50%;
55
56
  box-sizing: border-box;
57
+ background: conic-gradient(
58
+ var(--px-loading-indicator-color) 0deg 180deg,
59
+ transparent 180deg 360deg
60
+ );
61
+ -webkit-mask-image: var(--px-ring-mask);
62
+ -webkit-mask-size: contain;
63
+ -webkit-mask-repeat: no-repeat;
64
+ mask-image: var(--px-ring-mask);
65
+ mask-size: contain;
66
+ mask-repeat: no-repeat;
56
67
  animation: px-indicator-spin-1435ecee 0.8s steps(8) infinite;
57
68
  }
58
69
  @keyframes px-indicator-spin-1435ecee {
@@ -139,14 +150,18 @@
139
150
  display: block;
140
151
  width: 80%;
141
152
  height: 80%;
142
- border: 2px solid transparent;
143
- border-top-color: var(--px-loading-indicator-color);
144
- border-right-color: var(--px-loading-indicator-color);
145
- border-bottom-color: transparent;
146
- border-left-color: transparent;
147
- border-radius: 50%;
148
153
  box-sizing: border-box;
149
- animation: px-indicator-spin-1435ecee 1s steps(12) infinite;
154
+ background: conic-gradient(
155
+ var(--px-loading-indicator-color) 0deg 120deg,
156
+ transparent 120deg 360deg
157
+ );
158
+ -webkit-mask-image: var(--px-ring-mask);
159
+ -webkit-mask-size: contain;
160
+ -webkit-mask-repeat: no-repeat;
161
+ mask-image: var(--px-ring-mask);
162
+ mask-size: contain;
163
+ mask-repeat: no-repeat;
164
+ animation: px-indicator-spin-1435ecee 1s steps(8) infinite;
150
165
  }
151
166
  /* Loading Variables */
152
167
  .px-loading {
@@ -157,6 +172,7 @@
157
172
  --px-loading-font-size: var(--px-font-size-base);
158
173
  --px-loading-z-index: 20000;
159
174
  --px-loading-bg-color: rgba(255, 255, 255, 0.8);
175
+ --px-loading-dot-color: rgba(0, 0, 0, 0.02);
160
176
  }
161
177
  /* Base Loading Styles - Pixel Game Loading */
162
178
  .px-loading {
@@ -174,7 +190,15 @@
174
190
  height: var(--px-loading-mask-size);
175
191
  width: var(--px-loading-mask-size);
176
192
  z-index: var(--px-loading-z-index);
177
- background: var(--px-loading-bg-color);
193
+ background:
194
+ repeating-linear-gradient(
195
+ to right,
196
+ var(--px-loading-dot-color) 0px,
197
+ var(--px-loading-dot-color) 2px,
198
+ transparent 2px,
199
+ transparent 4px
200
+ ),
201
+ var(--px-loading-bg-color);
178
202
  display: flex;
179
203
  justify-content: center;
180
204
  align-items: center;
@@ -196,6 +220,7 @@
196
220
  font-family: var(--px-font-family);
197
221
  color: var(--px-text-color-primary);
198
222
  letter-spacing: 1px;
223
+ animation: px-loading-text-pulse 1.5s steps(2) infinite;
199
224
  }
200
225
  .px-loading .px-loading__spinner i {
201
226
  font-size: var(--px-loading-icon-size);
@@ -211,6 +236,18 @@
211
236
  transform: rotate(360deg);
212
237
  }
213
238
  }
239
+ /* Pixel-style text pulse */
240
+ @keyframes px-loading-text-pulse {
241
+ 0% {
242
+ opacity: 1;
243
+ }
244
+ 50% {
245
+ opacity: 0.4;
246
+ }
247
+ 100% {
248
+ opacity: 1;
249
+ }
250
+ }
214
251
  /* Parent element states */
215
252
  .px-loading-parent--relative {
216
253
  position: relative !important;
@@ -221,6 +258,7 @@
221
258
  /* Dark mode loading */
222
259
  .px-dark .px-loading {
223
260
  --px-loading-bg-color: rgba(30, 30, 46, 0.85);
261
+ --px-loading-dot-color: rgba(255, 255, 255, 0.02);
224
262
  }
225
263
  .px-loading {
226
264
  --px-loading-bg-color: var(--d4003bba) !important;
@@ -9,7 +9,11 @@
9
9
  --px-message-close-icon-color: var(--px-text-color-secondary);
10
10
  --px-message-close-hover-color: var(--px-text-color-primary);
11
11
  --px-message-icon-size: 16px;
12
- --px-message-icon-margin: 10px;
12
+ --px-message-icon-margin: 10px;
13
+
14
+ /* Beveled inset for 3D raised-panel depth */
15
+ --px-message-inset-highlight: inset 2px 2px 0 0 rgba(255, 255, 255, 0.35);
16
+ --px-message-inset-shadow: inset -2px -2px 0 0 rgba(0, 0, 0, 0.08);
13
17
  }
14
18
  /* Base Message Styles - Pixel Game Notification */
15
19
  .px-message {
@@ -61,6 +65,7 @@
61
65
  100% calc(100% - 4px), calc(100% - 2px) calc(100% - 4px), calc(100% - 2px) calc(100% - 2px), calc(100% - 4px) calc(100% - 2px), calc(100% - 4px) 100%,
62
66
  4px 100%, 4px calc(100% - 2px), 2px calc(100% - 2px), 2px calc(100% - 4px), 0 calc(100% - 4px)
63
67
  );
68
+ box-shadow: var(--px-message-inset-highlight), var(--px-message-inset-shadow);
64
69
  z-index: -1;
65
70
  }
66
71
  /* Icon styling */
@@ -104,6 +109,13 @@
104
109
  .px-message .px-message__close .px-icon:active {
105
110
  transform: translate(1px, 1px);
106
111
  }
112
+ /* Map error type to danger color palette so @each loops handle both */
113
+ .px-message--error {
114
+ --px-color-error: var(--px-color-danger);
115
+ --px-color-error-dark: var(--px-color-danger-dark);
116
+ --px-color-error-light-5: var(--px-color-danger-light-5);
117
+ --px-color-error-light-9: var(--px-color-danger-light-9);
118
+ }
107
119
  /* Type variants with pixel styling */
108
120
  .px-message--info {
109
121
  --px-message-bg-color: var(--px-color-info-light-9);
@@ -152,19 +164,122 @@
152
164
  }
153
165
  .px-message--danger .px-message__close .px-icon:hover {
154
166
  color: var(--px-color-danger-dark);
155
- }
156
- /* Error variant (alias for danger) */
167
+ }
157
168
  .px-message--error {
158
- --px-message-bg-color: var(--px-color-danger-light-9);
159
- --px-message-border-color: var(--px-color-danger);
160
- --px-message-text-color: var(--px-color-danger-dark);
161
- --px-message-shadow-color: var(--px-color-danger-dark);
169
+ --px-message-bg-color: var(--px-color-error-light-9);
170
+ --px-message-border-color: var(--px-color-error);
171
+ --px-message-text-color: var(--px-color-error-dark);
172
+ --px-message-shadow-color: var(--px-color-error-dark);
162
173
  }
163
174
  .px-message--error .px-message__close .px-icon {
164
- color: var(--px-color-danger);
175
+ color: var(--px-color-error);
165
176
  }
166
177
  .px-message--error .px-message__close .px-icon:hover {
167
- color: var(--px-color-danger-dark);
178
+ color: var(--px-color-error-dark);
179
+ }
180
+ /* ─── Plain variant ─── */
181
+ .px-message.is-plain {
182
+ --px-message-bg-color: var(--px-fill-color-blank);
183
+ --px-message-border-color: var(--px-border-color-light);
184
+ --px-message-shadow-color: var(--px-border-color-light);
185
+ }
186
+ .px-message--info.is-plain {
187
+ --px-message-bg-color: var(--px-color-info-light-9);
188
+ --px-message-border-color: var(--px-color-info-light-5, var(--px-color-info));
189
+ --px-message-text-color: var(--px-color-info);
190
+ --px-message-shadow-color: var(--px-color-info-light-5, var(--px-color-info));
191
+ }
192
+ .px-message--success.is-plain {
193
+ --px-message-bg-color: var(--px-color-success-light-9);
194
+ --px-message-border-color: var(--px-color-success-light-5, var(--px-color-success));
195
+ --px-message-text-color: var(--px-color-success);
196
+ --px-message-shadow-color: var(--px-color-success-light-5, var(--px-color-success));
197
+ }
198
+ .px-message--warning.is-plain {
199
+ --px-message-bg-color: var(--px-color-warning-light-9);
200
+ --px-message-border-color: var(--px-color-warning-light-5, var(--px-color-warning));
201
+ --px-message-text-color: var(--px-color-warning);
202
+ --px-message-shadow-color: var(--px-color-warning-light-5, var(--px-color-warning));
203
+ }
204
+ .px-message--danger.is-plain {
205
+ --px-message-bg-color: var(--px-color-danger-light-9);
206
+ --px-message-border-color: var(--px-color-danger-light-5, var(--px-color-danger));
207
+ --px-message-text-color: var(--px-color-danger);
208
+ --px-message-shadow-color: var(--px-color-danger-light-5, var(--px-color-danger));
209
+ }
210
+ .px-message--error.is-plain {
211
+ --px-message-bg-color: var(--px-color-error-light-9);
212
+ --px-message-border-color: var(--px-color-error-light-5, var(--px-color-error));
213
+ --px-message-text-color: var(--px-color-error);
214
+ --px-message-shadow-color: var(--px-color-error-light-5, var(--px-color-error));
215
+ }
216
+ /* ─── Ghost variant ─── */
217
+ .px-message.is-ghost {
218
+ --px-message-bg-color: var(--px-fill-color-blank);
219
+ --px-message-shadow-color: transparent;
220
+ filter: none;
221
+ }
222
+ .px-message--info.is-ghost {
223
+ --px-message-bg-color: var(--px-fill-color-blank);
224
+ --px-message-border-color: var(--px-color-info);
225
+ --px-message-text-color: var(--px-color-info);
226
+ --px-message-shadow-color: transparent;
227
+ filter: none;
228
+ }
229
+ .px-message--success.is-ghost {
230
+ --px-message-bg-color: var(--px-fill-color-blank);
231
+ --px-message-border-color: var(--px-color-success);
232
+ --px-message-text-color: var(--px-color-success);
233
+ --px-message-shadow-color: transparent;
234
+ filter: none;
235
+ }
236
+ .px-message--warning.is-ghost {
237
+ --px-message-bg-color: var(--px-fill-color-blank);
238
+ --px-message-border-color: var(--px-color-warning);
239
+ --px-message-text-color: var(--px-color-warning);
240
+ --px-message-shadow-color: transparent;
241
+ filter: none;
242
+ }
243
+ .px-message--danger.is-ghost {
244
+ --px-message-bg-color: var(--px-fill-color-blank);
245
+ --px-message-border-color: var(--px-color-danger);
246
+ --px-message-text-color: var(--px-color-danger);
247
+ --px-message-shadow-color: transparent;
248
+ filter: none;
249
+ }
250
+ .px-message--error.is-ghost {
251
+ --px-message-bg-color: var(--px-fill-color-blank);
252
+ --px-message-border-color: var(--px-color-error);
253
+ --px-message-text-color: var(--px-color-error);
254
+ --px-message-shadow-color: transparent;
255
+ filter: none;
256
+ }
257
+ /* ─── Timer bar ─── */
258
+ .px-message__timer {
259
+ position: absolute;
260
+ bottom: 2px;
261
+ left: 4px;
262
+ right: 4px;
263
+ height: 2px;
264
+ background: var(--px-message-text-color);
265
+ opacity: 0.5;
266
+ animation: px-message-timer linear forwards;
267
+ transform-origin: left;
268
+ }
269
+ /* Pause timer bar animation when message is hovered (matches JS timer pause) */
270
+ .px-message:hover .px-message__timer {
271
+ animation-play-state: paused;
272
+ }
273
+ @keyframes px-message-timer {
274
+ 0% { transform: scaleX(1);
275
+ }
276
+ 100% { transform: scaleX(0);
277
+ }
278
+ }
279
+ /* Dark mode — invert bevel highlights */
280
+ .px-dark .px-message {
281
+ --px-message-inset-highlight: inset 2px 2px 0 0 rgba(255, 255, 255, 0.10);
282
+ --px-message-inset-shadow: inset -2px -2px 0 0 rgba(0, 0, 0, 0.25);
168
283
  }
169
284
  /* Animation - Pixel style instant appear/disappear */
170
285
  .px-message.fade-up-enter-from,
@@ -175,7 +290,7 @@
175
290
  .px-message.fade-up-enter-active,
176
291
  .px-message.fade-up-leave-active {
177
292
  transition: opacity 0.15s steps(3), transform 0.15s steps(3);
178
- }
293
+ }
179
294
  /* MessageBox Variables */
180
295
  .px-message-box {
181
296
  --px-message-box-title-color: var(--px-text-color-primary);
@@ -187,7 +302,12 @@
187
302
  --px-message-box-font-line-height: 1.5;
188
303
  --px-message-box-close-size: var(--px-font-size-base);
189
304
  --px-message-box-border-color: var(--px-border-color);
190
- --px-message-box-shadow-color: var(--px-shadow-color);
305
+ --px-message-box-shadow-color: var(--px-shadow-color);
306
+ --px-message-box-divider-color: var(--px-border-color-light);
307
+
308
+ /* Beveled inset for 3D raised-panel depth */
309
+ --px-message-box-inset-highlight: inset 2px 2px 0 0 rgba(255, 255, 255, 0.35);
310
+ --px-message-box-inset-shadow: inset -2px -2px 0 0 rgba(0, 0, 0, 0.08);
191
311
  }
192
312
  /* Overlay */
193
313
  .px-overlay-message-box {
@@ -216,7 +336,6 @@
216
336
  width: 100%;
217
337
  padding: var(--px-message-box-padding-primary);
218
338
  vertical-align: middle;
219
- background-color: var(--px-bg-color);
220
339
  font-size: var(--px-message-box-font-size);
221
340
  font-family: var(--px-font-family);
222
341
  text-align: left;
@@ -225,14 +344,45 @@
225
344
  box-sizing: border-box;
226
345
  overflow-wrap: break-word;
227
346
 
228
- /* Pixel-style border */
229
- border: var(--px-border-width) solid var(--px-message-box-border-color);
347
+ /* Remove traditional styling — pseudo-elements handle visuals */
348
+ background: transparent;
349
+ border: none;
230
350
  border-radius: 0;
231
351
 
232
- /* Pixel shadow */
233
- box-shadow:
234
- var(--px-shadow-offset-x) var(--px-shadow-offset-y) 0 0 var(--px-message-box-shadow-color),
235
- var(--px-box-shadow-inset-light);
352
+ /* Pixel shadow via drop-shadow (respects clip-path shape) */
353
+ filter: drop-shadow(var(--px-shadow-offset-x) var(--px-shadow-offset-y) 0px var(--px-message-box-shadow-color));
354
+
355
+ /* No smooth transitions for pixel feel */
356
+ transition: none;
357
+ }
358
+ /* Border layer — 3-step staircase clip (8px corners) */
359
+ .px-message-box::before {
360
+ content: '';
361
+ position: absolute;
362
+ inset: 0;
363
+ background: var(--px-message-box-border-color);
364
+ clip-path: polygon(
365
+ 0 8px, 2px 8px, 2px 4px, 4px 4px, 4px 2px, 8px 2px, 8px 0,
366
+ calc(100% - 8px) 0, calc(100% - 8px) 2px, calc(100% - 4px) 2px, calc(100% - 4px) 4px, calc(100% - 2px) 4px, calc(100% - 2px) 8px, 100% 8px,
367
+ 100% calc(100% - 8px), calc(100% - 2px) calc(100% - 8px), calc(100% - 2px) calc(100% - 4px), calc(100% - 4px) calc(100% - 4px), calc(100% - 4px) calc(100% - 2px), calc(100% - 8px) calc(100% - 2px), calc(100% - 8px) 100%,
368
+ 8px 100%, 8px calc(100% - 2px), 4px calc(100% - 2px), 4px calc(100% - 4px), 2px calc(100% - 4px), 2px calc(100% - 8px), 0 calc(100% - 8px)
369
+ );
370
+ z-index: 0;
371
+ }
372
+ /* Fill layer — 4px inset, 2-step staircase chamfer, beveled */
373
+ .px-message-box::after {
374
+ content: '';
375
+ position: absolute;
376
+ inset: 4px;
377
+ background: var(--px-bg-color);
378
+ clip-path: polygon(
379
+ 0 4px, 2px 4px, 2px 2px, 4px 2px, 4px 0,
380
+ calc(100% - 4px) 0, calc(100% - 4px) 2px, calc(100% - 2px) 2px, calc(100% - 2px) 4px, 100% 4px,
381
+ 100% calc(100% - 4px), calc(100% - 2px) calc(100% - 4px), calc(100% - 2px) calc(100% - 2px), calc(100% - 4px) calc(100% - 2px), calc(100% - 4px) 100%,
382
+ 4px 100%, 4px calc(100% - 2px), 2px calc(100% - 2px), 2px calc(100% - 4px), 0 calc(100% - 4px)
383
+ );
384
+ box-shadow: var(--px-message-box-inset-highlight), var(--px-message-box-inset-shadow);
385
+ z-index: 0;
236
386
  }
237
387
  .px-message-box:focus {
238
388
  outline: none !important;
@@ -246,6 +396,11 @@
246
396
  .px-message-box.is-center .px-message-box__footer,
247
397
  .px-message-box.is-center .px-message-box__content {
248
398
  justify-content: center;
399
+ }
400
+ /* Draggable cursor */
401
+ .px-message-box.is-draggable .px-message-box__header {
402
+ cursor: move;
403
+ user-select: none;
249
404
  }
250
405
  .px-message-box :deep(.px-icon).px-icon-info {
251
406
  color: var(--px-color-info) !important;
@@ -263,29 +418,47 @@
263
418
  color: var(--px-color-danger) !important;
264
419
  }
265
420
  .px-message-box .px-message-box__header {
266
- padding-bottom: var(--px-message-box-padding-primary);
267
- border-bottom: var(--px-border-width-thin) dashed var(--px-message-box-border-color);
421
+ position: relative;
422
+ z-index: 1;
423
+ display: flex;
424
+ align-items: flex-start;
425
+ justify-content: space-between;
426
+ padding-bottom: var(--px-message-box-padding-primary);
268
427
  }
269
428
  .px-message-box .px-message-box__header .px-message-box__title {
429
+ flex: 1;
270
430
  color: var(--px-message-box-title-color);
271
431
  font-size: var(--px-message-box-font-size);
272
432
  font-family: var(--px-font-family);
273
433
  font-weight: 500;
274
434
  line-height: var(--px-message-box-font-line-height);
435
+ }
436
+ /* Pixel-dashed divider at bottom */
437
+ .px-message-box .px-message-box__header::after {
438
+ content: "";
439
+ position: absolute;
440
+ bottom: 0;
441
+ left: 0;
442
+ right: 0;
443
+ height: 2px;
444
+ background-image: repeating-linear-gradient(
445
+ to right,
446
+ var(--px-message-box-divider-color) 0px,
447
+ var(--px-message-box-divider-color) 6px,
448
+ transparent 6px,
449
+ transparent 12px
450
+ );
275
451
  }
276
452
  .px-message-box .px-message-box__header .px-message-box__header-btn {
277
- position: absolute;
278
- top: 8px;
279
- right: 8px;
280
- padding: 4px;
281
- width: 28px;
282
- height: 28px;
283
- border: var(--px-border-width-thin) solid var(--px-border-color);
453
+ flex-shrink: 0;
454
+ margin-left: 8px;
455
+ padding: 0;
456
+ border: none;
284
457
  outline: none;
285
- background: var(--px-fill-color-blank);
458
+ background: transparent;
286
459
  font-size: var(--px-message-box-close-size);
287
460
  cursor: pointer;
288
- box-shadow: 2px 2px 0 0 var(--px-shadow-color);
461
+ z-index: 1;
289
462
  transition: none;
290
463
  display: flex;
291
464
  align-items: center;
@@ -295,22 +468,20 @@
295
468
  color: var(--px-text-color-secondary);
296
469
  font-size: inherit;
297
470
  }
298
- .px-message-box .px-message-box__header .px-message-box__header-btn:hover {
299
- background: var(--px-fill-color-light);
300
- transform: translate(-1px, -1px);
301
- box-shadow: 3px 3px 0 0 var(--px-shadow-color);
302
- }
303
- .px-message-box .px-message-box__header .px-message-box__header-btn:hover i {
304
- color: var(--px-color-danger);
471
+ .px-message-box .px-message-box__header .px-message-box__header-btn .px-icon {
472
+ cursor: pointer;
473
+ transition: none;
305
474
  }
306
- .px-message-box .px-message-box__header .px-message-box__header-btn:active {
307
- transform: translate(1px, 1px);
308
- box-shadow: 1px 1px 0 0 var(--px-shadow-color);
475
+ .px-message-box .px-message-box__header .px-message-box__header-btn .px-icon:hover {
476
+ color: var(--px-color-danger);
477
+ transform: translate(-1px, -1px);
309
478
  }
310
- .px-message-box .px-message-box__header.show-close {
311
- padding-right: calc(var(--px-message-box-padding-primary) + 32px);
479
+ .px-message-box .px-message-box__header .px-message-box__header-btn .px-icon:active {
480
+ transform: translate(1px, 1px);
312
481
  }
313
482
  .px-message-box .px-message-box__content {
483
+ position: relative;
484
+ z-index: 1;
314
485
  display: flex;
315
486
  align-items: center;
316
487
  gap: 12px;
@@ -327,9 +498,21 @@
327
498
  line-height: var(--px-message-box-font-line-height);
328
499
  }
329
500
  .px-message-box .px-message-box__input {
501
+ position: relative;
502
+ z-index: 1;
330
503
  padding-top: 12px;
331
504
  }
505
+ .px-message-box .px-message-box__error {
506
+ position: relative;
507
+ z-index: 1;
508
+ color: var(--px-color-danger);
509
+ font-size: 12px;
510
+ font-family: var(--px-font-family);
511
+ margin-top: 4px;
512
+ }
332
513
  .px-message-box .px-message-box__footer {
514
+ position: relative;
515
+ z-index: 1;
333
516
  display: flex;
334
517
  flex-wrap: wrap;
335
518
  justify-content: flex-end;
@@ -337,6 +520,32 @@
337
520
  padding-top: var(--px-message-box-padding-primary);
338
521
  gap: 8px;
339
522
  }
523
+ /* Type-colored borders */
524
+ .px-message-box.px-message-box--info {
525
+ --px-message-box-border-color: var(--px-color-info);
526
+ --px-message-box-shadow-color: var(--px-color-info-dark);
527
+ --px-message-box-divider-color: var(--px-color-info-light-5, var(--px-color-info));
528
+ }
529
+ .px-message-box.px-message-box--success {
530
+ --px-message-box-border-color: var(--px-color-success);
531
+ --px-message-box-shadow-color: var(--px-color-success-dark);
532
+ --px-message-box-divider-color: var(--px-color-success-light-5, var(--px-color-success));
533
+ }
534
+ .px-message-box.px-message-box--warning {
535
+ --px-message-box-border-color: var(--px-color-warning);
536
+ --px-message-box-shadow-color: var(--px-color-warning-dark);
537
+ --px-message-box-divider-color: var(--px-color-warning-light-5, var(--px-color-warning));
538
+ }
539
+ .px-message-box.px-message-box--danger {
540
+ --px-message-box-border-color: var(--px-color-danger);
541
+ --px-message-box-shadow-color: var(--px-color-danger-dark);
542
+ --px-message-box-divider-color: var(--px-color-danger-light-5, var(--px-color-danger));
543
+ }
544
+ /* Dark mode — invert bevel highlights */
545
+ .px-dark .px-message-box {
546
+ --px-message-box-inset-highlight: inset 2px 2px 0 0 rgba(255, 255, 255, 0.10);
547
+ --px-message-box-inset-shadow: inset -2px -2px 0 0 rgba(0, 0, 0, 0.25);
548
+ }
340
549
  /* Animation */
341
550
  .fade-in-linear-enter-active .px-overlay-message-box {
342
551
  animation: msgbox-fade-in 0.15s steps(3);