diff --git a/.env b/.env index 7fa18084..125cf2f3 100644 --- a/.env +++ b/.env @@ -5,4 +5,4 @@ APP_KEY=1Ad59qH3RodlK8Py5hr2WA2VeNUXEqmL DRIVE_DISK=local SESSION_DRIVER=cookie CACHE_VIEWS=false -DB_CONNECTION=sqlite +DB_CONNECTION=sqlite \ No newline at end of file diff --git a/.gitignore b/.gitignore index af14e82a..c4acdcf3 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,4 @@ node_modules -build coverage .vscode .DS_STORE diff --git a/build/app/Controllers/Http/AuthController.js b/build/app/Controllers/Http/AuthController.js new file mode 100644 index 00000000..f17b4b3f --- /dev/null +++ b/build/app/Controllers/Http/AuthController.js @@ -0,0 +1,44 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const User_1 = __importDefault(global[Symbol.for('ioc.use')]("App/Models/User")); +const CreateUserValidator_1 = __importDefault(global[Symbol.for('ioc.use')]("App/Validators/CreateUserValidator")); +class AuthController { + async login({ view }) { + return view.render('auth/login'); + } + async doLogin({ request, auth, response, session }) { + const email = request.input('email'); + const password = request.input('password'); + try { + await auth.use('web').attempt(email, password); + response.redirect().toRoute('home'); + } + catch { + session.flash({ error: 'Identifiants incorrects' }); + response.redirect().toRoute('login'); + } + } + async signup({ view }) { + return view.render('auth/signup'); + } + async doSignup({ request, response, auth }) { + const playload = await request.validate(CreateUserValidator_1.default); + await User_1.default.create(playload); + try { + await auth.use('web').attempt(playload.email, playload.password); + response.redirect().toRoute('home'); + } + catch { + response.redirect().toRoute('login'); + } + } + async logout({ auth, response }) { + await auth.logout(); + return response.redirect().back(); + } +} +exports.default = AuthController; +//# sourceMappingURL=AuthController.js.map \ No newline at end of file diff --git a/build/app/Controllers/Http/AuthController.js.map b/build/app/Controllers/Http/AuthController.js.map new file mode 100644 index 00000000..c0ff60f7 --- /dev/null +++ b/build/app/Controllers/Http/AuthController.js.map @@ -0,0 +1 @@ +{"version":3,"file":"AuthController.js","sourceRoot":"","sources":["../../../../app/Controllers/Http/AuthController.ts"],"names":[],"mappings":";;;;;AACA,iFAAmC;AACnC,mHAAqE;AAGrE,MAAqB,cAAc;IAEjC,KAAK,CAAC,KAAK,CAAC,EAAE,IAAI,EAAuB;QACvC,OAAO,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAA;IAClC,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAuB;QACrE,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;QACpC,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;QAE1C,IAAI;YACF,MAAM,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;YAC9C,QAAQ,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;SACpC;QAAC,MAAM;YACN,OAAO,CAAC,KAAK,CAAC,EAAC,KAAK,EAAE,yBAAyB,EAAC,CAAC,CAAA;YACjD,QAAQ,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;SACrC;IACH,CAAC;IAGD,KAAK,CAAC,MAAM,CAAC,EAAE,IAAI,EAAuB;QACxC,OAAO,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAA;IACnC,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAuB;QAC7D,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,6BAAmB,CAAC,CAAA;QAC5D,MAAM,cAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;QAC3B,IAAI;YACF,MAAM,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAA;YAChE,QAAQ,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;SACpC;QAAC,MAAM;YACN,QAAQ,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;SACrC;IACH,CAAC;IAGD,KAAK,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAsB;QACjD,MAAM,IAAI,CAAC,MAAM,EAAE,CAAA;QACnB,OAAO,QAAQ,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAA;IACpC,CAAC;CACD;AAxCD,iCAwCC"} \ No newline at end of file diff --git a/build/app/Controllers/Http/CompteController.js b/build/app/Controllers/Http/CompteController.js new file mode 100644 index 00000000..b33cd928 --- /dev/null +++ b/build/app/Controllers/Http/CompteController.js @@ -0,0 +1,36 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const ModifPseudoValidator_1 = __importDefault(global[Symbol.for('ioc.use')]("App/Validators/ModifPseudoValidator")); +const ModifEmailValidator_1 = __importDefault(global[Symbol.for('ioc.use')]("App/Validators/ModifEmailValidator")); +class CompteController { + async index({ view }) { + return view.render('compte'); + } + async modifpseudo({ request, auth, session, response }) { + const user = auth.user; + await request.validate(ModifPseudoValidator_1.default); + user.pseudo = request.input('pseudo'); + await user.save(); + session.flash({ success: "Username updated successfully" }); + response.redirect().back(); + } + async modifemail({ request, auth, session, response }) { + const user = auth.user; + await request.validate(ModifEmailValidator_1.default); + user.email = request.input('email'); + await user.save(); + session.flash({ success: "Email updated successfully" }); + response.redirect().back(); + } + async delete({ auth, response }) { + const user = auth.user; + await user.delete(); + await auth.logout(); + response.redirect().toRoute('home'); + } +} +exports.default = CompteController; +//# sourceMappingURL=CompteController.js.map \ No newline at end of file diff --git a/build/app/Controllers/Http/CompteController.js.map b/build/app/Controllers/Http/CompteController.js.map new file mode 100644 index 00000000..90c58198 --- /dev/null +++ b/build/app/Controllers/Http/CompteController.js.map @@ -0,0 +1 @@ +{"version":3,"file":"CompteController.js","sourceRoot":"","sources":["../../../../app/Controllers/Http/CompteController.ts"],"names":[],"mappings":";;;;;AACA,qHAAsE;AACtE,mHAAoE;AAEpE,MAAqB,gBAAgB;IAEnC,KAAK,CAAC,KAAK,CAAC,EAAE,IAAI,EAAuB;QACvC,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;IAC9B,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAuB;QACzE,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAA;QAEtB,MAAM,OAAO,CAAC,QAAQ,CAAC,8BAAoB,CAAC,CAAA;QAE5C,IAAK,CAAC,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;QACtC,MAAM,IAAK,CAAC,IAAI,EAAE,CAAA;QAClB,OAAO,CAAC,KAAK,CAAC,EAAC,OAAO,EAAE,+BAA+B,EAAC,CAAC,CAAA;QACzD,QAAQ,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAA;IAC5B,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAuB;QACxE,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAA;QAEtB,MAAM,OAAO,CAAC,QAAQ,CAAC,6BAAmB,CAAC,CAAA;QAE3C,IAAK,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;QACpC,MAAM,IAAK,CAAC,IAAI,EAAE,CAAA;QAClB,OAAO,CAAC,KAAK,CAAC,EAAC,OAAO,EAAE,4BAA4B,EAAC,CAAC,CAAA;QACtD,QAAQ,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAA;IAC5B,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAuB;QAClD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAA;QACtB,MAAM,IAAK,CAAC,MAAM,EAAE,CAAA;QACpB,MAAM,IAAI,CAAC,MAAM,EAAE,CAAA;QACnB,QAAQ,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;IACrC,CAAC;CAEF;AAnCD,mCAmCC"} \ No newline at end of file diff --git a/build/app/Middleware/Auth.js b/build/app/Middleware/Auth.js new file mode 100644 index 00000000..9b4976d6 --- /dev/null +++ b/build/app/Middleware/Auth.js @@ -0,0 +1,26 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const standalone_1 = require("@adonisjs/auth/build/standalone"); +class AuthMiddleware { + constructor() { + this.redirectTo = 'auth/login'; + } + async authenticate(auth, guards) { + let guardLastAttempted; + for (let guard of guards) { + guardLastAttempted = guard; + if (await auth.use(guard).check()) { + auth.defaultGuard = guard; + return true; + } + } + throw new standalone_1.AuthenticationException('Unauthorized access', 'E_UNAUTHORIZED_ACCESS', guardLastAttempted, this.redirectTo); + } + async handle({ auth }, next, customGuards) { + const guards = customGuards.length ? customGuards : [auth.name]; + await this.authenticate(auth, guards); + await next(); + } +} +exports.default = AuthMiddleware; +//# sourceMappingURL=Auth.js.map \ No newline at end of file diff --git a/build/app/Middleware/Auth.js.map b/build/app/Middleware/Auth.js.map new file mode 100644 index 00000000..17021d4b --- /dev/null +++ b/build/app/Middleware/Auth.js.map @@ -0,0 +1 @@ +{"version":3,"file":"Auth.js","sourceRoot":"","sources":["../../../app/Middleware/Auth.ts"],"names":[],"mappings":";;AAAA,gEAAyE;AAWzE,MAAqB,cAAc;IAAnC;QAIY,eAAU,GAAG,YAAY,CAAA;IA4DrC,CAAC;IAlDW,KAAK,CAAC,YAAY,CAAC,IAAiC,EAAE,MAA4B;QAO1F,IAAI,kBAAsC,CAAA;QAE1C,KAAK,IAAI,KAAK,IAAI,MAAM,EAAE;YACxB,kBAAkB,GAAG,KAAK,CAAA;YAE1B,IAAI,MAAM,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;gBAMjC,IAAI,CAAC,YAAY,GAAG,KAAK,CAAA;gBACzB,OAAO,IAAI,CAAA;aACZ;SACF;QAKD,MAAM,IAAI,oCAAuB,CAC/B,qBAAqB,EACrB,uBAAuB,EACvB,kBAAkB,EAClB,IAAI,CAAC,UAAU,CAChB,CAAA;IACH,CAAC;IAKM,KAAK,CAAC,MAAM,CACjB,EAAE,IAAI,EAAuB,EAC7B,IAAyB,EACzB,YAAkC;QAMlC,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC/D,MAAM,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;QACrC,MAAM,IAAI,EAAE,CAAA;IACd,CAAC;CACF;AAhED,iCAgEC"} \ No newline at end of file diff --git a/build/app/Middleware/SilentAuth.js b/build/app/Middleware/SilentAuth.js new file mode 100644 index 00000000..7d4c957f --- /dev/null +++ b/build/app/Middleware/SilentAuth.js @@ -0,0 +1,10 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +class SilentAuthMiddleware { + async handle({ auth }, next) { + await auth.check(); + await next(); + } +} +exports.default = SilentAuthMiddleware; +//# sourceMappingURL=SilentAuth.js.map \ No newline at end of file diff --git a/build/app/Middleware/SilentAuth.js.map b/build/app/Middleware/SilentAuth.js.map new file mode 100644 index 00000000..9a364285 --- /dev/null +++ b/build/app/Middleware/SilentAuth.js.map @@ -0,0 +1 @@ +{"version":3,"file":"SilentAuth.js","sourceRoot":"","sources":["../../../app/Middleware/SilentAuth.ts"],"names":[],"mappings":";;AAQA,MAAqB,oBAAoB;IAIhC,KAAK,CAAC,MAAM,CAAC,EAAE,IAAI,EAAuB,EAAE,IAAyB;QAK1E,MAAM,IAAI,CAAC,KAAK,EAAE,CAAA;QAClB,MAAM,IAAI,EAAE,CAAA;IACd,CAAC;CACF;AAZD,uCAYC"} \ No newline at end of file diff --git a/build/app/Models/User.js b/build/app/Models/User.js new file mode 100644 index 00000000..fe641617 --- /dev/null +++ b/build/app/Models/User.js @@ -0,0 +1,76 @@ +"use strict"; +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var __metadata = (this && this.__metadata) || function (k, v) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const luxon_1 = require("luxon"); +const Hash_1 = __importDefault(global[Symbol.for('ioc.use')]("Adonis/Core/Hash")); +const Orm_1 = global[Symbol.for('ioc.use')]("Adonis/Lucid/Orm"); +const ResponsiveAttachment_1 = global[Symbol.for('ioc.use')]("Adonis/Addons/ResponsiveAttachment"); +class User extends Orm_1.BaseModel { + get avatarUrl() { + if (this.avatar) { + return '/uploads/' + this.avatar.breakpoints.small.name; + } + return 'https://source.boringavatars.com/beam/40/${this.email}?colors=001449,012677,005BC5,00B4FC,17F9FF'; + } + static async hashPassword(user) { + if (user.$dirty.password) { + user.password = await Hash_1.default.make(user.password); + } + } +} +__decorate([ + (0, Orm_1.column)({ isPrimary: true }), + __metadata("design:type", Number) +], User.prototype, "id", void 0); +__decorate([ + (0, Orm_1.column)(), + __metadata("design:type", String) +], User.prototype, "pseudo", void 0); +__decorate([ + (0, Orm_1.column)(), + __metadata("design:type", String) +], User.prototype, "email", void 0); +__decorate([ + (0, Orm_1.column)({ serializeAs: null }), + __metadata("design:type", String) +], User.prototype, "password", void 0); +__decorate([ + (0, Orm_1.column)(), + __metadata("design:type", Object) +], User.prototype, "rememberMeToken", void 0); +__decorate([ + Orm_1.column.dateTime({ autoCreate: true }), + __metadata("design:type", luxon_1.DateTime) +], User.prototype, "createdAt", void 0); +__decorate([ + Orm_1.column.dateTime({ autoCreate: true, autoUpdate: true }), + __metadata("design:type", luxon_1.DateTime) +], User.prototype, "updatedAt", void 0); +__decorate([ + (0, ResponsiveAttachment_1.responsiveAttachment)({ preComputeUrls: true }), + __metadata("design:type", Object) +], User.prototype, "avatar", void 0); +__decorate([ + (0, Orm_1.computed)(), + __metadata("design:type", Object), + __metadata("design:paramtypes", []) +], User.prototype, "avatarUrl", null); +__decorate([ + (0, Orm_1.beforeSave)(), + __metadata("design:type", Function), + __metadata("design:paramtypes", [User]), + __metadata("design:returntype", Promise) +], User, "hashPassword", null); +exports.default = User; +//# sourceMappingURL=User.js.map \ No newline at end of file diff --git a/build/app/Models/User.js.map b/build/app/Models/User.js.map new file mode 100644 index 00000000..06a5a1aa --- /dev/null +++ b/build/app/Models/User.js.map @@ -0,0 +1 @@ +{"version":3,"file":"User.js","sourceRoot":"","sources":["../../../app/Models/User.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAAA,iCAAgC;AAChC,kFAAwC;AACxC,gEAA+E;AAC/E,mGAA4G;AAE5G,MAAqB,IAAK,SAAQ,eAAS;IA0BzC,IAAW,SAAS;QAClB,IAAI,IAAI,CAAC,MAAM,EAAE;YACf,OAAO,WAAW,GAAC,IAAI,CAAC,MAAM,CAAC,WAAY,CAAC,KAAK,CAAC,IAAI,CAAA;SACvD;QACD,OAAO,kGAAkG,CAAA;IAC3G,CAAC;IAGM,MAAM,CAAC,KAAK,CAAC,YAAY,CAAE,IAAU;QAC1C,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;YACxB,IAAI,CAAC,QAAQ,GAAG,MAAM,cAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;SAC/C;IACH,CAAC;CACF;AArCC;IADC,IAAA,YAAM,EAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;;gCACX;AAGjB;IADC,IAAA,YAAM,GAAE;;oCACY;AAGrB;IADC,IAAA,YAAM,GAAE;;mCACW;AAGpB;IADC,IAAA,YAAM,EAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;;sCACP;AAGvB;IADC,IAAA,YAAM,GAAE;;6CAC4B;AAGrC;IADC,YAAM,CAAC,QAAQ,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;8BACpB,gBAAQ;uCAAA;AAG1B;IADC,YAAM,CAAC,QAAQ,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;8BACtC,gBAAQ;uCAAA;AAG1B;IADC,IAAA,2CAAoB,EAAC,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC;;oCACJ;AAG3C;IADC,IAAA,cAAQ,GAAE;;;qCAMV;AAGD;IADC,IAAA,gBAAU,GAAE;;qCAC2B,IAAI;;8BAI3C;AAtCH,uBAuCC"} \ No newline at end of file diff --git a/build/app/Validators/CreateUserValidator.js b/build/app/Validators/CreateUserValidator.js new file mode 100644 index 00000000..65262dc3 --- /dev/null +++ b/build/app/Validators/CreateUserValidator.js @@ -0,0 +1,21 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const Validator_1 = global[Symbol.for('ioc.use')]("Adonis/Core/Validator"); +class CreateUserValidator { + constructor(ctx) { + this.ctx = ctx; + this.schema = Validator_1.schema.create({ + pseudo: Validator_1.schema.string(), + email: Validator_1.schema.string({}, [Validator_1.rules.email(), Validator_1.rules.unique({ table: 'users', column: 'email' })]), + password: Validator_1.schema.string({}, [Validator_1.rules.minLength(4), Validator_1.rules.confirmed()]) + }); + this.messages = { + required: 'The {{ field }} is required to create a new account', + 'email.email': 'Vous devez saisir un email dans le champ email', + 'email.unique': 'Email is already in use', + 'password.minLength': 'The password must be at least 4 characters long' + }; + } +} +exports.default = CreateUserValidator; +//# sourceMappingURL=CreateUserValidator.js.map \ No newline at end of file diff --git a/build/app/Validators/CreateUserValidator.js.map b/build/app/Validators/CreateUserValidator.js.map new file mode 100644 index 00000000..cd27e5e3 --- /dev/null +++ b/build/app/Validators/CreateUserValidator.js.map @@ -0,0 +1 @@ +{"version":3,"file":"CreateUserValidator.js","sourceRoot":"","sources":["../../../app/Validators/CreateUserValidator.ts"],"names":[],"mappings":";;AAAA,2EAA0E;AAG1E,MAAqB,mBAAmB;IACtC,YAAsB,GAAwB;QAAxB,QAAG,GAAH,GAAG,CAAqB;QAqBvC,WAAM,GAAG,kBAAM,CAAC,MAAM,CAAC;YAC5B,MAAM,EAAE,kBAAM,CAAC,MAAM,EAAE;YACvB,KAAK,EAAE,kBAAM,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,iBAAK,CAAC,KAAK,EAAE,EAAE,iBAAK,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAE,CAAC;YAC7F,QAAQ,EAAE,kBAAM,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,iBAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,iBAAK,CAAC,SAAS,EAAE,CAAE,CAAC;SACtE,CAAC,CAAA;QAaK,aAAQ,GAAmB;YAChC,QAAQ,EAAE,qDAAqD;YAC/D,aAAa,EAAE,gDAAgD;YAC/D,cAAc,EAAE,yBAAyB;YACzC,oBAAoB,EAAE,iDAAiD;SACxE,CAAA;IA3CgD,CAAC;CA4CnD;AA7CD,sCA6CC"} \ No newline at end of file diff --git a/build/app/Validators/ModifEmailValidator.js b/build/app/Validators/ModifEmailValidator.js new file mode 100644 index 00000000..b3b03548 --- /dev/null +++ b/build/app/Validators/ModifEmailValidator.js @@ -0,0 +1,18 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const Validator_1 = global[Symbol.for('ioc.use')]("Adonis/Core/Validator"); +class ModifEmailValidator { + constructor(ctx) { + this.ctx = ctx; + this.schema = Validator_1.schema.create({ + email: Validator_1.schema.string({}, [Validator_1.rules.email(), Validator_1.rules.unique({ table: 'users', column: 'email' })]) + }); + this.messages = { + required: 'The {{ field }} is required to modifie email', + 'email.email': 'You must enter an email in the email field', + 'email.unique': 'Email is already in use' + }; + } +} +exports.default = ModifEmailValidator; +//# sourceMappingURL=ModifEmailValidator.js.map \ No newline at end of file diff --git a/build/app/Validators/ModifEmailValidator.js.map b/build/app/Validators/ModifEmailValidator.js.map new file mode 100644 index 00000000..a07bc543 --- /dev/null +++ b/build/app/Validators/ModifEmailValidator.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ModifEmailValidator.js","sourceRoot":"","sources":["../../../app/Validators/ModifEmailValidator.ts"],"names":[],"mappings":";;AAAA,2EAA0E;AAG1E,MAAqB,mBAAmB;IACtC,YAAsB,GAAwB;QAAxB,QAAG,GAAH,GAAG,CAAqB;QAqBvC,WAAM,GAAG,kBAAM,CAAC,MAAM,CAAC;YAC5B,KAAK,EAAE,kBAAM,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,iBAAK,CAAC,KAAK,EAAE,EAAE,iBAAK,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAE,CAAC;SAC9F,CAAC,CAAA;QAaK,aAAQ,GAAmB;YAChC,QAAQ,EAAE,8CAA8C;YACxD,aAAa,EAAE,4CAA4C;YAC3D,cAAc,EAAE,yBAAyB;SAC1C,CAAA;IAxCgD,CAAC;CAyCnD;AA1CD,sCA0CC"} \ No newline at end of file diff --git a/build/app/Validators/ModifPseudoValidator.js b/build/app/Validators/ModifPseudoValidator.js new file mode 100644 index 00000000..2fac76c2 --- /dev/null +++ b/build/app/Validators/ModifPseudoValidator.js @@ -0,0 +1,17 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const Validator_1 = global[Symbol.for('ioc.use')]("Adonis/Core/Validator"); +class ModifPseudoValidator { + constructor(ctx) { + this.ctx = ctx; + this.schema = Validator_1.schema.create({ + pseudo: Validator_1.schema.string({}, [Validator_1.rules.minLength(3)]) + }); + this.messages = { + required: 'The {{ field }} is required to modifie pseudo', + 'pseudo.minLength': 'The pseudo must be at least 3 characters long' + }; + } +} +exports.default = ModifPseudoValidator; +//# sourceMappingURL=ModifPseudoValidator.js.map \ No newline at end of file diff --git a/build/app/Validators/ModifPseudoValidator.js.map b/build/app/Validators/ModifPseudoValidator.js.map new file mode 100644 index 00000000..c5a448f3 --- /dev/null +++ b/build/app/Validators/ModifPseudoValidator.js.map @@ -0,0 +1 @@ +{"version":3,"file":"ModifPseudoValidator.js","sourceRoot":"","sources":["../../../app/Validators/ModifPseudoValidator.ts"],"names":[],"mappings":";;AAAA,2EAA0E;AAG1E,MAAqB,oBAAoB;IACvC,YAAsB,GAAwB;QAAxB,QAAG,GAAH,GAAG,CAAqB;QAqBvC,WAAM,GAAG,kBAAM,CAAC,MAAM,CAAC;YAC5B,MAAM,EAAE,kBAAM,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,iBAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;SAChD,CAAC,CAAA;QAaK,aAAQ,GAAmB;YAChC,QAAQ,EAAE,+CAA+C;YACzD,kBAAkB,EAAE,+CAA+C;SACpE,CAAA;IAvCgD,CAAC;CAwCnD;AAzCD,uCAyCC"} \ No newline at end of file diff --git a/build/config/auth.js b/build/config/auth.js new file mode 100644 index 00000000..78bf1fa7 --- /dev/null +++ b/build/config/auth.js @@ -0,0 +1,41 @@ +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const authConfig = { + guard: 'web', + guards: { + web: { + driver: 'session', + provider: { + driver: 'lucid', + identifierKey: 'id', + uids: ['email'], + model: () => Promise.resolve().then(() => __importStar(global[Symbol.for('ioc.use')]('App/Models/User'))), + }, + }, + }, +}; +exports.default = authConfig; +//# sourceMappingURL=auth.js.map \ No newline at end of file diff --git a/build/config/auth.js.map b/build/config/auth.js.map new file mode 100644 index 00000000..61a7424b --- /dev/null +++ b/build/config/auth.js.map @@ -0,0 +1 @@ +{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../config/auth.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAkBA,MAAM,UAAU,GAAe;IAC7B,KAAK,EAAE,KAAK;IACZ,MAAM,EAAE;QAWN,GAAG,EAAE;YACH,MAAM,EAAE,SAAS;YAEjB,QAAQ,EAAE;gBASR,MAAM,EAAE,OAAO;gBAWf,aAAa,EAAE,IAAI;gBAYnB,IAAI,EAAE,CAAC,OAAO,CAAC;gBAaf,KAAK,EAAE,GAAG,EAAE,yEAAQ,iBAAiB,GAAC;aACvC;SACF;KACF;CACF,CAAA;AAED,kBAAe,UAAU,CAAA"} \ No newline at end of file diff --git a/build/config/database.js b/build/config/database.js new file mode 100644 index 00000000..59f3ff5b --- /dev/null +++ b/build/config/database.js @@ -0,0 +1,31 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const Env_1 = __importDefault(global[Symbol.for('ioc.use')]("Adonis/Core/Env")); +const Application_1 = __importDefault(global[Symbol.for('ioc.use')]("Adonis/Core/Application")); +const databaseConfig = { + connection: Env_1.default.get('DB_CONNECTION'), + connections: { + sqlite: { + client: 'sqlite', + connection: { + filename: Application_1.default.tmpPath('db.sqlite3'), + }, + pool: { + afterCreate: (conn, cb) => { + conn.run('PRAGMA foreign_keys=true', cb); + } + }, + migrations: { + naturalSort: true, + }, + useNullAsDefault: true, + healthCheck: false, + debug: false, + }, + } +}; +exports.default = databaseConfig; +//# sourceMappingURL=database.js.map \ No newline at end of file diff --git a/build/config/database.js.map b/build/config/database.js.map new file mode 100644 index 00000000..584f6db7 --- /dev/null +++ b/build/config/database.js.map @@ -0,0 +1 @@ +{"version":3,"file":"database.js","sourceRoot":"","sources":["../../config/database.ts"],"names":[],"mappings":";;;;;AAOA,gFAAsC;AACtC,gGAAsD;AAGtD,MAAM,cAAc,GAAmB;IAWrC,UAAU,EAAE,aAAG,CAAC,GAAG,CAAC,eAAe,CAAC;IAEpC,WAAW,EAAE;QAYX,MAAM,EAAE;YACN,MAAM,EAAE,QAAQ;YAChB,UAAU,EAAE;gBACV,QAAQ,EAAE,qBAAW,CAAC,OAAO,CAAC,YAAY,CAAC;aAC5C;YACD,IAAI,EAAE;gBACJ,WAAW,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE;oBACxB,IAAI,CAAC,GAAG,CAAC,0BAA0B,EAAE,EAAE,CAAC,CAAA;gBAC1C,CAAC;aACF;YACD,UAAU,EAAE;gBACV,WAAW,EAAE,IAAI;aAClB;YACD,gBAAgB,EAAE,IAAI;YACtB,WAAW,EAAE,KAAK;YAClB,KAAK,EAAE,KAAK;SACb;KAEF;CACF,CAAA;AAED,kBAAe,cAAc,CAAA"} \ No newline at end of file diff --git a/build/contracts/auth.js b/build/contracts/auth.js new file mode 100644 index 00000000..1bf08174 --- /dev/null +++ b/build/contracts/auth.js @@ -0,0 +1,3 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +//# sourceMappingURL=auth.js.map \ No newline at end of file diff --git a/build/contracts/auth.js.map b/build/contracts/auth.js.map new file mode 100644 index 00000000..208c50fb --- /dev/null +++ b/build/contracts/auth.js.map @@ -0,0 +1 @@ +{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../contracts/auth.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/build/database/factories/index.js b/build/database/factories/index.js new file mode 100644 index 00000000..8332f84c --- /dev/null +++ b/build/database/factories/index.js @@ -0,0 +1 @@ +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/build/database/factories/index.js.map b/build/database/factories/index.js.map new file mode 100644 index 00000000..eeb9b1df --- /dev/null +++ b/build/database/factories/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../database/factories/index.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/build/database/migrations/1701712115317_users.js b/build/database/migrations/1701712115317_users.js new file mode 100644 index 00000000..7fd513d0 --- /dev/null +++ b/build/database/migrations/1701712115317_users.js @@ -0,0 +1,29 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const Schema_1 = __importDefault(global[Symbol.for('ioc.use')]("Adonis/Lucid/Schema")); +class default_1 extends Schema_1.default { + constructor() { + super(...arguments); + this.tableName = 'users'; + } + async up() { + this.schema.createTable(this.tableName, (table) => { + table.increments('id').primary(); + table.string('pseudo', 50).notNullable(); + table.string('email', 255).notNullable().unique(); + table.string('password', 180).notNullable(); + table.json('avatar'); + table.string('remember_me_token').nullable(); + table.timestamp('created_at', { useTz: true }).notNullable(); + table.timestamp('updated_at', { useTz: true }).notNullable(); + }); + } + async down() { + this.schema.dropTable(this.tableName); + } +} +exports.default = default_1; +//# sourceMappingURL=1701712115317_users.js.map \ No newline at end of file diff --git a/build/database/migrations/1701712115317_users.js.map b/build/database/migrations/1701712115317_users.js.map new file mode 100644 index 00000000..1c122198 --- /dev/null +++ b/build/database/migrations/1701712115317_users.js.map @@ -0,0 +1 @@ +{"version":3,"file":"1701712115317_users.js","sourceRoot":"","sources":["../../../database/migrations/1701712115317_users.ts"],"names":[],"mappings":";;;;;AAAA,uFAAiD;AAEjD,eAAqB,SAAQ,gBAAU;IAAvC;;QACY,cAAS,GAAG,OAAO,CAAA;IAoB/B,CAAC;IAlBQ,KAAK,CAAC,EAAE;QACb,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE;YAChD,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAA;YAEhC,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAA;YACxC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC,MAAM,EAAE,CAAA;YACjD,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE,CAAA;YAC3C,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;YAEpB,KAAK,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC,QAAQ,EAAE,CAAA;YAC5C,KAAK,CAAC,SAAS,CAAC,YAAY,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAA;YAC5D,KAAK,CAAC,SAAS,CAAC,YAAY,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAA;QAC9D,CAAC,CAAC,CAAA;IACJ,CAAC;IAEM,KAAK,CAAC,IAAI;QACf,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IACvC,CAAC;CACF;AArBD,4BAqBC"} \ No newline at end of file diff --git a/build/public/Logo Discord.png b/build/public/Logo Discord.png new file mode 100644 index 00000000..71c07d17 Binary files /dev/null and b/build/public/Logo Discord.png differ diff --git a/build/public/assets/app.02c2543a.css b/build/public/assets/app.02c2543a.css new file mode 100644 index 00000000..b76f498d --- /dev/null +++ b/build/public/assets/app.02c2543a.css @@ -0,0 +1,4 @@ +@import url(https://fonts.googleapis.com/css?family=Roboto:400,900); +/* +! tailwindcss v3.3.5 | MIT License | https://tailwindcss.com +*/*,:after,:before{border:0 solid #e5e7eb;box-sizing:border-box}:after,:before{--tw-content:""}html{-webkit-text-size-adjust:100%;font-feature-settings:normal;font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-variation-settings:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4}body{line-height:inherit;margin:0}hr{border-top-width:1px;color:inherit;height:0}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{border-collapse:collapse;border-color:inherit;text-indent:0}button,input,optgroup,select,textarea{font-feature-settings:inherit;color:inherit;font-family:inherit;font-size:100%;font-variation-settings:inherit;font-weight:inherit;line-height:inherit;margin:0;padding:0}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{color:#9ca3af;opacity:1}input::placeholder,textarea::placeholder{color:#9ca3af;opacity:1}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{height:auto;max-width:100%}[hidden]{display:none}*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }.sr-only{clip:rect(0,0,0,0);border-width:0;height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.-inset-1{inset:-.25rem}.-inset-1\.5{inset:-.375rem}.inset-y-0{bottom:0;top:0}.left-0{left:0}.right-0{right:0}.top-0{top:0}.z-10{z-index:10}.z-50{z-index:50}.m-1{margin:.25rem}.m-24{margin:6rem}.mx-24{margin-left:6rem;margin-right:6rem}.mx-4{margin-left:1rem;margin-right:1rem}.mx-auto{margin-left:auto;margin-right:auto}.my-10{margin-bottom:2.5rem;margin-top:2.5rem}.my-20{margin-bottom:5rem;margin-top:5rem}.my-3{margin-bottom:.75rem;margin-top:.75rem}.mb-10{margin-bottom:2.5rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-5{margin-bottom:1.25rem}.mb-9{margin-bottom:2.25rem}.ml-10{margin-left:2.5rem}.ml-3{margin-left:.75rem}.mr-2{margin-right:.5rem}.mt-1{margin-top:.25rem}.mt-10{margin-top:2.5rem}.mt-12{margin-top:3rem}.mt-16{margin-top:4rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-36{margin-top:9rem}.mt-4{margin-top:1rem}.mt-5{margin-top:1.25rem}.mt-6{margin-top:1.5rem}.mt-8{margin-top:2rem}.mt-9{margin-top:2.25rem}.block{display:block}.inline-block{display:inline-block}.flex{display:flex}.inline-flex{display:inline-flex}.grid{display:grid}.hidden{display:none}.h-10{height:2.5rem}.h-16{height:4rem}.h-28{height:7rem}.h-32{height:8rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-72{height:18rem}.h-8{height:2rem}.min-h-full{min-height:100%}.min-h-screen{min-height:100vh}.w-16{width:4rem}.w-32{width:8rem}.w-48{width:12rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-72{width:18rem}.w-8{width:2rem}.w-auto{width:auto}.w-full{width:100%}.max-w-5xl{max-width:64rem}.max-w-7xl{max-width:80rem}.flex-1{flex:1 1 0%}.flex-shrink-0{flex-shrink:0}.origin-top-right{transform-origin:top right}.cursor-default{cursor:default}.cursor-pointer{cursor:pointer}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.place-items-center{place-items:center}.items-center{align-items:center}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-x-6{-moz-column-gap:1.5rem;column-gap:1.5rem}.space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(1rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(1rem*var(--tw-space-x-reverse))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.25rem*var(--tw-space-y-reverse));margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)))}.overflow-hidden,.truncate{overflow:hidden}.truncate{text-overflow:ellipsis;white-space:nowrap}.rounded{border-radius:.25rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-xl{border-radius:.75rem}.border{border-width:1px}.border-2{border-width:2px}.border-l-8{border-left-width:8px}.border-solid{border-style:solid}.border-black{--tw-border-opacity:1;border-color:rgb(0 0 0/var(--tw-border-opacity))}.border-gray-400{--tw-border-opacity:1;border-color:rgb(156 163 175/var(--tw-border-opacity))}.bg-blue-500{--tw-bg-opacity:1;background-color:rgb(59 130 246/var(--tw-bg-opacity))}.bg-gray-100{--tw-bg-opacity:1;background-color:rgb(243 244 246/var(--tw-bg-opacity))}.bg-gray-300{--tw-bg-opacity:1;background-color:rgb(209 213 219/var(--tw-bg-opacity))}.bg-gray-800{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity))}.bg-gray-900{--tw-bg-opacity:1;background-color:rgb(17 24 39/var(--tw-bg-opacity))}.bg-indigo-600{--tw-bg-opacity:1;background-color:rgb(79 70 229/var(--tw-bg-opacity))}.bg-red-500{--tw-bg-opacity:1;background-color:rgb(239 68 68/var(--tw-bg-opacity))}.bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}.bg-none{background-image:none}.fill-sky-400\/20{fill:rgba(56,189,248,.2)}.fill-sky-500{fill:#0ea5e9}.fill-slate-400{fill:#94a3b8}.fill-transparent{fill:transparent}.stroke-sky-500{stroke:#0ea5e9}.stroke-slate-400{stroke:#94a3b8}.p-1{padding:.25rem}.p-1\.5{padding:.375rem}.p-2{padding:.5rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-20{padding-left:5rem;padding-right:5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-3\.5{padding-left:.875rem;padding-right:.875rem}.px-4{padding-left:1rem;padding-right:1rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-1{padding-bottom:.25rem;padding-top:.25rem}.py-1\.5{padding-bottom:.375rem;padding-top:.375rem}.py-12{padding-bottom:3rem;padding-top:3rem}.py-2{padding-bottom:.5rem;padding-top:.5rem}.py-2\.5{padding-bottom:.625rem;padding-top:.625rem}.py-24{padding-bottom:6rem;padding-top:6rem}.py-5{padding-bottom:1.25rem;padding-top:1.25rem}.pb-3{padding-bottom:.75rem}.pl-3{padding-left:.75rem}.pl-4{padding-left:1rem}.pl-5{padding-left:1.25rem}.pr-2{padding-right:.5rem}.pr-4{padding-right:1rem}.pr-9{padding-right:2.25rem}.pt-2{padding-top:.5rem}.pt-32{padding-top:8rem}.text-left{text-align:left}.text-center{text-align:center}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-4xl{font-size:2.25rem;line-height:2.5rem}.text-base{font-size:1rem;line-height:1.5rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.italic{font-style:italic}.leading-6{line-height:1.5rem}.leading-7{line-height:1.75rem}.leading-9{line-height:2.25rem}.leading-tight{line-height:1.25}.tracking-tight{letter-spacing:-.025em}.text-gray-300{--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity))}.text-gray-400{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity))}.text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}.text-gray-600{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity))}.text-gray-700{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity))}.text-gray-900{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity))}.text-indigo-600{--tw-text-opacity:1;color:rgb(79 70 229/var(--tw-text-opacity))}.text-slate-900{--tw-text-opacity:1;color:rgb(15 23 42/var(--tw-text-opacity))}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.shadow{--tw-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px -1px rgba(0,0,0,.1);--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color)}.shadow,.shadow-lg{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)}.shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.ring-1{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.ring-black{--tw-ring-opacity:1;--tw-ring-color:rgb(0 0 0/var(--tw-ring-opacity))}.ring-opacity-5{--tw-ring-opacity:0.05}.transition{transition-duration:.15s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-transform{transition-duration:.15s;transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1)}.duration-300{transition-duration:.3s}.duration-500{transition-duration:.5s}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}*{font-family:Roboto,sans-serif;margin:0;padding:0}html{scroll-behavior:smooth}[x-cloak]{display:none!important}.hover\:z-10:hover{z-index:10}.hover\:scale-125:hover{--tw-scale-x:1.25;--tw-scale-y:1.25;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:bg-blue-700:hover{--tw-bg-opacity:1;background-color:rgb(29 78 216/var(--tw-bg-opacity))}.hover\:bg-gray-200:hover{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity))}.hover\:bg-gray-300:hover{--tw-bg-opacity:1;background-color:rgb(209 213 219/var(--tw-bg-opacity))}.hover\:bg-gray-700:hover{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity))}.hover\:bg-indigo-500:hover{--tw-bg-opacity:1;background-color:rgb(99 102 241/var(--tw-bg-opacity))}.hover\:bg-red-700:hover{--tw-bg-opacity:1;background-color:rgb(185 28 28/var(--tw-bg-opacity))}.hover\:text-gray-400:hover{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity))}.hover\:text-indigo-500:hover{--tw-text-opacity:1;color:rgb(99 102 241/var(--tw-text-opacity))}.hover\:text-white:hover{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus\:ring-inset:focus{--tw-ring-inset:inset}.focus\:ring-blue-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(59 130 246/var(--tw-ring-opacity))}.focus\:ring-red-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(239 68 68/var(--tw-ring-opacity))}.focus\:ring-white:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(255 255 255/var(--tw-ring-opacity))}.focus\:ring-opacity-50:focus{--tw-ring-opacity:0.5}.focus\:ring-offset-2:focus{--tw-ring-offset-width:2px}.focus\:ring-offset-gray-800:focus{--tw-ring-offset-color:#1f2937}.focus-visible\:outline:focus-visible{outline-style:solid}.focus-visible\:outline-2:focus-visible{outline-width:2px}.focus-visible\:outline-offset-2:focus-visible{outline-offset:2px}.focus-visible\:outline-indigo-600:focus-visible{outline-color:#4f46e5}:is(.dark .dark\:bg-slate-900){--tw-bg-opacity:1;background-color:rgb(15 23 42/var(--tw-bg-opacity))}:is(.dark .dark\:fill-slate-500){fill:#64748b}:is(.dark .dark\:stroke-slate-500){stroke:#64748b}:is(.dark .dark\:text-white){--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}@media (min-width:640px){.sm\:static{position:static}.sm\:inset-auto{inset:auto}.sm\:mx-24{margin-left:6rem;margin-right:6rem}.sm\:mx-auto{margin-left:auto;margin-right:auto}.sm\:ml-6{margin-left:1.5rem}.sm\:mr-10{margin-right:2.5rem}.sm\:block{display:block}.sm\:hidden{display:none}.sm\:w-full{width:100%}.sm\:max-w-sm{max-width:24rem}.sm\:items-stretch{align-items:stretch}.sm\:justify-start{justify-content:flex-start}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\:py-32{padding-bottom:8rem;padding-top:8rem}.sm\:pr-0{padding-right:0}.sm\:text-5xl{font-size:3rem;line-height:1}.sm\:text-sm{font-size:.875rem;line-height:1.25rem}}@media (min-width:768px){.md\:block{display:block}}@media (min-width:1024px){.lg\:px-8{padding-left:2rem;padding-right:2rem}} \ No newline at end of file diff --git a/build/public/assets/app.8c2f579c.js b/build/public/assets/app.8c2f579c.js new file mode 100644 index 00000000..d21d60ad --- /dev/null +++ b/build/public/assets/app.8c2f579c.js @@ -0,0 +1 @@ +(()=>{"use strict";var e,t,n,r,i=!1,o=!1,a=[],s=-1;function l(e){!function(e){a.includes(e)||a.push(e);o||i||(i=!0,queueMicrotask(u))}(e)}function c(e){let t=a.indexOf(e);-1!==t&&t>s&&a.splice(t,1)}function u(){i=!1,o=!0;for(let e=0;e_(e,t)));let n=!1;if(t(e,(()=>n=!0)),n)return;let r=e.firstElementChild;for(;r;)_(r,t),r=r.nextElementSibling}function h(e,...t){console.warn(`Alpine Warning: ${e}`,...t)}var m=!1;var g=[],x=[];function v(){return g.map((e=>e()))}function y(){return g.concat(x).map((e=>e()))}function b(e){g.push(e)}function w(e){x.push(e)}function E(e,t=!1){return k(e,(e=>{if((t?y():v()).some((t=>e.matches(t))))return!0}))}function k(e,t){if(e){if(t(e))return e;if(e._x_teleportBack&&(e=e._x_teleportBack),e.parentElement)return k(e.parentElement,t)}}var A=[];function S(e,t=_,n=(()=>{})){!function(e){ve=!0;let t=Symbol();be=t,ye.set(t,[]);let n=()=>{for(;ye.get(t).length;)ye.get(t).shift()();ye.delete(t)},r=()=>{ve=!1,n()};e(n),r()}((()=>{t(e,((e,t)=>{n(e,t),A.forEach((n=>n(e,t))),ge(e,e.attributes).forEach((e=>e())),e._x_ignore&&t()}))}))}function O(e){_(e,(e=>{P(e),function(e){if(e._x_cleanups)for(;e._x_cleanups.length;)e._x_cleanups.pop()()}(e)}))}var j=[],C=[],$=[];function N(e,t){"function"==typeof t?(e._x_cleanups||(e._x_cleanups=[]),e._x_cleanups.push(t)):(t=e,C.push(t))}function L(e){j.push(e)}function M(e,t,n){e._x_attributeCleanups||(e._x_attributeCleanups={}),e._x_attributeCleanups[t]||(e._x_attributeCleanups[t]=[]),e._x_attributeCleanups[t].push(n)}function P(e,t){e._x_attributeCleanups&&Object.entries(e._x_attributeCleanups).forEach((([n,r])=>{(void 0===t||t.includes(n))&&(r.forEach((e=>e())),delete e._x_attributeCleanups[n])}))}var R=new MutationObserver(J),T=!1;function z(){R.observe(document,{subtree:!0,childList:!0,attributes:!0,attributeOldValue:!0}),T=!0}function B(){(I=I.concat(R.takeRecords())).length&&!D&&(D=!0,queueMicrotask((()=>{J(I),I.length=0,D=!1}))),R.disconnect(),T=!1}var I=[],D=!1;function F(e){if(!T)return e();B();let t=e();return z(),t}var q=!1,W=[];function J(e){if(q)return void(W=W.concat(e));let t=[],n=[],r=new Map,i=new Map;for(let o=0;o1===e.nodeType&&t.push(e))),e[o].removedNodes.forEach((e=>1===e.nodeType&&n.push(e)))),"attributes"===e[o].type)){let t=e[o].target,n=e[o].attributeName,a=e[o].oldValue,s=()=>{r.has(t)||r.set(t,[]),r.get(t).push({name:n,value:t.getAttribute(n)})},l=()=>{i.has(t)||i.set(t,[]),i.get(t).push(n)};t.hasAttribute(n)&&null===a?s():t.hasAttribute(n)?(l(),s()):l()}i.forEach(((e,t)=>{P(t,e)})),r.forEach(((e,t)=>{j.forEach((n=>n(t,e)))}));for(let e of n)t.includes(e)||(C.forEach((t=>t(e))),O(e));t.forEach((e=>{e._x_ignoreSelf=!0,e._x_ignore=!0}));for(let e of t)n.includes(e)||e.isConnected&&(delete e._x_ignoreSelf,delete e._x_ignore,$.forEach((t=>t(e))),e._x_ignore=!0,e._x_ignoreSelf=!0);t.forEach((e=>{delete e._x_ignoreSelf,delete e._x_ignore})),t=null,n=null,r=null,i=null}function K(e){return H(V(e))}function U(e,t,n){return e._x_dataStack=[t,...V(n||e)],()=>{e._x_dataStack=e._x_dataStack.filter((e=>e!==t))}}function V(e){return e._x_dataStack?e._x_dataStack:"function"==typeof ShadowRoot&&e instanceof ShadowRoot?V(e.host):e.parentNode?V(e.parentNode):[]}function H(e){return new Proxy({objects:e},Z)}var Z={ownKeys:({objects:e})=>Array.from(new Set(e.flatMap((e=>Object.keys(e))))),has:({objects:e},t)=>t!=Symbol.unscopables&&e.some((e=>Object.prototype.hasOwnProperty.call(e,t))),get:({objects:e},t,n)=>"toJSON"==t?X:Reflect.get(e.find((e=>Object.prototype.hasOwnProperty.call(e,t)))||{},t,n),set({objects:e},t,n,r){const i=e.find((e=>Object.prototype.hasOwnProperty.call(e,t)))||e[e.length-1],o=Object.getOwnPropertyDescriptor(i,t);return o?.set&&o?.get?Reflect.set(i,t,n,r):Reflect.set(i,t,n)}};function X(){return Reflect.ownKeys(this).reduce(((e,t)=>(e[t]=Reflect.get(this,t),e)),{})}function Y(e){let t=(n,r="")=>{Object.entries(Object.getOwnPropertyDescriptors(n)).forEach((([i,{value:o,enumerable:a}])=>{if(!1===a||void 0===o)return;let s=""===r?i:`${r}.${i}`;var l;"object"==typeof o&&null!==o&&o._x_interceptor?n[i]=o.initialize(e,s,i):"object"!=typeof(l=o)||Array.isArray(l)||null===l||o===n||o instanceof Element||t(o,s)}))};return t(e)}function G(e,t=(()=>{})){let n={initialValue:void 0,_x_interceptor:!0,initialize(t,n,r){return e(this.initialValue,(()=>function(e,t){return t.split(".").reduce(((e,t)=>e[t]),e)}(t,n)),(e=>Q(t,n,e)),n,r)}};return t(n),e=>{if("object"==typeof e&&null!==e&&e._x_interceptor){let t=n.initialize.bind(n);n.initialize=(r,i,o)=>{let a=e.initialize(r,i,o);return n.initialValue=a,t(r,i,o)}}else n.initialValue=e;return n}}function Q(e,t,n){if("string"==typeof t&&(t=t.split(".")),1!==t.length){if(0===t.length)throw error;return e[t[0]]||(e[t[0]]={}),Q(e[t[0]],t.slice(1),n)}e[t[0]]=n}var ee={};function te(e,t){ee[e]=t}function ne(e,t){return Object.entries(ee).forEach((([n,r])=>{let i=null;Object.defineProperty(e,`$${n}`,{get:()=>r(t,function(){if(i)return i;{let[e,n]=we(t);return i={interceptor:G,...e},N(t,n),i}}()),enumerable:!1})})),e}function re(e,t,n,...r){try{return n(...r)}catch(n){ie(n,e,t)}}function ie(e,t,n=void 0){Object.assign(e,{el:t,expression:n}),console.warn(`Alpine Expression Error: ${e.message}\n\n${n?'Expression: "'+n+'"\n\n':""}`,t),setTimeout((()=>{throw e}),0)}var oe=!0;function ae(e){let t=oe;oe=!1;let n=e();return oe=t,n}function se(e,t,n={}){let r;return le(e,t)((e=>r=e),n),r}function le(...e){return ce(...e)}var ce=ue;function ue(e,t){let n={};ne(n,e);let r=[n,...V(e)],i="function"==typeof t?function(e,t){return(n=(()=>{}),{scope:r={},params:i=[]}={})=>{de(n,t.apply(H([r,...e]),i))}}(r,t):function(e,t,n){let r=function(e,t){if(fe[e])return fe[e];let n=Object.getPrototypeOf((async function(){})).constructor,r=/^[\n\s]*if.*\(.*\)/.test(e.trim())||/^(let|const)\s/.test(e.trim())?`(async()=>{ ${e} })()`:e;const i=()=>{try{let t=new n(["__self","scope"],`with (scope) { __self.result = ${r} }; __self.finished = true; return __self.result;`);return Object.defineProperty(t,"name",{value:`[Alpine] ${e}`}),t}catch(n){return ie(n,t,e),Promise.resolve()}};let o=i();return fe[e]=o,o}(t,n);return(i=(()=>{}),{scope:o={},params:a=[]}={})=>{r.result=void 0,r.finished=!1;let s=H([o,...e]);if("function"==typeof r){let e=r(r,s).catch((e=>ie(e,n,t)));r.finished?(de(i,r.result,s,a,n),r.result=void 0):e.then((e=>{de(i,e,s,a,n)})).catch((e=>ie(e,n,t))).finally((()=>r.result=void 0))}}}(r,t,e);return re.bind(null,e,t,i)}var fe={};function de(e,t,n,r,i){if(oe&&"function"==typeof t){let o=t.apply(n,r);o instanceof Promise?o.then((t=>de(e,t,n,r))).catch((e=>ie(e,i,t))):e(o)}else"object"==typeof t&&t instanceof Promise?t.then((t=>e(t))):e(t)}var pe="x-";function _e(e=""){return pe+e}var he={};function me(e,t){return he[e]=t,{before(t){if(!he[t])return void console.warn("Cannot find directive `${directive}`. `${name}` will use the default order of execution");const n=$e.indexOf(t);$e.splice(n>=0?n:$e.indexOf("DEFAULT"),0,e)}}}function ge(e,t,n){if(t=Array.from(t),e._x_virtualDirectives){let n=Object.entries(e._x_virtualDirectives).map((([e,t])=>({name:e,value:t}))),r=xe(n);n=n.map((e=>r.find((t=>t.name===e.name))?{name:`x-bind:${e.name}`,value:`"${e.value}"`}:e)),t=t.concat(n)}let r={},i=t.map(ke(((e,t)=>r[e]=t))).filter(Oe).map(function(e,t){return({name:n,value:r})=>{let i=n.match(je()),o=n.match(/:([a-zA-Z0-9\-_:]+)/),a=n.match(/\.[^.\]]+(?=[^\]]*$)/g)||[],s=t||e[n]||n;return{type:i?i[1]:null,value:o?o[1]:null,modifiers:a.map((e=>e.replace(".",""))),expression:r,original:s}}}(r,n)).sort(Ne);return i.map((t=>function(e,t){let n=()=>{},r=he[t.type]||n,[i,o]=we(e);M(e,t.original,o);let a=()=>{e._x_ignore||e._x_ignoreSelf||(r.inline&&r.inline(e,t,i),r=r.bind(r,e,t,i),ve?ye.get(be).push(r):r())};return a.runCleanups=o,a}(e,t)))}function xe(e){return Array.from(e).map(ke()).filter((e=>!Oe(e)))}var ve=!1,ye=new Map,be=Symbol();function we(e){let r=[],[i,o]=function(e){let r=()=>{};return[i=>{let o=t(i);return e._x_effects||(e._x_effects=new Set,e._x_runEffects=()=>{e._x_effects.forEach((e=>e()))}),e._x_effects.add(o),r=()=>{void 0!==o&&(e._x_effects.delete(o),n(o))},o},()=>{r()}]}(e);r.push(o);return[{Alpine:ft,effect:i,cleanup:e=>r.push(e),evaluateLater:le.bind(le,e),evaluate:se.bind(se,e)},()=>r.forEach((e=>e()))]}var Ee=(e,t)=>({name:n,value:r})=>(n.startsWith(e)&&(n=n.replace(e,t)),{name:n,value:r});function ke(e=(()=>{})){return({name:t,value:n})=>{let{name:r,value:i}=Ae.reduce(((e,t)=>t(e)),{name:t,value:n});return r!==t&&e(r,t),{name:r,value:i}}}var Ae=[];function Se(e){Ae.push(e)}function Oe({name:e}){return je().test(e)}var je=()=>new RegExp(`^${pe}([^:^.]+)\\b`);var Ce="DEFAULT",$e=["ignore","ref","data","id","anchor","bind","init","for","model","modelable","transition","show","if",Ce,"teleport"];function Ne(e,t){let n=-1===$e.indexOf(e.type)?Ce:e.type,r=-1===$e.indexOf(t.type)?Ce:t.type;return $e.indexOf(n)-$e.indexOf(r)}var Le=[],Me=!1;function Pe(e=(()=>{})){return queueMicrotask((()=>{Me||setTimeout((()=>{Re()}))})),new Promise((t=>{Le.push((()=>{e(),t()}))}))}function Re(){for(Me=!1;Le.length;)Le.shift()()}function Te(e,t){return Array.isArray(t)?ze(e,t.join(" ")):"object"==typeof t&&null!==t?function(e,t){let n=e=>e.split(" ").filter(Boolean),r=Object.entries(t).flatMap((([e,t])=>!!t&&n(e))).filter(Boolean),i=Object.entries(t).flatMap((([e,t])=>!t&&n(e))).filter(Boolean),o=[],a=[];return i.forEach((t=>{e.classList.contains(t)&&(e.classList.remove(t),a.push(t))})),r.forEach((t=>{e.classList.contains(t)||(e.classList.add(t),o.push(t))})),()=>{a.forEach((t=>e.classList.add(t))),o.forEach((t=>e.classList.remove(t)))}}(e,t):"function"==typeof t?Te(e,t()):ze(e,t)}function ze(e,t){return t=!0===t?t="":t||"",n=t.split(" ").filter((t=>!e.classList.contains(t))).filter(Boolean),e.classList.add(...n),()=>{e.classList.remove(...n)};var n}function Be(e,t){return"object"==typeof t&&null!==t?function(e,t){let n={};return Object.entries(t).forEach((([t,r])=>{n[t]=e.style[t],t.startsWith("--")||(t=t.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase()),e.style.setProperty(t,r)})),setTimeout((()=>{0===e.style.length&&e.removeAttribute("style")})),()=>{Be(e,n)}}(e,t):function(e,t){let n=e.getAttribute("style",t);return e.setAttribute("style",t),()=>{e.setAttribute("style",n||"")}}(e,t)}function Ie(e,t=(()=>{})){let n=!1;return function(){n?t.apply(this,arguments):(n=!0,e.apply(this,arguments))}}function De(e,t,n={}){e._x_transition||(e._x_transition={enter:{during:n,start:n,end:n},leave:{during:n,start:n,end:n},in(n=(()=>{}),r=(()=>{})){qe(e,t,{during:this.enter.during,start:this.enter.start,end:this.enter.end},n,r)},out(n=(()=>{}),r=(()=>{})){qe(e,t,{during:this.leave.during,start:this.leave.start,end:this.leave.end},n,r)}})}function Fe(e){let t=e.parentNode;if(t)return t._x_hidePromise?t:Fe(t)}function qe(e,t,{during:n,start:r,end:i}={},o=(()=>{}),a=(()=>{})){if(e._x_transitioning&&e._x_transitioning.cancel(),0===Object.keys(n).length&&0===Object.keys(r).length&&0===Object.keys(i).length)return o(),void a();let s,l,c;!function(e,t){let n,r,i,o=Ie((()=>{F((()=>{n=!0,r||t.before(),i||(t.end(),Re()),t.after(),e.isConnected&&t.cleanup(),delete e._x_transitioning}))}));e._x_transitioning={beforeCancels:[],beforeCancel(e){this.beforeCancels.push(e)},cancel:Ie((function(){for(;this.beforeCancels.length;)this.beforeCancels.shift()();o()})),finish:o},F((()=>{t.start(),t.during()})),Me=!0,requestAnimationFrame((()=>{if(n)return;let o=1e3*Number(getComputedStyle(e).transitionDuration.replace(/,.*/,"").replace("s","")),a=1e3*Number(getComputedStyle(e).transitionDelay.replace(/,.*/,"").replace("s",""));0===o&&(o=1e3*Number(getComputedStyle(e).animationDuration.replace("s",""))),F((()=>{t.before()})),r=!0,requestAnimationFrame((()=>{n||(F((()=>{t.end()})),Re(),setTimeout(e._x_transitioning.finish,o+a),i=!0)}))}))}(e,{start(){s=t(e,r)},during(){l=t(e,n)},before:o,end(){s(),c=t(e,i)},after:a,cleanup(){l(),c()}})}function We(e,t,n){if(-1===e.indexOf(t))return n;const r=e[e.indexOf(t)+1];if(!r)return n;if("scale"===t&&isNaN(r))return n;if("duration"===t||"delay"===t){let e=r.match(/([0-9]+)ms/);if(e)return e[1]}return"origin"===t&&["top","right","left","center","bottom"].includes(e[e.indexOf(t)+2])?[r,e[e.indexOf(t)+2]].join(" "):r}me("transition",((e,{value:t,modifiers:n,expression:r},{evaluate:i})=>{"function"==typeof r&&(r=i(r)),!1!==r&&(r&&"boolean"!=typeof r?function(e,t,n){De(e,Te,"");let r={enter:t=>{e._x_transition.enter.during=t},"enter-start":t=>{e._x_transition.enter.start=t},"enter-end":t=>{e._x_transition.enter.end=t},leave:t=>{e._x_transition.leave.during=t},"leave-start":t=>{e._x_transition.leave.start=t},"leave-end":t=>{e._x_transition.leave.end=t}};r[n](t)}(e,r,t):function(e,t,n){De(e,Be);let r=!t.includes("in")&&!t.includes("out")&&!n,i=r||t.includes("in")||["enter"].includes(n),o=r||t.includes("out")||["leave"].includes(n);t.includes("in")&&!r&&(t=t.filter(((e,n)=>nn>t.indexOf("out"))));let a=!t.includes("opacity")&&!t.includes("scale"),s=a||t.includes("opacity"),l=a||t.includes("scale"),c=s?0:1,u=l?We(t,"scale",95)/100:1,f=We(t,"delay",0)/1e3,d=We(t,"origin","center"),p="opacity, transform",_=We(t,"duration",150)/1e3,h=We(t,"duration",75)/1e3,m="cubic-bezier(0.4, 0.0, 0.2, 1)";i&&(e._x_transition.enter.during={transformOrigin:d,transitionDelay:`${f}s`,transitionProperty:p,transitionDuration:`${_}s`,transitionTimingFunction:m},e._x_transition.enter.start={opacity:c,transform:`scale(${u})`},e._x_transition.enter.end={opacity:1,transform:"scale(1)"});o&&(e._x_transition.leave.during={transformOrigin:d,transitionDelay:`${f}s`,transitionProperty:p,transitionDuration:`${h}s`,transitionTimingFunction:m},e._x_transition.leave.start={opacity:1,transform:"scale(1)"},e._x_transition.leave.end={opacity:c,transform:`scale(${u})`})}(e,n,t))})),window.Element.prototype._x_toggleAndCascadeWithTransitions=function(e,t,n,r){const i="visible"===document.visibilityState?requestAnimationFrame:setTimeout;let o=()=>i(n);t?e._x_transition&&(e._x_transition.enter||e._x_transition.leave)?e._x_transition.enter&&(Object.entries(e._x_transition.enter.during).length||Object.entries(e._x_transition.enter.start).length||Object.entries(e._x_transition.enter.end).length)?e._x_transition.in(n):o():e._x_transition?e._x_transition.in(n):o():(e._x_hidePromise=e._x_transition?new Promise(((t,n)=>{e._x_transition.out((()=>{}),(()=>t(r))),e._x_transitioning&&e._x_transitioning.beforeCancel((()=>n({isFromCancelledTransition:!0})))})):Promise.resolve(r),queueMicrotask((()=>{let t=Fe(e);t?(t._x_hideChildren||(t._x_hideChildren=[]),t._x_hideChildren.push(e)):i((()=>{let t=e=>{let n=Promise.all([e._x_hidePromise,...(e._x_hideChildren||[]).map(t)]).then((([e])=>e()));return delete e._x_hidePromise,delete e._x_hideChildren,n};t(e).catch((e=>{if(!e.isFromCancelledTransition)throw e}))}))})))};var Je=!1;function Ke(e,t=(()=>{})){return(...n)=>Je?t(...n):e(...n)}var Ue=[];function Ve(e){Ue.push(e)}var He=!1;function Ze(e){let r=t;d(((e,t)=>{let i=r(e);return n(i),()=>{}})),e(),d(r)}function Xe(t,n,r,i=[]){switch(t._x_bindings||(t._x_bindings=e({})),t._x_bindings[n]=r,n=i.includes("camel")?n.toLowerCase().replace(/-(\w)/g,((e,t)=>t.toUpperCase())):n){case"value":!function(e,t){if("radio"===e.type)void 0===e.attributes.value&&(e.value=t),window.fromModel&&(e.checked="boolean"==typeof t?Qe(e.value)===t:Ge(e.value,t));else if("checkbox"===e.type)Number.isInteger(t)?e.value=t:Array.isArray(t)||"boolean"==typeof t||[null,void 0].includes(t)?Array.isArray(t)?e.checked=t.some((t=>Ge(t,e.value))):e.checked=!!t:e.value=String(t);else if("SELECT"===e.tagName)!function(e,t){const n=[].concat(t).map((e=>e+""));Array.from(e.options).forEach((e=>{e.selected=n.includes(e.value)}))}(e,t);else{if(e.value===t)return;e.value=void 0===t?"":t}}(t,r);break;case"style":!function(e,t){e._x_undoAddedStyles&&e._x_undoAddedStyles();e._x_undoAddedStyles=Be(e,t)}(t,r);break;case"class":!function(e,t){e._x_undoAddedClasses&&e._x_undoAddedClasses();e._x_undoAddedClasses=Te(e,t)}(t,r);break;case"selected":case"checked":!function(e,t,n){Ye(e,t,n),function(e,t,n){e[t]!==n&&(e[t]=n)}(e,t,n)}(t,n,r);break;default:Ye(t,n,r)}}function Ye(e,t,n){[null,void 0,!1].includes(n)&&function(e){return!["aria-pressed","aria-checked","aria-expanded","aria-selected"].includes(e)}(t)?e.removeAttribute(t):(et(t)&&(n=t),function(e,t,n){e.getAttribute(t)!=n&&e.setAttribute(t,n)}(e,t,n))}function Ge(e,t){return e==t}function Qe(e){return!![1,"1","true","on","yes",!0].includes(e)||![0,"0","false","off","no",!1].includes(e)&&(e?Boolean(e):null)}function et(e){return["disabled","checked","required","readonly","hidden","open","selected","autofocus","itemscope","multiple","novalidate","allowfullscreen","allowpaymentrequest","formnovalidate","autoplay","controls","loop","muted","playsinline","default","ismap","reversed","async","defer","nomodule"].includes(e)}function tt(e,t,n){let r=e.getAttribute(t);return null===r?"function"==typeof n?n():n:""===r||(et(t)?!![t,"true"].includes(r):r)}function nt(e,t){var n;return function(){var r=this,i=arguments;clearTimeout(n),n=setTimeout((function(){n=null,e.apply(r,i)}),t)}}function rt(e,t){let n;return function(){let r=this,i=arguments;n||(e.apply(r,i),n=!0,setTimeout((()=>n=!1),t))}}function it({get:e,set:r},{get:i,set:o}){let a,s=!0,l=t((()=>{const t=e(),n=i();if(s)o(ot(t)),s=!1,a=JSON.stringify(t);else{const e=JSON.stringify(t);e!==a?(o(ot(t)),a=e):(r(ot(n)),a=JSON.stringify(n))}JSON.stringify(i()),JSON.stringify(e())}));return()=>{n(l)}}function ot(e){return"object"==typeof e?JSON.parse(JSON.stringify(e)):e}var at={},st=!1;var lt={};function ct(e,t,n){let r=[];for(;r.length;)r.pop()();let i=Object.entries(t).map((([e,t])=>({name:e,value:t}))),o=xe(i);return i=i.map((e=>o.find((t=>t.name===e.name))?{name:`x-bind:${e.name}`,value:`"${e.value}"`}:e)),ge(e,i,n).map((e=>{r.push(e.runCleanups),e()})),()=>{for(;r.length;)r.pop()()}}var ut={};var ft={get reactive(){return e},get release(){return n},get effect(){return t},get raw(){return r},version:"3.13.3",flushAndStopDeferringMutations:function(){q=!1,J(W),W=[]},dontAutoEvaluateFunctions:ae,disableEffectScheduling:function(e){f=!1,e(),f=!0},startObservingMutations:z,stopObservingMutations:B,setReactivityEngine:function(i){e=i.reactive,n=i.release,t=e=>i.effect(e,{scheduler:e=>{f?l(e):e()}}),r=i.raw},onAttributeRemoved:M,onAttributesAdded:L,closestDataStack:V,skipDuringClone:Ke,onlyDuringClone:function(e){return(...t)=>Je&&e(...t)},addRootSelector:b,addInitSelector:w,interceptClone:Ve,addScopeToNode:U,deferMutations:function(){q=!0},mapAttributes:Se,evaluateLater:le,interceptInit:function(e){A.push(e)},setEvaluator:function(e){ce=e},mergeProxies:H,extractProp:function(e,t,n,r=!0){if(e._x_bindings&&void 0!==e._x_bindings[t])return e._x_bindings[t];if(e._x_inlineBindings&&void 0!==e._x_inlineBindings[t]){let n=e._x_inlineBindings[t];return n.extract=r,ae((()=>se(e,n.expression)))}return tt(e,t,n)},findClosest:k,onElRemoved:N,closestRoot:E,destroyTree:O,interceptor:G,transition:qe,setStyles:Be,mutateDom:F,directive:me,entangle:it,throttle:rt,debounce:nt,evaluate:se,initTree:S,nextTick:Pe,prefixed:_e,prefix:function(e){pe=e},plugin:function(e){(Array.isArray(e)?e:[e]).forEach((e=>e(ft)))},magic:te,store:function(t,n){if(st||(at=e(at),st=!0),void 0===n)return at[t];at[t]=n,"object"==typeof n&&null!==n&&n.hasOwnProperty("init")&&"function"==typeof n.init&&at[t].init(),Y(at[t])},start:function(){var e;m&&h("Alpine has already been initialized on this page. Calling Alpine.start() more than once can cause problems."),m=!0,document.body||h("Unable to initialize. Trying to load Alpine before `` is available. Did you forget to add `defer` in Alpine's ` + + +
+

