diff --git a/.postcssrc.json b/.postcssrc.json new file mode 100644 index 000000000..e092dc7c1 --- /dev/null +++ b/.postcssrc.json @@ -0,0 +1,5 @@ +{ + "plugins": { + "@tailwindcss/postcss": {} + } +} diff --git a/apps/angular/1-projection/src/app/app.component.ts b/apps/angular/1-projection/src/app/app.component.ts index df654bbc2..75dc670bc 100644 --- a/apps/angular/1-projection/src/app/app.component.ts +++ b/apps/angular/1-projection/src/app/app.component.ts @@ -5,6 +5,7 @@ import { TeacherCardComponent } from './component/teacher-card/teacher-card.comp @Component({ selector: 'app-root', + standalone: true, template: `
diff --git a/apps/angular/1-projection/src/app/component/city-card/city-card.component.ts b/apps/angular/1-projection/src/app/component/city-card/city-card.component.ts index 8895c8c84..07de0d625 100644 --- a/apps/angular/1-projection/src/app/component/city-card/city-card.component.ts +++ b/apps/angular/1-projection/src/app/component/city-card/city-card.component.ts @@ -1,9 +1,38 @@ -import { ChangeDetectionStrategy, Component } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { Component, OnInit } from '@angular/core'; +import { CityStore } from '../../data-access/city.store'; +import { FakeHttpService } from '../../data-access/fake-http.service'; +import { CardType } from '../../model/card.model'; +import { CardComponent } from '../../ui/card/card.component'; @Component({ selector: 'app-city-card', - template: 'TODO City', - imports: [], - changeDetection: ChangeDetectionStrategy.OnPush, + template: ` + + + + + + `, + standalone: true, + imports: [CommonModule, CardComponent], + // changeDetection: ChangeDetectionStrategy.OnPush, }) -export class CityCardComponent {} +export class CityCardComponent implements OnInit { + // private http = inject(FakeHttpService); + // private store = inject(CityStore); + + constructor( + private http: FakeHttpService, + private store: CityStore, + ) {} + + cities = this.store.cities; + cardType = CardType.CITY; + + ngOnInit() { + this.http.fetchCities$.subscribe((c) => { + this.store.addAll(c); + }); + } +} diff --git a/apps/angular/1-projection/src/app/component/student-card/student-card.component.ts b/apps/angular/1-projection/src/app/component/student-card/student-card.component.ts index bdfa4abd4..9a2df8a4b 100644 --- a/apps/angular/1-projection/src/app/component/student-card/student-card.component.ts +++ b/apps/angular/1-projection/src/app/component/student-card/student-card.component.ts @@ -1,3 +1,4 @@ +import { CommonModule } from '@angular/common'; import { ChangeDetectionStrategy, Component, @@ -15,7 +16,12 @@ import { CardComponent } from '../../ui/card/card.component'; + + + + `, styles: [ ` @@ -24,7 +30,8 @@ import { CardComponent } from '../../ui/card/card.component'; } `, ], - imports: [CardComponent], + imports: [CardComponent, CommonModule], + standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, }) export class StudentCardComponent implements OnInit { diff --git a/apps/angular/1-projection/src/app/component/teacher-card/teacher-card.component.ts b/apps/angular/1-projection/src/app/component/teacher-card/teacher-card.component.ts index adf0ad3c1..2ef8a5576 100644 --- a/apps/angular/1-projection/src/app/component/teacher-card/teacher-card.component.ts +++ b/apps/angular/1-projection/src/app/component/teacher-card/teacher-card.component.ts @@ -1,3 +1,4 @@ +import { CommonModule } from '@angular/common'; import { Component, inject, OnInit } from '@angular/core'; import { FakeHttpService } from '../../data-access/fake-http.service'; import { TeacherStore } from '../../data-access/teacher.store'; @@ -5,12 +6,18 @@ import { CardType } from '../../model/card.model'; import { CardComponent } from '../../ui/card/card.component'; @Component({ + standalone: true, selector: 'app-teacher-card', template: ` + [template]="images" + customClass="bg-light-red"> + + + + `, styles: [ ` @@ -19,7 +26,7 @@ import { CardComponent } from '../../ui/card/card.component'; } `, ], - imports: [CardComponent], + imports: [CommonModule, CardComponent], }) export class TeacherCardComponent implements OnInit { private http = inject(FakeHttpService); diff --git a/apps/angular/1-projection/src/app/data-access/city.store.ts b/apps/angular/1-projection/src/app/data-access/city.store.ts index a8b523569..9fbcb346b 100644 --- a/apps/angular/1-projection/src/app/data-access/city.store.ts +++ b/apps/angular/1-projection/src/app/data-access/city.store.ts @@ -5,7 +5,7 @@ import { City } from '../model/city.model'; providedIn: 'root', }) export class CityStore { - private cities = signal([]); + public cities = signal([]); addAll(cities: City[]) { this.cities.set(cities); diff --git a/apps/angular/1-projection/src/app/ui/card/card.component.ts b/apps/angular/1-projection/src/app/ui/card/card.component.ts index 1a6c3648c..0ea649fcb 100644 --- a/apps/angular/1-projection/src/app/ui/card/card.component.ts +++ b/apps/angular/1-projection/src/app/ui/card/card.component.ts @@ -1,6 +1,11 @@ -import { NgOptimizedImage } from '@angular/common'; -import { Component, inject, input } from '@angular/core'; -import { randStudent, randTeacher } from '../../data-access/fake-http.service'; +import { CommonModule } from '@angular/common'; +import { Component, inject, input, Input, TemplateRef } from '@angular/core'; +import { CityStore } from '../../data-access/city.store'; +import { + randomCity, + randStudent, + randTeacher, +} from '../../data-access/fake-http.service'; import { StudentStore } from '../../data-access/student.store'; import { TeacherStore } from '../../data-access/teacher.store'; import { CardType } from '../../model/card.model'; @@ -12,12 +17,8 @@ import { ListItemComponent } from '../list-item/list-item.component';
- @if (type() === CardType.TEACHER) { - - } - @if (type() === CardType.STUDENT) { - - } + < +
@for (item of list(); track item) { @@ -27,7 +28,7 @@ import { ListItemComponent } from '../list-item/list-item.component'; [type]="type()"> }
- +
`, - imports: [ListItemComponent, NgOptimizedImage], + imports: [ListItemComponent, CommonModule], + standalone: true, }) export class CardComponent { + @Input() template!: TemplateRef; private teacherStore = inject(TeacherStore); private studentStore = inject(StudentStore); + private cityStore = inject(CityStore); + store = input(null); readonly list = input(null); readonly type = input.required(); @@ -53,6 +58,8 @@ export class CardComponent { this.teacherStore.addOne(randTeacher()); } else if (type === CardType.STUDENT) { this.studentStore.addOne(randStudent()); + } else if (type === CardType.CITY) { + this.cityStore.addOne(randomCity()); } } } diff --git a/apps/angular/1-projection/src/app/ui/list-item/list-item.component.ts b/apps/angular/1-projection/src/app/ui/list-item/list-item.component.ts index 5d504f372..aabe9bd95 100644 --- a/apps/angular/1-projection/src/app/ui/list-item/list-item.component.ts +++ b/apps/angular/1-projection/src/app/ui/list-item/list-item.component.ts @@ -1,15 +1,12 @@ -import { - ChangeDetectionStrategy, - Component, - inject, - input, -} from '@angular/core'; -import { StudentStore } from '../../data-access/student.store'; -import { TeacherStore } from '../../data-access/teacher.store'; +import { ChangeDetectionStrategy, Component, input } from '@angular/core'; import { CardType } from '../../model/card.model'; +import { CityStore } from './../../data-access/city.store'; +import { StudentStore } from './../../data-access/student.store'; +import { TeacherStore } from './../../data-access/teacher.store'; @Component({ selector: 'app-list-item', + standalone: true, template: `
{{ name() }} @@ -21,8 +18,15 @@ import { CardType } from '../../model/card.model'; changeDetection: ChangeDetectionStrategy.OnPush, }) export class ListItemComponent { - private teacherStore = inject(TeacherStore); - private studentStore = inject(StudentStore); + // private teacherStore = inject(TeacherStore); + // private studentStore = inject(StudentStore); + // private CityStore= inject(CityStore) + + constructor( + private teacherStore: TeacherStore, + private studentStore: StudentStore, + private cityStore: CityStore, + ) {} readonly id = input.required(); readonly name = input.required(); @@ -32,6 +36,8 @@ export class ListItemComponent { const type = this.type(); if (type === CardType.TEACHER) { this.teacherStore.deleteOne(id); + } else if (type === CardType.CITY) { + this.cityStore.deleteOne(id); } else if (type === CardType.STUDENT) { this.studentStore.deleteOne(id); } diff --git a/apps/angular/5-crud-application/src/app/app.component.ts b/apps/angular/5-crud-application/src/app/app.component.ts index 3836dd6c7..c79df1785 100644 --- a/apps/angular/5-crud-application/src/app/app.component.ts +++ b/apps/angular/5-crud-application/src/app/app.component.ts @@ -1,50 +1,50 @@ import { CommonModule } from '@angular/common'; import { HttpClient } from '@angular/common/http'; -import { Component, inject, OnInit } from '@angular/core'; -import { randText } from '@ngneat/falso'; +import { Component, OnInit } from '@angular/core'; +import { randText, Todo } from '@ngneat/falso'; +import { AppService } from '../services/app.service'; @Component({ imports: [CommonModule], selector: 'app-root', template: ` - @for (todo of todos; track todo.id) { - {{ todo.title }} - - } +
+ @for (todo of todos; track todo.id) { +
+ {{ todo.title }} + + +
+ } +
`, styles: [], }) export class AppComponent implements OnInit { - private http = inject(HttpClient); + constructor( + private appService: AppService, + private http: HttpClient, + ) {} todos!: any[]; ngOnInit(): void { - this.http - .get('https://jsonplaceholder.typicode.com/todos') - .subscribe((todos) => { - this.todos = todos; - }); + this.appService.getTodos(); + this.appService.todosBehavior.subscribe((todos) => { + this.todos = todos; + }); } - update(todo: any) { - this.http - .put( - `https://jsonplaceholder.typicode.com/todos/${todo.id}`, - JSON.stringify({ - todo: todo.id, - title: randText(), - body: todo.body, - userId: todo.userId, - }), - { - headers: { - 'Content-type': 'application/json; charset=UTF-8', - }, - }, - ) - .subscribe((todoUpdated: any) => { - this.todos[todoUpdated.id - 1] = todoUpdated; - }); + update(todo: Todo) { + const updatedTodo: Todo = { + id: todo.id, + title: randText(), + completed: false, + }; + + this.appService.updateTodo(todo.id, updatedTodo); + } + delete(todo: Todo) { + this.appService.deleteTodo(todo.id); } } diff --git a/apps/angular/5-crud-application/src/app/app.config.ts b/apps/angular/5-crud-application/src/app/app.config.ts index 1c0c9422f..e978e448e 100644 --- a/apps/angular/5-crud-application/src/app/app.config.ts +++ b/apps/angular/5-crud-application/src/app/app.config.ts @@ -1,6 +1,11 @@ import { provideHttpClient } from '@angular/common/http'; import { ApplicationConfig } from '@angular/core'; +import { + provideTanStackQuery, + QueryClient, +} from '@tanstack/angular-query-experimental'; + export const appConfig: ApplicationConfig = { - providers: [provideHttpClient()], + providers: [provideHttpClient(), provideTanStackQuery(new QueryClient())], }; diff --git a/apps/angular/5-crud-application/src/app/todo-item.component.ts b/apps/angular/5-crud-application/src/app/todo-item.component.ts new file mode 100644 index 000000000..a301b5b55 --- /dev/null +++ b/apps/angular/5-crud-application/src/app/todo-item.component.ts @@ -0,0 +1,105 @@ +import { + ChangeDetectionStrategy, + Component, + inject, + Input, + signal, + WritableSignal, +} from '@angular/core'; +import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; +import { + injectMutation, + QueryClient, +} from '@tanstack/angular-query-experimental'; +import { lastValueFrom } from 'rxjs'; +import { Todo } from '../model/todo'; +import { todoKeys } from './todo.factory'; +import { TodoService } from './todo.service'; + +@Component({ + selector: 'app-todo-item', + imports: [MatProgressSpinnerModule], + template: ` + @if (updateTodo.isPending() || deleteTodo.isPending()) { + + } + @if (updateTodo.isError()) { + An error has occured: {{ updateTodo.error() }} + } + @if (deleteTodo.isError()) { + An error has occured: {{ deleteTodo.error() }} + } + @if (todoSignal() && !updateTodo.isPending() && !deleteTodo.isPending()) { + {{ todoSignal()!.title }} + + + } + `, + styles: [ + ` + :host { + display: flex; + gap: 3px; + .error { + color: red; + } + } + `, + ], + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: true, +}) +export class TodoItemComponent { + //Cach 1 + todoSignal: WritableSignal = signal(undefined); + + @Input({ required: true }) set todo(todo: Todo) { + this.todoSignal.set(todo); + } + queryClient = inject(QueryClient); + + constructor(private todoService: TodoService) {} + + updateTodo = injectMutation(() => ({ + mutationFn: (todoId: number) => { + return lastValueFrom(this.todoService.updateTodo(todoId)); + }, + onSuccess: (data) => { + this.queryClient.setQueryData(todoKeys.all, (oldTodos: Todo[]) => { + return oldTodos + ? oldTodos.map((t) => (t.id === data.id ? data : t)) + : oldTodos; + }); + }, + onSettled: (data, error, variables, context) => { + const todos: Todo[] | undefined = this.queryClient.getQueryData( + todoKeys.all, + ); + if (todos) { + console.log(todos[variables]); + } + }, + })); + + deleteTodo = injectMutation(() => ({ + mutationFn: (todoId: number) => { + return lastValueFrom(this.todoService.deleteTodo(todoId)); + }, + onSuccess: (_, variable) => { + this.queryClient.setQueryData(todoKeys.all, (oldTodos: Todo[]) => { + return oldTodos ? oldTodos.filter((t) => t.id !== variable) : oldTodos; + }); + }, + onSettled: (data, error, variables, context) => { + console.log(this.queryClient.getQueryData(todoKeys.all)); + }, + })); + + updateTodos(todoId: number) { + this.updateTodo.mutate(todoId); + } + + deleteTodos(todoId: number) { + this.deleteTodo.mutate(todoId); + } +} diff --git a/apps/angular/5-crud-application/src/app/todo.factory.ts b/apps/angular/5-crud-application/src/app/todo.factory.ts new file mode 100644 index 000000000..f48f75764 --- /dev/null +++ b/apps/angular/5-crud-application/src/app/todo.factory.ts @@ -0,0 +1,3 @@ +export const todoKeys = { + all: ['todos'] as const, +}; diff --git a/apps/angular/5-crud-application/src/app/todo.service.ts b/apps/angular/5-crud-application/src/app/todo.service.ts new file mode 100644 index 000000000..7b90a209f --- /dev/null +++ b/apps/angular/5-crud-application/src/app/todo.service.ts @@ -0,0 +1,38 @@ +import { HttpClient } from '@angular/common/http'; +import { Injectable } from '@angular/core'; +import { randText } from '@ngneat/falso'; +import { Todo } from '../model/todo'; + +const baseURI = 'https://jsonplaceholder.typicode.com/todos'; + +@Injectable({ + providedIn: 'root', +}) +export class TodoService { + constructor(private http: HttpClient) {} + + getTodos() { + return this.http.get(`${baseURI}`); + } + + updateTodo(id: number) { + const updatedTodo = { + id, + title: randText(), + }; + + return this.http.put( + `${baseURI}/${id}`, + JSON.stringify(updatedTodo), + { + headers: { + 'Content-type': 'application/json; charset=UTF-8', + }, + }, + ); + } + + deleteTodo(id: number) { + return this.http.delete(`${baseURI}/${id}`); + } +} diff --git a/apps/angular/5-crud-application/src/app/todos.component.ts b/apps/angular/5-crud-application/src/app/todos.component.ts new file mode 100644 index 000000000..718c61e93 --- /dev/null +++ b/apps/angular/5-crud-application/src/app/todos.component.ts @@ -0,0 +1,38 @@ +import { CommonModule } from '@angular/common'; +import { ChangeDetectionStrategy, Component, inject } from '@angular/core'; +import { injectQuery } from '@tanstack/angular-query-experimental'; +import { lastValueFrom } from 'rxjs'; +import { TodoItemComponent } from './todo-item.component'; +import { TodoService } from './todo.service'; + +@Component({ + selector: 'app-todos', + template: ` +

Todos

+ @if (query.isPending()) { +

Loading...

+ } + @if (query.isError()) { +

Error: {{ query.error().message }}

+ } + @if (query.data(); as data) { +
+ @for (todo of query.data(); track todo.id) { + + } +
+ } + `, + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: true, + imports: [CommonModule, TodoItemComponent], +}) +export class TodosComponent { + private todoServiec = inject(TodoService); + + query = injectQuery(() => ({ + queryKey: ['todos'], + queryFn: () => lastValueFrom(this.todoServiec.getTodos()), + })); +} diff --git a/apps/angular/5-crud-application/src/index.html b/apps/angular/5-crud-application/src/index.html index b9ec0b609..1eebd474d 100644 --- a/apps/angular/5-crud-application/src/index.html +++ b/apps/angular/5-crud-application/src/index.html @@ -15,6 +15,6 @@ rel="stylesheet" /> - + diff --git a/apps/angular/5-crud-application/src/main.ts b/apps/angular/5-crud-application/src/main.ts index 9bb5c3023..71a2d91ab 100644 --- a/apps/angular/5-crud-application/src/main.ts +++ b/apps/angular/5-crud-application/src/main.ts @@ -1,8 +1,8 @@ import { appConfig } from './app/app.config'; +import { TodosComponent } from './app/todos.component'; import { bootstrapApplication } from '@angular/platform-browser'; -import { AppComponent } from './app/app.component'; -bootstrapApplication(AppComponent, appConfig).catch((err) => +bootstrapApplication(TodosComponent, appConfig).catch((err) => console.error(err), ); diff --git a/apps/angular/5-crud-application/src/model/todo.ts b/apps/angular/5-crud-application/src/model/todo.ts new file mode 100644 index 000000000..3f52a5fdd --- /dev/null +++ b/apps/angular/5-crud-application/src/model/todo.ts @@ -0,0 +1,6 @@ +export interface Todo { + id: number; + userId: number; + title: string; + completed: boolean; +} diff --git a/apps/angular/5-crud-application/src/services/app.service.ts b/apps/angular/5-crud-application/src/services/app.service.ts new file mode 100644 index 000000000..277ed456d --- /dev/null +++ b/apps/angular/5-crud-application/src/services/app.service.ts @@ -0,0 +1,46 @@ +import { HttpClient } from '@angular/common/http'; +import { Injectable } from '@angular/core'; +import { Todo } from '@ngneat/falso'; +import { BehaviorSubject } from 'rxjs'; + +const baseUri = 'https://jsonplaceholder.typicode.com/todos'; + +@Injectable({ + providedIn: 'root', +}) +export class AppService { + todos: Todo[] = []; + todosBehavior = new BehaviorSubject([]); + + constructor(private http: HttpClient) {} + + getTodos() { + this.http.get(`${baseUri}`).subscribe((todos) => { + this.todos = todos; + this.todosBehavior.next(todos); + }); + } + + updateTodo(todoId: string, updatedTodo: Todo) { + this.http + .put(`${baseUri}/${todoId}`, JSON.stringify(updatedTodo), { + headers: { + 'Content-type': 'application/json; charset=UTF-8', + }, + }) + .subscribe((todoUpdated) => { + this.todos = [ + ...this.todos.filter((t) => t.id !== todoId), + todoUpdated, + ]; + }); + this.todosBehavior.next(this.todos); + } + + deleteTodo(deletedTodoId: string) { + this.http.delete(`${baseUri}/${deletedTodoId}`).subscribe((val) => { + this.todos = [...this.todos.filter((t) => t.id !== deletedTodoId)]; + }); + this.todosBehavior.next(this.todos); + } +} diff --git a/apps/angular/5-crud-application/src/styles.scss b/apps/angular/5-crud-application/src/styles.scss index 5fb5bb00b..198654ac2 100644 --- a/apps/angular/5-crud-application/src/styles.scss +++ b/apps/angular/5-crud-application/src/styles.scss @@ -1,4 +1,5 @@ /* You can add global styles to this file, and also import other style files */ + html, body { height: 100%; diff --git a/apps/angular/8-pure-pipe/src/app/app.component.ts b/apps/angular/8-pure-pipe/src/app/app.component.ts index 930fe1313..7c2a68f8a 100644 --- a/apps/angular/8-pure-pipe/src/app/app.component.ts +++ b/apps/angular/8-pure-pipe/src/app/app.component.ts @@ -1,12 +1,14 @@ import { Component } from '@angular/core'; +import { HeavyComputationPipe } from './heavy-computation.pipe'; @Component({ selector: 'app-root', template: ` @for (person of persons; track person) { - {{ heavyComputation(person, $index) }} + {{ person | heavyComputation: $index }} } `, + imports: [HeavyComputationPipe], }) export class AppComponent { persons = ['toto', 'jack']; diff --git a/apps/angular/8-pure-pipe/src/app/heavy-computation.pipe.ts b/apps/angular/8-pure-pipe/src/app/heavy-computation.pipe.ts new file mode 100644 index 000000000..511a26a9b --- /dev/null +++ b/apps/angular/8-pure-pipe/src/app/heavy-computation.pipe.ts @@ -0,0 +1,10 @@ +import { Pipe, PipeTransform } from '@angular/core'; + +@Pipe({ + name: 'heavyComputation', +}) +export class HeavyComputationPipe implements PipeTransform { + transform(name: string, index: number): string { + return `${name} - ${index}`; + } +} diff --git a/apps/angular/8-pure-pipe/src/app/person.model.ts b/apps/angular/8-pure-pipe/src/app/person.model.ts new file mode 100644 index 000000000..437bc7be7 --- /dev/null +++ b/apps/angular/8-pure-pipe/src/app/person.model.ts @@ -0,0 +1,4 @@ +export interface Person { + name: string; + index: number; +} diff --git a/package-lock.json b/package-lock.json index 952106675..35bd6597b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26,9 +26,10 @@ "@ngrx/operators": "19.0.1", "@nx/angular": "20.6.4", "@swc/helpers": "0.5.12", - "@tanstack/angular-query-experimental": "5.62.3", + "@tailwindcss/postcss": "^4.1.10", + "@tanstack/angular-query-experimental": "^5.62.3", "rxjs": "7.8.1", - "tailwindcss": "3.4.3", + "tailwindcss": "^3.4.3", "tslib": "^2.3.0", "zone.js": "0.15.0" }, @@ -86,7 +87,7 @@ "lint-staged": "^13.0.3", "ng-packagr": "19.2.0", "nx": "20.6.4", - "postcss": "^8.4.5", + "postcss": "^8.5.6", "postcss-import": "~14.1.0", "postcss-preset-env": "~7.5.0", "postcss-url": "~10.1.3", @@ -5350,7 +5351,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", - "dev": true, "license": "ISC", "dependencies": { "minipass": "^7.0.4" @@ -10974,6 +10974,347 @@ "tailwindcss": ">=3.0.0 || >= 3.0.0-alpha.1 || >= 4.0.0-alpha.20" } }, + "node_modules/@tailwindcss/node": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.10.tgz", + "integrity": "sha512-2ACf1znY5fpRBwRhMgj9ZXvb2XZW8qs+oTfotJ2C5xR0/WNL7UHZ7zXl6s+rUqedL1mNi+0O+WQr5awGowS3PQ==", + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.3.0", + "enhanced-resolve": "^5.18.1", + "jiti": "^2.4.2", + "lightningcss": "1.30.1", + "magic-string": "^0.30.17", + "source-map-js": "^1.2.1", + "tailwindcss": "4.1.10" + } + }, + "node_modules/@tailwindcss/node/node_modules/jiti": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz", + "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==", + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/@tailwindcss/node/node_modules/tailwindcss": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.10.tgz", + "integrity": "sha512-P3nr6WkvKV/ONsTzj6Gb57sWPMX29EPNPopo7+FcpkQaNsrNpZ1pv8QmrYI2RqEKD7mlGqLnGovlcYnBK0IqUA==", + "license": "MIT" + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.10.tgz", + "integrity": "sha512-v0C43s7Pjw+B9w21htrQwuFObSkio2aV/qPx/mhrRldbqxbWJK6KizM+q7BF1/1CmuLqZqX3CeYF7s7P9fbA8Q==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "detect-libc": "^2.0.4", + "tar": "^7.4.3" + }, + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.1.10", + "@tailwindcss/oxide-darwin-arm64": "4.1.10", + "@tailwindcss/oxide-darwin-x64": "4.1.10", + "@tailwindcss/oxide-freebsd-x64": "4.1.10", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.10", + "@tailwindcss/oxide-linux-arm64-gnu": "4.1.10", + "@tailwindcss/oxide-linux-arm64-musl": "4.1.10", + "@tailwindcss/oxide-linux-x64-gnu": "4.1.10", + "@tailwindcss/oxide-linux-x64-musl": "4.1.10", + "@tailwindcss/oxide-wasm32-wasi": "4.1.10", + "@tailwindcss/oxide-win32-arm64-msvc": "4.1.10", + "@tailwindcss/oxide-win32-x64-msvc": "4.1.10" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.10.tgz", + "integrity": "sha512-VGLazCoRQ7rtsCzThaI1UyDu/XRYVyH4/EWiaSX6tFglE+xZB5cvtC5Omt0OQ+FfiIVP98su16jDVHDEIuH4iQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.10.tgz", + "integrity": "sha512-ZIFqvR1irX2yNjWJzKCqTCcHZbgkSkSkZKbRM3BPzhDL/18idA8uWCoopYA2CSDdSGFlDAxYdU2yBHwAwx8euQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.10.tgz", + "integrity": "sha512-eCA4zbIhWUFDXoamNztmS0MjXHSEJYlvATzWnRiTqJkcUteSjO94PoRHJy1Xbwp9bptjeIxxBHh+zBWFhttbrQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.10.tgz", + "integrity": "sha512-8/392Xu12R0cc93DpiJvNpJ4wYVSiciUlkiOHOSOQNH3adq9Gi/dtySK7dVQjXIOzlpSHjeCL89RUUI8/GTI6g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.10.tgz", + "integrity": "sha512-t9rhmLT6EqeuPT+MXhWhlRYIMSfh5LZ6kBrC4FS6/+M1yXwfCtp24UumgCWOAJVyjQwG+lYva6wWZxrfvB+NhQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.10.tgz", + "integrity": "sha512-3oWrlNlxLRxXejQ8zImzrVLuZ/9Z2SeKoLhtCu0hpo38hTO2iL86eFOu4sVR8cZc6n3z7eRXXqtHJECa6mFOvA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.10.tgz", + "integrity": "sha512-saScU0cmWvg/Ez4gUmQWr9pvY9Kssxt+Xenfx1LG7LmqjcrvBnw4r9VjkFcqmbBb7GCBwYNcZi9X3/oMda9sqQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.10.tgz", + "integrity": "sha512-/G3ao/ybV9YEEgAXeEg28dyH6gs1QG8tvdN9c2MNZdUXYBaIY/Gx0N6RlJzfLy/7Nkdok4kaxKPHKJUlAaoTdA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.10.tgz", + "integrity": "sha512-LNr7X8fTiKGRtQGOerSayc2pWJp/9ptRYAa4G+U+cjw9kJZvkopav1AQc5HHD+U364f71tZv6XamaHKgrIoVzA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.10.tgz", + "integrity": "sha512-d6ekQpopFQJAcIK2i7ZzWOYGZ+A6NzzvQ3ozBvWFdeyqfOZdYHU66g5yr+/HC4ipP1ZgWsqa80+ISNILk+ae/Q==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.3", + "@emnapi/runtime": "^1.4.3", + "@emnapi/wasi-threads": "^1.0.2", + "@napi-rs/wasm-runtime": "^0.2.10", + "@tybys/wasm-util": "^0.9.0", + "tslib": "^2.8.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.10.tgz", + "integrity": "sha512-i1Iwg9gRbwNVOCYmnigWCCgow8nDWSFmeTUU5nbNx3rqbe4p0kRbEqLwLJbYZKmSSp23g4N6rCDmm7OuPBXhDA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.10.tgz", + "integrity": "sha512-sGiJTjcBSfGq2DVRtaSljq5ZgZS2SDHSIfhOylkBvHVjwOsodBhnb3HdmiKkVuUGKD0I7G63abMOVaskj1KpOA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide/node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/@tailwindcss/oxide/node_modules/detect-libc": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", + "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/@tailwindcss/oxide/node_modules/mkdirp": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", + "license": "MIT", + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@tailwindcss/oxide/node_modules/tar": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", + "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", + "license": "ISC", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.0.1", + "mkdirp": "^3.0.1", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@tailwindcss/oxide/node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/@tailwindcss/postcss": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.1.10.tgz", + "integrity": "sha512-B+7r7ABZbkXJwpvt2VMnS6ujcDoR2OOcFaqrLIo1xbcdxje4Vf+VgJdBzNNbrAjBj/rLZ66/tlQ1knIGNLKOBQ==", + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "@tailwindcss/node": "4.1.10", + "@tailwindcss/oxide": "4.1.10", + "postcss": "^8.4.41", + "tailwindcss": "4.1.10" + } + }, + "node_modules/@tailwindcss/postcss/node_modules/tailwindcss": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.10.tgz", + "integrity": "sha512-P3nr6WkvKV/ONsTzj6Gb57sWPMX29EPNPopo7+FcpkQaNsrNpZ1pv8QmrYI2RqEKD7mlGqLnGovlcYnBK0IqUA==", + "license": "MIT" + }, "node_modules/@tanstack/angular-query-devtools-experimental": { "version": "5.38.0", "resolved": "https://registry.npmjs.org/@tanstack/angular-query-devtools-experimental/-/angular-query-devtools-experimental-5.38.0.tgz", @@ -22677,6 +23018,243 @@ } } }, + "node_modules/lightningcss": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.1.tgz", + "integrity": "sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==", + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-darwin-arm64": "1.30.1", + "lightningcss-darwin-x64": "1.30.1", + "lightningcss-freebsd-x64": "1.30.1", + "lightningcss-linux-arm-gnueabihf": "1.30.1", + "lightningcss-linux-arm64-gnu": "1.30.1", + "lightningcss-linux-arm64-musl": "1.30.1", + "lightningcss-linux-x64-gnu": "1.30.1", + "lightningcss-linux-x64-musl": "1.30.1", + "lightningcss-win32-arm64-msvc": "1.30.1", + "lightningcss-win32-x64-msvc": "1.30.1" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.1.tgz", + "integrity": "sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.1.tgz", + "integrity": "sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.1.tgz", + "integrity": "sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.1.tgz", + "integrity": "sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==", + "cpu": [ + "arm" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.1.tgz", + "integrity": "sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.1.tgz", + "integrity": "sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.1.tgz", + "integrity": "sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.1.tgz", + "integrity": "sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.1.tgz", + "integrity": "sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.1.tgz", + "integrity": "sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss/node_modules/detect-libc": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", + "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, "node_modules/lilconfig": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", @@ -24283,7 +24861,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.2.tgz", "integrity": "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==", - "dev": true, "license": "MIT", "dependencies": { "minipass": "^7.1.2" diff --git a/package.json b/package.json index 892debfaf..24bb75b89 100644 --- a/package.json +++ b/package.json @@ -29,9 +29,10 @@ "@ngrx/operators": "19.0.1", "@nx/angular": "20.6.4", "@swc/helpers": "0.5.12", - "@tanstack/angular-query-experimental": "5.62.3", + "@tailwindcss/postcss": "^4.1.10", + "@tanstack/angular-query-experimental": "^5.62.3", "rxjs": "7.8.1", - "tailwindcss": "3.4.3", + "tailwindcss": "^3.4.3", "tslib": "^2.3.0", "zone.js": "0.15.0" }, @@ -89,7 +90,7 @@ "lint-staged": "^13.0.3", "ng-packagr": "19.2.0", "nx": "20.6.4", - "postcss": "^8.4.5", + "postcss": "^8.5.6", "postcss-import": "~14.1.0", "postcss-preset-env": "~7.5.0", "postcss-url": "~10.1.3",