@mohasinac/appkit 2.7.23 → 2.7.25

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 (48) hide show
  1. package/dist/features/admin/components/DataTable.js +2 -2
  2. package/dist/features/auth/consent-otp.js +8 -8
  3. package/dist/features/auth/permissions/constants.d.ts +1 -1
  4. package/dist/features/auth/permissions/constants.js +2 -0
  5. package/dist/features/before-after/messages/en.json +7 -7
  6. package/dist/features/collections/messages/en.json +9 -9
  7. package/dist/features/consultation/messages/en.json +24 -24
  8. package/dist/features/contact/email.js +179 -179
  9. package/dist/features/corporate/messages/en.json +25 -25
  10. package/dist/features/loyalty/messages/en.json +18 -18
  11. package/dist/features/media/messages/en.json +63 -63
  12. package/dist/features/pre-orders/messages/en.json +12 -12
  13. package/dist/features/whatsapp-bot/messages/en.json +6 -6
  14. package/dist/styles.css +21 -21
  15. package/dist/tokens/tokens.css +436 -436
  16. package/dist/ui/components/ActiveFilterChips.style.css +66 -66
  17. package/dist/ui/components/AvatarDisplay.style.css +46 -46
  18. package/dist/ui/components/BackgroundRenderer.style.css +31 -31
  19. package/dist/ui/components/Breadcrumb.style.css +60 -60
  20. package/dist/ui/components/BulkActionBar.js +1 -1
  21. package/dist/ui/components/CountdownDisplay.js +1 -1
  22. package/dist/ui/components/CountdownDisplay.style.css +4 -4
  23. package/dist/ui/components/Div.style.css +6 -6
  24. package/dist/ui/components/EmptyState.js +1 -1
  25. package/dist/ui/components/EmptyState.style.css +28 -28
  26. package/dist/ui/components/FlowDiagram.style.css +77 -77
  27. package/dist/ui/components/FormGrid.style.css +32 -32
  28. package/dist/ui/components/ImageGallery.style.css +163 -163
  29. package/dist/ui/components/ImageLightbox.style.css +58 -58
  30. package/dist/ui/components/ItemRow.style.css +33 -33
  31. package/dist/ui/components/Layout.style.css +229 -229
  32. package/dist/ui/components/ListingToolbar.js +1 -1
  33. package/dist/ui/components/Menu.style.css +6 -6
  34. package/dist/ui/components/NavigationLoader.style.css +19 -19
  35. package/dist/ui/components/ResponsiveView.style.css +69 -69
  36. package/dist/ui/components/RoleBadge.style.css +7 -7
  37. package/dist/ui/components/SectionTabs.style.css +164 -164
  38. package/dist/ui/components/Semantic.style.css +14 -14
  39. package/dist/ui/components/SiteLogo.js +2 -2
  40. package/dist/ui/components/SkipToMain.style.css +34 -34
  41. package/dist/ui/components/SortDropdown.style.css +12 -12
  42. package/dist/ui/components/StatusBadge.style.css +5 -5
  43. package/dist/ui/components/TablePagination.js +2 -2
  44. package/dist/ui/components/Toast.js +2 -2
  45. package/dist/ui/components/UnsavedChangesModal.style.css +33 -33
  46. package/dist/ui/components/ViewToggle.style.css +50 -50
  47. package/dist/ui/components/index.style.css +78 -78
  48. package/package.json +1 -1