You can modify your personal information:

+ + @component('components/form/form', { + 'action': 'modifpseudo', + 'method': 'post', + 'flash': 'not', + }) + @!component('components/form/field', { + 'label': 'Pseudo :', + 'name': 'pseudo', + 'type': 'text', + 'required': true, + 'placeholder': 'new pseudo', + }) + @!component('components/form/button', { + 'type': 'submit', + 'text': 'Envoyer', + }) + @end + +
+ + @component('components/form/form', { + 'action': 'modifemail', + 'method': 'post', + 'flash': 'not', + }) + @!component('components/form/field', { + 'label': 'Email :', + 'name': 'email', + 'type': 'text', + 'required': true, + 'placeholder': 'new email', + }) + @!component('components/form/button', { + 'type': 'submit', + 'text': 'Envoyer', + }) + @end +
+ + + +
+ + +
+ + + + +
+
+ +
+

Delete your compte :

+ + Delete + +
+ + + + +@end \ No newline at end of file diff --git a/build/resources/views/home.edge b/build/resources/views/home.edge new file mode 100644 index 00000000..c03a8675 --- /dev/null +++ b/build/resources/views/home.edge @@ -0,0 +1,17 @@ +@layout('layouts/main') +@set('title', 'Arthur - Portfolio') + +@section('body') + +@include('partials/nav') +@include('partials/header') + +
+ @include('partials/main/about') + @include('partials/main/projects') + @include('partials/main/contact') +
+ +@include('partials/footer') + +@end \ No newline at end of file diff --git a/build/resources/views/layouts/main.edge b/build/resources/views/layouts/main.edge new file mode 100644 index 00000000..d329558b --- /dev/null +++ b/build/resources/views/layouts/main.edge @@ -0,0 +1,14 @@ + + + + + + + {{ title }} + @entryPointStyles('app') + @entryPointScripts('app') + + + @!section('body') + + \ No newline at end of file diff --git a/build/resources/views/partials/footer.edge b/build/resources/views/partials/footer.edge new file mode 100644 index 00000000..39f9cc97 --- /dev/null +++ b/build/resources/views/partials/footer.edge @@ -0,0 +1,22 @@ + + + + \ No newline at end of file diff --git a/build/resources/views/partials/header.edge b/build/resources/views/partials/header.edge new file mode 100644 index 00000000..887259fe --- /dev/null +++ b/build/resources/views/partials/header.edge @@ -0,0 +1,43 @@ +
+
+

