@lion-npm/ui 0.0.0-stage → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/.oxlintrc.json +8 -0
  2. package/AGENTS.md +0 -0
  3. package/Dockerfile +7 -0
  4. package/LICENSE +21 -0
  5. package/README.md +31 -2
  6. package/compose.yml +14 -0
  7. package/index.html +15 -0
  8. package/package.json +27 -4
  9. package/public/favicon.svg +1 -0
  10. package/public/icons.svg +24 -0
  11. package/src/App.tsx +81 -0
  12. package/src/assets/css/buttons/buttons-android.css +251 -0
  13. package/src/assets/css/buttons/buttons-ios.css +213 -0
  14. package/src/assets/css/buttons/buttons-web.css +138 -0
  15. package/src/assets/css/custom.css +8 -0
  16. package/src/assets/css/index.css +60 -0
  17. package/src/assets/css/inputs/inputs-android.css +259 -0
  18. package/src/assets/css/inputs/inputs-bootstrap.css +74 -0
  19. package/src/assets/css/inputs/inputs-ios.css +268 -0
  20. package/src/assets/css/loadings/loading-bar.css +86 -0
  21. package/src/assets/css/modals/modals.css +236 -0
  22. package/src/components/buttons/AndroidButton.tsx +43 -0
  23. package/src/components/buttons/BootstrapButton.tsx +50 -0
  24. package/src/components/buttons/IOSButton.tsx +42 -0
  25. package/src/components/buttons/LionButton.tsx +76 -0
  26. package/src/components/inputs/AndroidInput.tsx +158 -0
  27. package/src/components/inputs/BootstrapInput.tsx +106 -0
  28. package/src/components/inputs/IOSInput.tsx +163 -0
  29. package/src/components/loadings/LoadingBar.tsx +21 -0
  30. package/src/components/modals/LionModal.tsx +157 -0
  31. package/src/context/LionUIComponentsContext.tsx +65 -0
  32. package/src/features/Header.tsx +77 -0
  33. package/src/features/VariantList.tsx +19 -0
  34. package/src/features/buttons/ButtonsSection.tsx +7 -0
  35. package/src/features/buttons/components/ButtonsAndroidSection.tsx +79 -0
  36. package/src/features/buttons/components/ButtonsBootstrapSection.tsx +77 -0
  37. package/src/features/buttons/components/ButtonsCustomSection.tsx +234 -0
  38. package/src/features/buttons/components/ButtonsIOSSection.tsx +78 -0
  39. package/src/features/inputs/InputsSection.tsx +7 -0
  40. package/src/features/inputs/components/InputsAndroidSection.tsx +155 -0
  41. package/src/features/inputs/components/InputsBootstrapSection.tsx +154 -0
  42. package/src/features/inputs/components/InputsIOSSection.tsx +156 -0
  43. package/src/features/loadings/LoadingSection.tsx +5 -0
  44. package/src/features/loadings/components/LoadingBarSection.tsx +74 -0
  45. package/src/features/modals/ModalsSection.tsx +5 -0
  46. package/src/features/modals/components/ModalsAndroidSection.tsx +103 -0
  47. package/src/features/modals/components/ModalsDefaultForm.tsx +31 -0
  48. package/src/features/modals/components/ModalsDefaultInput.tsx +22 -0
  49. package/src/features/modals/components/ModalsIOSSection.tsx +106 -0
  50. package/src/features/modals/components/ModalsWebSection.tsx +99 -0
  51. package/src/interfaces/LionUIComponentsProviderProps.tsx +7 -0
  52. package/src/interfaces/LionUIContextProps.tsx +6 -0
  53. package/src/interfaces/LionUIState.tsx +8 -0
  54. package/src/main.tsx +9 -0
  55. package/src/types/Android/AndroidInputShapeTypes.tsx +7 -0
  56. package/src/types/Android/AndroidInputStyleTypes.tsx +7 -0
  57. package/src/types/Android/AndroidShapeTypes.tsx +6 -0
  58. package/src/types/Android/AndroidStyleTypes.tsx +9 -0
  59. package/src/types/ButtonTypes.tsx +9 -0
  60. package/src/types/IOS/IOSShapeTypes.tsx +7 -0
  61. package/src/types/IOS/IOSStyleTypes.tsx +9 -0
  62. package/src/types/IOS/iOSInputShapeTypes.tsx +9 -0
  63. package/src/types/IOS/iOSInputStyleTypes.tsx +11 -0
  64. package/src/types/InputTypes.tsx +13 -0
  65. package/src/types/PlatformTypes.tsx +9 -0
  66. package/src/types/SizeTypes.tsx +11 -0
  67. package/src/types/VariantTypes.tsx +19 -0
  68. package/src/types/Web/BootstrapInputShapeTypes.tsx +9 -0
  69. package/src/types/Web/BootstrapInputStyleTypes.tsx +8 -0
  70. package/src/types/Web/BootstrapShapeTypes.tsx +8 -0
  71. package/src/types/Web/BootstrapStyleTypes.tsx +7 -0
  72. package/tsconfig.app.json +26 -0
  73. package/tsconfig.json +7 -0
  74. package/tsconfig.node.json +23 -0
  75. package/vite.config.ts +11 -0
