sdga-ui 1.0.31 → 1.0.33

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/README.md CHANGED
@@ -1,5 +1,10 @@
1
1
  # **DGA UI – Government-Style Bootstrap Theme**
2
2
 
3
+ [![npm version](https://img.shields.io/npm/v/sdga-ui.svg)](https://www.npmjs.com/package/sdga-ui)
4
+ [![npm total downloads](https://img.shields.io/npm/dt/sdga-ui.svg)](https://www.npmjs.com/package/sdga-ui)
5
+ [![GitHub stars](https://img.shields.io/github/stars/MahmoudAdel1996/dga-ui.svg)](https://github.com/MahmoudAdel1996/dga-ui/stargazers)
6
+ [![License](https://img.shields.io/npm/l/sdga-ui.svg)](https://github.com/MahmoudAdel1996/dga-ui/blob/main/LICENSE)
7
+
3
8
  **DGA UI** is a customizable UI theme inspired by modern government and authority design systems.
4
9
  Built on top of **Bootstrap**, it provides consistent colors, typography, spacing, and reusable UI patterns suitable for official portals, administrative dashboards, and public-sector applications.
5
10
 
@@ -43,6 +48,24 @@ Or with yarn:
43
48
  yarn add sdga-ui
44
49
  ```
45
50
 
51
+ ### **Or via CDN**
52
+
53
+ No installation needed — link directly to the compiled CSS:
54
+
55
+ ```html
56
+ <!-- jsDelivr -->
57
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/sdga-ui@latest/css/dga-ui.css">
58
+
59
+ <!-- unpkg -->
60
+ <link rel="stylesheet" href="https://unpkg.com/sdga-ui@latest/css/dga-ui.css">
61
+ ```
62
+
63
+ Pin to a specific version (recommended for production) instead of `@latest`:
64
+
65
+ ```html
66
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/sdga-ui@1.0.31/css/dga-ui.css">
67
+ ```
68
+
46
69
  ---
47
70
 
48
71
  ## **🔧 Usage**
package/css/dga-ui.css CHANGED
@@ -28107,22 +28107,20 @@ html {
28107
28107
 
28108
28108
  .form-select {
28109
28109
  min-height: 2rem;
28110
- background-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' width='24' height='24' fill='none' stroke='%23343a40' stroke-width='0.5' stroke-linecap='round' stroke-linejoin='round'><path d='M18 9.00005C18 9.00005 13.5811 15 12 15C10.4188 15 6 9 6 9' /></svg>");
28111
- background-size: 24px 24px;
28110
+ position: relative;
28111
+ border-color: #9DA4AE;
28112
+ margin-bottom: 0;
28113
+ background-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' width='24' height='24' fill='none' stroke='%23343a40' stroke-width='0.5' stroke-linecap='round' stroke-linejoin='round'><path d='M18 9.00005C18 9.00005 13.5811 15 12 15C10.4188 15 6 9 6 9' /></svg>"), linear-gradient(to right, #0D121C 0%, #0D121C 100%);
28114
+ background-size: 24px 24px, 0% 2px;
28115
+ background-repeat: no-repeat, no-repeat;
28116
+ background-position: right 0.75rem center, center bottom;
28117
+ transition: background-size 0.3s ease-in-out, border-color 0.15s ease-in-out;
28112
28118
  }
28113
28119
  [dir=rtl] .form-select {
28114
- background-position: left 0.5rem center;
28120
+ background-position: left 0.5rem center, center bottom;
28115
28121
  padding-left: 1.75rem;
28116
28122
  padding-right: 0.75rem;
28117
28123
  }
28118
- .form-select:focus {
28119
- background-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' width='24' height='24' fill='none' stroke='%23343a40' stroke-width='0.5' stroke-linecap='round' stroke-linejoin='round' transform='rotate(180)'><path d='M18 9.00005C18 9.00005 13.5811 15 12 15C10.4188 15 6 9 6 9' /></svg>");
28120
- }
28121
- .form-select {
28122
- position: relative;
28123
- border-color: #9DA4AE;
28124
- margin-bottom: 0;
28125
- }
28126
28124
  .form-select option {
28127
28125
  background-color: #FFFFFF;
28128
28126
  color: #161616;
@@ -28137,29 +28135,6 @@ html {
28137
28135
  .form-select:has(option:disabled:checked) option:disabled:checked {
28138
28136
  color: #6C737F;
28139
28137
  }
28140
- .form-select::after {
28141
- content: "";
28142
- position: absolute;
28143
- bottom: 0;
28144
- left: 50%;
28145
- width: 100%;
28146
- height: 2px;
28147
- background: linear-gradient(to right, #0D121C 0%, #0D121C 100%);
28148
- transform: translateX(-50%) scaleX(0);
28149
- transform-origin: center;
28150
- transition: transform 0.3s ease-in-out;
28151
- }
28152
- .form-select.filled {
28153
- background-color: var(--dga-body-bg);
28154
- }
28155
- .form-select.filled-darker {
28156
- border-color: transparent;
28157
- background-color: #F3F4F6;
28158
- }
28159
- .form-select.filled-lighter {
28160
- border-color: transparent;
28161
- background-color: #FCFCFD;
28162
- }
28163
28138
  .form-select:hover {
28164
28139
  border-color: #6C737F;
28165
28140
  color: #161616;
@@ -28167,58 +28142,68 @@ html {
28167
28142
  .form-select:active {
28168
28143
  border-color: #0D121C;
28169
28144
  background-color: #F3F4F6;
28145
+ background-size: 24px 24px, 100% 2px;
28170
28146
  color: #161616;
28171
28147
  }
28172
- .form-select:active::after {
28173
- transform: translateX(-50%) scaleX(1);
28148
+ .form-select:focus-visible, .form-select:focus {
28149
+ border-color: #384250;
28150
+ background-size: 24px 24px, 100% 2px;
28151
+ outline: none !important;
28152
+ box-shadow: 0px 4px 8px -2px rgba(17, 25, 39, 0.1), 0px 2px 4px -2px rgba(17, 25, 39, 0.06);
28174
28153
  }
28175
28154
  .form-select[readonly] {
28176
28155
  border-color: #D2D6DB;
28177
28156
  color: #161616;
28178
28157
  pointer-events: none;
28179
28158
  }
28180
- .form-select:focus-visible, .form-select:focus {
28181
- border-color: #384250;
28182
- outline: none !important;
28183
- }
28184
- .form-select:focus-visible::after, .form-select:focus::after {
28185
- transform: translateX(-50%) scaleX(1);
28186
- }
28187
- .form-select:focus-visible, .form-select:focus {
28188
- box-shadow: 0px 4px 8px -2px rgba(17, 25, 39, 0.1), 0px 2px 4px -2px rgba(17, 25, 39, 0.06);
28189
- }
28190
28159
  .form-select:disabled, .form-select[disabled] {
28191
28160
  border-color: #D2D6DB;
28192
28161
  background-color: var(--dga-body-bg);
28162
+ background-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' width='24' height='24' fill='none' stroke='%23adb5bd' stroke-width='0.5' stroke-linecap='round' stroke-linejoin='round'><path d='M18 9.00005C18 9.00005 13.5811 15 12 15C10.4188 15 6 9 6 9' /></svg>"), linear-gradient(to right, transparent 0%, transparent 100%);
28193
28163
  color: #9DA4AE;
28194
28164
  pointer-events: none;
28195
28165
  }
28196
- .form-select:user-invalid {
28166
+ .form-select.is-invalid, .form-select:user-invalid {
28197
28167
  border-color: #B42318;
28168
+ background-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' width='24' height='24' fill='none' stroke='%23343a40' stroke-width='0.5' stroke-linecap='round' stroke-linejoin='round'><path d='M18 9.00005C18 9.00005 13.5811 15 12 15C10.4188 15 6 9 6 9' /></svg>"), linear-gradient(to right, #B42318 0%, #B42318 100%);
28169
+ background-size: 24px 24px, 100% 2px;
28198
28170
  }
28199
- .form-select:user-invalid::after {
28200
- background: linear-gradient(to right, #B42318 0%, #B42318 100%);
28201
- }
28202
- .form-select:user-invalid:hover {
28171
+ .form-select.is-invalid:hover, .form-select:user-invalid:hover {
28203
28172
  border-color: #B42318;
28204
28173
  }
28205
- .form-select:user-invalid:active {
28206
- border-color: #9DA4AE;
28207
- }
28208
- .form-select:user-invalid:active::after {
28209
- transform: translateX(-50%) scaleX(1);
28174
+ .form-select.is-invalid:focus-visible, .form-select.is-invalid:focus, .form-select:user-invalid:focus-visible, .form-select:user-invalid:focus {
28175
+ border-color: #B42318;
28176
+ background-size: 24px 24px, 100% 2px;
28210
28177
  }
28211
- .form-select:user-invalid[readonly] {
28178
+ .form-select.is-invalid:disabled, .form-select.is-invalid[disabled], .form-select:user-invalid:disabled, .form-select:user-invalid[disabled] {
28212
28179
  border-color: #D2D6DB;
28180
+ background-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' width='24' height='24' fill='none' stroke='%23adb5bd' stroke-width='0.5' stroke-linecap='round' stroke-linejoin='round'><path d='M18 9.00005C18 9.00005 13.5811 15 12 15C10.4188 15 6 9 6 9' /></svg>"), linear-gradient(to right, transparent 0%, transparent 100%);
28181
+ background-size: 24px 24px, 0% 2px;
28213
28182
  }
28214
- .form-select:user-invalid:focus-visible, .form-select:user-invalid:focus {
28215
- border-color: #B42318;
28183
+ .form-select.is-valid {
28184
+ border-color: #079455;
28185
+ background-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' width='24' height='24' fill='none' stroke='%23343a40' stroke-width='0.5' stroke-linecap='round' stroke-linejoin='round'><path d='M18 9.00005C18 9.00005 13.5811 15 12 15C10.4188 15 6 9 6 9' /></svg>"), linear-gradient(to right, #079455 0%, #079455 100%);
28186
+ background-size: 24px 24px, 100% 2px;
28216
28187
  }
28217
- .form-select:user-invalid:focus-visible::after, .form-select:user-invalid:focus::after {
28218
- transform: translateX(-50%) scaleX(1);
28188
+ .form-select.is-valid:hover {
28189
+ border-color: #079455;
28190
+ }
28191
+ .form-select.is-valid:focus-visible, .form-select.is-valid:focus {
28192
+ border-color: #079455;
28193
+ background-size: 24px 24px, 100% 2px;
28219
28194
  }
28220
- .form-select:user-invalid:disabled, .form-select:user-invalid[disabled] {
28195
+ .form-select.is-valid:disabled, .form-select.is-valid[disabled] {
28221
28196
  border-color: #D2D6DB;
28197
+ background-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' width='24' height='24' fill='none' stroke='%23adb5bd' stroke-width='0.5' stroke-linecap='round' stroke-linejoin='round'><path d='M18 9.00005C18 9.00005 13.5811 15 12 15C10.4188 15 6 9 6 9' /></svg>"), linear-gradient(to right, transparent 0%, transparent 100%);
28198
+ background-size: 24px 24px, 0% 2px;
28199
+ }
28200
+
28201
+ .form-select-lg {
28202
+ min-height: 2.5rem;
28203
+ }
28204
+
28205
+ .form-select-sm {
28206
+ min-height: 1.5rem;
28222
28207
  }
28223
28208
 
28224
28209
  .select-wrapper {
@@ -28249,7 +28234,39 @@ html {
28249
28234
  left: 0.75rem;
28250
28235
  }
28251
28236
  .select-wrapper .form-select {
28252
- background-image: none !important;
28237
+ --dga-form-select-bg-img: none;
28238
+ --dga-form-select-bg-icon: none;
28239
+ background-image: linear-gradient(to right, #0D121C 0%, #0D121C 100%) !important;
28240
+ background-size: 0% 2px !important;
28241
+ background-repeat: no-repeat !important;
28242
+ background-position: center bottom !important;
28243
+ transition: background-size 0.3s ease-in-out, border-color 0.15s ease-in-out !important;
28244
+ }
28245
+ .select-wrapper:focus-within .form-select {
28246
+ background-size: 100% 2px !important;
28247
+ }
28248
+ .select-wrapper:has(.form-select.is-invalid) .form-select, .select-wrapper:has(.form-select:user-invalid) .form-select {
28249
+ background-image: linear-gradient(to right, #B42318 0%, #B42318 100%) !important;
28250
+ background-size: 100% 2px !important;
28251
+ }
28252
+ .select-wrapper:has(.form-select.is-valid) .form-select {
28253
+ background-image: linear-gradient(to right, #079455 0%, #079455 100%) !important;
28254
+ background-size: 100% 2px !important;
28255
+ }
28256
+ .select-wrapper:has(.form-select:disabled), .select-wrapper:has(.form-select[disabled]) {
28257
+ pointer-events: none;
28258
+ }
28259
+ .select-wrapper:has(.form-select:disabled)::after, .select-wrapper:has(.form-select[disabled])::after {
28260
+ background-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' width='24' height='24' fill='none' stroke='%23adb5bd' stroke-width='0.5' stroke-linecap='round' stroke-linejoin='round'><path d='M18 9.00005C18 9.00005 13.5811 15 12 15C10.4188 15 6 9 6 9' /></svg>");
28261
+ }
28262
+ .select-wrapper:has(.form-select:disabled) .form-select, .select-wrapper:has(.form-select[disabled]) .form-select {
28263
+ background-image: linear-gradient(to right, transparent 0%, transparent 100%) !important;
28264
+ background-size: 0% 2px !important;
28265
+ }
28266
+
28267
+ .input-group .select-wrapper {
28268
+ flex: 1 1 auto;
28269
+ min-width: 0;
28253
28270
  }
28254
28271
 
28255
28272
  .form-select-toggle {