Hi! 👋🏻
I'm Arthur.

+

Founder

+ +
+

I am a young Frenchman with a passion for development, I am a self-taught learner and my creativity knows no + limits. Every pixel I edit tells a story. Passionate about transforming ideas into visually captivating + experiences, I create projects that push the boundaries of design innovation.

+
+ +

"In the middle of every difficulty lies opportunity."

+

Albert Einstein

+ +
    + @!component('components/list_lien', { + href: 'https://www.instagram.com/arthur.pbty/', + img: '/logo insta.png', + title: 'Instagram', + }) + @!component('components/list_lien', { + href: 'https://github.com/Tutur33', + img: '/logo github.png', + title: 'Github', + }) + @!component('components/list_lien', { + href: 'https://discord.gg/HxgaA44CPh', + img: '/Logo Discord.png', + title: 'Discord', + }) + @!component('components/list_lien', { + href: 'http://tuturp33.000webhostapp.com', + img: '/other.png', + title: 'Other...', + }) +
+
+ + + +
\ No newline at end of file diff --git a/build/resources/views/partials/main/about.edge b/build/resources/views/partials/main/about.edge new file mode 100644 index 00000000..02c6452e --- /dev/null +++ b/build/resources/views/partials/main/about.edge @@ -0,0 +1,21 @@ +
+

