@devstroupe/devkit-cli 1.0.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.
Files changed (170) hide show
  1. package/README.md +40 -0
  2. package/dist/boilerplates/angular-template/.dockerignore +4 -0
  3. package/dist/boilerplates/angular-template/.postcssrc.json +5 -0
  4. package/dist/boilerplates/angular-template/Dockerfile +14 -0
  5. package/dist/boilerplates/angular-template/angular.json +85 -0
  6. package/dist/boilerplates/angular-template/components.json +5 -0
  7. package/dist/boilerplates/angular-template/framework.code-workspace +7 -0
  8. package/dist/boilerplates/angular-template/nginx.conf +23 -0
  9. package/dist/boilerplates/angular-template/node_modules/.bin/browserslist +21 -0
  10. package/dist/boilerplates/angular-template/node_modules/.bin/jiti +21 -0
  11. package/dist/boilerplates/angular-template/node_modules/.bin/lessc +21 -0
  12. package/dist/boilerplates/angular-template/node_modules/.bin/ng +21 -0
  13. package/dist/boilerplates/angular-template/node_modules/.bin/ng-xi18n +21 -0
  14. package/dist/boilerplates/angular-template/node_modules/.bin/ngc +21 -0
  15. package/dist/boilerplates/angular-template/node_modules/.bin/sass +21 -0
  16. package/dist/boilerplates/angular-template/node_modules/.bin/terser +21 -0
  17. package/dist/boilerplates/angular-template/node_modules/.bin/tsc +21 -0
  18. package/dist/boilerplates/angular-template/node_modules/.bin/tsserver +21 -0
  19. package/dist/boilerplates/angular-template/node_modules/.bin/vite +21 -0
  20. package/dist/boilerplates/angular-template/node_modules/.bin/vitest +21 -0
  21. package/dist/boilerplates/angular-template/node_modules/.bin/yaml +21 -0
  22. package/dist/boilerplates/angular-template/package.json +47 -0
  23. package/dist/boilerplates/angular-template/postcss.config.js +5 -0
  24. package/dist/boilerplates/angular-template/proxy.conf.json +7 -0
  25. package/dist/boilerplates/angular-template/src/app/app.component.html +3 -0
  26. package/dist/boilerplates/angular-template/src/app/app.component.ts +12 -0
  27. package/dist/boilerplates/angular-template/src/app/app.config.ts +59 -0
  28. package/dist/boilerplates/angular-template/src/app/app.entity-routes.ts +4 -0
  29. package/dist/boilerplates/angular-template/src/app/app.routes.ts +25 -0
  30. package/dist/boilerplates/angular-template/src/app/core/guards/auth.guard.ts +16 -0
  31. package/dist/boilerplates/angular-template/src/app/core/services/auth.service.ts +98 -0
  32. package/dist/boilerplates/angular-template/src/app/modules/auth/login/login.component.html +51 -0
  33. package/dist/boilerplates/angular-template/src/app/modules/auth/login/login.component.ts +47 -0
  34. package/dist/boilerplates/angular-template/src/app/modules/auth/register/register.component.html +59 -0
  35. package/dist/boilerplates/angular-template/src/app/modules/auth/register/register.component.ts +47 -0
  36. package/dist/boilerplates/angular-template/src/app/modules/dashboard/dashboard.component.html +14 -0
  37. package/dist/boilerplates/angular-template/src/app/modules/dashboard/dashboard.component.ts +23 -0
  38. package/dist/boilerplates/angular-template/src/app/shared/interceptors/tenant.interceptor.ts +25 -0
  39. package/dist/boilerplates/angular-template/src/index.html +64 -0
  40. package/dist/boilerplates/angular-template/src/main.ts +6 -0
  41. package/dist/boilerplates/angular-template/src/styles.css +9 -0
  42. package/dist/boilerplates/angular-template/tsconfig.json +36 -0
  43. package/dist/boilerplates/nest-template/Dockerfile +16 -0
  44. package/dist/boilerplates/nest-template/node_modules/.bin/acorn +21 -0
  45. package/dist/boilerplates/nest-template/node_modules/.bin/nest +21 -0
  46. package/dist/boilerplates/nest-template/node_modules/.bin/prettier +21 -0
  47. package/dist/boilerplates/nest-template/node_modules/.bin/tsc +21 -0
  48. package/dist/boilerplates/nest-template/node_modules/.bin/tsserver +21 -0
  49. package/dist/boilerplates/nest-template/node_modules/.bin/typeorm +21 -0
  50. package/dist/boilerplates/nest-template/node_modules/.bin/typeorm-ts-node-commonjs +21 -0
  51. package/dist/boilerplates/nest-template/node_modules/.bin/typeorm-ts-node-esm +21 -0
  52. package/dist/boilerplates/nest-template/node_modules/.bin/webpack +21 -0
  53. package/dist/boilerplates/nest-template/package.json +43 -0
  54. package/dist/boilerplates/nest-template/src/app.module.ts +24 -0
  55. package/dist/boilerplates/nest-template/src/database/data-source.ts +16 -0
  56. package/dist/boilerplates/nest-template/src/database/migrations/1700000000000-create-users.ts +26 -0
  57. package/dist/boilerplates/nest-template/src/main.ts +46 -0
  58. package/dist/boilerplates/nest-template/src/modules/auth/auth.controller.ts +34 -0
  59. package/dist/boilerplates/nest-template/src/modules/auth/auth.module.ts +22 -0
  60. package/dist/boilerplates/nest-template/src/modules/auth/auth.service.ts +57 -0
  61. package/dist/boilerplates/nest-template/src/modules/auth/current-user.decorator.ts +8 -0
  62. package/dist/boilerplates/nest-template/src/modules/auth/jwt-auth.guard.ts +31 -0
  63. package/dist/boilerplates/nest-template/src/modules/auth/roles.decorator.ts +4 -0
  64. package/dist/boilerplates/nest-template/src/modules/auth/roles.guard.ts +24 -0
  65. package/dist/boilerplates/nest-template/src/modules/user/database-seed.service.ts +47 -0
  66. package/dist/boilerplates/nest-template/src/modules/user/domain/user.repository.ts +9 -0
  67. package/dist/boilerplates/nest-template/src/modules/user/domain/user.ts +9 -0
  68. package/dist/boilerplates/nest-template/src/modules/user/infra/database/user.orm-entity.ts +31 -0
  69. package/dist/boilerplates/nest-template/src/modules/user/infra/database/user.repository.adapter.ts +53 -0
  70. package/dist/boilerplates/nest-template/src/modules/user/service/user.service.ts +44 -0
  71. package/dist/boilerplates/nest-template/src/modules/user/user.module.ts +20 -0
  72. package/dist/boilerplates/nest-template/tsconfig.build.json +4 -0
  73. package/dist/boilerplates/nest-template/tsconfig.json +21 -0
  74. package/dist/index.d.ts +2 -0
  75. package/dist/index.js +1967 -0
  76. package/dist/migrations/sort-entities.d.ts +2 -0
  77. package/dist/migrations/sort-entities.js +30 -0
  78. package/dist/rules/linter-rules.d.ts +12 -0
  79. package/dist/rules/linter-rules.js +338 -0
  80. package/dist/rules/linter-rules.test.d.ts +1 -0
  81. package/dist/rules/linter-rules.test.js +214 -0
  82. package/dist/templates/angular/dialog-handler.template.d.ts +2 -0
  83. package/dist/templates/angular/dialog-handler.template.js +49 -0
  84. package/dist/templates/angular/form.template.d.ts +3 -0
  85. package/dist/templates/angular/form.template.js +453 -0
  86. package/dist/templates/angular/index.d.ts +4 -0
  87. package/dist/templates/angular/index.js +20 -0
  88. package/dist/templates/angular/list.template.d.ts +3 -0
  89. package/dist/templates/angular/list.template.js +213 -0
  90. package/dist/templates/angular/service.template.d.ts +1 -0
  91. package/dist/templates/angular/service.template.js +20 -0
  92. package/dist/templates/cli-templates.d.ts +2 -0
  93. package/dist/templates/cli-templates.js +18 -0
  94. package/dist/templates/nest/crud.templates.d.ts +9 -0
  95. package/dist/templates/nest/crud.templates.js +362 -0
  96. package/dist/templates/nest/index.d.ts +3 -0
  97. package/dist/templates/nest/index.js +19 -0
  98. package/dist/templates/nest/microservice.templates.d.ts +4 -0
  99. package/dist/templates/nest/microservice.templates.js +157 -0
  100. package/dist/templates/nest/migration.template.d.ts +3 -0
  101. package/dist/templates/nest/migration.template.js +127 -0
  102. package/dist/templates/relationship-templates.test.d.ts +1 -0
  103. package/dist/templates/relationship-templates.test.js +181 -0
  104. package/dist/templates/shared/names.d.ts +3 -0
  105. package/dist/templates/shared/names.js +14 -0
  106. package/dist/templates/shared/relationships.d.ts +27 -0
  107. package/dist/templates/shared/relationships.js +96 -0
  108. package/dist/templates/ui/components/avatar.template.d.ts +3 -0
  109. package/dist/templates/ui/components/avatar.template.js +66 -0
  110. package/dist/templates/ui/components/badge.template.d.ts +3 -0
  111. package/dist/templates/ui/components/badge.template.js +27 -0
  112. package/dist/templates/ui/components/button.template.d.ts +5 -0
  113. package/dist/templates/ui/components/button.template.js +64 -0
  114. package/dist/templates/ui/components/card-list.template.d.ts +5 -0
  115. package/dist/templates/ui/components/card-list.template.js +79 -0
  116. package/dist/templates/ui/components/dialog.template.d.ts +5 -0
  117. package/dist/templates/ui/components/dialog.template.js +51 -0
  118. package/dist/templates/ui/components/filter.template.d.ts +4 -0
  119. package/dist/templates/ui/components/filter.template.js +218 -0
  120. package/dist/templates/ui/components/index.d.ts +10 -0
  121. package/dist/templates/ui/components/index.js +26 -0
  122. package/dist/templates/ui/components/input.template.d.ts +4 -0
  123. package/dist/templates/ui/components/input.template.js +76 -0
  124. package/dist/templates/ui/components/select.template.d.ts +4 -0
  125. package/dist/templates/ui/components/select.template.js +176 -0
  126. package/dist/templates/ui/components/simple-list.template.d.ts +5 -0
  127. package/dist/templates/ui/components/simple-list.template.js +89 -0
  128. package/dist/templates/ui/components/table.template.d.ts +5 -0
  129. package/dist/templates/ui/components/table.template.js +112 -0
  130. package/dist/templates/ui/index.d.ts +9 -0
  131. package/dist/templates/ui/index.js +25 -0
  132. package/dist/templates/ui/layout/header.template.d.ts +5 -0
  133. package/dist/templates/ui/layout/header.template.js +236 -0
  134. package/dist/templates/ui/layout/index.d.ts +4 -0
  135. package/dist/templates/ui/layout/index.js +20 -0
  136. package/dist/templates/ui/layout/main-layout.template.d.ts +5 -0
  137. package/dist/templates/ui/layout/main-layout.template.js +126 -0
  138. package/dist/templates/ui/layout/shell.template.d.ts +5 -0
  139. package/dist/templates/ui/layout/shell.template.js +76 -0
  140. package/dist/templates/ui/layout/sidebar.template.d.ts +5 -0
  141. package/dist/templates/ui/layout/sidebar.template.js +412 -0
  142. package/dist/templates/ui/playground.template.d.ts +5 -0
  143. package/dist/templates/ui/playground.template.js +570 -0
  144. package/dist/templates/ui/readme.template.d.ts +1 -0
  145. package/dist/templates/ui/readme.template.js +23 -0
  146. package/dist/templates/ui/shared/colors.d.ts +1 -0
  147. package/dist/templates/ui/shared/colors.js +31 -0
  148. package/dist/templates/ui/shared/profile-component.template.d.ts +5 -0
  149. package/dist/templates/ui/shared/profile-component.template.js +403 -0
  150. package/dist/templates/ui/shared/profile-service.template.d.ts +1 -0
  151. package/dist/templates/ui/shared/profile-service.template.js +44 -0
  152. package/dist/templates/ui/shared/theme-service.template.d.ts +1 -0
  153. package/dist/templates/ui/shared/theme-service.template.js +47 -0
  154. package/dist/templates/ui/spartan/badge-directive.template.d.ts +3 -0
  155. package/dist/templates/ui/spartan/badge-directive.template.js +50 -0
  156. package/dist/templates/ui/spartan/button-directive.template.d.ts +3 -0
  157. package/dist/templates/ui/spartan/button-directive.template.js +82 -0
  158. package/dist/templates/ui/spartan/button-token.template.d.ts +3 -0
  159. package/dist/templates/ui/spartan/button-token.template.js +31 -0
  160. package/dist/templates/ui/spartan/hlm-core.template.d.ts +3 -0
  161. package/dist/templates/ui/spartan/hlm-core.template.js +322 -0
  162. package/dist/templates/ui/spartan/index.d.ts +5 -0
  163. package/dist/templates/ui/spartan/index.js +21 -0
  164. package/dist/templates/ui/spartan/input-directive.template.d.ts +3 -0
  165. package/dist/templates/ui/spartan/input-directive.template.js +31 -0
  166. package/dist/templates/ui/theme-css.template.d.ts +7 -0
  167. package/dist/templates/ui/theme-css.template.js +210 -0
  168. package/dist/templates/ui-templates.d.ts +1 -0
  169. package/dist/templates/ui-templates.js +17 -0
  170. package/package.json +50 -0