@@ -0,0 +1,74 @@
1
+ /* ==========================================================================
2
+ LION UI LIBRARY - BOOTSTRAP 5 INPUT SYSTEM
3
+ ========================================================================== */
4
+
5
+ /* --- Color Variables Mapping per Variant --- */
6
+ .form-control.bootstrap-variant-primary { --bootstrap-active-color: var(--bs-primary, #0d6efd); }
7
+ .form-control.bootstrap-variant-secondary { --bootstrap-active-color: var(--bs-secondary, #6c757d); }
8
+ .form-control.bootstrap-variant-success { --bootstrap-active-color: var(--bs-success, #198754); }
9
+ .form-control.bootstrap-variant-danger { --bootstrap-active-color: var(--bs-danger, #dc3545); }
10
+ .form-control.bootstrap-variant-warning { --bootstrap-active-color: var(--bs-warning, #ffc107); }
11
+ .form-control.bootstrap-variant-info { --bootstrap-active-color: var(--bs-info, #0dcaf0); }
12
+ .form-control.bootstrap-variant-dark { --bootstrap-active-color: var(--bs-dark, #212529); }
13
+
14
+ /* Custom Lion Variants */
15
+ .form-control.bootstrap-variant-lion-packages { --bootstrap-active-color: var(--lion-packages, #6f42c1); }
16
+ .form-control.bootstrap-variant-lion-parking { --bootstrap-active-color: var(--lion-parking, #20c997); }
17
+ .form-control.bootstrap-variant-lion-tech { --bootstrap-active-color: var(--lion-tech, #fd7e14); }
18
+ .form-control.bootstrap-variant-lion-glam { --bootstrap-active-color: var(--lion-glam, #e83e8c); }
19
+
20
+ /* --- Native Bootstrap Focus Overrides --- */
21
+ .form-control.bootstrap-variant-primary:focus,
22
+ .form-control.bootstrap-variant-secondary:focus,
23
+ .form-control.bootstrap-variant-success:focus,
24
+ .form-control.bootstrap-variant-danger:focus,
25
+ .form-control.bootstrap-variant-warning:focus,
26
+ .form-control.bootstrap-variant-info:focus,
27
+ .form-control.bootstrap-variant-dark:focus,
28
+ .form-control.bootstrap-variant-lion-packages:focus,
29
+ .form-control.bootstrap-variant-lion-parking:focus,
30
+ .form-control.bootstrap-variant-lion-tech:focus,
31
+ .form-control.bootstrap-variant-lion-glam:focus {
32
+ border-color: var(--bootstrap-active-color);
33
+ box-shadow: 0 0 0 0.25rem color-mix(in srgb, var(--bootstrap-active-color) 25%, transparent);
34
+ }
35
+
36
+ /* --- Floating Label Color Synchronization --- */
37
+ .form-floating:has(.form-control.bootstrap-variant-primary:focus) > label,
38
+ .form-floating:has(.form-control.bootstrap-variant-primary:not(:placeholder-shown)) > label { color: var(--bs-primary); }
39
+
40
+ .form-floating:has(.form-control.bootstrap-variant-secondary:focus) > label,
41
+ .form-floating:has(.form-control.bootstrap-variant-secondary:not(:placeholder-shown)) > label { color: var(--bs-secondary); }
42
+
43
+ .form-floating:has(.form-control.bootstrap-variant-success:focus) > label,
44
+ .form-floating:has(.form-control.bootstrap-variant-success:not(:placeholder-shown)) > label { color: var(--bs-success); }
45
+
46
+ .form-floating:has(.form-control.bootstrap-variant-danger:focus) > label,
47
+ .form-floating:has(.form-control.bootstrap-variant-danger:not(:placeholder-shown)) > label { color: var(--bs-danger); }
48
+
49
+ .form-floating:has(.form-control.bootstrap-variant-warning:focus) > label,
50
+ .form-floating:has(.form-control.bootstrap-variant-warning:not(:placeholder-shown)) > label { color: var(--bs-warning); }
51
+
52
+ .form-floating:has(.form-control.bootstrap-variant-info:focus) > label,
53
+ .form-floating:has(.form-control.bootstrap-variant-info:not(:placeholder-shown)) > label { color: var(--bs-info); }
54
+
55
+ .form-floating:has(.form-control.bootstrap-variant-dark:focus) > label,
56
+ .form-floating:has(.form-control.bootstrap-variant-dark:not(:placeholder-shown)) > label { color: var(--bs-dark); }
57
+
58
+ .form-floating:has(.form-control.bootstrap-variant-lion-packages:focus) > label,
59
+ .form-floating:has(.form-control.bootstrap-variant-lion-packages:not(:placeholder-shown)) > label { color: var(--lion-packages, #6f42c1); }
60
+
61
+ .form-floating:has(.form-control.bootstrap-variant-lion-parking:focus) > label,
62
+ .form-floating:has(.form-control.bootstrap-variant-lion-parking:not(:placeholder-shown)) > label { color: var(--lion-parking, #20c997); }
63
+
64
+ .form-floating:has(.form-control.bootstrap-variant-lion-tech:focus) > label,
65
+ .form-floating:has(.form-control.bootstrap-variant-lion-tech:not(:placeholder-shown)) > label { color: var(--lion-tech, #fd7e14); }
66
+
67
+ .form-floating:has(.form-control.bootstrap-variant-lion-glam:focus) > label,
68
+ .form-floating:has(.form-control.bootstrap-variant-lion-glam:not(:placeholder-shown)) > label { color: var(--lion-glam, #e83e8c); }
69
+
70
+ /* --- Shape Utility Overrides --- */
71
+ .form-control.rounded-pill {
72
+ padding-left: 1.25rem;
73
+ padding-right: 1.25rem;
74
+ }
@@ -0,0 +1,268 @@
1
+ /* ==========================================================================
2
+ LION UI LIBRARY - IOS INPUT SYSTEM (STANDARDIZED & ISOLATED)
3
+ ========================================================================== */
4
+
5
+ .ios-input-container {
6
+ --ios-input-bg: var(--bs-body-bg, #ffffff);
7
+ --ios-input-color: var(--bs-body-color, #212529);
8
+ --ios-input-border-color: var(--bs-border-color, #dee2e6);
9
+ --ios-input-placeholder-color: var(--bs-secondary-color, #6c757d);
10
+ --ios-input-focus-color: var(--bs-primary, #0d6efd);
11
+ --ios-input-error-color: var(--bs-danger, #dc3545);
12
+ --ios-input-disabled-bg: var(--bs-tertiary-bg, #f8f9fa);
13
+
14
+ display: flex;
15
+ flex-direction: column;
16
+ gap: 6px;
17
+ font-family: -apple-system, BlinkMacSystemFont, "SF Pro Text", "SF Pro Display", "Helvetica Neue", sans-serif;
18
+ width: 100%;
19
+ box-sizing: border-box;
20
+ }
21
+
22
+ .ios-input-label {
23
+ font-size: 13px;
24
+ font-weight: 600;
25
+ color: var(--ios-input-color);
26
+ margin-left: 4px;
27
+ letter-spacing: -0.08px;
28
+ }
29
+
30
+ /* Wrapper Base */
31
+ .ios-input-wrapper {
32
+ position: relative;
33
+ display: flex;
34
+ align-items: center;
35
+ background-color: var(--ios-input-bg);
36
+ color: var(--ios-input-color);
37
+ transition: all 0.2s ease-in-out;
38
+ box-sizing: border-box;
39
+ width: 100%;
40
+ overflow: hidden;
41
+ }
42
+
43
+ /* --- Sizes (Scoped with ios-size-) --- */
44
+ .ios-input-wrapper.ios-size-sx {
45
+ min-height: 30px;
46
+ font-size: 12px;
47
+ padding: 0 8px;
48
+ }
49
+
50
+ .ios-input-wrapper.ios-size-sm {
51
+ min-height: 36px;
52
+ font-size: 14px;
53
+ padding: 0 10px;
54
+ }
55
+
56
+ .ios-input-wrapper.ios-size-md {
57
+ min-height: 44px;
58
+ font-size: 16px;
59
+ padding: 0 14px;
60
+ }
61
+
62
+ .ios-input-wrapper.ios-size-lg {
63
+ min-height: 52px;
64
+ font-size: 18px;
65
+ padding: 0 16px;
66
+ }
67
+
68
+ /* --- Shapes (Scoped with ios-shape-) --- */
69
+ .ios-input-wrapper.ios-shape-rounded {
70
+ border-radius: 12px !important;
71
+ }
72
+
73
+ .ios-input-wrapper.ios-shape-pill {
74
+ border-radius: 9999px !important;
75
+ padding-left: 18px !important;
76
+ padding-right: 18px !important;
77
+ }
78
+
79
+ .ios-input-wrapper.ios-shape-square {
80
+ border-radius: 4px !important;
81
+ }
82
+
83
+ /* --- Style Types (Scoped with ios-style-) --- */
84
+
85
+ .ios-input-wrapper.ios-style-rounded-border,
86
+ .ios-input-wrapper.ios-style-outlined {
87
+ border: 1.5px solid var(--ios-input-border-color);
88
+ background-color: transparent;
89
+ }
90
+
91
+ .ios-input-wrapper.ios-style-rounded-border.is-focused,
92
+ .ios-input-wrapper.ios-style-outlined.is-focused {
93
+ border-color: var(--ios-active-color, var(--ios-input-focus-color));
94
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--ios-active-color, var(--ios-input-focus-color)) 20%, transparent);
95
+ }
96
+
97
+ .ios-input-wrapper.ios-style-form {
98
+ background-color: transparent;
99
+ border: none;
100
+ border-bottom: 1px solid var(--ios-input-border-color);
101
+ border-radius: 0 !important;
102
+ padding-left: 0 !important;
103
+ padding-right: 0 !important;
104
+ }
105
+
106
+ .ios-input-wrapper.ios-style-form.is-focused {
107
+ border-bottom-color: var(--ios-active-color, var(--ios-input-focus-color));
108
+ box-shadow: none;
109
+ }
110
+
111
+ .ios-input-wrapper.ios-style-filled {
112
+ background-color: var(--bs-tertiary-bg, #f1f3f5);
113
+ border: 1px solid transparent;
114
+ }
115
+
116
+ .ios-input-wrapper.ios-style-filled.is-focused {
117
+ background-color: var(--ios-input-bg);
118
+ border-color: var(--ios-active-color, var(--ios-input-focus-color));
119
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--ios-active-color, var(--ios-input-focus-color)) 20%, transparent);
120
+ }
121
+
122
+ .ios-input-wrapper.ios-style-plain {
123
+ background-color: transparent;
124
+ border: none;
125
+ padding: 0 !important;
126
+ }
127
+
128
+ /* --- Variants Mapping (Scoped with ios-variant-) --- */
129
+ .ios-input-container.ios-variant-primary {
130
+ --ios-active-color: var(--bs-primary, #0d6efd);
131
+ }
132
+
133
+ .ios-input-container.ios-variant-secondary {
134
+ --ios-active-color: var(--bs-secondary, #6c757d);
135
+ }
136
+
137
+ .ios-input-container.ios-variant-success {
138
+ --ios-active-color: var(--bs-success, #198754);
139
+ }
140
+
141
+ .ios-input-container.ios-variant-danger {
142
+ --ios-active-color: var(--bs-danger, #dc3545);
143
+ }
144
+
145
+ .ios-input-container.ios-variant-warning {
146
+ --ios-active-color: var(--bs-warning, #ffc107);
147
+ }
148
+
149
+ .ios-input-container.ios-variant-info {
150
+ --ios-active-color: var(--bs-info, #0dcaf0);
151
+ }
152
+
153
+ .ios-input-container.ios-variant-dark {
154
+ --ios-active-color: var(--bs-dark, #212529);
155
+ }
156
+
157
+ /* Custom Lion Variants */
158
+ .ios-input-container.ios-variant-lion-packages {
159
+ --ios-active-color: var(--lion-packages, #6f42c1);
160
+ }
161
+
162
+ .ios-input-container.ios-variant-lion-parking {
163
+ --ios-active-color: var(--lion-parking, #20c997);
164
+ }
165
+
166
+ .ios-input-container.ios-variant-lion-tech {
167
+ --ios-active-color: var(--lion-tech, #fd7e14);
168
+ }
169
+
170
+ .ios-input-container.ios-variant-lion-glam {
171
+ --ios-active-color: var(--lion-glam, #e83e8c);
172
+ }
173
+
174
+ /* --- States --- */
175
+ .ios-input-wrapper.has-error {
176
+ border-color: var(--ios-input-error-color) !important;
177
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--ios-input-error-color) 20%, transparent) !important;
178
+ }
179
+
180
+ .ios-input-wrapper.is-disabled {
181
+ background-color: var(--ios-input-disabled-bg);
182
+ opacity: 0.6;
183
+ cursor: not-allowed;
184
+ }
185
+
186
+ .ios-input-wrapper.is-readonly {
187
+ background-color: var(--ios-input-disabled-bg);
188
+ }
189
+
190
+ /* --- Internal Elements --- */
191
+ .ios-input-element {
192
+ width: 100%;
193
+ border: none;
194
+ outline: none;
195
+ background: transparent;
196
+ color: inherit;
197
+ padding: 6px 0;
198
+ font-family: inherit;
199
+ font-size: inherit;
200
+ }
201
+
202
+ .ios-input-element::placeholder {
203
+ color: var(--ios-input-placeholder-color);
204
+ opacity: 1;
205
+ }
206
+
207
+ .ios-input-icon-left,
208
+ .ios-input-icon-right {
209
+ display: flex;
210
+ align-items: center;
211
+ justify-content: center;
212
+ color: var(--ios-input-placeholder-color);
213
+ flex-shrink: 0;
214
+ }
215
+
216
+ .ios-input-icon-left {
217
+ margin-right: 8px;
218
+ }
219
+
220
+ .ios-input-icon-right {
221
+ margin-left: 8px;
222
+ }
223
+
224
+ .input-prefix {
225
+ margin-right: 6px;
226
+ color: var(--ios-input-placeholder-color);
227
+ }
228
+
229
+ .input-suffix {
230
+ margin-left: 6px;
231
+ color: var(--ios-input-placeholder-color);
232
+ }
233
+
234
+ .ios-clear-button {
235
+ border: none;
236
+ background: var(--bs-secondary-bg, #e9ecef);
237
+ color: var(--ios-input-color);
238
+ border-radius: 50%;
239
+ width: 18px;
240
+ height: 18px;
241
+ display: flex;
242
+ align-items: center;
243
+ justify-content: center;
244
+ font-size: 10px;
245
+ cursor: pointer;
246
+ padding: 0;
247
+ margin-left: 6px;
248
+ flex-shrink: 0;
249
+ transition: background 0.2s;
250
+ }
251
+
252
+ .ios-clear-button:hover {
253
+ background: var(--bs-secondary, #6c757d);
254
+ color: #fff;
255
+ }
256
+
257
+ .ios-input-helper-text {
258
+ font-size: 12px;
259
+ color: var(--ios-input-placeholder-color);
260
+ margin-left: 4px;
261
+ }
262
+
263
+ .ios-input-error-text {
264
+ font-size: 12px;
265
+ color: var(--ios-input-error-color);
266
+ margin-left: 4px;
267
+ font-weight: 500;
268
+ }
@@ -0,0 +1,86 @@
1
+ .custom-progress-bar {
2
+ position: relative;
3
+ height: 4px;
4
+ background-color: #E0E0E0;
5
+ overflow: hidden;
6
+ border-radius: 4px;
7
+ --lion-active-color: var(--bs-primary, #0d6efd);
8
+ }
9
+
10
+ .custom-progress-bar.loading-variant-primary {
11
+ --lion-active-color: var(--bs-primary, #0d6efd);
12
+ }
13
+
14
+ .custom-progress-bar.loading-variant-secondary {
15
+ --lion-active-color: var(--bs-secondary, #6c757d);
16
+ }
17
+
18
+ .custom-progress-bar.loading-variant-success {
19
+ --lion-active-color: var(--bs-success, #198754);
20
+ }
21
+
22
+ .custom-progress-bar.loading-variant-danger {
23
+ --lion-active-color: var(--bs-danger, #dc3545);
24
+ }
25
+
26
+ .custom-progress-bar.loading-variant-warning {
27
+ --lion-active-color: var(--bs-warning, #ffc107);
28
+ }
29
+
30
+ .custom-progress-bar.loading-variant-info {
31
+ --lion-active-color: var(--bs-info, #0dcaf0);
32
+ }
33
+
34
+ .custom-progress-bar.loading-variant-light {
35
+ --lion-active-color: var(--bs-dark, #212529);
36
+ }
37
+
38
+ .custom-progress-bar.loading-variant-dark {
39
+ --lion-active-color: var(--bs-dark, #212529);
40
+ }
41
+
42
+ .custom-progress-bar.loading-variant-link {
43
+ --lion-active-color: var(--bs-primary, #0d6efd);
44
+ }
45
+
46
+ .custom-progress-bar.loading-variant-lion-packages {
47
+ --lion-active-color: var(--lion-packages, #6f42c1);
48
+ }
49
+
50
+ .custom-progress-bar.loading-variant-lion-parking {
51
+ --lion-active-color: var(--lion-parking, #20c997);
52
+ }
53
+
54
+ .custom-progress-bar.loading-variant-lion-tech {
55
+ --lion-active-color: var(--lion-tech, #fd7e14);
56
+ }
57
+
58
+ .custom-progress-bar.loading-variant-lion-glam {
59
+ --lion-active-color: var(--lion-glam, #e83e8c);
60
+ }
61
+
62
+ .custom-progress-bar .indeterminate {
63
+ position: absolute;
64
+ background-color: var(--lion-active-color);
65
+ top: 0;
66
+ left: -40%;
67
+ height: 100%;
68
+ width: 40%;
69
+ animation: indeterminate 1.2s infinite;
70
+ border-radius: 4px;
71
+ }
72
+
73
+ @keyframes indeterminate {
74
+ 0% {
75
+ left: -40%;
76
+ width: 40%;
77
+ }
78
+ 50% {
79
+ left: 20%;
80
+ width: 60%;
81
+ }
82
+ 100% {
83
+ left: 100%;
84
+ width: 40%;
85
+ }
86
+ }
@@ -0,0 +1,236 @@
1
+ /* ==========================================
2
+ GLOBAL BACKDROP ADJUSTMENT (Exclusive for modals)
3
+ ========================================== */
4
+ .modal-backdrop.web-modal-backdrop,
5
+ .modal-backdrop.ios-modal-backdrop,
6
+ .modal-backdrop.android-modal-backdrop,
7
+ .web-modal ~ .modal-backdrop,
8
+ .ios-modal ~ .modal-backdrop,
9
+ .android-modal ~ .modal-backdrop {
10
+ opacity: 0.45;
11
+ backdrop-filter: blur(3px);
12
+ -webkit-backdrop-filter: blur(3px);
13
+ }
14
+
15
+
16
+ /* ==========================================
17
+ 1. WEB & BASE MODAL STYLES (.web-modal)
18
+ ========================================== */
19
+
20
+ .web-modal .modal-content {
21
+ border: 1px solid rgba(0, 0, 0, 0.08) !important;
22
+ border-radius: 12px !important;
23
+ box-shadow: 0 12px 32px rgba(0, 0, 0, 0.1) !important;
24
+ overflow: hidden;
25
+ }
26
+
27
+ .web-modal .custom-modal-title {
28
+ font-size: 1.15rem;
29
+ color: #212529;
30
+ }
31
+
32
+ .web-modal .custom-btn-group .btn-modal {
33
+ width: auto;
34
+ flex: 1 1 0;
35
+ text-align: center;
36
+ }
37
+
38
+ .web-modal .custom-btn-group .btn-modal:not(:first-child)::before {
39
+ content: "";
40
+ position: absolute;
41
+ top: 0;
42
+ bottom: 0;
43
+ left: -1px;
44
+ width: 1px;
45
+ height: auto;
46
+ background-color: var(--bs-modal-footer-border-color);
47
+ }
48
+
49
+ /* Specific and encapsulated base button for Web Modal */
50
+ .web-modal .btn-modal {
51
+ background-color: transparent !important;
52
+ border: none !important;
53
+ box-shadow: none !important;
54
+ outline: none !important;
55
+ color: inherit !important;
56
+ width: 100%;
57
+ padding: 12px 10px;
58
+ font-size: 16px;
59
+ position: relative;
60
+ box-sizing: border-box;
61
+ -webkit-tap-highlight-color: rgba(0, 0, 0, 0.15);
62
+ }
63
+
64
+ .web-modal .btn-modal:hover {
65
+ background-color: rgba(0, 0, 0, 0.04) !important;
66
+ }
67
+
68
+ .web-modal .btn-modal:active {
69
+ background-color: rgba(0, 0, 0, 0.08) !important;
70
+ }
71
+
72
+ .web-modal .btn-modal:focus,
73
+ .web-modal .btn-modal:focus-visible,
74
+ .web-modal .btn-modal:focus-within {
75
+ background-color: transparent !important;
76
+ box-shadow: none !important;
77
+ }
78
+
79
+
80
+ /* ==========================================
81
+ 2. iOS STYLE DESIGN (.ios-modal)
82
+ ========================================== */
83
+
84
+ .ios-modal .modal-content {
85
+ border: none !important;
86
+ border-radius: 22px !important;
87
+ backdrop-filter: blur(20px) saturate(180%);
88
+ -webkit-backdrop-filter: blur(20px) saturate(180%);
89
+ box-shadow: 0 20px 40px rgba(0, 0, 0, 0.18), 0 0 1px rgba(0, 0, 0, 0.2) !important;
90
+ overflow: hidden;
91
+ }
92
+
93
+ .ios-modal .custom-modal-header {
94
+ border-bottom: 1px solid rgba(60, 60, 67, 0.12) !important;
95
+ position: relative;
96
+ }
97
+
98
+ .ios-modal .custom-modal-title {
99
+ font-size: 1.1rem;
100
+ letter-spacing: -0.2px;
101
+ color: var(--lion-black, #000);
102
+ }
103
+
104
+ .ios-modal .custom-modal-header .btn-close {
105
+ position: absolute;
106
+ right: 16px;
107
+ top: 50%;
108
+ transform: translateY(-50%) !important;
109
+ margin: 0 !important;
110
+ padding: 8px !important;
111
+ background-size: 10px;
112
+ border-radius: 50%;
113
+ opacity: 0.8 !important;
114
+ }
115
+
116
+ .ios-modal .custom-modal-body {
117
+ font-size: 0.95rem;
118
+ line-height: 1.5;
119
+ }
120
+
121
+ .ios-modal .custom-modal-footer {
122
+ border-top: 1px solid rgba(60, 60, 67, 0.12) !important;
123
+ background-color: transparent !important;
124
+ }
125
+
126
+ .ios-modal .custom-btn-group .btn-modal {
127
+ flex: 1 1 0;
128
+ padding: 14px 10px;
129
+ font-size: 1rem;
130
+ font-weight: 400;
131
+ text-align: center;
132
+ }
133
+
134
+ .ios-modal .btn-modal-cancel {
135
+ font-weight: 600;
136
+ }
137
+
138
+ .ios-modal .custom-btn-group .btn-modal:not(:first-child)::before {
139
+ content: "";
140
+ position: absolute;
141
+ top: 0;
142
+ bottom: 0;
143
+ left: 0;
144
+ width: 1px;
145
+ background-color: rgba(60, 60, 67, 0.12);
146
+ }
147
+
148
+ .ios-modal .btn-modal {
149
+ background-color: transparent !important;
150
+ border: none !important;
151
+ box-shadow: none !important;
152
+ outline: none !important;
153
+ position: relative;
154
+ box-sizing: border-box;
155
+ }
156
+
157
+ .ios-modal .btn-modal:hover {
158
+ background-color: rgba(0, 0, 0, 0.04) !important;
159
+ }
160
+
161
+ .ios-modal .btn-modal:active {
162
+ background-color: rgba(0, 0, 0, 0.08) !important;
163
+ }
164
+
165
+
166
+ /* ==========================================
167
+ 3. ANDROID / MATERIAL DESIGN STYLE (.android-modal)
168
+ ========================================== */
169
+
170
+ .android-modal .modal-content {
171
+ border: none !important;
172
+ border-radius: 28px !important;
173
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.15) !important;
174
+ overflow: hidden;
175
+ }
176
+
177
+ .android-modal .custom-modal-header {
178
+ border-bottom: none !important;
179
+ padding-top: 24px;
180
+ padding-bottom: 8px;
181
+ }
182
+
183
+ .android-modal .custom-modal-title {
184
+ font-size: 1.35rem;
185
+ color: #1d1b20;
186
+ font-weight: 500 !important;
187
+ }
188
+
189
+ .android-modal .custom-modal-body {
190
+ font-size: 0.95rem;
191
+ }
192
+
193
+ .android-modal .custom-modal-footer {
194
+ border-top: 1px solid rgba(0, 0, 0, 0.08) !important;
195
+ padding: 0 !important;
196
+ }
197
+
198
+ .android-modal .custom-btn-group .btn-modal {
199
+ flex: 1 1 0;
200
+ padding: 14px 10px;
201
+ font-size: 0.9rem;
202
+ font-weight: 500;
203
+ text-transform: uppercase;
204
+ letter-spacing: 0.5px;
205
+ text-align: center;
206
+ }
207
+
208
+ .android-modal .custom-btn-group .btn-modal:not(:first-child)::before {
209
+ content: "";
210
+ position: absolute;
211
+ top: 0;
212
+ bottom: 0;
213
+ left: -1px;
214
+ width: 1px;
215
+ height: auto;
216
+ background-color: rgba(0, 0, 0, 0.08);
217
+ }
218
+
219
+ .android-modal .btn-modal {
220
+ background-color: transparent !important;
221
+ border: none !important;
222
+ box-shadow: none !important;
223
+ outline: none !important;
224
+ position: relative;
225
+ box-sizing: border-box;
226
+ }
227
+
228
+ .android-modal .btn-modal:hover {
229
+ background-color: rgba(103, 80, 164, 0.08) !important;
230
+ color: var(--lion-black);
231
+ }
232
+
233
+ .android-modal .btn-modal:active {
234
+ background-color: rgba(103, 80, 164, 0.12) !important;
235
+ color: var(--lion-black);
236
+ }
@@ -0,0 +1,43 @@
1
+ // components/buttons/AndroidButton.tsx
2
+ import {type ButtonHTMLAttributes, type ReactNode } from 'react';
3
+ import { VariantTypes } from '../../types/VariantTypes';
4
+ import { SizeTypes } from '../../types/SizeTypes';
5
+ import { ButtonTypes } from '../../types/ButtonTypes';
6
+ import { AndroidStyleTypes } from '../../types/Android/AndroidStyleTypes';
7
+ import { AndroidShapeTypes } from '../../types/Android/AndroidShapeTypes';
8
+
9
+ export interface AndroidButtonProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'type' | 'size'> {
10
+ children?: ReactNode;
11
+ variant?: VariantTypes;
12
+ styleType?: AndroidStyleTypes;
13
+ shape?: AndroidShapeTypes;
14
+ size?: SizeTypes;
15
+ type?: ButtonTypes;
16
+ className?: string;
17
+ }
18
+
19
+ export default function AndroidButton({
20
+ children,
21
+ variant = VariantTypes.PRIMARY,
22
+ styleType = AndroidStyleTypes.FILLED,
23
+ shape = AndroidShapeTypes.PILL,
24
+ size = SizeTypes.MD,
25
+ type = ButtonTypes.BUTTON,
26
+ className = "",
27
+ ...props
28
+ }: AndroidButtonProps) {
29
+ const styleClass = `android-btn-${styleType}`;
30
+ const shapeClass = `android-btn-${shape}`;
31
+ const variantClass = variant ? `btn-${variant}` : "";
32
+
33
+ return (
34
+ <button
35
+ type={type}
36
+ className={`android-btn android-btn-${size} ${styleClass} ${shapeClass} ${variantClass} ${className}`.trim()}
37
+ {...props}
38
+ >
39
+ {children}
40
+ <span className="ripple" />
41
+ </button>
42
+ );
43
+ }