About

+

Hi ! I'm Arthur, a passionate developer based in France. My journey in the world of development is an inspiring adventure. Every line of code I write is a step toward creating unique and engaging experiences. I am driven by the desire to bring ideas to life and shape them into innovative designs.

+ +

My background

+

I gained experience in web development working on various projects, ranging from front-end to back-end. I have a deep command of languages like HTML, CSS, JavaScript, and have worked with modern frameworks like Adonis with Node.js.

+ +

My philosophy

+

I firmly believe that every difficulty is an opportunity to create something new and exciting. My approach is to combine functionality and aesthetics to deliver exceptional user experiences.

+ +

My skills

+

Web development, web design, application development, project management.

+ +

My interests

+

Outside of development, I love exploring new places, photography, and reading books about technology and creativity. And go sailing!

+ +

My vision

+

My visionMy goal is to continue to learn, innovate and inspire through my projects. I want to help create a better, more engaging web for everyone.

+ +

Please feel free to contact me if you have any questions or would like to collaborate on an exciting project. You can reach me via [your email address] or follow me on social media using the links below.

+
\ No newline at end of file diff --git a/build/resources/views/partials/main/contact.edge b/build/resources/views/partials/main/contact.edge new file mode 100644 index 00000000..59d95c1a --- /dev/null +++ b/build/resources/views/partials/main/contact.edge @@ -0,0 +1,35 @@ +
+

