@muxima-ui/core 1.1.0 → 1.2.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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@muxima-ui/core",
3
- "version": "1.1.0",
3
+ "version": "1.2.0",
4
4
  "description": "Componentes Angular acessíveis e sóbrios para aplicações empresariais.",
5
5
  "keywords": [
6
6
  "angular",
@@ -72,6 +72,10 @@
72
72
  "types": "./types/muxima-ui-core-card.d.ts",
73
73
  "default": "./fesm2022/muxima-ui-core-card.mjs"
74
74
  },
75
+ "./carousel": {
76
+ "types": "./types/muxima-ui-core-carousel.d.ts",
77
+ "default": "./fesm2022/muxima-ui-core-carousel.mjs"
78
+ },
75
79
  "./checkbox": {
76
80
  "types": "./types/muxima-ui-core-checkbox.d.ts",
77
81
  "default": "./fesm2022/muxima-ui-core-checkbox.mjs"
@@ -84,6 +88,10 @@
84
88
  "types": "./types/muxima-ui-core-clipboard.d.ts",
85
89
  "default": "./fesm2022/muxima-ui-core-clipboard.mjs"
86
90
  },
91
+ "./color-picker": {
92
+ "types": "./types/muxima-ui-core-color-picker.d.ts",
93
+ "default": "./fesm2022/muxima-ui-core-color-picker.mjs"
94
+ },
87
95
  "./combobox": {
88
96
  "types": "./types/muxima-ui-core-combobox.d.ts",
89
97
  "default": "./fesm2022/muxima-ui-core-combobox.mjs"
@@ -116,6 +124,10 @@
116
124
  "types": "./types/muxima-ui-core-menu.d.ts",
117
125
  "default": "./fesm2022/muxima-ui-core-menu.mjs"
118
126
  },
127
+ "./notification-center": {
128
+ "types": "./types/muxima-ui-core-notification-center.d.ts",
129
+ "default": "./fesm2022/muxima-ui-core-notification-center.mjs"
130
+ },
119
131
  "./otp": {
120
132
  "types": "./types/muxima-ui-core-otp.d.ts",
121
133
  "default": "./fesm2022/muxima-ui-core-otp.mjs"
@@ -148,6 +160,10 @@
148
160
  "types": "./types/muxima-ui-core-separator.d.ts",
149
161
  "default": "./fesm2022/muxima-ui-core-separator.mjs"
150
162
  },
163
+ "./sidebar": {
164
+ "types": "./types/muxima-ui-core-sidebar.d.ts",
165
+ "default": "./fesm2022/muxima-ui-core-sidebar.mjs"
166
+ },
151
167
  "./skeleton": {
152
168
  "types": "./types/muxima-ui-core-skeleton.d.ts",
153
169
  "default": "./fesm2022/muxima-ui-core-skeleton.mjs"
@@ -176,6 +192,10 @@
176
192
  "types": "./types/muxima-ui-core-time-picker.d.ts",
177
193
  "default": "./fesm2022/muxima-ui-core-time-picker.mjs"
178
194
  },