@@ -1,7 +1,7 @@
1
- /* RoleBadge — thin wrapper over Badge with role-specific color mapping */
2
- /* No additional styles needed — delegates entirely to Badge component */
3
- /* File exists to satisfy style contract requirement */
4
-
5
- .appkit-role-badge {
6
- /* Inherits all styling from Badge variant */
7
- }
1
+ /* RoleBadge — thin wrapper over Badge with role-specific color mapping */
2
+ /* No additional styles needed — delegates entirely to Badge component */
3
+ /* File exists to satisfy style contract requirement */
4
+
5
+ .appkit-role-badge {
6
+ /* Inherits all styling from Badge variant */
7
+ }
@@ -1,164 +1,164 @@
1
- .appkit-section-tabs {
2
- position: sticky;
3
- top: var(--header-height, 0px);
4
- z-index: var(--appkit-z-raised);
5
- background: var(--appkit-color-surface);
6
- border-bottom: 1px solid var(--appkit-color-border);
7
- box-shadow: 0 1px 2px rgba(0, 0, 0, 0.06);
8
- }
9
-
10
- .dark .appkit-section-tabs {
11
- background: var(--appkit-color-bg);
12
- border-bottom-color: var(--appkit-color-border);
13
- }
14
-
15
- .appkit-section-tabs--admin {
16
- background-image: linear-gradient(to right, rgba(250, 245, 255, 0.75), transparent, rgba(238, 242, 255, 0.45));
17
- }
18
-
19
- .appkit-section-tabs--user {
20
- background-image: linear-gradient(to right, rgba(238, 242, 255, 0.75), transparent, rgba(240, 253, 250, 0.45));
21
- }
22
-
23
- .dark .appkit-section-tabs--admin {
24
- background-image: linear-gradient(to right, rgba(88, 28, 135, 0.2), transparent, rgba(49, 46, 129, 0.12));
25
- }
26
-
27
- .dark .appkit-section-tabs--user {
28
- background-image: linear-gradient(to right, rgba(30, 58, 138, 0.2), transparent, rgba(19, 78, 74, 0.12));
29
- }
30
-
31
- .appkit-section-tabs__container {
32
- width: min(80rem, 100%);
33
- margin: 0 auto;
34
- }
35
-
36
- .appkit-section-tabs__scroll {
37
- overflow-x: auto;
38
- -ms-overflow-style: none;
39
- scrollbar-width: none;
40
- touch-action: pan-x;
41
- padding-bottom: 0.125rem;
42
- }
43
-
44
- .appkit-section-tabs__scroll::-webkit-scrollbar {
45
- display: none;
46
- }
47
-
48
- .appkit-section-tabs__scroll--padded {
49
- padding-left: 0.5rem;
50
- padding-right: 0.5rem;
51
- }
52
-
53
- @media (min-width: 768px) {
54
- .appkit-section-tabs__scroll--padded {
55
- padding-left: 1rem;
56
- padding-right: 1rem;
57
- }
58
- }
59
-
60
- .appkit-section-tabs__track {
61
- display: flex;
62
- min-width: max-content;
63
- }
64
-
65
- @media (min-width: 1024px) {
66
- .appkit-section-tabs__track--full {
67
- min-width: 0;
68
- width: 100%;
69
- }
70
- }
71
-
72
- .appkit-section-tabs__tab {
73
- display: inline-flex;
74
- align-items: center;
75
- justify-content: center;
76
- gap: 0.375rem;
77
- flex: 1;
78
- min-width: fit-content;
79
- flex-shrink: 0;
80
- white-space: nowrap;
81
- font-size: 0.875rem;
82
- font-weight: 500;
83
- border: 1px solid transparent;
84
- border-radius: 9999px;
85
- padding: 0.625rem 1rem;
86
- transition: all 0.2s ease;
87
- }
88
-
89
- @media (min-width: 640px) {
90
- .appkit-section-tabs__tab {
91
- padding-left: 1.25rem;
92
- padding-right: 1.25rem;
93
- }
94
- }
95
-
96
- .appkit-section-tabs__tab:focus-visible {
97
- outline: none;
98
- box-shadow: 0 0 0 2px rgba(101, 196, 8, 0.55);
99
- }
100
-
101
- .dark .appkit-section-tabs__tab:focus-visible {
102
- box-shadow: 0 0 0 2px rgba(240, 99, 185, 0.6);
103
- }
104
-
105
- .appkit-section-tabs__tab--active {
106
- border-color: rgba(80, 156, 2, 0.35);
107
- background: var(--appkit-color-secondary-600);
108
- color: var(--appkit-color-text-on-primary);
109
- box-shadow: 0 10px 24px -12px rgba(34, 197, 94, 0.7);
110
- }
111
-
112
- .dark .appkit-section-tabs__tab--active {
113
- border-color: rgba(233, 30, 140, 0.4);
114
- background: var(--appkit-color-primary);
115
- color: var(--appkit-color-text-on-primary);
116
- box-shadow: 0 10px 24px -12px rgba(236, 72, 153, 0.9);
117
- }
118
-
119
- .appkit-section-tabs__tab--inactive {
120
- border-color: rgba(80, 156, 2, 0.2);
121
- background: rgba(80, 156, 2, 0.1);
122
- color: var(--appkit-color-secondary-600);
123
- }
124
-
125
- .appkit-section-tabs__tab--inactive:hover {
126
- background: rgba(80, 156, 2, 0.18);
127
- }
128
-
129
- .dark .appkit-section-tabs__tab--inactive {
130
- border-color: var(--appkit-color-border);
131
- background: rgba(30, 41, 59, 0.8);
132
- color: var(--appkit-color-primary-300);
133
- }
134
-
135
- .dark .appkit-section-tabs__tab--inactive:hover {
136
- background: rgba(51, 65, 85, 0.9);
137
- color: var(--appkit-color-primary-100);
138
- }
139
-
140
- .appkit-section-tabs__icon {
141
- flex-shrink: 0;
142
- }
143
-
144
- .appkit-section-tabs__count {
145
- flex-shrink: 0;
146
- font-size: 0.75rem;
147
- padding: 0.125rem 0.375rem;
148
- border-radius: 9999px;
149
- }
150
-
151
- .appkit-section-tabs__count--active {
152
- background: rgba(255, 255, 255, 0.2);
153
- color: var(--appkit-color-text-on-primary);
154
- }
155
-
156
- .appkit-section-tabs__count--inactive {
157
- background: var(--appkit-color-zinc-100);
158
- color: var(--appkit-color-zinc-500);
159
- }
160
-
161
- .dark .appkit-section-tabs__count--inactive {
162
- background: var(--appkit-color-slate-700);
163
- color: var(--appkit-color-slate-300);
164
- }
1
+ .appkit-section-tabs {
2
+ position: sticky;
3
+ top: var(--header-height, 0px);
4
+ z-index: var(--appkit-z-raised);
5
+ background: var(--appkit-color-surface);
6
+ border-bottom: 1px solid var(--appkit-color-border);
7
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.06);
8
+ }
9
+
10
+ .dark .appkit-section-tabs {
11
+ background: var(--appkit-color-bg);
12
+ border-bottom-color: var(--appkit-color-border);
13
+ }
14
+
15
+ .appkit-section-tabs--admin {
16
+ background-image: linear-gradient(to right, rgba(250, 245, 255, 0.75), transparent, rgba(238, 242, 255, 0.45));
17
+ }
18
+
19
+ .appkit-section-tabs--user {
20
+ background-image: linear-gradient(to right, rgba(238, 242, 255, 0.75), transparent, rgba(240, 253, 250, 0.45));
21
+ }
22
+
23
+ .dark .appkit-section-tabs--admin {
24
+ background-image: linear-gradient(to right, rgba(88, 28, 135, 0.2), transparent, rgba(49, 46, 129, 0.12));
25
+ }
26
+
27
+ .dark .appkit-section-tabs--user {
28
+ background-image: linear-gradient(to right, rgba(30, 58, 138, 0.2), transparent, rgba(19, 78, 74, 0.12));
29
+ }
30
+
31
+ .appkit-section-tabs__container {
32
+ width: min(80rem, 100%);
33
+ margin: 0 auto;
34
+ }
35
+
36
+ .appkit-section-tabs__scroll {
37
+ overflow-x: auto;
38
+ -ms-overflow-style: none;
39
+ scrollbar-width: none;
40
+ touch-action: pan-x;
41
+ padding-bottom: 0.125rem;
42
+ }
43
+
44
+ .appkit-section-tabs__scroll::-webkit-scrollbar {
45
+ display: none;
46
+ }
47
+
48
+ .appkit-section-tabs__scroll--padded {
49
+ padding-left: 0.5rem;
50
+ padding-right: 0.5rem;
51
+ }
52
+
53
+ @media (min-width: 768px) {
54
+ .appkit-section-tabs__scroll--padded {
55
+ padding-left: 1rem;
56
+ padding-right: 1rem;
57
+ }
58
+ }
59
+
60
+ .appkit-section-tabs__track {
61
+ display: flex;
62
+ min-width: max-content;
63
+ }
64
+
65
+ @media (min-width: 1024px) {
66
+ .appkit-section-tabs__track--full {
67
+ min-width: 0;
68
+ width: 100%;
69
+ }
70
+ }
71
+
72
+ .appkit-section-tabs__tab {
73
+ display: inline-flex;
74
+ align-items: center;
75
+ justify-content: center;
76
+ gap: 0.375rem;
77
+ flex: 1;
78
+ min-width: fit-content;
79
+ flex-shrink: 0;
80
+ white-space: nowrap;
81
+ font-size: 0.875rem;
82
+ font-weight: 500;
83
+ border: 1px solid transparent;
84
+ border-radius: 9999px;
85
+ padding: 0.625rem 1rem;
86
+ transition: all 0.2s ease;
87
+ }
88
+
89
+ @media (min-width: 640px) {
90
+ .appkit-section-tabs__tab {
91
+ padding-left: 1.25rem;
92
+ padding-right: 1.25rem;
93
+ }
94
+ }
95
+
96
+ .appkit-section-tabs__tab:focus-visible {
97
+ outline: none;
98
+ box-shadow: 0 0 0 2px rgba(101, 196, 8, 0.55);
99
+ }
100
+
101
+ .dark .appkit-section-tabs__tab:focus-visible {
102
+ box-shadow: 0 0 0 2px rgba(240, 99, 185, 0.6);
103
+ }
104
+
105
+ .appkit-section-tabs__tab--active {
106
+ border-color: rgba(80, 156, 2, 0.35);
107
+ background: var(--appkit-color-secondary-600);
108
+ color: var(--appkit-color-text-on-primary);
109
+ box-shadow: 0 10px 24px -12px rgba(34, 197, 94, 0.7);
110
+ }
111
+
112
+ .dark .appkit-section-tabs__tab--active {
113
+ border-color: rgba(233, 30, 140, 0.4);
114
+ background: var(--appkit-color-primary);
115
+ color: var(--appkit-color-text-on-primary);
116
+ box-shadow: 0 10px 24px -12px rgba(236, 72, 153, 0.9);
117
+ }
118
+
119
+ .appkit-section-tabs__tab--inactive {
120
+ border-color: rgba(80, 156, 2, 0.2);
121
+ background: rgba(80, 156, 2, 0.1);
122
+ color: var(--appkit-color-secondary-600);
123
+ }
124
+
125
+ .appkit-section-tabs__tab--inactive:hover {
126
+ background: rgba(80, 156, 2, 0.18);
127
+ }
128
+
129
+ .dark .appkit-section-tabs__tab--inactive {
130
+ border-color: var(--appkit-color-border);
131
+ background: rgba(30, 41, 59, 0.8);
132
+ color: var(--appkit-color-primary-300);
133
+ }
134
+
135
+ .dark .appkit-section-tabs__tab--inactive:hover {
136
+ background: rgba(51, 65, 85, 0.9);
137
+ color: var(--appkit-color-primary-100);
138
+ }
139
+
140
+ .appkit-section-tabs__icon {
141
+ flex-shrink: 0;
142
+ }
143
+
144
+ .appkit-section-tabs__count {
145
+ flex-shrink: 0;
146
+ font-size: 0.75rem;
147
+ padding: 0.125rem 0.375rem;
148
+ border-radius: 9999px;
149
+ }
150
+
151
+ .appkit-section-tabs__count--active {
152
+ background: rgba(255, 255, 255, 0.2);
153
+ color: var(--appkit-color-text-on-primary);
154
+ }
155
+
156
+ .appkit-section-tabs__count--inactive {
157
+ background: var(--appkit-color-zinc-100);
158
+ color: var(--appkit-color-zinc-500);
159
+ }
160
+
161
+ .dark .appkit-section-tabs__count--inactive {
162
+ background: var(--appkit-color-slate-700);
163
+ color: var(--appkit-color-slate-300);
164
+ }
@@ -1,14 +1,14 @@
1
- /* Semantic — HTML5 landmark wrappers (Section, Article, Main, Aside, Nav, etc.) */
2
- /* Pure passthroughs — no default styles. Exists for style contract compliance. */
3
- /* Consumer themes may add base landmark styles via these hooks. */
4
-
5
- .appkit-section {}
6
- .appkit-article {}
7
- .appkit-main {}
8
- .appkit-aside {}
9
- .appkit-nav {}
10
- .appkit-header {}
11
- .appkit-footer {}
12
- .appkit-ul {}
13
- .appkit-ol {}
14
- .appkit-li {}
1
+ /* Semantic — HTML5 landmark wrappers (Section, Article, Main, Aside, Nav, etc.) */
2
+ /* Pure passthroughs — no default styles. Exists for style contract compliance. */
3
+ /* Consumer themes may add base landmark styles via these hooks. */
4
+
5
+ .appkit-section {}
6
+ .appkit-article {}
7
+ .appkit-main {}
8
+ .appkit-aside {}
9
+ .appkit-nav {}
10
+ .appkit-header {}
11
+ .appkit-footer {}
12
+ .appkit-ul {}
13
+ .appkit-ol {}
14
+ .appkit-li {}
@@ -11,8 +11,8 @@ export function SiteLogo({ className = "h-7", title = "LetItRip.in", variant = "
11
11
  if (src) {
12
12
  return (
13
13
  // eslint-disable-next-line @next/next/no-img-element
14
- _jsx("img", { src: src, alt: title, className: `block w-auto object-contain ${className}` }));
14
+ _jsx("img", { src: src, alt: title, "data-testid": "site-logo", className: `block w-auto object-contain ${className}` }));
15
15
  }
16
16
  const fill = variant === "gradient" ? `url(#${GRADIENT_ID})` : "currentColor";
17
- return (_jsxs("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 214 56", role: "img", "aria-label": title, className: `block w-auto ${className}`, children: [_jsx("title", { children: title }), variant === "gradient" && (_jsx("defs", { children: _jsxs("linearGradient", { id: GRADIENT_ID, x1: "0%", y1: "0%", x2: "100%", y2: "0%", children: [_jsx("stop", { offset: "0%", style: { stopColor: "var(--appkit-color-primary-700, #1343de)" } }), _jsx("stop", { offset: "55%", style: { stopColor: "var(--appkit-color-cobalt, #3570fc)" } }), _jsx("stop", { offset: "100%", style: { stopColor: "var(--appkit-color-secondary-400, #84e122)" } })] }) })), _jsx("text", { x: "0", y: "44", fontFamily: "ui-sans-serif, system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif", fontWeight: "800", fontSize: "44", letterSpacing: "-1.5", fill: fill, children: "LetItRip" }), _jsx("rect", { x: "169", y: "5", width: "43", height: "21", rx: "10.5", fill: fill, opacity: "0.12" }), _jsx("text", { x: "174", y: "21", fontFamily: "ui-sans-serif, system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif", fontWeight: "700", fontSize: "15", letterSpacing: "0.2", fill: fill, children: ".in" })] }));
17
+ return (_jsxs("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 214 56", role: "img", "aria-label": title, "data-testid": "site-logo", className: `block w-auto ${className}`, children: [_jsx("title", { children: title }), variant === "gradient" && (_jsx("defs", { children: _jsxs("linearGradient", { id: GRADIENT_ID, x1: "0%", y1: "0%", x2: "100%", y2: "0%", children: [_jsx("stop", { offset: "0%", style: { stopColor: "var(--appkit-color-primary-700, #1343de)" } }), _jsx("stop", { offset: "55%", style: { stopColor: "var(--appkit-color-cobalt, #3570fc)" } }), _jsx("stop", { offset: "100%", style: { stopColor: "var(--appkit-color-secondary-400, #84e122)" } })] }) })), _jsx("text", { x: "0", y: "44", fontFamily: "ui-sans-serif, system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif", fontWeight: "800", fontSize: "44", letterSpacing: "-1.5", fill: fill, children: "LetItRip" }), _jsx("rect", { x: "169", y: "5", width: "43", height: "21", rx: "10.5", fill: fill, opacity: "0.12" }), _jsx("text", { x: "174", y: "21", fontFamily: "ui-sans-serif, system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif", fontWeight: "700", fontSize: "15", letterSpacing: "0.2", fill: fill, children: ".in" })] }));
18
18
  }