Contact

+ + @component('components/form/form', { + 'action': '#', + 'method': 'post', + }) + @!component('components/form/field', { + 'label': 'Nom :', + 'name': 'nom', + 'type': 'text', + 'required': true, + 'placeholder': 'nom', + }) + @!component('components/form/field', { + 'label': 'E-mail :', + 'name': 'email', + 'type': 'email', + 'required': true, + 'placeholder': 'exemple@mail.com', + }) + @!component('components/form/field', { + 'label': 'Message :', + 'name': 'message', + 'type': 'textarea', + 'rows': 4, + 'required': true, + }) + @!component('components/form/button', { + 'type': 'submit', + 'text': 'Envoyer', + }) + @end + +
\ No newline at end of file diff --git a/build/resources/views/partials/main/projects.edge b/build/resources/views/partials/main/projects.edge new file mode 100644 index 00000000..907263f5 --- /dev/null +++ b/build/resources/views/partials/main/projects.edge @@ -0,0 +1,18 @@ +
+

Projects

+ +
+ @!component('components/project', { + 'href': '#', + 'img': '/projects/project-nups.png', + }) + @!component('components/project', { + 'href': '#', + 'img': '/projects/my-networks.jpg', + }) + @!component('components/project', { + 'href': '#', + 'img': '/projects/journal.avif', + }) +
+
\ No newline at end of file diff --git a/build/resources/views/partials/nav.edge b/build/resources/views/partials/nav.edge new file mode 100644 index 00000000..c3cfb03a --- /dev/null +++ b/build/resources/views/partials/nav.edge @@ -0,0 +1,78 @@ + \ No newline at end of file diff --git a/build/resources/views/terms.edge b/build/resources/views/terms.edge new file mode 100644 index 00000000..c2af42d5 --- /dev/null +++ b/build/resources/views/terms.edge @@ -0,0 +1,122 @@ +@layout('layouts/main') +@set('title', 'Terms and Conditions') + +@section('body') + +
+

