sdga-ui 1.0.8 → 1.0.10

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 (101) hide show
  1. package/css/dga-ui.css +371 -98
  2. package/css/dga-ui.css.map +1 -1
  3. package/package.json +20 -4
  4. package/theme/_variables.scss +1 -1
  5. package/theme/components/_buttons.scss +2 -2
  6. package/theme/components/_dropdowns.scss +2 -2
  7. package/theme/components/_navbar.scss +10 -9
  8. package/theme/config/_base.scss +1 -1
  9. package/theme/customizations/_alerts.scss +29 -45
  10. package/theme/customizations/_cards.scss +2 -71
  11. package/theme/customizations/_global.scss +7 -4
  12. package/theme/customizations/_icon-featured.scss +122 -0
  13. package/theme/customizations/_links.scss +22 -21
  14. package/theme/customizations/_navbar.scss +167 -0
  15. package/theme/dga-ui.scss +2 -0
  16. package/.editorconfig +0 -23
  17. package/.github/workflows/deploy.yml +0 -71
  18. package/.github/workflows/publish.yml +0 -36
  19. package/.prettierignore +0 -73
  20. package/.prettierrc +0 -17
  21. package/demo-angular/.editorconfig +0 -17
  22. package/demo-angular/.vscode/extensions.json +0 -4
  23. package/demo-angular/.vscode/launch.json +0 -20
  24. package/demo-angular/.vscode/tasks.json +0 -42
  25. package/demo-angular/README.md +0 -91
  26. package/demo-angular/angular.json +0 -96
  27. package/demo-angular/package-lock.json +0 -10600
  28. package/demo-angular/package.json +0 -53
  29. package/demo-angular/public/404.html +0 -35
  30. package/demo-angular/public/favicon.ico +0 -0
  31. package/demo-angular/public/i18n/ar.json +0 -289
  32. package/demo-angular/public/i18n/en.json +0 -289
  33. package/demo-angular/src/app/app.config.ts +0 -20
  34. package/demo-angular/src/app/app.html +0 -52
  35. package/demo-angular/src/app/app.routes.ts +0 -49
  36. package/demo-angular/src/app/app.scss +0 -430
  37. package/demo-angular/src/app/app.spec.ts +0 -23
  38. package/demo-angular/src/app/app.ts +0 -97
  39. package/demo-angular/src/app/shared/code-example/code-example.component.html +0 -30
  40. package/demo-angular/src/app/shared/code-example/code-example.component.scss +0 -183
  41. package/demo-angular/src/app/shared/code-example/code-example.component.ts +0 -89
  42. package/demo-angular/src/app/views/alerts/alerts.component.html +0 -155
  43. package/demo-angular/src/app/views/alerts/alerts.component.scss +0 -3
  44. package/demo-angular/src/app/views/alerts/alerts.component.ts +0 -134
  45. package/demo-angular/src/app/views/buttons/buttons.component.html +0 -360
  46. package/demo-angular/src/app/views/buttons/buttons.component.scss +0 -11
  47. package/demo-angular/src/app/views/buttons/buttons.component.ts +0 -225
  48. package/demo-angular/src/app/views/cards/cards.component.html +0 -156
  49. package/demo-angular/src/app/views/cards/cards.component.html.backup +0 -156
  50. package/demo-angular/src/app/views/cards/cards.component.scss +0 -11
  51. package/demo-angular/src/app/views/cards/cards.component.ts +0 -194
  52. package/demo-angular/src/app/views/footer/footer.html +0 -270
  53. package/demo-angular/src/app/views/footer/footer.ts +0 -276
  54. package/demo-angular/src/app/views/forms/forms.component.html +0 -347
  55. package/demo-angular/src/app/views/forms/forms.component.scss +0 -3
  56. package/demo-angular/src/app/views/forms/forms.component.ts +0 -222
  57. package/demo-angular/src/app/views/header/header.html +0 -1
  58. package/demo-angular/src/app/views/header/header.scss +0 -0
  59. package/demo-angular/src/app/views/header/header.spec.ts +0 -23
  60. package/demo-angular/src/app/views/header/header.ts +0 -11
  61. package/demo-angular/src/app/views/home/home.component.html +0 -33
  62. package/demo-angular/src/app/views/home/home.component.scss +0 -35
  63. package/demo-angular/src/app/views/home/home.component.ts +0 -12
  64. package/demo-angular/src/app/views/links/links.component.html +0 -21
  65. package/demo-angular/src/app/views/links/links.component.scss +0 -11
  66. package/demo-angular/src/app/views/links/links.component.ts +0 -19
  67. package/demo-angular/src/app/views/tables/tables.component.html +0 -289
  68. package/demo-angular/src/app/views/tables/tables.component.scss +0 -3
  69. package/demo-angular/src/app/views/tables/tables.component.ts +0 -278
  70. package/demo-angular/src/app/views/toasts/toasts.component.html +0 -201
  71. package/demo-angular/src/app/views/toasts/toasts.component.scss +0 -0
  72. package/demo-angular/src/app/views/toasts/toasts.component.ts +0 -182
  73. package/demo-angular/src/index.html +0 -28
  74. package/demo-angular/src/main.ts +0 -6
  75. package/demo-angular/src/styles.scss +0 -4
  76. package/demo-angular/tsconfig.app.json +0 -16
  77. package/demo-angular/tsconfig.json +0 -33
  78. package/demo-angular/tsconfig.spec.json +0 -15
  79. package/sdga-ui/README.md +0 -45
  80. package/sdga-ui/content/docs/components/alerts.mdx +0 -475
  81. package/sdga-ui/content/docs/index.mdx +0 -239
  82. package/sdga-ui/next.config.mjs +0 -10
  83. package/sdga-ui/package-lock.json +0 -5851
  84. package/sdga-ui/package.json +0 -32
  85. package/sdga-ui/postcss.config.mjs +0 -5
  86. package/sdga-ui/source.config.ts +0 -27
  87. package/sdga-ui/src/app/(home)/layout.tsx +0 -6
  88. package/sdga-ui/src/app/(home)/page.tsx +0 -202
  89. package/sdga-ui/src/app/api/search/route.ts +0 -7
  90. package/sdga-ui/src/app/docs/[[...slug]]/page.tsx +0 -54
  91. package/sdga-ui/src/app/docs/layout.tsx +0 -11
  92. package/sdga-ui/src/app/global.css +0 -3
  93. package/sdga-ui/src/app/layout.tsx +0 -25
  94. package/sdga-ui/src/app/llms-full.txt/route.ts +0 -10
  95. package/sdga-ui/src/app/og/docs/[...slug]/route.tsx +0 -34
  96. package/sdga-ui/src/app/sdga-scoped.css +0 -7
  97. package/sdga-ui/src/components/sdga-preview.tsx +0 -105
  98. package/sdga-ui/src/lib/layout.shared.tsx +0 -9
  99. package/sdga-ui/src/lib/source.ts +0 -27
  100. package/sdga-ui/src/mdx-components.tsx +0 -9
  101. package/sdga-ui/tsconfig.json +0 -46