@@ -1,34 +1,34 @@
1
- /* SkipToMain — accessibility skip-navigation link */
2
-
3
- .appkit-skip-to-main {
4
- position: absolute;
5
- width: 1px;
6
- height: 1px;
7
- padding: 0;
8
- margin: -1px;
9
- overflow: hidden;
10
- clip: rect(0, 0, 0, 0);
11
- white-space: nowrap;
12
- border-width: 0;
13
- }
14
-
15
- .appkit-skip-to-main:focus-visible {
16
- position: fixed;
17
- left: 1rem;
18
- top: 1rem;
19
- z-index: 100;
20
- width: auto;
21
- height: auto;
22
- padding: 0.625rem 1rem;
23
- margin: 0;
24
- overflow: visible;
25
- clip: auto;
26
- white-space: normal;
27
- border-radius: 0.5rem;
28
- background: var(--appkit-color-secondary);
29
- color: var(--appkit-color-text-on-primary);
30
- font-size: 0.875rem;
31
- font-weight: 600;
32
- outline: none;
33
- box-shadow: 0 0 0 2px var(--appkit-color-secondary), 0 0 0 4px var(--appkit-color-surface);
34
- }
1
+ /* SkipToMain — accessibility skip-navigation link */
2
+
3
+ .appkit-skip-to-main {
4
+ position: absolute;
5
+ width: 1px;
6
+ height: 1px;
7
+ padding: 0;
8
+ margin: -1px;
9
+ overflow: hidden;
10
+ clip: rect(0, 0, 0, 0);
11
+ white-space: nowrap;
12
+ border-width: 0;
13
+ }
14
+
15
+ .appkit-skip-to-main:focus-visible {
16
+ position: fixed;
17
+ left: 1rem;
18
+ top: 1rem;
19
+ z-index: 100;
20
+ width: auto;
21
+ height: auto;
22
+ padding: 0.625rem 1rem;
23
+ margin: 0;
24
+ overflow: visible;
25
+ clip: auto;
26
+ white-space: normal;
27
+ border-radius: 0.5rem;
28
+ background: var(--appkit-color-secondary);
29
+ color: var(--appkit-color-text-on-primary);
30
+ font-size: 0.875rem;
31
+ font-weight: 600;
32
+ outline: none;
33
+ box-shadow: 0 0 0 2px var(--appkit-color-secondary), 0 0 0 4px var(--appkit-color-surface);
34
+ }
@@ -1,12 +1,12 @@
1
- .appkit-sort-dropdown {
2
- align-items: center;
3
- }
4
-
5
- .appkit-sort-dropdown__label {
6
- white-space: nowrap;
7
- }
8
-
9
- .appkit-sort-dropdown__select {
10
- min-height: 2.25rem;
11
- height: 2.25rem;
12
- }
1
+ .appkit-sort-dropdown {
2
+ align-items: center;
3
+ }
4
+
5
+ .appkit-sort-dropdown__label {
6
+ white-space: nowrap;
7
+ }
8
+
9
+ .appkit-sort-dropdown__select {
10
+ min-height: 2.25rem;
11
+ height: 2.25rem;
12
+ }
@@ -1,5 +1,5 @@
1
- /* StatusBadge inherits all styles from Badge.
2
- This base class is a stable hook for consumer overrides. */
3
- .appkit-status-badge {
4
- text-transform: none;
5
- }
1
+ /* StatusBadge inherits all styles from Badge.
2
+ This base class is a stable hook for consumer overrides. */
3
+ .appkit-status-badge {
4
+ text-transform: none;
5
+ }
@@ -13,7 +13,7 @@ export function TablePagination({ currentPage, totalPages, pageSize, total, onPa
13
13
  perPage: labels?.perPage ?? "Per page",
14
14
  };
15
15
  if (compact) {
16
- return (_jsx(Div, { role: "navigation", "aria-label": l.paginationLabel, className: [
16
+ return (_jsx(Div, { role: "navigation", "aria-label": l.paginationLabel, "data-testid": "pagination", className: [
17
17
  "appkit-table-pagination appkit-table-pagination--compact",
18
18
  className,
19
19
  ]
@@ -22,7 +22,7 @@ export function TablePagination({ currentPage, totalPages, pageSize, total, onPa
22
22
  }
23
23
  const from = total === 0 ? 0 : (currentPage - 1) * pageSize + 1;
24
24
  const to = Math.min(currentPage * pageSize, total);
25
- return (_jsxs(Div, { role: "navigation", "aria-label": l.paginationLabel, className: ["appkit-table-pagination", className]
25
+ return (_jsxs(Div, { role: "navigation", "aria-label": l.paginationLabel, "data-testid": "pagination", className: ["appkit-table-pagination", className]
26
26
  .filter(Boolean)
27
27
  .join(" "), children: [_jsxs(Text, { size: "xs", variant: "none", className: "appkit-table-pagination__summary", children: [l.showing, " ", _jsxs(Span, { className: "appkit-table-pagination__summary-value", children: [from, "\u2013", to] }), " ", l.of, " ", _jsx(Span, { className: "appkit-table-pagination__summary-value", children: new Intl.NumberFormat().format(total) }), " ", l.results] }), _jsx(Div, { className: "appkit-table-pagination__controls", children: _jsx(Pagination, { currentPage: currentPage, totalPages: totalPages, onPageChange: onPageChange, disabled: isLoading }) }), onPageSizeChange && (_jsxs(Div, { className: "appkit-table-pagination__size", children: [_jsx("label", { htmlFor: "page-size-select", className: "appkit-table-pagination__size-label", children: l.perPage }), _jsx(Select, { id: "page-size-select", value: String(pageSize), onValueChange: (value) => onPageSizeChange(Number(value)), disabled: isLoading, "aria-label": l.perPage, className: "appkit-table-pagination__size-select", options: pageSizeOptions.map((s) => ({
28
28
  value: String(s),
@@ -45,7 +45,7 @@ export function ToastProvider({ children, position = "top-right", }) {
45
45
  window.setTimeout(() => hideToast(id), duration);
46
46
  }
47
47
  }, [hideToast]);
48
- return (_jsxs(ToastContext.Provider, { value: { showToast, hideToast }, children: [children, _jsx("div", { "aria-live": "polite", "aria-atomic": "true", className: [UI_TOAST.container, UI_TOAST.positions[position]]
48
+ return (_jsxs(ToastContext.Provider, { value: { showToast, hideToast }, children: [children, _jsx("div", { "aria-live": "polite", "aria-atomic": "true", "data-testid": "toast-container", className: [UI_TOAST.container, UI_TOAST.positions[position]]
49
49
  .filter(Boolean)
50
50
  .join(" "), "data-section": "toast-div-623", children: toasts.map((toast) => (_jsx(ToastRow, { toast: toast, onClose: hideToast }, toast.id))) })] }));
51
51
  }
@@ -56,5 +56,5 @@ function ToastRow({ toast, onClose, }) {
56
56
  warning: _jsx("span", { "aria-hidden": "true", children: "!" }),
57
57
  info: _jsx("span", { "aria-hidden": "true", children: "i" }),
58
58
  };
59
- return (_jsxs("div", { role: "alert", className: [UI_TOAST.row, UI_TOAST.variants[toast.variant]].join(" "), "data-section": "toast-div-624", children: [_jsx("div", { className: UI_TOAST.icon, "data-section": "toast-div-625", children: iconMap[toast.variant] }), _jsx(Text, { as: "div", size: "sm", weight: "medium", className: "flex-1 pr-1", children: toast.message }), _jsx(Button, { type: "button", variant: "ghost", size: "sm", onClick: () => onClose(toast.id), className: "min-h-0 shrink-0 px-2 py-1", "aria-label": "Close notification", children: "\u00D7" })] }));
59
+ return (_jsxs("div", { role: "alert", "data-testid": "toast", className: [UI_TOAST.row, UI_TOAST.variants[toast.variant]].join(" "), "data-section": "toast-div-624", children: [_jsx("div", { className: UI_TOAST.icon, "data-section": "toast-div-625", children: iconMap[toast.variant] }), _jsx(Text, { as: "div", size: "sm", weight: "medium", className: "flex-1 pr-1", children: toast.message }), _jsx(Button, { type: "button", variant: "ghost", size: "sm", onClick: () => onClose(toast.id), className: "min-h-0 shrink-0 px-2 py-1", "aria-label": "Close notification", children: "\u00D7" })] }));
60
60
  }
@@ -1,33 +1,33 @@
1
- /* UnsavedChangesModal — confirmation dialog for unsaved navigation */
2
-
3
- .appkit-unsaved-modal__backdrop {
4
- position: fixed;
5
- inset: 0;
6
- z-index: var(--appkit-z-sidebar);
7
- display: flex;
8
- align-items: center;
9
- justify-content: center;
10
- padding: 1rem;
11
- background: rgba(0, 0, 0, 0.5);
12
- backdrop-filter: blur(4px);
13
- }
14
-
15
- .appkit-unsaved-modal__card {
16
- width: 100%;
17
- max-width: 28rem;
18
- padding: 1.5rem;
19
- }
20
-
21
- .appkit-unsaved-modal__title {
22
- margin-bottom: 0.5rem;
23
- }
24
-
25
- .appkit-unsaved-modal__message {
26
- margin-bottom: 1.5rem;
27
- }
28
-
29
- .appkit-unsaved-modal__actions {
30
- display: flex;
31
- gap: 0.75rem;
32
- justify-content: flex-start;
33
- }
1
+ /* UnsavedChangesModal — confirmation dialog for unsaved navigation */
2
+
3
+ .appkit-unsaved-modal__backdrop {
4
+ position: fixed;
5
+ inset: 0;
6
+ z-index: var(--appkit-z-sidebar);
7
+ display: flex;
8
+ align-items: center;
9
+ justify-content: center;
10
+ padding: 1rem;
11
+ background: rgba(0, 0, 0, 0.5);
12
+ backdrop-filter: blur(4px);
13
+ }
14
+
15
+ .appkit-unsaved-modal__card {
16
+ width: 100%;
17
+ max-width: 28rem;
18
+ padding: 1.5rem;
19
+ }
20
+
21
+ .appkit-unsaved-modal__title {
22
+ margin-bottom: 0.5rem;
23
+ }
24
+
25
+ .appkit-unsaved-modal__message {
26
+ margin-bottom: 1.5rem;
27
+ }
28
+
29
+ .appkit-unsaved-modal__actions {
30
+ display: flex;
31
+ gap: 0.75rem;
32
+ justify-content: flex-start;
33
+ }