Nups Terms and Conditions

+

Effective Date: Saturday, June 17, 2023

+

Thank you for using Nups services! These Terms and Conditions govern your use of our services. Please + read them carefully.

+ +

Acceptance of Terms and Conditions

+

1.1 Acceptance of Terms. By using Nups services, you agree to be bound by these Terms and Conditions. + If you do not accept these Terms, you cannot use our services.

+ +

Use of Our Services

+

2.1 User Account. To use certain Nups services, you will need to create a user account. You are + responsible for the confidentiality of your login credentials and all activities related to your account.

+

2.2 Authorized Use. You agree to use Nups services in accordance with these Terms and Conditions and + all applicable laws. You may not use our services in a way that could infringe on Nups' rights or the rights of + others.

+

2.3 Usage Restrictions. You agree not to access Nups services in an unauthorized manner, attempt to + gain unauthorized access to accounts or computer systems, and not to disrupt or harm Nups services.

+ +

User Content

+

3.1 Content Ownership. You retain ownership of any content you submit, post, or display on Nups + services. By submitting, posting, or displaying content, you grant Nups a worldwide, non-exclusive, transferable, + free, and royalty-free license to use, reproduce, modify, adapt, publish, translate, distribute, display, and create + derivative works from that content.

+

3.2 Content Responsibility. You are responsible for the content you submit, post, or display on Nups + services. You warrant that you have all necessary rights to publish this content, and it does not violate the rights + of others.