195
+ "./timeline": {
196
+ "types": "./types/muxima-ui-core-timeline.d.ts",
197
+ "default": "./fesm2022/muxima-ui-core-timeline.mjs"
198
+ },
179
199
  "./toast": {
180
200
  "types": "./types/muxima-ui-core-toast.d.ts",
181
201
  "default": "./fesm2022/muxima-ui-core-toast.mjs"
package/styles/base.css CHANGED
@@ -109,6 +109,18 @@ button.mx-input-addon:is(:focus-visible, [data-mx-state='focus']),
109
109
  .mx-calendar-day:is(:focus-visible, [data-mx-state='focus']),
110
110
  .mx-date-range-input:focus-visible,
111
111
  .mx-chip-remove:focus-visible,
112
+ .mx-color-swatch:focus-visible,
113
+ .mx-color-tool:focus-visible,
114
+ .mx-color-picker-toggle:focus-visible,
115
+ .mx-carousel-button:focus-visible,
116
+ .mx-carousel-play:focus-visible,
117
+ .mx-carousel-dot:focus-visible,
118
+ .mx-notification-main:focus-visible,
119
+ .mx-notification-action:focus-visible,
120
+ .mx-notification-link:focus-visible,
121
+ .mx-notification-bell:focus-visible,
122
+ .mx-sidebar-item:is(:focus-visible, [data-mx-state='focus']),
123
+ .mx-sidebar-toggle:focus-visible,
112
124
  .mx-copy-button:is(:focus-visible, [data-mx-state='focus']),
113
125
  .mx-file-upload-button:focus-visible,
114
126
  .mx-file-upload-remove:focus-visible,
@@ -0,0 +1,113 @@
1
+ /* ---------- Carousel ---------- */
2
+
3
+ .mx-carousel {
4
+ --mx-carousel-per-view: 1;
5
+ --mx-carousel-gap: 16px;
6
+ position: relative;
7
+ display: flex;
8
+ flex-direction: column;
9
+ gap: 12px;
10
+ width: 100%;
11
+ font-family: var(--mx-font-sans);
12
+ }
13
+ .mx-carousel-viewport {
14
+ position: relative;
15
+ /* com rato e teclado mudam os botões; em ecrãs tácteis desliza-se */
16
+ overflow-x: hidden;
17
+ overscroll-behavior-x: contain;
18
+ scroll-snap-type: x mandatory;
19
+ scrollbar-width: none;
20
+ border-radius: var(--mx-radius-surface);
21
+ }
22
+ @media (hover: none) {
23
+ .mx-carousel-viewport {
24
+ overflow-x: auto;
25
+ }
26
+ }
27
+ .mx-carousel-viewport::-webkit-scrollbar {
28
+ display: none;
29
+ }
30
+ .mx-carousel-track {
31
+ display: flex;
32
+ gap: var(--mx-carousel-gap);
33
+ }
34
+ .mx-carousel-slide {
35
+ flex: 0 0 calc((100% - (var(--mx-carousel-per-view) - 1) * var(--mx-carousel-gap)) / var(--mx-carousel-per-view));
36
+ min-width: 0;
37
+ scroll-snap-align: start;
38
+ }
39
+ .mx-carousel-nav {
40
+ display: flex;
41
+ align-items: center;
42
+ justify-content: center;
43
+ gap: 12px;
44
+ }
45
+ .mx-carousel-button,
46
+ .mx-carousel-play {
47
+ display: inline-flex;
48
+ align-items: center;
49
+ justify-content: center;
50
+ flex-shrink: 0;
51
+ width: 32px;
52
+ height: 32px;
53
+ padding: 0;
54
+ border: 1px solid var(--mx-control-border);
55
+ border-radius: 50%;
56
+ background: var(--mx-surface);
57
+ color: var(--mx-ink);
58
+ cursor: pointer;
59
+ transition: background var(--mx-duration) var(--mx-ease);
60
+ }
61
+ .mx-carousel-button svg,
62
+ .mx-carousel-play svg {
63
+ width: 16px;
64
+ height: 16px;
65
+ }
66
+ .mx-carousel-button:hover:not(:disabled),
67
+ .mx-carousel-play:hover {
68
+ background: var(--mx-subtle);
69
+ }
70
+ .mx-carousel-button:disabled {
71
+ border-color: var(--mx-stone);
72
+ color: var(--mx-stone-strong);
73
+ cursor: not-allowed;
74
+ }
75
+ .mx-carousel-play {
76
+ position: absolute;
77
+ top: 10px;
78
+ right: 10px;
79
+ z-index: 1;
80
+ box-shadow: var(--mx-shadow-overlay);
81
+ }
82
+ .mx-carousel-dots {
83
+ display: flex;
84
+ flex-wrap: wrap;
85
+ justify-content: center;
86
+ gap: 2px;
87
+ }
88
+ .mx-carousel-dot {
89
+ position: relative;
90
+ width: 24px;
91
+ height: 24px;
92
+ padding: 0;
93
+ border: 0;
94
+ border-radius: 50%;
95
+ background: transparent;
96
+ cursor: pointer;
97
+ }
98
+ .mx-carousel-dot::after {
99
+ content: '';
100
+ position: absolute;
101
+ top: 50%;
102
+ left: 50%;
103
+ width: 8px;
104
+ height: 8px;
105
+ border-radius: 999px;
106
+ background: var(--mx-stone-strong);
107
+ transform: translate(-50%, -50%);
108
+ transition: width var(--mx-duration) var(--mx-ease), background var(--mx-duration) var(--mx-ease);
109
+ }
110
+ .mx-carousel-dot[aria-current='true']::after {
111
+ width: 18px;
112
+ background: var(--mx-accent);
113
+ }
@@ -0,0 +1,207 @@
1
+ /* ---------- Color picker ---------- */
2
+
3
+ .mx-color-panel {
4
+ --mx-color-hue: 190;
5
+ --_checker: repeating-conic-gradient(var(--mx-stone) 0% 25%, var(--mx-surface) 0% 50%) 50% / 10px 10px;
6
+ display: flex;
7
+ flex-direction: column;
8
+ gap: 12px;
9
+ width: 248px;
10
+ font-family: var(--mx-font-sans);
11
+ }
12
+ .mx-color-panel[data-swatches-only] {
13
+ width: auto;
14
+ }
15
+ .mx-color-panel[data-swatches-only] .mx-color-swatches {
16
+ grid-template-columns: repeat(auto-fill, 32px);
17
+ min-width: 220px;
18
+ }
19
+ .mx-color-panel[data-disabled] {
20
+ opacity: 0.6;
21
+ }
22
+ .mx-color-area {
23
+ position: relative;
24
+ height: 156px;
25
+ border-radius: var(--mx-radius);
26
+ background:
27
+ linear-gradient(to top, #000, transparent),
28
+ linear-gradient(to right, #fff, hsl(var(--mx-color-hue) 100% 50%));
29
+ cursor: crosshair;
30
+ touch-action: none;
31
+ }
32
+ .mx-color-area-thumb {
33
+ position: absolute;
34
+ width: 16px;
35
+ height: 16px;
36
+ box-sizing: border-box;
37
+ border: 2px solid #fff;
38
+ border-radius: 50%;
39
+ background: var(--mx-color-opaque);
40
+ box-shadow: 0 0 0 1px rgb(0 0 0 / 0.35), 0 1px 3px rgb(0 0 0 / 0.3);
41
+ transform: translate(-50%, -50%);
42
+ }
43
+ .mx-color-area-thumb:focus-visible {
44
+ outline: var(--mx-focus-width) solid var(--mx-accent);
45
+ outline-offset: 2px;
46
+ }
47
+ .mx-color-sliders {
48
+ display: flex;
49
+ align-items: center;
50
+ gap: 10px;
51
+ }
52
+ .mx-color-preview {
53
+ flex-shrink: 0;
54
+ width: 28px;
55
+ height: 28px;
56
+ border-radius: 50%;
57
+ background: var(--_checker);
58
+ box-shadow: inset 0 0 0 1px var(--mx-stone);
59
+ overflow: hidden;
60
+ }
61
+ .mx-color-preview span {
62
+ display: block;
63
+ width: 100%;
64
+ height: 100%;
65
+ background: var(--mx-color-current);
66
+ }
67
+ .mx-color-ranges {
68
+ display: flex;
69
+ flex: 1;
70
+ flex-direction: column;
71
+ gap: 10px;
72
+ }
73
+ .mx-color-range {
74
+ appearance: none;
75
+ -webkit-appearance: none;
76
+ display: block;
77
+ width: 100%;
78
+ height: 12px;
79
+ margin: 0;
80
+ border-radius: 999px;
81
+ cursor: pointer;
82
+ }
83
+ .mx-color-hue {
84
+ background: linear-gradient(to right, #f00, #ff0 17%, #0f0 33%, #0ff 50%, #00f 67%, #f0f 83%, #f00);
85
+ }
86
+ .mx-color-alpha {
87
+ background: linear-gradient(to right, transparent, var(--mx-color-opaque)), var(--_checker);
88
+ }
89
+ .mx-color-range::-webkit-slider-thumb {
90
+ -webkit-appearance: none;
91
+ width: 16px;
92
+ height: 16px;
93
+ border: 2px solid #fff;
94
+ border-radius: 50%;
95
+ background: transparent;
96
+ box-shadow: 0 0 0 1px rgb(0 0 0 / 0.35), 0 1px 3px rgb(0 0 0 / 0.3);
97
+ }
98
+ .mx-color-range::-moz-range-thumb {
99
+ box-sizing: border-box;
100
+ width: 16px;
101
+ height: 16px;
102
+ border: 2px solid #fff;
103
+ border-radius: 50%;
104
+ background: transparent;
105
+ box-shadow: 0 0 0 1px rgb(0 0 0 / 0.35);
106
+ }
107
+ .mx-color-range:focus-visible {
108
+ outline: var(--mx-focus-width) solid var(--mx-accent);
109
+ outline-offset: 3px;
110
+ }
111
+ .mx-color-tool {
112
+ display: inline-flex;
113
+ align-items: center;
114
+ justify-content: center;
115
+ flex-shrink: 0;
116
+ width: 30px;
117
+ height: 30px;
118
+ padding: 0;
119
+ border: 1px solid var(--mx-control-border);
120
+ border-radius: var(--mx-radius);
121
+ background: var(--mx-surface);
122
+ color: var(--mx-ink);
123
+ cursor: pointer;
124
+ }
125
+ .mx-color-tool svg {
126
+ width: 16px;
127
+ height: 16px;
128
+ }
129
+ .mx-color-tool:hover {
130
+ background: var(--mx-subtle);
131
+ }
132
+ .mx-color-input-row {
133
+ display: flex;
134
+ align-items: center;
135
+ gap: 8px;
136
+ }
137
+ .mx-color-input-label {
138
+ color: var(--mx-muted);
139
+ font-size: var(--mx-text-sm);
140
+ font-weight: 500;
141
+ }
142
+ .mx-color-hex.mx-input {
143
+ font-family: var(--mx-font-mono);
144
+ text-transform: uppercase;
145
+ }
146
+ .mx-color-swatches {
147
+ display: grid;
148
+ grid-template-columns: repeat(8, 1fr);
149
+ gap: 6px;
150
+ }
151
+ .mx-color-swatch {
152
+ aspect-ratio: 1;
153
+ width: 100%;
154
+ padding: 0;
155
+ border: 0;
156
+ border-radius: calc(var(--mx-radius) - 2px);
157
+ background: var(--mx-swatch);
158
+ box-shadow: inset 0 0 0 1px rgb(0 0 0 / 0.12);
159
+ cursor: pointer;
160
+ }
161
+ .mx-color-swatch[aria-pressed='true'] {
162
+ outline: 2px solid var(--mx-ink);
163
+ outline-offset: 2px;
164
+ }
165
+
166
+ /* Campo */
167
+ .mx-color-picker {
168
+ display: block;
169
+ width: 100%;
170
+ font-family: var(--mx-font-sans);
171
+ }
172
+ .mx-color-picker-field {
173
+ position: relative;
174
+ }
175
+ .mx-color-picker-input.mx-input {
176
+ padding-left: 42px;
177
+ font-family: var(--mx-font-mono);
178
+ text-transform: uppercase;
179
+ }
180
+ .mx-color-picker-toggle {
181
+ position: absolute;
182
+ top: 50%;
183
+ left: 6px;
184
+ width: 26px;
185
+ height: 26px;
186
+ padding: 0;
187
+ border: 0;
188
+ border-radius: calc(var(--mx-radius) - 2px);
189
+ background: linear-gradient(var(--mx-swatch), var(--mx-swatch)), repeating-conic-gradient(var(--mx-stone) 0% 25%, var(--mx-surface) 0% 50%) 50% / 8px 8px;
190
+ box-shadow: inset 0 0 0 1px rgb(0 0 0 / 0.15);
191
+ transform: translateY(-50%);
192
+ cursor: pointer;
193
+ }
194
+ .mx-color-picker-toggle[data-empty] {
195
+ background: linear-gradient(to top right, transparent calc(50% - 1px), var(--mx-danger) 50%, transparent calc(50% + 1px)), var(--mx-surface);
196
+ }
197
+ .mx-color-picker-toggle:disabled {
198
+ cursor: not-allowed;
199
+ }
200
+ .mx-color-picker-panel {
201
+ padding: 12px;
202
+ border: var(--mx-border);
203
+ border-radius: var(--mx-radius-surface);
204
+ background: var(--mx-surface);
205
+ box-shadow: var(--mx-shadow-overlay);
206
+ animation: mx-fade-in var(--mx-duration) var(--mx-ease);
207
+ }
@@ -0,0 +1,220 @@
1
+ /* ---------- Notification center ---------- */
2
+
3
+ .mx-notification-center {
4
+ display: flex;
5
+ flex-direction: column;
6
+ gap: 10px;
7
+ width: 100%;
8
+ color: var(--mx-ink);
9
+ font-family: var(--mx-font-sans);
10
+ }
11
+ .mx-notification-head {
12
+ display: flex;
13
+ align-items: center;
14
+ gap: 8px;
15
+ }
16
+ .mx-notification-title {
17
+ margin: 0;
18
+ font-size: var(--mx-text-md);
19
+ font-weight: 600;
20
+ }
21
+ .mx-notification-count {
22
+ display: inline-flex;
23
+ align-items: center;
24
+ justify-content: center;
25
+ min-width: 20px;
26
+ height: 20px;
27
+ padding: 0 6px;
28
+ box-sizing: border-box;
29
+ border-radius: 999px;
30
+ background: var(--mx-accent);
31
+ color: var(--mx-on-accent);
32
+ font-size: var(--mx-text-xs);
33
+ font-weight: 600;
34
+ font-variant-numeric: tabular-nums;
35
+ }
36
+ .mx-notification-link {
37
+ margin-left: auto;
38
+ padding: 2px 4px;
39
+ border: 0;
40
+ border-radius: 4px;
41
+ background: none;
42
+ color: var(--mx-accent);
43
+ font: inherit;
44
+ font-size: var(--mx-text-sm);
45
+ font-weight: 500;
46
+ cursor: pointer;
47
+ }
48
+ .mx-notification-link:hover:not(:disabled) {
49
+ text-decoration: underline;
50
+ text-underline-offset: 3px;
51
+ }
52
+ .mx-notification-link:disabled {
53
+ color: var(--mx-muted);
54
+ cursor: default;
55
+ }
56
+ .mx-notification-filters {
57
+ display: flex;
58
+ flex-wrap: wrap;
59
+ gap: 6px;
60
+ }
61
+ .mx-notification-list {
62
+ display: flex;
63
+ flex-direction: column;
64
+ margin: 0;
65
+ padding: 0;
66
+ list-style: none;
67
+ }
68
+ .mx-notification {
69
+ --_tone: var(--mx-accent);
70
+ position: relative;
71
+ display: flex;
72
+ align-items: flex-start;
73
+ gap: 4px;
74
+ padding: 2px 0;
75
+ border-top: var(--mx-border);
76
+ }
77
+ .mx-notification:first-child {
78
+ border-top: 0;
79
+ }
80
+ .mx-notification[data-variant='success'] {
81
+ --_tone: var(--mx-success);
82
+ }
83
+ .mx-notification[data-variant='warning'] {
84
+ --_tone: var(--mx-warning);
85
+ }
86
+ .mx-notification[data-variant='danger'] {
87
+ --_tone: var(--mx-danger);
88
+ }
89
+ .mx-notification-dot {
90
+ flex-shrink: 0;
91
+ width: 8px;
92
+ height: 8px;
93
+ margin: 16px 2px 0 4px;
94
+ border-radius: 50%;
95
+ background: transparent;
96
+ }
97
+ .mx-notification[data-unread] .mx-notification-dot {
98
+ background: var(--_tone);
99
+ }
100
+ .mx-notification-main {
101
+ display: flex;
102
+ flex: 1;
103
+ flex-direction: column;
104
+ gap: 2px;
105
+ min-width: 0;
106
+ padding: 10px 8px;
107
+ border: 0;
108
+ border-radius: var(--mx-radius);
109
+ background: transparent;
110
+ color: inherit;
111
+ font: inherit;
112
+ text-align: start;
113
+ cursor: pointer;
114
+ }
115
+ .mx-notification-main:hover {
116
+ background: var(--mx-subtle);
117
+ }
118
+ .mx-notification-text {
119
+ font-size: var(--mx-text-sm);
120
+ line-height: 1.4;
121
+ }
122
+ .mx-notification[data-unread] .mx-notification-text {
123
+ font-weight: 600;
124
+ }
125
+ .mx-notification-desc {
126
+ color: var(--mx-muted);
127
+ font-size: var(--mx-text-sm);
128
+ line-height: 1.4;
129
+ }
130
+ .mx-notification-time {
131
+ color: var(--mx-muted);
132
+ font-size: var(--mx-text-xs);
133
+ }
134
+ .mx-notification-actions {
135
+ display: flex;
136
+ gap: 2px;
137
+ padding-top: 8px;
138
+ opacity: 0.85;
139
+ }
140
+ .mx-notification-action {
141
+ display: inline-flex;
142
+ align-items: center;
143
+ justify-content: center;
144
+ width: 28px;
145
+ height: 28px;
146
+ padding: 0;
147
+ border: 0;
148
+ border-radius: var(--mx-radius);
149
+ background: transparent;
150
+ color: var(--mx-muted);
151
+ cursor: pointer;
152
+ }
153
+ .mx-notification-action svg {
154
+ width: 14px;
155
+ height: 14px;
156
+ }
157
+ .mx-notification-action:hover {
158
+ background: var(--mx-subtle);
159
+ color: var(--mx-ink);
160
+ }
161
+ .mx-notification-empty {
162
+ display: flex;
163
+ flex-direction: column;
164
+ align-items: center;
165
+ gap: 8px;
166
+ padding: 28px 12px;
167
+ color: var(--mx-muted);
168
+ font-size: var(--mx-text-sm);
169
+ text-align: center;
170
+ }
171
+ .mx-notification-empty svg {
172
+ width: 28px;
173
+ height: 28px;
174
+ }
175
+ .mx-notification-empty p {
176
+ margin: 0;
177
+ }
178
+
179
+ /* Sino */
180
+ .mx-notification-bell {
181
+ position: relative;
182
+ display: inline-flex;
183
+ align-items: center;
184
+ justify-content: center;
185
+ width: 36px;
186
+ height: 36px;
187
+ padding: 0;
188
+ border: 0;
189
+ border-radius: var(--mx-radius);
190
+ background: transparent;
191
+ color: var(--mx-ink);
192
+ cursor: pointer;
193
+ }
194
+ .mx-notification-bell:hover {
195
+ background: var(--mx-subtle);
196
+ }
197
+ .mx-notification-bell svg {
198
+ width: 20px;
199
+ height: 20px;
200
+ }
201
+ .mx-notification-bell-count {
202
+ position: absolute;
203
+ top: 2px;
204
+ right: 1px;
205
+ display: inline-flex;
206
+ align-items: center;
207
+ justify-content: center;
208
+ min-width: 16px;
209
+ height: 16px;
210
+ padding: 0 4px;
211
+ box-sizing: border-box;
212
+ border: 2px solid var(--mx-surface);
213
+ border-radius: 999px;
214
+ background: var(--mx-danger);
215
+ color: var(--mx-on-danger);
216
+ font-family: var(--mx-font-sans);
217
+ font-size: 10px;
218
+ font-weight: 700;
219
+ line-height: 1;
220
+ }