@@ -1,430 +0,0 @@
1
- // App Layout
2
- .app-layout {
3
- display: flex;
4
- min-height: 100vh;
5
- background-color: #eee;
6
- }
7
-
8
- // Sidebar
9
- .sidebar {
10
- width: 280px;
11
- background: linear-gradient(180deg, #1e293b 0%, #0f172a 100%);
12
- color: #e2e8f0;
13
- display: flex;
14
- flex-direction: column;
15
- position: fixed;
16
- left: 0;
17
- top: 0;
18
- height: 100vh;
19
- overflow-y: auto;
20
- transition: transform 0.3s ease;
21
- z-index: 1000;
22
-
23
- &::-webkit-scrollbar {
24
- width: 6px;
25
- }
26
-
27
- &::-webkit-scrollbar-track {
28
- background: #1e293b;
29
- }
30
-
31
- &::-webkit-scrollbar-thumb {
32
- background: #475569;
33
- border-radius: 3px;
34
- }
35
- }
36
-
37
- .sidebar-collapsed .sidebar {
38
- transform: translateX(-280px);
39
- }
40
-
41
- .sidebar-header {
42
- padding: 2rem 1.5rem;
43
- border-bottom: 1px solid rgba(255, 255, 255, 0.1);
44
-
45
- .logo {
46
- font-size: 2rem;
47
- font-weight: 700;
48
- margin: 0;
49
- background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
50
- -webkit-background-clip: text;
51
- -webkit-text-fill-color: transparent;
52
- background-clip: text;
53
- }
54
-
55
- .tagline {
56
- margin: 0.5rem 0 0;
57
- font-size: 0.875rem;
58
- color: #94a3b8;
59
- }
60
- }
61
-
62
- .sidebar-nav {
63
- flex: 1;
64
- padding: 1rem 0;
65
- }
66
-
67
- .nav-group {
68
- margin-bottom: 1.5rem;
69
- }
70
-
71
- .nav-group-title {
72
- padding: 0.5rem 1.5rem;
73
- margin: 0 0 0.5rem;
74
- font-size: 0.75rem;
75
- font-weight: 600;
76
- text-transform: uppercase;
77
- letter-spacing: 0.05em;
78
- color: #64748b;
79
- }
80
-
81
- .nav-list {
82
- list-style: none;
83
- padding: 0;
84
- margin: 0;
85
- }
86
-
87
- .nav-item {
88
- display: flex;
89
- align-items: center;
90
- padding: 0.75rem 1.5rem;
91
- cursor: pointer;
92
- transition: all 0.2s ease;
93
- color: #cbd5e1;
94
- position: relative;
95
-
96
- &:hover {
97
- background-color: rgba(255, 255, 255, 0.05);
98
- color: #fff;
99
- }
100
-
101
- &.active {
102
- background-color: rgba(102, 126, 234, 0.15);
103
- color: #fff;
104
- font-weight: 500;
105
-
106
- &::before {
107
- content: '';
108
- position: absolute;
109
- left: 0;
110
- top: 0;
111
- bottom: 0;
112
- width: 3px;
113
- background: linear-gradient(180deg, #667eea 0%, #764ba2 100%);
114
- }
115
- }
116
- }
117
-
118
- .nav-icon {
119
- margin-right: 0.75rem;
120
- font-size: 1.25rem;
121
- width: 24px;
122
- display: inline-block;
123
- text-align: center;
124
- }
125
-
126
- .nav-label {
127
- font-size: 0.9375rem;
128
- }
129
-
130
- .sidebar-footer {
131
- padding: 1rem 1.5rem;
132
- border-top: 1px solid rgba(255, 255, 255, 0.1);
133
-
134
- .version {
135
- margin: 0;
136
- font-size: 0.75rem;
137
- color: #64748b;
138
- text-align: center;
139
- }
140
- }
141
-
142
- // Main Content
143
- .main-content {
144
- flex: 1;
145
- margin-left: 280px;
146
- transition: margin-left 0.3s ease, margin-right 0.3s ease;
147
- }
148
-
149
- // RTL: Adjust margin for right-positioned sidebar
150
- [dir="rtl"] .main-content {
151
- margin-left: 0;
152
- margin-right: 280px;
153
- }
154
-
155
- .sidebar-collapsed .main-content {
156
- margin-left: 0;
157
- }
158
-
159
- // RTL: Reset right margin when collapsed
160
- [dir="rtl"] .sidebar-collapsed .main-content {
161
- margin-right: 0;
162
- }
163
-
164
- .top-bar {
165
- background: #fff;
166
- padding: 1rem 2rem;
167
- display: flex;
168
- align-items: center;
169
- gap: 1rem;
170
- position: sticky;
171
- top: 0;
172
- z-index: 100;
173
- }
174
-
175
- .menu-toggle {
176
- background: none;
177
- border: none;
178
- font-size: 1.5rem;
179
- cursor: pointer;
180
- padding: 0.5rem;
181
- color: #475569;
182
- transition: color 0.2s ease;
183
-
184
- &:hover {
185
- color: #1e293b;
186
- }
187
-
188
- .hamburger {
189
- display: block;
190
- }
191
- }
192
-
193
- .page-title {
194
- margin: 0;
195
- font-size: 1.5rem;
196
- font-weight: 600;
197
- color: #1e293b;
198
- text-transform: capitalize;
199
- flex: 1;
200
- }
201
-
202
- .top-bar-actions {
203
- display: flex;
204
- align-items: center;
205
- gap: 0.75rem;
206
- }
207
-
208
- .theme-selector {
209
- display: flex;
210
- align-items: center;
211
- gap: 0.75rem;
212
-
213
- select {
214
- padding: 0.5rem 2rem 0.5rem 0.75rem;
215
- border: 1px solid #e2e8f0;
216
- border-radius: 0.5rem;
217
- background-color: #fff;
218
- color: #1e293b;
219
- font-size: 0.875rem;
220
- font-weight: 500;
221
- cursor: pointer;
222
- transition: all 0.2s ease;
223
- appearance: none;
224
- background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%2364748b' d='M6 9L1 4h10z'/%3E%3C/svg%3E");
225
- background-repeat: no-repeat;
226
- background-position: right 0.5rem center;
227
- min-width: 140px;
228
-
229
- &:hover {
230
- border-color: #cbd5e0;
231
- }
232
-
233
- &:focus {
234
- outline: none;
235
- border-color: #667eea;
236
- }
237
- }
238
-
239
- .theme-note {
240
- font-size: 0.75rem;
241
- color: #94a3b8;
242
- font-style: italic;
243
- }
244
- }
245
-
246
- .content-area {
247
- padding: 2rem;
248
- }
249
-
250
- // View Styles
251
- .view {
252
- max-width: 1200px;
253
-
254
- h1 {
255
- font-size: 2.5rem;
256
- font-weight: 700;
257
- color: #1e293b;
258
- margin: 0 0 1rem;
259
- }
260
-
261
- .intro {
262
- font-size: 1.25rem;
263
- color: #64748b;
264
- margin-bottom: 3rem;
265
- }
266
-
267
- h2 {
268
- font-size: 1.75rem;
269
- font-weight: 600;
270
- color: #1e293b;
271
- margin: 2rem 0 1rem;
272
- }
273
-
274
- h3 {
275
- font-size: 1.25rem;
276
- font-weight: 600;
277
- color: #475569;
278
- margin: 1.5rem 0 1rem;
279
- }
280
-
281
- p {
282
- color: #64748b;
283
- line-height: 1.6;
284
- }
285
-
286
- .info-note {
287
- background: #f0f9ff;
288
- border-left: 4px solid #3b82f6;
289
- padding: 1rem 1.25rem;
290
- margin-top: 1rem;
291
- border-radius: 0.375rem;
292
- color: #1e40af;
293
- font-size: 0.9375rem;
294
-
295
- code {
296
- background: #dbeafe;
297
- padding: 0.125rem 0.375rem;
298
- border-radius: 0.25rem;
299
- font-size: 0.875rem;
300
- color: #1e3a8a;
301
- }
302
- }
303
- }
304
-
305
- .button-group {
306
- display: flex;
307
- flex-wrap: wrap;
308
- gap: 1rem;
309
- align-items: center;
310
- margin: 1rem 0;
311
- }
312
-
313
- // Demo Showcase (component + code)
314
- .demo-showcase {
315
- display: flex;
316
- flex-direction: column;
317
- gap: 1.5rem;
318
- }
319
-
320
- .code-example {
321
- background: #1e293b;
322
- border-radius: 8px;
323
- overflow: hidden;
324
- border: 1px solid #334155;
325
-
326
- .code-header {
327
- background: #0f172a;
328
- padding: 0.75rem 1.5rem;
329
- border-bottom: 1px solid #334155;
330
- display: flex;
331
- align-items: center;
332
- justify-content: space-between;
333
-
334
- .code-label {
335
- font-size: 0.75rem;
336
- font-weight: 600;
337
- text-transform: uppercase;
338
- letter-spacing: 0.05em;
339
- color: #94a3b8;
340
- }
341
- }
342
-
343
- pre {
344
- margin: 0;
345
- padding: 1.5rem;
346
- overflow-x: auto;
347
- background: transparent;
348
-
349
- code {
350
- font-family: 'Consolas', 'Monaco', 'Courier New', monospace;
351
- font-size: 0.875rem;
352
- line-height: 1.6;
353
- color: #e2e8f0;
354
- }
355
- }
356
- }
357
-
358
- // Props Table
359
- .props-table {
360
- overflow-x: auto;
361
-
362
- table {
363
- width: 100%;
364
- border-collapse: collapse;
365
- font-size: 0.9375rem;
366
-
367
- thead {
368
- background: #f8fafc;
369
- border-bottom: 2px solid #e2e8f0;
370
-
371
- th {
372
- padding: 1rem;
373
- text-align: left;
374
- font-weight: 600;
375
- color: #1e293b;
376
- font-size: 0.875rem;
377
- text-transform: uppercase;
378
- letter-spacing: 0.05em;
379
- }
380
- }
381
-
382
- tbody {
383
- tr {
384
- border-bottom: 1px solid #e2e8f0;
385
-
386
- &:hover {
387
- background: #f8fafc;
388
- }
389
-
390
- td {
391
- padding: 1rem;
392
- color: #475569;
393
-
394
- code {
395
- background: #f1f5f9;
396
- padding: 0.2rem 0.4rem;
397
- border-radius: 4px;
398
- font-size: 0.85rem;
399
- color: #0f172a;
400
- font-family: 'Consolas', 'Monaco', 'Courier New', monospace;
401
- }
402
- }
403
- }
404
- }
405
- }
406
- }
407
-
408
- // Code Sections
409
- .code-section {
410
- margin-bottom: 2rem;
411
-
412
- h3 {
413
- margin-bottom: 0.5rem;
414
- }
415
-
416
- pre {
417
- background: #1e293b;
418
- color: #e2e8f0;
419
- padding: 1.5rem;
420
- border-radius: 8px;
421
- overflow-x: auto;
422
- margin: 0;
423
-
424
- code {
425
- font-family: 'Consolas', 'Monaco', 'Courier New', monospace;
426
- font-size: 0.875rem;
427
- line-height: 1.6;
428
- }
429
- }
430
- }
@@ -1,23 +0,0 @@
1
- import { TestBed } from '@angular/core/testing';
2
- import { App } from './app';
3
-
4
- describe('App', () => {
5
- beforeEach(async () => {
6
- await TestBed.configureTestingModule({
7
- imports: [App],
8
- }).compileComponents();
9
- });
10
-
11
- it('should create the app', () => {
12
- const fixture = TestBed.createComponent(App);
13
- const app = fixture.componentInstance;
14
- expect(app).toBeTruthy();
15
- });
16
-
17
- it('should render title', async () => {
18
- const fixture = TestBed.createComponent(App);
19
- await fixture.whenStable();
20
- const compiled = fixture.nativeElement as HTMLElement;
21
- expect(compiled.querySelector('h1')?.textContent).toContain('Hello, demo-angular');
22
- });
23
- });
@@ -1,97 +0,0 @@
1
- import { Component, signal, inject, effect } from '@angular/core';
2
- import { RouterOutlet, Router } from '@angular/router';
3
- import { TranslateService, TranslateModule } from '@ngx-translate/core';
4
-
5
- // Import package.json to get version
6
- import packageJson from '../../package.json';
7
-
8
- @Component({
9
- selector: 'app-root',
10
- imports: [RouterOutlet, TranslateModule],
11
- templateUrl: './app.html',
12
- styleUrl: './app.scss'
13
- })
14
- export class App {
15
- protected readonly router = inject(Router);
16
- protected readonly translate = inject(TranslateService);
17
-
18
- protected readonly sidebarOpen = signal(true);
19
- protected readonly currentTheme = signal<string | null>(null);
20
- protected readonly currentLang = signal<'en' | 'ar'>('en');
21
- protected readonly isRTL = signal(false);
22
- protected readonly version = packageJson.version;
23
-
24
- constructor() {
25
- // Initialize translations
26
- this.translate.setFallbackLang('en');
27
- this.translate.use('en').subscribe();
28
- }
29
-
30
- protected readonly themes = [
31
- { id: 'default', name: 'Default', description: 'Standard SDGA theme', file: null },
32
- { id: 'dark', name: 'Dark', description: 'Modern dark color palette', file: 'dark.scss' },
33
- { id: 'material', name: 'Material', description: 'Material Design inspired', file: 'material.scss' },
34
- { id: 'rounded', name: 'Rounded', description: 'Soft and friendly', file: 'rounded.scss' },
35
- { id: 'minimal', name: 'Minimal', description: 'Clean and simple', file: 'minimal.scss' },
36
- { id: 'vibrant', name: 'Vibrant', description: 'Bold and colorful', file: 'vibrant.scss' },
37
- { id: 'large', name: 'Large', description: 'Big and prominent', file: 'large.scss' }
38
- ];
39
-
40
- protected readonly menuItems = [
41
- {
42
- groupKey: 'nav.getting_started',
43
- items: [
44
- { id: 'home', labelKey: 'nav.home', icon: '🏠', route: '/home' }
45
- ]
46
- },
47
- {
48
- groupKey: 'nav.layout',
49
- items: [
50
- // { id: 'header', labelKey: 'nav.header', icon: '📋', route: '/header' },
51
- { id: 'footer', labelKey: 'nav.footer', icon: '📄', route: '/footer' }
52
- ]
53
- },
54
- {
55
- groupKey: 'nav.components',
56
- items: [
57
- { id: 'alerts', labelKey: 'nav.alerts', icon: '⚠️', route: '/alerts' },
58
- { id: 'buttons', labelKey: 'nav.buttons', icon: '🔘', route: '/buttons' },
59
- { id: 'cards', labelKey: 'nav.cards', icon: '🃏', route: '/cards' },
60
- { id: 'forms', labelKey: 'nav.forms', icon: '📝', route: '/forms' },
61
- { id: 'tables', labelKey: 'nav.tables', icon: '📊', route: '/tables' },
62
- { id: 'toasts', labelKey: 'nav.toasts', icon: '🔔', route: '/toasts' },
63
- { id: 'links', labelKey: 'nav.links', icon: '🔗', route: '/links' },
64
- ]
65
- }
66
- ];
67
-
68
- navigateTo(route: string): void {
69
- this.router.navigate([route]);
70
- }
71
-
72
- toggleSidebar(): void {
73
- this.sidebarOpen.update(open => !open);
74
- }
75
-
76
- toggleLanguage(): void {
77
- const newLang = this.currentLang() === 'en' ? 'ar' : 'en';
78
- this.currentLang.set(newLang);
79
- this.translate.use(newLang).subscribe(() => {
80
- this.isRTL.set(newLang === 'ar');
81
- document.documentElement.setAttribute('dir', newLang === 'ar' ? 'rtl' : 'ltr');
82
- document.documentElement.setAttribute('lang', newLang);
83
- });
84
- }
85
-
86
- applyTheme(themeId: string): void {
87
- this.currentTheme.set(themeId === 'default' ? null : themeId);
88
-
89
- const theme = this.themes.find(t => t.id === themeId);
90
- if (theme?.file) {
91
- console.log(`To apply the ${theme.name} theme, import it in your styles.scss:`);
92
- console.log(`@import 'dist/SDGA/themes/${theme.file}';`);
93
- } else {
94
- console.log('Using default theme (no import needed)');
95
- }
96
- }
97
- }
@@ -1,30 +0,0 @@
1
- <div class="code-example-wrapper" [class]="onColor ? 'on-' + onColor : ''">
2
- <div class="code-header">
3
- @if (title) {
4
- <span class="code-title">{{ title }}</span>
5
- }
6
- <button class="btn-toggle" (click)="toggleExpand()" type="button">
7
- {{ (isExpanded() ? 'code.hide' : 'code.show') | translate }}
8
- </button>
9
- </div>
10
-
11
- @if (isExpanded()) {
12
- <div class="code-example">
13
- <div class="code-tabs">
14
- @for (tab of availableTabs; track tab) {
15
- <button
16
- class="tab-btn"
17
- [class.active]="activeTab() === tab"
18
- (click)="setActiveTab(tab)"
19
- type="button">
20
- {{ 'code.' + tab | translate }}
21
- </button>
22
- }
23
- <button class="btn-copy" (click)="copyCode()" type="button">
24
- {{ (copySuccess() ? 'code.copied' : 'code.copy') | translate }}
25
- </button>
26
- </div>
27
- <pre><code [innerHTML]="highlightedCode"></code></pre>
28
- </div>
29
- }
30
- </div>