+

3.3 Respect for Intellectual Property Rights. You agree not to violate the intellectual property + rights of Nups or third parties when using Nups services. You may not copy, modify, distribute, or access + copyrighted content or other intellectual property items without authorization.

+ +

Intellectual Property

+

4.1 Nups' Intellectual Property Rights. All intellectual property rights related to Nups services + (except user content) are owned by Nups. You do not acquire any ownership rights to Nups services or the content you + access.

+

4.2 Authorized Use. Subject to compliance with these Terms and Conditions, Nups grants you a limited, + non-exclusive, revocable, non-transferable license to use Nups services for personal and non-commercial purposes. +

+ +

Privacy

+

5.1 Data Collection. Nups collects and uses your information in accordance with its Privacy Policy. By + using Nups services, you consent to the collection and use of your information as outlined in this policy.

+

5.2 Cookies. Nups services may use cookies and similar technologies to facilitate your site usage and + personalize your experience.

+

5.3 Data Security. Nups implements appropriate security measures to protect your information from + unauthorized access, disclosure, or misuse.

+ +

Changes to Services

+

6.1 Changes to Terms and Conditions. Nups reserves the right to modify these Terms and Conditions at + any time. Changes take effect upon their publication on the Nups website. Your continued use of Nups services after + such changes constitutes your acceptance of the amended Terms and Conditions.