@@ -0,0 +1,570 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.devkitPlaygroundComponentTemplate = devkitPlaygroundComponentTemplate;
4
+ function devkitPlaygroundComponentTemplate(spartanPrimitives = []) {
5
+ const primitiveList = JSON.stringify(spartanPrimitives, null, 4).replace(/"/g, "'");
6
+ return {
7
+ ts: `import { Component, OnInit } from '@angular/core';
8
+ import { CommonModule } from '@angular/common';
9
+ import { FormsModule } from '@angular/forms';
10
+ import { HlmAccordionImports } from '@spartan-ng/helm/accordion';
11
+ import { HlmAlertDialogImports } from '@spartan-ng/helm/alert-dialog';
12
+ import { HlmButton } from '@spartan-ng/helm/button';
13
+ import { HlmDialogImports } from '@spartan-ng/helm/dialog';
14
+ import { HlmDropdownMenuImports } from '@spartan-ng/helm/dropdown-menu';
15
+ import { HlmSelectImports } from '@spartan-ng/helm/select';
16
+ import { HlmTabsImports } from '@spartan-ng/helm/tabs';
17
+ import { DevkitButtonComponent } from '../../shared/components/devkit/button/button.component';
18
+ import { DevkitInputComponent } from '../../shared/components/devkit/input/input.component';
19
+ import { DevkitSelectComponent } from '../../shared/components/devkit/select/select.component';
20
+ import { DevkitTableComponent } from '../../shared/components/devkit/table/table.component';
21
+ import { DevkitFilterComponent } from '../../shared/components/devkit/filter/filter.component';
22
+ import { DevkitBadgeComponent } from '../../shared/components/devkit/ui-badge-helm/badge.component';
23
+ import { DevkitAvatarComponent } from '../../shared/components/devkit/ui-avatar-helm/avatar.component';
24
+
25
+ @Component({
26
+ selector: 'app-playground',
27
+ standalone: true,
28
+ imports: [
29
+ CommonModule,
30
+ FormsModule,
31
+ DevkitButtonComponent,
32
+ DevkitInputComponent,
33
+ DevkitSelectComponent,
34
+ DevkitTableComponent,
35
+ DevkitFilterComponent,
36
+ DevkitBadgeComponent,
37
+ DevkitAvatarComponent,
38
+ HlmAccordionImports,
39
+ HlmAlertDialogImports,
40
+ HlmButton,
41
+ HlmDialogImports,
42
+ HlmDropdownMenuImports,
43
+ HlmSelectImports,
44
+ HlmTabsImports
45
+ ],
46
+ templateUrl: './playground.component.html',
47
+ styleUrls: ['./playground.component.css']
48
+ })
49
+ export class PlaygroundComponent implements OnInit {
50
+ // Teste de inputs
51
+ textValue = 'Texto de exemplo';
52
+ selectOptions = [
53
+ { label: 'Opção 1', value: '1' },
54
+ { label: 'Opção 2', value: '2' },
55
+ { label: 'Opção 3', value: '3' }
56
+ ];
57
+ directSelectValue: string | null | undefined = null;
58
+ selectItemToString = (value: any): string => {
59
+ const selected = this.selectOptions.find(option => option.value === value);
60
+ return selected ? selected.label : 'Selecione...';
61
+ };
62
+
63
+ spartanPrimitives = ${primitiveList};
64
+
65
+ // Teste de Tabelas
66
+ columns = [
67
+ { key: 'id', label: 'ID', sortable: true },
68
+ { key: 'name', label: 'Nome completo', sortable: true },
69
+ { key: 'email', label: 'E-mail', sortable: false },
70
+ { key: 'role', label: 'Função', sortable: true },
71
+ { key: 'status', label: 'Status', sortable: false }
72
+ ];
73
+
74
+ items = [
75
+ { id: '1', name: 'Ana Souza', email: 'ana@devstroupe.com', role: 'Administrador', status: 'Ativo' },
76
+ { id: '2', name: 'Carlos Lima', email: 'carlos@devstroupe.com', role: 'Desenvolvedor', status: 'Ativo' },
77
+ { id: '3', name: 'Juliana Costa', email: 'juliana@devstroupe.com', role: 'Designer', status: 'Pendente' }
78
+ ];
79
+
80
+ filterConfig = [
81
+ { key: 'search', label: 'Buscar por nome', type: 'text' as const, col: 'col-span-12 md:col-span-8' },
82
+ {
83
+ key: 'status',
84
+ label: 'Status',
85
+ type: 'select' as const,
86
+ options: [
87
+ { label: 'Todos', value: '' },
88
+ { label: 'Ativos', value: 'Ativo' },
89
+ { label: 'Pendentes', value: 'Pendente' }
90
+ ],
91
+ col: 'col-span-12 md:col-span-4'
92
+ }
93
+ ];
94
+
95
+ onFilterChange(filters: any) {
96
+ console.log('Playground filter applied:', filters);
97
+ }
98
+
99
+ // Preview runtime apenas para paleta e modo. O style Spartan real e gerado pela CLI.
100
+ activeTheme = 'zinc';
101
+ isDarkMode = false;
102
+
103
+ // Estado interativo para os componentes adicionais do Spartan
104
+ activeTab = 'tab1';
105
+
106
+ themes = [
107
+ { value: 'violet', label: 'Violet' },
108
+ { value: 'zinc', label: 'Zinc' },
109
+ { value: 'slate', label: 'Slate' },
110
+ { value: 'orange', label: 'Orange' },
111
+ { value: 'rose', label: 'Rose' }
112
+ ];
113
+
114
+ private themeColors: Record<string, { light: any; dark: any }> = {
115
+ violet: {
116
+ light: {
117
+ primary: '262.1 83.3% 57.8%',
118
+ primaryForeground: '0 0% 98%',
119
+ secondary: '240 4.8% 95.9%',
120
+ secondaryForeground: '240 5.9% 10%',
121
+ ring: '262.1 83.3% 57.8%',
122
+ border: '240 5.9% 90%',
123
+ input: '240 5.9% 90%'
124
+ },
125
+ dark: {
126
+ primary: '263.4 70% 50.4%',
127
+ primaryForeground: '210 20% 98%',
128
+ secondary: '240 3.7% 15.9%',
129
+ secondaryForeground: '0 0% 98%',
130
+ ring: '263.4 70% 50.4%',
131
+ border: '240 3.7% 15.9%',
132
+ input: '240 3.7% 15.9%'
133
+ }
134
+ },
135
+ zinc: {
136
+ light: {
137
+ primary: '240 5.9% 10%',
138
+ primaryForeground: '0 0% 98%',
139
+ secondary: '240 4.8% 95.9%',
140
+ secondaryForeground: '240 5.9% 10%',
141
+ ring: '240 5.9% 10%',
142
+ border: '240 5.9% 90%',
143
+ input: '240 5.9% 90%'
144
+ },
145
+ dark: {
146
+ primary: '0 0% 98%',
147
+ primaryForeground: '240 5.9% 10%',
148
+ secondary: '240 3.7% 15.9%',
149
+ secondaryForeground: '0 0% 98%',
150
+ ring: '240 4.9% 83.9%',
151
+ border: '240 3.7% 15.9%',
152
+ input: '240 3.7% 15.9%'
153
+ }
154
+ },
155
+ slate: {
156
+ light: {
157
+ primary: '222.2 47.4% 11.2%',
158
+ primaryForeground: '210 40% 98%',
159
+ secondary: '210 40% 96.1%',
160
+ secondaryForeground: '222.2 47.4% 11.2%',
161
+ ring: '222.2 84% 4.9%',
162
+ border: '214.3 31.8% 91.4%',
163
+ input: '214.3 31.8% 91.4%'
164
+ },
165
+ dark: {
166
+ primary: '210 40% 98%',
167
+ primaryForeground: '222.2 47.4% 11.2%',
168
+ secondary: '217.2 32.6% 17.5%',
169
+ secondaryForeground: '210 40% 98%',
170
+ ring: '217.2 91.2% 59.8%',
171
+ border: '217.2 32.6% 17.5%',
172
+ input: '217.2 32.6% 17.5%'
173
+ }
174
+ },
175
+ orange: {
176
+ light: {
177
+ primary: '24.6 95% 53.1%',
178
+ primaryForeground: '0 0% 98%',
179
+ secondary: '240 4.8% 95.9%',
180
+ secondaryForeground: '240 5.9% 10%',
181
+ ring: '24.6 95% 53.1%',
182
+ border: '240 5.9% 90%',
183
+ input: '240 5.9% 90%'
184
+ },
185
+ dark: {
186
+ primary: '20.5 90.2% 48.2%',
187
+ primaryForeground: '60 9.1% 97.8%',
188
+ secondary: '240 3.7% 15.9%',
189
+ secondaryForeground: '0 0% 98%',
190
+ ring: '20.5 90.2% 48.2%',
191
+ border: '240 3.7% 15.9%',
192
+ input: '240 3.7% 15.9%'
193
+ }
194
+ },
195
+ rose: {
196
+ light: {
197
+ primary: '346.8 77.2% 49.8%',
198
+ primaryForeground: '355.7 100% 97.3%',
199
+ secondary: '240 4.8% 95.9%',
200
+ secondaryForeground: '240 5.9% 10%',
201
+ ring: '346.8 77.2% 49.8%',
202
+ border: '240 5.9% 90%',
203
+ input: '240 5.9% 90%'
204
+ },
205
+ dark: {
206
+ primary: '346.8 77.2% 49.8%',
207
+ primaryForeground: '355.7 100% 97.3%',
208
+ secondary: '240 3.7% 15.9%',
209
+ secondaryForeground: '0 0% 98%',
210
+ ring: '346.8 77.2% 49.8%',
211
+ border: '240 3.7% 15.9%',
212
+ input: '240 3.7% 15.9%'
213
+ }
214
+ }
215
+ };
216
+
217
+ ngOnInit() {
218
+ this.updateDomVariables();
219
+ }
220
+
221
+ changeTheme(themeName: string) {
222
+ this.activeTheme = themeName;
223
+ this.updateDomVariables();
224
+ }
225
+
226
+ toggleDarkMode() {
227
+ this.isDarkMode = !this.isDarkMode;
228
+ this.updateDomVariables();
229
+ }
230
+
231
+ private updateDomVariables() {
232
+ const root = document.documentElement;
233
+ const mode = this.isDarkMode ? 'dark' : 'light';
234
+ const colors = this.themeColors[this.activeTheme][mode];
235
+
236
+ // As variaveis precisam receber uma cor CSS valida, pois o preset
237
+ // do Spartan mapeia --color-primary diretamente para var(--primary).
238
+ root.style.setProperty('--primary', \`hsl(\${colors.primary})\`);
239
+ root.style.setProperty('--primary-foreground', \`hsl(\${colors.primaryForeground})\`);
240
+ root.style.setProperty('--secondary', \`hsl(\${colors.secondary})\`);
241
+ root.style.setProperty('--secondary-foreground', \`hsl(\${colors.secondaryForeground})\`);
242
+ root.style.setProperty('--border', \`hsl(\${colors.border})\`);
243
+ root.style.setProperty('--input', \`hsl(\${colors.input})\`);
244
+ root.style.setProperty('--ring', \`hsl(\${colors.ring})\`);
245
+ root.style.setProperty('--accent', \`hsl(\${colors.secondary})\`);
246
+ root.style.setProperty('--accent-foreground', \`hsl(\${colors.secondaryForeground})\`);
247
+
248
+ if (this.isDarkMode) {
249
+ root.classList.add('dark');
250
+ document.body.classList.add('dark');
251
+ root.style.setProperty('--background', 'hsl(240 10% 3.9%)');
252
+ root.style.setProperty('--foreground', 'hsl(0 0% 98%)');
253
+ root.style.setProperty('--card', 'hsl(240 10% 3.9%)');
254
+ root.style.setProperty('--card-foreground', 'hsl(0 0% 98%)');
255
+ root.style.setProperty('--popover', 'hsl(240 10% 3.9%)');
256
+ root.style.setProperty('--popover-foreground', 'hsl(0 0% 98%)');
257
+ root.style.setProperty('--muted', 'hsl(240 3.7% 15.9%)');
258
+ root.style.setProperty('--muted-foreground', 'hsl(240 5% 64.9%)');
259
+ } else {
260
+ root.classList.remove('dark');
261
+ document.body.classList.remove('dark');
262
+ root.style.setProperty('--background', 'hsl(0 0% 98%)');
263
+ root.style.setProperty('--foreground', 'hsl(240 10% 3.9%)');
264
+ root.style.setProperty('--card', 'hsl(0 0% 100%)');
265
+ root.style.setProperty('--card-foreground', 'hsl(240 10% 3.9%)');
266
+ root.style.setProperty('--popover', 'hsl(0 0% 100%)');
267
+ root.style.setProperty('--popover-foreground', 'hsl(240 10% 3.9%)');
268
+ root.style.setProperty('--muted', 'hsl(240 4.8% 95.9%)');
269
+ root.style.setProperty('--muted-foreground', 'hsl(240 3.8% 46.1%)');
270
+ }
271
+
272
+ }
273
+ }
274
+
275
+ `,
276
+ html: `<div class="max-w-6xl mx-auto p-8 space-y-12">
277
+ <!-- Header -->
278
+ <div class="border-b border-border pb-6 flex flex-col md:flex-row md:items-center md:justify-between gap-4">
279
+ <div>
280
+ <h1 class="text-3xl font-extrabold tracking-tight text-foreground">Playground de Componentes do DevKit</h1>
281
+ <p class="text-sm text-muted-foreground mt-2">Valide a renderização e estilo sob a configuração atual do Design System.</p>
282
+ </div>
283
+ </div>
284
+
285
+ <div class="rounded-xl border border-primary/20 bg-card/40 p-6 backdrop-blur-md flex flex-wrap gap-6 items-center justify-between">
286
+ <div>
287
+ <h3 class="text-base font-bold text-foreground flex items-center gap-2">
288
+ <span class="w-2.5 h-2.5 rounded-full bg-primary animate-pulse"></span>
289
+ Preview de Tema
290
+ </h3>
291
+ <p class="text-xs text-muted-foreground mt-1">Altere paleta e modo no browser. O style Spartan real muda via CLI: <code class="rounded bg-muted px-1 py-0.5">devstroupe ui:set-style &lt;style&gt;</code>.</p>
292
+ </div>
293
+
294
+ <div class="flex flex-wrap gap-4 items-center">
295
+ <!-- Theme Selector -->
296
+ <div class="w-44">
297
+ <devkit-select
298
+ label="Tema de Cores"
299
+ [options]="themes"
300
+ [(ngModel)]="activeTheme"
301
+ (ngModelChange)="changeTheme($event)"
302
+ ></devkit-select>
303
+ </div>
304
+
305
+ <!-- Dark/Light Mode Switcher -->
306
+ <div class="flex flex-col space-y-1 justify-end h-full pt-4">
307
+ <button
308
+ (click)="toggleDarkMode()"
309
+ class="py-1.5 px-4 rounded-lg text-sm flex items-center gap-2 border border-border bg-card text-foreground hover:bg-muted"
310
+ >
311
+ <span>{{ isDarkMode ? '🌙 Dark Mode' : '☀️ Light Mode' }}</span>
312
+ </button>
313
+ </div>
314
+ </div>
315
+ </div>
316
+
317
+ <!-- Inventário de primitives Spartan -->
318
+ <div class="space-y-4">
319
+ <div class="flex flex-col gap-1">
320
+ <h2 class="text-xl font-bold text-foreground">Inventário Spartan Helm</h2>
321
+ <p class="text-sm text-muted-foreground">
322
+ {{ spartanPrimitives.length }} primitives oficiais gerados em <code class="rounded bg-muted px-1 py-0.5">libs/ui</code>.
323
+ </p>
324
+ </div>
325
+ <div class="rounded-xl border border-border bg-card p-6">
326
+ <div class="grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-6 gap-2">
327
+ <div *ngFor="let primitive of spartanPrimitives" class="rounded-md border border-border bg-background px-3 py-2 text-xs font-medium text-foreground">
328
+ {{ primitive }}
329
+ </div>
330
+ </div>
331
+ </div>
332
+ </div>
333
+
334
+ <!-- Sessão de Cores e Temas -->
335
+ <div class="space-y-4">
336
+ <h2 class="text-xl font-bold text-foreground">1. Variáveis de Marca</h2>
337
+ <div class="grid grid-cols-2 md:grid-cols-4 gap-4">
338
+ <div class="p-4 rounded-lg border border-border bg-card flex flex-col justify-between h-24">
339
+ <span class="text-xs font-semibold text-muted-foreground uppercase">Primary</span>
340
+ <div class="flex items-center space-x-2">
341
+ <div class="w-6 h-6 rounded bg-primary border border-border"></div>
342
+ <span class="text-sm font-mono text-card-foreground">var(--primary)</span>
343
+ </div>
344
+ </div>
345
+ <div class="p-4 rounded-lg border border-border bg-card flex flex-col justify-between h-24">
346
+ <span class="text-xs font-semibold text-muted-foreground uppercase">Secondary</span>
347
+ <div class="flex items-center space-x-2">
348
+ <div class="w-6 h-6 rounded bg-secondary border border-border"></div>
349
+ <span class="text-sm font-mono text-card-foreground">var(--secondary)</span>
350
+ </div>
351
+ </div>
352
+ <div class="p-4 rounded-lg border border-border bg-card flex flex-col justify-between h-24">
353
+ <span class="text-xs font-semibold text-muted-foreground uppercase">Background Base</span>
354
+ <div class="flex items-center space-x-2">
355
+ <div class="w-6 h-6 rounded border border-border bg-background"></div>
356
+ <span class="text-sm font-mono text-card-foreground">var(--background)</span>
357
+ </div>
358
+ </div>
359
+ <div class="p-4 rounded-lg border border-border bg-card flex flex-col justify-between h-24">
360
+ <span class="text-xs font-semibold text-muted-foreground uppercase">Border</span>
361
+ <div class="flex items-center space-x-2">
362
+ <div class="w-6 h-6 rounded border border-border bg-[var(--border)]"></div>
363
+ <span class="text-sm font-mono text-card-foreground">Border Color</span>
364
+ </div>
365
+ </div>
366
+ </div>
367
+ </div>
368
+
369
+ <!-- Sessão de Buttons -->
370
+ <div class="space-y-4">
371
+ <h2 class="text-xl font-bold text-foreground">2. Botões (devkit-button)</h2>
372
+ <div class="rounded-xl border border-border bg-card p-6 space-y-4">
373
+ <div class="flex flex-wrap gap-4">
374
+ <devkit-button variant="default">Primary / Default</devkit-button>
375
+ <devkit-button variant="secondary">Secondary</devkit-button>
376
+ <devkit-button variant="destructive">Destructive</devkit-button>
377
+ <devkit-button variant="outline">Outline</devkit-button>
378
+ <devkit-button variant="ghost">Ghost</devkit-button>
379
+ <devkit-button variant="link">Link</devkit-button>
380
+ </div>
381
+ <div class="flex flex-wrap gap-4 items-center">
382
+ <devkit-button size="sm" variant="default">Pequeno (sm)</devkit-button>
383
+ <devkit-button size="default" variant="default">Normal (default)</devkit-button>
384
+ <devkit-button size="lg" variant="default">Grande (lg)</devkit-button>
385
+ </div>
386
+ <div class="flex flex-wrap gap-4">
387
+ <devkit-button [disabled]="true">Desabilitado</devkit-button>
388
+ <devkit-button [loading]="true">Carregando</devkit-button>
389
+ </div>
390
+ </div>
391
+ </div>
392
+
393
+ <!-- Sessão de Inputs e Selects -->
394
+ <div class="space-y-4">
395
+ <h2 class="text-xl font-bold text-foreground">3. Formulários (devkit-input / devkit-select)</h2>
396
+ <div class="rounded-xl border border-border bg-card p-6">
397
+ <div class="grid grid-cols-1 md:grid-cols-2 gap-6">
398
+ <devkit-input label="Campo de Texto" placeholder="Digite seu texto..." [(ngModel)]="textValue" [required]="true"></devkit-input>
399
+ <devkit-select label="Caixa de Seleção" [options]="selectOptions" [required]="true"></devkit-select>
400
+ <div class="flex w-full flex-col space-y-1.5">
401
+ <label class="text-xs font-semibold text-muted-foreground">
402
+ Select Spartan direto
403
+ </label>
404
+ <hlm-select
405
+ class="w-full"
406
+ [value]="directSelectValue"
407
+ [itemToString]="selectItemToString"
408
+ (valueChange)="directSelectValue = $event"
409
+ >
410
+ <hlm-select-trigger class="w-full">
411
+ <hlm-select-value placeholder="Selecione..." />
412
+ </hlm-select-trigger>
413
+ <hlm-select-content *hlmSelectPortal>
414
+ <hlm-select-group>
415
+ <hlm-select-item [value]="null">Selecione...</hlm-select-item>
416
+ <hlm-select-item *ngFor="let opt of selectOptions" [value]="opt.value">{{ opt.label }}</hlm-select-item>
417
+ </hlm-select-group>
418
+ </hlm-select-content>
419
+ </hlm-select>
420
+ </div>
421
+ <devkit-input label="Desabilitado" placeholder="Não editável" [disabled]="true"></devkit-input>
422
+ </div>
423
+ </div>
424
+ </div>
425
+
426
+ <!-- Sessão de Badges -->
427
+ <div class="space-y-4">
428
+ <h2 class="text-xl font-bold text-foreground">4. Badges (devkit-badge)</h2>
429
+ <div class="rounded-xl border border-border bg-card p-6 flex flex-wrap gap-4">
430
+ <devkit-badge variant="default">Default</devkit-badge>
431
+ <devkit-badge variant="secondary">Secondary</devkit-badge>
432
+ <devkit-badge variant="destructive">Destructive</devkit-badge>
433
+ <devkit-badge variant="outline">Outline</devkit-badge>
434
+ </div>
435
+ </div>
436
+
437
+ <!-- Sessão de Avatares -->
438
+ <div class="space-y-4">
439
+ <h2 class="text-xl font-bold text-foreground">5. Avatares (devkit-avatar)</h2>
440
+ <div class="rounded-xl border border-border bg-card p-6 flex flex-wrap gap-6 items-center">
441
+ <devkit-avatar name="Lucas Silva" size="sm"></devkit-avatar>
442
+ <devkit-avatar name="Carlos Lima" size="md"></devkit-avatar>
443
+ <devkit-avatar name="Juliana Costa" size="lg"></devkit-avatar>
444
+ <devkit-avatar name="Carlos Lima" src="https://images.unsplash.com/photo-1534528741775-53994a69daeb?auto=format&fit=crop&w=100&q=80" size="md"></devkit-avatar>
445
+ </div>
446
+ </div>
447
+
448
+ <!-- Sessão de Tabelas e Filtros -->
449
+ <div class="space-y-4">
450
+ <h2 class="text-xl font-bold text-foreground">6. Listagens Reativas (devkit-filter / devkit-table)</h2>
451
+ <div class="rounded-xl border border-border bg-card p-6 space-y-6">
452
+ <devkit-filter [config]="filterConfig" (filterApplied)="onFilterChange($event)"></devkit-filter>
453
+ <devkit-table [columns]="columns" [items]="items" [striped]="true"></devkit-table>
454
+ </div>
455
+ </div>
456
+
457
+ <!-- Sessão de Acordeão -->
458
+ <div class="space-y-4">
459
+ <h2 class="text-xl font-bold text-foreground">7. Acordeão (hlm-accordion)</h2>
460
+ <hlm-accordion type="single">
461
+ <hlm-accordion-item>
462
+ <hlm-accordion-trigger>O que é o DT-DevKit?</hlm-accordion-trigger>
463
+ <hlm-accordion-content>
464
+ O DT-DevKit é o kit de desenvolvimento padronizado da DevsTroupe, integrando backend NestJS, frontend Angular e governança de arquitetura.
465
+ </hlm-accordion-content>
466
+ </hlm-accordion-item>
467
+ <hlm-accordion-item>
468
+ <hlm-accordion-trigger>Como funciona a customização interativa?</hlm-accordion-trigger>
469
+ <hlm-accordion-content>
470
+ Ela altera as variáveis CSS nativas no elemento raiz do documento, propagando as modificações a todos os componentes em runtime.
471
+ </hlm-accordion-content>
472
+ </hlm-accordion-item>
473
+ </hlm-accordion>
474
+ </div>
475
+
476
+ <!-- Sessão de Abas -->
477
+ <div class="space-y-4">
478
+ <h2 class="text-xl font-bold text-foreground">8. Abas (hlm-tabs)</h2>
479
+ <div class="rounded-xl border border-border bg-card p-6">
480
+ <hlm-tabs [tab]="activeTab" (tabActivated)="activeTab = $event">
481
+ <hlm-tabs-list>
482
+ <button hlmTabsTrigger="tab1">Perfil</button>
483
+ <button hlmTabsTrigger="tab2">Segurança</button>
484
+ </hlm-tabs-list>
485
+
486
+ <div hlmTabsContent="tab1" class="mt-4 text-muted-foreground">
487
+ Gerencie suas informações de perfil, configurações básicas de e-mail e preferências.
488
+ </div>
489
+ <div hlmTabsContent="tab2" class="mt-4 text-muted-foreground">
490
+ Altere sua senha, ative a autenticação de dois fatores e audite acessos recentes.
491
+ </div>
492
+ </hlm-tabs>
493
+ </div>
494
+ </div>
495
+
496
+ <!-- Sessão de Modais e Diálogos -->
497
+ <div class="space-y-4">
498
+ <h2 class="text-xl font-bold text-foreground">9. Modais e Diálogos (hlm-dialog / hlm-alert-dialog)</h2>
499
+ <div class="rounded-xl border border-border bg-card p-6 flex flex-wrap gap-4">
500
+ <hlm-dialog>
501
+ <button hlmBtn hlmDialogTrigger>Abrir Dialog Padrão</button>
502
+ <hlm-dialog-content>
503
+ <hlm-dialog-header>
504
+ <h3 hlmDialogTitle>Editar Perfil</h3>
505
+ <p hlmDialogDescription>Faça alterações nas informações do seu perfil. Clique em salvar quando terminar.</p>
506
+ </hlm-dialog-header>
507
+ <div class="space-y-4 py-2">
508
+ <devkit-input label="Nome" placeholder="Seu nome..."></devkit-input>
509
+ <devkit-input label="E-mail" placeholder="Seu e-mail..."></devkit-input>
510
+ </div>
511
+ <hlm-dialog-footer>
512
+ <button hlmBtn variant="outline" hlmDialogClose>Cancelar</button>
513
+ <button hlmBtn hlmDialogClose>Salvar alterações</button>
514
+ </hlm-dialog-footer>
515
+ </hlm-dialog-content>
516
+ </hlm-dialog>
517
+
518
+ <hlm-alert-dialog>
519
+ <button hlmBtn variant="secondary" hlmAlertDialogTrigger>Abrir Alert Dialog Crítico</button>
520
+ <hlm-alert-dialog-content>
521
+ <hlm-alert-dialog-header>
522
+ <h3 hlmAlertDialogTitle>Você tem certeza absoluta?</h3>
523
+ <p hlmAlertDialogDescription>Esta ação não pode ser desfeita. Isso excluirá permanentemente sua conta e removerá seus dados de nossos servidores.</p>
524
+ </hlm-alert-dialog-header>
525
+ <hlm-alert-dialog-footer>
526
+ <button hlmAlertDialogCancel>Cancelar</button>
527
+ <button hlmAlertDialogAction variant="destructive">Sim, excluir conta</button>
528
+ </hlm-alert-dialog-footer>
529
+ </hlm-alert-dialog-content>
530
+ </hlm-alert-dialog>
531
+ </div>
532
+ </div>
533
+
534
+ <!-- Sessão de Menu Suspenso -->
535
+ <div class="space-y-4">
536
+ <h2 class="text-xl font-bold text-foreground">10. Menu Suspenso (hlm-dropdown-menu)</h2>
537
+ <div class="rounded-xl border border-border bg-card p-6">
538
+ <button hlmBtn variant="outline" [hlmDropdownMenuTrigger]="accountMenu">
539
+ Opções da Conta
540
+ <svg class="ml-2 h-4 w-4" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">
541
+ <path stroke-linecap="round" stroke-linejoin="round" d="M19 9l-7 7-7-7" />
542
+ </svg>
543
+ </button>
544
+
545
+ <ng-template #accountMenu>
546
+ <hlm-dropdown-menu>
547
+ <hlm-dropdown-menu-label>Minha Conta</hlm-dropdown-menu-label>
548
+ <button hlmDropdownMenuItem>Perfil <hlm-dropdown-menu-shortcut>⇧⌘P</hlm-dropdown-menu-shortcut></button>
549
+ <button hlmDropdownMenuItem>Cobrança <hlm-dropdown-menu-shortcut>⌘B</hlm-dropdown-menu-shortcut></button>
550
+ <button hlmDropdownMenuItem>Configurações <hlm-dropdown-menu-shortcut>⌘S</hlm-dropdown-menu-shortcut></button>
551
+ <hlm-dropdown-menu-separator />
552
+ <button hlmDropdownMenuItem>Equipe</button>
553
+ <button hlmDropdownMenuItem>Convidar usuários</button>
554
+ <hlm-dropdown-menu-separator />
555
+ <button hlmDropdownMenuItem variant="destructive">Sair da conta <hlm-dropdown-menu-shortcut>⇧⌘Q</hlm-dropdown-menu-shortcut></button>
556
+ </hlm-dropdown-menu>
557
+ </ng-template>
558
+ </div>
559
+ </div>
560
+ </div>
561
+ `,
562
+ css: `:host {
563
+ display: block;
564
+ min-height: 100vh;
565
+ background-color: var(--background);
566
+ color: var(--foreground);
567
+ }
568
+ `
569
+ };
570
+ }
@@ -0,0 +1 @@
1
+ export declare function devkitLocalReadmeTemplate(): string;
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.devkitLocalReadmeTemplate = devkitLocalReadmeTemplate;
4
+ function devkitLocalReadmeTemplate() {
5
+ return `# Design System local do app
6
+
7
+ Este diretorio e gerado pelo DT-DevKit, mas pertence a este app.
8
+
9
+ A regra principal e: o DevKit entrega um ponto de partida editavel. Os componentes \`devkit-*\` sao wrappers locais usados pelo CRUD, layouts e telas geradas. A implementacao visual usa primitives reais do Spartan Helm gerados em \`libs/ui\`.
10
+
11
+ ## Como customizar
12
+
13
+ - Ajustes especificos deste app: edite os componentes neste diretorio.
14
+ - Paleta, dark/light e tokens runtime: ajuste \`devkit.css\` ou a configuracao de tema do app.
15
+ - Style oficial do Spartan: rode \`devstroupe ui:set-style <style>\` usando \`nova\`, \`vega\`, \`lyra\`, \`maia\`, \`mira\` ou \`luma\`.
16
+ - Customizacao padrao para apps futuros: altere os templates do DT-DevKit e gere novos projetos.
17
+
18
+ ## Limite importante
19
+
20
+ Mudar o DT-DevKit no monorepo nao altera automaticamente apps ja gerados. Cada app tem sua propria copia local dos wrappers e sua propria \`libs/ui\`. Para aplicar uma evolucao do DevKit em um app existente, rode a CLI conscientemente ou migre os arquivos desejados.
21
+ `;
22
+ }
23
+ // 2. Template do devkit-button
@@ -0,0 +1 @@
1
+ export declare function hexToHsl(hex: string): string;
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.hexToHsl = hexToHsl;
4
+ function hexToHsl(hex) {
5
+ hex = hex.replace(/^#/, '');
6
+ if (hex.length === 3) {
7
+ hex = hex.split('').map(char => char + char).join('');
8
+ }
9
+ let r = parseInt(hex.substring(0, 2), 16) / 255;
10
+ let g = parseInt(hex.substring(2, 4), 16) / 255;
11
+ let b = parseInt(hex.substring(4, 6), 16) / 255;
12
+ let max = Math.max(r, g, b), min = Math.min(r, g, b);
13
+ let h = 0, s = 0, l = (max + min) / 2;
14
+ if (max !== min) {
15
+ let d = max - min;
16
+ s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
17
+ switch (max) {
18
+ case r:
19
+ h = (g - b) / d + (g < b ? 6 : 0);
20
+ break;
21
+ case g:
22
+ h = (b - r) / d + 2;
23
+ break;
24
+ case b:
25
+ h = (r - g) / d + 4;
26
+ break;
27
+ }
28
+ h /= 6;
29
+ }
30
+ return `${Math.round(h * 360)} ${Math.round(s * 100)}% ${Math.round(l * 100)}%`;
31
+ }
@@ -0,0 +1,5 @@
1
+ export declare function devkitProfileComponentTemplate(): {
2
+ ts: string;
3
+ html: string;
4
+ css: string;
5
+ };