+

6.2 Changes to Services. Nups also reserves the right to modify, suspend, or temporarily or + permanently terminate any aspect of its services, including access to certain features, without notice or liability + to you. You acknowledge that Nups will not be liable to you or any third party for any changes, suspensions, or + interruptions of its services.

+ +

Responsibilities and Limitations

+

7.1 Disclaimer of Warranties. Nups services are provided "as is" and "as available," without any + warranties, express or implied. Nups does not guarantee the accuracy, completeness, reliability, or availability of + the services. You use Nups services at your own risk.

+

7.2 Limitation of Liability. To the fullest extent permitted by law, Nups will not be liable for + direct, indirect, incidental, special, consequential, or punitive damages arising from your use or inability to use + Nups services.

+ +

Termination

+

8.1 Termination by You. You may terminate your user account and stop using Nups services at any time. +

+

8.2 Termination by Nups. Nups reserves the right to terminate your user account and terminate your use + of the services, in whole or in part, if you violate these Terms and Conditions or if your use of the services is + detrimental to Nups or other users.

+ +

General Provisions

+

9.1 Entire Agreement. These Terms and Conditions constitute the entire agreement between you and Nups + regarding the use of Nups services and supersede all prior or contemporaneous agreements between you and Nups.

+

9.2 Applicable Law. These Terms and Conditions are governed and interpreted in accordance with the + laws of the country where Nups is headquartered.

+

9.3 Dispute Resolution. Any dispute arising from these Terms and Conditions shall be subject to the + exclusive jurisdiction of the courts of the country where Nups is headquartered.

+

9.4 Severability. If any provision of these Terms and Conditions is found to be invalid, illegal, or + unenforceable by a competent court, such provision shall be modified to the minimum extent necessary to make it + valid, legal, and enforceable, and the other provisions shall remain in full force.

+ +

Communications

+

10.1 Nups Communications. By using Nups services, you consent to receive communications from Nups, + including announcements, updates, promotional offers, and service-related messages.

+

10.2 User Communications. If you choose to contact Nups, you agree that Nups may respond to you using + the contact information you have provided.

+ +

Indemnification

+

11.1 Indemnification. You agree to indemnify, defend, and hold Nups, its officers, directors, + employees, agents, and representatives harmless from any claim, liability, loss, damage, cost, or expense, including + reasonable attorney's fees, arising from your use of Nups services or your violation of these Terms and Conditions. +

+ +

Copyright Infringement Notifications

+

12.1 Copyright Infringement Notifications. Nups respects the intellectual property rights of others. + If you believe that any content available on Nups services violates your copyrights, please submit a copyright + infringement notification in accordance with applicable law.

+ +

Severability of Provisions

+

13.1 Severability of Provisions. If any provision of these Terms and Conditions is found invalid, + illegal, or unenforceable by a competent court, such provision shall be modified to the minimum extent necessary to + make it valid, legal, and enforceable, and the other provisions shall remain in full force.

+ +

Language

+

14.1 Language of the Terms. In case of any discrepancy between the language versions of these Terms + and Conditions, the French version shall prevail.

+ +

Contact Us

+

15.1 Contact. If you have questions, concerns, or comments about these Terms and Conditions, please + contact us at the following address:

+

Nups Inc.
Address: [Address]
Email: [Email]
Phone: [Phone Number]

+ +

Thank you for reading our Terms and Conditions! We hope you enjoy using Nups services.

+
+ +@end \ No newline at end of file