@sapphire-caitlyn/schema-kit-ng 0.0.4 → 0.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"sapphire-caitlyn-schema-kit-ng.mjs","names":["i2","i2","i2","i2","i2","i2","i2","i2","HEX_REGEX","i2","i2","i2","i2","i2","i2","i2","i2","i3","i2","i2","i2","i2","i3.InputDateSpanComponent","i4.InputDateTimeSpanComponent","i5.InputTimeSpanComponent","i6.InputCpfCnpjComponent","i7.InputIconComponent","i8.InputMaskComponent","i9.InputNumberComponent","i10.InputPhoneComponent","i11.InputSelectComponent","i2","i1","i3","i2","i3.InputDateComponent","i4.InputDateSpanComponent","i5.InputDateTimeComponent","i6.InputDateTimeSpanComponent","i7.InputTimeComponent","i8.InputTimeSpanComponent","i9.InputBoolComponent","i10.InputCpfCnpjComponent","i11.InputFileComponent","i12.InputIconComponent","i13.InputMaskComponent","i14.InputNumberComponent","i15.InputPhoneComponent","i16.InputSelectComponent","i17.InputStringComponent","i18.InputTextAreaComponent","i19.InputJsonComponent","i1","BLACKLIST","STRICT_STRIP_REGEX","LOOSE_STRIP_REGEX","STRICT_MASK_REGEX","strip","format","generate","isValid","isValid","isCpfValid","isCnpjValid","isValid","isValid"],"sources":["../../../projects/schema-kit/src/lib/classes/schema-field/field-type.ts","../../../projects/schema-kit/src/lib/classes/schema-field/schema-field.ts","../../../projects/schema-kit/src/lib/classes/schema-field/schema-builder.ts","../../../projects/schema-kit/src/lib/components/inputs/loading-input/loading-input.component.ts","../../../projects/schema-kit/src/lib/components/inputs/loading-input/loading-input.component.html","../../../projects/schema-kit/src/lib/components/error-message-provider/error-message-provider.component.ts","../../../projects/schema-kit/src/lib/components/error-message-provider/error-message-provider.component.html","../../../projects/schema-kit/src/lib/services/id.service.ts","../../../projects/schema-kit/src/lib/components/inputs/input-base/input-base.component.ts","../../../projects/schema-kit/src/lib/components/inputs/input-base/input-base.component.html","../../../projects/schema-kit/src/lib/components/inputs/date/input-base-date/input-base-date.component.ts","../../../projects/schema-kit/src/lib/components/inputs/date/input-base-date/input-base-date.component.html","../../../projects/schema-kit/src/lib/components/inputs/date/input-date/input-date.component.ts","../../../projects/schema-kit/src/lib/components/inputs/date/input-date/input-date.component.html","../../../projects/schema-kit/src/lib/components/inputs/date/span.ts","../../../projects/schema-kit/src/lib/components/inputs/date/input-date-span/input-date-span.component.ts","../../../projects/schema-kit/src/lib/components/inputs/date/input-date-span/input-date-span.component.html","../../../projects/schema-kit/src/lib/directives/maskito-unmask.directive.ts","../../../projects/schema-kit/src/lib/components/inputs/date/input-date-time/input-date-time.component.ts","../../../projects/schema-kit/src/lib/components/inputs/date/input-date-time/input-date-time.component.html","../../../projects/schema-kit/src/lib/components/inputs/date/input-date-time-span/input-date-time-span.component.ts","../../../projects/schema-kit/src/lib/components/inputs/date/input-date-time-span/input-date-time-span.component.html","../../../projects/schema-kit/src/lib/components/inputs/date/input-base-time/input-base-time.component.ts","../../../projects/schema-kit/src/lib/components/inputs/date/input-base-time/input-base-time.component.html","../../../projects/schema-kit/src/lib/components/inputs/date/input-time/input-time.component.ts","../../../projects/schema-kit/src/lib/components/inputs/date/input-time/input-time.component.html","../../../projects/schema-kit/src/lib/components/inputs/date/input-time-span/input-time-span.component.ts","../../../projects/schema-kit/src/lib/components/inputs/date/input-time-span/input-time-span.component.html","../../../projects/schema-kit/src/lib/components/inputs/input-bool/input-bool.component.ts","../../../projects/schema-kit/src/lib/components/inputs/input-bool/input-bool.component.html","../../../projects/schema-kit/src/lib/components/inputs/input-color/color-picker/color-picker.component.ts","../../../projects/schema-kit/src/lib/components/inputs/input-color/color-picker/color-picker.component.html","../../../projects/schema-kit/src/lib/components/inputs/input-color/input-color.component.ts","../../../projects/schema-kit/src/lib/components/inputs/input-color/input-color.component.html","../../../projects/schema-kit/src/lib/components/inputs/input-cpf-cnpj/input-cpf-cnpj.component.ts","../../../projects/schema-kit/src/lib/components/inputs/input-cpf-cnpj/input-cpf-cnpj.component.html","../../../projects/schema-kit/src/lib/components/ui/loading/loading.component.ts","../../../projects/schema-kit/src/lib/components/ui/loading/loading.component.html","../../../projects/schema-kit/src/lib/components/ui/file-preview/file-preview.component.ts","../../../projects/schema-kit/src/lib/components/ui/file-preview/file-preview.component.html","../../../projects/schema-kit/src/lib/components/inputs/input-file/input-file.component.ts","../../../projects/schema-kit/src/lib/components/inputs/input-file/input-file.component.html","../../../projects/schema-kit/src/lib/components/inputs/input-icon/input-icon.component.ts","../../../projects/schema-kit/src/lib/components/inputs/input-icon/input-icon.component.html","../../../projects/schema-kit/src/lib/components/inputs/input-mask/input-mask.component.ts","../../../projects/schema-kit/src/lib/components/inputs/input-mask/input-mask.component.html","../../../projects/schema-kit/src/lib/components/inputs/input-number/input-number.component.ts","../../../projects/schema-kit/src/lib/components/inputs/input-number/input-number.component.html","../../../projects/schema-kit/src/lib/components/inputs/input-phone/input-phone.component.ts","../../../projects/schema-kit/src/lib/components/inputs/input-phone/input-phone.component.html","../../../projects/schema-kit/src/lib/services/environment.service.ts","../../../projects/schema-kit/src/lib/components/alert/alert.component.ts","../../../projects/schema-kit/src/lib/components/alert/alert.component.html","../../../projects/schema-kit/src/lib/services/alert.service.ts","../../../projects/schema-kit/src/lib/services/web/schema.service.ts","../../../projects/schema-kit/src/lib/components/inputs/input-select/input-select.component.ts","../../../projects/schema-kit/src/lib/components/inputs/input-select/input-select.component.html","../../../projects/schema-kit/src/lib/components/inputs/input-string/input-string.component.ts","../../../projects/schema-kit/src/lib/components/inputs/input-string/input-string.component.html","../../../projects/schema-kit/src/lib/components/inputs/input-text-area/input-text-area.component.ts","../../../projects/schema-kit/src/lib/components/inputs/input-text-area/input-text-area.component.html","../../../projects/schema-kit/src/lib/components/inputs/input-json/input-json.component.ts","../../../projects/schema-kit/src/lib/components/inputs/input-json/input-json.component.html","../../../projects/schema-kit/src/lib/components/inputs/input-index.ts","../../../projects/schema-kit/src/lib/components/schema-table/schema-table-filter/schema-table-filter.component.ts","../../../projects/schema-kit/src/lib/components/schema-table/schema-table-filter/schema-table-filter.component.html","../../../projects/schema-kit/src/lib/schema-kit.module.ts","../../../projects/schema-kit/src/lib/pipes/has-permissao.pipe.ts","../../../projects/schema-kit/src/lib/interfaces/index-params.ts","../../../projects/schema-kit/src/lib/components/schema-table/schema-table-actions.directive.ts","../../../projects/schema-kit/src/lib/components/schema-table/schema-table-replacement-for.directive.ts","../../../projects/schema-kit/src/lib/components/ui/breadcrumbs/breadcrumbs.component.ts","../../../projects/schema-kit/src/lib/components/ui/breadcrumbs/breadcrumbs.component.html","../../../projects/schema-kit/src/lib/components/schema-table/schema-table-toolbar.directive.ts","../../../projects/schema-kit/src/lib/components/schema-table/schema-table.component.ts","../../../projects/schema-kit/src/lib/components/schema-table/schema-table.component.html","../../../projects/schema-kit/src/lib/components/schema-view/schema-view-content.directive.ts","../../../projects/schema-kit/src/lib/components/ui/save-button/save-button.component.ts","../../../projects/schema-kit/src/lib/components/ui/save-button/save-button.component.html","../../../projects/schema-kit/src/lib/components/schema-view/schema-view.component.ts","../../../projects/schema-kit/src/lib/components/schema-view/schema-view.component.html","../../../projects/schema-kit/src/lib/components/ui/blurry-text-reveal/blurry-text-reveal.component.ts","../../../projects/schema-kit/src/lib/components/ui/blurry-text-reveal/blurry-text-reveal.component.html","../../../projects/schema-kit/src/lib/components/ui/suspended-slider/suspended-slide.directive.ts","../../../projects/schema-kit/src/lib/components/ui/suspended-slider/suspended-slider.component.ts","../../../projects/schema-kit/src/lib/components/ui/suspended-slider/suspended-slider.component.html","../../../projects/schema-kit/src/lib/components/ui/tree-drag-drop/tree-drag-drop-node.directive.ts","../../../projects/schema-kit/src/lib/components/ui/tree-drag-drop/tree-drag-drop.utils.ts","../../../projects/schema-kit/src/lib/components/ui/tree-drag-drop/tree-drag-drop.component.ts","../../../projects/schema-kit/src/lib/components/ui/tree-drag-drop/tree-drag-drop.component.html","../../../projects/schema-kit/src/lib/components/ui/schema-dialog/schema-dialog.component.ts","../../../projects/schema-kit/src/lib/components/ui/schema-dialog/schema-dialog.component.html","../../../projects/schema-kit/src/lib/components/ui/schema-dialog/schema-dialog-controller.service.ts","../../../projects/schema-kit/src/lib/utils/field-validator-as-rule.ts","../../../projects/schema-kit/src/lib/validators/cnpj.validator.ts","../../../projects/schema-kit/src/lib/validators/cpf.validator.ts","../../../projects/schema-kit/src/lib/validators/cpf-cnpj.validator.ts","../../../projects/schema-kit/src/lib/validators/url.validator.ts","../../../projects/schema-kit/src/lib/validators/password.validator.ts","../../../projects/schema-kit/src/lib/index.ts"],"sourcesContent":["export enum FieldType {\n UUID = \"UUID\",\n Bool = \"Bool\",\n \n Date = \"Date\",\n DateTime = \"DateTime\",\n Time = \"Time\",\n\n DateSpan = \"DateSpan\",\n DateTimeSpan = \"DateTimeSpan\",\n TimeSpan = \"TimeSpan\",\n \n Mask = \"Mask\",\n\n JSON = \"JSON\",\n Currency = \"Currency\",\n Decimal = \"Decimal\",\n Number = \"Number\",\n \n File = \"File\",\n String = \"String\",\n Phone = \"Phone\",\n TextArea = \"TextArea\",\n Select = \"Select\",\n \n Cpf = \"Cpf\",\n Cnpj = \"Cnpj\",\n CpfCnpj = \"CpfCnpj\",\n Icon = \"Icon\",\n}\nexport const lstDateTypes = [FieldType.Date, FieldType.DateTime, FieldType.Time];","import { PathKind, SchemaPath, SchemaPathRules } from '@angular/forms/signals';\nimport { TemplateRef, Type } from '@angular/core';\nimport { MaskitoOptions } from '@maskito/core';\n\nimport { FieldType } from './field-type';\nimport type { AnySchemaService } from '../../services/web/schema.service';\nimport { IIndexFilter } from '../../interfaces/index-params';\nimport { TBindLabel, TBindValue } from '../../components/inputs/input-select/input-select.component';\n\n/** Regra aplicada ao path de um campo (ex.: `required`, `email`, `cnpjValidator`) */\nexport type FieldRule<Value> = (path: SchemaPath<Value, SchemaPathRules.Supported, PathKind.Child>) => void;\n\nconst DefaultClassOverrideMap: Partial<Record<FieldType, string>> = {\n TextArea: \"col-span-full\",\n}\n\nexport class SchemaField<\n T, \n Key extends keyof T = keyof T, \n Value = T[Key]\n> implements Omit<SchemaFieldOptionsBase<T, Key, Value>, 'hidden' | 'validators'> {\n class : string = \"xl:col-span-3 md:col-span-6 col-span-full\";\n validators: FieldRule<Value>[];\n\n constructor(options: SchemaFieldOptionsBase<T, Key, Value>) {\n this.readonly = options.readonly || false;\n this.type = options.type;\n this.label = options.label;\n this.index = options.index;\n this.defaultValue = options.defaultValue;\n this.listOptions = options.listOptions;\n this.options = options.options;\n this.tooltipInfo = options.tooltipInfo;\n this.placeholder = options.placeholder;\n\n this.validators = [];\n if(options.validators && Array.isArray(options.validators)) {\n this.validators = options.validators;\n } else if(options.validators) {\n this.validators = [options.validators];\n }\n \n\n if(typeof options.hidden === 'boolean') {\n this.hiddenForm = options.hidden;\n this.hiddenList = options.hidden;\n } else {\n this.hiddenForm = options.hidden?.hiddenForm ?? false;\n this.hiddenList = options.hidden?.hiddenList ?? false;\n }\n\n\n\n const defaultClass = DefaultClassOverrideMap[options.type];\n this.class = options.class ?? defaultClass ?? this.class;\n }\n\n readonly: boolean;\n type: FieldType;\n label: string;\n index: Key;\n hiddenList: boolean; \n hiddenForm: boolean; \n listOptions: SchemaFieldOptionsBase<T>['listOptions']\n options?: SchemaFieldAnyTypeOptions<Value>;\n placeholder?: string;\n defaultValue?: Value;\n tooltipInfo?: string;\n}\n\nexport type SchemaFieldOptionsBase<T, Key extends keyof T = keyof T, Value = T[Key]> =\n SchemaFieldOptionsCommon<T, Key, Value> &\n SchemaFieldTypeOptions<Value>;\n\nexport interface SchemaFieldOptionsCommon<\n T, \n Key extends keyof T = keyof T, \n Value = T[Key]\n> {\n /** Classes css para o campo na view (edição) */\n class?: string;\n /** Indica se o campo está desativado */\n readonly?: boolean;\n /** Label do campo */\n label: string;\n /** Nome do campo no objeto para binding */\n index: Key;\n\n defaultValue?: Value;\n /** Validadores do campo */\n validators?: FieldRule<Value> | FieldRule<Value>[] | undefined;\n /** Indica se o campo está oculto */\n hidden?: boolean | {\n hiddenList?: boolean;\n hiddenForm?: boolean;\n };\n\n placeholder?: string;\n\n listOptions?: {\n template?: TemplateRef<unknown> | Type<unknown> |\n ((value: T) => TemplateRef<unknown> | Type<unknown> | string);\n }\n\n /** Tipo do campo */\n type: FieldType;\n\n tooltipInfo?: string;\n}\n\n/** Select alimentado por um `SchemaService` (busca paginada no backend) */\nexport interface SelectServiceOptions {\n service: () => AnySchemaService;\n lstFilter?: IIndexFilter<any, unknown>[];\n clearable?: boolean;\n lstOptions?: never;\n bindValue?: never;\n bindLabel?: never;\n}\n\n/** Select com lista estática; `bindValue` deve produzir o tipo do campo */\nexport interface SelectStaticOptions<Value, Item = any> {\n lstOptions: readonly Item[];\n bindValue: TBindValue<Item, Value>;\n bindLabel: TBindLabel<Item>;\n clearable?: boolean;\n service?: never;\n lstFilter?: never;\n}\n\n/** Opções específicas de cada tipo de campo, indexadas pelo `FieldType` */\nexport interface SchemaFieldTypeOptionsMap<Value = unknown> {\n [FieldType.String]: {\n type?: HTMLInputElement['type'];\n };\n [FieldType.Select]: SelectServiceOptions | SelectStaticOptions<Value>;\n [FieldType.Mask]: {\n maskitoOptions: MaskitoOptions;\n unmaskHandler?: (value: string) => string | null;\n }\n [FieldType.File]: {\n clearable?: boolean;\n }\n}\n\n/** União discriminada por `type`: `options` só é aceito nos tipos presentes em `SchemaFieldTypeOptionsMap` */\nexport type SchemaFieldTypeOptions<Value = unknown> = {\n [F in FieldType]: {\n type: F;\n options?: F extends keyof SchemaFieldTypeOptionsMap ? SchemaFieldTypeOptionsMap<Value>[F] : never;\n };\n}[FieldType];\n\ntype AllKeys<U> = U extends unknown ? keyof U : never;\n\n/** Une todas as variantes de `U` num único objeto com todas as chaves opcionais (ignora as chaves `never`) */\ntype MergeUnion<U> = {\n [K in AllKeys<U>]?: U extends unknown ? (K extends keyof U ? Exclude<U[K], undefined> : never) : never;\n};\n\n/**\n * Todas as opções de todos os tipos, opcionais. Usado no `SchemaField`, onde `options` não é\n * estreitado por `type` (ex.: `@switch (item.type)` no template não estreita `item.options`)\n */\nexport type SchemaFieldAnyTypeOptions<Value = unknown> = MergeUnion<SchemaFieldTypeOptionsMap<Value>[keyof SchemaFieldTypeOptionsMap]>;\n\n/** `Omit` que preserva uniões discriminadas */\nexport type DistributiveOmit<T, K extends PropertyKey> = T extends unknown ? Omit<T, K> : never;\n","import { Injector, signal } from \"@angular/core\";\nimport { FieldTree, form, readonly, schema, Schema } from \"@angular/forms/signals\";\n\nimport { DistributiveOmit, FieldRule, SchemaField, SchemaFieldOptionsBase } from \"./schema-field\";\nimport { FieldType } from \"./field-type\";\n\nexport class SchemaBuilder {\n static build<T>(schema: SchemaFieldOptionsRecord<T>): SchemaField<T>[] {\n return (Object.keys(schema) as (keyof T)[]).map(key => {\n return new SchemaField<T>({\n ...(schema[key] as SchemaFieldOptions<T>),\n index: key,\n });\n });\n }\n\n static createForm<T>(injector: Injector, schema: SchemaFieldOptionsRecord<T>): FieldTree<T> {\n const lstFields = this.build(schema);\n return form(signal(this.defaultValues(lstFields)), this.toSchema<T>(lstFields), { injector: injector });\n }\n\n /** Valor inicial do form: `defaultValue` do campo, ou o padrão do seu `type` */\n static defaultValues<T>(lstFields: SchemaField<T>[]): T {\n const defaultByType: Record<FieldType, unknown> = {\n Date: null,\n DateTime: null,\n Time: null,\n DateSpan: null,\n DateTimeSpan: null,\n TimeSpan: null,\n Mask: null,\n JSON: null,\n Currency: 0,\n Decimal: 0,\n Number: 0,\n Bool: false,\n String: null,\n TextArea: null,\n UUID: null,\n Icon: null,\n File: null,\n Phone: null,\n Select: null,\n Cpf: null,\n Cnpj: null,\n CpfCnpj: null,\n }\n return Object.fromEntries(\n lstFields.map((f) => [f.index, f.defaultValue !== undefined ? f.defaultValue : defaultByType[f.type]])\n ) as unknown as T;\n }\n\n public static toSchema<T>(lstFields: SchemaField<T>[]): Schema<T>{\n const formSchema = schema<T>((path) => {\n for (const field of lstFields) {\n const prop = field.index\n const fieldPath = (path as unknown as Record<keyof T, Parameters<FieldRule<T[keyof T]>>[0]>)[prop];\n if(field.validators.length){\n for (const validator of field.validators) {\n validator(fieldPath)\n }\n }\n if(field.readonly) {\n readonly(fieldPath)\n }\n }\n })\n return formSchema;\n }\n}\n\nexport type SchemaFieldOptions<T, K extends keyof T = keyof T> = DistributiveOmit<SchemaFieldOptionsBase<T, K>, 'index'>;\n\nexport type SchemaFieldOptionsRecord<T> = {\n [K in keyof T]?: SchemaFieldOptions<T, K>;\n};\n","import { CommonModule } from '@angular/common';\nimport { Component, input, InputSignal } from '@angular/core';\n\nimport { HlmSkeletonImports } from '@sapphire-caitlyn/schema-kit-ng/helm';\n\n@Component({\n imports: [\n HlmSkeletonImports,\n CommonModule\n ],\n selector: 'loading-input',\n styleUrl: './loading-input.component.scss',\n templateUrl: './loading-input.component.html',\n})\nexport class LoadingInputComponent {\n loading: InputSignal<boolean> = input<boolean>(false);\n}\n","<div\n class=\"absolute top-0 left-0 size-full\"\n [ngClass]=\"{\n 'animate-in fade-in-0 slide-in-from-left-2': loading(),\n 'animate-out fade-out-0 slide-out-to-left-2 fill-mode-forwards pointer-events-none': !loading()\n }\"\n>\n <hlm-skeleton class=\"size-full\" />\n</div>","import { ValidationError, WithOptionalFieldTree } from '@angular/forms/signals';\nimport { Component, input } from '@angular/core';\n\n@Component({\n imports: [],\n selector: 'error-message-provider',\n styleUrl: './error-message-provider.component.scss',\n templateUrl: './error-message-provider.component.html',\n})\nexport class ErrorMessageProviderComponent {\n /** Erros de validação do campo */\n errors = input<readonly WithOptionalFieldTree<ValidationError>[]>([]);\n /** Indica se o campo é inválido */\n invalid = input<boolean>(false);\n /** Indica se o campo foi tocado */\n touched = input<boolean>(false);\n}\n","@if (invalid() && touched()) {\n <small class=\"text-destructive\">\n @for (item of errors(); track $index) {\n {{ item.message }}\n }\n </small>\n}\n","import { Service } from '@angular/core';\n\n/**\n * Gera ids únicos e sequenciais por prefixo (ex.: `input-1`, `input-2`, ...).\n * Os contadores vivem no serviço root, então cada prefixo é incrementado de forma independente\n * durante todo o ciclo de vida da aplicação.\n */\n@Service()\nexport class IdService {\n private counters = new Map<string, number>();\n\n /**\n * Retorna o próximo id para o prefixo informado.\n * @param prefix O prefixo do id.\n * @returns O id no formato `${prefix}-${n}`.\n */\n next(prefix = 'id'): string {\n const n = (this.counters.get(prefix) ?? 0) + 1;\n this.counters.set(prefix, n);\n return `${prefix}-${n}`;\n }\n}\n","import { Component, computed, inject, input, InputSignal, InputSignalWithTransform, ModelSignal, output, Signal, signal } from '@angular/core';\nimport { FormValueControl, ValidationError, WithOptionalFieldTree } from '@angular/forms/signals';\n\nimport { IdService } from '../../../services/id.service';\n\n@Component({\n imports: [],\n selector: 'lib-input-base',\n styleUrl: './input-base.component.scss',\n templateUrl: './input-base.component.html',\n})\nexport class InputBaseComponent {\n\n /** Label do input */\n label = input<string>('');\n /** Placeholder do input */\n placeholder = input<string | null | undefined>(null);\n /** Indica se o input está em estado de carregamento (Skeleton) */\n loading = input<boolean>(false);\n\n /** Id sequencial do input, usado para vincular label e controle */\n id = signal(inject(IdService).next('input'));\n\n /** Erros de validação (vinculado automaticamente pelo [formField]) */\n errors = input<readonly WithOptionalFieldTree<ValidationError>[]>([]);\n /** Indica se o campo é inválido (vinculado automaticamente pelo [formField]) */\n invalid = input<boolean>(false);\n /** Indica se o campo foi tocado (vinculado automaticamente pelo [formField]) */\n touched = input<boolean>(false);\n /**\n * Emitido quando o usuário termina de interagir com o campo (blur, seleção, limpar).\n * O [formField] escuta este output para marcar o campo como tocado; o estado `touched`\n * pertence ao formulário, então o `reset()` do form também limpa o input.\n */\n touch = output<void>();\n /** Informação para o tooltip */\n tooltipInfo: InputSignal<string | null | undefined> = input<string | null | undefined>(null);\n\n /** Indica se o campo é somente leitura (vinculado automaticamente pelo [formField]) */\n readonly: InputSignal<boolean> = input<boolean>(false);\n /** Indica se o campo está desabilitado (vinculado automaticamente pelo [formField]) */\n disabled: InputSignal<boolean> = input<boolean>(false);\n\n /** Bloqueia a edição do input quando o campo é somente leitura ou está desabilitado */\n isReadonly: Signal<boolean> = computed(() => this.readonly() || this.disabled());\n}\nexport interface IInputBaseComponent {\n label: InputSignal<string>;\n placeholder: InputSignal<string>;\n loading: InputSignal<boolean>;\n}","<p>input-base works!</p>\n","import { Component, computed, input } from '@angular/core';\nimport { DateTime } from 'luxon';\n\nimport { InputBaseComponent } from '../../input-base/input-base.component';\n\n@Component({\n imports: [],\n selector: 'input-base-date',\n styleUrl: './input-base-date.component.scss',\n templateUrl: './input-base-date.component.html',\n})\nexport class InputBaseDateComponent extends InputBaseComponent {\n constructor() {\n super();\n }\n\n /** Data máximă do input */\n maxDate = input<DateTime | null>(null);\n _maxDate = computed(() => this.maxDate()?.toJSDate());\n\n /** Data minima do input */\n minDate = input<DateTime | null>(null);\n _minDate = computed(() => this.minDate()?.toJSDate());\n\n /** Data focada por padrão */\n defaultFocusedDate = input<DateTime>(DateTime.now());\n\n _defaultFocusedDate = computed(() => this.defaultFocusedDate().toJSDate());\n}\n","","import { Component, computed, inject, input, model } from '@angular/core';\nimport { FormValueControl } from '@angular/forms/signals';\nimport { FormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { maskitoDate, MaskitoDateParams } from '@maskito/kit';\nimport { MaskitoDirective } from '@maskito/angular';\nimport { DateTime } from 'luxon';\nimport { MaskitoOptions } from '@maskito/core';\n\nimport { HlmDatePickerImports, HlmFieldImports, HlmTooltipImports } from '@sapphire-caitlyn/schema-kit-ng/helm';\nimport { NgIcon } from '@ng-icons/core';\n\nimport { LoadingInputComponent } from '../../loading-input/loading-input.component';\nimport { ErrorMessageProviderComponent } from '../../../error-message-provider/error-message-provider.component';\nimport { InputBaseDateComponent } from '../input-base-date/input-base-date.component';\n\n@Component({\n imports: [\n\t\tHlmTooltipImports,\n\t\tNgIcon,\n\t\tHlmDatePickerImports, \n\t\tHlmFieldImports, \n\t\tMaskitoDirective,\n\t\tFormsModule,\n CommonModule,\n LoadingInputComponent,\n ErrorMessageProviderComponent\n\t],\n selector: 'input-date',\n styleUrl: './input-date.component.scss',\n templateUrl: './input-date.component.html',\n})\nexport class InputDateComponent extends InputBaseDateComponent implements FormValueControl<string | null | undefined> {\n value = model<string | null | undefined>(null);\n\n\tpublic formatToReadable = (date: Date): string => DateTime.fromJSDate(date).toFormat('dd/MM/yyyy');\n\n\t// parseia o texto digitado no input (formato do maskito), não o value ISO\n\tpublic parseDate = (value: string): Date | null => {\n\t\tconst dt = DateTime.fromFormat(value, 'dd/MM/yyyy');\n\t\treturn dt.isValid ? dt.toJSDate() : null;\n\t};\n\n\t// value é ISO, mas o hlm-date-picker trabalha com Date\n\t// hlm-calendar quebra com null (isSameDay), então usa undefined quando não há data\n\tprotected date = computed(() => {\n\t\tconst value = this.value();\n\t\tif (!value) {\n\t\t\treturn undefined;\n\t\t}\n\t\tconst dt = DateTime.fromISO(value);\n\t\treturn dt.isValid ? dt.toJSDate() : undefined;\n\t});\n\tprotected setDate(date: Date | null) {\n\t\tthis.value.set(date ? DateTime.fromJSDate(date).toISO() : null);\n\t}\n\tprotected maskitoParams = computed<MaskitoDateParams>(() => {\n\t\treturn {\n\t\t\tmode: 'dd/mm/yyyy',\n\t\t\tseparator: '/', // default is '.'\n\t\t};\n\t});\n\tprotected maskitoOptions = computed<MaskitoOptions>(() => {\n\t\tconst params = this.maskitoParams();\n\t\treturn maskitoDate(params);\n\t});\n}\n","<hlm-field [forceInvalid]=\"touched() && invalid()\">\n @if(label()) {\n <label hlmFieldLabel [attr.for]=\"id()\">\n {{label()}}\n\n @if(tooltipInfo()){\n <ng-icon name=\"lucideCircleQuestionMark\" [hlmTooltip]=\"tooltipInfo()!\" position=\"top\"></ng-icon>\n }\n </label>\n }\n <hlm-date-picker\n [disabled]=\"isReadonly()\"\n class=\"relative\" \n captionLayout=\"dropdown\"\n [maxDate]=\"_maxDate()\"\n [minDate]=\"_minDate()\"\n [defaultFocusedDate]=\"_defaultFocusedDate()\"\n [formatDate]=\"formatToReadable\"\n [ngModel]=\"date()\"\n (ngModelChange)=\"setDate($event)\"\n >\n <hlm-date-picker-input\n [inputId]=\"id()\"\n placeholder=\"dd/MM/yyyy\"\n [parseDate]=\"parseDate\"\n [formatInputDate]=\"formatToReadable\"\n [maskito]=\"maskitoOptions()\"\n [forceInvalid]=\"touched() && invalid()\"\n />\n <ng-content select=\"[slot=input]\"></ng-content>\n <loading-input [loading]=\"loading()\"></loading-input>\n </hlm-date-picker>\n\n <error-message-provider [errors]=\"errors()\" [invalid]=\"invalid()\" [touched]=\"touched()\"></error-message-provider>\n</hlm-field>\n","import { effect, inject, untracked } from '@angular/core';\nimport { FieldTree, FormField } from '@angular/forms/signals';\n\n/**\n * Intervalo [início, fim] emitido pelos inputs *-span.\n * Mesmo formato dos filtros Date/DateTime/Time da API (`[min, max]`).\n * - input-date-span / input-date-time-span: ISO com offset, ie: `z.tuple([zExt.dateTime().nullable(), zExt.dateTime().nullable()])`\n * - input-time-span: `HH:mm:ss` (coluna `time` do postgres), ie: `z.tuple([z.iso.time().nullable(), z.iso.time().nullable()])`\n * - filtros Number/Decimal/Currency usam `Span<number>`\n *\n * Cada ponta pode ser null (intervalo aberto); o value inteiro é null quando as duas estão vazias.\n */\nexport type Span<T = string> = [T | null, T | null];\n\n/** Retorna uma cópia do span com a ponta `index` alterada; null quando as duas pontas ficam vazias. */\nexport function setSpanEdge<T = string>(span: Span<T> | null | undefined, index: 0 | 1, value: T | null): Span<T> | null {\n const next: Span<T> = [span?.[0] ?? null, span?.[1] ?? null];\n next[index] = value;\n return next[0] == null && next[1] == null ? null : next;\n}\n\n/**\n * Marca as pontas do span como dirty quando o campo fica dirty. Deve ser chamado no constructor do input.\n * Os inputs *-span trocam a tupla inteira, então o [formField] só marca o nó do campo, e o\n * extractValue({ dirty: true }) desce nos filhos de arrays sem olhar o dirty do nó: o span sumia do patch.\n * Sem [formField] (ex.: ngModel no schema-table-filter) não faz nada.\n */\nexport function markSpanEdgesDirtyOnChange(): void {\n const formField = inject(FormField, { self: true, optional: true });\n if (!formField) {\n return;\n }\n effect(() => {\n const field = formField.field() as unknown as FieldTree<Span<unknown>>;\n const state = field();\n // lê o value para reexecutar quando a tupla é (re)criada; com null não há pontas\n if (!state.dirty() || !Array.isArray(state.value())) {\n return;\n }\n untracked(() => {\n field[0]?.().markAsDirty();\n field[1]?.().markAsDirty();\n });\n });\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, computed, model } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { FormValueControl } from '@angular/forms/signals';\nimport { MaskitoDirective } from '@maskito/angular';\nimport { MaskitoOptions } from '@maskito/core';\nimport { maskitoDateRange, MaskitoDateRangeParams } from '@maskito/kit';\nimport { DateTime } from 'luxon';\n\nimport { HlmDatePickerImports, HlmFieldImports, HlmTooltipImports } from '@sapphire-caitlyn/schema-kit-ng/helm';\nimport { NgIcon } from '@ng-icons/core';\n\nimport { LoadingInputComponent } from '../../loading-input/loading-input.component';\nimport { ErrorMessageProviderComponent } from '../../../error-message-provider/error-message-provider.component';\nimport { InputBaseDateComponent } from '../input-base-date/input-base-date.component';\nimport { markSpanEdgesDirtyOnChange, Span } from '../span';\n\nconst DATE_FORMAT = 'dd/MM/yyyy';\nconst RANGE_SEPARATOR = ' - ';\n\n@Component({\n imports: [\n HlmTooltipImports,\n NgIcon,\n HlmDatePickerImports,\n HlmFieldImports,\n MaskitoDirective,\n FormsModule,\n CommonModule,\n LoadingInputComponent,\n ErrorMessageProviderComponent,\n ],\n selector: 'input-date-span',\n styleUrl: './input-date-span.component.scss',\n templateUrl: './input-date-span.component.html',\n})\nexport class InputDateSpanComponent extends InputBaseDateComponent implements FormValueControl<Span | null | undefined> {\n /** Intervalo [início, fim] em ISO (00:00 do dia, igual ao input-date) */\n value = model<Span | null | undefined>(null);\n\n constructor() {\n super();\n markSpanEdgesDirtyOnChange();\n }\n\n public formatDates = (dates: [Date | null, Date | null]): string =>\n dates\n .filter((date): date is Date => !!date)\n .map((date) => DateTime.fromJSDate(date).toFormat(DATE_FORMAT))\n .join(RANGE_SEPARATOR);\n\n // parseia o texto digitado no input (formato do maskito), não o value ISO\n // uma data só vira um intervalo de um dia; datas invertidas são ordenadas\n public parseDates = (value: string): [Date, Date] | null => {\n const parts = value.split(RANGE_SEPARATOR).map((part) => DateTime.fromFormat(part.trim(), DATE_FORMAT));\n if (parts.length > 2 || parts.some((dt) => !dt.isValid)) {\n return null;\n }\n const [start, end = start] = parts;\n return start <= end ? [start.toJSDate(), end.toJSDate()] : [end.toJSDate(), start.toJSDate()];\n };\n\n // value é ISO, mas o hlm-date-range-picker trabalha com Date\n // o picker só emite intervalos completos, então só repassa quando as duas pontas são válidas\n protected dates = computed<[Date, Date] | undefined>(() => {\n const [start, end] = (this.value() ?? []).map((v) => (v ? DateTime.fromISO(v) : null));\n if (!start?.isValid || !end?.isValid) {\n return undefined;\n }\n return [start.toJSDate(), end.toJSDate()];\n });\n protected setDates(dates: [Date, Date] | null) {\n this.value.set(dates ? [DateTime.fromJSDate(dates[0]).toISO(), DateTime.fromJSDate(dates[1]).toISO()] : null);\n }\n\n protected maskitoParams = computed<MaskitoDateRangeParams>(() => {\n return {\n mode: 'dd/mm/yyyy',\n dateSeparator: '/',\n rangeSeparator: RANGE_SEPARATOR,\n min: this._minDate(),\n max: this._maxDate(),\n };\n });\n protected maskitoOptions = computed<MaskitoOptions>(() => {\n return maskitoDateRange(this.maskitoParams());\n });\n}\n","<hlm-field [forceInvalid]=\"touched() && invalid()\">\n @if(label()) {\n <label hlmFieldLabel [attr.for]=\"id()\">\n {{label()}}\n\n @if(tooltipInfo()){\n <ng-icon name=\"lucideCircleQuestionMark\" [hlmTooltip]=\"tooltipInfo()!\" position=\"top\"></ng-icon>\n }\n </label>\n }\n <hlm-date-range-picker\n [disabled]=\"isReadonly()\"\n class=\"relative\"\n captionLayout=\"dropdown\"\n [maxDate]=\"_maxDate()\"\n [minDate]=\"_minDate()\"\n [formatDates]=\"formatDates\"\n [ngModel]=\"dates()\"\n (ngModelChange)=\"setDates($event)\"\n >\n <hlm-date-range-input\n [inputId]=\"id()\"\n [placeholder]=\"placeholder() || 'dd/MM/yyyy - dd/MM/yyyy'\"\n [parseDate]=\"parseDates\"\n [formatInputDates]=\"formatDates\"\n [maskito]=\"maskitoOptions()\"\n [forceInvalid]=\"touched() && invalid()\"\n (focusout)=\"touch.emit()\"\n />\n <ng-content select=\"[slot=input]\"></ng-content>\n <loading-input [loading]=\"loading()\"></loading-input>\n </hlm-date-range-picker>\n\n <error-message-provider [errors]=\"errors()\" [invalid]=\"invalid()\" [touched]=\"touched()\"></error-message-provider>\n</hlm-field>\n","import { AfterViewInit, Directive, inject, input } from '@angular/core';\nimport { DefaultValueAccessor } from '@angular/forms';\nimport { MaskitoDirective } from '@maskito/angular';\nimport { maskitoTransform } from '@maskito/core';\n\n// Baseado na receita \"Custom unmask handler\" da doc do Maskito (https://maskito.dev/frameworks/angular):\n// o model recebe o valor sem máscara e valores programáticos são exibidos mascarados\n@Directive({\n selector: '[maskito][unmaskHandler]',\n})\nexport class MaskitoUnmaskDirective implements AfterViewInit {\n private readonly accessor = inject(DefaultValueAccessor);\n private readonly maskitoDirective = inject(MaskitoDirective);\n\n unmaskHandler = input.required<(value: string) => any>();\n\n stringifyHandler = input<(value: any) => string>((value) => {\n const options = this.maskitoDirective.options();\n\n return options && value != null ? maskitoTransform(String(value), options) : (value ?? '');\n });\n\n ngAfterViewInit(): void {\n const originalOnChange = this.accessor.onChange.bind(this.accessor);\n const originalWriteValue = this.accessor.writeValue.bind(this.accessor);\n\n this.accessor.onChange = (value) => originalOnChange(this.unmaskHandler()(value));\n this.accessor.writeValue = (value) => originalWriteValue(this.stringifyHandler()(value));\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, computed, inject, input, model, Signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { FormValueControl } from '@angular/forms/signals';\nimport { MaskitoDirective } from '@maskito/angular';\nimport { MaskitoOptions } from '@maskito/core';\nimport { maskitoDate, MaskitoDateParams, maskitoDateTime, MaskitoDateTimeParams, maskitoTime, MaskitoTimeParams } from '@maskito/kit';\nimport { DateTime } from 'luxon';\n\nimport { NgIcon } from '@ng-icons/core';\nimport {\n HlmButton,\n HlmButtonImports,\n HlmCalendarImports,\n HlmDatePickerImports,\n HlmFieldImports,\n HlmInputImports,\n HlmInputGroupImports,\n HlmPopoverImports,\n HlmTooltipImports,\n} from '@sapphire-caitlyn/schema-kit-ng/helm';\n\nimport { MaskitoUnmaskDirective } from '../../../../directives/maskito-unmask.directive';\nimport { LoadingInputComponent } from '../../loading-input/loading-input.component';\nimport { ErrorMessageProviderComponent } from '../../../error-message-provider/error-message-provider.component';\nimport { InputBaseDateComponent } from '../input-base-date/input-base-date.component';\n\n@Component({\n imports: [\n HlmTooltipImports,\n HlmDatePickerImports,\n HlmInputImports,\n HlmInputGroupImports,\n HlmFieldImports,\n\t\tHlmButtonImports,\n MaskitoDirective,\n MaskitoUnmaskDirective,\n FormsModule,\n CommonModule,\n HlmPopoverImports,\n HlmCalendarImports,\n LoadingInputComponent,\n ErrorMessageProviderComponent,\n NgIcon,\n HlmButton\n],\n selector: 'input-date-time',\n styleUrl: './input-date-time.component.scss',\n templateUrl: './input-date-time.component.html',\n})\nexport class InputDateTimeComponent extends InputBaseDateComponent implements FormValueControl<string | null | undefined> {\n value = model<string | null | undefined>(null);\n\n /** Input que define se os segundos devem ser considerados. */\n enableSeconds = input<boolean>(true);\n\n\tprotected formatDate = (date: Date): string => DateTime.fromJSDate(date).toFormat('dd/MM/yyyy');\n\tprotected formatInputDate = (date: Date): string => DateTime.fromJSDate(date).toFormat('dd/MM/yyyy');\n\tprotected parseDate = (value: string): Date | null => {\n\t\tconst dt = DateTime.fromFormat(value, 'dd/MM/yyyy');\n\t\treturn dt.isValid ? dt.toJSDate() : null;\n\t};\n\n protected timeParams: Signal<MaskitoTimeParams> = computed(() => {\n return {\n mode: this.enableSeconds() ? 'HH:MM:SS' : 'HH:MM',\n }\n })\n protected timeMaskitoOptions: Signal<MaskitoOptions> = computed(() => {\n return maskitoTime(this.timeParams());\n })\n protected timePlaceholder: Signal<string> = computed(() => {\n return this.enableSeconds() ? 'HH:MM:SS' : 'HH:MM';\n })\n\n protected dateParams: Signal<MaskitoDateParams> = computed(() => {\n return {\n mode: 'dd/mm/yyyy',\n separator: '/',\n minDate: this._minDate(),\n maxDate: this._maxDate(),\n }\n })\n protected dateMaskitoOptions: Signal<MaskitoOptions> = computed(() => {\n return maskitoDate(this.dateParams());\n })\n protected dateTimeParams: Signal<MaskitoDateTimeParams> = computed(() => {\n const params: MaskitoDateTimeParams = {\n dateMode: this.dateParams().mode,\n dateSeparator: '/',\n dateTimeSeparator: ' ',\n timeMode: this.timeParams().mode,\n min: this._minDate() ?? undefined,\n max: this._maxDate() ?? undefined,\n }\n return params;\n })\n protected dateTimeMaskitoOptions: Signal<MaskitoOptions> = computed(() => {\n return maskitoDateTime(this.dateTimeParams());\n })\n\n // hlm-calendar quebra com null (isSameDay), então usa undefined quando não há data\n date = computed(() => this.dateTimeValue()?.toJSDate() ?? undefined);\n setDate(date: Date | null) {\n if (!date) {\n this.value.set(null);\n return;\n }\n // luxon é imutável: set() retorna uma nova instância\n const dt = DateTime.fromJSDate(date).set({\n hour: this.dateTimeValue()?.hour ?? 0,\n minute: this.dateTimeValue()?.minute ?? 0,\n second: this.dateTimeValue()?.second ?? 0,\n });\n this.value.set(dt.toISO());\n }\n\n // formato luxon equivalente ao timeMaskitoOptions\n private timeFormat = computed(() => this.enableSeconds() ? 'HH:mm:ss' : 'HH:mm');\n\n time = computed(() => this.dateTimeValue()?.toFormat(this.timeFormat()) ?? '');\n setTime(time: string) {\n // enquanto digita o maskito emite valores parciais; só aplica quando o horário estiver completo\n const parsed = DateTime.fromFormat(time, this.timeFormat());\n if (!parsed.isValid) {\n return;\n }\n const base = this.dateTimeValue() ?? DateTime.now().startOf('day');\n const dt = base.set({\n hour: parsed.hour,\n minute: parsed.minute,\n second: this.enableSeconds() ? parsed.second : base.second,\n });\n this.value.set(dt.toISO());\n }\n\n // value é sempre ISO (setDate, setTime e unmask gravam ISO)\n private dateTimeValue = computed(() => {\n const value = this.value();\n if (!value) {\n return null;\n }\n const dt = DateTime.fromISO(value);\n return dt.isValid ? dt : null;\n });\n\n // formato luxon equivalente ao dateTimeMaskitoOptions\n private displayFormat = computed(() => \n this.enableSeconds() ? 'dd/MM/yyyy HH:mm:ss' : 'dd/MM/yyyy HH:mm'\n );\n\n unmask = (masked: string): string | null => {\n if (!masked) {\n return null;\n }\n const dt = DateTime.fromFormat(masked, this.displayFormat());\n return dt.isValid ? dt.toISO() : null;\n }\n\n // value chega como ISO; sem isso o maskito tenta mascarar a string ISO crua\n stringify = (value: string | null | undefined): string => {\n if (!value) {\n return '';\n }\n const dt = DateTime.fromISO(value);\n return dt.isValid ? dt.toFormat(this.displayFormat()) : '';\n }\n\n clear(){\n this.value.set(null);\n }\n}","<hlm-field [forceInvalid]=\"touched() && invalid()\">\n @if(label()) {\n <label hlmFieldLabel [attr.for]=\"id()\">\n {{label()}}\n\n @if(tooltipInfo()){\n <ng-icon name=\"lucideCircleQuestionMark\" [hlmTooltip]=\"tooltipInfo()!\" position=\"top\"></ng-icon>\n }\n </label>\n }\n <hlm-popover [attachTo]=\"inputGroup\">\n <hlm-input-group #inputGroup class=\"relative\">\n <input \n hlmInputGroupInput\n [(ngModel)]=\"value\"\n [disabled]=\"isReadonly()\"\n [attr.id]=\"id()\"\n hlmPopoverTrigger \n type=\"text\" \n [maskito]=\"dateTimeMaskitoOptions()\"\n [unmaskHandler]=\"unmask\"\n [stringifyHandler]=\"stringify\"\n [placeholder]=\"placeholder() || ''\"\n />\n <hlm-input-group-addon align=\"inline-end\">\n @if(value() && !isReadonly()){\n <button\n hlmInputGroupButton\n size=\"icon-xs\"\n variant=\"ghost\"\n (click)=\"clear()\"\n >\n <ng-icon name=\"lucideCircleX\" />\n </button>\n }\n </hlm-input-group-addon>\n <hlm-input-group-addon align=\"inline-end\">\n <button\n hlmPopoverTrigger\n hlmInputGroupButton\n size=\"icon-xs\"\n [disabled]=\"isReadonly()\"\n >\n <ng-icon name=\"lucideCalendar\" />\n </button>\n </hlm-input-group-addon>\n\n <loading-input [loading]=\"loading()\"></loading-input>\n </hlm-input-group>\n\n <hlm-popover-content class=\"w-fit p-0\" *hlmPopoverPortal=\"let ctx\">\n <div class=\"flex flex-col gap-2 overflow-hidden\">\n <hlm-calendar\n captionLayout=\"dropdown\"\n [max]=\"_maxDate()\"\n [min]=\"_minDate()\"\n class=\"rounded-none border-0\"\n [date]=\"date()\"\n (dateChange)=\"setDate($event)\"\n />\n <div class=\"p-1\">\n <div hlmField>\n <input\n hlmInput\n type=\"text\"\n [ngModel]=\"time()\"\n (ngModelChange)=\"setTime($event)\"\n [placeholder]=\"timePlaceholder()\"\n [maskito]=\"timeMaskitoOptions()\"\n />\n </div>\n </div>\n </div>\n <ng-content select=\"[hlmDatePickerFooter]\" />\n </hlm-popover-content>\n </hlm-popover>\n\n <error-message-provider [errors]=\"errors()\" [invalid]=\"invalid()\" [touched]=\"touched()\"></error-message-provider>\n</hlm-field>\n","import { CommonModule } from '@angular/common';\nimport { Component, computed, input, model, Signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { FormValueControl } from '@angular/forms/signals';\nimport { MaskitoDirective } from '@maskito/angular';\nimport { MaskitoOptions } from '@maskito/core';\nimport { maskitoDateTime, MaskitoDateTimeParams, maskitoTime, MaskitoTimeParams } from '@maskito/kit';\nimport { DateTime } from 'luxon';\n\nimport { NgIcon } from '@ng-icons/core';\nimport {\n HlmButtonImports,\n HlmCalendarImports,\n HlmFieldImports,\n HlmInputImports,\n HlmInputGroupImports,\n HlmPopoverImports,\n HlmTooltipImports,\n} from '@sapphire-caitlyn/schema-kit-ng/helm';\n\nimport { MaskitoUnmaskDirective } from '../../../../directives/maskito-unmask.directive';\nimport { LoadingInputComponent } from '../../loading-input/loading-input.component';\nimport { ErrorMessageProviderComponent } from '../../../error-message-provider/error-message-provider.component';\nimport { InputBaseDateComponent } from '../input-base-date/input-base-date.component';\nimport { markSpanEdgesDirtyOnChange, setSpanEdge, Span } from '../span';\n\n@Component({\n imports: [\n HlmTooltipImports,\n HlmInputImports,\n HlmInputGroupImports,\n HlmFieldImports,\n HlmButtonImports,\n MaskitoDirective,\n MaskitoUnmaskDirective,\n FormsModule,\n CommonModule,\n HlmPopoverImports,\n HlmCalendarImports,\n LoadingInputComponent,\n ErrorMessageProviderComponent,\n NgIcon,\n ],\n selector: 'input-date-time-span',\n styleUrl: './input-date-time-span.component.scss',\n templateUrl: './input-date-time-span.component.html',\n})\nexport class InputDateTimeSpanComponent extends InputBaseDateComponent implements FormValueControl<Span | null | undefined> {\n /** Intervalo [início, fim] em ISO com offset (timestamptz) */\n value = model<Span | null | undefined>(null);\n\n constructor() {\n super();\n markSpanEdgesDirtyOnChange();\n }\n\n /** Input que define se os segundos devem ser considerados. */\n enableSeconds = input<boolean>(true);\n\n protected timeParams: Signal<MaskitoTimeParams> = computed(() => {\n return {\n mode: this.enableSeconds() ? 'HH:MM:SS' : 'HH:MM',\n }\n })\n protected timeMaskitoOptions: Signal<MaskitoOptions> = computed(() => {\n return maskitoTime(this.timeParams());\n })\n protected timePlaceholder: Signal<string> = computed(() => {\n return this.enableSeconds() ? 'HH:MM:SS' : 'HH:MM';\n })\n\n protected dateTimeParams: Signal<MaskitoDateTimeParams> = computed(() => {\n return {\n dateMode: 'dd/mm/yyyy',\n dateSeparator: '/',\n dateTimeSeparator: ' ',\n timeMode: this.timeParams().mode,\n min: this._minDate() ?? undefined,\n max: this._maxDate() ?? undefined,\n }\n })\n protected dateTimeMaskitoOptions: Signal<MaskitoOptions> = computed(() => {\n return maskitoDateTime(this.dateTimeParams());\n })\n protected dateTimePlaceholder: Signal<string> = computed(() => {\n return `dd/MM/yyyy ${this.timePlaceholder()}`;\n })\n\n // value é sempre ISO (setDate, setTime e unmask gravam ISO)\n private edges = computed(() => {\n const [start, end] = this.value() ?? [null, null];\n return [this.parseIso(start), this.parseIso(end)] as const;\n });\n\n // hlm-calendar-range quebra com null, então usa undefined quando não há data\n protected startDate = computed(() => this.edges()[0]?.toJSDate() ?? undefined);\n protected endDate = computed(() => this.edges()[1]?.toJSDate() ?? undefined);\n\n // formato luxon equivalente ao timeMaskitoOptions\n private timeFormat = computed(() => this.enableSeconds() ? 'HH:mm:ss' : 'HH:mm');\n\n protected startTime = computed(() => this.edges()[0]?.toFormat(this.timeFormat()) ?? '');\n protected endTime = computed(() => this.edges()[1]?.toFormat(this.timeFormat()) ?? '');\n\n setEdge(index: 0 | 1, iso: string | null) {\n this.value.set(setSpanEdge(this.value(), index, iso));\n }\n\n // ao iniciar uma nova seleção o calendário emite undefined para o fim\n setDate(index: 0 | 1, date: Date | undefined) {\n if (!date) {\n this.setEdge(index, null);\n return;\n }\n const current = this.edges()[index];\n // luxon é imutável: set() retorna uma nova instância\n const dt = DateTime.fromJSDate(date).set({\n hour: current?.hour ?? 0,\n minute: current?.minute ?? 0,\n second: current?.second ?? 0,\n });\n this.setEdge(index, dt.toISO());\n }\n\n setTime(index: 0 | 1, time: string) {\n // enquanto digita o maskito emite valores parciais; só aplica quando o horário estiver completo\n const parsed = DateTime.fromFormat(time, this.timeFormat());\n if (!parsed.isValid) {\n return;\n }\n const base = this.edges()[index] ?? DateTime.now().startOf('day');\n const dt = base.set({\n hour: parsed.hour,\n minute: parsed.minute,\n second: this.enableSeconds() ? parsed.second : base.second,\n });\n this.setEdge(index, dt.toISO());\n }\n\n private parseIso(value: string | null): DateTime | null {\n if (!value) {\n return null;\n }\n const dt = DateTime.fromISO(value);\n return dt.isValid ? dt : null;\n }\n\n // formato luxon equivalente ao dateTimeMaskitoOptions\n private displayFormat = computed(() =>\n this.enableSeconds() ? 'dd/MM/yyyy HH:mm:ss' : 'dd/MM/yyyy HH:mm'\n );\n\n unmask = (masked: string): string | null => {\n if (!masked) {\n return null;\n }\n const dt = DateTime.fromFormat(masked, this.displayFormat());\n return dt.isValid ? dt.toISO() : null;\n }\n\n // value chega como ISO; sem isso o maskito tenta mascarar a string ISO crua\n stringify = (value: string | null | undefined): string => {\n if (!value) {\n return '';\n }\n const dt = DateTime.fromISO(value);\n return dt.isValid ? dt.toFormat(this.displayFormat()) : '';\n }\n\n clear() {\n this.value.set(null);\n this.touch.emit();\n }\n}\n","<hlm-field [forceInvalid]=\"touched() && invalid()\">\n @if(label()) {\n <label hlmFieldLabel [attr.for]=\"id()\">\n {{label()}}\n\n @if(tooltipInfo()){\n <ng-icon name=\"lucideCircleQuestionMark\" [hlmTooltip]=\"tooltipInfo()!\" position=\"top\"></ng-icon>\n }\n </label>\n }\n <hlm-popover [attachTo]=\"inputGroup\">\n <hlm-input-group #inputGroup class=\"relative\">\n <!-- \"?? null\": undefined faria o ngModel reescrever (e apagar) o texto incompleto que está sendo digitado -->\n <input\n hlmInputGroupInput\n [ngModel]=\"value()?.[0] ?? null\"\n (ngModelChange)=\"setEdge(0, $event)\"\n [disabled]=\"isReadonly()\"\n [attr.id]=\"id()\"\n type=\"text\"\n [maskito]=\"dateTimeMaskitoOptions()\"\n [unmaskHandler]=\"unmask\"\n [stringifyHandler]=\"stringify\"\n [placeholder]=\"placeholder() || dateTimePlaceholder()\"\n [forceInvalid]=\"touched() && invalid()\"\n (blur)=\"touch.emit()\"\n />\n <span hlmInputGroupText>–</span>\n <input\n hlmInputGroupInput\n [ngModel]=\"value()?.[1] ?? null\"\n (ngModelChange)=\"setEdge(1, $event)\"\n [disabled]=\"isReadonly()\"\n type=\"text\"\n [maskito]=\"dateTimeMaskitoOptions()\"\n [unmaskHandler]=\"unmask\"\n [stringifyHandler]=\"stringify\"\n [placeholder]=\"placeholder() || dateTimePlaceholder()\"\n [forceInvalid]=\"touched() && invalid()\"\n (blur)=\"touch.emit()\"\n />\n <hlm-input-group-addon align=\"inline-end\">\n @if(value() && !isReadonly()){\n <button\n hlmInputGroupButton\n size=\"icon-xs\"\n variant=\"ghost\"\n (click)=\"clear()\"\n >\n <ng-icon name=\"lucideCircleX\" />\n </button>\n }\n </hlm-input-group-addon>\n <hlm-input-group-addon align=\"inline-end\">\n <button\n hlmPopoverTrigger\n hlmInputGroupButton\n size=\"icon-xs\"\n [disabled]=\"isReadonly()\"\n >\n <ng-icon name=\"lucideCalendar\" />\n </button>\n </hlm-input-group-addon>\n\n <loading-input [loading]=\"loading()\"></loading-input>\n </hlm-input-group>\n\n <hlm-popover-content class=\"w-fit p-0\" *hlmPopoverPortal=\"let ctx\">\n <div class=\"flex flex-col gap-2 overflow-hidden\">\n <hlm-calendar-range\n captionLayout=\"dropdown\"\n [max]=\"_maxDate()\"\n [min]=\"_minDate()\"\n class=\"rounded-none border-0\"\n [startDate]=\"startDate()\"\n [endDate]=\"endDate()\"\n (startDateChange)=\"setDate(0, $event)\"\n (endDateChange)=\"setDate(1, $event)\"\n />\n <div class=\"grid grid-cols-1 gap-2 p-1\">\n <hlm-field [forceInvalid]=\"touched() && invalid()\">\n <label hlmFieldLabel [attr.for]=\"id()+'-start'\">Horário inicial</label>\n <input\n hlmInput\n type=\"text\"\n [id]=\"id()+'-start'\"\n aria-label=\"Horário inicial\"\n [ngModel]=\"startTime()\"\n (ngModelChange)=\"setTime(0, $event)\"\n [placeholder]=\"timePlaceholder()\"\n [maskito]=\"timeMaskitoOptions()\"\n /> \n </hlm-field>\n <hlm-field [forceInvalid]=\"touched() && invalid()\">\n <label hlmFieldLabel [attr.for]=\"id()+'-end'\">Horário final</label>\n <input\n hlmInput\n type=\"text\"\n [id]=\"id()+'-end'\"\n aria-label=\"Horário final\"\n [ngModel]=\"endTime()\"\n (ngModelChange)=\"setTime(1, $event)\"\n [placeholder]=\"timePlaceholder()\"\n [maskito]=\"timeMaskitoOptions()\"\n />\n </hlm-field>\n </div>\n </div>\n <ng-content select=\"[hlmDatePickerFooter]\" />\n </hlm-popover-content>\n </hlm-popover>\n\n <error-message-provider [errors]=\"errors()\" [invalid]=\"invalid()\" [touched]=\"touched()\"></error-message-provider>\n</hlm-field>\n","import { Component, computed, input, Signal } from '@angular/core';\nimport { MaskitoOptions } from '@maskito/core';\nimport { maskitoTime, MaskitoTimeParams } from '@maskito/kit';\nimport { DateTime } from 'luxon';\n\nimport { InputBaseComponent } from '../../input-base/input-base.component';\n\n/** Formato do value: coluna `time` do postgres e aceito por `z.iso.time()` */\nexport const TIME_VALUE_FORMAT = 'HH:mm:ss';\n\n@Component({\n imports: [],\n selector: 'input-base-time',\n styleUrl: './input-base-time.component.scss',\n templateUrl: './input-base-time.component.html',\n})\nexport class InputBaseTimeComponent extends InputBaseComponent {\n constructor() {\n super();\n }\n\n /** Input que define se os segundos devem ser considerados. */\n enableSeconds = input<boolean>(true);\n\n protected timeParams: Signal<MaskitoTimeParams> = computed(() => {\n return {\n mode: this.enableSeconds() ? 'HH:MM:SS' : 'HH:MM',\n }\n })\n protected timeMaskitoOptions: Signal<MaskitoOptions> = computed(() => {\n return maskitoTime(this.timeParams());\n })\n protected timePlaceholder: Signal<string> = computed(() => {\n return this.enableSeconds() ? 'HH:MM:SS' : 'HH:MM';\n })\n\n // formato luxon equivalente ao timeMaskitoOptions\n private displayFormat = computed(() => this.enableSeconds() ? 'HH:mm:ss' : 'HH:mm');\n\n // value é sempre HH:mm:ss, mesmo com enableSeconds desligado (segundos = 00)\n unmask = (masked: string): string | null => {\n if (!masked) {\n return null;\n }\n const dt = DateTime.fromFormat(masked, this.displayFormat());\n return dt.isValid ? dt.toFormat(TIME_VALUE_FORMAT) : null;\n }\n\n // fromISO aceita HH:mm, HH:mm:ss e HH:mm:ss.SSS (o postgres pode devolver com fração)\n stringify = (value: string | null | undefined): string => {\n if (!value) {\n return '';\n }\n const dt = DateTime.fromISO(value);\n return dt.isValid ? dt.toFormat(this.displayFormat()) : '';\n }\n}\n","","import { CommonModule } from '@angular/common';\nimport { Component, model } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { FormValueControl } from '@angular/forms/signals';\nimport { MaskitoDirective } from '@maskito/angular';\n\nimport { NgIcon } from '@ng-icons/core';\nimport {\n HlmButtonImports,\n HlmFieldImports,\n HlmInputGroupImports,\n HlmTooltipImports,\n} from '@sapphire-caitlyn/schema-kit-ng/helm';\n\nimport { MaskitoUnmaskDirective } from '../../../../directives/maskito-unmask.directive';\nimport { LoadingInputComponent } from '../../loading-input/loading-input.component';\nimport { ErrorMessageProviderComponent } from '../../../error-message-provider/error-message-provider.component';\nimport { InputBaseTimeComponent } from '../input-base-time/input-base-time.component';\n\n@Component({\n imports: [\n HlmTooltipImports,\n HlmInputGroupImports,\n HlmFieldImports,\n HlmButtonImports,\n MaskitoDirective,\n MaskitoUnmaskDirective,\n FormsModule,\n CommonModule,\n LoadingInputComponent,\n ErrorMessageProviderComponent,\n NgIcon,\n ],\n selector: 'input-time',\n styleUrl: './input-time.component.scss',\n templateUrl: './input-time.component.html',\n})\nexport class InputTimeComponent extends InputBaseTimeComponent implements FormValueControl<string | null | undefined> {\n /** Horário no formato HH:mm:ss */\n value = model<string | null | undefined>(null);\n\n clear() {\n this.value.set(null);\n this.touch.emit();\n }\n}\n","<hlm-field [forceInvalid]=\"touched() && invalid()\">\n @if(label()) {\n <label hlmFieldLabel [attr.for]=\"id()\">\n {{label()}}\n\n @if(tooltipInfo()){\n <ng-icon name=\"lucideCircleQuestionMark\" [hlmTooltip]=\"tooltipInfo()!\" position=\"top\"></ng-icon>\n }\n </label>\n }\n <hlm-input-group class=\"relative\">\n <input\n hlmInputGroupInput\n [(ngModel)]=\"value\"\n [disabled]=\"isReadonly()\"\n [attr.id]=\"id()\"\n type=\"text\"\n inputmode=\"numeric\"\n [maskito]=\"timeMaskitoOptions()\"\n [unmaskHandler]=\"unmask\"\n [stringifyHandler]=\"stringify\"\n [placeholder]=\"placeholder() || timePlaceholder()\"\n [forceInvalid]=\"touched() && invalid()\"\n (blur)=\"touch.emit()\"\n />\n <hlm-input-group-addon align=\"inline-end\">\n @if(value() && !isReadonly()){\n <button\n hlmInputGroupButton\n size=\"icon-xs\"\n variant=\"ghost\"\n (click)=\"clear()\"\n >\n <ng-icon name=\"lucideCircleX\" />\n </button>\n }\n </hlm-input-group-addon>\n <hlm-input-group-addon align=\"inline-end\">\n <ng-icon name=\"lucideClock\" />\n </hlm-input-group-addon>\n\n <loading-input [loading]=\"loading()\"></loading-input>\n </hlm-input-group>\n\n <error-message-provider [errors]=\"errors()\" [invalid]=\"invalid()\" [touched]=\"touched()\"></error-message-provider>\n</hlm-field>\n","import { CommonModule } from '@angular/common';\nimport { Component, model } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { FormValueControl } from '@angular/forms/signals';\nimport { MaskitoDirective } from '@maskito/angular';\n\nimport { NgIcon } from '@ng-icons/core';\nimport {\n HlmButtonImports,\n HlmFieldImports,\n HlmInputGroupImports,\n HlmTooltipImports,\n} from '@sapphire-caitlyn/schema-kit-ng/helm';\n\nimport { MaskitoUnmaskDirective } from '../../../../directives/maskito-unmask.directive';\nimport { LoadingInputComponent } from '../../loading-input/loading-input.component';\nimport { ErrorMessageProviderComponent } from '../../../error-message-provider/error-message-provider.component';\nimport { InputBaseTimeComponent } from '../input-base-time/input-base-time.component';\nimport { markSpanEdgesDirtyOnChange, setSpanEdge, Span } from '../span';\n\n@Component({\n imports: [\n HlmTooltipImports,\n HlmInputGroupImports,\n HlmFieldImports,\n HlmButtonImports,\n MaskitoDirective,\n MaskitoUnmaskDirective,\n FormsModule,\n CommonModule,\n LoadingInputComponent,\n ErrorMessageProviderComponent,\n NgIcon,\n ],\n selector: 'input-time-span',\n styleUrl: './input-time-span.component.scss',\n templateUrl: './input-time-span.component.html',\n})\nexport class InputTimeSpanComponent extends InputBaseTimeComponent implements FormValueControl<Span | null | undefined> {\n /** Intervalo [início, fim] no formato HH:mm:ss */\n value = model<Span | null | undefined>(null);\n\n constructor() {\n super();\n markSpanEdgesDirtyOnChange();\n }\n\n // value é HH:mm:ss (unmask grava HH:mm:ss); null enquanto o horário digitado estiver incompleto\n setEdge(index: 0 | 1, time: string | null) {\n this.value.set(setSpanEdge(this.value(), index, time));\n }\n\n clear() {\n this.value.set(null);\n this.touch.emit();\n }\n}\n","<hlm-field [forceInvalid]=\"touched() && invalid()\">\n @if(label()) {\n <label hlmFieldLabel [attr.for]=\"id()\">\n {{label()}}\n\n @if(tooltipInfo()){\n <ng-icon name=\"lucideCircleQuestionMark\" [hlmTooltip]=\"tooltipInfo()!\" position=\"top\"></ng-icon>\n }\n </label>\n }\n <hlm-input-group class=\"relative\">\n <!-- \"?? null\": undefined faria o ngModel reescrever (e apagar) o texto incompleto que está sendo digitado -->\n <input\n hlmInputGroupInput\n [ngModel]=\"value()?.[0] ?? null\"\n (ngModelChange)=\"setEdge(0, $event)\"\n [disabled]=\"isReadonly()\"\n [attr.id]=\"id()\"\n type=\"text\"\n inputmode=\"numeric\"\n [maskito]=\"timeMaskitoOptions()\"\n [unmaskHandler]=\"unmask\"\n [stringifyHandler]=\"stringify\"\n [placeholder]=\"placeholder() || timePlaceholder()\"\n [forceInvalid]=\"touched() && invalid()\"\n (blur)=\"touch.emit()\"\n />\n <span hlmInputGroupText>–</span>\n <input\n hlmInputGroupInput\n [ngModel]=\"value()?.[1] ?? null\"\n (ngModelChange)=\"setEdge(1, $event)\"\n [disabled]=\"isReadonly()\"\n type=\"text\"\n inputmode=\"numeric\"\n [maskito]=\"timeMaskitoOptions()\"\n [unmaskHandler]=\"unmask\"\n [stringifyHandler]=\"stringify\"\n [placeholder]=\"placeholder() || timePlaceholder()\"\n [forceInvalid]=\"touched() && invalid()\"\n (blur)=\"touch.emit()\"\n />\n <hlm-input-group-addon align=\"inline-end\">\n @if(value() && !isReadonly()){\n <button\n hlmInputGroupButton\n size=\"icon-xs\"\n variant=\"ghost\"\n (click)=\"clear()\"\n >\n <ng-icon name=\"lucideCircleX\" />\n </button>\n }\n </hlm-input-group-addon>\n <hlm-input-group-addon align=\"inline-end\">\n <ng-icon name=\"lucideClock\" />\n </hlm-input-group-addon>\n\n <loading-input [loading]=\"loading()\"></loading-input>\n </hlm-input-group>\n\n <error-message-provider [errors]=\"errors()\" [invalid]=\"invalid()\" [touched]=\"touched()\"></error-message-provider>\n</hlm-field>\n","import { CommonModule } from '@angular/common';\nimport { Component, input, InputSignal, model, ModelSignal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { FormValueControl } from '@angular/forms/signals';\n\nimport {\n HlmFieldImports,\n HlmInputImports,\n HlmSkeletonImports,\n HlmSwitchImports,\n HlmCheckboxImports,\n HlmTooltipImports,\n} from '@sapphire-caitlyn/schema-kit-ng/helm';\nimport { NgIcon } from '@ng-icons/core';\n\nimport { LoadingInputComponent } from '../loading-input/loading-input.component';\nimport { ErrorMessageProviderComponent } from '../../error-message-provider/error-message-provider.component';\nimport { InputBaseComponent } from '../input-base/input-base.component';\n\n@Component({\n imports: [\n HlmTooltipImports,\n NgIcon,\n HlmInputImports,\n HlmFieldImports,\n HlmSkeletonImports,\n HlmSwitchImports,\n HlmCheckboxImports,\n FormsModule,\n CommonModule,\n LoadingInputComponent,\n ErrorMessageProviderComponent\n ],\n selector: 'input-bool',\n styleUrl: './input-bool.component.scss',\n templateUrl: './input-bool.component.html',\n})\nexport class InputBoolComponent extends InputBaseComponent implements FormValueControl<boolean | null> {\n value: ModelSignal<boolean | null> = model<boolean | null>(null);\n\n presentation: InputSignal<InputBoolPresentation> = input<InputBoolPresentation>(InputBoolPresentation.SWITCH);\n\n InputBoolPresentation = InputBoolPresentation;\n\n onClick(){\n if(this.loading() || this.isReadonly()){\n return;\n }\n this.value.set(!this.value())\n }\n} \n\nexport enum InputBoolPresentation {\n SWITCH = 'switch',\n CHECKBOX = 'checkbox',\n}","<div hlmField [forceInvalid]=\"touched() && invalid()\">\n @if(label()){\n <label hlmFieldLabel [attr.for]=\"id()\">\n {{label()}}\n\n @if(tooltipInfo()){\n <ng-icon name=\"lucideCircleQuestionMark\" [hlmTooltip]=\"tooltipInfo()!\" position=\"top\"></ng-icon>\n }\n </label>\n }\n <div class=\"relative\" [class.cursor-pointer]=\"!isReadonly()\" (click)=\"onClick()\">\n <div hlmInput class=\"flex items-center justify-start px-1\">\n @if(presentation() === InputBoolPresentation.SWITCH){\n <hlm-switch \n [disabled]=\"loading() || isReadonly()\"\n [forceInvalid]=\"touched() && invalid()\" \n [ngModel]=\"value()\" \n class=\"mr-2\" \n [attr.id]=\"presentation()+id()\" \n />\n }\n @if(presentation() === InputBoolPresentation.CHECKBOX){\n <hlm-checkbox \n [disabled]=\"loading() || isReadonly()\"\n [forceInvalid]=\"touched() && invalid()\" \n [ngModel]=\"value()\" \n class=\"mr-2\" \n [attr.id]=\"presentation()+id()\" \n />\n }\n <label hlmLabel [attr.for]=\"presentation()+id()\"> {{ label() }} </label>\n </div>\n\n <loading-input [loading]=\"loading()\"></loading-input>\n </div>\n\n <error-message-provider [errors]=\"errors()\" [invalid]=\"invalid()\" [touched]=\"touched()\"></error-message-provider>\n</div>\n","import { isPlatformBrowser, NgTemplateOutlet } from '@angular/common';\nimport { Component, computed, effect, ElementRef, inject, input, model, PLATFORM_ID, signal, Signal, untracked, viewChild } from '@angular/core';\nimport { FormValueControl } from '@angular/forms/signals';\nimport { MaskitoDirective } from '@maskito/angular';\nimport { MaskitoOptions } from '@maskito/core';\nimport { maskitoNumber } from '@maskito/kit';\n\nimport { NgIcon, provideIcons } from '@ng-icons/core';\nimport { lucidePipette } from '@ng-icons/lucide';\nimport {\n HlmButtonImports,\n HlmInputImports,\n HlmSelectImports,\n HlmSliderImports,\n} from '@sapphire-caitlyn/schema-kit-ng/helm';\n\nexport type ColorPickerMode = 'hex' | 'rgb' | 'css' | 'hsl';\n\n/** `r`, `g` e `b` de 0 a 255, `a` de 0 a 1 */\ninterface Rgba { r: number; g: number; b: number; a: number }\n\n/** `h` de 0 a 360, `s`, `v` e `a` de 0 a 100 */\ninterface Hsva { h: number; s: number; v: number; a: number }\n\n/** Aceita `#RGB`, `#RGBA`, `#RRGGBB` ou `#RRGGBBAA` (o `#` é opcional) */\nconst HEX_REGEX = /^#?([0-9a-f]{3,4}|[0-9a-f]{6}|[0-9a-f]{8})$/i;\nconst RGB_REGEX = /^rgba?\\(([^)]+)\\)$/i;\n\n/** Canais do campo RGB, na ordem exibida */\nconst RGB_KEYS = ['r', 'g', 'b'] as const;\n\n/** Espectro exibido na barra de matiz */\nconst HUE_GRADIENT = 'linear-gradient(90deg, #FF0000, #FFFF00, #00FF00, #00FFFF, #0000FF, #FF00FF, #FF0000)';\n\n/** Xadrez exibido atrás da barra de opacidade */\nconst CHECKERBOARD = 'url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAMUlEQVQ4T2NkYGAQYcAP3uCTZhw1gGGYhAGBZIA/nYDCgBDAm9BGDWAAJyRCgLaBCAAgXwixzAS0pgAAAABJRU5ErkJggg==\") left center';\n\n@Component({\n imports: [\n HlmButtonImports,\n HlmInputImports,\n HlmSelectImports,\n HlmSliderImports,\n MaskitoDirective,\n NgIcon,\n NgTemplateOutlet\n ],\n providers: [provideIcons({ lucidePipette })],\n host: { '[attr.data-disabled]': 'disabled() || null' },\n selector: 'color-picker',\n styleUrl: './color-picker.component.scss',\n templateUrl: './color-picker.component.html',\n})\nexport class ColorPickerComponent implements FormValueControl<string | null | undefined> {\n /** Cor no formato `#rrggbb`, ou `#rrggbbaa` quando tem transparência */\n value = model<string | null | undefined>(null);\n\n /** Cor exibida enquanto `value` está vazio */\n defaultValue = input<string>('#000000');\n\n disabled = input<boolean>(false);\n\n /** Formato exibido nos campos abaixo do seletor */\n mode = model<ColorPickerMode>('hex');\n\n modes: ColorPickerMode[] = ['hex', 'rgb', 'css', 'hsl'];\n\n modeToString = (mode: ColorPickerMode) => mode.toUpperCase();\n\n hueBackground = HUE_GRADIENT;\n\n /** Até 8 dígitos para aceitar colar um `#rrggbbaa`, sempre em maiúsculas */\n hexMask: MaskitoOptions = {\n mask: /^#?[0-9A-F]{0,8}$/i,\n postprocessors: [({ value, selection }) => ({ value: value.toUpperCase(), selection })],\n };\n\n /** Só os caracteres usados em `rgb()` e `rgba()`, a validação fica para a confirmação */\n cssMask: MaskitoOptions = {\n mask: /^[rgba(),.%/\\s\\d]*$/i,\n };\n\n rgbMask: MaskitoOptions = maskitoNumber({ min: 0, max: 255, thousandSeparator: '' });\n\n /** Matiz, saturação e luminosidade */\n hslMasks: MaskitoOptions[] = [\n maskitoNumber({ min: 0, max: 360, thousandSeparator: '' }),\n maskitoNumber({ min: 0, max: 100, thousandSeparator: '' }),\n maskitoNumber({ min: 0, max: 100, thousandSeparator: '' }),\n ];\n\n rgbLabels = ['Vermelho', 'Verde', 'Azul'];\n\n hslLabels = ['Matiz', 'Saturação', 'Luminosidade'];\n\n alphaMask: MaskitoOptions = maskitoNumber({ min: 0, max: 100, thousandSeparator: '' });\n\n /** O EyeDropper só existe em navegadores baseados no Chromium */\n eyeDropperSupported = isPlatformBrowser(inject(PLATFORM_ID)) && 'EyeDropper' in window;\n\n selection = viewChild.required<ElementRef<HTMLElement>>('selection');\n\n /** Estado interno em HSV, que é o espaço representado pela área de seleção */\n hsva = signal<Hsva>({ h: 0, s: 0, v: 0, a: 100 });\n\n rgba: Signal<Rgba> = computed(() => hsvToRgb(this.hsva()));\n\n hex: Signal<string> = computed(() => toHex(this.rgba()));\n\n hue: Signal<number[]> = computed(() => [this.hsva().h]);\n\n alpha: Signal<number[]> = computed(() => [this.hsva().a]);\n\n selectionBackground: Signal<string> = computed(() =>\n `linear-gradient(0deg, rgba(0,0,0,1), rgba(0,0,0,0)), linear-gradient(90deg, rgba(255,255,255,1), rgba(255,255,255,0)), hsl(${this.hsva().h}, 100%, 50%)`\n );\n\n alphaBackground: Signal<string> = computed(() => {\n const { r, g, b } = this.rgba();\n return `linear-gradient(90deg, transparent, rgb(${r}, ${g}, ${b})), ${CHECKERBOARD}`;\n });\n\n rgbChannels: Signal<number[]> = computed(() => {\n const { r, g, b } = this.rgba();\n return [r, g, b].map(Math.round);\n });\n\n hslChannels: Signal<number[]> = computed(() => hsvToHsl(this.hsva()).map(Math.round));\n\n selectionText: Signal<string> = computed(() => {\n const { s, v } = this.hsva();\n return `Saturação ${Math.round(s)}%, brilho ${Math.round(v)}%`;\n });\n\n hexText: Signal<string> = computed(() => toHex({ ...this.rgba(), a: 1 }).toUpperCase());\n\n alphaText: Signal<number> = computed(() => Math.round(this.hsva().a));\n\n cssText: Signal<string> = computed(() => `rgba(${this.rgbChannels().join(', ')}, ${this.alphaText()}%)`);\n\n constructor() {\n effect(() => {\n const color = this.value() || this.defaultValue();\n untracked(() => this.applyColor(color));\n });\n }\n\n /** Atualiza parte dos canais e emite o novo valor */\n update(channels: Partial<Hsva>) {\n if(this.disabled()) {\n return;\n }\n this.hsva.update(hsva => ({ ...hsva, ...channels }));\n if(this.value() !== this.hex()) {\n this.value.set(this.hex());\n }\n }\n\n /**\n * Os campos aplicam a cor enquanto o usuário digita, assim que o texto é válido.\n * Ao confirmar (enter ou blur) o texto é substituído pelo valor atual, descartando o que for inválido.\n */\n setHex(input: HTMLInputElement, confirm = false) {\n const digits = input.value.replace('#', '');\n if(confirm || digits.length === 6 || digits.length === 8) {\n const rgba = parseColor(input.value);\n if(rgba) {\n // Sem os dígitos de transparência mantém a opacidade atual\n this.update(this.toHsva(digits.length % 4 === 0 ? rgba : { ...rgba, a: this.rgba().a }));\n }\n }\n if(confirm) {\n input.value = this.hexText();\n }\n }\n\n setRgb(index: number, input: HTMLInputElement, confirm = false) {\n const channel = parseFloat(input.value);\n if(Number.isFinite(channel)) {\n this.update(this.toHsva({ ...this.rgba(), [RGB_KEYS[index]]: channel }));\n }\n if(confirm) {\n input.value = String(this.rgbChannels()[index]);\n }\n }\n\n setHsl(index: number, input: HTMLInputElement, confirm = false) {\n const channel = parseFloat(input.value);\n if(Number.isFinite(channel)) {\n const hsl = hsvToHsl(this.hsva());\n hsl[index] = channel;\n const { h, s, v } = hslToHsv(hsl);\n // No preto a saturação é indefinida, então mantém a atual\n this.update(v ? { h, s, v } : { h, v });\n }\n if(confirm) {\n input.value = String(this.hslChannels()[index]);\n }\n }\n\n setAlpha(input: HTMLInputElement, confirm = false) {\n const alpha = parseFloat(input.value);\n if(Number.isFinite(alpha)) {\n this.update({ a: alpha });\n }\n if(confirm) {\n input.value = String(this.alphaText());\n }\n }\n\n /** O texto livre só é aplicado ao confirmar, já que fica inválido enquanto é digitado */\n setCss(input: HTMLInputElement) {\n const rgba = parseColor(input.value);\n if(rgba) {\n this.update(this.toHsva(rgba));\n }\n input.value = this.cssText();\n }\n\n onSelectionPointerDown(event: PointerEvent) {\n if(this.disabled() || event.button !== 0) {\n return;\n }\n event.preventDefault();\n const element = this.selection().nativeElement;\n element.focus();\n element.setPointerCapture(event.pointerId);\n this.updateFromPointer(event);\n }\n\n onSelectionPointerMove(event: PointerEvent) {\n if(this.selection().nativeElement.hasPointerCapture(event.pointerId)) {\n this.updateFromPointer(event);\n }\n }\n\n /** Setas movem 1%, ou 10% segurando shift */\n onSelectionKeydown(event: KeyboardEvent) {\n const step = event.shiftKey ? 10 : 1;\n const moves: Record<string, [number, number]> = {\n ArrowLeft: [-step, 0],\n ArrowRight: [step, 0],\n ArrowUp: [0, step],\n ArrowDown: [0, -step],\n };\n const move = moves[event.key];\n if(!move) {\n return;\n }\n event.preventDefault();\n const { s, v } = this.hsva();\n this.update({ s: clamp(s + move[0], 0, 100), v: clamp(v + move[1], 0, 100) });\n }\n\n async pickFromScreen() {\n try {\n const eyeDropper = new (window as any).EyeDropper();\n const result: { sRGBHex: string } = await eyeDropper.open();\n const rgba = parseColor(result.sRGBHex);\n if(rgba) {\n this.update(this.toHsva(rgba));\n }\n } catch {\n // Usuário cancelou a captura\n }\n }\n\n private updateFromPointer(event: PointerEvent) {\n const rect = this.selection().nativeElement.getBoundingClientRect();\n const x = clamp((event.clientX - rect.left) / rect.width, 0, 1);\n const y = clamp((event.clientY - rect.top) / rect.height, 0, 1);\n this.update({ s: x * 100, v: (1 - y) * 100 });\n }\n\n private applyColor(color: string) {\n const rgba = parseColor(color);\n // Ignora o próprio valor emitido, evitando perder precisão no arredondamento do hex\n if(!rgba || toHex(rgba) === this.hex()) {\n return;\n }\n this.hsva.set(this.toHsva(rgba));\n }\n\n /** Mantém o matiz em tons de cinza e a saturação no preto, onde eles são indefinidos */\n private toHsva(rgba: Rgba): Hsva {\n const current = this.hsva();\n const next = rgbToHsv(rgba);\n return {\n h: next.s === 0 || next.v === 0 ? current.h : next.h,\n s: next.v === 0 ? current.s : next.s,\n v: next.v,\n a: next.a,\n };\n }\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, value));\n}\n\n/** Converte `#rgb`, `#rgba`, `#rrggbb`, `#rrggbbaa`, `rgb()` ou `rgba()` */\nfunction parseColor(text: string | null | undefined): Rgba | null {\n text = text?.trim();\n const hex = text?.match(HEX_REGEX);\n if(hex) {\n const digits = hex[1].length <= 4\n ? hex[1].split('').map(char => char + char).join('')\n : hex[1];\n const [r, g, b, a = 255] = digits.match(/../g)!.map(pair => parseInt(pair, 16));\n return { r, g, b, a: a / 255 };\n }\n const rgb = text?.match(RGB_REGEX);\n if(!rgb) {\n return null;\n }\n const [r, g, b, a = '1'] = rgb[1].split(/[\\s,/]+/).filter(Boolean);\n const channels = [r, g, b].map(channel => parseFloat(channel));\n const alpha = a.endsWith('%') ? parseFloat(a) / 100 : parseFloat(a);\n if(![...channels, alpha].every(Number.isFinite)) {\n return null;\n }\n return {\n r: clamp(channels[0], 0, 255),\n g: clamp(channels[1], 0, 255),\n b: clamp(channels[2], 0, 255),\n a: clamp(alpha, 0, 1),\n };\n}\n\nfunction hsvToRgb({ h, s, v, a }: Hsva): Rgba {\n s /= 100;\n v /= 100;\n const channel = (n: number) => {\n const k = (n + h / 60) % 6;\n return (v - v * s * Math.max(0, Math.min(k, 4 - k, 1))) * 255;\n };\n return { r: channel(5), g: channel(3), b: channel(1), a: a / 100 };\n}\n\nfunction rgbToHsv({ r, g, b, a }: Rgba): Hsva {\n r /= 255;\n g /= 255;\n b /= 255;\n const max = Math.max(r, g, b);\n const delta = max - Math.min(r, g, b);\n let h = 0;\n if(delta) {\n if(max === r) {\n h = ((g - b) / delta) % 6;\n } else if(max === g) {\n h = (b - r) / delta + 2;\n } else {\n h = (r - g) / delta + 4;\n }\n h = (h * 60 + 360) % 360;\n }\n return { h, s: max ? (delta / max) * 100 : 0, v: max * 100, a: a * 100 };\n}\n\n/** Retorna `[h, s, l]`, com `h` de 0 a 360 e `s`, `l` de 0 a 100 */\nfunction hsvToHsl({ h, s, v }: Hsva): number[] {\n s /= 100;\n v /= 100;\n const l = v * (1 - s / 2);\n const saturation = l === 0 || l === 1 ? 0 : (v - l) / Math.min(l, 1 - l);\n return [h, saturation * 100, l * 100];\n}\n\n/** Recebe `[h, s, l]` no mesmo formato retornado por `hsvToHsl` */\nfunction hslToHsv([h, s, l]: number[]): Omit<Hsva, 'a'> {\n s /= 100;\n l /= 100;\n const v = l + s * Math.min(l, 1 - l);\n return { h, s: v ? 2 * (1 - l / v) * 100 : 0, v: v * 100 };\n}\n\n/** Formata como `#rrggbb`, ou `#rrggbbaa` quando tem transparência */\nfunction toHex({ r, g, b, a }: Rgba): string {\n const channels = a < 1 ? [r, g, b, a * 255] : [r, g, b];\n return `#${channels.map(channel => Math.round(channel).toString(16).padStart(2, '0')).join('')}`;\n}\n","<div\n #selection\n class=\"selection relative h-40 w-full cursor-crosshair touch-none select-none rounded-lg outline-none focus-visible:ring-3 focus-visible:ring-ring/50\"\n role=\"slider\"\n aria-label=\"Saturação e brilho\"\n [attr.aria-valuetext]=\"selectionText()\"\n [attr.tabindex]=\"disabled() ? -1 : 0\"\n [style.background]=\"selectionBackground()\"\n (pointerdown)=\"onSelectionPointerDown($event)\"\n (pointermove)=\"onSelectionPointerMove($event)\"\n (keydown)=\"onSelectionKeydown($event)\"\n>\n <div\n class=\"pointer-events-none absolute size-4 -translate-x-1/2 -translate-y-1/2 rounded-full border-2 border-white shadow-[0_0_0_1px_rgba(0,0,0,0.5)]\"\n [style.left.%]=\"hsva().s\"\n [style.top.%]=\"100 - hsva().v\"\n ></div>\n</div>\n\n<hlm-slider\n class=\"color-slider\"\n aria-label=\"Matiz\"\n max=\"360\"\n step=\"1\"\n [style.--track-background]=\"hueBackground\"\n [value]=\"hue()\"\n [disabled]=\"disabled()\"\n (valueChange)=\"update({ h: $event[0] })\"\n/>\n\n<hlm-slider\n class=\"color-slider\"\n aria-label=\"Opacidade\"\n max=\"100\"\n step=\"1\"\n [style.--track-background]=\"alphaBackground()\"\n [value]=\"alpha()\"\n [disabled]=\"disabled()\"\n (valueChange)=\"update({ a: $event[0] })\"\n/>\n\n<div class=\"flex items-center gap-2\">\n @if(eyeDropperSupported) {\n <button\n hlmBtn\n type=\"button\"\n variant=\"outline\"\n size=\"icon\"\n class=\"shrink-0 text-muted-foreground\"\n aria-label=\"Capturar cor da tela\"\n [disabled]=\"disabled()\"\n (click)=\"pickFromScreen()\"\n >\n <ng-icon name=\"lucidePipette\" />\n </button>\n }\n\n <hlm-select [(value)]=\"mode\" [itemToString]=\"modeToString\">\n <hlm-select-trigger size=\"sm\" class=\"w-20 shrink-0 text-xs\">\n <hlm-select-value placeholder=\"Formato\" />\n </hlm-select-trigger>\n <hlm-select-content *hlmSelectPortal>\n @for(mode of modes; track mode) {\n <hlm-select-item class=\"text-xs\" [value]=\"mode\">{{modeToString(mode)}}</hlm-select-item>\n }\n </hlm-select-content>\n </hlm-select>\n\n <div class=\"flex w-full min-w-0 items-center -space-x-px rounded-md shadow-sm\">\n @switch(mode()) {\n @case('hex') {\n <input\n hlmInput\n type=\"text\"\n class=\"h-8 min-w-0 bg-secondary px-2 text-xs shadow-none md:text-xs rounded-e-none\"\n aria-label=\"Hexadecimal\"\n [readonly]=\"disabled()\"\n [maskito]=\"hexMask\"\n [value]=\"hexText()\"\n (input)=\"setHex($any($event.target))\"\n (change)=\"setHex($any($event.target), true)\"\n />\n <ng-container [ngTemplateOutlet]=\"alphaInput\" />\n }\n @case('rgb') {\n @for(channel of rgbChannels(); track $index) {\n <input\n hlmInput\n type=\"text\"\n inputmode=\"numeric\"\n class=\"h-8 min-w-0 bg-secondary px-2 text-xs shadow-none md:text-xs rounded-e-none\"\n [class.rounded-s-none]=\"$index\"\n [attr.aria-label]=\"rgbLabels[$index]\"\n [readonly]=\"disabled()\"\n [maskito]=\"rgbMask\"\n [value]=\"channel\"\n (input)=\"setRgb($index, $any($event.target))\"\n (change)=\"setRgb($index, $any($event.target), true)\"\n />\n }\n <ng-container [ngTemplateOutlet]=\"alphaInput\" />\n }\n @case('css') {\n <input\n hlmInput\n type=\"text\"\n class=\"h-8 min-w-0 bg-secondary px-2 text-xs shadow-none md:text-xs\"\n aria-label=\"CSS\"\n [readonly]=\"disabled()\"\n [maskito]=\"cssMask\"\n [value]=\"cssText()\"\n (change)=\"setCss($any($event.target))\"\n />\n }\n @case('hsl') {\n @for(channel of hslChannels(); track $index) {\n <input\n hlmInput\n type=\"text\"\n inputmode=\"numeric\"\n class=\"h-8 min-w-0 bg-secondary px-2 text-xs shadow-none md:text-xs rounded-e-none\"\n [class.rounded-s-none]=\"$index\"\n [attr.aria-label]=\"hslLabels[$index]\"\n [readonly]=\"disabled()\"\n [maskito]=\"hslMasks[$index]\"\n [value]=\"channel\"\n (input)=\"setHsl($index, $any($event.target))\"\n (change)=\"setHsl($index, $any($event.target), true)\"\n />\n }\n <ng-container [ngTemplateOutlet]=\"alphaInput\" />\n }\n }\n </div>\n</div>\n\n<ng-template #alphaInput>\n <div class=\"relative shrink-0\">\n <input\n hlmInput\n type=\"text\"\n inputmode=\"numeric\"\n class=\"h-8 min-w-0 bg-secondary px-2 text-xs shadow-none md:text-xs w-13 rounded-s-none pe-5\"\n aria-label=\"Opacidade\"\n [readonly]=\"disabled()\"\n [maskito]=\"alphaMask\"\n [value]=\"alphaText()\"\n (input)=\"setAlpha($any($event.target))\"\n (change)=\"setAlpha($any($event.target), true)\"\n />\n <span class=\"absolute top-1/2 right-2 -translate-y-1/2 text-xs text-muted-foreground\">%</span>\n </div>\n</ng-template>\n","import { CommonModule } from '@angular/common';\nimport { Component, computed, linkedSignal, model, Signal, viewChild, WritableSignal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { FormValueControl } from '@angular/forms/signals';\nimport { MaskitoDirective } from '@maskito/angular';\nimport { MaskitoOptions } from '@maskito/core';\n\nimport { NgIcon, provideIcons } from '@ng-icons/core';\nimport { lucideCircleX } from '@ng-icons/lucide';\nimport {\n HlmButtonImports,\n HlmFieldImports,\n HlmInputImports,\n HlmInputGroupImports,\n HlmPopover,\n HlmPopoverImports,\n HlmTooltipImports,\n} from '@sapphire-caitlyn/schema-kit-ng/helm';\n\nimport { InputBaseComponent } from '../input-base/input-base.component';\nimport { LoadingInputComponent } from '../loading-input/loading-input.component';\nimport { ErrorMessageProviderComponent } from '../../error-message-provider/error-message-provider.component';\nimport { ColorPickerComponent } from './color-picker/color-picker.component';\n\n/** Aceita `#RGB` ou `#RRGGBB` (o `#` é opcional) */\nconst HEX_REGEX = /^#?([0-9a-f]{3}|[0-9a-f]{6})$/i;\n\n@Component({\n imports: [\n HlmTooltipImports,\n HlmInputImports,\n HlmInputGroupImports,\n HlmFieldImports,\n HlmButtonImports,\n HlmPopoverImports,\n MaskitoDirective,\n FormsModule,\n CommonModule,\n NgIcon,\n LoadingInputComponent,\n ErrorMessageProviderComponent,\n ColorPickerComponent\n],\n providers: [provideIcons({ lucideCircleX })],\n selector: 'input-color',\n styleUrl: './input-color.component.scss',\n templateUrl: './input-color.component.html',\n})\nexport class InputColorComponent extends InputBaseComponent implements FormValueControl<string | null | undefined> {\n /** Cor no formato `#rrggbb` */\n value = model<string | null | undefined>(null);\n\n /** Texto digitado no input, sincronizado com `value` sempre que ele muda */\n text: WritableSignal<string> = linkedSignal(() => this.value() ?? '');\n\n /** Cor válida usada no swatch e no seletor nativo */\n color: Signal<string | null> = computed(() => this.normalize(this.value()));\n\n /** O seletor nativo só aceita `#rrggbb`, então usa preto como fallback */\n pickerColor: Signal<string> = computed(() => this.color() ?? '#000000');\n\n maskitoOptions: MaskitoOptions = {\n mask: /^#?[0-9a-fA-F]{0,6}$/,\n };\n\n onText(text: string) {\n this.text.set(text);\n if(!text) {\n this.value.set(null);\n return;\n }\n const color = this.normalize(text);\n if(color) {\n this.value.set(color);\n }\n }\n\n onBlur() {\n // Descarta o texto incompleto, voltando para o último valor válido\n this.text.set(this.value() ?? '');\n this.touch.emit();\n }\n\n onPick(color: string) {\n this.value.set(this.normalize(color));\n this.touch.emit();\n }\n\n clear() {\n this.value.set(null);\n this.touch.emit();\n }\n\n /** Converte `abc`, `#abc`, `aabbcc` ou `#AABBCC` em `#aabbcc` */\n normalize(text: string | null | undefined): string | null {\n const match = text?.trim().match(HEX_REGEX);\n if(!match) {\n return null;\n }\n const hex = match[1].length === 3\n ? match[1].split('').map(char => char + char).join('')\n : match[1];\n return `#${hex.toLowerCase()}`;\n }\n}\n","<div hlmField [forceInvalid]=\"touched() && invalid()\">\n @if(label()) {\n <label hlmFieldLabel [attr.for]=\"id()\">\n {{label()}}\n\n @if(tooltipInfo()){\n <ng-icon name=\"lucideCircleQuestionMark\" [hlmTooltip]=\"tooltipInfo()!\" position=\"top\"></ng-icon>\n }\n </label>\n }\n <hlm-popover [attachTo]=\"inputGroup\">\n <hlm-input-group #inputGroup class=\"relative\">\n <loading-input [loading]=\"loading()\"></loading-input>\n \n <hlm-input-group-addon align=\"inline-start\">\n <button\n hlmBtn\n variant=\"outline\"\n size=\"sm\"\n class=\"swatch p-0 relative block size-5 shrink-0 cursor-pointer overflow-hidden rounded-md border\"\n [class.empty]=\"!color()\"\n [style.background-color]=\"color()\"\n hlmPopoverTrigger\n [disabled]=\"isReadonly()\"\n >\n </button>\n </hlm-input-group-addon>\n \n <input\n hlmInputGroupInput\n [ngModel]=\"text()\"\n (ngModelChange)=\"onText($event)\"\n [disabled]=\"isReadonly()\"\n [maskito]=\"maskitoOptions\"\n [attr.id]=\"id()\"\n type=\"text\"\n class=\"font-mono\"\n [placeholder]=\"placeholder() || '#000000'\"\n (blur)=\"onBlur()\"\n />\n \n @if(value() && !isReadonly()) {\n <hlm-input-group-addon align=\"inline-end\">\n <button\n hlmInputGroupButton\n type=\"button\"\n size=\"icon-xs\"\n variant=\"ghost\"\n aria-label=\"Limpar cor\"\n (click)=\"clear()\"\n >\n <ng-icon name=\"lucideCircleX\" />\n </button>\n </hlm-input-group-addon>\n }\n <hlm-input-group-addon align=\"inline-end\">\n <button\n hlmInputGroupButton\n hlmPopoverTrigger\n [disabled]=\"isReadonly()\"\n type=\"button\"\n size=\"icon-xs\"\n variant=\"ghost\"\n aria-label=\"Limpar cor\"\n >\n <ng-icon name=\"lucidePalette\" />\n </button>\n </hlm-input-group-addon>\n \n <loading-input [loading]=\"loading()\"></loading-input>\n </hlm-input-group>\n\n <hlm-popover-content *hlmPopoverPortal=\"let ctx\">\n <color-picker [(ngModel)]=\"value\" [disabled]=\"isReadonly()\">\n </color-picker>\n </hlm-popover-content>\n </hlm-popover>\n\n <error-message-provider [errors]=\"errors()\" [invalid]=\"invalid()\" [touched]=\"touched()\"></error-message-provider>\n</div>\n","import { CommonModule } from '@angular/common';\nimport { Component, computed, ElementRef, inject, model, ModelSignal, signal, Signal, WritableSignal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { FormValueControl } from '@angular/forms/signals';\nimport { MaskitoDirective } from '@maskito/angular';\nimport { MaskitoMaskExpression, MaskitoOptions, MaskitoPreprocessor } from '@maskito/core';\nimport { ElementState } from '@maskito/core/src/lib/types';\n\nimport {\n HlmFieldImports,\n HlmInputImports,\n HlmSkeletonImports,\n HlmTooltipImports,\n} from '@sapphire-caitlyn/schema-kit-ng/helm';\nimport { NgIcon } from '@ng-icons/core';\n\nimport { InputBaseComponent } from '../input-base/input-base.component';\nimport { LoadingInputComponent } from '../loading-input/loading-input.component';\nimport { ErrorMessageProviderComponent } from '../../error-message-provider/error-message-provider.component';\nimport { MaskitoUnmaskDirective } from '../../../directives/maskito-unmask.directive';\n\n@Component({\n imports: [\n HlmTooltipImports,\n NgIcon,\n HlmInputImports,\n HlmFieldImports,\n HlmSkeletonImports,\n FormsModule,\n CommonModule,\n MaskitoDirective,\n MaskitoUnmaskDirective,\n LoadingInputComponent,\n ErrorMessageProviderComponent\n ],\n selector: 'input-cpf-cnpj, input-cpf, input-cnpj',\n styleUrl: './input-cpf-cnpj.component.scss',\n templateUrl: './input-cpf-cnpj.component.html',\n})\nexport class InputCpfCnpjComponent extends InputBaseComponent implements FormValueControl<string | null> {\n\n value: ModelSignal<string | null> = model<string | null>(null);\n\n elementRef: WritableSignal<ElementRef | null> = signal(null);\n\n inputType: Signal<InputCpfCnpjType> = computed(() => {\n if(!this.elementRef()) {\n return InputCpfCnpjType.CPFCNPJ;\n }\n // 'INPUT-CPF' -> 'CPF', 'INPUT-CNPJ' -> 'CNPJ', 'INPUT-CPF-CNPJ' -> 'CPFCNPJ'\n const tagName = this.elementRef()!.nativeElement.tagName.toUpperCase().split('-').slice(1).join('') as InputCpfCnpjType;\n return tagName;\n });\n\n maskitoOptions: Signal<MaskitoOptions> = computed(() => { \n switch(this.inputType()) {\n case InputCpfCnpjType.CPF:\n return maskitoOptionsCPF;\n case InputCpfCnpjType.CNPJ:\n return maskitoOptionsCNPJ;\n case InputCpfCnpjType.CPFCNPJ:\n default:\n return maskitoOptionsCPFOrCNPJ;\n }\n })\n\n // Remove a pontuação para manter apenas dígitos/letras (ex.: 12345678901)\n unmask = (masked: string): string | null => masked.replace(/[^A-Z0-9]/gi, '').toUpperCase() || null;\n\n constructor(\n elementRef: ElementRef\n ) {\n super();\n this.elementRef.set(elementRef);\n }\n}\n\nconst cpfMask: MaskitoMaskExpression = [/\\d/, /\\d/, /\\d/, '.', /\\d/, /\\d/, /\\d/, '.', /\\d/, /\\d/, /\\d/, '-', /\\d/, /\\d/];\n//Mascara para CNPJ com letra E numero (padrão 2026)\nconst cnpjMask: MaskitoMaskExpression = [\n /[A-Z0-9]/, /[A-Z0-9]/, '.', /[A-Z0-9]/, /[A-Z0-9]/, /[A-Z0-9]/, '.', /[A-Z0-9]/, /[A-Z0-9]/, /[A-Z0-9]/, '/',\n /[A-Z0-9]/, /[A-Z0-9]/, /[A-Z0-9]/, /[A-Z0-9]/, '-', /\\d/, /\\d/\n];\n// O CNPJ alfanumérico só aceita maiúsculas; converte o que for digitado/colado\nconst toUpperCasePreprocessor: MaskitoPreprocessor = ({ elementState, data }) => ({ elementState, data: data.toUpperCase() });\n\nexport const maskitoOptionsCPF: MaskitoOptions = {\n mask: cpfMask,\n}\nexport const maskitoOptionsCNPJ: MaskitoOptions = {\n mask: cnpjMask,\n preprocessors: [toUpperCasePreprocessor],\n};\nexport const maskitoOptionsCPFOrCNPJ: MaskitoOptions = {\n mask: ({ value }: ElementState): MaskitoMaskExpression => {\n const raw = value.replace(/[^A-Z0-9]/gi, '');\n // CPF só tem dígitos; qualquer letra ou mais de 11 caracteres indica CNPJ\n return raw.length <= 11 && /^\\d*$/.test(raw) ? cpfMask : cnpjMask;\n },\n preprocessors: [toUpperCasePreprocessor],\n};\nexport enum InputCpfCnpjType {\n CPF = 'CPF',\n CNPJ = 'CNPJ',\n CPFCNPJ = 'CPFCNPJ'\n}","<div hlmField [forceInvalid]=\"touched() && invalid()\">\n @if(label()){\n <label hlmFieldLabel [attr.for]=\"id()\">\n {{label()}}\n\n @if(tooltipInfo()){\n <ng-icon name=\"lucideCircleQuestionMark\" [hlmTooltip]=\"tooltipInfo()!\" position=\"top\"></ng-icon>\n }\n </label>\n }\n <div class=\"relative\">\n <input \n hlmInput \n [forceInvalid]=\"touched() && invalid()\" \n [(ngModel)]=\"value\"\n [disabled]=\"isReadonly()\"\n [maskito]=\"maskitoOptions()\" \n [unmaskHandler]=\"unmask\" \n [attr.id]=\"id()\" \n type=\"text\" \n [placeholder]=\"placeholder() || ''\"\n >\n \n <loading-input [loading]=\"loading()\"></loading-input>\n </div>\n\n <error-message-provider [errors]=\"errors()\" [invalid]=\"invalid()\" [touched]=\"touched()\"></error-message-provider>\n</div>\n","import { CommonModule } from '@angular/common';\nimport { Component, input, InputSignal } from '@angular/core';\n\nimport { HlmSpinnerImports } from '@sapphire-caitlyn/schema-kit-ng/helm';\n\ntype Position = 'absolute' | 'relative';\n\n@Component({\n imports: [\n HlmSpinnerImports,\n CommonModule\n ],\n selector: 'loading',\n styleUrl: './loading.component.scss',\n templateUrl: './loading.component.html',\n})\nexport class LoadingComponent {\n position: InputSignal<Position> = input<Position>('absolute');\n active: InputSignal<boolean> = input<boolean>(true);\n}\n\n","<div \n class=\"flex justify-center bg-white/10 items-center size-full \n mask-y-from-30% mask-x-from-30%\n \" \n [ngClass]=\"{\n 'absolute inset-0': position() === 'absolute',\n 'relative': position() === 'relative',\n 'animate-in fade-in-0 slide-in-from-left-2': active(),\n 'animate-out fade-out-0 slide-out-to-left-2 fill-mode-forwards pointer-events-none': !active(),\n 'w-0': !active() && position() == 'relative',\n 'transition-[width] duration-150 ease-in-out': position() == 'relative'\n }\" \n>\n <hlm-spinner></hlm-spinner>\n</div>","import { Component, computed, input, InputSignal, linkedSignal } from '@angular/core';\n\nimport { NgIcon } from '@ng-icons/core';\nimport { HlmButtonImports, HlmPopoverImports } from '@sapphire-caitlyn/schema-kit-ng/helm';\n\nimport { LoadingComponent } from '../loading/loading.component';\n\n/** Arquivo exibido, com a URL usada para pré-visualizar (imagem) ou baixar */\nexport interface FileItem {\n name: string;\n url: string;\n image: boolean;\n /** Presente quando o item vem de um `File`, cuja `url` é uma object URL */\n file?: File;\n}\n\n/** Identifica imagens quando o valor é uma string (URL ou data URL) */\nconst IMAGE_REGEX = /^data:image\\/|\\.(png|jpe?g|gif|webp|avif|svg|bmp|ico)([?#].*)?$/i;\n\n/** Nome exibido para uma URL: o último segmento do caminho (ex.: URL assinada do bucket), ou a própria string */\nfunction fileName(url: string): string {\n try {\n const { protocol, pathname } = new URL(url);\n const name = protocol === 'data:' ? '' : decodeURIComponent(pathname.split('/').pop() ?? '');\n return name || url;\n } catch {\n return url;\n }\n}\n\n/** Item de um arquivo já existente, identificado pela URL */\nexport function fileItemFromUrl(url: string): FileItem {\n return { name: fileName(url), url, image: IMAGE_REGEX.test(url) };\n}\n\n/** Itens de um valor de arquivo vindo da API: uma URL, uma lista de URLs ou vazio */\nexport function fileItemsFromValue(value: unknown): FileItem[] {\n return [value]\n .flat()\n .filter((url): url is string => typeof url === 'string' && !!url)\n .map(fileItemFromUrl);\n}\n\n/**\n * Botão de um arquivo: imagens abrem uma pré-visualização no popover (com loading enquanto carrega);\n * os demais arquivos são baixados.\n */\n@Component({\n imports: [\n HlmButtonImports,\n HlmPopoverImports,\n LoadingComponent,\n NgIcon,\n ],\n selector: 'file-preview',\n styleUrl: './file-preview.component.scss',\n templateUrl: './file-preview.component.html',\n})\nexport class FilePreviewComponent {\n item: InputSignal<FileItem> = input.required<FileItem>();\n\n /**\n * Em `computed` para só mudar quando a URL muda: quem usa pode passar um objeto novo a cada detecção de mudanças\n * (ex.: o template da schema-table), e o `linkedSignal` reiniciaria a cada objeto novo, mesmo com a mesma URL.\n */\n private url = computed(() => this.item().url);\n\n /**\n * Se a imagem já carregou (ou falhou). O popover recria a imagem a cada abertura, mas o navegador reaproveita\n * a já carregada, então o loading só aparece na primeira vez; volta a aparecer quando a URL muda.\n */\n loaded = linkedSignal({\n source: this.url,\n computation: () => false,\n });\n}\n","@let file = item();\n@if(file.image) {\n <hlm-popover sideOffset=\"5\" align=\"start\">\n <button\n hlmBtn\n hlmPopoverTrigger\n variant=\"ghost\"\n size=\"icon-xs\"\n type=\"button\"\n [attr.aria-label]=\"'Visualizar ' + file.name\"\n >\n <ng-icon name=\"lucideImage\" />\n </button>\n <hlm-popover-content *hlmPopoverPortal=\"let ctx\" class=\"w-auto\">\n <div class=\"relative\" [class.size-24]=\"!loaded()\">\n <img\n [src]=\"file.url\"\n [alt]=\"file.name\"\n class=\"max-h-80 max-w-80 rounded-md object-contain\"\n (load)=\"loaded.set(true)\"\n (error)=\"loaded.set(true)\"\n />\n <loading [active]=\"!loaded()\" />\n </div>\n </hlm-popover-content>\n </hlm-popover>\n} @else {\n <a\n hlmBtn\n variant=\"ghost\"\n size=\"icon-xs\"\n target=\"_blank\"\n rel=\"noopener\"\n [href]=\"file.url\"\n [attr.download]=\"file.file ? file.name : ''\"\n [attr.aria-label]=\"'Baixar ' + file.name\"\n >\n <ng-icon name=\"lucideFileDown\" />\n </a>\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, computed, effect, input, InputSignal, model, Signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { FormValueControl } from '@angular/forms/signals';\n\nimport {\n HlmFieldImports,\n HlmInputImports,\n HlmInputGroupImports,\n HlmSkeletonImports,\n HlmButtonImports,\n HlmTooltipImports,\n} from '@sapphire-caitlyn/schema-kit-ng/helm';\nimport { NgIcon } from '@ng-icons/core';\n\nimport { InputBaseComponent } from '../input-base/input-base.component';\nimport { LoadingInputComponent } from '../loading-input/loading-input.component';\nimport { FileItem, fileItemFromUrl, FilePreviewComponent } from '../../ui/file-preview/file-preview.component';\nimport { ErrorMessageProviderComponent } from '../../error-message-provider/error-message-provider.component';\n\n/**\n * Valor aceito pelo input: string (arquivo já existente, ex.: nome/URL), um arquivo ou vários arquivos.\n * `FileList` também é aceito na entrada, mas o input sempre emite `File` ou `File[]`.\n */\nexport type InputFileValue = string | File | File[] | FileList | null | undefined;\n\n@Component({\n imports: [\n HlmTooltipImports,\n HlmInputImports,\n HlmInputGroupImports,\n HlmButtonImports,\n HlmFieldImports,\n HlmSkeletonImports,\n FormsModule,\n CommonModule,\n LoadingInputComponent,\n FilePreviewComponent,\n ErrorMessageProviderComponent,\n NgIcon\n ],\n selector: 'input-file',\n styleUrl: './input-file.component.scss',\n templateUrl: './input-file.component.html',\n})\nexport class InputFileComponent extends InputBaseComponent implements FormValueControl<InputFileValue> {\n value = model<InputFileValue>(null);\n\n type = input<FileInputType>(FileInputType.INPUT, {\n alias: 'type',\n });\n\n multiple = input<boolean>(false);\n\n /** Exibe o botão de limpar quando há um arquivo (no `multiple`, cada arquivo já tem o seu botão de remover) */\n clearable: InputSignal<boolean> = input<boolean>(false);\n\n /** Arquivos do valor atual como lista (`File[]` ou `FileList`); vazio para string ou arquivo único */\n private files: Signal<File[]> = computed(() => {\n const value = this.value();\n if (Array.isArray(value) || value instanceof FileList) {\n return Array.from(value);\n }\n return value instanceof File ? [value] : [];\n });\n\n /** Itens do valor atual, na mesma ordem do valor */\n items: Signal<FileItem[]> = computed(() => {\n const value = this.value();\n if (typeof value === 'string') {\n return value ? [fileItemFromUrl(value)] : [];\n }\n return this.files().map((file) => ({\n name: file.name,\n url: URL.createObjectURL(file),\n image: file.type.startsWith('image/'),\n file,\n }));\n });\n\n constructor() {\n super();\n // Revoga as object URLs criadas para os arquivos quando o valor muda ou o componente é destruído\n effect((onCleanup) => {\n const items = this.items();\n onCleanup(() => items.forEach((item) => item.file && URL.revokeObjectURL(item.url)));\n });\n }\n\n onSelect(event: Event) {\n const input = event.target as HTMLInputElement;\n const files = Array.from(input.files ?? []);\n // Limpa o input nativo para permitir selecionar o mesmo arquivo novamente\n input.value = '';\n if (!files.length) {\n return;\n }\n\n if (this.multiple()) {\n this.value.set([...this.files(), ...files]);\n } else {\n this.value.set(files[0]);\n }\n this.touch.emit();\n }\n\n clear() {\n this.value.set(null);\n this.touch.emit();\n }\n\n remove(index: number) {\n const next = this.files().filter((_, i) => i !== index);\n this.value.set(next.length ? next : null);\n this.touch.emit();\n }\n}\nenum FileInputType {\n DROPZONE = 'dropzone',\n INPUT = 'input',\n}\n","<div hlmField [forceInvalid]=\"touched() && invalid()\">\n @if(label()) {\n <label hlmFieldLabel [attr.for]=\"id()\">\n {{label()}}\n\n @if(tooltipInfo()){\n <ng-icon name=\"lucideCircleQuestionMark\" [hlmTooltip]=\"tooltipInfo()!\" position=\"top\"></ng-icon>\n }\n </label>\n }\n <hlm-input-group class=\"relative\">\n <hlm-input-group-addon>\n @if(!multiple() && items().length) {\n <file-preview class=\"mx-[-.3rem]\" [item]=\"items()[0]\" />\n } @else {\n <ng-icon name=\"lucideFile\" />\n }\n </hlm-input-group-addon>\n\n <hlm-input-group-addon class=\"w-full text-start overflow-hidden\">\n <ng-content select=\"[slot=input]\"></ng-content>\n <span class=\"w-full shrink-0 truncate\" [class.text-foreground]=\"items().length\">\n @if(!items().length) {\n {{placeholder() || 'Nenhum arquivo selecionado'}}\n } @else if(multiple()) {\n {{items().length}} {{items().length === 1 ? 'arquivo selecionado' : 'arquivos selecionados'}}\n } @else {\n {{items()[0].name}}\n }\n </span>\n </hlm-input-group-addon>\n\n @if(clearable() && !multiple() && items().length && !isReadonly()) {\n <hlm-input-group-addon align=\"inline-end\">\n <button hlmInputGroupButton variant=\"ghost\" size=\"icon-xs\" type=\"button\" aria-label=\"Remover arquivo\" (click)=\"clear()\">\n <ng-icon name=\"lucideCircleX\" />\n </button>\n </hlm-input-group-addon>\n }\n <hlm-input-group-addon align=\"inline-end\">\n <button hlmInputGroupButton variant=\"ghost\" size=\"icon-xs\" type=\"button\" (click)=\"fileInput.click()\" [disabled]=\"isReadonly()\">\n <ng-icon name=\"lucideUpload\" />\n </button>\n </hlm-input-group-addon>\n\n <loading-input [loading]=\"loading()\"></loading-input>\n </hlm-input-group>\n\n @if(multiple() && items().length) {\n <ul class=\"flex flex-col gap-1\">\n @for(item of items(); track $index) {\n <li class=\"flex items-center gap-2 rounded-md border px-2 py-1 text-sm\">\n <file-preview [item]=\"item\" />\n <span class=\"w-full truncate\">{{item.name}}</span>\n <button\n hlmBtn\n variant=\"ghost\"\n size=\"icon-xs\"\n type=\"button\"\n aria-label=\"Remover arquivo\"\n (click)=\"remove($index)\"\n [disabled]=\"isReadonly()\"\n >\n <ng-icon name=\"lucideCircleX\" />\n </button>\n </li>\n }\n </ul>\n }\n\n <input #fileInput [attr.id]=\"id()\" type=\"file\" (change)=\"onSelect($event)\" [multiple]=\"multiple()\" [disabled]=\"isReadonly()\" hidden/>\n\n <error-message-provider [errors]=\"errors()\" [invalid]=\"invalid()\" [touched]=\"touched()\"></error-message-provider>\n</div>\n","import { CommonModule } from '@angular/common';\nimport { Component, computed, model, signal, Signal, WritableSignal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { FormValueControl } from '@angular/forms/signals';\n\nimport { NgIcon, provideIcons } from '@ng-icons/core';\nimport {\n HlmInputImports,\n HlmFieldImports,\n HlmSkeletonImports,\n HlmComboboxImports,\n HlmTooltipImports,\n} from '@sapphire-caitlyn/schema-kit-ng/helm';\nimport * as IconsLucide from '@ng-icons/lucide';\n\nimport { InputBaseComponent } from '../../inputs/input-base/input-base.component';\nimport { LoadingInputComponent } from '../loading-input/loading-input.component';\nimport { ErrorMessageProviderComponent } from '../../error-message-provider/error-message-provider.component';\n\nconst ICONS: Record<string, string> = { ...IconsLucide };\n\nconst ICON_NAMES: string[] = Object.keys(ICONS);\n\n/** Quantidade máxima de ícones renderizados na lista (são milhares, renderizar todos trava a UI) */\nconst MAX_RESULTS = 60;\n\n@Component({\n imports: [\n HlmTooltipImports,\n HlmInputImports,\n HlmFieldImports,\n HlmSkeletonImports,\n HlmComboboxImports,\n FormsModule,\n CommonModule,\n NgIcon,\n LoadingInputComponent,\n ErrorMessageProviderComponent\n ],\n providers: [provideIcons(ICONS)],\n selector: 'input-icon',\n styleUrl: './input-icon.component.scss',\n templateUrl: './input-icon.component.html',\n})\nexport class InputIconComponent extends InputBaseComponent implements FormValueControl<string | null | undefined> {\n value = model<string | null | undefined>(null);\n\n search: WritableSignal<string> = signal('');\n\n /** Todos os ícones que correspondem à busca (cada palavra da busca deve estar no nome) */\n matches: Signal<string[]> = computed(() => {\n const terms = this.search().toLowerCase().split(/[\\s_-]+/).filter(Boolean);\n if(!terms.length) {\n return ICON_NAMES;\n }\n return ICON_NAMES.filter(name => {\n const normalized = name.toLowerCase();\n return terms.every(term => normalized.includes(term));\n });\n });\n\n /** Ícones exibidos na lista, sempre mantendo o ícone selecionado */\n icons: Signal<string[]> = computed(() => {\n const result = this.matches().slice(0, MAX_RESULTS);\n const selected = this.value();\n if(selected && ICONS[selected] && !result.includes(selected)) {\n result.unshift(selected);\n }\n return result;\n });\n\n onSelect(name: string | null) {\n this.value.set(name ?? null);\n this.touch.emit();\n }\n\n // A filtragem é feita em `icons`, então o combobox não deve esconder nenhum item\n filter = (): boolean => true;\n\n itemToString = (name: string): string => this.iconLabel(name);\n\n /** Converte `lucideHouse` em `Home Smile Linear` */\n iconLabel(name: string): string {\n return name\n .replace(/^lucide/, '')\n .replace(/([a-z0-9])([A-Z])/g, '$1 $2')\n .replace(/([A-Z])([A-Z][a-z])/g, '$1 $2')\n .trim();\n }\n}\n","<div hlmField [forceInvalid]=\"touched() && invalid()\">\n @if(label()) {\n <label hlmFieldLabel [attr.for]=\"id()\">\n {{label()}}\n\n @if(tooltipInfo()){\n <ng-icon name=\"lucideCircleQuestionMark\" [hlmTooltip]=\"tooltipInfo()!\" position=\"top\"></ng-icon>\n }\n </label>\n }\n <div class=\"relative\">\n <hlm-combobox\n [disabled]=\"isReadonly()\"\n [(search)]=\"search\"\n [ngModel]=\"value()\"\n (ngModelChange)=\"onSelect($event)\"\n [filter]=\"filter\"\n [itemToString]=\"itemToString\"\n >\n <hlm-combobox-trigger [buttonId]=\"id()\" class=\"w-full truncate justify-between font-normal\" [forceInvalid]=\"touched() && invalid()\">\n <span class=\"flex min-w-0 items-center gap-2\">\n <ng-template hlmComboboxValueTemplate let-value>\n <ng-icon [name]=\"value\" class=\"shrink-0 text-base\" />\n </ng-template>\n <hlm-combobox-value class=\"truncate\" [placeholder]=\"placeholder() || 'Selecione um ícone'\" />\n </span>\n </hlm-combobox-trigger>\n <hlm-combobox-content *hlmComboboxPortal>\n <hlm-combobox-input showTrigger=\"false\" placeholder=\"Pesquisar ícone...\" showClear />\n <hlm-combobox-empty>Nenhum ícone encontrado.</hlm-combobox-empty>\n <div hlmComboboxList>\n @for (name of icons(); track name) {\n <hlm-combobox-item [value]=\"name\" class=\"wrap-anywhere\">\n <ng-icon [name]=\"name\" class=\"text-base\" />\n {{ iconLabel(name) }}\n </hlm-combobox-item>\n }\n </div>\n @if(matches().length > icons().length) {\n <p class=\"text-muted-foreground px-2 py-1.5 text-xs\">\n Exibindo {{ icons().length }} de {{ matches().length }} ícones. Refine a busca para ver mais.\n </p>\n }\n </hlm-combobox-content>\n </hlm-combobox>\n\n <loading-input [loading]=\"loading()\"></loading-input>\n </div>\n\n <error-message-provider [errors]=\"errors()\" [invalid]=\"invalid()\" [touched]=\"touched()\"></error-message-provider>\n</div>\n","import { CommonModule } from '@angular/common';\nimport { Component, input, model } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { FormValueControl } from '@angular/forms/signals';\nimport { MaskitoDirective } from '@maskito/angular';\nimport { MaskitoOptions } from '@maskito/core';\n\nimport { HlmFieldImports, HlmInputImports, HlmTooltipImports } from '@sapphire-caitlyn/schema-kit-ng/helm';\nimport { NgIcon } from '@ng-icons/core';\n\nimport { LoadingInputComponent } from '../loading-input/loading-input.component';\nimport { ErrorMessageProviderComponent } from '../../error-message-provider/error-message-provider.component';\nimport { MaskitoUnmaskDirective } from '../../../directives/maskito-unmask.directive';\nimport { InputBaseComponent } from '../input-base/input-base.component';\n\n@Component({\n imports: [\n HlmTooltipImports,\n NgIcon,\n HlmInputImports,\n HlmFieldImports,\n FormsModule,\n CommonModule,\n MaskitoDirective,\n MaskitoUnmaskDirective,\n LoadingInputComponent,\n ErrorMessageProviderComponent\n ],\n selector: 'input-mask',\n styleUrl: './input-mask.component.scss',\n templateUrl: './input-mask.component.html',\n})\nexport class InputMaskComponent extends InputBaseComponent implements FormValueControl<string | null> {\n value = model<string | null>(null);\n\n maskitoOptions = input.required<MaskitoOptions>();\n unmaskHandler = input<(value: string) => string | null>();\n\n /** Sem `unmaskHandler`, o model recebe o valor mascarado */\n unmask = (value: string): string | null => {\n const handler = this.unmaskHandler();\n return handler ? handler(value) : value;\n };\n}\n","<div hlmField [forceInvalid]=\"touched() && invalid()\">\n @if(label()) {\n <label hlmFieldLabel [attr.for]=\"id()\">\n {{label()}}\n\n @if(tooltipInfo()){\n <ng-icon name=\"lucideCircleQuestionMark\" [hlmTooltip]=\"tooltipInfo()!\" position=\"top\"></ng-icon>\n }\n </label>\n }\n <div class=\"relative\">\n <input \n hlmInput \n [forceInvalid]=\"touched() && invalid()\" \n [(ngModel)]=\"value\"\n [disabled]=\"isReadonly()\"\n [maskito]=\"maskitoOptions()\" \n [unmaskHandler]=\"unmask\"\n [attr.id]=\"id()\" \n type=\"text\" \n [placeholder]=\"placeholder() || ''\"\n >\n \n <loading-input [loading]=\"loading()\"></loading-input>\n </div>\n\n <error-message-provider [errors]=\"errors()\" [invalid]=\"invalid()\" [touched]=\"touched()\"></error-message-provider>\n</div>\n","import { CommonModule } from '@angular/common';\nimport { Component, computed, input, InputSignal, model, ModelSignal, Signal, ElementRef, signal, WritableSignal, inject } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { FormValueControl } from '@angular/forms/signals';\nimport { MaskitoDirective } from '@maskito/angular';\nimport { MaskitoOptions } from '@maskito/core';\nimport { maskitoNumber, MaskitoNumberParams, maskitoParseNumber, maskitoPostfixPostprocessorGenerator, maskitoPrefixPostprocessorGenerator, maskitoStringifyNumber } from '@maskito/kit';\n\nimport {\n HlmFieldImports,\n HlmInputImports,\n HlmSkeletonImports,\n HlmTooltipImports,\n} from '@sapphire-caitlyn/schema-kit-ng/helm';\nimport { NgIcon } from '@ng-icons/core';\n\nimport { InputBaseComponent } from '../input-base/input-base.component';\nimport { LoadingInputComponent } from '../loading-input/loading-input.component';\nimport { ErrorMessageProviderComponent } from '../../error-message-provider/error-message-provider.component';\nimport { MaskitoUnmaskDirective } from '../../../directives/maskito-unmask.directive';\n\n@Component({\n imports: [\n HlmTooltipImports,\n NgIcon,\n HlmInputImports,\n HlmFieldImports,\n HlmSkeletonImports,\n FormsModule,\n CommonModule,\n MaskitoDirective,\n MaskitoUnmaskDirective,\n LoadingInputComponent,\n ErrorMessageProviderComponent\n ],\n selector: 'input-number, input-decimal, input-currency, input-percentage',\n styleUrl: './input-number.component.scss',\n templateUrl: './input-number.component.html',\n})\nexport class InputNumberComponent extends InputBaseComponent implements FormValueControl<number | null> {\n \n value: ModelSignal<number | null> = model<number | null>(null);\n\n minimumFractionDigits: InputSignal<number | undefined> = input<number | undefined>(undefined);\n\n maximumFractionDigits: InputSignal<number | undefined> = input<number | undefined>(undefined);\n\n postfix: InputSignal<string | undefined> = input<string | undefined>(undefined);\n \n prefix: InputSignal<string | undefined> = input<string | undefined>(undefined);\n\n min: InputSignal<number | undefined> = input<number | undefined>(undefined);\n\n max: InputSignal<number | undefined> = input<number | undefined>(undefined);\n\n numberParams: Signal<MaskitoNumberParams> = computed(() => {\n let maximumFractionDigits: number;\n let minimumFractionDigits: number;\n let postfix: string;\n let prefix: string\n let min: number;\n let max: number;\n\n switch(this.inputType()) {\n case InputNumberType.DECIMAL:\n maximumFractionDigits = this.maximumFractionDigits() ?? 2;\n minimumFractionDigits = this.minimumFractionDigits() ?? 2;\n postfix = this.postfix() ?? '';\n prefix = this.prefix() ?? '';\n break;\n case InputNumberType.CURRENCY:\n maximumFractionDigits = this.maximumFractionDigits() ?? 2;\n minimumFractionDigits = this.minimumFractionDigits() ?? 2;\n postfix = this.postfix() ?? '';\n prefix = this.prefix() ?? 'R$ ';\n break;\n case InputNumberType.NUMBER:\n maximumFractionDigits = this.maximumFractionDigits() ?? 0;\n minimumFractionDigits = this.minimumFractionDigits() ?? 0;\n postfix = this.postfix() ?? '';\n prefix = this.prefix() ?? '';\n break;\n default:\n maximumFractionDigits = this.maximumFractionDigits() ?? 0;\n minimumFractionDigits = this.minimumFractionDigits() ?? 0;\n postfix = this.postfix() ?? '';\n prefix = this.prefix() ?? '';\n break;\n }\n min = this.min() ?? Number.MIN_SAFE_INTEGER;\n max = this.max() ?? Number.MAX_SAFE_INTEGER;\n\n return {\n maximumFractionDigits: maximumFractionDigits,\n minimumFractionDigits: minimumFractionDigits,\n postfix: postfix,\n prefix: prefix,\n min: min,\n max: max,\n decimalSeparator: ',',\n thousandSeparator: '.',\n };\n })\n\n maskitoOptions: Signal<MaskitoOptions> = computed(() => maskitoOptionsNumber(this.numberParams()));\n\n // Converte o texto mascarado (ex.: \"R$ 1.000,42\") para number (1000.42)\n unmask = (masked: string): number | null => {\n const parsed = maskitoParseNumber(masked, this.numberParams());\n return Number.isNaN(parsed) ? null : parsed;\n };\n\n // Converte o number do model para o texto mascarado exibido no campo\n stringify = (value: number | string | null | undefined): string =>\n value == null || value === '' ? '' : maskitoStringifyNumber(Number(value), this.numberParams());\n\n inputType: Signal<InputNumberType> = computed(() => {\n if(!this.elementRef()) {\n return InputNumberType.NUMBER;\n }\n const tagName = this.elementRef()!.nativeElement.tagName.toUpperCase().split('-')[1] as InputNumberType;\n return tagName;\n });\n\n elementRef: WritableSignal<ElementRef | null> = signal(null);\n\n constructor(\n elementRef: ElementRef\n ) {\n super();\n this.elementRef.set(elementRef);\n }\n}\n\nexport function maskitoOptionsNumber(options?: MaskitoNumberParams | undefined): MaskitoOptions {\n if(!options) {\n options = {\n decimalSeparator: ',',\n thousandSeparator: '.',\n }\n }\n if(!options.decimalSeparator && !options.thousandSeparator) {\n options.decimalSeparator = ',';\n options.thousandSeparator = '.';\n }\n\n const maskitoNumberIns = maskitoNumber(options)\n const maskitoOptions: MaskitoOptions = {\n mask: maskitoNumberIns.mask,\n plugins: maskitoNumberIns.plugins,\n postprocessors: maskitoNumberIns.postprocessors,\n preprocessors: maskitoNumberIns.preprocessors,\n overwriteMode: maskitoNumberIns.overwriteMode,\n }\n return maskitoOptions;\n}\n\nexport enum InputNumberType {\n NUMBER = 'NUMBER',\n DECIMAL = 'DECIMAL',\n CURRENCY = 'CURRENCY',\n PERCENTAGE = 'PERCENTAGE',\n}","<div hlmField>\n <label hlmFieldLabel [attr.for]=\"id()\">\n {{label()}}\n\n @if(tooltipInfo()){\n <ng-icon name=\"lucideCircleQuestionMark\" [hlmTooltip]=\"tooltipInfo()!\" position=\"top\"></ng-icon>\n }\n </label>\n <div class=\"relative\">\n <input \n hlmInput \n [(ngModel)]=\"value\"\n [disabled]=\"isReadonly()\"\n [maskito]=\"maskitoOptions()\" \n [unmaskHandler]=\"unmask\" \n [stringifyHandler]=\"stringify\" \n [attr.id]=\"id()\" \n type=\"text\" \n [placeholder]=\"placeholder() || ''\"\n >\n \n <loading-input [loading]=\"loading()\"></loading-input>\n </div>\n\n <error-message-provider [errors]=\"errors()\" [invalid]=\"invalid()\" [touched]=\"touched()\"></error-message-provider>\n</div>\n","import { Component, input, model, signal } from '@angular/core';\nimport { FormValueControl } from '@angular/forms/signals';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { MaskitoOptions } from '@maskito/core';\nimport { maskitoPhone, MaskitoPhoneParams } from '@maskito/phone';\nimport metadata from 'libphonenumber-js/min/metadata';\nimport { MaskitoDirective } from '@maskito/angular';\n\nimport {\n HlmFieldImports,\n HlmInputImports,\n HlmSkeletonImports,\n HlmTooltipImports,\n} from '@sapphire-caitlyn/schema-kit-ng/helm';\nimport { NgIcon } from '@ng-icons/core';\n\nimport { InputBaseComponent } from '../input-base/input-base.component';\nimport { LoadingInputComponent } from '../loading-input/loading-input.component';\nimport { ErrorMessageProviderComponent } from '../../error-message-provider/error-message-provider.component';\nimport { MaskitoUnmaskDirective } from '../../../directives/maskito-unmask.directive';\n\n@Component({\n imports: [\n HlmTooltipImports,\n NgIcon,\n HlmInputImports,\n HlmFieldImports,\n HlmSkeletonImports,\n FormsModule,\n CommonModule,\n MaskitoDirective,\n MaskitoUnmaskDirective,\n LoadingInputComponent,\n ErrorMessageProviderComponent\n ],\n selector: 'input-phone',\n styleUrl: './input-phone.component.scss',\n templateUrl: './input-phone.component.html',\n})\nexport class InputPhoneComponent extends InputBaseComponent implements FormValueControl<string | null> {\n value = model<string | null>(null);\n\n maskitoOptions: MaskitoOptions = maskitoOptionsPhone;\n\n unmaskPhone = (masked: string): string | null => {\n const raw = masked.replace(/[^\\d+]/g, '');\n return raw && raw !== '+' ? raw : null;\n };\n}\n\n\t \nconst phoneOptions = maskitoPhone({\n metadata,\n strict: true,\n});\n\t \n\nexport const maskitoOptionsPhone: MaskitoOptions = {\n plugins: [...phoneOptions.plugins], mask: phoneOptions.mask,\n}","<div hlmField [forceInvalid]=\"touched() && invalid()\">\n @if(label()) {\n <label hlmFieldLabel [attr.for]=\"id()\">\n {{label()}}\n\n @if(tooltipInfo()){\n <ng-icon name=\"lucideCircleQuestionMark\" [hlmTooltip]=\"tooltipInfo()!\" position=\"top\"></ng-icon>\n }\n </label>\n }\n <div class=\"relative\">\n <input \n hlmInput \n [forceInvalid]=\"touched() && invalid()\" \n [(ngModel)]=\"value\"\n [disabled]=\"isReadonly()\"\n [maskito]=\"maskitoOptions\" \n [unmaskHandler]=\"unmaskPhone\"\n [attr.id]=\"id()\" \n type=\"text\" \n [placeholder]=\"placeholder() || ''\"\n >\n \n <loading-input [loading]=\"loading()\"></loading-input>\n </div>\n\n <error-message-provider [errors]=\"errors()\" [invalid]=\"invalid()\" [touched]=\"touched()\"></error-message-provider>\n</div>\n","import { Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root',\n})\n/**\n * Provê um serviço para acessar o ambiente da aplicação, \n * permitindo a configuração e recuperação de variáveis de ambiente.\n */\nexport class EnvironmentService<Environment> {\n private environment: Environment;\n\n /**\n * Construtor do serviço EnvironmentService.\n * Inicializa o ambiente a partir da variável global `window.environment`.\n * Lança um erro se o ambiente não estiver definido.\n */\n constructor() {\n this.environment = (window as unknown as Window & { environment: Environment }).environment;\n }\n\n /**\n * @param env Define o ambiente da aplicação.\n */\n public set<K extends keyof Environment>(key: K, value: Environment[K]): void {\n this.environment[key] = value;\n }\n\n /**\n * Retorna o ambiente da aplicação.\n * Lança um erro se o ambiente não estiver definido.\n * @returns O ambiente da aplicação.\n */\n\n public get<K extends keyof Environment>(key: K): Environment[K]{\n const value = this.environment[key];\n return value as Environment[K];\n }\n\n /** \n * Retorna a URL de um recurso.\n * @param path O caminho do recurso.\n * @returns A URL do recurso.\n */\n public resource(path: string): string {\n return `${this.apiUrl()}/${path}`;\n }\n\n public getEnvironment(): Environment {\n if (!this.environment) {\n throw new Error('Environment is not defined');\n }\n return this.environment;\n }\n /**\n * Retorna a URL da API.\n * @returns A URL da API.\n */\n apiUrl(): string {\n return this.apiUrlGetter()\n }\n\n private apiUrlGetter: () => string = () => {\n throw new Error('API URL getter not registered');\n }\n\n /**\n * Registra uma função que retorna a URL da API.\n * @param getter A função que retorna a URL da API.\n */\n public registerApiUrlGetter(getter: () => string): void {\n this.apiUrlGetter = getter;\n }\n}\n","import { Component, input, viewChild } from '@angular/core';\nimport { outputToObservable } from '@angular/core/rxjs-interop';\nimport { firstValueFrom } from 'rxjs';\n\nimport { NgIcon } from '@ng-icons/core';\nimport {\n ButtonVariants,\n HlmButtonImports,\n HlmAlertDialog,\n HlmAlertDialogImports,\n} from '@sapphire-caitlyn/schema-kit-ng/helm';\n\nexport interface AlertButton {\n id: string;\n label: string;\n variant?: ButtonVariants['variant'];\n handler?: () => void | Promise<void>;\n}\n\n@Component({\n imports: [\n HlmAlertDialogImports, HlmButtonImports, NgIcon\n ],\n selector: 'alert',\n styleUrl: './alert.component.scss',\n templateUrl: './alert.component.html',\n})\nexport class AlertComponent {\n constructor() {}\n\n icon = input<string>()\n\n description = input<string>()\n\n buttons = input<AlertButton[]>([])\n\n title = input<string>()\n\n size = input<'sm' | 'default'>('sm')\n\n private dialogRef = viewChild.required(HlmAlertDialog)\n\n /** Opens the alert and resolves with the id of the clicked button (undefined if dismissed). */\n public async present(): Promise<string | undefined> {\n const dialog = this.dialogRef();\n const closed = firstValueFrom(outputToObservable(dialog.closed), { defaultValue: undefined });\n dialog.open();\n return (await closed) as string | undefined;\n }\n\n async onClick(button: AlertButton) {\n await button.handler?.();\n this.dialogRef().close(button.id);\n }\n}\n","<hlm-alert-dialog>\n <hlm-alert-dialog-content *hlmAlertDialogPortal=\"let ctx\" [size]=\"size()\">\n <hlm-alert-dialog-header>\n @if(icon()){\n <hlm-alert-dialog-media\n class=\"bg-destructive/10 text-destructive dark:bg-destructive/20 dark:text-destructive\"\n >\n <ng-icon [name]=\"icon()!\"/>\n </hlm-alert-dialog-media>\n }\n <h2 hlmAlertDialogTitle>{{ title() }}</h2>\n <p hlmAlertDialogDescription>\n {{ description() }}\n </p>\n </hlm-alert-dialog-header>\n <hlm-alert-dialog-footer>\n @for (button of buttons(); track button.id) {\n <button hlmAlertDialogAction [variant]=\"button.variant ?? 'default'\" (click)=\"onClick(button)\">\n {{ button.label }}\n </button>\n }\n </hlm-alert-dialog-footer>\n </hlm-alert-dialog-content>\n</hlm-alert-dialog>\n","import { ApplicationRef, createComponent, EnvironmentInjector, inject, Service } from '@angular/core';\n\nimport { ButtonVariants } from '@sapphire-caitlyn/schema-kit-ng/helm';\n\nimport { AlertButton, AlertComponent } from '../components/alert/alert.component';\n\n@Service()\nexport class AlertService {\n constructor() {}\n\n private appRef = inject(ApplicationRef);\n private injector = inject(EnvironmentInjector);\n\n /** Shows the alert and resolves with the id of the clicked button (undefined if dismissed). */\n async present(options: {\n titulo: string;\n mensagem: string;\n icon?: string;\n size?: 'sm' | 'default';\n buttons: AlertButton[];\n }): Promise<string | undefined> {\n const host = document.createElement('div');\n document.body.appendChild(host);\n\n const alert = createComponent(AlertComponent, {\n environmentInjector: this.injector,\n hostElement: host,\n });\n alert.setInput('title', options.titulo);\n alert.setInput('description', options.mensagem);\n alert.setInput('buttons', options.buttons);\n if (options.icon) alert.setInput('icon', options.icon);\n if (options.size) alert.setInput('size', options.size);\n\n this.appRef.attachView(alert.hostView);\n alert.changeDetectorRef.detectChanges();\n\n try {\n return await alert.instance.present();\n } finally {\n this.appRef.detachView(alert.hostView);\n alert.destroy();\n host.remove();\n }\n }\n\n async alert(options: {\n icon?: string;\n titulo: string;\n mensagem: string;\n variant?: ButtonVariants['variant'];\n }): Promise<void> {\n await this.present({\n titulo: options.titulo,\n mensagem: options.mensagem,\n icon: options.icon,\n buttons: [{ id: 'ok', label: 'OK', variant: options.variant }],\n });\n }\n\n async confirm(options: {\n icon?: string;\n titulo: string;\n mensagem: string;\n confirmar?: string;\n cancelar?: string;\n variant?: ButtonVariants['variant'];\n }): Promise<boolean> {\n const result = await this.present({\n titulo: options.titulo,\n mensagem: options.mensagem,\n icon: options.icon,\n buttons: [\n { id: 'cancel', label: options.cancelar ?? 'Cancelar', variant: 'outline' },\n { id: 'confirm', label: options.confirmar ?? 'Confirmar', variant: options.variant },\n ],\n });\n return result === 'confirm';\n }\n}\n","import { inject, Injector } from '@angular/core';\nimport { HttpClient, HttpParams } from '@angular/common/http';\nimport { lastValueFrom } from 'rxjs';\n\nimport { EnvironmentService } from '../environment.service';\nimport { SchemaField } from '../../classes/schema-field/schema-field';\nimport { IIndexParams } from '../../interfaces/index-params';\nimport { IPaginatedResult } from '../../interfaces/paginated-result';\nimport { IView } from '../../interfaces/view';\nimport { SchemaBuilder, SchemaFieldOptionsRecord } from '../../classes/schema-field/schema-builder';\nimport type { IBreadcrumbItem } from '../../components/ui/breadcrumbs/breadcrumbs.component';\nimport { AlertService } from '../../services/alert.service';\n\nexport class SchemaService<\n T extends IView, \n IndexParams extends IIndexParams = IIndexParams, Environment = any, \n> {\n constructor(\n public options: SchemaServiceOptions<T>\n ) {\n this.environmentService = inject(EnvironmentService);\n this.fullRoute = this.environmentService.apiUrl() + this.options.endpoint;\n\n this.schema = this.options.schema;\n this.lstFields = SchemaBuilder.build(this.schema);\n if(this.options.listSchema) {\n this.lstFieldsList = SchemaBuilder.build(this.options.listSchema);\n } else {\n this.lstFieldsList = this.lstFields;\n }\n }\n\n public readonly schema: SchemaFieldOptionsRecord<T>;\n public readonly lstFields: SchemaField<T>[];\n public readonly lstFieldsList: SchemaField<T>[];\n \n public listBreadCrumbs(): IBreadcrumbItem[] {\n if(this.options.breadcrumbs) {\n return this.options.breadcrumbs;\n } else \n\n return [\n { label: this.options.title }\n ]\n }\n public viewBreadCrumbs(uuid: string): IBreadcrumbItem[] {\n if(this.options.breadcrumbs) {\n return this.options.breadcrumbs;\n } else\n\n return [\n { label: this.options.title, routerLink: this.options.endpoint },\n { label: uuid ? 'Edição' : 'Novo' }\n ]\n }\n\n protected fullRoute: string;\n protected environmentService: EnvironmentService<Environment>;\n protected httpClient: HttpClient = inject(HttpClient);\n\n public index(params?: IndexParams, method: 'get' | 'post' = 'get'): Promise<IPaginatedResult<T>> {\n if(method === 'get') {\n return lastValueFrom(this.httpClient.get<IPaginatedResult<T>>(this.fullRoute + '/index', {\n params: this.toHttpParams(params)\n }));\n }\n return lastValueFrom(this.httpClient.post<IPaginatedResult<T>>(this.fullRoute + '/index', params));\n }\n \n private toHttpParams(params?: IndexParams): HttpParams {\n let httpParams = new HttpParams();\n if (!params) return httpParams;\n\n for (const [key, value] of Object.entries(params)) {\n if (value == null || (Array.isArray(value) && !value.length)) {\n continue;\n }\n httpParams = httpParams.set(key, typeof value === 'string' ? value : JSON.stringify(value));\n }\n\n return httpParams;\n }\n\n public show(uuid: string){\n return lastValueFrom(this.httpClient.get<T>(this.fullRoute + `/${uuid}`));\n }\n public async save(values: T | Partial<T>): Promise<T> {\n if(values.uuid) {\n return this.patch(values.uuid, values);\n } else {\n return this.create(values as Omit<T, 'uuid'>);\n }\n }\n public async patch(uuid: string, values: Partial<T>): Promise<T> {\n const route = this.fullRoute + `/${uuid}`;\n return lastValueFrom(this.httpClient.patch<T>(route, this.toBody(values)));\n }\n public async create(values: Omit<T, 'uuid'>){\n const route = this.fullRoute;\n return lastValueFrom(this.httpClient.post<T>(route, this.toBody(values)));\n }\n\n /**\n * Converte os valores em `FormData` quando algum campo contém arquivo; caso contrário, retorna os valores para envio como JSON.\n * No `FormData`, um arquivo vai na chave do campo e uma lista de arquivos em `campo[]` (a API remonta o array);\n * os demais valores vão serializados em JSON, como num body JSON. Campos `undefined` são ignorados.\n */\n private toBody<V extends object>(values: V): V | FormData {\n const entries = Object.entries(values);\n if (!entries.some(([, value]) => this.toFiles(value)?.length)) {\n return values;\n }\n\n const formData = new FormData();\n for (const [key, value] of entries) {\n if (value === undefined) {\n continue;\n }\n const files = this.toFiles(value);\n if (!files) {\n formData.append(key, JSON.stringify(value));\n } else if (value instanceof Blob) {\n formData.append(key, value);\n } else {\n files.forEach((file) => formData.append(`${key}[]`, file));\n }\n }\n return formData;\n }\n\n /** Arquivos do valor (`Blob`/`File`, `FileList` ou array de `Blob`), ou `null` se o valor não for arquivo */\n private toFiles(value: unknown): Blob[] | null {\n if (value instanceof Blob) return [value];\n if (value instanceof FileList) return Array.from(value);\n if (Array.isArray(value) && value.length && value.every((item) => item instanceof Blob)) return value;\n return null;\n }\n public async delete(uuid: string): Promise<void> {\n return lastValueFrom(this.httpClient.delete<void>(this.fullRoute + `/${uuid}`));\n }\n\n private injector = inject(Injector);\n public createForm() {\n return SchemaBuilder.createForm<T>(this.injector, this.schema);\n }\n public defaultValues(): T {\n return SchemaBuilder.defaultValues<T>(this.lstFields);\n }\n\n\n\n public bindLabelFn(): (value: T) => string { \n if(typeof this.options.bindLabel === 'function') {\n return this.options.bindLabel as (value: T) => string;\n } else {\n const prop = this.options.bindLabel as keyof T;\n return (value: T) => value[prop] as unknown as string;\n }\n }\n\n public bindValueFn(): (value: T) => T[keyof T] {\n if(typeof this.options.bindValue === 'function') {\n return this.options.bindValue as (value: T) => T[keyof T];\n } else {\n const prop = this.options.bindValue as keyof T;\n return (value: T) => value[prop];\n }\n }\n\n private alertService = inject(AlertService);\n public async deleteAlert(item: T): Promise<boolean> {\n const message = `Deseja realmente excluir \"${this.bindLabelFn()(item)}\"?`;\n \n const result = await this.alertService.confirm({\n titulo: 'Confirmação',\n mensagem: message,\n confirmar: 'Sim',\n icon: 'lucideTrash2',\n variant: 'destructive',\n });\n if(!result) {\n return false;\n }\n\n await this.delete(item.uuid);\n return true;\n }\n}\n/**\n * Referência a um `SchemaService` de qualquer entidade (ex.: fonte de dados de um Select).\n * `createForm` é omitido porque `FieldTree<any>` do signal forms não aceita `FieldTree<T>` concreto.\n */\nexport type AnySchemaService = Omit<SchemaService<any, any>, 'createForm'>;\n\nexport interface SchemaServiceOptions<T> {\n /** Rota base para as requisições */\n endpoint: string;\n /** Título do schema */\n title: string;\n /** Descrição do schema */\n schema: SchemaFieldOptionsRecord<T>;\n /** Breadcrumbs do schema */\n breadcrumbs?: IBreadcrumbItem[]\n /** Função/propriedade para vincular o valor do campo */\n bindValue: ((value: T) => T[keyof T]) | keyof T;\n /** Função/propriedade para vincular o rótulo do campo */\n bindLabel: ((value: T) => string | T[keyof T]) | keyof T;\n\n listSchema?: SchemaFieldOptionsRecord<T>;\n}","import { CommonModule } from '@angular/common';\nimport { Component, computed, effect, input, InputSignal, model, ModelSignal, resource, ResourceRef, signal, Signal, TemplateRef, untracked, WritableSignal } from '@angular/core';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { FormValueControl } from '@angular/forms/signals';\nimport { Observable, lastValueFrom } from 'rxjs';\n\nimport {\n HlmFieldImports,\n HlmInputImports,\n HlmSelectImports,\n HlmSkeletonImports,\n HlmComboboxImports,\n HlmTooltipImports,\n HlmButtonImports,\n HlmSpinner,\n HlmSpinnerImports,\n} from '@sapphire-caitlyn/schema-kit-ng/helm';\nimport { NgIcon } from '@ng-icons/core';\n\nimport { IPaginatedResult } from '../../../interfaces/paginated-result';\nimport { InputBaseComponent } from '../input-base/input-base.component';\nimport { AnySchemaService, SchemaService } from '../../../services/web/schema.service';\nimport { LoadingInputComponent } from '../loading-input/loading-input.component';\nimport { ErrorMessageProviderComponent } from '../../error-message-provider/error-message-provider.component';\nimport { IIndexFilter } from '../../../interfaces/index-params';\n\ninterface ISelectInternalItem<T, V> {\n model: T;\n label: string | TemplateRef<any>;\n value: V;\n isTemplate: boolean;\n}\n\n@Component({\n imports: [\n HlmSelectImports,\n HlmInputImports,\n HlmFieldImports,\n HlmSkeletonImports,\n HlmComboboxImports,\n HlmTooltipImports,\n HlmButtonImports,\n FormsModule,\n ReactiveFormsModule,\n CommonModule,\n NgIcon,\n LoadingInputComponent,\n ErrorMessageProviderComponent,\n HlmSpinnerImports\n],\n selector: 'input-select',\n styleUrl: './input-select.component.scss',\n templateUrl: './input-select.component.html',\n})\nexport class InputSelectComponent<T, V> extends InputBaseComponent implements FormValueControl<V | null> {\n value: ModelSignal<V | null> = model<V | null>(null);\n\n _value: WritableSignal<ISelectInternalItem<T, V> | null> = signal<ISelectInternalItem<T, V> | null>(null)\n\n _items: InputSignal<readonly T[]> = input<readonly T[]>([], {\n alias: 'items'\n });\n\n _bindLabel: ModelSignal<TBindLabel<T> | null> = model<TBindLabel<T> | null>(null, {\n alias: 'bindLabel'\n });\n bindLabel: Signal<(v: T) => string | TemplateRef<any>> = computed(() => {\n if(this._bindLabel() && typeof this._bindLabel() === 'string') {\n const key = this._bindLabel()! as keyof T;\n return (v: T) => v[key] as string;\n } else \n if (this._bindLabel() && typeof this._bindLabel() === 'function') {\n return this._bindLabel() as (v: T) => string | TemplateRef<any>;\n } else\n if(!this._bindLabel()) {\n return this.schemaService()?.bindLabelFn() ?? (() => { throw new Error('bindLabel is not defined') });\n }\n throw new Error('bindLabel must be defined');\n })\n\n _bindValue: ModelSignal<TBindValue<T, V> | null> = model<TBindValue<T, V> | null>(null, {\n alias: 'bindValue'\n });\n bindValue: Signal<(v: T) => V> = computed(() => {\n if(this._bindValue() && typeof this._bindValue() === 'string') {\n const key = this._bindValue()! as keyof T;\n return (v: T) => v[key] as V;\n } else \n if (this._bindValue() && typeof this._bindValue() === 'function') {\n return this._bindValue() as (v: T) => V;\n } else \n if(!this._bindValue()) {\n return this.schemaService()?.bindValueFn() ?? (() => { throw new Error('bindValue is not defined') });\n }\n throw new Error('bindValue must be defined');\n });\n\n // lstItems: Signal<ISelectInternalItem<T, V>[]> = computed(() => {\n // return this.items().map(item => {\n // const label = this.bindLabel()(item);\n // const value = this.bindValue()(item);\n // return {\n // model: item,\n // label: label,\n // value: value,\n // isTemplate: label instanceof TemplateRef\n // }\n // });\n // })\n //Loads entity unrelated to the index, via query\n // Depende apenas de `value`: ler `items` aqui criaria um ciclo (items depende de preloaded)\n preloaded: ResourceRef<T | null> = resource({\n defaultValue: null,\n params: () => ({ value: this.value() }),\n loader: async ({ params }): Promise<T | null> => {\n const value = params.value;\n const isWithin = untracked(() => this.items.value()).some(item => item.value == value);\n if(isWithin) {\n return null;\n }\n const loadFrom = this.loadFrom();\n if(loadFrom instanceof SchemaService && value && typeof value === 'string') {\n const result = await loadFrom.show(String(value));\n return result;\n }\n return null;\n },\n });\n\n search: WritableSignal<string> = signal('');\n items: ResourceRef<ISelectInternalItem<T, V>[]> = resource({\n\t\tdefaultValue: [],\n\t\tparams: () => ({ search: this.search(), preloaded: this.preloaded.value() }),\n\t\tloader: async ({ params }) => {\n\t\t\tconst search = params.search;\n const items = (await this.searchItems(search)) \n if(params.preloaded) {\n const preloadedItem = params.preloaded;\n const preloadedValue = this.bindValue()(preloadedItem);\n if(!items.some(item => this.bindValue()(item) === preloadedValue)) {\n items.unshift(preloadedItem);\n }\n }\n\n\t\t\treturn items.map(item => {\n const label = this.bindLabel()(item);\n const value = this.bindValue()(item);\n return {\n model: item,\n label: label,\n value: value,\n isTemplate: label instanceof TemplateRef\n }\n });\n },\n\t});\n async searchItems(query: string): Promise<T[]> {\n const loadFrom = this.loadFrom();\n if(loadFrom === null) {\n // Cópia: o loader de `items` faz `unshift` do item pré-carregado\n return [...this._items()];\n }\n if(loadFrom instanceof Observable) {\n const result = await lastValueFrom(loadFrom);\n return result.data;\n }\n if(loadFrom instanceof Promise) {\n const result = await loadFrom;\n return result.data;\n }\n if(loadFrom instanceof SchemaService) {\n const result = await loadFrom.index({ \n lstFilter: this.lstFilter()?.filter(p => p.value !== undefined),\n page: this.page(), \n size: this.size(), \n search: query \n });\n return result.data;\n }\n throw new Error('loadFrom must be an Observable or a Promise');\n }\n\n\n schemaService: InputSignal<AnySchemaService | null> = input<AnySchemaService | null>(null);\n\n lstFilter: InputSignal<IIndexFilter<any, any>[] | null> = input<IIndexFilter<any, any>[] | null>(null);\n\n /** Item selecionado, resolvido a partir de `value` quando ele é alterado externamente (ex.: formulário) */\n selectedItem: Signal<ISelectInternalItem<T, V> | null> = computed(() => {\n const value = this.value();\n if(value === null || value === undefined) {\n return null;\n }\n const current = this._value();\n if(current && current.value === value) {\n return current;\n }\n return this.items.value().find(item => item.value === value) ?? null;\n });\n\n onSelect(item: ISelectInternalItem<T, V> | null) {\n this._value.set(item);\n this.value.set(item?.value ?? null);\n this.touch.emit();\n }\n\n // Os itens são recriados a cada busca, então a comparação é feita pelo value e não pela referência\n isItemEqualToValue = (item: ISelectInternalItem<T, V> | null | undefined, selected: ISelectInternalItem<T, V> | null | undefined): boolean => {\n return !!item && !!selected && item.value === selected.value;\n };\n\n itemToString = (item: ISelectInternalItem<T, V>): string => {\n return typeof item.label === 'string' ? item.label : String(item.value ?? '');\n };\n\n _loadFrom: InputSignal<LoadFrom<T> | null> = input<LoadFrom<T> | null>(null, {\n alias: 'loadFrom'\n });\n loadFrom: Signal<LoadFrom<T> | null> = computed(() => this._loadFrom() || this.schemaService());\n\n page: WritableSignal<number> = signal(1);\n size: WritableSignal<number> = signal(10);\n\n clearable: InputSignal<boolean> = input<boolean>(false)\n} \n\ntype LoadFrom<T> = \n Observable<IPaginatedResult<T>> |\n Promise<IPaginatedResult<T>> |\n AnySchemaService\n\nexport type TBindLabel<T> = keyof T | ((item: T) => string | TemplateRef<any>);\nexport type TBindValue<T, V> = keyof T | ((item: T) => V);\n","<div hlmField [forceInvalid]=\"touched() && invalid()\">\n @if(label()) {\n <label hlmFieldLabel [attr.for]=\"id()\">\n {{label()}}\n\n @if(tooltipInfo()){\n <ng-icon name=\"lucideCircleQuestionMark\" [hlmTooltip]=\"tooltipInfo()!\" position=\"top\"></ng-icon>\n }\n </label>\n }\n <div class=\"relative\">\n <hlm-combobox\n [disabled]=\"isReadonly()\"\n [id]=\"id()\"\n [(search)]=\"search\"\n [ngModel]=\"selectedItem()\"\n (ngModelChange)=\"onSelect($event)\"\n [isItemEqualToValue]=\"isItemEqualToValue\"\n [itemToString]=\"itemToString\"\n >\n <hlm-combobox-trigger [forceInvalid]=\"touched() && invalid()\" [showChevron]=\"false\" class=\"w-full justify-between font-normal truncate\">\n <hlm-combobox-value class=\"truncate\" [placeholder]=\"this.placeholder() || 'Selecione um item'\" />\n \n <ng-template hlmComboboxValueTemplate let-value>\n \n </ng-template>\n\n @if(selectedItem() && clearable() && !isReadonly()) {\n <button hlmBtn variant=\"ghost\" class=\"-mr-2\" size=\"icon-sm\" (click)=\"onSelect(null); $event.stopPropagation()\">\n <ng-icon name=\"lucideCircleX\" />\n </button>\n <!-- <ng-icon name=\"lucideCircleX\" (click)=\"onSelect(null)\"/> -->\n }\n @else {\n <ng-icon name=\"lucideChevronDown\"/>\n }\n </hlm-combobox-trigger>\n <hlm-combobox-content *hlmComboboxPortal>\n <hlm-combobox-input showTrigger=\"false\" placeholder=\"Pesquisar...\" [showClear]=\"true\" />\n <hlm-combobox-empty>Sem itens encontrados.</hlm-combobox-empty>\n @if(loading() || preloaded.isLoading()) {\n <hlm-spinner class=\"mx-auto my-2\" size=\"sm\"></hlm-spinner>\n }\n <div hlmComboboxList>\n @for (item of items.value(); track item.value) {\n <hlm-combobox-item [value]=\"item\" class=\"wrap-anywhere\">\n @if(item.isTemplate){\n <ng-container\n [ngTemplateOutlet]=\"$any(item.label)\"\n [ngTemplateOutletContext]=\"{ $implicit: item.model }\"\n ></ng-container>\n } @else {\n {{ item.label }}\n }\n </hlm-combobox-item>\n }\n </div>\n </hlm-combobox-content>\n </hlm-combobox>\n\n <loading-input [loading]=\"loading() || preloaded.isLoading()\"></loading-input>\n </div>\n\n <error-message-provider [errors]=\"errors()\" [invalid]=\"invalid()\" [touched]=\"touched()\"></error-message-provider>\n</div>\n","import { CommonModule } from '@angular/common';\nimport { Component, computed, input, model, Signal, signal, WritableSignal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { FormValueControl } from '@angular/forms/signals';\n\nimport {\n HlmFieldImports,\n HlmInputImports,\n HlmSkeletonImports,\n HlmTooltipImports,\n} from '@sapphire-caitlyn/schema-kit-ng/helm';\nimport { NgIcon } from '@ng-icons/core';\n\nimport { InputBaseComponent } from '../input-base/input-base.component';\nimport { LoadingInputComponent } from '../loading-input/loading-input.component';\nimport { ErrorMessageProviderComponent } from '../../error-message-provider/error-message-provider.component';\n\n@Component({\n imports: [\n HlmTooltipImports,\n NgIcon,\n HlmInputImports,\n HlmFieldImports,\n HlmSkeletonImports,\n FormsModule,\n CommonModule,\n LoadingInputComponent,\n ErrorMessageProviderComponent\n ],\n selector: 'input-string',\n styleUrl: './input-string.component.scss',\n templateUrl: './input-string.component.html',\n})\nexport class InputStringComponent extends InputBaseComponent implements FormValueControl<string | null | undefined> {\n value = model<string | null | undefined>(null);\n\n _type = input<HTMLInputElement['type'] | undefined>('text', {\n alias: 'type',\n });\n type: Signal<HTMLInputElement['type']> = computed(() => this._type() || 'text');\n}\n","<div hlmField [forceInvalid]=\"touched() && invalid()\">\n @if(label()) {\n <label hlmFieldLabel [attr.for]=\"id()\">\n {{label()}}\n\n @if(tooltipInfo()){\n <ng-icon name=\"lucideCircleQuestionMark\" [hlmTooltip]=\"tooltipInfo()!\" position=\"top\"></ng-icon>\n }\n </label>\n }\n <ng-content select=\"[slot=field]\"></ng-content>\n <div class=\"relative\">\n <input \n hlmInput \n [(ngModel)]=\"value\"\n [disabled]=\"isReadonly()\"\n [attr.id]=\"id()\" \n [attr.type]=\"type()\" \n [placeholder]=\"placeholder() || ''\"\n (blur)=\"touch.emit()\"\n [forceInvalid]=\"touched() && invalid()\"\n >\n <ng-content select=\"[slot=input]\"></ng-content>\n \n <loading-input [loading]=\"loading()\"></loading-input>\n </div>\n\n <error-message-provider [errors]=\"errors()\" [invalid]=\"invalid()\" [touched]=\"touched()\"></error-message-provider>\n</div>\n","import { CommonModule } from '@angular/common';\nimport { Component, computed, input, model, Signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { FormValueControl } from '@angular/forms/signals';\n\nimport {\n HlmFieldImports,\n HlmInputImports,\n HlmSkeletonImports,\n HlmTextareaImports,\n HlmTooltipImports,\n} from '@sapphire-caitlyn/schema-kit-ng/helm';\nimport { NgIcon } from '@ng-icons/core';\n\nimport { InputBaseComponent } from '../input-base/input-base.component';\nimport { LoadingInputComponent } from '../loading-input/loading-input.component';\nimport { ErrorMessageProviderComponent } from '../../error-message-provider/error-message-provider.component';\n\n@Component({\n imports: [\n HlmTooltipImports,\n NgIcon,\n HlmInputImports,\n HlmTextareaImports,\n HlmFieldImports,\n HlmSkeletonImports,\n FormsModule,\n CommonModule,\n LoadingInputComponent,\n ErrorMessageProviderComponent\n ],\n selector: 'input-text-area',\n styleUrl: './input-text-area.component.scss',\n templateUrl: './input-text-area.component.html',\n})\nexport class InputTextAreaComponent extends InputBaseComponent implements FormValueControl<string | null | undefined> {\n value = model<string | null | undefined>(null);\n\n _type = input<HTMLInputElement['type'] | undefined>('text', {\n alias: 'type',\n });\n type: Signal<HTMLInputElement['type']> = computed(() => this._type() || 'text');\n}\n\n","<div hlmField [forceInvalid]=\"touched() && invalid()\">\n @if(label()) {\n <label hlmFieldLabel [attr.for]=\"id()\">\n {{label()}}\n\n @if(tooltipInfo()){\n <ng-icon name=\"lucideCircleQuestionMark\" [hlmTooltip]=\"tooltipInfo()!\" position=\"top\"></ng-icon>\n }\n </label>\n }\n <div class=\"relative\">\n <textarea \n hlmTextarea \n [(ngModel)]=\"value\"\n [disabled]=\"isReadonly()\"\n [attr.id]=\"id()\" \n [attr.type]=\"type()\" \n [placeholder]=\"placeholder() || ''\"\n (blur)=\"touch.emit()\"\n [forceInvalid]=\"touched() && invalid()\"\n ></textarea>\n <ng-content select=\"[slot=input]\"></ng-content>\n \n <loading-input [loading]=\"loading()\"></loading-input>\n </div>\n\n <error-message-provider [errors]=\"errors()\" [invalid]=\"invalid()\" [touched]=\"touched()\"></error-message-provider>\n</div>\n","import { CommonModule } from '@angular/common';\nimport { Component, model } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { FormValueControl } from '@angular/forms/signals';\n\nimport { NgIcon } from '@ng-icons/core';\nimport {\n HlmFieldImports,\n HlmInputImports,\n HlmSkeletonImports,\n HlmTooltipImports,\n HlmCodeBlockImports,\n HlmButtonImports,\n} from '@sapphire-caitlyn/schema-kit-ng/helm';\n\nimport { ErrorMessageProviderComponent } from '../../../components/error-message-provider/error-message-provider.component';\nimport { LoadingInputComponent } from '../loading-input/loading-input.component';\nimport { InputBaseComponent } from '../input-base/input-base.component';\n\n@Component({\n imports: [\n HlmTooltipImports,\n NgIcon,\n HlmInputImports,\n HlmFieldImports,\n HlmSkeletonImports,\n HlmCodeBlockImports,\n FormsModule,\n CommonModule,\n LoadingInputComponent,\n ErrorMessageProviderComponent,\n HlmButtonImports\n],\n selector: 'input-json',\n styleUrl: './input-json.component.scss',\n templateUrl: './input-json.component.html',\n})\nexport class InputJsonComponent extends InputBaseComponent implements FormValueControl<string | null | undefined | object> {\n value = model<string | null | undefined | object>(null);\n\n mode = model<'edit' | 'view'>('view');\n\n formatJson() {\n try {\n const parsed = JSON.parse(String(this.value()) || '{}');\n this.value.set(JSON.stringify(parsed, null, 2));\n } catch (error) {\n console.error('Invalid JSON:', error);\n }\n }\n}\n","<div hlmField [forceInvalid]=\"touched() && invalid()\">\n @if(label()) {\n <label hlmFieldLabel [attr.for]=\"id()\">\n {{label()}}\n\n @if(tooltipInfo()){\n <ng-icon name=\"lucideCircleQuestionMark\" [hlmTooltip]=\"tooltipInfo()!\" position=\"top\"></ng-icon>\n }\n </label>\n }\n <ng-content select=\"[slot=field]\"></ng-content>\n <div class=\"relative\">\n <hlm-code-block class=\"size-full min-h-12 max-h-[50vh]\">\n <hlm-code-block-header>\n <hlm-code-block-title>{{ label() }}</hlm-code-block-title>\n <hlm-code-block-actions>\n <button hlmCodeBlockCopyButton [value]=\"value()?.toString() || 'null'\"></button>\n <button hlmBtn (click)=\"mode.set(mode() == 'edit' ? 'view' : 'edit')\" [variant]=\"'ghost'\" size=\"icon-sm\">\n <ng-icon name=\"lucidePencil\"></ng-icon>\n </button>\n <button hlmBtn (click)=\"formatJson()\" [variant]=\"'ghost'\" size=\"icon-sm\">\n <ng-icon name=\"lucideTextCursorInput\"></ng-icon>\n </button>\n </hlm-code-block-actions>\n </hlm-code-block-header>\n @if(mode() === 'edit') {\n <textarea\n hlmInput\n class=\"size-full bg-transparent! text-sm font-mono! mt-2 border-0 focus:ring-0 focus-visible:ring-0\"\n [id]=\"id()\"\n [placeholder]=\"placeholder() || ''\"\n [(ngModel)]=\"value\" \n ></textarea>\n } @else {\n <pre \n class=\"min-h-fit\"\n hlmCodeBlockContent \n lineNumbers\n wrap\n [code]=\"value()?.toString() || 'null'\"\n >\n </pre>\n }\n <!-- <pre \n class=\"min-h-fit\"\n hlmCodeBlockContent \n lineNumbers\n wrap\n [code]=\"value() || 'null'\"\n >\n </pre> -->\n </hlm-code-block>\n\n\n\n\n <ng-content select=\"[slot=input]\"></ng-content>\n \n <loading-input [loading]=\"loading()\"></loading-input>\n </div>\n\n <error-message-provider [errors]=\"errors()\" [invalid]=\"invalid()\" [touched]=\"touched()\"></error-message-provider>\n</div>\n","import { InputDateComponent } from './date/input-date/input-date.component';\nimport { InputDateSpanComponent } from './date/input-date-span/input-date-span.component';\nimport { InputDateTimeComponent } from './date/input-date-time/input-date-time.component';\nimport { InputDateTimeSpanComponent } from './date/input-date-time-span/input-date-time-span.component';\nimport { InputTimeComponent } from './date/input-time/input-time.component';\nimport { InputTimeSpanComponent } from './date/input-time-span/input-time-span.component';\nimport { InputBoolComponent } from './input-bool/input-bool.component';\nimport { InputColorComponent } from './input-color/input-color.component';\nimport { InputCpfCnpjComponent } from './input-cpf-cnpj/input-cpf-cnpj.component';\nimport { InputFileComponent } from './input-file/input-file.component';\nimport { InputIconComponent } from './input-icon/input-icon.component';\nimport { InputMaskComponent } from './input-mask/input-mask.component';\nimport { InputNumberComponent } from './input-number/input-number.component';\nimport { InputPhoneComponent } from './input-phone/input-phone.component';\nimport { InputSelectComponent } from './input-select/input-select.component';\nimport { InputStringComponent } from './input-string/input-string.component';\nimport { InputTextAreaComponent } from './input-text-area/input-text-area.component';\nimport { InputJsonComponent } from './input-json/input-json.component';\n\nexport * from './date/input-date/input-date.component';\nexport * from './date/input-date-span/input-date-span.component';\nexport * from './date/input-date-time/input-date-time.component';\nexport * from './date/input-date-time-span/input-date-time-span.component';\nexport * from './date/input-time/input-time.component';\nexport * from './date/input-time-span/input-time-span.component';\nexport * from './date/span';\nexport * from './input-bool/input-bool.component';\nexport * from './input-color/input-color.component';\nexport * from './input-cpf-cnpj/input-cpf-cnpj.component';\nexport * from './input-file/input-file.component';\nexport * from './input-icon/input-icon.component';\nexport * from './input-mask/input-mask.component';\nexport * from './input-number/input-number.component';\nexport * from './input-phone/input-phone.component';\nexport * from './input-select/input-select.component';\nexport * from './input-string/input-string.component';\nexport * from './input-text-area/input-text-area.component';\nexport * from './input-json/input-json.component';\n\nexport const InputImports = [\n InputDateComponent, \n InputDateSpanComponent,\n InputDateTimeComponent,\n InputDateTimeSpanComponent,\n InputTimeComponent,\n InputTimeSpanComponent,\n InputBoolComponent,\n InputColorComponent,\n InputCpfCnpjComponent,\n InputFileComponent,\n InputIconComponent,\n InputMaskComponent,\n InputNumberComponent,\n InputPhoneComponent,\n InputSelectComponent,\n InputStringComponent,\n InputTextAreaComponent,\n InputJsonComponent\n] as const;","import { Component, computed, input, InputSignal, model, ModelSignal, Signal } from '@angular/core';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { FormValueControl } from '@angular/forms/signals';\nimport { CommonModule } from '@angular/common';\nimport z from 'zod';\n\nimport { NgIcon } from '@ng-icons/core';\nimport {\n HlmButtonImports,\n HlmPopoverImports,\n HlmTooltipImports,\n HlmButtonGroupImports,\n} from '@sapphire-caitlyn/schema-kit-ng/helm';\n\nimport { FieldType } from '../../../classes/schema-field/field-type';\nimport { InputStringComponent } from '../../inputs/input-string/input-string.component';\nimport { setSpanEdge, Span } from '../../inputs/date/span';\nimport { SchemaFieldAnyTypeOptions } from '../../../classes/schema-field/schema-field';\nimport { AnySchemaService } from '../../../services/web/schema.service';\nimport { InputImports } from '../../inputs/input-index';\n\ntype TFilterValue<V> = V | null | undefined;\n\n@Component({\n imports: [\n HlmPopoverImports,\n HlmButtonImports,\n HlmButtonGroupImports,\n HlmTooltipImports,\n CommonModule,\n ReactiveFormsModule,\n FormsModule,\n InputStringComponent,\n InputImports,\n NgIcon,\n ],\n selector: 'schema-table-filter',\n styleUrl: './schema-table-filter.component.scss',\n templateUrl: './schema-table-filter.component.html',\n})\nexport class SchemaTableFilterComponent<V, T extends FieldType> implements FormValueControl<TFilterValue<V>> {\n value: ModelSignal<TFilterValue<V>> = model<TFilterValue<V>>(null);\n\n label: InputSignal<string> = input<string>('');\n\n type: InputSignal<T> = input<T>(FieldType.String as T);\n\n options: InputSignal<SchemaFieldAnyTypeOptions | null> = input<SchemaFieldAnyTypeOptions | null>(null);\n\n FieldType = FieldType;\n\n hasValue: Signal<boolean> = computed(() => hasFilterValue(this.value()));\n\n schemaService: Signal<AnySchemaService | null> = computed(() => this.options()?.service?.() ?? null);\n\n /** Value dos filtros de intervalo (Number/Decimal/Currency): `[min, max]`, igual aos filtros de data */\n range: Signal<Span<number> | null> = computed(() => {\n const value = this.value();\n return Array.isArray(value) ? value as Span<number> : null;\n });\n\n setRangeEdge(index: 0 | 1, edge: number | null): void {\n this.setValue(setSpanEdge(this.range(), index, edge) as TFilterValue<V>);\n }\n\n // The inner inputs emit null/'' when cleared, so those mean \"no filter\" here.\n setValue(value: TFilterValue<V>): void {\n const setValue: TFilterValue<V> = value === null || value === '' ? null : value;\n \n if(this.type() === FieldType.UUID && setValue){\n const parse = z.uuid().safeParse(setValue)\n if(parse.success) {\n this.value.set(setValue);\n }\n return;\n }\n\n this.value.set(setValue);\n }\n}\n\nexport function hasFilterValue(v: unknown): boolean {\n if (v === null || v === undefined) return false;\n if (typeof v === 'string') return v.trim() !== '';\n if (Array.isArray(v)) return v.length > 0; // multi-select filters\n return true;\n}\n","<hlm-popover sideOffset=\"5\" align=\"start\">\n\n <div hlmButtonGroup>\n <button hlmPopoverTrigger hlmBtn variant=\"outline\" size=\"sm\">\n <ng-icon name=\"lucideFunnel\" class=\"text-lg shrink-0\"></ng-icon>\n {{ label() }}\n </button>\n @if (hasValue()) {\n <button hlmBtn size=\"icon-sm\" variant=\"outline\" (click)=\"setValue(null)\" hlmTooltip=\"Limpar filtro\" position=\"top\">\n <ng-icon name=\"lucideSquareX\" class=\"text-lg shrink-0\"></ng-icon>\n </button>\n }\n </div>\n\n\n <hlm-popover-content *hlmPopoverPortal=\"let ctx\">\n <hlm-popover-header>\n <div hlmPopoverTitle>\n {{ label() }}\n </div>\n <p hlmPopoverDescription>\n Filtros de {{ label() }}.\n </p>\n\n @switch (type()) {\n @case (FieldType.UUID)\n @case (FieldType.TextArea)\n @case (FieldType.String) {\n <input-string\n [ngModel]=\"value()\" (ngModelChange)=\"setValue($event)\"\n [placeholder]=\"'Digite o valor do filtro'\"\n ></input-string>\n }\n @case (FieldType.Mask) {\n <input-mask\n [ngModel]=\"value()\" (ngModelChange)=\"setValue($event)\"\n [maskitoOptions]=\"options()?.maskitoOptions!\"\n [unmaskHandler]=\"options()?.unmaskHandler\"\n [placeholder]=\"'Digite o valor do filtro'\"\n ></input-mask>\n }\n @case (FieldType.Icon) {\n <input-icon\n [ngModel]=\"value()\" (ngModelChange)=\"setValue($event)\"\n [placeholder]=\"'Selecione o valor do filtro'\"\n ></input-icon>\n }\n @case (FieldType.Number) {\n <div class=\"grid grid-cols-2 gap-2\">\n <input-number\n label=\"Mínimo\"\n [ngModel]=\"range()?.[0] ?? null\" (ngModelChange)=\"setRangeEdge(0, $event)\"\n ></input-number>\n <input-number\n label=\"Máximo\"\n [ngModel]=\"range()?.[1] ?? null\" (ngModelChange)=\"setRangeEdge(1, $event)\"\n ></input-number>\n </div>\n }\n @case (FieldType.Decimal) {\n <div class=\"grid grid-cols-2 gap-2\">\n <input-decimal\n label=\"Mínimo\"\n [ngModel]=\"range()?.[0] ?? null\" (ngModelChange)=\"setRangeEdge(0, $event)\"\n ></input-decimal>\n <input-decimal\n label=\"Máximo\"\n [ngModel]=\"range()?.[1] ?? null\" (ngModelChange)=\"setRangeEdge(1, $event)\"\n ></input-decimal>\n </div>\n }\n @case (FieldType.Currency) {\n <div class=\"grid grid-cols-2 gap-2\">\n <input-currency\n label=\"Mínimo\"\n [ngModel]=\"range()?.[0] ?? null\" (ngModelChange)=\"setRangeEdge(0, $event)\"\n ></input-currency>\n <input-currency\n label=\"Máximo\"\n [ngModel]=\"range()?.[1] ?? null\" (ngModelChange)=\"setRangeEdge(1, $event)\"\n ></input-currency>\n </div>\n }\n @case (FieldType.Date) {\n <input-date-span\n [ngModel]=\"value()\" (ngModelChange)=\"setValue($event)\"\n ></input-date-span>\n }\n @case (FieldType.DateTime) {\n <input-date-time-span\n [ngModel]=\"value()\" (ngModelChange)=\"setValue($event)\"\n ></input-date-time-span>\n }\n @case (FieldType.Time) {\n <input-time-span\n [ngModel]=\"value()\" (ngModelChange)=\"setValue($event)\"\n ></input-time-span>\n }\n @case (FieldType.Bool) {\n <input-select\n bindLabel=\"label\"\n bindValue=\"value\"\n [items]=\"[ \n { label: 'Sim', value: true }, \n { label: 'Não', value: false } \n ]\"\n [ngModel]=\"value()\" (ngModelChange)=\"setValue($event)\"\n ></input-select>\n }\n @case (FieldType.Phone) {\n <input-phone\n [ngModel]=\"value()\" (ngModelChange)=\"setValue($event)\"\n [placeholder]=\"'Digite o valor do filtro'\"\n ></input-phone>\n }\n @case (FieldType.CpfCnpj) {\n <input-cpf-cnpj\n [ngModel]=\"value()\" (ngModelChange)=\"setValue($event)\"\n [placeholder]=\"'Digite o valor do filtro'\"\n ></input-cpf-cnpj>\n }\n @case (FieldType.Cpf) {\n <input-cpf\n [ngModel]=\"value()\" (ngModelChange)=\"setValue($event)\"\n [placeholder]=\"'Digite o valor do filtro'\"\n ></input-cpf>\n }\n @case (FieldType.Cnpj) {\n <input-cnpj\n [ngModel]=\"value()\" (ngModelChange)=\"setValue($event)\"\n [placeholder]=\"'Digite o valor do filtro'\"\n ></input-cnpj>\n }\n @case (FieldType.Select) {\n <input-select\n [ngModel]=\"value()\" (ngModelChange)=\"setValue($event)\"\n [schemaService]=\"schemaService()\"\n [lstFilter]=\"options()?.lstFilter ?? null\"\n [items]=\"options()?.lstOptions ?? []\"\n [bindValue]=\"options()?.bindValue ?? null\"\n [bindLabel]=\"options()?.bindLabel ?? null\"\n [placeholder]=\"'Selecione o valor do filtro'\"\n ></input-select>\n }\n }\n\n </hlm-popover-header>\n </hlm-popover-content>\n</hlm-popover>\n","import { InjectionToken, ModuleWithProviders, NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nimport { EnvironmentService } from './services/environment.service';\n\nexport const SCHEMA_KIT_OPTIONS = new InjectionToken<SchemaKitModuleOptions>('SCHEMA_KIT_OPTIONS');\nexport const SCHEMA_KIT_PERMISSAO_CHECKER = new InjectionToken<PerfilCheckerFn>('SCHEMA_KIT_PERMISSAO_CHECKER');\n\nexport type PerfilCheckerFn = (perfil: string | string[]) => boolean;\n\n@NgModule({\n declarations: [],\n imports: [CommonModule],\n})\nexport class SchemaKitModule {\n static forRoot<Environment = any>(\n options: SchemaKitModuleInputOptions<Environment>\n ): ModuleWithProviders<SchemaKitModule> {\n const _options: SchemaKitModuleOptions<Environment> = {\n apiUrlGetter: options.apiUrlGetter,\n paginationOptions: {\n rows: options.paginationOptions?.rows ?? 20,\n },\n };\n\n return {\n ngModule: SchemaKitModule,\n providers: [\n { provide: SCHEMA_KIT_OPTIONS, useValue: _options },\n {\n provide: EnvironmentService,\n useFactory: (opts: SchemaKitModuleOptions<Environment>) => {\n const service = new EnvironmentService<Environment>();\n service.registerApiUrlGetter(() => opts.apiUrlGetter(service.getEnvironment()));\n return service;\n },\n deps: [SCHEMA_KIT_OPTIONS],\n },\n {\n provide: SCHEMA_KIT_PERMISSAO_CHECKER,\n useFactory: options.perfilCheckerFactory ?? (() => () => {\n console.warn('No perfil checker provided. All permissao checks will return false.');\n false\n }),\n },\n ],\n };\n }\n}\nexport interface SchemaKitModuleInputOptions<Environment = any> {\n apiUrlGetter: (environment: Environment) => string;\n paginationOptions?: {\n /**\n * Number of rows to display per page.\n * @group Props\n */\n rows: number;\n }\n /**\n * Factory that returns the perfil checker. Runs in an injection context, so `inject()` is allowed.\n */\n perfilCheckerFactory?: () => PerfilCheckerFn;\n}\nexport interface SchemaKitModuleOptions<Environment = any> extends Required<Omit<SchemaKitModuleInputOptions<Environment>, 'perfilCheckerFactory'>> {\n}\n","import { inject, Pipe, PipeTransform } from '@angular/core';\n\nimport { SCHEMA_KIT_PERMISSAO_CHECKER } from '../schema-kit.module';\n\n@Pipe({\n name: 'hasPermissao',\n // Impuro: o checker lê signals (lista de permissões), que um pipe puro não reavaliaria\n pure: false,\n})\nexport class HasPermissaoPipe<PermissaoPath extends string> implements PipeTransform {\n private permissaoChecker = inject(SCHEMA_KIT_PERMISSAO_CHECKER);\n\n transform(permissao: PermissaoPath | PermissaoPath[] | null | undefined): boolean {\n return permissao == null || this.permissaoChecker(permissao);\n }\n}\n","export enum SortOrder {\n ASC = 'ASC',\n DESC = 'DESC',\n}\n\nexport interface IIndexParamsSort<T> {\n field: keyof T;\n order: SortOrder;\n}\n\nexport interface IIndexParams<T = any> {\n page?: number;\n size?: number;\n sort?: IIndexParamsSort<T>[];\n \n query?: string;\n lstUuids?: string[];\n lstFilter?: IIndexFilter<T, any>[];\n}\n\nexport interface IIndexFilter<T, V> {\n index: keyof T;\n value: V\n}","import { Directive, inject, input, TemplateRef } from '@angular/core';\n\n@Directive({\n selector: 'ng-template[schemaTableActions]',\n})\nexport class SchemaTableActionsDirective<T = any> {\n template = inject<TemplateRef<{ $implicit: T }>>(TemplateRef);\n\n position = input<'start' | 'end'>('end');\n\n static ngTemplateContextGuard<T>(\n _dir: SchemaTableActionsDirective<T>,\n _ctx: unknown,\n ): _ctx is { $implicit: T } {\n return true;\n }\n}\n","import { Directive, inject, input, TemplateRef } from '@angular/core';\n\nimport type { ITemplateContext } from './schema-table.component';\n\n/** Substitui a célula da coluna `schemaTableReplacementFor` pelo template */\n@Directive({\n selector: 'ng-template[schemaTableReplacementFor]',\n})\nexport class SchemaTableReplacementForDirective<T = any, V = any> {\n template = inject<TemplateRef<ITemplateContext<T, V>>>(TemplateRef);\n\n /** Index do campo cuja célula será substituída */\n index = input.required<keyof T>({ alias: 'schemaTableReplacementFor' });\n\n static ngTemplateContextGuard<T, V>(\n _dir: SchemaTableReplacementForDirective<T, V>,\n _ctx: unknown,\n ): _ctx is ITemplateContext<T, V> {\n return true;\n }\n}\n","import { Component, input, InputSignal } from '@angular/core';\nimport { RouterModule } from '@angular/router';\n\nimport { NgIcon } from '@ng-icons/core';\nimport { HlmBreadcrumbImports } from '@sapphire-caitlyn/schema-kit-ng/helm';\n\n@Component({\n imports: [\n HlmBreadcrumbImports,\n RouterModule,\n NgIcon\n ],\n selector: 'breadcrumbs',\n styleUrl: './breadcrumbs.component.scss',\n templateUrl: './breadcrumbs.component.html',\n})\nexport class BreadcrumbsComponent {\n items: InputSignal<IBreadcrumbItem[]> = input<IBreadcrumbItem[]>([])\n}\n\nexport interface IBreadcrumbItem {\n routerLink?: string;\n label: string;\n icon?: string;\n}\n","<nav hlmBreadcrumb>\n <ol hlmBreadcrumbList>\n @for (item of items(); track $index; let last = $last) {\n <li hlmBreadcrumbItem>\n @if (!last && item.routerLink) {\n <a hlmBreadcrumbLink [routerLink]=\"item.routerLink\">\n <ng-icon [name]=\"item.icon\"></ng-icon>\n {{ item.label }}\n </a>\n } @else {\n <span hlmBreadcrumbPage>{{ item.label }}</span>\n }\n </li>\n @if (!last) {\n <li hlmBreadcrumbSeparator></li>\n }\n }\n </ol>\n</nav>","import { Directive, inject, input, TemplateRef } from '@angular/core';\n\n@Directive({\n selector: 'ng-template[schemaTableToolbar]',\n})\nexport class SchemaTableToolbarDirective<T = any> {\n template = inject<TemplateRef<{ $implicit: T }>>(TemplateRef);\n\n position = input<'start' | 'end'>('end');\n\n static ngTemplateContextGuard<T>(\n _dir: SchemaTableToolbarDirective<T>,\n _ctx: unknown,\n ): _ctx is { $implicit: T } {\n return true;\n }\n}\n","import {\n Component,\n computed,\n contentChildren,\n effect,\n inject,\n input,\n InputSignal,\n linkedSignal,\n model,\n ModelSignal,\n output,\n reflectComponentType,\n resource,\n signal,\n Signal,\n TemplateRef,\n Type,\n untracked,\n viewChild,\n WritableSignal,\n} from '@angular/core';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { ActivatedRoute, Router, RouterLink } from '@angular/router';\nimport { applyEach, debounce, form, FormField } from '@angular/forms/signals';\nimport { NgScrollbarModule } from 'ngx-scrollbar';\nimport { maskitoTransform } from '@maskito/core';\nimport { maskitoStringifyNumber } from '@maskito/kit';\nimport { DateTime } from 'luxon';\n\nimport { NgIcon } from '@ng-icons/core';\nimport {\n HlmNumberedPagination,\n HlmInputImports,\n HlmBreadcrumbImports,\n HlmCardImports,\n HlmTableImports,\n HlmButtonImports,\n HlmSpinnerImports,\n HlmScrollAreaImports,\n HlmSkeletonImports,\n HlmPopoverImports,\n HlmTooltipImports,\n HlmInputGroupImports,\n HlmCodeBlockImports,\n HlmButtonGroupImports,\n HlmDialogImports,\n HlmSwitchImports,\n} from '@sapphire-caitlyn/schema-kit-ng/helm';\nimport { provideBrnTooltipGroup, BrnTooltip } from '@spartan-ng/brain/tooltip';\nimport { toast } from '@spartan-ng/brain/sonner';\n\nimport { IView } from '../../interfaces/view';\nimport { IPaginatedResult } from '../../interfaces/paginated-result';\nimport { maskitoOptionsCNPJ, maskitoOptionsCPF, maskitoOptionsCPFOrCNPJ } from '../inputs/input-cpf-cnpj/input-cpf-cnpj.component';\nimport { Span } from '../inputs/date/span';\nimport { maskitoOptionsPhone } from '../inputs/input-phone/input-phone.component';\nimport { LoadingComponent } from '../ui/loading/loading.component';\nimport { fileItemsFromValue, FilePreviewComponent } from '../ui/file-preview/file-preview.component';\nimport { hasFilterValue, SchemaTableFilterComponent } from './schema-table-filter/schema-table-filter.component';\nimport { HasPermissaoPipe } from '../../pipes/has-permissao.pipe';\nimport { IIndexFilter, IIndexParams, SortOrder } from '../../interfaces/index-params';\nimport { SchemaField } from '../../classes/schema-field/schema-field';\nimport { SchemaService } from '../../services/web/schema.service';\nimport { SCHEMA_KIT_OPTIONS, SchemaKitModuleOptions } from '../../schema-kit.module';\nimport { SchemaTableActionsDirective } from './schema-table-actions.directive';\nimport { SchemaTableReplacementForDirective } from './schema-table-replacement-for.directive';\nimport { IBreadcrumbItem, BreadcrumbsComponent } from '../ui/breadcrumbs/breadcrumbs.component';\nimport { FieldType } from '../../classes/schema-field/field-type';\nimport { SchemaTableToolbarDirective } from '../../components/schema-table/schema-table-toolbar.directive';\n\n@Component({\n selector: 'schema-table',\n imports: [\n FormsModule,\n ReactiveFormsModule,\n CommonModule,\n RouterLink,\n FormField,\n NgScrollbarModule,\n NgIcon,\n HlmNumberedPagination,\n HlmInputImports,\n HlmBreadcrumbImports,\n HlmCardImports,\n HlmDialogImports,\n HlmPopoverImports,\n HlmTableImports,\n HlmButtonImports,\n HlmSpinnerImports,\n HlmScrollAreaImports,\n HlmSkeletonImports,\n HlmPopoverImports,\n HlmTooltipImports,\n BrnTooltip,\n HlmInputGroupImports,\n HlmCodeBlockImports,\n HlmButtonGroupImports,\n HlmSwitchImports,\n LoadingComponent,\n FilePreviewComponent,\n SchemaTableFilterComponent,\n HasPermissaoPipe,\n SchemaTableActionsDirective,\n BreadcrumbsComponent,\n // IfHasPermissaoDirective,\n ],\n providers: [provideBrnTooltipGroup()],\n templateUrl: './schema-table.component.html',\n styleUrl: './schema-table.component.scss',\n})\nexport class SchemaTableComponent<\n T extends IView,\n IP extends IIndexParams = IIndexParams,\n Permissao extends string = string\n> {\n options: SchemaKitModuleOptions = inject(SCHEMA_KIT_OPTIONS);\n\n noQuery = input<boolean>(false);\n\n schemaService: InputSignal<SchemaService<T, IP>> = input.required();\n templateBool: Signal<TemplateRef<ITemplateContext<T, boolean>> | undefined> = viewChild('templateBool');\n templateIcon: Signal<TemplateRef<ITemplateContext<T, string>> | undefined> = viewChild('templateIcon');\n templateJSON: Signal<TemplateRef<ITemplateContext<T, unknown>> | undefined> = viewChild('templateJSON');\n templateFile: Signal<TemplateRef<ITemplateContext<T, string | string[] | null>> | undefined> = viewChild('templateFile');\n\n\n lstReplacements = contentChildren(SchemaTableReplacementForDirective);\n\n lstField: Signal<SchemaField<T>[]> = computed(() => {\n const templateBool = this.templateBool();\n const replacements = this.lstReplacements();\n\n return this.schemaService().lstFieldsList.map((f) => {\n const newF = { ...f };\n\n // O template informado no uso da tabela tem prioridade sobre o do schema e o padrão do tipo\n let templateReplacement: TableCellTemplate<T> | null | undefined =\n replacements.find((r) => r.index() === newF.index)?.template;\n\n if(!templateReplacement && !newF.listOptions?.template) {\n switch(newF.type) {\n case FieldType.Bool:\n templateReplacement = templateBool;\n break;\n case FieldType.Cnpj:\n templateReplacement = (obj: T) => {\n const v = obj[newF.index] as unknown as string;\n return maskitoTransform(v, maskitoOptionsCNPJ);\n };\n break;\n case FieldType.Cpf:\n templateReplacement = (obj: T) => {\n const v = obj[newF.index] as unknown as string;\n return v ? maskitoTransform(v, maskitoOptionsCPF) : '';\n };\n break;\n case FieldType.CpfCnpj:\n templateReplacement = (obj: T) => {\n const v = obj[newF.index] as unknown as string;\n return v ? maskitoTransform(v, maskitoOptionsCPFOrCNPJ) : '';\n };\n break;\n case FieldType.Phone:\n templateReplacement = (obj: T) => {\n const v = obj[newF.index] as unknown as string;\n return maskitoTransform(v, maskitoOptionsPhone);\n };\n break;\n case FieldType.Mask: {\n const maskitoOptions = newF.options?.maskitoOptions;\n if(maskitoOptions) {\n templateReplacement = (obj: T) => {\n const v = obj[newF.index] as unknown as string;\n return v ? maskitoTransform(v, maskitoOptions) : '';\n };\n }\n break;\n }\n case FieldType.Number:\n case FieldType.Decimal:\n case FieldType.Currency:\n templateReplacement = (obj: T) => formatNumber(obj[newF.index], newF.type);\n break;\n case FieldType.Icon:\n templateReplacement = this.templateIcon();\n break;\n case FieldType.Date:\n templateReplacement = (obj: T) => {\n const v = obj[newF.index] as unknown as string;\n return v ? DateTime.fromISO(v).toFormat('dd/MM/yyyy') : '';\n }\n break;\n case FieldType.DateTime:\n templateReplacement = (obj: T) => {\n const v = obj[newF.index] as unknown as string;\n return v ? DateTime.fromISO(v).toFormat('dd/MM/yyyy HH:mm:ss') : '';\n }\n break;\n case FieldType.Time:\n templateReplacement = (obj: T) => {\n const v = obj[newF.index] as unknown as string;\n return v ? DateTime.fromISO(v).toFormat('HH:mm:ss') : '';\n }\n break;\n case FieldType.DateSpan:\n templateReplacement = (obj: T) => formatSpan(obj[newF.index] as unknown as Span, 'dd/MM/yyyy');\n break;\n case FieldType.DateTimeSpan:\n templateReplacement = (obj: T) => formatSpan(obj[newF.index] as unknown as Span, 'dd/MM/yyyy HH:mm:ss');\n break;\n case FieldType.TimeSpan:\n templateReplacement = (obj: T) => formatSpan(obj[newF.index] as unknown as Span, 'HH:mm:ss');\n break;\n case FieldType.JSON:\n templateReplacement = this.templateJSON();\n break;\n case FieldType.File:\n templateReplacement = this.templateFile();\n break;\n default:\n break;\n }\n }\n\n if (templateReplacement) {\n newF.listOptions = {\n ...newF.listOptions,\n template: templateReplacement,\n };\n }\n\n return newF;\n });\n });\n\n lstFieldSort: Signal<Partial<Record<keyof T, SortOrder | undefined>>> = computed(() => {\n const sort = this.sort();\n const sortMap: Partial<Record<keyof T, SortOrder | undefined>> = {};\n if (sort) {\n for (const s of sort) {\n sortMap[s.field] = s.order;\n }\n }\n return sortMap;\n });\n\n SortOrder = SortOrder;\n fileItemsFromValue = fileItemsFromValue;\n\n lstBreadCrumbs: Signal<IBreadcrumbItem[]> = computed(() => this.schemaService().listBreadCrumbs());\n\n \n lstActions = contentChildren(SchemaTableActionsDirective);\n actionsStart = computed(() => this.lstActions().filter((a) => a.position() === 'start'));\n actionsEnd = computed(() => this.lstActions().filter((a) => a.position() === 'end'));\n\n lstToolbarContent = contentChildren(SchemaTableToolbarDirective);\n toolbarStart = computed(() => this.lstToolbarContent().filter((a) => a.position() === 'start'));\n toolbarEnd = computed(() => this.lstToolbarContent().filter((a) => a.position() === 'end'));\n\n /** Valores de cada item da tabela calculados em signal (memoizado) */\n // rows: Signal<TableRow<T>[]> = computed(() => {\n // const fields = this.lstField();\n\n // return this.lstItems().map((item) => {\n // const cells = {} as Record<keyof T, TableCell<T>>;\n\n // for (const field of fields) {\n // cells[field.index] = this.toCell(item, field);\n // }\n\n // return { item, cells };\n // });\n // });\n\n // /** Resolve o template de um campo para uma célula tipada */\n\n rows = resource({\n params: () => ({ \n items: this.lstItems(), \n fields: this.lstField() \n }),\n loader: async ({ params }) => {\n const { items, fields } = params;\n\n //Carrega os items de select\n const lstField = fields.filter((f) => f.options?.service && f.type === FieldType.Select);\n\n const lstRequests = lstField.map(async (f) => {\n const localItems = items.map((item) => item[f.index]).filter((v) => v !== null && v !== undefined);\n const service = f.options!.service!();\n if(!localItems.length || !service) {\n return {\n valid: false,\n endpoint: service?.options.endpoint,\n }\n }\n \n return {\n valid: true,\n endpoint: service?.options.endpoint,\n request: await service?.index({ \n lstUuids: localItems,\n page: 1,\n size: localItems.length\n }, 'post')\n }\n })\n \n const lstResponses = await Promise.all(lstRequests);\n const responseMap: Record<string, IPaginatedResult<unknown>> = lstResponses.reduce((acc, response) => {\n if (!response.valid || !response.endpoint || !response.request) {\n return acc;\n }\n return {\n ...acc,\n [response.endpoint]: response.request\n }\n }, {})\n\n return this.lstItems().map((item) => {\n const cells = {} as Record<keyof T, TableCell<T>>;\n\n for (const field of fields) {\n const service = field.options?.service?.();\n let endpoint = service?.options.endpoint;\n if(endpoint && responseMap[endpoint]) {\n let response = responseMap[endpoint];\n cells[field.index] = this.toCell(item, field, {\n response,\n bindLabelFn: service?.bindLabelFn(),\n bindValueFn: service?.bindValueFn()\n });\n continue;\n }\n cells[field.index] = this.toCell(item, field);\n }\n\n return { item, cells };\n });\n }\n })\n private toCell(item: T, field: SchemaField<T>, fromService?: {\n response?: IPaginatedResult<any>,\n bindLabelFn?: (value: any) => string,\n bindValueFn?: (value: any) => any\n }): TableCell<T> {\n const template = field.listOptions?.template as TableCellTemplate<T> | undefined;\n\n if(fromService?.response && fromService?.bindLabelFn && fromService?.bindValueFn && !template) {\n const { response, bindValueFn, bindLabelFn } = fromService;\n const rawValue = item[field.index];\n const match = response.data?.find((p) => bindValueFn(p) == rawValue);\n\n // Falls back to the raw value when the related record wasn't returned by the service\n return { text: match ? bindLabelFn(match) : rawValue };\n }\n\n if (!template) {\n return { text: item[field.index] || '-' };\n }\n\n if (template instanceof TemplateRef) {\n return { template };\n }\n\n // Component classes are also `typeof 'function'`, so check them before calling\n if (reflectComponentType(template as Type<unknown>)) {\n return { component: template as Type<unknown> };\n }\n\n\n return { text: (template as (item: T) => string)(item) };\n }\n\n\n page: ModelSignal<number> = model(1);\n limit: ModelSignal<number> = model(this.options.paginationOptions.rows);\n // Keeps the last known total while a new page is loading, so pagination doesn't reset.\n total: Signal<number> = linkedSignal<number | undefined, number>({\n source: () => (this.itemsResource.hasValue() ? this.itemsResource.value().total : undefined),\n computation: (count, previous) => count ?? previous?.value ?? 0,\n });\n\n sort: ModelSignal<IIndexParams<T>['sort']> = model<IIndexParams<T>['sort']>([]);\n\n onSort(field: keyof T): void {\n const currentSort = this.sort()!;\n const newSort = currentSort.filter((s) => s.field !== field);\n const currentFieldSort = currentSort.find((s) => s.field === field);\n const order =\n !currentFieldSort ? SortOrder.ASC :\n currentFieldSort.order === SortOrder.ASC ? SortOrder.DESC : null;\n if (order) {\n newSort.push({\n field,\n order,\n });\n }\n // If order is null, the sort for this field is removed (nothing pushed).\n this.sort.set(newSort);\n }\n\n private emptyFilters(): Record<keyof T, IIndexFilter<T, unknown>> {\n // Reads the raw schema fields (not lstField) so filter state isn't reset when templateBool resolves.\n return this.schemaService().lstFieldsList.reduce((acc, f) => {\n acc[f.index] = {\n index: f.index,\n value: '',\n };\n return acc;\n }, {} as Record<keyof T, IIndexFilter<T, unknown>>);\n }\n\n filterModels: WritableSignal<Record<string, IIndexFilter<T, any>>> =\n linkedSignal(() => this.emptyFilters());\n\n lstFilterForms = form(this.filterModels, (path) => {\n applyEach(path, (filter) => debounce(filter.value, 400));\n });\n\n searchModel: WritableSignal<{ query: string }> = signal({ query: '' });\n\n searchForm = form(this.searchModel, (path) => {\n debounce(path.query, 400);\n });\n\n lstPresetFilters: InputSignal<NonNullable<IP['lstFilter']>> = input<NonNullable<IP['lstFilter']>>([]);\n lstActiveFilters = computed(() =>\n [\n ...Object.values(this.filterModels()),\n ...this.lstPresetFilters(),\n ].filter((f) => hasFilterValue(f.value)),\n );\n\n constructor() {\n //Reseta os filtros quando o schemaService muda (ex: troca de módulo)\n let previousService: SchemaService<T, IP> | undefined;\n effect(() => {\n const service = this.schemaService();\n if (previousService && previousService !== service) {\n untracked(() => this.reset());\n }\n previousService = service;\n });\n }\n\n private indexParams: Signal<IIndexParams & IP> = computed(() => ({\n lstFilter: this.lstActiveFilters(),\n query: this.searchModel().query.trim() || undefined,\n page: this.page(),\n size: this.limit(),\n sort: this.sort(),\n }) as IIndexParams & IP);\n\n itemsResource = resource({\n params: () => ({ service: this.schemaService(), query: this.indexParams() }),\n loader: ({ params }) => params.service.index(params.query),\n });\n\n lstItems: Signal<T[]> = computed(() =>\n this.itemsResource.hasValue() ? this.itemsResource.value().data : [],\n );\n\n loading: Signal<boolean> = this.itemsResource.isLoading;\n error: Signal<Error | undefined> = this.itemsResource.error;\n\n refresh(): void {\n this.itemsResource.reload();\n }\n\n FieldType = FieldType;\n\n async patch<K extends keyof T>(item: T, value: T[K], index: K): Promise<void> {\n const uuid = item.uuid;\n\n this.setLoading(uuid, index, true);\n try {\n const patchValue: Partial<T> = {};\n patchValue[index] = value;\n\n await this.schemaService().patch(uuid, patchValue);\n toast.success('Dados salvos com sucesso');\n } catch (error) {\n toast.error('Erro ao salvar os dados');\n this.refresh();\n } finally {\n this.setLoading(uuid, index, false);\n }\n }\n\n loadingMap = signal<Record<string, Partial<Record<keyof T, boolean>>>>({});\n\n private setLoading(uuid: string, index: keyof T, value: boolean): void {\n this.loadingMap.update((map) => ({\n ...map,\n [uuid]: { ...map[uuid], [index]: value },\n }));\n }\n\n reset(): void {\n this.page.set(1);\n this.limit.set(this.options.paginationOptions.rows);\n this.sort.set([]);\n this.filterModels.set(this.emptyFilters());\n this.searchModel.set({ query: '' });\n }\n\n protected async deleteAlert(item: T) {\n const result = await this.schemaService().deleteAlert(item);\n if(result){\n this.refresh()\n }\n }\n\n router: Router = inject(Router);\n activatedRoute: ActivatedRoute = inject(ActivatedRoute);\n noNew: InputSignal<boolean> = input<boolean>(false);\n _novo = output<Event>({\n alias: 'novo',\n });\n novo(){\n const event = new Event('novo', { cancelable: true });\n this._novo.emit(event);\n if(event.defaultPrevented) {\n return;\n }\n this.router.navigate(['./view'], { relativeTo: this.activatedRoute });\n }\n edit(item: T){\n this.router.navigate(['./view', item.uuid], { relativeTo: this.activatedRoute });\n }\n\n deletePermissao = input<Permissao | null>(null)\n editPermissao = input<Permissao | null>(null)\n}\n\n/** Formata um intervalo [início, fim]; a ponta vazia (intervalo aberto) aparece como `…` */\nfunction formatSpan(span: Span | null | undefined, format: string): string {\n if (!span || (span[0] == null && span[1] == null)) {\n return '';\n }\n return span.map((v) => (v ? DateTime.fromISO(v).toFormat(format) : '…')).join(' - ');\n}\n\n/** Formata números com os mesmos padrões do input-number (Number, Decimal, Currency) */\nfunction formatNumber(value: unknown, type: FieldType): string {\n if (value == null || value === '') {\n return '';\n }\n const fractionDigits = type === FieldType.Number ? 0 : 2;\n return maskitoStringifyNumber(Number(value), {\n minimumFractionDigits: fractionDigits,\n maximumFractionDigits: fractionDigits,\n prefix: type === FieldType.Currency ? 'R$ ' : '',\n decimalSeparator: ',',\n thousandSeparator: '.',\n });\n}\n\n/** Context passed to a column's ng-template */\nexport interface ITemplateContext<T, V> {\n $implicit: T;\n value: V;\n index: keyof T;\n label: string;\n loading: boolean;\n readonly: boolean;\n}\n/** What a column's `listOptions.template` may hold */\nexport type TableCellTemplate<T> =\n | ((item: T) => string)\n | TemplateRef<ITemplateContext<T, unknown>>\n | Type<unknown>;\n\n/** A resolved cell, discriminated by `kind` so templates can narrow `value` */\n/** A resolved cell: exactly one of these is set */\nexport interface TableCell<T> {\n text?: T[keyof T] | string;\n template?: TemplateRef<ITemplateContext<T, unknown>>;\n component?: Type<unknown>;\n}\n\nexport interface TableRow<T> {\n item: T;\n cells: Record<keyof T, TableCell<T>>;\n}","<div class=\"size-full flex flex-col gap-2\">\n <div class=\"flex flex-col gap-3 flex-1 min-h-0\">\n <breadcrumbs [items]=\"lstBreadCrumbs()\"></breadcrumbs>\n \n <hlm-card class=\"flex-1 flex flex-col min-h-0 py-0\">\n <div hlmCardContent class=\"flex flex-col flex-1 min-h-0 px-0\">\n <div class=\"p-2 w-full flex flex-wrap md:flex-nowrap md:h-12 gap-2 items-center\">\n <!-- <input hlmInput placeholder=\"Pesquisar...\"/> -->\n \n @if(!noQuery()){\n <div hlmInputGroup class=\"flex-1 min-w-0 md:flex-none md:min-w-32 md:max-w-1/3\">\n <div hlmInputGroupAddon align=\"inline-start\">\n <ng-icon name=\"lucideSearch\" />\n </div>\n <input hlmInputGroupInput placeholder=\"Pesquisar...\" [formField]=\"searchForm.query\" />\n </div>\n }\n \n <ng-scrollbar class=\"order-last basis-full min-w-0 md:order-0 md:basis-auto md:flex-1\" hlm appearance=\"compact\">\n <div class=\"flex w-max space-x-2 h-full items-center\" scrollViewport>\n @for (item of lstField(); track item.index) {\n @if(!item.hiddenList){\n <schema-table-filter\n [label]=\"item.label\"\n [formField]=\"$any(lstFilterForms[$any(item.index)].value)\"\n [options]=\"item.options || null\"\n [type]=\"item.type\"\n ></schema-table-filter>\n }\n }\n </div>\n </ng-scrollbar>\n @for (toolbar of toolbarStart(); track $index) {\n <ng-container\n (click)=\"$event.stopPropagation()\"\n [ngTemplateOutlet]=\"toolbar.template\"\n />\n }\n @if(!noNew()){\n <button hlmBtn size=\"icon-sm\" variant=\"outline\" class=\"shrink-0\" (click)=\"novo()\" hlmTooltip=\"Novo\" position=\"top\">\n <ng-icon name=\"lucideCirclePlus\" class=\"text-lg shrink-0\"></ng-icon>\n </button>\n }\n <button hlmBtn size=\"icon-sm\" variant=\"outline\" class=\"shrink-0\" (click)=\"reset()\" hlmTooltip=\"Resetar filtros\" position=\"top\">\n <ng-icon name=\"lucideSquareX\" class=\"text-lg shrink-0\"></ng-icon>\n </button>\n <button hlmBtn size=\"icon-sm\" class=\"shrink-0\" (click)=\"refresh()\" hlmTooltip=\"Atualizar dados\" position=\"top\">\n <ng-icon name=\"lucideRefreshCcw\" class=\"text-lg shrink-0\"></ng-icon>\n </button>\n @for (toolbar of toolbarEnd(); track $index) {\n <ng-container\n (click)=\"$event.stopPropagation()\"\n [ngTemplateOutlet]=\"toolbar.template\"\n />\n }\n </div>\n\n <div class=\"flex-1 min-h-0 relative overflow-hidden\">\n <div\n [ngClass]=\"loading() ? 'opacity-100 translate-y-0' : 'opacity-0 -translate-y-10 pointer-events-none'\"\n class=\"absolute mask-y-from-10% z-10 left-0 top-0 w-full h-full flex items-center justify-center bg-white/10 transition-all duration-300 ease-in-out\">\n <hlm-spinner class=\"text-2xl\"/>\n </div>\n \n @if(!loading() && !lstItems().length){\n <div class=\"absolute left-0 top-0 size-full flex items-center justify-center\">\n <span>\n Nenhum dado encontrado.\n </span>\n </div>\n <!-- <tr hlmTableRow>\n <td hlmTableCell [attr.colspan]=\"lstField().length + actionsStart().length + actionsEnd().length\" class=\"text-center py-6 text-muted-foreground\">\n </td>\n </tr> -->\n }\n\n <div hlmTableContainer class=\"h-full overflow-auto rounded-t-2xl portrait:hidden\">\n <table hlmTable>\n @let hasPermissaoEdit = editPermissao() | hasPermissao;\n @let hasPermissaoDelete = deletePermissao() | hasPermissao;\n\n <thead hlmTableHeader class=\"sticky top-0 z-1 backdrop-blur-2xl\">\n <tr hlmTableRow>\n @if (actionsStart().length) {\n <th hlmTableHead></th>\n }\n @for (item of lstField(); track $index) {\n @if (!item.hiddenList) {\n <th hlmTableHead>\n <div class=\"flex justify-start items-center size-full gap-2\">\n @let sort = lstFieldSort()[item.index];\n \n <button hlmBtn size=\"sm\" variant=\"ghost\" class=\"capitalize\" (click)=\"onSort(item.index)\">\n {{ item.label }}\n <ng-icon [ngClass]=\"{\n 'opacity-0!': !sort,\n 'first-path:text-brand-primary': sort === 'ASC',\n 'second-path:text-brand-primary': sort === 'DESC',\n }\" class=\"first-path:opacity-100 second-path:opacity-100 child-path:transition-all\" name=\"lucideArrowUpDown\"/>\n </button>\n \n @if(item.tooltipInfo){\n <ng-icon name=\"lucideCircleQuestionMark\" [hlmTooltip]=\"item.tooltipInfo\" position=\"top\"></ng-icon>\n }\n </div>\n </th>\n }\n }\n @if (actionsEnd().length || hasPermissaoEdit || hasPermissaoDelete) {\n <th hlmTableHead>\n Ações\n </th>\n }\n </tr>\n </thead>\n <tbody hlmTableBody class=\"relative\">\n <!-- #region Loading -->\n @if(loading()){\n @for (item of [1,2,3,4,5,6,7,8,9,10,1,2,3,4,5,6,7,8,9,10]; track $index) {\n <tr hlmTableRow class=\"animate-in slide-in-from-top-10\">\n @for (item of lstField(); track $index; let rowIndex = $index) {\n <td hlmTableCell class=\"py-3\">\n <hlm-skeleton class=\"h-3 w-25 rounded-full\" />\n </td>\n }\n </tr>\n }\n }\n <!-- #endregion Loading -->\n @else if(error()){\n <tr hlmTableRow>\n <td hlmTableCell [attr.colspan]=\"lstField().length + actionsStart().length + actionsEnd().length\" class=\"text-center py-6 text-destructive\">\n Erro ao carregar os dados.\n <button hlmBtn variant=\"link\" size=\"sm\" (click)=\"refresh()\">Tentar novamente</button>\n </td>\n </tr>\n } \n @else if(!loading() && lstItems().length){ \n @for (row of rows.value(); track row.item.uuid) {\n <tr hlmTableRow class=\"animate-in slide-in-from-top-10 cursor-pointer\" (click)=\"hasPermissaoEdit && edit(row.item)\">\n\n @if (actionsStart().length) {\n <td hlmTableCell>\n <div class=\"flex gap-1 justify-end items-center h-fit\">\n @for (action of actionsStart(); track $index) {\n <div class=\"contents\" (click)=\"$event.stopPropagation()\">\n <ng-container\n [ngTemplateOutlet]=\"action.template\"\n [ngTemplateOutletContext]=\"{ $implicit: row.item }\"\n />\n </div>\n }\n </div>\n </td>\n }\n\n @for (field of lstField(); track field.index) {\n @if (!field.hiddenList) {\n <td hlmTableCell class=\"relative\">\n @let loading = loadingMap()[row.item.uuid]?.[field.index] || false;\n <loading [active]=\"loading\" />\n\n @let cell = row.cells[field.index];\n @if (cell.template; as template) {\n <div class=\"contents\" (click)=\"$event.stopPropagation()\">\n <ng-container\n [ngTemplateOutlet]=\"template\"\n [ngTemplateOutletContext]=\"{\n $implicit: row.item,\n value: row.item[field.index],\n index: field.index,\n label: field.label,\n loading: loading,\n readonly: field.readonly\n }\"\n />\n </div>\n } @else if (cell.component; as component) {\n <div class=\"contents\" (click)=\"$event.stopPropagation()\">\n <ng-container [ngComponentOutlet]=\"component\" />\n </div>\n } @else {\n <span class=\"p-2\" (click)=\"$event.stopPropagation()\">{{ cell.text }}</span>\n }\n </td>\n }\n }\n\n @if (actionsEnd().length || hasPermissaoEdit || hasPermissaoDelete) {\n <td hlmTableCell>\n <div class=\"flex gap-1 justify-end items-center h-fit\">\n @if(hasPermissaoEdit) {\n <div class=\"contents\" (click)=\"$event.stopPropagation()\">\n <ng-container\n [ngTemplateOutlet]=\"templateView\"\n [ngTemplateOutletContext]=\"{ $implicit: row.item.uuid }\"\n />\n </div>\n }\n\n @for (action of actionsEnd(); track $index) {\n <div (click)=\"$event.stopPropagation()\">\n <ng-container\n [ngTemplateOutlet]=\"action.template\"\n [ngTemplateOutletContext]=\"{ $implicit: row.item }\"\n />\n </div>\n }\n\n @if(hasPermissaoDelete) {\n <div class=\"contents\" (click)=\"$event.stopPropagation()\">\n <ng-container\n [ngTemplateOutlet]=\"templateDelete\"\n [ngTemplateOutletContext]=\"{ $implicit: row.item }\"\n />\n </div>\n }\n </div>\n </td>\n }\n </tr>\n }\n }\n </tbody>\n </table>\n </div>\n\n <div class=\"flex flex-col p-2 gap-2 mask-y-from-98% no-scrollbar overflow-y-auto size-full\">\n @if(!loading()){\n @for (row of rows.value(); track row.item.uuid) {\n <div hlmCard class=\"animate-in slide-in-from-top-10 cursor-pointer shrink-0 p-2 flex flex-col gap-1.5\" (click)=\"hasPermissaoEdit && edit(row.item)\">\n @if (actionsStart().length) {\n <td hlmTableCell>\n <div class=\"flex gap-1 justify-end items-center h-fit\">\n @for (action of actionsStart(); track $index) {\n <div class=\"contents\" (click)=\"$event.stopPropagation()\">\n <ng-container\n [ngTemplateOutlet]=\"action.template\"\n [ngTemplateOutletContext]=\"{ $implicit: row.item }\"\n />\n </div>\n }\n </div>\n </td>\n }\n \n @for (field of lstField(); track field.index) {\n @if (!field.hiddenList) {\n <div class=\"relative\">\n @let loading = loadingMap()[row.item.uuid]?.[field.index] || false;\n <loading [active]=\"loading\" />\n \n <span class=\"text-sm text-muted-foreground\"> {{field.label}} </span> <br>\n\n @let cell = row.cells[field.index];\n @if (cell.template; as template) {\n <div class=\"contents\" (click)=\"$event.stopPropagation()\">\n <ng-container\n [ngTemplateOutlet]=\"template\"\n [ngTemplateOutletContext]=\"{\n $implicit: row.item,\n value: row.item[field.index],\n index: field.index,\n label: field.label,\n loading: loading,\n readonly: field.readonly\n }\"\n />\n </div>\n } @else if (cell.component; as component) {\n <div class=\"contents\" (click)=\"$event.stopPropagation()\">\n <ng-container [ngComponentOutlet]=\"component\" />\n </div>\n } @else {\n <span (click)=\"$event.stopPropagation()\">{{ cell.text }}</span>\n }\n </div>\n }\n }\n \n @if (actionsEnd().length || hasPermissaoDelete) {\n <td hlmTableCell>\n <div class=\"flex gap-1 justify-end items-center h-fit\" (click)=\"$event.stopPropagation()\">\n @for (action of actionsEnd(); track $index) {\n <ng-container\n (click)=\"$event.stopPropagation()\"\n [ngTemplateOutlet]=\"action.template\"\n [ngTemplateOutletContext]=\"{ $implicit: row.item }\"\n />\n }\n\n @if(hasPermissaoDelete) {\n <ng-container \n (click)=\"$event.stopPropagation()\"\n [ngTemplateOutlet]=\"templateDelete\" \n [ngTemplateOutletContext]=\"{ $implicit: row.item }\" \n />\n }\n </div>\n </td>\n }\n </div>\n }\n }\n </div>\n\n </div>\n\n <hlm-numbered-pagination \n [(currentPage)]=\"page\" \n [(itemsPerPage)]=\"limit\"\n [totalItems]=\"total()\" \n />\n </div>\n </hlm-card>\n </div>\n</div>\n\n<ng-template #templateBool let-item let-value=\"value\" let-index=\"index\" let-loading=\"loading\" let-readonly=\"readonly\">\n <div (click)=\"$event.stopPropagation()\">\n <hlm-switch \n [checked]=\"value\" \n (checkedChange)=\"patch(item, $event, index)\" \n class=\"mr-2\"\n [disabled]=\"loading || readonly\" \n />\n </div>\n</ng-template>\n\n<ng-template #templateView let-uuid>\n <button hlmBtn variant=\"ghost\" size=\"icon-sm\" [routerLink]=\"'./view/' + uuid\">\n <ng-icon name=\"lucideChevronRight\"></ng-icon>\n </button>\n</ng-template>\n\n<ng-template #templateDelete [schemaTableActions] let-item>\n <button class=\"portrait:hidden\" hlmBtn variant=\"destructive\" size=\"icon-sm\" (click)=\"$event.stopPropagation(); deleteAlert(item)\">\n <ng-icon name=\"lucideTrash2\"></ng-icon>\n </button>\n <button class=\"landscape:hidden\" hlmBtn variant=\"destructive\" size=\"sm\" (click)=\"$event.stopPropagation(); deleteAlert(item)\">\n <ng-icon name=\"lucideTrash2\"></ng-icon>\n <span> Excluir </span>\n </button>\n</ng-template>\n\n<ng-template #templateIcon let-item let-value=\"value\" let-index=\"index\" let-loading=\"loading\">\n <ng-icon [name]=\"value\" class=\"text-2xl\"/>\n</ng-template>\n\n<ng-template #templateFile let-item let-value=\"value\" let-index=\"index\" let-loading=\"loading\">\n @let lstFile = fileItemsFromValue(value);\n @if (lstFile.length) {\n <div class=\"flex flex-col gap-1\" (click)=\"$event.stopPropagation()\">\n @for (file of lstFile; track file.url) {\n <div class=\"flex items-center gap-1 min-w-0\">\n <file-preview [item]=\"file\" />\n <span class=\"truncate max-w-48\">{{ file.name }}</span>\n </div>\n }\n </div>\n } @else {\n <span>-</span>\n }\n</ng-template>\n\n<ng-template #templateJSON let-item let-value=\"value\" let-label=\"label\" let-index=\"index\" let-loading=\"loading\">\n <hlm-dialog>\n \n <button class=\"portrait:hidden\" hlmBtn hlmDialogTrigger size=\"icon-sm\" variant=\"outline\" (click)=\"$event.stopPropagation()\">\n <ng-icon name=\"lucideCode\"></ng-icon>\n </button>\n\n <button class=\"landscape:hidden w-full\" hlmBtn hlmDialogTrigger size=\"sm\" variant=\"outline\" (click)=\"$event.stopPropagation()\">\n <ng-icon name=\"lucideCode\"></ng-icon>\n <span> {{label}} - JSON </span>\n </button>\n\n <hlm-dialog-content *hlmDialogPortal=\"let ctx\" class=\"flex max-h-[80vh] min-w-[50vw] flex-col\">\n <hlm-dialog-header>\n <h3 hlmDialogTitle>{{label}}</h3>\n </hlm-dialog-header>\n <hlm-code-block class=\"min-h-8\">\n <hlm-code-block-header>\n <!-- <hlm-code-block-title>Title goes here</hlm-code-block-title> -->\n <hlm-code-block-actions>\n <button hlmCodeBlockCopyButton [value]=\"value | json\"></button>\n </hlm-code-block-actions>\n </hlm-code-block-header>\n <pre \n class=\"min-h-fit\"\n hlmCodeBlockContent \n lineNumbers\n wrap\n [code]=\"value | json\"\n >\n </pre>\n </hlm-code-block>\n <hlm-dialog-footer>\n <button hlmBtn variant=\"outline\" hlmDialogClose>\n <ng-icon name=\"lucideCircleX\" class=\"text-lg shrink-0\"></ng-icon>\n Fechar\n </button>\n </hlm-dialog-footer>\n </hlm-dialog-content>\n </hlm-dialog>\n\n</ng-template>","import { Directive, inject, input, TemplateRef } from '@angular/core';\n\n@Directive({\n selector: 'ng-template[schemaViewContent]',\n})\nexport class SchemaViewContentDirective<T = any> {\n template = inject<TemplateRef<{ $implicit: T }>>(TemplateRef);\n\n position = input<'start' | 'end'>('end');\n\n static ngTemplateContextGuard<T>(\n _dir: SchemaViewContentDirective<T>,\n _ctx: unknown,\n ): _ctx is { $implicit: T } {\n return true;\n }\n}\n","import { Component, input, output } from '@angular/core';\n\nimport { NgIcon } from '@ng-icons/core';\nimport { HlmButtonImports } from '@sapphire-caitlyn/schema-kit-ng/helm';\n\n@Component({\n imports: [\n HlmButtonImports,\n NgIcon\n ],\n selector: 'save-button',\n styleUrl: './save-button.component.scss',\n templateUrl: './save-button.component.html',\n})\nexport class SaveButtonComponent {\n saving = input<boolean>(false);\n disabled = input<boolean>(false);\n\n save = output<void>();\n}\n","<button class=\"relative\" hlmBtn [variant]=\"saving() ? 'ghost' : 'default'\" size=\"sm\" [disabled]=\"disabled()\" (click)=\"!disabled() && !saving() && save.emit()\">\n @if(saving()) {\n <span class=\"absolute inset-0 rounded-[inherit] border-shimmer pointer-events-none\"></span>\n\n <ng-icon name=\"lucideRefreshCw\" class=\"text-lg shrink-0 animate-spin\"></ng-icon>\n Salvando...\n } @else {\n <ng-icon name=\"lucideSave\" class=\"text-lg shrink-0\"></ng-icon>\n Salvar\n }\n</button>","import { Component, computed, contentChildren, effect, inject, Injector, input, InputSignal, linkedSignal, OnInit, output, signal, Signal, untracked, WritableSignal } from '@angular/core';\nimport { FieldState, FieldTree, FormField } from '@angular/forms/signals';\nimport { ActivatedRoute, Router, RouterModule } from '@angular/router';\nimport { extractValue } from '@angular/forms/signals/compat';\nimport { CommonModule } from '@angular/common';\nimport { toSignal } from '@angular/core/rxjs-interop';\n\nimport { NgIcon } from '@ng-icons/core';\nimport {\n HlmProgressImports,\n HlmSkeletonImports,\n HlmButtonImports,\n HlmFieldImports,\n HlmInputImports,\n HlmCardImports,\n HlmCodeBlockImports,\n} from '@sapphire-caitlyn/schema-kit-ng/helm';\nimport { toast } from '@spartan-ng/brain/sonner';\n\nimport { BreadcrumbsComponent, IBreadcrumbItem } from '../ui/breadcrumbs/breadcrumbs.component';\nimport { FieldType } from '../../classes/schema-field/field-type';\nimport { IView } from '../../interfaces/view';\nimport { IIndexParams } from '../../interfaces/index-params';\nimport { SchemaField } from '../../classes/schema-field/schema-field';\nimport { SchemaService } from '../../services/web/schema.service';\nimport { SCHEMA_KIT_OPTIONS, SchemaKitModuleOptions } from '../../schema-kit.module';\nimport { SchemaViewContentDirective } from '../../components/schema-view/schema-view-content.directive';\nimport { SchemaBuilder, SchemaFieldOptionsRecord } from '../../classes/schema-field/schema-builder';\nimport { SaveButtonComponent } from '../ui/save-button/save-button.component';\nimport { InputImports } from '../inputs/input-index';\n\n@Component({\n imports: [\n HlmFieldImports,\n HlmInputImports,\n HlmButtonImports,\n HlmProgressImports,\n HlmSkeletonImports,\n HlmCardImports,\n HlmCodeBlockImports,\n FormField,\n CommonModule,\n NgIcon,\n RouterModule,\n BreadcrumbsComponent,\n SaveButtonComponent,\n ...InputImports\n ],\n selector: 'schema-view',\n styleUrl: './schema-view.component.scss',\n templateUrl: './schema-view.component.html',\n})\nexport class SchemaViewComponent <\n T extends IView,\n IP extends IIndexParams,\n R = T,\n> implements OnInit {\n\n /** Opções do módulo */\n options: SchemaKitModuleOptions = inject(SCHEMA_KIT_OPTIONS);\n\n /** Indica se o botão de voltar deve ser ocultado */\n noBack: InputSignal<boolean> = input<boolean>(false);\n\n /** Indica se o botão de novo deve ser ocultado */\n noNew: InputSignal<boolean> = input<boolean>(false);\n\n /** Indica se o botão de salvar deve ser ocultado */\n noSave: InputSignal<boolean> = input<boolean>(false);\n\n /** Serviço de schema */\n schemaService: InputSignal<SchemaService<T, IP> | null> = input<SchemaService<T, IP> | null>(null);\n\n /** Lista de itens do breadcrumb customizados */\n _lstBreadCrumbs: InputSignal<IBreadcrumbItem[]> = input<IBreadcrumbItem[]>([], {\n alias: 'lstBreadCrumbs',\n });\n lstBreadCrumbs: Signal<IBreadcrumbItem[]> = computed(() => {\n if(this._lstBreadCrumbs().length) {\n return this._lstBreadCrumbs();\n }\n if(this.schemaService()) {\n return this.schemaService()!.viewBreadCrumbs(this.uuid());\n }\n return [];\n });\n\n activatedRoute: ActivatedRoute = inject(ActivatedRoute);\n private params = toSignal(this.activatedRoute.params, { initialValue: \n this.activatedRoute.snapshot.params \n });\n\n /** Identificador do parâmetro da rota que contém o uuid */\n uuidIdentifier: InputSignal<string> = input<string>('uuid');\n private routeUuid: Signal<string> = computed(() => this.params()[this.uuidIdentifier()] || '');\n\n /** uuid informado de fora (ex.: dialog de edição). Tem prioridade sobre o parâmetro da rota */\n _uuid: InputSignal<string | null | undefined> = input<string | null | undefined>(undefined, {\n alias: 'uuid',\n });\n /**\n * uuid do registro em edição; vazio é criação. Vem do input `uuid` ou da rota e pode ser trocado por código\n * (ex.: depois de criar sem redirect): o registro é carregado sem navegar\n */\n uuid: WritableSignal<string> = linkedSignal(() => this._uuid() || this.routeUuid());\n\n\n\n\n /** Schema customizado para criação do formulário */\n _schema: InputSignal<SchemaFieldOptionsRecord<T> | null> = input<SchemaFieldOptionsRecord<T> | null>(null, {\n alias: 'schema',\n });\n\n injector: Injector = inject(Injector);\n\n /** Schema da tela (inputs e form): o input `schema`, se informado, ou o do service */\n private effectiveSchema: Signal<SchemaFieldOptionsRecord<T>> = computed(() =>\n this._schema() ?? this.schemaService()?.schema ?? {}\n );\n\n lstFields: Signal<SchemaField<T>[]> = computed(() => SchemaBuilder.build(this.effectiveSchema()));\n\n defaultFormValues: Signal<T> = computed(() => SchemaBuilder.defaultValues<T>(this.lstFields()));\n\n ngOnInit(): void {\n // Recarrega sempre que o uuid muda (rota, input `uuid` ou `uuid.set()`) ou o form é recriado\n let previousUuid = '';\n effect(() => {\n const form = this.form();\n const uuid = this.uuid();\n untracked(() => {\n if (uuid) {\n this.load(uuid);\n }\n else if (previousUuid) {\n // Saiu da edição sem trocar de rota (ex.: Novo): volta para os valores iniciais\n (form() as FieldState<T>).reset(this.defaultFormValues());\n }\n previousUuid = uuid;\n });\n }, { injector: this.injector });\n }\n\n lstContent = contentChildren(SchemaViewContentDirective);\n contentStart = computed(() => this.lstContent().filter((a) => a.position() === 'start'));\n contentEnd = computed(() => this.lstContent().filter((a) => a.position() === 'end'));\n\n\n /**\n * O form (signal forms), criado a partir do mesmo schema dos inputs (`effectiveSchema`).\n * Recriado quando o schema ou o `schemaService` muda\n */\n form: Signal<FieldTree<T>> = linkedSignal<\n { service: SchemaService<T, IP> | null; schema: SchemaFieldOptionsRecord<T> },\n FieldTree<T>\n >({\n source: () => ({ service: this.schemaService(), schema: this.effectiveSchema() }),\n // untracked: criar o form não pode virar dependência, senão ele seria recriado a cada valor digitado\n computation: (source, previous) => untracked(() => {\n // Injector do componente: o que o form registra acaba junto com a tela, não com o service\n const form = SchemaBuilder.createForm<T>(this.injector, source.schema);\n\n // Mesmo service, só o `schema` mudou: mantém o que o usuário alterou nos campos que continuam.\n // Os intocados ficam com o valor inicial do schema novo (ex.: um `defaultValue` que mudou)\n if (previous && previous.source.service === source.service) {\n type TFieldMap = Record<string, (() => FieldState<unknown>) | undefined>;\n const previousForm = previous.value() as unknown as TFieldMap;\n const nextForm = form as unknown as TFieldMap;\n for (const key of Object.keys(source.schema)) {\n const previousField = previousForm[key]?.();\n const nextField = nextForm[key]?.();\n if (previousField?.dirty() && nextField) {\n nextField.value.set(previousField.value());\n nextField.markAsDirty();\n }\n }\n }\n return form;\n }),\n });\n\n loading: WritableSignal<boolean> = signal(false);\n async load(uuid: string = this.uuid()){\n const service = this.schemaService();\n // Sem service não há como buscar o registro (ex.: só `schema` + `saveFn`)\n if(!uuid || !service) {\n return;\n }\n this.loading.set(true);\n try{\n const data: T = await service.show(uuid);\n // Trocou de registro enquanto carregava: o load mais novo é quem preenche\n if(uuid !== this.uuid()) {\n return;\n }\n // reset: troca o valor e limpa dirty/touched, então o próximo PATCH só leva o que mudar daqui pra frente\n (this.form()() as FieldState<T>).reset(data);\n }catch(error){\n if(uuid === this.uuid()) {\n toast.error('Erro ao carregar os dados');\n }\n }\n this.loading.set(false);\n }\n\n /** Executado antes de salvar os dados (pode ser síncrono ou assíncrono) */\n protected onWillSave<D extends Partial<T> | undefined>(data: D): D | Promise<D> {\n return data;\n }\n\n /** Executado após salvar os dados */\n protected async onDidSave(){\n }\n\n\n saving: WritableSignal<boolean> = signal(false);\n\n /** Função para salvar os dados (Utilizado para customizar o comportamento de salvamento) */\n saveFn = input<((values: Partial<T>) => Promise<R>) | null>(null);\n \n /** Redireciona para a visualização do registro após a criação (Caso false cancela o redirecionamento) */\n redirectOnCreate: InputSignal<string | false> = input<string | false>('../view');\n\n\n \n async save(){\n // Lido uma vez: se o form for recriado durante o salvamento, o salvamento continua no mesmo\n const form = this.form();\n if(form().valid()) {\n this.loading.set(true);\n if(!this.saveFn() && !this.schemaService()){\n throw new Error('Nenhum serviço de schema foi fornecido para salvar os dados');\n }\n \n type TSaveResponse = {\n saved: boolean;\n data?: R;\n }\n const save = async (): Promise<TSaveResponse> => {\n let response: R | null = null;\n let saved = false;\n const uuid = this.uuid();\n if(uuid){\n //Patch\n let dirtyValues = extractValue(form, {\n dirty: true,\n }) as Partial<T> | undefined;\n dirtyValues = await this.onWillSave(dirtyValues);\n\n if(!dirtyValues) {\n toast.info('Nenhum dado foi alterado');\n this.loading.set(false);\n return { \n saved: false\n };\n }\n this.saving.set(true);\n \n if(this.saveFn()){\n response = await this.saveFn()!(dirtyValues);\n } else if (this.schemaService()){\n response = await this.schemaService()!.patch(uuid, dirtyValues) as unknown as R;\n }\n saved = true;\n } else {\n this.saving.set(true);\n //Create\n let allValues = extractValue(form) as T;\n allValues = await this.onWillSave(allValues);\n\n if(this.saveFn()){\n response = await this.saveFn()!(allValues);\n } else if (this.schemaService()){\n response = await this.schemaService()!.create(allValues) as unknown as R;\n }\n saved = true;\n\n const createdUuid = (response as Partial<IView> | null)?.uuid;\n if(this.redirectOnCreate() && createdUuid) {\n try{\n this.router.navigate([this.redirectOnCreate(), createdUuid], {\n relativeTo: this.activatedRoute,\n replaceUrl: true\n });\n }catch(error){\n console.error('Erro ao redirecionar após salvar', error);\n }\n }else if(createdUuid) {\n // Fica na tela e vira edição do registro criado (o effect do uuid recarrega os dados).\n // O reset limpa o dirty da criação, para o próximo PATCH não reenviar tudo\n form().reset();\n this.uuid.set(createdUuid);\n } else {\n // Criou, mas sem uuid não há registro para editar: volta para um form de criação limpo\n (form() as FieldState<T>).reset(this.defaultFormValues());\n }\n\n }\n return { saved, data: response ?? undefined };\n }\n\n try{\n const { saved, data } = await save();\n // `saved` diz se salvou; `data` pode vir vazio mesmo salvando (ex.: resposta 204)\n if(saved) {\n this._onDidSave.emit(data as R);\n toast.success('Dados salvos com sucesso');\n }\n }catch(error){\n toast.error('Erro ao salvar os dados');\n }\n this.saving.set(false);\n this.loading.set(false);\n }else {\n // get controls with errors\n form().markAsTouched();\n\n const invalidKeys = new Set(\n form().errorSummary().map((error) => error.fieldTree().keyInParent())\n );\n\n const invalidLabels = this.lstFields()\n .filter((field) => invalidKeys.has(field.index as string | number))\n .map((field) => field.label);\n\n toast.error('Formulário inválido', {\n description: invalidLabels.length\n ? `Verifique os campos: ${invalidLabels.join(', ')}`\n : undefined,\n });\n }\n\n await this.onDidSave();\n }\n\n /** Evento disparado após salvar os dados */\n _onDidSave = output<R>({\n alias: 'onDidSave',\n });\n\n FieldType = FieldType\n \n router: Router = inject(Router);\n\n /** Evento disparado quando o usuário clica no botão de novo */\n _novo = output<Event>({\n alias: 'novo',\n });\n\n /** Função executada quando o usuário clica no botão de novo */\n protected novo(){\n const event = new Event('novo', { cancelable: true });\n this._novo.emit(event);\n if(event.defaultPrevented) {\n return;\n }\n // uuid que não veio da rota (input ou definido depois de criar): volta para a criação na mesma tela\n if(!this.routeUuid()) {\n this.uuid.set('');\n return;\n }\n this.router.navigate(['../view'], { relativeTo: this.activatedRoute });\n }\n\n /** Função executada quando o usuário clica no botão de voltar */\n protected voltar(){\n // A profundidade da rota depende só da rota: um uuid vindo do input não muda o caminho\n this.router.navigate([\n this.routeUuid() ? '../../' : '../'\n ], { relativeTo: this.activatedRoute });\n }\n}\n","<div class=\"size-full flex flex-col gap-2\">\n \n <div class=\"flex flex-col gap-3 flex-1 min-h-0\">\n <breadcrumbs [items]=\"lstBreadCrumbs()\"></breadcrumbs>\n \n <hlm-card class=\"flex-1 min-h-0 w-full py-0\">\n <div class=\"flex-1 min-h-0 w-full rounded-t-2xl p-3 flex flex-col gap-2\">\n @if(!noBack() || (!noNew() && uuid())) {\n <div class=\"w-full shrink-0 flex gap-2 justify-between\">\n @if(!noBack()){\n <button hlmBtn size=\"sm\" variant=\"outline\" (click)=\"voltar()\">\n <ng-icon name=\"lucideArrowLeft\" class=\"text-lg shrink-0\"></ng-icon>\n Voltar\n </button>\n }\n @if(uuid() && !noNew()){\n <button hlmBtn size=\"sm\" variant=\"outline\" (click)=\"novo()\">\n <ng-icon name=\"lucideCirclePlus\" class=\"text-lg shrink-0\"></ng-icon>\n Novo\n </button>\n }\n </div>\n }\n \n @for (item of contentStart(); track $index) {\n <ng-container *ngTemplateOutlet=\"item.template\"></ng-container>\n }\n\n @if(form(); as formTree){\n <fieldset hlmFieldSet class=\"grid grid-cols-12 mask-y-from-98% flex-1 min-h-0 content-start *:min-w-0 overflow-y-auto py-2\">\n @for (item of lstFields(); track $index) {\n @switch(item.type) {\n @case(FieldType.Phone) {\n <input-phone \n [ngClass]=\"item.class\" \n [class.hidden]=\"item.hiddenForm\" \n [formField]=\"$any(formTree)[item.index]\"\n [label]=\"item.label\"\n [placeholder]=\"item.placeholder\" \n [loading]=\"loading()\"\n [tooltipInfo]=\"item.tooltipInfo\"\n />\n }\n @case (FieldType.Cnpj) {\n <input-cnpj \n [ngClass]=\"item.class\" \n [class.hidden]=\"item.hiddenForm\" \n [formField]=\"$any(formTree)[item.index]\"\n [label]=\"item.label\"\n [placeholder]=\"item.placeholder\" \n [loading]=\"loading()\"\n [tooltipInfo]=\"item.tooltipInfo\"\n />\n }\n @case (FieldType.Bool) {\n <input-bool \n [ngClass]=\"item.class\" \n [class.hidden]=\"item.hiddenForm\" \n [formField]=\"$any(formTree)[item.index]\"\n [label]=\"item.label\"\n [placeholder]=\"item.placeholder\" \n [loading]=\"loading()\"\n [tooltipInfo]=\"item.tooltipInfo\"\n />\n }\n @case (FieldType.Cpf) {\n <input-cpf \n [ngClass]=\"item.class\" \n [class.hidden]=\"item.hiddenForm\" \n [formField]=\"$any(formTree)[item.index]\"\n [label]=\"item.label\"\n [placeholder]=\"item.placeholder\" \n [loading]=\"loading()\"\n [tooltipInfo]=\"item.tooltipInfo\"\n />\n }\n @case (FieldType.CpfCnpj) {\n <input-cpf-cnpj\n [ngClass]=\"item.class\"\n [class.hidden]=\"item.hiddenForm\"\n [formField]=\"$any(formTree)[item.index]\"\n [label]=\"item.label\"\n [placeholder]=\"item.placeholder\"\n [loading]=\"loading()\"\n [tooltipInfo]=\"item.tooltipInfo\"\n />\n }\n @case (FieldType.UUID) {\n <input-string\n [ngClass]=\"item.class\"\n [class.hidden]=\"item.hiddenForm\"\n [formField]=\"$any(formTree)[item.index]\"\n [label]=\"item.label\"\n [placeholder]=\"item.placeholder\"\n [loading]=\"loading()\"\n [tooltipInfo]=\"item.tooltipInfo\"\n />\n }\n @case (FieldType.TextArea) {\n <input-text-area\n [ngClass]=\"item.class\"\n [class.hidden]=\"item.hiddenForm\"\n [formField]=\"$any(formTree)[item.index]\"\n [label]=\"item.label\"\n [placeholder]=\"item.placeholder\"\n [loading]=\"loading()\"\n [tooltipInfo]=\"item.tooltipInfo\"\n />\n }\n @case (FieldType.Number) {\n <input-number\n [ngClass]=\"item.class\"\n [class.hidden]=\"item.hiddenForm\"\n [formField]=\"$any(formTree)[item.index]\"\n [label]=\"item.label\"\n [placeholder]=\"item.placeholder\"\n [loading]=\"loading()\"\n [tooltipInfo]=\"item.tooltipInfo\"\n />\n }\n @case (FieldType.Decimal) {\n <input-decimal\n [ngClass]=\"item.class\"\n [class.hidden]=\"item.hiddenForm\"\n [formField]=\"$any(formTree)[item.index]\"\n [label]=\"item.label\"\n [placeholder]=\"item.placeholder\"\n [loading]=\"loading()\"\n [tooltipInfo]=\"item.tooltipInfo\"\n />\n }\n @case (FieldType.Currency) {\n <input-currency\n [ngClass]=\"item.class\"\n [class.hidden]=\"item.hiddenForm\"\n [formField]=\"$any(formTree)[item.index]\"\n [label]=\"item.label\"\n [placeholder]=\"item.placeholder\"\n [loading]=\"loading()\"\n [tooltipInfo]=\"item.tooltipInfo\"\n />\n }\n @case (FieldType.File) {\n <input-file\n [ngClass]=\"item.class\"\n [class.hidden]=\"item.hiddenForm\"\n [clearable]=\"item.options?.clearable ?? false\"\n [formField]=\"$any(formTree)[item.index]\"\n [label]=\"item.label\"\n [placeholder]=\"item.placeholder\"\n [loading]=\"loading()\"\n [tooltipInfo]=\"item.tooltipInfo\"\n />\n }\n @case (FieldType.String) {\n <input-string\n [ngClass]=\"item.class\" \n [class.hidden]=\"item.hiddenForm\" \n [formField]=\"$any(formTree)[item.index]\"\n [label]=\"item.label\"\n [placeholder]=\"item.placeholder\" \n [loading]=\"loading()\"\n [type]=\"item.options?.type\"\n [tooltipInfo]=\"item.tooltipInfo\"\n />\n }\n @case (FieldType.Mask) {\n <input-mask \n [ngClass]=\"item.class\" \n [class.hidden]=\"item.hiddenForm\" \n [formField]=\"$any(formTree)[item.index]\"\n [label]=\"item.label\"\n [maskitoOptions]=\"item.options?.maskitoOptions!\"\n [unmaskHandler]=\"item.options?.unmaskHandler\"\n [placeholder]=\"item.placeholder\" \n [loading]=\"loading()\"\n [tooltipInfo]=\"item.tooltipInfo\"\n ></input-mask>\n }\n @case (FieldType.Select) {\n <input-select \n [ngClass]=\"item.class\" \n [class.hidden]=\"item.hiddenForm\" \n [schemaService]=\"item.options?.service?.() ?? null\"\n [items]=\"item.options?.lstOptions ?? []\"\n [bindValue]=\"item.options?.bindValue ?? null\"\n [bindLabel]=\"item.options?.bindLabel ?? null\"\n [lstFilter]=\"item.options?.lstFilter || null\"\n [clearable]=\"item.options?.clearable ?? false\"\n [formField]=\"$any(formTree)[item.index]\"\n [label]=\"item.label\"\n [placeholder]=\"item.placeholder\" \n [loading]=\"loading()\"\n [tooltipInfo]=\"item.tooltipInfo\"\n />\n }\n @case (FieldType.Date) {\n <input-date \n [ngClass]=\"item.class\" \n [class.hidden]=\"item.hiddenForm\" \n [formField]=\"$any(formTree)[item.index]\"\n [label]=\"item.label\"\n [placeholder]=\"item.placeholder\" \n [loading]=\"loading()\"\n [tooltipInfo]=\"item.tooltipInfo\"\n />\n }\n @case (FieldType.DateTime) {\n <input-date-time \n [ngClass]=\"item.class\" \n [class.hidden]=\"item.hiddenForm\" \n [formField]=\"$any(formTree)[item.index]\"\n [label]=\"item.label\"\n [placeholder]=\"item.placeholder\" \n [loading]=\"loading()\"\n [tooltipInfo]=\"item.tooltipInfo\"\n />\n }\n @case (FieldType.Time) {\n <input-time\n [ngClass]=\"item.class\"\n [class.hidden]=\"item.hiddenForm\"\n [formField]=\"$any(formTree)[item.index]\"\n [label]=\"item.label\"\n [placeholder]=\"item.placeholder\"\n [loading]=\"loading()\"\n [tooltipInfo]=\"item.tooltipInfo\"\n />\n }\n @case (FieldType.DateSpan) {\n <input-date-span\n [ngClass]=\"item.class\"\n [class.hidden]=\"item.hiddenForm\"\n [formField]=\"$any(formTree)[item.index]\"\n [label]=\"item.label\"\n [placeholder]=\"item.placeholder\"\n [loading]=\"loading()\"\n [tooltipInfo]=\"item.tooltipInfo\"\n />\n }\n @case (FieldType.DateTimeSpan) {\n <input-date-time-span\n [ngClass]=\"item.class\"\n [class.hidden]=\"item.hiddenForm\"\n [formField]=\"$any(formTree)[item.index]\"\n [label]=\"item.label\"\n [placeholder]=\"item.placeholder\"\n [loading]=\"loading()\"\n [tooltipInfo]=\"item.tooltipInfo\"\n />\n }\n @case (FieldType.TimeSpan) {\n <input-time-span\n [ngClass]=\"item.class\"\n [class.hidden]=\"item.hiddenForm\"\n [formField]=\"$any(formTree)[item.index]\"\n [label]=\"item.label\"\n [placeholder]=\"item.placeholder\"\n [loading]=\"loading()\"\n [tooltipInfo]=\"item.tooltipInfo\"\n />\n }\n @case (FieldType.Icon) {\n <input-icon \n [ngClass]=\"item.class\" \n [class.hidden]=\"item.hiddenForm\" \n [formField]=\"$any(formTree)[item.index]\"\n [label]=\"item.label\"\n [placeholder]=\"item.placeholder\" \n [loading]=\"loading()\"\n [tooltipInfo]=\"item.tooltipInfo\"\n />\n }\n @case (FieldType.JSON) {\n <!-- @let json = $any(formTree)[item.index]().value() | json;\n <hlm-code-block class=\"min-h-8\" [ngClass]=\"item.class\">\n <hlm-code-block-header>\n <hlm-code-block-title>{{ item.label }}</hlm-code-block-title>\n <hlm-code-block-actions>\n <button hlmCodeBlockCopyButton [value]=\"json\"></button>\n </hlm-code-block-actions>\n </hlm-code-block-header>\n <pre \n class=\"min-h-fit\"\n hlmCodeBlockContent \n lineNumbers\n wrap\n [code]=\"json\"\n >\n </pre>\n </hlm-code-block> -->\n <input-json\n [ngClass]=\"item.class\" \n [class.hidden]=\"item.hiddenForm\" \n [formField]=\"$any(formTree)[item.index]\"\n [label]=\"item.label\"\n [placeholder]=\"item.placeholder\" \n [loading]=\"loading()\"\n [tooltipInfo]=\"item.tooltipInfo\"\n />\n }\n @default {\n <div hlmField [ngClass]=\"item.class\" [hidden]=\"item.hiddenForm\">\n <label hlmFieldLabel [attr.for]=\"item.index\">\n {{ item.label }}\n </label>\n @if(!loading()){\n <input hlmInput [formField]=\"$any(formTree)[item.index]\" [attr.id]=\"item.index\" type=\"text\" [placeholder]=\"item.placeholder || ''\"/>\n <!-- <p hlmFieldDescription>This appears on invoices and emails.</p> -->\n }@else {\n <hlm-skeleton class=\"h-8 w-full rounded-lg\" [ngClass]=\"item.class\"/>\n }\n </div>\n }\n }\n }\n </fieldset>\n }\n \n @for (item of contentEnd(); track $index) {\n <ng-container *ngTemplateOutlet=\"item.template\"></ng-container>\n }\n\n\n @if(!noSave()){\n <div class=\"w-full shrink-0 flex items-center gap-2 justify-end\">\n <save-button [saving]=\"saving()\" (save)=\"save()\"></save-button>\n <!-- \n <button class=\"relative\" hlmBtn [variant]=\"saving() ? 'ghost' : 'default'\" size=\"sm\" (click)=\"save()\">\n @if(saving()) {\n <span class=\"absolute inset-0 rounded-[inherit] border-shimmer pointer-events-none\"></span>\n \n <ng-icon name=\"lucideRefreshCw\" class=\"text-lg shrink-0 animate-spin\"></ng-icon>\n Salvando...\n } @else {\n <ng-icon name=\"lucideSave\" class=\"text-lg shrink-0\"></ng-icon>\n Salvar\n }\n </button> -->\n </div>\n }\n </div>\n </hlm-card>\n </div>\n</div>","import { Component, computed, input } from '@angular/core';\n\n@Component({\n imports: [],\n selector: 'blurry-text-reveal',\n styleUrl: './blurry-text-reveal.component.scss',\n templateUrl: './blurry-text-reveal.component.html',\n})\nexport class BlurryTextRevealComponent {\n text = input<string>('Text');\n\n protected lstValues = computed(() => this.text().split(''));\n}\n","@for (item of lstValues(); track $index) {\n <span class=\"letter-reveal\">{{ item }}</span>\n}","import { Directive, inject, input, TemplateRef } from '@angular/core';\n\n@Directive({\n selector: 'ng-template[suspendedSlide]',\n})\nexport class SuspendedSlideDirective {\n template = inject(TemplateRef);\n\n name = input.required<string>({ alias: 'suspendedSlide' });\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, contentChildren, input } from '@angular/core';\n\nimport { SuspendedSlideDirective } from './suspended-slide.directive';\n\n@Component({\n imports: [CommonModule],\n selector: 'suspended-slider',\n styleUrl: './suspended-slider.component.scss',\n templateUrl: './suspended-slider.component.html',\n host: { class: 'block' },\n})\nexport class SuspendedSliderComponent {\n step = input.required<string>();\n\n protected lstSlides = contentChildren(SuspendedSlideDirective);\n}\n","<div class=\"relative size-full overflow-hidden p-[inherit]\">\n @for (slide of lstSlides(); track slide.name()) {\n <div \n class=\"w-full absolute right-0 top-0 inset-0 p-[inherit]\n animate-in fade-in-0 slide-in-from-right-2 fill-mode-forwards pointer-events-auto\n \"\n [ngClass]=\"{\n 'animate-out fade-out-0 slide-out-to-right-2 fill-mode-forwards pointer-events-none!':\n step() != slide.name()\n }\"\n [attr.aria-hidden]=\"step() != slide.name()\"\n [attr.inert]=\"step() != slide.name() ? '' : null\"\n >\n <div class=\"size-full p-[inherit] flex items-center justify-center\">\n <ng-container [ngTemplateOutlet]=\"slide.template\"></ng-container>\n </div>\n </div>\n }\n</div>\n","import { Directive, inject, TemplateRef } from '@angular/core';\n\nimport type { ITreeNodeContext } from './tree-drag-drop.component';\n\n/** Substitui o conteúdo padrão (ícone + label) de cada nó da `tree-drag-drop` pelo template */\n@Directive({\n selector: 'ng-template[treeDragDropNode]',\n})\nexport class TreeDragDropNodeDirective<T = any> {\n template = inject<TemplateRef<ITreeNodeContext<T>>>(TemplateRef);\n\n static ngTemplateContextGuard<T>(\n _dir: TreeDragDropNodeDirective<T>,\n _ctx: unknown,\n ): _ctx is ITreeNodeContext<T> {\n return true;\n }\n}\n","import type { ITreeNode, TreeNodeId } from './tree-drag-drop.component';\n\n/** Nó da árvore achatada em pré-ordem, como é renderizado na lista. */\nexport interface IFlatTreeNode<T> {\n node: ITreeNode<T>;\n parentId: TreeNodeId | null;\n depth: number;\n /** Posição entre os irmãos */\n index: number;\n /** Quantidade de irmãos, incluindo o próprio nó */\n setSize: number;\n /** Quantidade total de descendentes, visíveis ou não */\n descendants: number;\n expanded: boolean;\n}\n\nexport interface ITreeLocation<T> {\n node: ITreeNode<T>;\n parent: ITreeNode<T> | null;\n index: number;\n depth: number;\n}\n\nexport interface ITreeProjection<T> {\n /** Novo pai (`null` = raiz) */\n parent: ITreeNode<T> | null;\n depth: number;\n /** Posição entre os novos irmãos, desconsiderando o próprio nó */\n index: number;\n}\n\nexport type TreeDropPredicate<T> = (node: ITreeNode<T>, parent: ITreeNode<T> | null, depth: number) => boolean;\n\n/** Achata a árvore em pré-ordem, omitindo os descendentes dos nós em `hidden`. */\nexport function flattenTree<T>(\n nodes: readonly ITreeNode<T>[],\n hidden: ReadonlySet<TreeNodeId>,\n parentId: TreeNodeId | null = null,\n depth = 0,\n): IFlatTreeNode<T>[] {\n return nodes.flatMap((node, index) => {\n const descendants = countDescendants(node);\n const expanded = descendants > 0 && !hidden.has(node.id);\n return [\n { node, parentId, depth, index, setSize: nodes.length, descendants, expanded },\n ...(expanded ? flattenTree(node.children!, hidden, node.id, depth + 1) : []),\n ];\n });\n}\n\nexport function countDescendants<T>(node: ITreeNode<T>): number {\n return (node.children ?? []).reduce((total, child) => total + 1 + countDescendants(child), 0);\n}\n\n/** Níveis abaixo do nó: 0 para folhas, 1 se tem apenas filhos, e assim por diante. */\nexport function subtreeHeight<T>(node: ITreeNode<T>): number {\n return Math.max(0, ...(node.children ?? []).map((child) => 1 + subtreeHeight(child)));\n}\n\nexport function locateNode<T>(\n nodes: readonly ITreeNode<T>[],\n id: TreeNodeId,\n parent: ITreeNode<T> | null = null,\n depth = 0,\n): ITreeLocation<T> | null {\n for (const [index, node] of nodes.entries()) {\n if (node.id === id) return { node, parent, index, depth };\n const found = node.children && locateNode(node.children, id, node, depth + 1);\n if (found) return found;\n }\n return null;\n}\n\n/**\n * Calcula onde o nó em `activeIndex` cairá ao ser solto em `overIndex`, deslocado `levelOffset` níveis na horizontal.\n * O nível fica entre o do próximo item (para não tomar os filhos dele) e o do item anterior + 1 (no máximo vira\n * filho dele); dentro desse intervalo vence o nível mais próximo do desejado que `accepts` aceitar.\n * @returns `null` quando nenhum nível é aceito nessa posição.\n */\nexport function projectDrop<T>(\n flat: readonly IFlatTreeNode<T>[],\n activeIndex: number,\n overIndex: number,\n levelOffset: number,\n accepts: TreeDropPredicate<T>,\n): ITreeProjection<T> | null {\n const items = [...flat];\n const [active] = items.splice(activeIndex, 1);\n const before = items.slice(0, overIndex);\n const previous = before.at(-1);\n const next = items[overIndex];\n\n const minDepth = next?.depth ?? 0;\n const maxDepth = previous ? previous.depth + 1 : 0;\n const desired = Math.min(Math.max(active.depth + levelOffset, minDepth), maxDepth);\n const candidates = Array.from({ length: maxDepth - minDepth + 1 }, (_, i) => minDepth + i).sort(\n (a, b) => Math.abs(a - desired) - Math.abs(b - desired),\n );\n\n for (const depth of candidates) {\n // O pai é o item mais próximo acima com um nível a menos\n const parent = depth === 0 ? null : [...before].reverse().find((item) => item.depth === depth - 1)!.node;\n if (accepts(active.node, parent, depth)) {\n const index = before.filter((item) => item.parentId === (parent?.id ?? null)).length;\n return { parent, depth, index };\n }\n }\n return null;\n}\n\n/** Move o nó de `from` para a posição `index` entre os filhos de `parentId` (`null` = raiz), sem mutar a árvore. */\nexport function moveNode<T>(\n nodes: ITreeNode<T>[],\n from: ITreeLocation<T>,\n parentId: TreeNodeId | null,\n index: number,\n): ITreeNode<T>[] {\n const without = updateChildren(nodes, from.parent?.id ?? null, (children) =>\n children.filter((child) => child.id !== from.node.id),\n );\n return updateChildren(without, parentId, (children) => [\n ...children.slice(0, index),\n from.node,\n ...children.slice(index),\n ]);\n}\n\n/** Substitui os filhos de `parentId`, recriando apenas os nós no caminho até ele. */\nfunction updateChildren<T>(\n nodes: ITreeNode<T>[],\n parentId: TreeNodeId | null,\n update: (children: ITreeNode<T>[]) => ITreeNode<T>[],\n): ITreeNode<T>[] {\n if (parentId === null) return update(nodes);\n\n let changed = false;\n const result = nodes.map((node) => {\n const children =\n node.id === parentId\n ? update(node.children ?? [])\n : node.children && updateChildren(node.children, parentId, update);\n if (children === node.children) return node;\n changed = true;\n return { ...node, children };\n });\n return changed ? result : nodes;\n}\n","import { LiveAnnouncer } from '@angular/cdk/a11y';\nimport { CdkDrag, CdkDragDrop, CdkDragHandle, CdkDragMove, CdkDropList } from '@angular/cdk/drag-drop';\nimport { NgTemplateOutlet } from '@angular/common';\nimport {\n afterNextRender,\n booleanAttribute,\n Component,\n computed,\n contentChild,\n DestroyRef,\n ElementRef,\n inject,\n Injector,\n input,\n model,\n output,\n signal,\n viewChildren,\n} from '@angular/core';\n\nimport { NgIcon, provideIcons } from '@ng-icons/core';\nimport { lucideChevronRight, lucideLockKeyhole, lucideGripVertical } from '@ng-icons/lucide';\nimport { HlmBadgeImports, HlmButtonImports } from '@sapphire-caitlyn/schema-kit-ng/helm';\n\nimport { IdService } from '../../../services/id.service';\nimport { TreeDragDropNodeDirective } from './tree-drag-drop-node.directive';\nimport {\n flattenTree,\n IFlatTreeNode,\n locateNode,\n moveNode,\n projectDrop,\n subtreeHeight,\n TreeDropPredicate,\n} from './tree-drag-drop.utils';\n\n/**\n * Árvore com reordenação por drag and drop, inclusive entre níveis.\n * Arrastar na vertical define a posição e na horizontal o nível (cada `indent` px = um nível); o placeholder\n * mostra onde o item vai cair. Pelo teclado, Alt + ↑/↓ reordena entre irmãos e Alt + →/← muda de nível.\n */\n@Component({\n imports: [\n CdkDropList,\n CdkDrag,\n CdkDragHandle,\n NgTemplateOutlet,\n NgIcon,\n HlmButtonImports,\n HlmBadgeImports,\n ],\n providers: [provideIcons({ lucideChevronRight, lucideLockKeyhole, lucideGripVertical })],\n selector: 'tree-drag-drop',\n styleUrl: './tree-drag-drop.component.scss',\n templateUrl: './tree-drag-drop.component.html',\n})\nexport class TreeDragDropComponent<T = any> {\n private announcer = inject(LiveAnnouncer);\n private injector = inject(Injector);\n\n /** Árvore exibida; a cada movimentação é substituída por uma nova referência */\n nodes = model.required<ITreeNode<T>[]>();\n\n /** Rótulo acessível da árvore */\n label = input<string>();\n\n /** Recuo, em px, de cada nível. Também é o quanto se arrasta na horizontal para mudar de nível */\n indent = input(24);\n\n /** Quantidade máxima de níveis (1 = lista plana) */\n maxLevels = input(Infinity);\n\n /** Define se `node` pode ser filho de `parent` (`null` = raiz) */\n canDrop = input<(node: ITreeNode<T>, parent: ITreeNode<T> | null) => boolean>(() => true);\n\n /** Define se `node` pode ser movido. Os bloqueados exibem um cadeado no lugar da alça de arrasto */\n canDrag = input<(node: ITreeNode<T>) => boolean>(() => true);\n\n disabled = input(false, { transform: booleanAttribute });\n\n /** Emitido após cada movimentação, com a árvore já atualizada em `nodes` */\n nodeMoved = output<ITreeNodeMove<T>>();\n\n protected nodeTemplate = contentChild<TreeDragDropNodeDirective<T>>(TreeDragDropNodeDirective);\n private treeItems = viewChildren<ElementRef<HTMLElement>>('treeItem');\n\n protected hintId = inject(IdService).next('tree-drag-drop-hint');\n\n protected collapsed = signal<ReadonlySet<TreeNodeId>>(new Set());\n protected focusedId = signal<TreeNodeId | null>(null);\n\n /** Nó sendo arrastado. Seus descendentes saem da lista durante o drag e acompanham o pai */\n protected activeId = signal<TreeNodeId | null>(null);\n protected overIndex = signal(0);\n private levelOffset = signal(0);\n\n protected flat = computed(() => {\n const activeId = this.activeId();\n const hidden = activeId === null ? this.collapsed() : new Set([...this.collapsed(), activeId]);\n return flattenTree(this.nodes(), hidden);\n });\n\n /** Item que recebe o foco ao entrar na árvore via Tab (roving tabindex) */\n protected tabbableId = computed(() => {\n const flat = this.flat();\n const focusedId = this.focusedId();\n return flat.some((item) => item.node.id === focusedId) ? focusedId : flat[0]?.node.id;\n });\n\n protected projection = computed(() => {\n const activeId = this.activeId();\n if (activeId === null) return null;\n const flat = this.flat();\n return projectDrop(flat, this.indexOf(activeId), this.overIndex(), this.levelOffset(), this.accepts);\n });\n\n /** Recuo do placeholder: nível projetado ou, se a posição for inválida, o nível de origem */\n protected dropIndent = computed(() => {\n const activeId = this.activeId();\n if (activeId === null) return null;\n const depth = this.projection()?.depth ?? this.flat()[this.indexOf(activeId)].depth;\n return `${depth * this.indent()}px`;\n });\n\n constructor() {\n inject(DestroyRef).onDestroy(() => this.dragEnded());\n }\n\n private accepts: TreeDropPredicate<T> = (node, parent, depth) =>\n depth + subtreeHeight(node) < this.maxLevels() && this.canDrop()(node, parent);\n\n protected toggle(id: TreeNodeId) {\n this.collapsed.update((collapsed) => {\n const next = new Set(collapsed);\n if (!next.delete(id)) next.add(id);\n return next;\n });\n }\n\n protected dragStarted(item: IFlatTreeNode<T>) {\n this.overIndex.set(this.indexOf(item.node.id));\n this.levelOffset.set(0);\n this.activeId.set(item.node.id);\n this.guardClick();\n }\n\n protected dragMoved(event: CdkDragMove) {\n this.levelOffset.set(Math.round(event.distance.x / this.indent()));\n }\n\n private releaseClickGuard?: () => void;\n\n /**\n * Durante o drag o CDK move o item para o <body>; o click disparado ao soltar cai fora de\n * overlays (ex.: dialog) e seria tratado como clique fora, fechando-os. Descarta esse click.\n */\n private guardClick() {\n const swallow = (event: Event) => {\n event.stopPropagation();\n this.dragEnded();\n };\n window.addEventListener('click', swallow, { capture: true });\n this.releaseClickGuard = () => window.removeEventListener('click', swallow, { capture: true });\n }\n\n protected dragEnded() {\n this.releaseClickGuard?.();\n this.releaseClickGuard = undefined;\n }\n\n /** O `cdkDragEnded` dispara antes deste evento, então o estado do drag só é limpo aqui */\n protected dropped(event: CdkDragDrop<unknown, unknown, IFlatTreeNode<T>>) {\n const { node } = event.item.data;\n const levelOffset = Math.round(event.distance.x / this.indent());\n const projection = projectDrop(this.flat(), this.indexOf(node.id), event.currentIndex, levelOffset, this.accepts);\n this.activeId.set(null);\n if (projection) this.move(node, projection.parent, projection.index);\n }\n\n protected onKeydown(event: KeyboardEvent, item: IFlatTreeNode<T>) {\n const handled = event.altKey ? this.moveByKey(event.key, item) : this.navigateByKey(event.key, item);\n if (handled) event.preventDefault();\n }\n\n /** Navegação do padrão WAI-ARIA de tree view */\n private navigateByKey(key: string, item: IFlatTreeNode<T>): boolean {\n const index = this.indexOf(item.node.id);\n switch (key) {\n case 'ArrowDown':\n this.focusAt(index + 1);\n return true;\n case 'ArrowUp':\n this.focusAt(index - 1);\n return true;\n case 'Home':\n this.focusAt(0);\n return true;\n case 'End':\n this.focusAt(this.flat().length - 1);\n return true;\n case 'ArrowRight':\n if (item.expanded) this.focusAt(index + 1);\n else if (item.descendants) this.toggle(item.node.id);\n return true;\n case 'ArrowLeft':\n if (item.expanded) this.toggle(item.node.id);\n else if (item.parentId !== null) this.focusAt(this.indexOf(item.parentId));\n return true;\n default:\n return false;\n }\n }\n\n /** Alternativa de teclado ao arrasto (WCAG 2.5.7) */\n private moveByKey(key: string, item: IFlatTreeNode<T>): boolean {\n if (this.disabled() || !key.startsWith('Arrow')) return false;\n if (!this.canDrag()(item.node)) {\n this.announcer.announce(`${item.node.label} não pode ser movido`);\n return true;\n }\n\n const from = locateNode(this.nodes(), item.node.id)!;\n const siblings = from.parent?.children ?? this.nodes();\n let target: Pick<ITreeNodeMove<T>, 'parent' | 'index'> | null = null;\n\n switch (key) {\n case 'ArrowUp':\n if (from.index > 0) target = { parent: from.parent, index: from.index - 1 };\n break;\n case 'ArrowDown':\n if (from.index < siblings.length - 1) target = { parent: from.parent, index: from.index + 1 };\n break;\n case 'ArrowRight': {\n // Vira o último filho do irmão anterior\n const previous = siblings[from.index - 1];\n if (previous && this.accepts(from.node, previous, from.depth + 1)) {\n target = { parent: previous, index: previous.children?.length ?? 0 };\n }\n break;\n }\n case 'ArrowLeft': {\n // Vira o irmão seguinte do pai\n if (!from.parent) break;\n const parent = locateNode(this.nodes(), from.parent.id)!;\n if (this.accepts(from.node, parent.parent, from.depth - 1)) {\n target = { parent: parent.parent, index: parent.index + 1 };\n }\n break;\n }\n default:\n return false;\n }\n\n if (target && this.move(from.node, target.parent, target.index)) {\n // O @for move o elemento no DOM, o que tira o foco dele\n afterNextRender(() => this.focusAt(this.indexOf(from.node.id)), { injector: this.injector });\n }\n return true;\n }\n\n /** Move `node` para a posição `index` entre os filhos de `parent` (`null` = raiz) */\n private move(node: ITreeNode<T>, parent: ITreeNode<T> | null, index: number): boolean {\n const from = locateNode(this.nodes(), node.id)!;\n if (from.parent?.id === parent?.id && from.index === index) return false;\n\n const nodes = moveNode(this.nodes(), from, parent?.id ?? null, index);\n this.nodes.set(nodes);\n if (parent && this.collapsed().has(parent.id)) this.toggle(parent.id);\n\n const to = locateNode(nodes, node.id)!;\n this.nodeMoved.emit({\n node,\n previousParent: from.parent,\n previousIndex: from.index,\n parent: to.parent,\n index: to.index,\n });\n this.announcer.announce(`${node.label} movido para o nível ${to.depth + 1}, posição ${to.index + 1}`);\n return true;\n }\n\n private focusAt(index: number) {\n this.treeItems()[index]?.nativeElement.focus();\n }\n\n private indexOf(id: TreeNodeId) {\n return this.flat().findIndex((item) => item.node.id === id);\n }\n}\n\nexport type TreeNodeId = string | number;\n\nexport interface ITreeNode<T = any> {\n id: TreeNodeId;\n label: string;\n icon?: string;\n data?: T;\n children?: ITreeNode<T>[];\n}\n\nexport interface ITreeNodeMove<T = any> {\n node: ITreeNode<T>;\n previousParent: ITreeNode<T> | null;\n previousIndex: number;\n /** Novo pai (`null` = raiz), já com `node` entre os filhos */\n parent: ITreeNode<T> | null;\n index: number;\n}\n\nexport interface ITreeNodeContext<T = any> {\n $implicit: ITreeNode<T>;\n level: number;\n expanded: boolean;\n}\n","<div\n role=\"tree\"\n cdkDropList\n class=\"tree flex flex-col gap-1\"\n [cdkDropListDisabled]=\"disabled()\"\n [attr.aria-label]=\"label()\"\n [attr.aria-describedby]=\"hintId\"\n [attr.data-drop-invalid]=\"activeId() !== null && !projection() ? '' : null\"\n [style.--tree-drop-indent]=\"dropIndent()\"\n (cdkDropListSorted)=\"overIndex.set($event.currentIndex)\"\n (cdkDropListDropped)=\"dropped($event)\"\n>\n @for (item of flat(); track item.node.id) {\n @let draggable = canDrag()(item.node);\n <div\n #treeItem\n cdkDrag\n role=\"treeitem\"\n class=\"tree-item group/item rounded-md outline-none\"\n [cdkDragData]=\"item\"\n [cdkDragDisabled]=\"!draggable\"\n [style.padding-inline-start.px]=\"item.depth * indent()\"\n [tabindex]=\"item.node.id === tabbableId() ? 0 : -1\"\n [attr.aria-label]=\"item.node.label\"\n [attr.aria-level]=\"item.depth + 1\"\n [attr.aria-posinset]=\"item.index + 1\"\n [attr.aria-setsize]=\"item.setSize\"\n [attr.aria-expanded]=\"item.descendants ? item.expanded : null\"\n (focusin)=\"focusedId.set(item.node.id)\"\n (keydown)=\"onKeydown($event, item)\"\n (cdkDragStarted)=\"dragStarted(item)\"\n (cdkDragMoved)=\"dragMoved($event)\"\n (cdkDragEnded)=\"dragEnded()\"\n >\n <div\n class=\"tree-card bg-card group-focus-visible/item:border-ring group-focus-visible/item:ring-ring/50 flex items-center gap-2 rounded-md border p-2 group-focus-visible/item:ring-[3px]\"\n >\n <ng-icon\n cdkDragHandle\n aria-hidden=\"true\"\n class=\"text-muted-foreground shrink-0 text-lg\"\n [name]=\"draggable ? 'lucideGripVertical' : 'lucideLockKeyhole'\"\n [class.cursor-grab]=\"draggable\"\n [class.cursor-not-allowed]=\"!draggable\"\n />\n\n @if (item.descendants) {\n <button\n hlmBtn\n variant=\"ghost\"\n size=\"icon-sm\"\n tabindex=\"-1\"\n class=\"text-muted-foreground shrink-0\"\n [attr.aria-label]=\"(item.expanded ? 'Recolher ' : 'Expandir ') + item.node.label\"\n (click)=\"toggle(item.node.id)\"\n >\n <ng-icon name=\"lucideChevronRight\" class=\"transition-transform\" [class.rotate-90]=\"item.expanded\" />\n </button>\n } @else {\n <span class=\"size-7 shrink-0\"></span>\n }\n\n @if (nodeTemplate(); as nodeTemplate) {\n <ng-container\n *ngTemplateOutlet=\"\n nodeTemplate.template;\n context: { $implicit: item.node, level: item.depth + 1, expanded: item.expanded }\n \"\n />\n } @else {\n @if (item.node.icon) {\n <ng-icon [name]=\"item.node.icon\" class=\"shrink-0 text-lg\" />\n }\n <span class=\"truncate text-sm\">{{ item.node.label }}</span>\n }\n\n @if (item.descendants) {\n <!-- Visível apenas no preview do drag, já que os descendentes somem da lista enquanto isso -->\n <span hlmBadge variant=\"secondary\" class=\"tree-descendants ms-auto\">+{{ item.descendants }}</span>\n }\n </div>\n </div>\n }\n</div>\n\n<span [id]=\"hintId\" class=\"sr-only\">\n Use Alt + seta para cima ou para baixo para reordenar e Alt + seta para a direita ou para a esquerda para mudar de\n nível.\n</span>\n","import { Component, viewChild } from '@angular/core';\n\nimport { HlmDialog } from '@sapphire-caitlyn/schema-kit-ng/helm';\n\n@Component({\n imports: [],\n selector: 'schema-dialog',\n styleUrl: './schema-dialog.component.scss',\n templateUrl: './schema-dialog.component.html',\n})\nexport class SchemaDialogComponent<Result = void> {\n dialog = viewChild.required<HlmDialog>(HlmDialog);\n\n close(result: Result) {\n this.dialog().close(result);\n }\n}\n","<p>\n there should be a dialog here, if you see this message,\n you did not implement the dialog correctly, please check the documentation\n</p>\n","import { ApplicationRef, ComponentRef, createComponent, EnvironmentInjector, inject, InputSignalWithTransform, ModelSignal, Service, Type } from '@angular/core';\n\nimport { SchemaDialogComponent } from './schema-dialog.component';\n\n// Apenas inputs baseados em signal (input()/model()), com o valor desembrulhado, como no setInput\ntype DialogInputs<T> = {\n [K in keyof T as T[K] extends InputSignalWithTransform<unknown, unknown> | ModelSignal<unknown> ? K : never]?:\n T[K] extends InputSignalWithTransform<unknown, infer W> ? W : T[K] extends ModelSignal<infer V> ? V : never;\n};\n\n// Tipo do resultado declarado no SchemaDialogComponent<Result> estendido pelo componente\ntype DialogResult<T> = T extends SchemaDialogComponent<infer R> ? R : never;\n\n@Service()\nexport class SchemaDialogController {\n\n private environmentInjector = inject(EnvironmentInjector);\n\n private appRef = inject(ApplicationRef);\n\n // O componente é destruído ao fechar o dialog, exceto com destroyOnClose: false ou se não for aberto; nesses casos cabe a quem chamou destruir a ref\n open<T extends SchemaDialogComponent<any>>(\n component: Type<T>,\n inputs?: DialogInputs<T>,\n options: ISchemaDialogOptions = {},\n ): ISchemaDialogReturn<T> {\n const componentRef = createComponent(component, {\n environmentInjector: this.environmentInjector,\n });\n for (const [name, value] of Object.entries(inputs ?? {})) {\n componentRef.setInput(name, value);\n }\n this.appRef.attachView(componentRef.hostView);\n\n const dialog = componentRef.instance.dialog();\n // Um único listener: resolve antes de destruir, senão o destroy completa o output antes do valor chegar\n const closed = new Promise<DialogResult<T> | undefined>((resolve) => {\n dialog.closed.subscribe((result) => {\n resolve(result as DialogResult<T> | undefined);\n if (options.destroyOnClose ?? true) {\n componentRef.destroy();\n }\n });\n // Resolve também se a ref for destruída sem fechar o dialog\n componentRef.onDestroy(() => resolve(undefined));\n });\n\n if (options.open ?? true) {\n dialog.open();\n }\n return {\n component: componentRef,\n instance: componentRef.instance,\n closed,\n };\n }\n}\nexport interface ISchemaDialogOptions {\n /** Default: true */\n destroyOnClose?: boolean;\n /** Default: true */\n open?: boolean;\n}\nexport interface ISchemaDialogReturn<T extends SchemaDialogComponent<any>> {\n component: ComponentRef<T>;\n instance: T;\n /** Resolve com o valor passado em close(result), ou undefined se fechado sem resultado (ex.: hlmDialogClose, ESC, clique fora) */\n closed: Promise<DialogResult<T> | undefined>;\n}","import { FieldValidator, SchemaPath, validate } from \"@angular/forms/signals\";\n\nexport const fieldValidatorAsRule = <T>(validator: FieldValidator<T>) => (p: SchemaPath<T>) => validate(p, validator);","import { FieldValidator } from '@angular/forms/signals';\n\nimport { fieldValidatorAsRule } from '../utils/field-validator-as-rule'\n\n/**\n * Calcula o dígito verificador de um CNPJ usando o algoritmo Módulo 11\n * com pesos cíclicos 2..9.\n *\n * Aceita tanto CNPJs puramente numéricos quanto no formato alfanumérico\n * da Nota Técnica RFB 49/2024 (letras A-Z convertidas via ASCII - 48).\n *\n * @param digits - String com 12 dígitos (para DV1) ou 13 dígitos (para DV2).\n * @returns Dígito verificador (0..9).\n */\nfunction cnpjDigit(digits: string): number {\n let sum = 0\n let weight = 2\n for (let i = digits.length - 1; i >= 0; i--) {\n sum += (digits.charCodeAt(i) - 48) * weight\n weight = weight === 9 ? 2 : weight + 1\n }\n const mod = sum % 11\n return mod < 2 ? 0 : 11 - mod\n}\n\nconst BLACKLIST = new Set<string>([\n '00000000000000',\n '11111111111111',\n '22222222222222',\n '33333333333333',\n '44444444444444',\n '55555555555555',\n '66666666666666',\n '77777777777777',\n '88888888888888',\n '99999999999999'\n])\n\nconst STRICT_STRIP_REGEX = /[./-]/g\nconst LOOSE_STRIP_REGEX = /[^\\dA-Z]/g\nconst STRICT_MASK_REGEX =\n /^(?:[\\dA-Z]{2}\\.[\\dA-Z]{3}\\.[\\dA-Z]{3}\\/[\\dA-Z]{4}-\\d{2}|[\\dA-Z]{12}\\d{2})$/\nconst VALID_CHARS = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'\n\n/** Opções para `cnpj.generate()`. */\nexport interface GenerateOptions {\n /** Retorna o CNPJ com máscara `XX.XXX.XXX/XXXX-YY` quando `true`. */\n formatted?: boolean\n}\n\n/**\n * Remove caracteres de máscara e normaliza um CNPJ.\n *\n * Em modo padrão (loose), converte minúsculas para maiúsculas e remove\n * qualquer caractere que não seja dígito ou letra A-Z. Em modo strict,\n * remove apenas `.`, `/` e `-` (máscara oficial) sem normalizar o case.\n *\n * @param value - Entrada a ser normalizada.\n * @param strict - Se `true`, só remove os caracteres da máscara oficial.\n * @returns Apenas dígitos e letras A-Z remanescentes.\n */\nfunction strip(value: string, strict?: boolean): string {\n if (typeof value !== 'string') return ''\n const normalized = strict ? value : value.toUpperCase()\n const regex = strict ? STRICT_STRIP_REGEX : LOOSE_STRIP_REGEX\n return normalized.replace(regex, '')\n}\n\n/**\n * Aplica a máscara oficial `XX.XXX.XXX/XXXX-YY` no CNPJ (numérico ou\n * alfanumérico). Os 2 últimos caracteres (DVs) são sempre numéricos.\n *\n * @param value - CNPJ cru ou já formatado.\n * @returns CNPJ mascarado, ou entrada normalizada quando não casar com o\n * padrão de 14 posições.\n */\nfunction format(value: string): string {\n return strip(value).replace(\n /^([\\dA-Z]{2})([\\dA-Z]{3})([\\dA-Z]{3})([\\dA-Z]{4})(\\d{2})$/,\n '$1.$2.$3/$4-$5'\n )\n}\n\n/**\n * Valida um CNPJ verificando tamanho, lista negra, shape dos DVs e os\n * dois dígitos verificadores via Módulo 11.\n *\n * Aceita tanto CNPJs puramente numéricos (formato legado) quanto\n * alfanuméricos (novo formato da Nota Técnica RFB 49/2024 — vigência\n * obrigatória em julho/2026).\n *\n * @param value - CNPJ (cru, formatado ou com lixo, conforme `strict`).\n * @param strict - Se `true`, só aceita máscara canônica ou 14 caracteres\n * `[0-9A-Z]` sem normalização de case.\n * @returns `true` se o CNPJ é válido; `false` caso contrário.\n *\n * @example\n * ```ts\n * cnpj.isValid('54.550.752/0001-55') // true\n * cnpj.isValid('54550752000155') // true\n * cnpj.isValid('12ABC34501DE35') // true (novo formato RFB)\n * cnpj.isValid('12.ABC.345/01DE-35') // true\n * ```\n */\nfunction isValid(value: string, strict?: boolean): boolean {\n if (strict && (typeof value !== 'string' || !STRICT_MASK_REGEX.test(value))) {\n return false\n }\n const stripped = strip(value, strict)\n if (!stripped || stripped.length !== 14 || BLACKLIST.has(stripped)) {\n return false\n }\n // DVs (últimas 2 posições) devem ser numéricos pela regra da RFB.\n if (!/^\\d{2}$/.test(stripped.slice(-2))) {\n return false\n }\n\n let numbers = stripped.slice(0, 12)\n numbers += cnpjDigit(numbers)\n numbers += cnpjDigit(numbers)\n return numbers.slice(-2) === stripped.slice(-2)\n}\n\n/**\n * Gera um CNPJ alfanumérico matematicamente válido, seguindo o formato\n * da Nota Técnica RFB 49/2024.\n *\n * @param options - Boolean legado (apenas `formatted`) ou objeto de opções.\n * @returns CNPJ gerado com 14 caracteres (12 alfanuméricos + 2 DVs\n * numéricos) ou a máscara oficial.\n *\n * @example\n * ```ts\n * cnpj.generate() // '58A0Z919U001O6'\n * cnpj.generate(true) // '58.A0Z.919/U001-O6' (nope — DVs sempre numéricos)\n * cnpj.generate({ formatted: true }) // '58.A0Z.919/U001-06'\n * ```\n */\nfunction generate(options?: boolean | GenerateOptions): string {\n const opts: GenerateOptions =\n typeof options === 'boolean' ? { formatted: options } : (options ?? {})\n\n let numbers = ''\n for (let i = 0; i < 12; i++) {\n numbers += VALID_CHARS.charAt(Math.floor(Math.random() * VALID_CHARS.length))\n }\n numbers += cnpjDigit(numbers)\n numbers += cnpjDigit(numbers)\n return opts.formatted ? format(numbers) : numbers\n}\n\nconst cnpjFieldValidator: FieldValidator<string | null> = ({ value }) => {\n const v = value();\n if(!v) return null;\n return isValid(v) ? null : { kind: 'cnpj', message: 'CNPJ inválido' };\n};\nconst cnpjValidator = fieldValidatorAsRule(cnpjFieldValidator);\n\nexport { \n cnpjValidator,\n isValid as isCnpjValid,\n}","import { FieldValidator } from '@angular/forms/signals';\n\nimport { fieldValidatorAsRule } from '../utils/field-validator-as-rule'\n\n/**\n * Calcula o dígito verificador de um CPF usando o algoritmo Módulo 11\n * com pesos lineares crescentes.\n *\n * @param digits - String com 9 dígitos (para DV1) ou 10 dígitos (para DV2).\n * @returns Dígito verificador (0..9).\n */\nfunction cpfDigit(digits: string): number {\n let sum = 0\n const n = digits.length\n for (let i = n - 1; i >= 0; i--) {\n sum += (digits.charCodeAt(i) - 48) * (n - i + 1)\n }\n const mod = sum % 11\n return mod < 2 ? 0 : 11 - mod\n}\n\n\nconst BLACKLIST = new Set<string>([\n '00000000000',\n '11111111111',\n '22222222222',\n '33333333333',\n '44444444444',\n '55555555555',\n '66666666666',\n '77777777777',\n '88888888888',\n '99999999999',\n '12345678909'\n])\n\nconst STRICT_STRIP_REGEX = /[.-]/g\nconst LOOSE_STRIP_REGEX = /[^\\d]/g\nconst STRICT_MASK_REGEX = /^(?:\\d{3}\\.\\d{3}\\.\\d{3}-\\d{2}|\\d{11})$/\n\n/**\n * Mapa dos 27 UFs brasileiros para seus dígitos de Região Fiscal da\n * Receita Federal (0..9), codificados na 9ª posição do CPF.\n *\n * @example\n * ```ts\n * FISCAL_REGION_BY_UF.SP // 8 (São Paulo — 8ª Região Fiscal)\n * FISCAL_REGION_BY_UF.RS // 0 (Rio Grande do Sul — 10ª Região Fiscal)\n * ```\n */\nconst FISCAL_REGION_BY_UF = {\n DF: 1,\n GO: 1,\n MS: 1,\n MT: 1,\n TO: 1,\n AC: 2,\n AM: 2,\n AP: 2,\n PA: 2,\n RO: 2,\n RR: 2,\n CE: 3,\n MA: 3,\n PI: 3,\n AL: 4,\n PB: 4,\n PE: 4,\n RN: 4,\n BA: 5,\n SE: 5,\n MG: 6,\n ES: 7,\n RJ: 7,\n SP: 8,\n PR: 9,\n SC: 9,\n RS: 0\n} as const\n\n/** Unidade da Federação — um dos 26 estados brasileiros ou DF. */\n type UF = keyof typeof FISCAL_REGION_BY_UF\n\n/** Opções para `cpf.generate()`. */\n interface GenerateOptions {\n /** Retorna o CPF com máscara `XXX.XXX.XXX-XX` quando `true`. */\n formatted?: boolean\n /** UF de emissão — controla o dígito da Região Fiscal (9ª posição). */\n state?: UF\n}\n\n/**\n * Remove caracteres de máscara e normaliza um CPF.\n *\n * @param value - Entrada a ser normalizada.\n * @param strict - Se `true`, remove apenas `.` e `-`. Se `false` ou omitido,\n * remove qualquer caractere não numérico.\n * @returns Apenas os dígitos remanescentes.\n */\nfunction strip(value: string, strict?: boolean): string {\n if (typeof value !== 'string') return ''\n const regex = strict ? STRICT_STRIP_REGEX : LOOSE_STRIP_REGEX\n return value.replace(regex, '')\n}\n\n/**\n * Aplica a máscara oficial `XXX.XXX.XXX-XX` no CPF.\n *\n * @param value - CPF cru ou já formatado.\n * @returns O CPF com máscara, ou a entrada normalizada quando não casar\n * com o padrão de 11 dígitos.\n */\nfunction format(value: string): string {\n return strip(value).replace(/^(\\d{3})(\\d{3})(\\d{3})(\\d{2})$/, '$1.$2.$3-$4')\n}\n\n/**\n * Valida um CPF verificando tamanho, lista negra e os dois dígitos\n * verificadores via Módulo 11.\n *\n * @param value - CPF (cru, formatado ou com lixo, conforme `strict`).\n * @param strict - Se `true`, só aceita máscara canônica `XXX.XXX.XXX-XX`\n * ou 11 dígitos puros. Se `false` ou omitido, remove qualquer lixo.\n * @returns `true` se o CPF é válido; `false` caso contrário.\n *\n * @example\n * ```ts\n * cpf.isValid('295.379.955-93') // true\n * cpf.isValid('29537995593') // true\n * cpf.isValid('00000000000') // false (blacklist)\n * ```\n */\nfunction isValid(value: string, strict?: boolean): boolean {\n if (strict && (typeof value !== 'string' || !STRICT_MASK_REGEX.test(value))) {\n return false\n }\n const stripped = strip(value, strict)\n if (!stripped || stripped.length !== 11 || BLACKLIST.has(stripped)) {\n return false\n }\n\n let numbers = stripped.slice(0, 9)\n numbers += cpfDigit(numbers)\n numbers += cpfDigit(numbers)\n return numbers.slice(-2) === stripped.slice(-2)\n}\n\n/**\n * Gera um CPF matematicamente válido, opcionalmente formatado ou\n * vinculado a uma UF específica (via Região Fiscal da RFB).\n *\n * @param options - Boolean legado (apenas `formatted`) ou objeto com\n * `formatted` e/ou `state`. Quando `state` é informado, a 9ª posição\n * recebe o dígito da Região Fiscal correspondente.\n * @returns CPF gerado, com 11 dígitos crus ou a máscara oficial.\n * @throws {TypeError} Se `options.state` for informado mas não for um UF\n * conhecido.\n *\n * @example\n * ```ts\n * cpf.generate() // '32564428777'\n * cpf.generate(true) // '325.644.287-77'\n * cpf.generate({ state: 'SP' }) // '...8??' (8ª posição = RF SP)\n * cpf.generate({ formatted: true, state: 'SP' }) // '325.644.287-77' (9ª = '8')\n * ```\n */\nfunction generate(options?: boolean | GenerateOptions): string {\n const opts: GenerateOptions =\n typeof options === 'boolean' ? { formatted: options } : (options ?? {})\n\n let numbers = ''\n for (let i = 0; i < 8; i++) {\n numbers += Math.floor(Math.random() * 10)\n }\n\n if (opts.state !== undefined) {\n if (!Object.hasOwn(FISCAL_REGION_BY_UF, opts.state)) {\n throw new TypeError(\n `UF '${opts.state}' desconhecida — use uma das: ${Object.keys(FISCAL_REGION_BY_UF).join(', ')}`\n )\n }\n numbers += FISCAL_REGION_BY_UF[opts.state]\n } else {\n numbers += Math.floor(Math.random() * 10)\n }\n\n numbers += cpfDigit(numbers)\n numbers += cpfDigit(numbers)\n return opts.formatted ? format(numbers) : numbers\n}\n\nconst cpfFieldValidator: FieldValidator<string | null> = ({ value }) => {\n const v = value();\n if(!v) return null;\n return isValid(v) ? null : { kind: 'cpf', message: 'CPF inválido' };\n};\n\nconst cpfValidator = fieldValidatorAsRule(cpfFieldValidator);\n\nexport { \n cpfValidator,\n isValid as isCpfValid,\n}","import { FieldValidator } from '@angular/forms/signals';\n\nimport { isCnpjValid } from './cnpj.validator';\nimport { isCpfValid } from './cpf.validator';\nimport { fieldValidatorAsRule } from '../utils/field-validator-as-rule';\n\nfunction isValid(value: string): boolean {\n return isCpfValid(value) || isCnpjValid(value);\n}\n\nconst cpfCnpjFieldValidator: FieldValidator<string | null> = ({ value }) => {\n const v = value();\n if(!v) return null;\n return isValid(v) ? null : { kind: 'cpfCnpj', message: 'CPF/CNPJ inválido' };\n};\nconst cpfCnpjValidator = fieldValidatorAsRule(cpfCnpjFieldValidator);\n\nexport { \n cpfCnpjValidator,\n}","import { FieldValidator } from '@angular/forms/signals';\nimport z from 'zod';\n\nimport { fieldValidatorAsRule } from '../utils/field-validator-as-rule';\n\nfunction isValid(value: string | null) {\n return z.url().nullable().safeParse(value);\n}\nconst urlFieldValidator: FieldValidator<string | null> = ({ value }) => {\n if(!value() || isValid(value()).success) {\n return null;\n };\n return { kind: 'url', message: 'URL inválida' };\n};\nconst urlValidator = fieldValidatorAsRule(urlFieldValidator);\n\nfunction isValidPartial(value: string | null) {\n return z.string().regex(/^\\/[a-zA-Z0-9_-]+(?:\\/[a-zA-Z0-9_-]+)*$/, {\n message: \"Invalid URL path\",\n }).safeParse(value);\n}\nconst partialUrlFieldValidator: FieldValidator<string | null> = ({ value }) => {\n if(!value() || isValidPartial(value()).success) {\n return null;\n };\n return { kind: 'partialUrl', message: 'URL parcial inválida' };\n};\nconst partialUrlValidator = fieldValidatorAsRule(partialUrlFieldValidator);\n\nexport { \n urlValidator,\n partialUrlValidator\n}\n","import { FieldValidator } from '@angular/forms/signals';\nimport z from 'zod';\n\nimport { fieldValidatorAsRule } from '../utils/field-validator-as-rule';\n\nconst passwordSchema = z.string()\n .min(8, { message: 'A senha deve ter pelo menos 8 caracteres' })\n .regex(/[a-z]/, { message: 'A senha deve conter pelo menos uma letra minúscula' })\n .regex(/[A-Z]/, { message: 'A senha deve conter pelo menos uma letra maiúscula' })\n .regex(/[0-9]/, { message: 'A senha deve conter pelo menos um número' })\n .regex(/[^a-zA-Z0-9]/, { message: 'A senha deve conter pelo menos um símbolo' })\n .nullish();\n\nconst passwordFieldValidator: FieldValidator<string | null> = ({ value }) => {\n const result = passwordSchema.safeParse(value() ?? '');\n if(result.success) {\n return null;\n };\n return { kind: 'password', message: result.error.issues[0].message };\n};\nconst passwordValidator = fieldValidatorAsRule(passwordFieldValidator);\n\nfunction isValid(password: string): boolean {\n return passwordSchema.safeParse(password).success;\n}\n\nexport {\n passwordValidator,\n isValid as isValidPassword\n}\n","export const SCHEMA_KIT_VERSION = '0.0.1';\n\nexport * from './classes/schema-field/field-type';\nexport * from './classes/schema-field/schema-builder';\nexport * from './classes/schema-field/schema-field';\n\nexport * from './components/inputs/input-index';\n\nexport * from './components/schema-table/schema-table.component';\nexport * from './components/schema-view/schema-view.component';\nexport * from './components/ui/loading/loading.component';\nexport * from './components/ui/file-preview/file-preview.component';\nexport * from './components/ui/breadcrumbs/breadcrumbs.component';\nexport * from './components/ui/blurry-text-reveal/blurry-text-reveal.component';\nexport * from './components/ui/suspended-slider/suspended-slider.component';\nexport * from './components/ui/suspended-slider/suspended-slide.directive';\nexport * from './components/ui/save-button/save-button.component';\nexport * from './components/ui/tree-drag-drop/tree-drag-drop.component';\nexport * from './components/ui/tree-drag-drop/tree-drag-drop-node.directive';\nexport * from './components/ui/schema-dialog/schema-dialog.component';\nexport * from './components/ui/schema-dialog/schema-dialog-controller.service';\nexport * from './components/inputs/input-color/color-picker/color-picker.component';\nexport * from './components/error-message-provider/error-message-provider.component';\n\nexport * from './components/schema-table/schema-table-actions.directive';\nexport * from './components/schema-table/schema-table-replacement-for.directive';\nexport * from './components/schema-table/schema-table-toolbar.directive';\nexport * from './components/schema-view/schema-view-content.directive';\nexport * from './pipes/has-permissao.pipe';\nexport * from './schema-kit.module';\nexport * from './services/environment.service';\nexport * from './services/id.service';\nexport * from './services/web/schema.service';\n\nexport * from './validators/cnpj.validator';\nexport * from './validators/cpf.validator';\nexport * from './validators/cpf-cnpj.validator';\nexport * from './validators/url.validator';\nexport * from './validators/password.validator';\n\nexport * from './interfaces/index-params';\nexport * from './interfaces/paginated-result';\nexport * from './interfaces/view';"],"mappings":"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"}
1
+ {"version":3,"file":"sapphire-caitlyn-schema-kit-ng.mjs","names":["i2","i2","i2","i2","i2","i2","i2","i2","HEX_REGEX","i2","i2","i2","i2","i2","i2","i2","i2","i3","i2","i2","i2","i2","i3.InputDateSpanComponent","i4.InputDateTimeSpanComponent","i5.InputTimeSpanComponent","i6.InputCpfCnpjComponent","i7.InputIconComponent","i8.InputMaskComponent","i9.InputNumberComponent","i10.InputPhoneComponent","i11.InputSelectComponent","i2","i1","i3","i2","i3.InputDateComponent","i4.InputDateSpanComponent","i5.InputDateTimeComponent","i6.InputDateTimeSpanComponent","i7.InputTimeComponent","i8.InputTimeSpanComponent","i9.InputBoolComponent","i10.InputCpfCnpjComponent","i11.InputFileComponent","i12.InputIconComponent","i13.InputMaskComponent","i14.InputNumberComponent","i15.InputPhoneComponent","i16.InputSelectComponent","i17.InputStringComponent","i18.InputTextAreaComponent","i19.InputJsonComponent","i1","BLACKLIST","STRICT_STRIP_REGEX","LOOSE_STRIP_REGEX","STRICT_MASK_REGEX","strip","format","generate","isValid","isValid","isCpfValid","isCnpjValid","isValid","isValid"],"sources":["../../../projects/schema-kit/src/lib/classes/schema-field/field-type.ts","../../../projects/schema-kit/src/lib/classes/schema-field/schema-field.ts","../../../projects/schema-kit/src/lib/classes/schema-field/schema-builder.ts","../../../projects/schema-kit/src/lib/components/inputs/loading-input/loading-input.component.ts","../../../projects/schema-kit/src/lib/components/inputs/loading-input/loading-input.component.html","../../../projects/schema-kit/src/lib/components/error-message-provider/error-message-provider.component.ts","../../../projects/schema-kit/src/lib/components/error-message-provider/error-message-provider.component.html","../../../projects/schema-kit/src/lib/services/id.service.ts","../../../projects/schema-kit/src/lib/components/inputs/input-base/input-base.component.ts","../../../projects/schema-kit/src/lib/components/inputs/input-base/input-base.component.html","../../../projects/schema-kit/src/lib/components/inputs/date/input-base-date/input-base-date.component.ts","../../../projects/schema-kit/src/lib/components/inputs/date/input-base-date/input-base-date.component.html","../../../projects/schema-kit/src/lib/components/inputs/date/input-date/input-date.component.ts","../../../projects/schema-kit/src/lib/components/inputs/date/input-date/input-date.component.html","../../../projects/schema-kit/src/lib/components/inputs/date/span.ts","../../../projects/schema-kit/src/lib/components/inputs/date/input-date-span/input-date-span.component.ts","../../../projects/schema-kit/src/lib/components/inputs/date/input-date-span/input-date-span.component.html","../../../projects/schema-kit/src/lib/directives/maskito-unmask.directive.ts","../../../projects/schema-kit/src/lib/components/inputs/date/input-date-time/input-date-time.component.ts","../../../projects/schema-kit/src/lib/components/inputs/date/input-date-time/input-date-time.component.html","../../../projects/schema-kit/src/lib/components/inputs/date/input-date-time-span/input-date-time-span.component.ts","../../../projects/schema-kit/src/lib/components/inputs/date/input-date-time-span/input-date-time-span.component.html","../../../projects/schema-kit/src/lib/components/inputs/date/input-base-time/input-base-time.component.ts","../../../projects/schema-kit/src/lib/components/inputs/date/input-base-time/input-base-time.component.html","../../../projects/schema-kit/src/lib/components/inputs/date/input-time/input-time.component.ts","../../../projects/schema-kit/src/lib/components/inputs/date/input-time/input-time.component.html","../../../projects/schema-kit/src/lib/components/inputs/date/input-time-span/input-time-span.component.ts","../../../projects/schema-kit/src/lib/components/inputs/date/input-time-span/input-time-span.component.html","../../../projects/schema-kit/src/lib/components/inputs/input-bool/input-bool.component.ts","../../../projects/schema-kit/src/lib/components/inputs/input-bool/input-bool.component.html","../../../projects/schema-kit/src/lib/components/inputs/input-color/color-picker/color-picker.component.ts","../../../projects/schema-kit/src/lib/components/inputs/input-color/color-picker/color-picker.component.html","../../../projects/schema-kit/src/lib/components/inputs/input-color/input-color.component.ts","../../../projects/schema-kit/src/lib/components/inputs/input-color/input-color.component.html","../../../projects/schema-kit/src/lib/components/inputs/input-cpf-cnpj/input-cpf-cnpj.component.ts","../../../projects/schema-kit/src/lib/components/inputs/input-cpf-cnpj/input-cpf-cnpj.component.html","../../../projects/schema-kit/src/lib/components/ui/loading/loading.component.ts","../../../projects/schema-kit/src/lib/components/ui/loading/loading.component.html","../../../projects/schema-kit/src/lib/components/ui/file-preview/file-preview.component.ts","../../../projects/schema-kit/src/lib/components/ui/file-preview/file-preview.component.html","../../../projects/schema-kit/src/lib/components/inputs/input-file/input-file.component.ts","../../../projects/schema-kit/src/lib/components/inputs/input-file/input-file.component.html","../../../projects/schema-kit/src/lib/components/inputs/input-icon/input-icon.component.ts","../../../projects/schema-kit/src/lib/components/inputs/input-icon/input-icon.component.html","../../../projects/schema-kit/src/lib/components/inputs/input-mask/input-mask.component.ts","../../../projects/schema-kit/src/lib/components/inputs/input-mask/input-mask.component.html","../../../projects/schema-kit/src/lib/components/inputs/input-number/input-number.component.ts","../../../projects/schema-kit/src/lib/components/inputs/input-number/input-number.component.html","../../../projects/schema-kit/src/lib/components/inputs/input-phone/input-phone.component.ts","../../../projects/schema-kit/src/lib/components/inputs/input-phone/input-phone.component.html","../../../projects/schema-kit/src/lib/schema-kit.module.ts","../../../projects/schema-kit/src/lib/services/environment.service.ts","../../../projects/schema-kit/src/lib/components/alert/alert.component.ts","../../../projects/schema-kit/src/lib/components/alert/alert.component.html","../../../projects/schema-kit/src/lib/services/alert.service.ts","../../../projects/schema-kit/src/lib/services/web/schema.service.ts","../../../projects/schema-kit/src/lib/components/inputs/input-select/input-select.component.ts","../../../projects/schema-kit/src/lib/components/inputs/input-select/input-select.component.html","../../../projects/schema-kit/src/lib/components/inputs/input-string/input-string.component.ts","../../../projects/schema-kit/src/lib/components/inputs/input-string/input-string.component.html","../../../projects/schema-kit/src/lib/components/inputs/input-text-area/input-text-area.component.ts","../../../projects/schema-kit/src/lib/components/inputs/input-text-area/input-text-area.component.html","../../../projects/schema-kit/src/lib/components/inputs/input-json/input-json.component.ts","../../../projects/schema-kit/src/lib/components/inputs/input-json/input-json.component.html","../../../projects/schema-kit/src/lib/components/inputs/input-index.ts","../../../projects/schema-kit/src/lib/components/schema-table/schema-table-filter/schema-table-filter.component.ts","../../../projects/schema-kit/src/lib/components/schema-table/schema-table-filter/schema-table-filter.component.html","../../../projects/schema-kit/src/lib/pipes/has-permissao.pipe.ts","../../../projects/schema-kit/src/lib/interfaces/index-params.ts","../../../projects/schema-kit/src/lib/components/schema-table/schema-table-actions.directive.ts","../../../projects/schema-kit/src/lib/components/schema-table/schema-table-replacement-for.directive.ts","../../../projects/schema-kit/src/lib/components/ui/breadcrumbs/breadcrumbs.component.ts","../../../projects/schema-kit/src/lib/components/ui/breadcrumbs/breadcrumbs.component.html","../../../projects/schema-kit/src/lib/components/schema-table/schema-table-toolbar.directive.ts","../../../projects/schema-kit/src/lib/components/schema-table/schema-table.component.ts","../../../projects/schema-kit/src/lib/components/schema-table/schema-table.component.html","../../../projects/schema-kit/src/lib/components/schema-view/schema-view-content.directive.ts","../../../projects/schema-kit/src/lib/components/ui/save-button/save-button.component.ts","../../../projects/schema-kit/src/lib/components/ui/save-button/save-button.component.html","../../../projects/schema-kit/src/lib/components/schema-view/schema-view.component.ts","../../../projects/schema-kit/src/lib/components/schema-view/schema-view.component.html","../../../projects/schema-kit/src/lib/components/ui/blurry-text-reveal/blurry-text-reveal.component.ts","../../../projects/schema-kit/src/lib/components/ui/blurry-text-reveal/blurry-text-reveal.component.html","../../../projects/schema-kit/src/lib/components/ui/suspended-slider/suspended-slide.directive.ts","../../../projects/schema-kit/src/lib/components/ui/suspended-slider/suspended-slider.component.ts","../../../projects/schema-kit/src/lib/components/ui/suspended-slider/suspended-slider.component.html","../../../projects/schema-kit/src/lib/components/ui/tree-drag-drop/tree-drag-drop-node.directive.ts","../../../projects/schema-kit/src/lib/components/ui/tree-drag-drop/tree-drag-drop.utils.ts","../../../projects/schema-kit/src/lib/components/ui/tree-drag-drop/tree-drag-drop.component.ts","../../../projects/schema-kit/src/lib/components/ui/tree-drag-drop/tree-drag-drop.component.html","../../../projects/schema-kit/src/lib/components/ui/schema-dialog/schema-dialog.component.ts","../../../projects/schema-kit/src/lib/components/ui/schema-dialog/schema-dialog.component.html","../../../projects/schema-kit/src/lib/components/ui/schema-dialog/schema-dialog-controller.service.ts","../../../projects/schema-kit/src/lib/utils/field-validator-as-rule.ts","../../../projects/schema-kit/src/lib/validators/cnpj.validator.ts","../../../projects/schema-kit/src/lib/validators/cpf.validator.ts","../../../projects/schema-kit/src/lib/validators/cpf-cnpj.validator.ts","../../../projects/schema-kit/src/lib/validators/url.validator.ts","../../../projects/schema-kit/src/lib/validators/password.validator.ts","../../../projects/schema-kit/src/lib/index.ts"],"sourcesContent":["export enum FieldType {\n UUID = \"UUID\",\n Bool = \"Bool\",\n \n Date = \"Date\",\n DateTime = \"DateTime\",\n Time = \"Time\",\n\n DateSpan = \"DateSpan\",\n DateTimeSpan = \"DateTimeSpan\",\n TimeSpan = \"TimeSpan\",\n \n Mask = \"Mask\",\n\n JSON = \"JSON\",\n Currency = \"Currency\",\n Decimal = \"Decimal\",\n Number = \"Number\",\n \n File = \"File\",\n String = \"String\",\n Phone = \"Phone\",\n TextArea = \"TextArea\",\n Select = \"Select\",\n \n Cpf = \"Cpf\",\n Cnpj = \"Cnpj\",\n CpfCnpj = \"CpfCnpj\",\n Icon = \"Icon\",\n}\nexport const lstDateTypes = [FieldType.Date, FieldType.DateTime, FieldType.Time];","import { PathKind, SchemaPath, SchemaPathRules } from '@angular/forms/signals';\nimport { TemplateRef, Type } from '@angular/core';\nimport { MaskitoOptions } from '@maskito/core';\n\nimport { FieldType } from './field-type';\nimport type { AnySchemaService } from '../../services/web/schema.service';\nimport { IIndexFilter } from '../../interfaces/index-params';\nimport { TBindLabel, TBindValue } from '../../components/inputs/input-select/input-select.component';\n\n/** Regra aplicada ao path de um campo (ex.: `required`, `email`, `cnpjValidator`) */\nexport type FieldRule<Value> = (path: SchemaPath<Value, SchemaPathRules.Supported, PathKind.Child>) => void;\n\nconst DefaultClassOverrideMap: Partial<Record<FieldType, string>> = {\n TextArea: \"col-span-full\",\n}\n\nexport class SchemaField<\n T, \n Key extends keyof T = keyof T, \n Value = T[Key]\n> implements Omit<SchemaFieldOptionsBase<T, Key, Value>, 'hidden' | 'validators'> {\n class : string = \"xl:col-span-3 md:col-span-6 col-span-full\";\n validators: FieldRule<Value>[];\n\n constructor(options: SchemaFieldOptionsBase<T, Key, Value>) {\n this.readonly = options.readonly || false;\n this.type = options.type;\n this.label = options.label;\n this.index = options.index;\n this.defaultValue = options.defaultValue;\n this.listOptions = options.listOptions;\n this.options = options.options;\n this.tooltipInfo = options.tooltipInfo;\n this.placeholder = options.placeholder;\n\n this.validators = [];\n if(options.validators && Array.isArray(options.validators)) {\n this.validators = options.validators;\n } else if(options.validators) {\n this.validators = [options.validators];\n }\n \n\n if(typeof options.hidden === 'boolean') {\n this.hiddenForm = options.hidden;\n this.hiddenList = options.hidden;\n } else {\n this.hiddenForm = options.hidden?.hiddenForm ?? false;\n this.hiddenList = options.hidden?.hiddenList ?? false;\n }\n\n\n\n const defaultClass = DefaultClassOverrideMap[options.type];\n this.class = options.class ?? defaultClass ?? this.class;\n }\n\n readonly: boolean;\n type: FieldType;\n label: string;\n index: Key;\n hiddenList: boolean; \n hiddenForm: boolean; \n listOptions: SchemaFieldOptionsBase<T>['listOptions']\n options?: SchemaFieldAnyTypeOptions<Value>;\n placeholder?: string;\n defaultValue?: Value;\n tooltipInfo?: string;\n}\n\nexport type SchemaFieldOptionsBase<T, Key extends keyof T = keyof T, Value = T[Key]> =\n SchemaFieldOptionsCommon<T, Key, Value> &\n SchemaFieldTypeOptions<Value>;\n\nexport interface SchemaFieldOptionsCommon<\n T, \n Key extends keyof T = keyof T, \n Value = T[Key]\n> {\n /** Classes css para o campo na view (edição) */\n class?: string;\n /** Indica se o campo está desativado */\n readonly?: boolean;\n /** Label do campo */\n label: string;\n /** Nome do campo no objeto para binding */\n index: Key;\n\n defaultValue?: Value;\n /** Validadores do campo */\n validators?: FieldRule<Value> | FieldRule<Value>[] | undefined;\n /** Indica se o campo está oculto */\n hidden?: boolean | {\n hiddenList?: boolean;\n hiddenForm?: boolean;\n };\n\n placeholder?: string;\n\n listOptions?: {\n template?: TemplateRef<unknown> | Type<unknown> |\n ((value: T) => TemplateRef<unknown> | Type<unknown> | string);\n }\n\n /** Tipo do campo */\n type: FieldType;\n\n tooltipInfo?: string;\n}\n\n/** Select alimentado por um `SchemaService` (busca paginada no backend) */\nexport interface SelectServiceOptions {\n service: () => AnySchemaService;\n lstFilter?: IIndexFilter<any, unknown>[];\n clearable?: boolean;\n lstOptions?: never;\n bindValue?: never;\n bindLabel?: never;\n}\n\n/** Select com lista estática; `bindValue` deve produzir o tipo do campo */\nexport interface SelectStaticOptions<Value, Item = any> {\n lstOptions: readonly Item[];\n bindValue: TBindValue<Item, Value>;\n bindLabel: TBindLabel<Item>;\n clearable?: boolean;\n service?: never;\n lstFilter?: never;\n}\n\n/** Opções específicas de cada tipo de campo, indexadas pelo `FieldType` */\nexport interface SchemaFieldTypeOptionsMap<Value = unknown> {\n [FieldType.String]: {\n type?: HTMLInputElement['type'];\n };\n [FieldType.Select]: SelectServiceOptions | SelectStaticOptions<Value>;\n [FieldType.Mask]: {\n maskitoOptions: MaskitoOptions;\n unmaskHandler?: (value: string) => string | null;\n }\n [FieldType.File]: {\n clearable?: boolean;\n }\n}\n\n/** União discriminada por `type`: `options` só é aceito nos tipos presentes em `SchemaFieldTypeOptionsMap` */\nexport type SchemaFieldTypeOptions<Value = unknown> = {\n [F in FieldType]: {\n type: F;\n options?: F extends keyof SchemaFieldTypeOptionsMap ? SchemaFieldTypeOptionsMap<Value>[F] : never;\n };\n}[FieldType];\n\ntype AllKeys<U> = U extends unknown ? keyof U : never;\n\n/** Une todas as variantes de `U` num único objeto com todas as chaves opcionais (ignora as chaves `never`) */\ntype MergeUnion<U> = {\n [K in AllKeys<U>]?: U extends unknown ? (K extends keyof U ? Exclude<U[K], undefined> : never) : never;\n};\n\n/**\n * Todas as opções de todos os tipos, opcionais. Usado no `SchemaField`, onde `options` não é\n * estreitado por `type` (ex.: `@switch (item.type)` no template não estreita `item.options`)\n */\nexport type SchemaFieldAnyTypeOptions<Value = unknown> = MergeUnion<SchemaFieldTypeOptionsMap<Value>[keyof SchemaFieldTypeOptionsMap]>;\n\n/** `Omit` que preserva uniões discriminadas */\nexport type DistributiveOmit<T, K extends PropertyKey> = T extends unknown ? Omit<T, K> : never;\n","import { Injector, signal } from \"@angular/core\";\nimport { FieldTree, form, readonly, schema, Schema } from \"@angular/forms/signals\";\n\nimport { DistributiveOmit, FieldRule, SchemaField, SchemaFieldOptionsBase } from \"./schema-field\";\nimport { FieldType } from \"./field-type\";\n\nexport class SchemaBuilder {\n static build<T>(schema: SchemaFieldOptionsRecord<T>): SchemaField<T>[] {\n return (Object.keys(schema) as (keyof T)[]).map(key => {\n return new SchemaField<T>({\n ...(schema[key] as SchemaFieldOptions<T>),\n index: key,\n });\n });\n }\n\n static createForm<T>(injector: Injector, schema: SchemaFieldOptionsRecord<T>): FieldTree<T> {\n const lstFields = this.build(schema);\n return form(signal(this.defaultValues(lstFields)), this.toSchema<T>(lstFields), { injector: injector });\n }\n\n /** Valor inicial do form: `defaultValue` do campo, ou o padrão do seu `type` */\n static defaultValues<T>(lstFields: SchemaField<T>[]): T {\n const defaultByType: Record<FieldType, unknown> = {\n Date: null,\n DateTime: null,\n Time: null,\n DateSpan: null,\n DateTimeSpan: null,\n TimeSpan: null,\n Mask: null,\n JSON: null,\n Currency: 0,\n Decimal: 0,\n Number: 0,\n Bool: false,\n String: null,\n TextArea: null,\n UUID: null,\n Icon: null,\n File: null,\n Phone: null,\n Select: null,\n Cpf: null,\n Cnpj: null,\n CpfCnpj: null,\n }\n return Object.fromEntries(\n lstFields.map((f) => [f.index, f.defaultValue !== undefined ? f.defaultValue : defaultByType[f.type]])\n ) as unknown as T;\n }\n\n public static toSchema<T>(lstFields: SchemaField<T>[]): Schema<T>{\n const formSchema = schema<T>((path) => {\n for (const field of lstFields) {\n const prop = field.index\n const fieldPath = (path as unknown as Record<keyof T, Parameters<FieldRule<T[keyof T]>>[0]>)[prop];\n if(field.validators.length){\n for (const validator of field.validators) {\n validator(fieldPath)\n }\n }\n if(field.readonly) {\n readonly(fieldPath)\n }\n }\n })\n return formSchema;\n }\n}\n\nexport type SchemaFieldOptions<T, K extends keyof T = keyof T> = DistributiveOmit<SchemaFieldOptionsBase<T, K>, 'index'>;\n\nexport type SchemaFieldOptionsRecord<T> = {\n [K in keyof T]?: SchemaFieldOptions<T, K>;\n};\n","import { CommonModule } from '@angular/common';\nimport { Component, input, InputSignal } from '@angular/core';\n\nimport { HlmSkeletonImports } from '@sapphire-caitlyn/schema-kit-ng/helm';\n\n@Component({\n imports: [\n HlmSkeletonImports,\n CommonModule\n ],\n selector: 'loading-input',\n styleUrl: './loading-input.component.scss',\n templateUrl: './loading-input.component.html',\n})\nexport class LoadingInputComponent {\n loading: InputSignal<boolean> = input<boolean>(false);\n}\n","<div\n class=\"absolute top-0 left-0 size-full\"\n [ngClass]=\"{\n 'animate-in fade-in-0 slide-in-from-left-2': loading(),\n 'animate-out fade-out-0 slide-out-to-left-2 fill-mode-forwards pointer-events-none': !loading()\n }\"\n>\n <hlm-skeleton class=\"size-full\" />\n</div>","import { ValidationError, WithOptionalFieldTree } from '@angular/forms/signals';\nimport { Component, input } from '@angular/core';\n\n@Component({\n imports: [],\n selector: 'error-message-provider',\n styleUrl: './error-message-provider.component.scss',\n templateUrl: './error-message-provider.component.html',\n})\nexport class ErrorMessageProviderComponent {\n /** Erros de validação do campo */\n errors = input<readonly WithOptionalFieldTree<ValidationError>[]>([]);\n /** Indica se o campo é inválido */\n invalid = input<boolean>(false);\n /** Indica se o campo foi tocado */\n touched = input<boolean>(false);\n}\n","@if (invalid() && touched()) {\n <small class=\"text-destructive\">\n @for (item of errors(); track $index) {\n {{ item.message }}\n }\n </small>\n}\n","import { Service } from '@angular/core';\n\n/**\n * Gera ids únicos e sequenciais por prefixo (ex.: `input-1`, `input-2`, ...).\n * Os contadores vivem no serviço root, então cada prefixo é incrementado de forma independente\n * durante todo o ciclo de vida da aplicação.\n */\n@Service()\nexport class IdService {\n private counters = new Map<string, number>();\n\n /**\n * Retorna o próximo id para o prefixo informado.\n * @param prefix O prefixo do id.\n * @returns O id no formato `${prefix}-${n}`.\n */\n next(prefix = 'id'): string {\n const n = (this.counters.get(prefix) ?? 0) + 1;\n this.counters.set(prefix, n);\n return `${prefix}-${n}`;\n }\n}\n","import { Component, computed, inject, input, InputSignal, InputSignalWithTransform, ModelSignal, output, Signal, signal } from '@angular/core';\nimport { FormValueControl, ValidationError, WithOptionalFieldTree } from '@angular/forms/signals';\n\nimport { IdService } from '../../../services/id.service';\n\n@Component({\n imports: [],\n selector: 'lib-input-base',\n styleUrl: './input-base.component.scss',\n templateUrl: './input-base.component.html',\n})\nexport class InputBaseComponent {\n\n /** Label do input */\n label = input<string>('');\n /** Placeholder do input */\n placeholder = input<string | null | undefined>(null);\n /** Indica se o input está em estado de carregamento (Skeleton) */\n loading = input<boolean>(false);\n\n /** Id sequencial do input, usado para vincular label e controle */\n id = signal(inject(IdService).next('input'));\n\n /** Erros de validação (vinculado automaticamente pelo [formField]) */\n errors = input<readonly WithOptionalFieldTree<ValidationError>[]>([]);\n /** Indica se o campo é inválido (vinculado automaticamente pelo [formField]) */\n invalid = input<boolean>(false);\n /** Indica se o campo foi tocado (vinculado automaticamente pelo [formField]) */\n touched = input<boolean>(false);\n /**\n * Emitido quando o usuário termina de interagir com o campo (blur, seleção, limpar).\n * O [formField] escuta este output para marcar o campo como tocado; o estado `touched`\n * pertence ao formulário, então o `reset()` do form também limpa o input.\n */\n touch = output<void>();\n /** Informação para o tooltip */\n tooltipInfo: InputSignal<string | null | undefined> = input<string | null | undefined>(null);\n\n /** Indica se o campo é somente leitura (vinculado automaticamente pelo [formField]) */\n readonly: InputSignal<boolean> = input<boolean>(false);\n /** Indica se o campo está desabilitado (vinculado automaticamente pelo [formField]) */\n disabled: InputSignal<boolean> = input<boolean>(false);\n\n /** Bloqueia a edição do input quando o campo é somente leitura ou está desabilitado */\n isReadonly: Signal<boolean> = computed(() => this.readonly() || this.disabled());\n}\nexport interface IInputBaseComponent {\n label: InputSignal<string>;\n placeholder: InputSignal<string>;\n loading: InputSignal<boolean>;\n}","<p>input-base works!</p>\n","import { Component, computed, input } from '@angular/core';\nimport { DateTime } from 'luxon';\n\nimport { InputBaseComponent } from '../../input-base/input-base.component';\n\n@Component({\n imports: [],\n selector: 'input-base-date',\n styleUrl: './input-base-date.component.scss',\n templateUrl: './input-base-date.component.html',\n})\nexport class InputBaseDateComponent extends InputBaseComponent {\n constructor() {\n super();\n }\n\n /** Data máximă do input */\n maxDate = input<DateTime | null>(null);\n _maxDate = computed(() => this.maxDate()?.toJSDate());\n\n /** Data minima do input */\n minDate = input<DateTime | null>(null);\n _minDate = computed(() => this.minDate()?.toJSDate());\n\n /** Data focada por padrão */\n defaultFocusedDate = input<DateTime>(DateTime.now());\n\n _defaultFocusedDate = computed(() => this.defaultFocusedDate().toJSDate());\n}\n","","import { Component, computed, inject, input, model } from '@angular/core';\nimport { FormValueControl } from '@angular/forms/signals';\nimport { FormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { maskitoDate, MaskitoDateParams } from '@maskito/kit';\nimport { MaskitoDirective } from '@maskito/angular';\nimport { DateTime } from 'luxon';\nimport { MaskitoOptions } from '@maskito/core';\n\nimport { HlmDatePickerImports, HlmFieldImports, HlmTooltipImports } from '@sapphire-caitlyn/schema-kit-ng/helm';\nimport { NgIcon } from '@ng-icons/core';\n\nimport { LoadingInputComponent } from '../../loading-input/loading-input.component';\nimport { ErrorMessageProviderComponent } from '../../../error-message-provider/error-message-provider.component';\nimport { InputBaseDateComponent } from '../input-base-date/input-base-date.component';\n\n@Component({\n imports: [\n\t\tHlmTooltipImports,\n\t\tNgIcon,\n\t\tHlmDatePickerImports, \n\t\tHlmFieldImports, \n\t\tMaskitoDirective,\n\t\tFormsModule,\n CommonModule,\n LoadingInputComponent,\n ErrorMessageProviderComponent\n\t],\n selector: 'input-date',\n styleUrl: './input-date.component.scss',\n templateUrl: './input-date.component.html',\n})\nexport class InputDateComponent extends InputBaseDateComponent implements FormValueControl<string | null | undefined> {\n value = model<string | null | undefined>(null);\n\n\tpublic formatToReadable = (date: Date): string => DateTime.fromJSDate(date).toFormat('dd/MM/yyyy');\n\n\t// parseia o texto digitado no input (formato do maskito), não o value ISO\n\tpublic parseDate = (value: string): Date | null => {\n\t\tconst dt = DateTime.fromFormat(value, 'dd/MM/yyyy');\n\t\treturn dt.isValid ? dt.toJSDate() : null;\n\t};\n\n\t// value é ISO, mas o hlm-date-picker trabalha com Date\n\t// hlm-calendar quebra com null (isSameDay), então usa undefined quando não há data\n\tprotected date = computed(() => {\n\t\tconst value = this.value();\n\t\tif (!value) {\n\t\t\treturn undefined;\n\t\t}\n\t\tconst dt = DateTime.fromISO(value);\n\t\treturn dt.isValid ? dt.toJSDate() : undefined;\n\t});\n\tprotected setDate(date: Date | null) {\n\t\tthis.value.set(date ? DateTime.fromJSDate(date).toISO() : null);\n\t}\n\tprotected maskitoParams = computed<MaskitoDateParams>(() => {\n\t\treturn {\n\t\t\tmode: 'dd/mm/yyyy',\n\t\t\tseparator: '/', // default is '.'\n\t\t};\n\t});\n\tprotected maskitoOptions = computed<MaskitoOptions>(() => {\n\t\tconst params = this.maskitoParams();\n\t\treturn maskitoDate(params);\n\t});\n}\n","<hlm-field [forceInvalid]=\"touched() && invalid()\">\n @if(label()) {\n <label hlmFieldLabel [attr.for]=\"id()\">\n {{label()}}\n\n @if(tooltipInfo()){\n <ng-icon name=\"lucideCircleQuestionMark\" [hlmTooltip]=\"tooltipInfo()!\" position=\"top\"></ng-icon>\n }\n </label>\n }\n <hlm-date-picker\n [disabled]=\"isReadonly()\"\n class=\"relative\" \n captionLayout=\"dropdown\"\n [maxDate]=\"_maxDate()\"\n [minDate]=\"_minDate()\"\n [defaultFocusedDate]=\"_defaultFocusedDate()\"\n [formatDate]=\"formatToReadable\"\n [ngModel]=\"date()\"\n (ngModelChange)=\"setDate($event)\"\n >\n <hlm-date-picker-input\n [inputId]=\"id()\"\n placeholder=\"dd/MM/yyyy\"\n [parseDate]=\"parseDate\"\n [formatInputDate]=\"formatToReadable\"\n [maskito]=\"maskitoOptions()\"\n [forceInvalid]=\"touched() && invalid()\"\n />\n <ng-content select=\"[slot=input]\"></ng-content>\n <loading-input [loading]=\"loading()\"></loading-input>\n </hlm-date-picker>\n\n <error-message-provider [errors]=\"errors()\" [invalid]=\"invalid()\" [touched]=\"touched()\"></error-message-provider>\n</hlm-field>\n","import { effect, inject, untracked } from '@angular/core';\nimport { FieldTree, FormField } from '@angular/forms/signals';\n\n/**\n * Intervalo [início, fim] emitido pelos inputs *-span.\n * Mesmo formato dos filtros Date/DateTime/Time da API (`[min, max]`).\n * - input-date-span / input-date-time-span: ISO com offset, ie: `z.tuple([zExt.dateTime().nullable(), zExt.dateTime().nullable()])`\n * - input-time-span: `HH:mm:ss` (coluna `time` do postgres), ie: `z.tuple([z.iso.time().nullable(), z.iso.time().nullable()])`\n * - filtros Number/Decimal/Currency usam `Span<number>`\n *\n * Cada ponta pode ser null (intervalo aberto); o value inteiro é null quando as duas estão vazias.\n */\nexport type Span<T = string> = [T | null, T | null];\n\n/** Retorna uma cópia do span com a ponta `index` alterada; null quando as duas pontas ficam vazias. */\nexport function setSpanEdge<T = string>(span: Span<T> | null | undefined, index: 0 | 1, value: T | null): Span<T> | null {\n const next: Span<T> = [span?.[0] ?? null, span?.[1] ?? null];\n next[index] = value;\n return next[0] == null && next[1] == null ? null : next;\n}\n\n/**\n * Marca as pontas do span como dirty quando o campo fica dirty. Deve ser chamado no constructor do input.\n * Os inputs *-span trocam a tupla inteira, então o [formField] só marca o nó do campo, e o\n * extractValue({ dirty: true }) desce nos filhos de arrays sem olhar o dirty do nó: o span sumia do patch.\n * Sem [formField] (ex.: ngModel no schema-table-filter) não faz nada.\n */\nexport function markSpanEdgesDirtyOnChange(): void {\n const formField = inject(FormField, { self: true, optional: true });\n if (!formField) {\n return;\n }\n effect(() => {\n const field = formField.field() as unknown as FieldTree<Span<unknown>>;\n const state = field();\n // lê o value para reexecutar quando a tupla é (re)criada; com null não há pontas\n if (!state.dirty() || !Array.isArray(state.value())) {\n return;\n }\n untracked(() => {\n field[0]?.().markAsDirty();\n field[1]?.().markAsDirty();\n });\n });\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, computed, model } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { FormValueControl } from '@angular/forms/signals';\nimport { MaskitoDirective } from '@maskito/angular';\nimport { MaskitoOptions } from '@maskito/core';\nimport { maskitoDateRange, MaskitoDateRangeParams } from '@maskito/kit';\nimport { DateTime } from 'luxon';\n\nimport { HlmDatePickerImports, HlmFieldImports, HlmTooltipImports } from '@sapphire-caitlyn/schema-kit-ng/helm';\nimport { NgIcon } from '@ng-icons/core';\n\nimport { LoadingInputComponent } from '../../loading-input/loading-input.component';\nimport { ErrorMessageProviderComponent } from '../../../error-message-provider/error-message-provider.component';\nimport { InputBaseDateComponent } from '../input-base-date/input-base-date.component';\nimport { markSpanEdgesDirtyOnChange, Span } from '../span';\n\nconst DATE_FORMAT = 'dd/MM/yyyy';\nconst RANGE_SEPARATOR = ' - ';\n\n@Component({\n imports: [\n HlmTooltipImports,\n NgIcon,\n HlmDatePickerImports,\n HlmFieldImports,\n MaskitoDirective,\n FormsModule,\n CommonModule,\n LoadingInputComponent,\n ErrorMessageProviderComponent,\n ],\n selector: 'input-date-span',\n styleUrl: './input-date-span.component.scss',\n templateUrl: './input-date-span.component.html',\n})\nexport class InputDateSpanComponent extends InputBaseDateComponent implements FormValueControl<Span | null | undefined> {\n /** Intervalo [início, fim] em ISO (00:00 do dia, igual ao input-date) */\n value = model<Span | null | undefined>(null);\n\n constructor() {\n super();\n markSpanEdgesDirtyOnChange();\n }\n\n public formatDates = (dates: [Date | null, Date | null]): string =>\n dates\n .filter((date): date is Date => !!date)\n .map((date) => DateTime.fromJSDate(date).toFormat(DATE_FORMAT))\n .join(RANGE_SEPARATOR);\n\n // parseia o texto digitado no input (formato do maskito), não o value ISO\n // uma data só vira um intervalo de um dia; datas invertidas são ordenadas\n public parseDates = (value: string): [Date, Date] | null => {\n const parts = value.split(RANGE_SEPARATOR).map((part) => DateTime.fromFormat(part.trim(), DATE_FORMAT));\n if (parts.length > 2 || parts.some((dt) => !dt.isValid)) {\n return null;\n }\n const [start, end = start] = parts;\n return start <= end ? [start.toJSDate(), end.toJSDate()] : [end.toJSDate(), start.toJSDate()];\n };\n\n // value é ISO, mas o hlm-date-range-picker trabalha com Date\n // o picker só emite intervalos completos, então só repassa quando as duas pontas são válidas\n protected dates = computed<[Date, Date] | undefined>(() => {\n const [start, end] = (this.value() ?? []).map((v) => (v ? DateTime.fromISO(v) : null));\n if (!start?.isValid || !end?.isValid) {\n return undefined;\n }\n return [start.toJSDate(), end.toJSDate()];\n });\n protected setDates(dates: [Date, Date] | null) {\n this.value.set(dates ? [DateTime.fromJSDate(dates[0]).toISO(), DateTime.fromJSDate(dates[1]).toISO()] : null);\n }\n\n protected maskitoParams = computed<MaskitoDateRangeParams>(() => {\n return {\n mode: 'dd/mm/yyyy',\n dateSeparator: '/',\n rangeSeparator: RANGE_SEPARATOR,\n min: this._minDate(),\n max: this._maxDate(),\n };\n });\n protected maskitoOptions = computed<MaskitoOptions>(() => {\n return maskitoDateRange(this.maskitoParams());\n });\n}\n","<hlm-field [forceInvalid]=\"touched() && invalid()\">\n @if(label()) {\n <label hlmFieldLabel [attr.for]=\"id()\">\n {{label()}}\n\n @if(tooltipInfo()){\n <ng-icon name=\"lucideCircleQuestionMark\" [hlmTooltip]=\"tooltipInfo()!\" position=\"top\"></ng-icon>\n }\n </label>\n }\n <hlm-date-range-picker\n [disabled]=\"isReadonly()\"\n class=\"relative\"\n captionLayout=\"dropdown\"\n [maxDate]=\"_maxDate()\"\n [minDate]=\"_minDate()\"\n [formatDates]=\"formatDates\"\n [ngModel]=\"dates()\"\n (ngModelChange)=\"setDates($event)\"\n >\n <hlm-date-range-input\n [inputId]=\"id()\"\n [placeholder]=\"placeholder() || 'dd/MM/yyyy - dd/MM/yyyy'\"\n [parseDate]=\"parseDates\"\n [formatInputDates]=\"formatDates\"\n [maskito]=\"maskitoOptions()\"\n [forceInvalid]=\"touched() && invalid()\"\n (focusout)=\"touch.emit()\"\n />\n <ng-content select=\"[slot=input]\"></ng-content>\n <loading-input [loading]=\"loading()\"></loading-input>\n </hlm-date-range-picker>\n\n <error-message-provider [errors]=\"errors()\" [invalid]=\"invalid()\" [touched]=\"touched()\"></error-message-provider>\n</hlm-field>\n","import { AfterViewInit, Directive, inject, input } from '@angular/core';\nimport { DefaultValueAccessor } from '@angular/forms';\nimport { MaskitoDirective } from '@maskito/angular';\nimport { maskitoTransform } from '@maskito/core';\n\n// Baseado na receita \"Custom unmask handler\" da doc do Maskito (https://maskito.dev/frameworks/angular):\n// o model recebe o valor sem máscara e valores programáticos são exibidos mascarados\n@Directive({\n selector: '[maskito][unmaskHandler]',\n})\nexport class MaskitoUnmaskDirective implements AfterViewInit {\n private readonly accessor = inject(DefaultValueAccessor);\n private readonly maskitoDirective = inject(MaskitoDirective);\n\n unmaskHandler = input.required<(value: string) => any>();\n\n stringifyHandler = input<(value: any) => string>((value) => {\n const options = this.maskitoDirective.options();\n\n return options && value != null ? maskitoTransform(String(value), options) : (value ?? '');\n });\n\n ngAfterViewInit(): void {\n const originalOnChange = this.accessor.onChange.bind(this.accessor);\n const originalWriteValue = this.accessor.writeValue.bind(this.accessor);\n\n this.accessor.onChange = (value) => originalOnChange(this.unmaskHandler()(value));\n this.accessor.writeValue = (value) => originalWriteValue(this.stringifyHandler()(value));\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, computed, inject, input, model, Signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { FormValueControl } from '@angular/forms/signals';\nimport { MaskitoDirective } from '@maskito/angular';\nimport { MaskitoOptions } from '@maskito/core';\nimport { maskitoDate, MaskitoDateParams, maskitoDateTime, MaskitoDateTimeParams, maskitoTime, MaskitoTimeParams } from '@maskito/kit';\nimport { DateTime } from 'luxon';\n\nimport { NgIcon } from '@ng-icons/core';\nimport {\n HlmButton,\n HlmButtonImports,\n HlmCalendarImports,\n HlmDatePickerImports,\n HlmFieldImports,\n HlmInputImports,\n HlmInputGroupImports,\n HlmPopoverImports,\n HlmTooltipImports,\n} from '@sapphire-caitlyn/schema-kit-ng/helm';\n\nimport { MaskitoUnmaskDirective } from '../../../../directives/maskito-unmask.directive';\nimport { LoadingInputComponent } from '../../loading-input/loading-input.component';\nimport { ErrorMessageProviderComponent } from '../../../error-message-provider/error-message-provider.component';\nimport { InputBaseDateComponent } from '../input-base-date/input-base-date.component';\n\n@Component({\n imports: [\n HlmTooltipImports,\n HlmDatePickerImports,\n HlmInputImports,\n HlmInputGroupImports,\n HlmFieldImports,\n\t\tHlmButtonImports,\n MaskitoDirective,\n MaskitoUnmaskDirective,\n FormsModule,\n CommonModule,\n HlmPopoverImports,\n HlmCalendarImports,\n LoadingInputComponent,\n ErrorMessageProviderComponent,\n NgIcon,\n HlmButton\n],\n selector: 'input-date-time',\n styleUrl: './input-date-time.component.scss',\n templateUrl: './input-date-time.component.html',\n})\nexport class InputDateTimeComponent extends InputBaseDateComponent implements FormValueControl<string | null | undefined> {\n value = model<string | null | undefined>(null);\n\n /** Input que define se os segundos devem ser considerados. */\n enableSeconds = input<boolean>(true);\n\n\tprotected formatDate = (date: Date): string => DateTime.fromJSDate(date).toFormat('dd/MM/yyyy');\n\tprotected formatInputDate = (date: Date): string => DateTime.fromJSDate(date).toFormat('dd/MM/yyyy');\n\tprotected parseDate = (value: string): Date | null => {\n\t\tconst dt = DateTime.fromFormat(value, 'dd/MM/yyyy');\n\t\treturn dt.isValid ? dt.toJSDate() : null;\n\t};\n\n protected timeParams: Signal<MaskitoTimeParams> = computed(() => {\n return {\n mode: this.enableSeconds() ? 'HH:MM:SS' : 'HH:MM',\n }\n })\n protected timeMaskitoOptions: Signal<MaskitoOptions> = computed(() => {\n return maskitoTime(this.timeParams());\n })\n protected timePlaceholder: Signal<string> = computed(() => {\n return this.enableSeconds() ? 'HH:MM:SS' : 'HH:MM';\n })\n\n protected dateParams: Signal<MaskitoDateParams> = computed(() => {\n return {\n mode: 'dd/mm/yyyy',\n separator: '/',\n minDate: this._minDate(),\n maxDate: this._maxDate(),\n }\n })\n protected dateMaskitoOptions: Signal<MaskitoOptions> = computed(() => {\n return maskitoDate(this.dateParams());\n })\n protected dateTimeParams: Signal<MaskitoDateTimeParams> = computed(() => {\n const params: MaskitoDateTimeParams = {\n dateMode: this.dateParams().mode,\n dateSeparator: '/',\n dateTimeSeparator: ' ',\n timeMode: this.timeParams().mode,\n min: this._minDate() ?? undefined,\n max: this._maxDate() ?? undefined,\n }\n return params;\n })\n protected dateTimeMaskitoOptions: Signal<MaskitoOptions> = computed(() => {\n return maskitoDateTime(this.dateTimeParams());\n })\n\n // hlm-calendar quebra com null (isSameDay), então usa undefined quando não há data\n date = computed(() => this.dateTimeValue()?.toJSDate() ?? undefined);\n setDate(date: Date | null) {\n if (!date) {\n this.value.set(null);\n return;\n }\n // luxon é imutável: set() retorna uma nova instância\n const dt = DateTime.fromJSDate(date).set({\n hour: this.dateTimeValue()?.hour ?? 0,\n minute: this.dateTimeValue()?.minute ?? 0,\n second: this.dateTimeValue()?.second ?? 0,\n });\n this.value.set(dt.toISO());\n }\n\n // formato luxon equivalente ao timeMaskitoOptions\n private timeFormat = computed(() => this.enableSeconds() ? 'HH:mm:ss' : 'HH:mm');\n\n time = computed(() => this.dateTimeValue()?.toFormat(this.timeFormat()) ?? '');\n setTime(time: string) {\n // enquanto digita o maskito emite valores parciais; só aplica quando o horário estiver completo\n const parsed = DateTime.fromFormat(time, this.timeFormat());\n if (!parsed.isValid) {\n return;\n }\n const base = this.dateTimeValue() ?? DateTime.now().startOf('day');\n const dt = base.set({\n hour: parsed.hour,\n minute: parsed.minute,\n second: this.enableSeconds() ? parsed.second : base.second,\n });\n this.value.set(dt.toISO());\n }\n\n // value é sempre ISO (setDate, setTime e unmask gravam ISO)\n private dateTimeValue = computed(() => {\n const value = this.value();\n if (!value) {\n return null;\n }\n const dt = DateTime.fromISO(value);\n return dt.isValid ? dt : null;\n });\n\n // formato luxon equivalente ao dateTimeMaskitoOptions\n private displayFormat = computed(() => \n this.enableSeconds() ? 'dd/MM/yyyy HH:mm:ss' : 'dd/MM/yyyy HH:mm'\n );\n\n unmask = (masked: string): string | null => {\n if (!masked) {\n return null;\n }\n const dt = DateTime.fromFormat(masked, this.displayFormat());\n return dt.isValid ? dt.toISO() : null;\n }\n\n // value chega como ISO; sem isso o maskito tenta mascarar a string ISO crua\n stringify = (value: string | null | undefined): string => {\n if (!value) {\n return '';\n }\n const dt = DateTime.fromISO(value);\n return dt.isValid ? dt.toFormat(this.displayFormat()) : '';\n }\n\n clear(){\n this.value.set(null);\n }\n}","<hlm-field [forceInvalid]=\"touched() && invalid()\">\n @if(label()) {\n <label hlmFieldLabel [attr.for]=\"id()\">\n {{label()}}\n\n @if(tooltipInfo()){\n <ng-icon name=\"lucideCircleQuestionMark\" [hlmTooltip]=\"tooltipInfo()!\" position=\"top\"></ng-icon>\n }\n </label>\n }\n <hlm-popover [attachTo]=\"inputGroup\">\n <hlm-input-group #inputGroup class=\"relative\">\n <input \n hlmInputGroupInput\n [(ngModel)]=\"value\"\n [disabled]=\"isReadonly()\"\n [attr.id]=\"id()\"\n hlmPopoverTrigger \n type=\"text\" \n [maskito]=\"dateTimeMaskitoOptions()\"\n [unmaskHandler]=\"unmask\"\n [stringifyHandler]=\"stringify\"\n [placeholder]=\"placeholder() || ''\"\n />\n <hlm-input-group-addon align=\"inline-end\">\n @if(value() && !isReadonly()){\n <button\n hlmInputGroupButton\n size=\"icon-xs\"\n variant=\"ghost\"\n (click)=\"clear()\"\n >\n <ng-icon name=\"lucideCircleX\" />\n </button>\n }\n </hlm-input-group-addon>\n <hlm-input-group-addon align=\"inline-end\">\n <button\n hlmPopoverTrigger\n hlmInputGroupButton\n size=\"icon-xs\"\n [disabled]=\"isReadonly()\"\n >\n <ng-icon name=\"lucideCalendar\" />\n </button>\n </hlm-input-group-addon>\n\n <loading-input [loading]=\"loading()\"></loading-input>\n </hlm-input-group>\n\n <hlm-popover-content class=\"w-fit p-0\" *hlmPopoverPortal=\"let ctx\">\n <div class=\"flex flex-col gap-2 overflow-hidden\">\n <hlm-calendar\n captionLayout=\"dropdown\"\n [max]=\"_maxDate()\"\n [min]=\"_minDate()\"\n class=\"rounded-none border-0\"\n [date]=\"date()\"\n (dateChange)=\"setDate($event)\"\n />\n <div class=\"p-1\">\n <div hlmField>\n <input\n hlmInput\n type=\"text\"\n [ngModel]=\"time()\"\n (ngModelChange)=\"setTime($event)\"\n [placeholder]=\"timePlaceholder()\"\n [maskito]=\"timeMaskitoOptions()\"\n />\n </div>\n </div>\n </div>\n <ng-content select=\"[hlmDatePickerFooter]\" />\n </hlm-popover-content>\n </hlm-popover>\n\n <error-message-provider [errors]=\"errors()\" [invalid]=\"invalid()\" [touched]=\"touched()\"></error-message-provider>\n</hlm-field>\n","import { CommonModule } from '@angular/common';\nimport { Component, computed, input, model, Signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { FormValueControl } from '@angular/forms/signals';\nimport { MaskitoDirective } from '@maskito/angular';\nimport { MaskitoOptions } from '@maskito/core';\nimport { maskitoDateTime, MaskitoDateTimeParams, maskitoTime, MaskitoTimeParams } from '@maskito/kit';\nimport { DateTime } from 'luxon';\n\nimport { NgIcon } from '@ng-icons/core';\nimport {\n HlmButtonImports,\n HlmCalendarImports,\n HlmFieldImports,\n HlmInputImports,\n HlmInputGroupImports,\n HlmPopoverImports,\n HlmTooltipImports,\n} from '@sapphire-caitlyn/schema-kit-ng/helm';\n\nimport { MaskitoUnmaskDirective } from '../../../../directives/maskito-unmask.directive';\nimport { LoadingInputComponent } from '../../loading-input/loading-input.component';\nimport { ErrorMessageProviderComponent } from '../../../error-message-provider/error-message-provider.component';\nimport { InputBaseDateComponent } from '../input-base-date/input-base-date.component';\nimport { markSpanEdgesDirtyOnChange, setSpanEdge, Span } from '../span';\n\n@Component({\n imports: [\n HlmTooltipImports,\n HlmInputImports,\n HlmInputGroupImports,\n HlmFieldImports,\n HlmButtonImports,\n MaskitoDirective,\n MaskitoUnmaskDirective,\n FormsModule,\n CommonModule,\n HlmPopoverImports,\n HlmCalendarImports,\n LoadingInputComponent,\n ErrorMessageProviderComponent,\n NgIcon,\n ],\n selector: 'input-date-time-span',\n styleUrl: './input-date-time-span.component.scss',\n templateUrl: './input-date-time-span.component.html',\n})\nexport class InputDateTimeSpanComponent extends InputBaseDateComponent implements FormValueControl<Span | null | undefined> {\n /** Intervalo [início, fim] em ISO com offset (timestamptz) */\n value = model<Span | null | undefined>(null);\n\n constructor() {\n super();\n markSpanEdgesDirtyOnChange();\n }\n\n /** Input que define se os segundos devem ser considerados. */\n enableSeconds = input<boolean>(true);\n\n protected timeParams: Signal<MaskitoTimeParams> = computed(() => {\n return {\n mode: this.enableSeconds() ? 'HH:MM:SS' : 'HH:MM',\n }\n })\n protected timeMaskitoOptions: Signal<MaskitoOptions> = computed(() => {\n return maskitoTime(this.timeParams());\n })\n protected timePlaceholder: Signal<string> = computed(() => {\n return this.enableSeconds() ? 'HH:MM:SS' : 'HH:MM';\n })\n\n protected dateTimeParams: Signal<MaskitoDateTimeParams> = computed(() => {\n return {\n dateMode: 'dd/mm/yyyy',\n dateSeparator: '/',\n dateTimeSeparator: ' ',\n timeMode: this.timeParams().mode,\n min: this._minDate() ?? undefined,\n max: this._maxDate() ?? undefined,\n }\n })\n protected dateTimeMaskitoOptions: Signal<MaskitoOptions> = computed(() => {\n return maskitoDateTime(this.dateTimeParams());\n })\n protected dateTimePlaceholder: Signal<string> = computed(() => {\n return `dd/MM/yyyy ${this.timePlaceholder()}`;\n })\n\n // value é sempre ISO (setDate, setTime e unmask gravam ISO)\n private edges = computed(() => {\n const [start, end] = this.value() ?? [null, null];\n return [this.parseIso(start), this.parseIso(end)] as const;\n });\n\n // hlm-calendar-range quebra com null, então usa undefined quando não há data\n protected startDate = computed(() => this.edges()[0]?.toJSDate() ?? undefined);\n protected endDate = computed(() => this.edges()[1]?.toJSDate() ?? undefined);\n\n // formato luxon equivalente ao timeMaskitoOptions\n private timeFormat = computed(() => this.enableSeconds() ? 'HH:mm:ss' : 'HH:mm');\n\n protected startTime = computed(() => this.edges()[0]?.toFormat(this.timeFormat()) ?? '');\n protected endTime = computed(() => this.edges()[1]?.toFormat(this.timeFormat()) ?? '');\n\n setEdge(index: 0 | 1, iso: string | null) {\n this.value.set(setSpanEdge(this.value(), index, iso));\n }\n\n // ao iniciar uma nova seleção o calendário emite undefined para o fim\n setDate(index: 0 | 1, date: Date | undefined) {\n if (!date) {\n this.setEdge(index, null);\n return;\n }\n const current = this.edges()[index];\n // luxon é imutável: set() retorna uma nova instância\n const dt = DateTime.fromJSDate(date).set({\n hour: current?.hour ?? 0,\n minute: current?.minute ?? 0,\n second: current?.second ?? 0,\n });\n this.setEdge(index, dt.toISO());\n }\n\n setTime(index: 0 | 1, time: string) {\n // enquanto digita o maskito emite valores parciais; só aplica quando o horário estiver completo\n const parsed = DateTime.fromFormat(time, this.timeFormat());\n if (!parsed.isValid) {\n return;\n }\n const base = this.edges()[index] ?? DateTime.now().startOf('day');\n const dt = base.set({\n hour: parsed.hour,\n minute: parsed.minute,\n second: this.enableSeconds() ? parsed.second : base.second,\n });\n this.setEdge(index, dt.toISO());\n }\n\n private parseIso(value: string | null): DateTime | null {\n if (!value) {\n return null;\n }\n const dt = DateTime.fromISO(value);\n return dt.isValid ? dt : null;\n }\n\n // formato luxon equivalente ao dateTimeMaskitoOptions\n private displayFormat = computed(() =>\n this.enableSeconds() ? 'dd/MM/yyyy HH:mm:ss' : 'dd/MM/yyyy HH:mm'\n );\n\n unmask = (masked: string): string | null => {\n if (!masked) {\n return null;\n }\n const dt = DateTime.fromFormat(masked, this.displayFormat());\n return dt.isValid ? dt.toISO() : null;\n }\n\n // value chega como ISO; sem isso o maskito tenta mascarar a string ISO crua\n stringify = (value: string | null | undefined): string => {\n if (!value) {\n return '';\n }\n const dt = DateTime.fromISO(value);\n return dt.isValid ? dt.toFormat(this.displayFormat()) : '';\n }\n\n clear() {\n this.value.set(null);\n this.touch.emit();\n }\n}\n","<hlm-field [forceInvalid]=\"touched() && invalid()\">\n @if(label()) {\n <label hlmFieldLabel [attr.for]=\"id()\">\n {{label()}}\n\n @if(tooltipInfo()){\n <ng-icon name=\"lucideCircleQuestionMark\" [hlmTooltip]=\"tooltipInfo()!\" position=\"top\"></ng-icon>\n }\n </label>\n }\n <hlm-popover [attachTo]=\"inputGroup\">\n <hlm-input-group #inputGroup class=\"relative\">\n <!-- \"?? null\": undefined faria o ngModel reescrever (e apagar) o texto incompleto que está sendo digitado -->\n <input\n hlmInputGroupInput\n [ngModel]=\"value()?.[0] ?? null\"\n (ngModelChange)=\"setEdge(0, $event)\"\n [disabled]=\"isReadonly()\"\n [attr.id]=\"id()\"\n type=\"text\"\n [maskito]=\"dateTimeMaskitoOptions()\"\n [unmaskHandler]=\"unmask\"\n [stringifyHandler]=\"stringify\"\n [placeholder]=\"placeholder() || dateTimePlaceholder()\"\n [forceInvalid]=\"touched() && invalid()\"\n (blur)=\"touch.emit()\"\n />\n <span hlmInputGroupText>–</span>\n <input\n hlmInputGroupInput\n [ngModel]=\"value()?.[1] ?? null\"\n (ngModelChange)=\"setEdge(1, $event)\"\n [disabled]=\"isReadonly()\"\n type=\"text\"\n [maskito]=\"dateTimeMaskitoOptions()\"\n [unmaskHandler]=\"unmask\"\n [stringifyHandler]=\"stringify\"\n [placeholder]=\"placeholder() || dateTimePlaceholder()\"\n [forceInvalid]=\"touched() && invalid()\"\n (blur)=\"touch.emit()\"\n />\n <hlm-input-group-addon align=\"inline-end\">\n @if(value() && !isReadonly()){\n <button\n hlmInputGroupButton\n size=\"icon-xs\"\n variant=\"ghost\"\n (click)=\"clear()\"\n >\n <ng-icon name=\"lucideCircleX\" />\n </button>\n }\n </hlm-input-group-addon>\n <hlm-input-group-addon align=\"inline-end\">\n <button\n hlmPopoverTrigger\n hlmInputGroupButton\n size=\"icon-xs\"\n [disabled]=\"isReadonly()\"\n >\n <ng-icon name=\"lucideCalendar\" />\n </button>\n </hlm-input-group-addon>\n\n <loading-input [loading]=\"loading()\"></loading-input>\n </hlm-input-group>\n\n <hlm-popover-content class=\"w-fit p-0\" *hlmPopoverPortal=\"let ctx\">\n <div class=\"flex flex-col gap-2 overflow-hidden\">\n <hlm-calendar-range\n captionLayout=\"dropdown\"\n [max]=\"_maxDate()\"\n [min]=\"_minDate()\"\n class=\"rounded-none border-0\"\n [startDate]=\"startDate()\"\n [endDate]=\"endDate()\"\n (startDateChange)=\"setDate(0, $event)\"\n (endDateChange)=\"setDate(1, $event)\"\n />\n <div class=\"grid grid-cols-1 gap-2 p-1\">\n <hlm-field [forceInvalid]=\"touched() && invalid()\">\n <label hlmFieldLabel [attr.for]=\"id()+'-start'\">Horário inicial</label>\n <input\n hlmInput\n type=\"text\"\n [id]=\"id()+'-start'\"\n aria-label=\"Horário inicial\"\n [ngModel]=\"startTime()\"\n (ngModelChange)=\"setTime(0, $event)\"\n [placeholder]=\"timePlaceholder()\"\n [maskito]=\"timeMaskitoOptions()\"\n /> \n </hlm-field>\n <hlm-field [forceInvalid]=\"touched() && invalid()\">\n <label hlmFieldLabel [attr.for]=\"id()+'-end'\">Horário final</label>\n <input\n hlmInput\n type=\"text\"\n [id]=\"id()+'-end'\"\n aria-label=\"Horário final\"\n [ngModel]=\"endTime()\"\n (ngModelChange)=\"setTime(1, $event)\"\n [placeholder]=\"timePlaceholder()\"\n [maskito]=\"timeMaskitoOptions()\"\n />\n </hlm-field>\n </div>\n </div>\n <ng-content select=\"[hlmDatePickerFooter]\" />\n </hlm-popover-content>\n </hlm-popover>\n\n <error-message-provider [errors]=\"errors()\" [invalid]=\"invalid()\" [touched]=\"touched()\"></error-message-provider>\n</hlm-field>\n","import { Component, computed, input, Signal } from '@angular/core';\nimport { MaskitoOptions } from '@maskito/core';\nimport { maskitoTime, MaskitoTimeParams } from '@maskito/kit';\nimport { DateTime } from 'luxon';\n\nimport { InputBaseComponent } from '../../input-base/input-base.component';\n\n/** Formato do value: coluna `time` do postgres e aceito por `z.iso.time()` */\nexport const TIME_VALUE_FORMAT = 'HH:mm:ss';\n\n@Component({\n imports: [],\n selector: 'input-base-time',\n styleUrl: './input-base-time.component.scss',\n templateUrl: './input-base-time.component.html',\n})\nexport class InputBaseTimeComponent extends InputBaseComponent {\n constructor() {\n super();\n }\n\n /** Input que define se os segundos devem ser considerados. */\n enableSeconds = input<boolean>(true);\n\n protected timeParams: Signal<MaskitoTimeParams> = computed(() => {\n return {\n mode: this.enableSeconds() ? 'HH:MM:SS' : 'HH:MM',\n }\n })\n protected timeMaskitoOptions: Signal<MaskitoOptions> = computed(() => {\n return maskitoTime(this.timeParams());\n })\n protected timePlaceholder: Signal<string> = computed(() => {\n return this.enableSeconds() ? 'HH:MM:SS' : 'HH:MM';\n })\n\n // formato luxon equivalente ao timeMaskitoOptions\n private displayFormat = computed(() => this.enableSeconds() ? 'HH:mm:ss' : 'HH:mm');\n\n // value é sempre HH:mm:ss, mesmo com enableSeconds desligado (segundos = 00)\n unmask = (masked: string): string | null => {\n if (!masked) {\n return null;\n }\n const dt = DateTime.fromFormat(masked, this.displayFormat());\n return dt.isValid ? dt.toFormat(TIME_VALUE_FORMAT) : null;\n }\n\n // fromISO aceita HH:mm, HH:mm:ss e HH:mm:ss.SSS (o postgres pode devolver com fração)\n stringify = (value: string | null | undefined): string => {\n if (!value) {\n return '';\n }\n const dt = DateTime.fromISO(value);\n return dt.isValid ? dt.toFormat(this.displayFormat()) : '';\n }\n}\n","","import { CommonModule } from '@angular/common';\nimport { Component, model } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { FormValueControl } from '@angular/forms/signals';\nimport { MaskitoDirective } from '@maskito/angular';\n\nimport { NgIcon } from '@ng-icons/core';\nimport {\n HlmButtonImports,\n HlmFieldImports,\n HlmInputGroupImports,\n HlmTooltipImports,\n} from '@sapphire-caitlyn/schema-kit-ng/helm';\n\nimport { MaskitoUnmaskDirective } from '../../../../directives/maskito-unmask.directive';\nimport { LoadingInputComponent } from '../../loading-input/loading-input.component';\nimport { ErrorMessageProviderComponent } from '../../../error-message-provider/error-message-provider.component';\nimport { InputBaseTimeComponent } from '../input-base-time/input-base-time.component';\n\n@Component({\n imports: [\n HlmTooltipImports,\n HlmInputGroupImports,\n HlmFieldImports,\n HlmButtonImports,\n MaskitoDirective,\n MaskitoUnmaskDirective,\n FormsModule,\n CommonModule,\n LoadingInputComponent,\n ErrorMessageProviderComponent,\n NgIcon,\n ],\n selector: 'input-time',\n styleUrl: './input-time.component.scss',\n templateUrl: './input-time.component.html',\n})\nexport class InputTimeComponent extends InputBaseTimeComponent implements FormValueControl<string | null | undefined> {\n /** Horário no formato HH:mm:ss */\n value = model<string | null | undefined>(null);\n\n clear() {\n this.value.set(null);\n this.touch.emit();\n }\n}\n","<hlm-field [forceInvalid]=\"touched() && invalid()\">\n @if(label()) {\n <label hlmFieldLabel [attr.for]=\"id()\">\n {{label()}}\n\n @if(tooltipInfo()){\n <ng-icon name=\"lucideCircleQuestionMark\" [hlmTooltip]=\"tooltipInfo()!\" position=\"top\"></ng-icon>\n }\n </label>\n }\n <hlm-input-group class=\"relative\">\n <input\n hlmInputGroupInput\n [(ngModel)]=\"value\"\n [disabled]=\"isReadonly()\"\n [attr.id]=\"id()\"\n type=\"text\"\n inputmode=\"numeric\"\n [maskito]=\"timeMaskitoOptions()\"\n [unmaskHandler]=\"unmask\"\n [stringifyHandler]=\"stringify\"\n [placeholder]=\"placeholder() || timePlaceholder()\"\n [forceInvalid]=\"touched() && invalid()\"\n (blur)=\"touch.emit()\"\n />\n <hlm-input-group-addon align=\"inline-end\">\n @if(value() && !isReadonly()){\n <button\n hlmInputGroupButton\n size=\"icon-xs\"\n variant=\"ghost\"\n (click)=\"clear()\"\n >\n <ng-icon name=\"lucideCircleX\" />\n </button>\n }\n </hlm-input-group-addon>\n <hlm-input-group-addon align=\"inline-end\">\n <ng-icon name=\"lucideClock\" />\n </hlm-input-group-addon>\n\n <loading-input [loading]=\"loading()\"></loading-input>\n </hlm-input-group>\n\n <error-message-provider [errors]=\"errors()\" [invalid]=\"invalid()\" [touched]=\"touched()\"></error-message-provider>\n</hlm-field>\n","import { CommonModule } from '@angular/common';\nimport { Component, model } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { FormValueControl } from '@angular/forms/signals';\nimport { MaskitoDirective } from '@maskito/angular';\n\nimport { NgIcon } from '@ng-icons/core';\nimport {\n HlmButtonImports,\n HlmFieldImports,\n HlmInputGroupImports,\n HlmTooltipImports,\n} from '@sapphire-caitlyn/schema-kit-ng/helm';\n\nimport { MaskitoUnmaskDirective } from '../../../../directives/maskito-unmask.directive';\nimport { LoadingInputComponent } from '../../loading-input/loading-input.component';\nimport { ErrorMessageProviderComponent } from '../../../error-message-provider/error-message-provider.component';\nimport { InputBaseTimeComponent } from '../input-base-time/input-base-time.component';\nimport { markSpanEdgesDirtyOnChange, setSpanEdge, Span } from '../span';\n\n@Component({\n imports: [\n HlmTooltipImports,\n HlmInputGroupImports,\n HlmFieldImports,\n HlmButtonImports,\n MaskitoDirective,\n MaskitoUnmaskDirective,\n FormsModule,\n CommonModule,\n LoadingInputComponent,\n ErrorMessageProviderComponent,\n NgIcon,\n ],\n selector: 'input-time-span',\n styleUrl: './input-time-span.component.scss',\n templateUrl: './input-time-span.component.html',\n})\nexport class InputTimeSpanComponent extends InputBaseTimeComponent implements FormValueControl<Span | null | undefined> {\n /** Intervalo [início, fim] no formato HH:mm:ss */\n value = model<Span | null | undefined>(null);\n\n constructor() {\n super();\n markSpanEdgesDirtyOnChange();\n }\n\n // value é HH:mm:ss (unmask grava HH:mm:ss); null enquanto o horário digitado estiver incompleto\n setEdge(index: 0 | 1, time: string | null) {\n this.value.set(setSpanEdge(this.value(), index, time));\n }\n\n clear() {\n this.value.set(null);\n this.touch.emit();\n }\n}\n","<hlm-field [forceInvalid]=\"touched() && invalid()\">\n @if(label()) {\n <label hlmFieldLabel [attr.for]=\"id()\">\n {{label()}}\n\n @if(tooltipInfo()){\n <ng-icon name=\"lucideCircleQuestionMark\" [hlmTooltip]=\"tooltipInfo()!\" position=\"top\"></ng-icon>\n }\n </label>\n }\n <hlm-input-group class=\"relative\">\n <!-- \"?? null\": undefined faria o ngModel reescrever (e apagar) o texto incompleto que está sendo digitado -->\n <input\n hlmInputGroupInput\n [ngModel]=\"value()?.[0] ?? null\"\n (ngModelChange)=\"setEdge(0, $event)\"\n [disabled]=\"isReadonly()\"\n [attr.id]=\"id()\"\n type=\"text\"\n inputmode=\"numeric\"\n [maskito]=\"timeMaskitoOptions()\"\n [unmaskHandler]=\"unmask\"\n [stringifyHandler]=\"stringify\"\n [placeholder]=\"placeholder() || timePlaceholder()\"\n [forceInvalid]=\"touched() && invalid()\"\n (blur)=\"touch.emit()\"\n />\n <span hlmInputGroupText>–</span>\n <input\n hlmInputGroupInput\n [ngModel]=\"value()?.[1] ?? null\"\n (ngModelChange)=\"setEdge(1, $event)\"\n [disabled]=\"isReadonly()\"\n type=\"text\"\n inputmode=\"numeric\"\n [maskito]=\"timeMaskitoOptions()\"\n [unmaskHandler]=\"unmask\"\n [stringifyHandler]=\"stringify\"\n [placeholder]=\"placeholder() || timePlaceholder()\"\n [forceInvalid]=\"touched() && invalid()\"\n (blur)=\"touch.emit()\"\n />\n <hlm-input-group-addon align=\"inline-end\">\n @if(value() && !isReadonly()){\n <button\n hlmInputGroupButton\n size=\"icon-xs\"\n variant=\"ghost\"\n (click)=\"clear()\"\n >\n <ng-icon name=\"lucideCircleX\" />\n </button>\n }\n </hlm-input-group-addon>\n <hlm-input-group-addon align=\"inline-end\">\n <ng-icon name=\"lucideClock\" />\n </hlm-input-group-addon>\n\n <loading-input [loading]=\"loading()\"></loading-input>\n </hlm-input-group>\n\n <error-message-provider [errors]=\"errors()\" [invalid]=\"invalid()\" [touched]=\"touched()\"></error-message-provider>\n</hlm-field>\n","import { CommonModule } from '@angular/common';\nimport { Component, input, InputSignal, model, ModelSignal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { FormValueControl } from '@angular/forms/signals';\n\nimport {\n HlmFieldImports,\n HlmInputImports,\n HlmSkeletonImports,\n HlmSwitchImports,\n HlmCheckboxImports,\n HlmTooltipImports,\n} from '@sapphire-caitlyn/schema-kit-ng/helm';\nimport { NgIcon } from '@ng-icons/core';\n\nimport { LoadingInputComponent } from '../loading-input/loading-input.component';\nimport { ErrorMessageProviderComponent } from '../../error-message-provider/error-message-provider.component';\nimport { InputBaseComponent } from '../input-base/input-base.component';\n\n@Component({\n imports: [\n HlmTooltipImports,\n NgIcon,\n HlmInputImports,\n HlmFieldImports,\n HlmSkeletonImports,\n HlmSwitchImports,\n HlmCheckboxImports,\n FormsModule,\n CommonModule,\n LoadingInputComponent,\n ErrorMessageProviderComponent\n ],\n selector: 'input-bool',\n styleUrl: './input-bool.component.scss',\n templateUrl: './input-bool.component.html',\n})\nexport class InputBoolComponent extends InputBaseComponent implements FormValueControl<boolean | null> {\n value: ModelSignal<boolean | null> = model<boolean | null>(null);\n\n presentation: InputSignal<InputBoolPresentation> = input<InputBoolPresentation>(InputBoolPresentation.SWITCH);\n\n InputBoolPresentation = InputBoolPresentation;\n\n onClick(){\n if(this.loading() || this.isReadonly()){\n return;\n }\n this.value.set(!this.value())\n }\n} \n\nexport enum InputBoolPresentation {\n SWITCH = 'switch',\n CHECKBOX = 'checkbox',\n}","<div hlmField [forceInvalid]=\"touched() && invalid()\">\n @if(label()){\n <label hlmFieldLabel [attr.for]=\"id()\">\n {{label()}}\n\n @if(tooltipInfo()){\n <ng-icon name=\"lucideCircleQuestionMark\" [hlmTooltip]=\"tooltipInfo()!\" position=\"top\"></ng-icon>\n }\n </label>\n }\n <div class=\"relative\" [class.cursor-pointer]=\"!isReadonly()\" (click)=\"onClick()\">\n <div hlmInput class=\"flex items-center justify-start px-1\">\n @if(presentation() === InputBoolPresentation.SWITCH){\n <hlm-switch \n [disabled]=\"loading() || isReadonly()\"\n [forceInvalid]=\"touched() && invalid()\" \n [ngModel]=\"value()\" \n class=\"mr-2\" \n [attr.id]=\"presentation()+id()\" \n />\n }\n @if(presentation() === InputBoolPresentation.CHECKBOX){\n <hlm-checkbox \n [disabled]=\"loading() || isReadonly()\"\n [forceInvalid]=\"touched() && invalid()\" \n [ngModel]=\"value()\" \n class=\"mr-2\" \n [attr.id]=\"presentation()+id()\" \n />\n }\n <label hlmLabel [attr.for]=\"presentation()+id()\"> {{ label() }} </label>\n </div>\n\n <loading-input [loading]=\"loading()\"></loading-input>\n </div>\n\n <error-message-provider [errors]=\"errors()\" [invalid]=\"invalid()\" [touched]=\"touched()\"></error-message-provider>\n</div>\n","import { isPlatformBrowser, NgTemplateOutlet } from '@angular/common';\nimport { Component, computed, effect, ElementRef, inject, input, model, PLATFORM_ID, signal, Signal, untracked, viewChild } from '@angular/core';\nimport { FormValueControl } from '@angular/forms/signals';\nimport { MaskitoDirective } from '@maskito/angular';\nimport { MaskitoOptions } from '@maskito/core';\nimport { maskitoNumber } from '@maskito/kit';\n\nimport { NgIcon, provideIcons } from '@ng-icons/core';\nimport { lucidePipette } from '@ng-icons/lucide';\nimport {\n HlmButtonImports,\n HlmInputImports,\n HlmSelectImports,\n HlmSliderImports,\n} from '@sapphire-caitlyn/schema-kit-ng/helm';\n\nexport type ColorPickerMode = 'hex' | 'rgb' | 'css' | 'hsl';\n\n/** `r`, `g` e `b` de 0 a 255, `a` de 0 a 1 */\ninterface Rgba { r: number; g: number; b: number; a: number }\n\n/** `h` de 0 a 360, `s`, `v` e `a` de 0 a 100 */\ninterface Hsva { h: number; s: number; v: number; a: number }\n\n/** Aceita `#RGB`, `#RGBA`, `#RRGGBB` ou `#RRGGBBAA` (o `#` é opcional) */\nconst HEX_REGEX = /^#?([0-9a-f]{3,4}|[0-9a-f]{6}|[0-9a-f]{8})$/i;\nconst RGB_REGEX = /^rgba?\\(([^)]+)\\)$/i;\n\n/** Canais do campo RGB, na ordem exibida */\nconst RGB_KEYS = ['r', 'g', 'b'] as const;\n\n/** Espectro exibido na barra de matiz */\nconst HUE_GRADIENT = 'linear-gradient(90deg, #FF0000, #FFFF00, #00FF00, #00FFFF, #0000FF, #FF00FF, #FF0000)';\n\n/** Xadrez exibido atrás da barra de opacidade */\nconst CHECKERBOARD = 'url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAMUlEQVQ4T2NkYGAQYcAP3uCTZhw1gGGYhAGBZIA/nYDCgBDAm9BGDWAAJyRCgLaBCAAgXwixzAS0pgAAAABJRU5ErkJggg==\") left center';\n\n@Component({\n imports: [\n HlmButtonImports,\n HlmInputImports,\n HlmSelectImports,\n HlmSliderImports,\n MaskitoDirective,\n NgIcon,\n NgTemplateOutlet\n ],\n providers: [provideIcons({ lucidePipette })],\n host: { '[attr.data-disabled]': 'disabled() || null' },\n selector: 'color-picker',\n styleUrl: './color-picker.component.scss',\n templateUrl: './color-picker.component.html',\n})\nexport class ColorPickerComponent implements FormValueControl<string | null | undefined> {\n /** Cor no formato `#rrggbb`, ou `#rrggbbaa` quando tem transparência */\n value = model<string | null | undefined>(null);\n\n /** Cor exibida enquanto `value` está vazio */\n defaultValue = input<string>('#000000');\n\n disabled = input<boolean>(false);\n\n /** Formato exibido nos campos abaixo do seletor */\n mode = model<ColorPickerMode>('hex');\n\n modes: ColorPickerMode[] = ['hex', 'rgb', 'css', 'hsl'];\n\n modeToString = (mode: ColorPickerMode) => mode.toUpperCase();\n\n hueBackground = HUE_GRADIENT;\n\n /** Até 8 dígitos para aceitar colar um `#rrggbbaa`, sempre em maiúsculas */\n hexMask: MaskitoOptions = {\n mask: /^#?[0-9A-F]{0,8}$/i,\n postprocessors: [({ value, selection }) => ({ value: value.toUpperCase(), selection })],\n };\n\n /** Só os caracteres usados em `rgb()` e `rgba()`, a validação fica para a confirmação */\n cssMask: MaskitoOptions = {\n mask: /^[rgba(),.%/\\s\\d]*$/i,\n };\n\n rgbMask: MaskitoOptions = maskitoNumber({ min: 0, max: 255, thousandSeparator: '' });\n\n /** Matiz, saturação e luminosidade */\n hslMasks: MaskitoOptions[] = [\n maskitoNumber({ min: 0, max: 360, thousandSeparator: '' }),\n maskitoNumber({ min: 0, max: 100, thousandSeparator: '' }),\n maskitoNumber({ min: 0, max: 100, thousandSeparator: '' }),\n ];\n\n rgbLabels = ['Vermelho', 'Verde', 'Azul'];\n\n hslLabels = ['Matiz', 'Saturação', 'Luminosidade'];\n\n alphaMask: MaskitoOptions = maskitoNumber({ min: 0, max: 100, thousandSeparator: '' });\n\n /** O EyeDropper só existe em navegadores baseados no Chromium */\n eyeDropperSupported = isPlatformBrowser(inject(PLATFORM_ID)) && 'EyeDropper' in window;\n\n selection = viewChild.required<ElementRef<HTMLElement>>('selection');\n\n /** Estado interno em HSV, que é o espaço representado pela área de seleção */\n hsva = signal<Hsva>({ h: 0, s: 0, v: 0, a: 100 });\n\n rgba: Signal<Rgba> = computed(() => hsvToRgb(this.hsva()));\n\n hex: Signal<string> = computed(() => toHex(this.rgba()));\n\n hue: Signal<number[]> = computed(() => [this.hsva().h]);\n\n alpha: Signal<number[]> = computed(() => [this.hsva().a]);\n\n selectionBackground: Signal<string> = computed(() =>\n `linear-gradient(0deg, rgba(0,0,0,1), rgba(0,0,0,0)), linear-gradient(90deg, rgba(255,255,255,1), rgba(255,255,255,0)), hsl(${this.hsva().h}, 100%, 50%)`\n );\n\n alphaBackground: Signal<string> = computed(() => {\n const { r, g, b } = this.rgba();\n return `linear-gradient(90deg, transparent, rgb(${r}, ${g}, ${b})), ${CHECKERBOARD}`;\n });\n\n rgbChannels: Signal<number[]> = computed(() => {\n const { r, g, b } = this.rgba();\n return [r, g, b].map(Math.round);\n });\n\n hslChannels: Signal<number[]> = computed(() => hsvToHsl(this.hsva()).map(Math.round));\n\n selectionText: Signal<string> = computed(() => {\n const { s, v } = this.hsva();\n return `Saturação ${Math.round(s)}%, brilho ${Math.round(v)}%`;\n });\n\n hexText: Signal<string> = computed(() => toHex({ ...this.rgba(), a: 1 }).toUpperCase());\n\n alphaText: Signal<number> = computed(() => Math.round(this.hsva().a));\n\n cssText: Signal<string> = computed(() => `rgba(${this.rgbChannels().join(', ')}, ${this.alphaText()}%)`);\n\n constructor() {\n effect(() => {\n const color = this.value() || this.defaultValue();\n untracked(() => this.applyColor(color));\n });\n }\n\n /** Atualiza parte dos canais e emite o novo valor */\n update(channels: Partial<Hsva>) {\n if(this.disabled()) {\n return;\n }\n this.hsva.update(hsva => ({ ...hsva, ...channels }));\n if(this.value() !== this.hex()) {\n this.value.set(this.hex());\n }\n }\n\n /**\n * Os campos aplicam a cor enquanto o usuário digita, assim que o texto é válido.\n * Ao confirmar (enter ou blur) o texto é substituído pelo valor atual, descartando o que for inválido.\n */\n setHex(input: HTMLInputElement, confirm = false) {\n const digits = input.value.replace('#', '');\n if(confirm || digits.length === 6 || digits.length === 8) {\n const rgba = parseColor(input.value);\n if(rgba) {\n // Sem os dígitos de transparência mantém a opacidade atual\n this.update(this.toHsva(digits.length % 4 === 0 ? rgba : { ...rgba, a: this.rgba().a }));\n }\n }\n if(confirm) {\n input.value = this.hexText();\n }\n }\n\n setRgb(index: number, input: HTMLInputElement, confirm = false) {\n const channel = parseFloat(input.value);\n if(Number.isFinite(channel)) {\n this.update(this.toHsva({ ...this.rgba(), [RGB_KEYS[index]]: channel }));\n }\n if(confirm) {\n input.value = String(this.rgbChannels()[index]);\n }\n }\n\n setHsl(index: number, input: HTMLInputElement, confirm = false) {\n const channel = parseFloat(input.value);\n if(Number.isFinite(channel)) {\n const hsl = hsvToHsl(this.hsva());\n hsl[index] = channel;\n const { h, s, v } = hslToHsv(hsl);\n // No preto a saturação é indefinida, então mantém a atual\n this.update(v ? { h, s, v } : { h, v });\n }\n if(confirm) {\n input.value = String(this.hslChannels()[index]);\n }\n }\n\n setAlpha(input: HTMLInputElement, confirm = false) {\n const alpha = parseFloat(input.value);\n if(Number.isFinite(alpha)) {\n this.update({ a: alpha });\n }\n if(confirm) {\n input.value = String(this.alphaText());\n }\n }\n\n /** O texto livre só é aplicado ao confirmar, já que fica inválido enquanto é digitado */\n setCss(input: HTMLInputElement) {\n const rgba = parseColor(input.value);\n if(rgba) {\n this.update(this.toHsva(rgba));\n }\n input.value = this.cssText();\n }\n\n onSelectionPointerDown(event: PointerEvent) {\n if(this.disabled() || event.button !== 0) {\n return;\n }\n event.preventDefault();\n const element = this.selection().nativeElement;\n element.focus();\n element.setPointerCapture(event.pointerId);\n this.updateFromPointer(event);\n }\n\n onSelectionPointerMove(event: PointerEvent) {\n if(this.selection().nativeElement.hasPointerCapture(event.pointerId)) {\n this.updateFromPointer(event);\n }\n }\n\n /** Setas movem 1%, ou 10% segurando shift */\n onSelectionKeydown(event: KeyboardEvent) {\n const step = event.shiftKey ? 10 : 1;\n const moves: Record<string, [number, number]> = {\n ArrowLeft: [-step, 0],\n ArrowRight: [step, 0],\n ArrowUp: [0, step],\n ArrowDown: [0, -step],\n };\n const move = moves[event.key];\n if(!move) {\n return;\n }\n event.preventDefault();\n const { s, v } = this.hsva();\n this.update({ s: clamp(s + move[0], 0, 100), v: clamp(v + move[1], 0, 100) });\n }\n\n async pickFromScreen() {\n try {\n const eyeDropper = new (window as any).EyeDropper();\n const result: { sRGBHex: string } = await eyeDropper.open();\n const rgba = parseColor(result.sRGBHex);\n if(rgba) {\n this.update(this.toHsva(rgba));\n }\n } catch {\n // Usuário cancelou a captura\n }\n }\n\n private updateFromPointer(event: PointerEvent) {\n const rect = this.selection().nativeElement.getBoundingClientRect();\n const x = clamp((event.clientX - rect.left) / rect.width, 0, 1);\n const y = clamp((event.clientY - rect.top) / rect.height, 0, 1);\n this.update({ s: x * 100, v: (1 - y) * 100 });\n }\n\n private applyColor(color: string) {\n const rgba = parseColor(color);\n // Ignora o próprio valor emitido, evitando perder precisão no arredondamento do hex\n if(!rgba || toHex(rgba) === this.hex()) {\n return;\n }\n this.hsva.set(this.toHsva(rgba));\n }\n\n /** Mantém o matiz em tons de cinza e a saturação no preto, onde eles são indefinidos */\n private toHsva(rgba: Rgba): Hsva {\n const current = this.hsva();\n const next = rgbToHsv(rgba);\n return {\n h: next.s === 0 || next.v === 0 ? current.h : next.h,\n s: next.v === 0 ? current.s : next.s,\n v: next.v,\n a: next.a,\n };\n }\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, value));\n}\n\n/** Converte `#rgb`, `#rgba`, `#rrggbb`, `#rrggbbaa`, `rgb()` ou `rgba()` */\nfunction parseColor(text: string | null | undefined): Rgba | null {\n text = text?.trim();\n const hex = text?.match(HEX_REGEX);\n if(hex) {\n const digits = hex[1].length <= 4\n ? hex[1].split('').map(char => char + char).join('')\n : hex[1];\n const [r, g, b, a = 255] = digits.match(/../g)!.map(pair => parseInt(pair, 16));\n return { r, g, b, a: a / 255 };\n }\n const rgb = text?.match(RGB_REGEX);\n if(!rgb) {\n return null;\n }\n const [r, g, b, a = '1'] = rgb[1].split(/[\\s,/]+/).filter(Boolean);\n const channels = [r, g, b].map(channel => parseFloat(channel));\n const alpha = a.endsWith('%') ? parseFloat(a) / 100 : parseFloat(a);\n if(![...channels, alpha].every(Number.isFinite)) {\n return null;\n }\n return {\n r: clamp(channels[0], 0, 255),\n g: clamp(channels[1], 0, 255),\n b: clamp(channels[2], 0, 255),\n a: clamp(alpha, 0, 1),\n };\n}\n\nfunction hsvToRgb({ h, s, v, a }: Hsva): Rgba {\n s /= 100;\n v /= 100;\n const channel = (n: number) => {\n const k = (n + h / 60) % 6;\n return (v - v * s * Math.max(0, Math.min(k, 4 - k, 1))) * 255;\n };\n return { r: channel(5), g: channel(3), b: channel(1), a: a / 100 };\n}\n\nfunction rgbToHsv({ r, g, b, a }: Rgba): Hsva {\n r /= 255;\n g /= 255;\n b /= 255;\n const max = Math.max(r, g, b);\n const delta = max - Math.min(r, g, b);\n let h = 0;\n if(delta) {\n if(max === r) {\n h = ((g - b) / delta) % 6;\n } else if(max === g) {\n h = (b - r) / delta + 2;\n } else {\n h = (r - g) / delta + 4;\n }\n h = (h * 60 + 360) % 360;\n }\n return { h, s: max ? (delta / max) * 100 : 0, v: max * 100, a: a * 100 };\n}\n\n/** Retorna `[h, s, l]`, com `h` de 0 a 360 e `s`, `l` de 0 a 100 */\nfunction hsvToHsl({ h, s, v }: Hsva): number[] {\n s /= 100;\n v /= 100;\n const l = v * (1 - s / 2);\n const saturation = l === 0 || l === 1 ? 0 : (v - l) / Math.min(l, 1 - l);\n return [h, saturation * 100, l * 100];\n}\n\n/** Recebe `[h, s, l]` no mesmo formato retornado por `hsvToHsl` */\nfunction hslToHsv([h, s, l]: number[]): Omit<Hsva, 'a'> {\n s /= 100;\n l /= 100;\n const v = l + s * Math.min(l, 1 - l);\n return { h, s: v ? 2 * (1 - l / v) * 100 : 0, v: v * 100 };\n}\n\n/** Formata como `#rrggbb`, ou `#rrggbbaa` quando tem transparência */\nfunction toHex({ r, g, b, a }: Rgba): string {\n const channels = a < 1 ? [r, g, b, a * 255] : [r, g, b];\n return `#${channels.map(channel => Math.round(channel).toString(16).padStart(2, '0')).join('')}`;\n}\n","<div\n #selection\n class=\"selection relative h-40 w-full cursor-crosshair touch-none select-none rounded-lg outline-none focus-visible:ring-3 focus-visible:ring-ring/50\"\n role=\"slider\"\n aria-label=\"Saturação e brilho\"\n [attr.aria-valuetext]=\"selectionText()\"\n [attr.tabindex]=\"disabled() ? -1 : 0\"\n [style.background]=\"selectionBackground()\"\n (pointerdown)=\"onSelectionPointerDown($event)\"\n (pointermove)=\"onSelectionPointerMove($event)\"\n (keydown)=\"onSelectionKeydown($event)\"\n>\n <div\n class=\"pointer-events-none absolute size-4 -translate-x-1/2 -translate-y-1/2 rounded-full border-2 border-white shadow-[0_0_0_1px_rgba(0,0,0,0.5)]\"\n [style.left.%]=\"hsva().s\"\n [style.top.%]=\"100 - hsva().v\"\n ></div>\n</div>\n\n<hlm-slider\n class=\"color-slider\"\n aria-label=\"Matiz\"\n max=\"360\"\n step=\"1\"\n [style.--track-background]=\"hueBackground\"\n [value]=\"hue()\"\n [disabled]=\"disabled()\"\n (valueChange)=\"update({ h: $event[0] })\"\n/>\n\n<hlm-slider\n class=\"color-slider\"\n aria-label=\"Opacidade\"\n max=\"100\"\n step=\"1\"\n [style.--track-background]=\"alphaBackground()\"\n [value]=\"alpha()\"\n [disabled]=\"disabled()\"\n (valueChange)=\"update({ a: $event[0] })\"\n/>\n\n<div class=\"flex items-center gap-2\">\n @if(eyeDropperSupported) {\n <button\n hlmBtn\n type=\"button\"\n variant=\"outline\"\n size=\"icon\"\n class=\"shrink-0 text-muted-foreground\"\n aria-label=\"Capturar cor da tela\"\n [disabled]=\"disabled()\"\n (click)=\"pickFromScreen()\"\n >\n <ng-icon name=\"lucidePipette\" />\n </button>\n }\n\n <hlm-select [(value)]=\"mode\" [itemToString]=\"modeToString\">\n <hlm-select-trigger size=\"sm\" class=\"w-20 shrink-0 text-xs\">\n <hlm-select-value placeholder=\"Formato\" />\n </hlm-select-trigger>\n <hlm-select-content *hlmSelectPortal>\n @for(mode of modes; track mode) {\n <hlm-select-item class=\"text-xs\" [value]=\"mode\">{{modeToString(mode)}}</hlm-select-item>\n }\n </hlm-select-content>\n </hlm-select>\n\n <div class=\"flex w-full min-w-0 items-center -space-x-px rounded-md shadow-sm\">\n @switch(mode()) {\n @case('hex') {\n <input\n hlmInput\n type=\"text\"\n class=\"h-8 min-w-0 bg-secondary px-2 text-xs shadow-none md:text-xs rounded-e-none\"\n aria-label=\"Hexadecimal\"\n [readonly]=\"disabled()\"\n [maskito]=\"hexMask\"\n [value]=\"hexText()\"\n (input)=\"setHex($any($event.target))\"\n (change)=\"setHex($any($event.target), true)\"\n />\n <ng-container [ngTemplateOutlet]=\"alphaInput\" />\n }\n @case('rgb') {\n @for(channel of rgbChannels(); track $index) {\n <input\n hlmInput\n type=\"text\"\n inputmode=\"numeric\"\n class=\"h-8 min-w-0 bg-secondary px-2 text-xs shadow-none md:text-xs rounded-e-none\"\n [class.rounded-s-none]=\"$index\"\n [attr.aria-label]=\"rgbLabels[$index]\"\n [readonly]=\"disabled()\"\n [maskito]=\"rgbMask\"\n [value]=\"channel\"\n (input)=\"setRgb($index, $any($event.target))\"\n (change)=\"setRgb($index, $any($event.target), true)\"\n />\n }\n <ng-container [ngTemplateOutlet]=\"alphaInput\" />\n }\n @case('css') {\n <input\n hlmInput\n type=\"text\"\n class=\"h-8 min-w-0 bg-secondary px-2 text-xs shadow-none md:text-xs\"\n aria-label=\"CSS\"\n [readonly]=\"disabled()\"\n [maskito]=\"cssMask\"\n [value]=\"cssText()\"\n (change)=\"setCss($any($event.target))\"\n />\n }\n @case('hsl') {\n @for(channel of hslChannels(); track $index) {\n <input\n hlmInput\n type=\"text\"\n inputmode=\"numeric\"\n class=\"h-8 min-w-0 bg-secondary px-2 text-xs shadow-none md:text-xs rounded-e-none\"\n [class.rounded-s-none]=\"$index\"\n [attr.aria-label]=\"hslLabels[$index]\"\n [readonly]=\"disabled()\"\n [maskito]=\"hslMasks[$index]\"\n [value]=\"channel\"\n (input)=\"setHsl($index, $any($event.target))\"\n (change)=\"setHsl($index, $any($event.target), true)\"\n />\n }\n <ng-container [ngTemplateOutlet]=\"alphaInput\" />\n }\n }\n </div>\n</div>\n\n<ng-template #alphaInput>\n <div class=\"relative shrink-0\">\n <input\n hlmInput\n type=\"text\"\n inputmode=\"numeric\"\n class=\"h-8 min-w-0 bg-secondary px-2 text-xs shadow-none md:text-xs w-13 rounded-s-none pe-5\"\n aria-label=\"Opacidade\"\n [readonly]=\"disabled()\"\n [maskito]=\"alphaMask\"\n [value]=\"alphaText()\"\n (input)=\"setAlpha($any($event.target))\"\n (change)=\"setAlpha($any($event.target), true)\"\n />\n <span class=\"absolute top-1/2 right-2 -translate-y-1/2 text-xs text-muted-foreground\">%</span>\n </div>\n</ng-template>\n","import { CommonModule } from '@angular/common';\nimport { Component, computed, linkedSignal, model, Signal, viewChild, WritableSignal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { FormValueControl } from '@angular/forms/signals';\nimport { MaskitoDirective } from '@maskito/angular';\nimport { MaskitoOptions } from '@maskito/core';\n\nimport { NgIcon, provideIcons } from '@ng-icons/core';\nimport { lucideCircleX } from '@ng-icons/lucide';\nimport {\n HlmButtonImports,\n HlmFieldImports,\n HlmInputImports,\n HlmInputGroupImports,\n HlmPopover,\n HlmPopoverImports,\n HlmTooltipImports,\n} from '@sapphire-caitlyn/schema-kit-ng/helm';\n\nimport { InputBaseComponent } from '../input-base/input-base.component';\nimport { LoadingInputComponent } from '../loading-input/loading-input.component';\nimport { ErrorMessageProviderComponent } from '../../error-message-provider/error-message-provider.component';\nimport { ColorPickerComponent } from './color-picker/color-picker.component';\n\n/** Aceita `#RGB` ou `#RRGGBB` (o `#` é opcional) */\nconst HEX_REGEX = /^#?([0-9a-f]{3}|[0-9a-f]{6})$/i;\n\n@Component({\n imports: [\n HlmTooltipImports,\n HlmInputImports,\n HlmInputGroupImports,\n HlmFieldImports,\n HlmButtonImports,\n HlmPopoverImports,\n MaskitoDirective,\n FormsModule,\n CommonModule,\n NgIcon,\n LoadingInputComponent,\n ErrorMessageProviderComponent,\n ColorPickerComponent\n],\n providers: [provideIcons({ lucideCircleX })],\n selector: 'input-color',\n styleUrl: './input-color.component.scss',\n templateUrl: './input-color.component.html',\n})\nexport class InputColorComponent extends InputBaseComponent implements FormValueControl<string | null | undefined> {\n /** Cor no formato `#rrggbb` */\n value = model<string | null | undefined>(null);\n\n /** Texto digitado no input, sincronizado com `value` sempre que ele muda */\n text: WritableSignal<string> = linkedSignal(() => this.value() ?? '');\n\n /** Cor válida usada no swatch e no seletor nativo */\n color: Signal<string | null> = computed(() => this.normalize(this.value()));\n\n /** O seletor nativo só aceita `#rrggbb`, então usa preto como fallback */\n pickerColor: Signal<string> = computed(() => this.color() ?? '#000000');\n\n maskitoOptions: MaskitoOptions = {\n mask: /^#?[0-9a-fA-F]{0,6}$/,\n };\n\n onText(text: string) {\n this.text.set(text);\n if(!text) {\n this.value.set(null);\n return;\n }\n const color = this.normalize(text);\n if(color) {\n this.value.set(color);\n }\n }\n\n onBlur() {\n // Descarta o texto incompleto, voltando para o último valor válido\n this.text.set(this.value() ?? '');\n this.touch.emit();\n }\n\n onPick(color: string) {\n this.value.set(this.normalize(color));\n this.touch.emit();\n }\n\n clear() {\n this.value.set(null);\n this.touch.emit();\n }\n\n /** Converte `abc`, `#abc`, `aabbcc` ou `#AABBCC` em `#aabbcc` */\n normalize(text: string | null | undefined): string | null {\n const match = text?.trim().match(HEX_REGEX);\n if(!match) {\n return null;\n }\n const hex = match[1].length === 3\n ? match[1].split('').map(char => char + char).join('')\n : match[1];\n return `#${hex.toLowerCase()}`;\n }\n}\n","<div hlmField [forceInvalid]=\"touched() && invalid()\">\n @if(label()) {\n <label hlmFieldLabel [attr.for]=\"id()\">\n {{label()}}\n\n @if(tooltipInfo()){\n <ng-icon name=\"lucideCircleQuestionMark\" [hlmTooltip]=\"tooltipInfo()!\" position=\"top\"></ng-icon>\n }\n </label>\n }\n <hlm-popover [attachTo]=\"inputGroup\">\n <hlm-input-group #inputGroup class=\"relative\">\n <loading-input [loading]=\"loading()\"></loading-input>\n \n <hlm-input-group-addon align=\"inline-start\">\n <button\n hlmBtn\n variant=\"outline\"\n size=\"sm\"\n class=\"swatch p-0 relative block size-5 shrink-0 cursor-pointer overflow-hidden rounded-md border\"\n [class.empty]=\"!color()\"\n [style.background-color]=\"color()\"\n hlmPopoverTrigger\n [disabled]=\"isReadonly()\"\n >\n </button>\n </hlm-input-group-addon>\n \n <input\n hlmInputGroupInput\n [ngModel]=\"text()\"\n (ngModelChange)=\"onText($event)\"\n [disabled]=\"isReadonly()\"\n [maskito]=\"maskitoOptions\"\n [attr.id]=\"id()\"\n type=\"text\"\n class=\"font-mono\"\n [placeholder]=\"placeholder() || '#000000'\"\n (blur)=\"onBlur()\"\n />\n \n @if(value() && !isReadonly()) {\n <hlm-input-group-addon align=\"inline-end\">\n <button\n hlmInputGroupButton\n type=\"button\"\n size=\"icon-xs\"\n variant=\"ghost\"\n aria-label=\"Limpar cor\"\n (click)=\"clear()\"\n >\n <ng-icon name=\"lucideCircleX\" />\n </button>\n </hlm-input-group-addon>\n }\n <hlm-input-group-addon align=\"inline-end\">\n <button\n hlmInputGroupButton\n hlmPopoverTrigger\n [disabled]=\"isReadonly()\"\n type=\"button\"\n size=\"icon-xs\"\n variant=\"ghost\"\n aria-label=\"Limpar cor\"\n >\n <ng-icon name=\"lucidePalette\" />\n </button>\n </hlm-input-group-addon>\n \n <loading-input [loading]=\"loading()\"></loading-input>\n </hlm-input-group>\n\n <hlm-popover-content *hlmPopoverPortal=\"let ctx\">\n <color-picker [(ngModel)]=\"value\" [disabled]=\"isReadonly()\">\n </color-picker>\n </hlm-popover-content>\n </hlm-popover>\n\n <error-message-provider [errors]=\"errors()\" [invalid]=\"invalid()\" [touched]=\"touched()\"></error-message-provider>\n</div>\n","import { CommonModule } from '@angular/common';\nimport { Component, computed, ElementRef, inject, model, ModelSignal, signal, Signal, WritableSignal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { FormValueControl } from '@angular/forms/signals';\nimport { MaskitoDirective } from '@maskito/angular';\nimport { MaskitoMaskExpression, MaskitoOptions, MaskitoPreprocessor } from '@maskito/core';\nimport { ElementState } from '@maskito/core/src/lib/types';\n\nimport {\n HlmFieldImports,\n HlmInputImports,\n HlmSkeletonImports,\n HlmTooltipImports,\n} from '@sapphire-caitlyn/schema-kit-ng/helm';\nimport { NgIcon } from '@ng-icons/core';\n\nimport { InputBaseComponent } from '../input-base/input-base.component';\nimport { LoadingInputComponent } from '../loading-input/loading-input.component';\nimport { ErrorMessageProviderComponent } from '../../error-message-provider/error-message-provider.component';\nimport { MaskitoUnmaskDirective } from '../../../directives/maskito-unmask.directive';\n\n@Component({\n imports: [\n HlmTooltipImports,\n NgIcon,\n HlmInputImports,\n HlmFieldImports,\n HlmSkeletonImports,\n FormsModule,\n CommonModule,\n MaskitoDirective,\n MaskitoUnmaskDirective,\n LoadingInputComponent,\n ErrorMessageProviderComponent\n ],\n selector: 'input-cpf-cnpj, input-cpf, input-cnpj',\n styleUrl: './input-cpf-cnpj.component.scss',\n templateUrl: './input-cpf-cnpj.component.html',\n})\nexport class InputCpfCnpjComponent extends InputBaseComponent implements FormValueControl<string | null> {\n\n value: ModelSignal<string | null> = model<string | null>(null);\n\n elementRef: WritableSignal<ElementRef | null> = signal(null);\n\n inputType: Signal<InputCpfCnpjType> = computed(() => {\n if(!this.elementRef()) {\n return InputCpfCnpjType.CPFCNPJ;\n }\n // 'INPUT-CPF' -> 'CPF', 'INPUT-CNPJ' -> 'CNPJ', 'INPUT-CPF-CNPJ' -> 'CPFCNPJ'\n const tagName = this.elementRef()!.nativeElement.tagName.toUpperCase().split('-').slice(1).join('') as InputCpfCnpjType;\n return tagName;\n });\n\n maskitoOptions: Signal<MaskitoOptions> = computed(() => { \n switch(this.inputType()) {\n case InputCpfCnpjType.CPF:\n return maskitoOptionsCPF;\n case InputCpfCnpjType.CNPJ:\n return maskitoOptionsCNPJ;\n case InputCpfCnpjType.CPFCNPJ:\n default:\n return maskitoOptionsCPFOrCNPJ;\n }\n })\n\n // Remove a pontuação para manter apenas dígitos/letras (ex.: 12345678901)\n unmask = (masked: string): string | null => masked.replace(/[^A-Z0-9]/gi, '').toUpperCase() || null;\n\n constructor(\n elementRef: ElementRef\n ) {\n super();\n this.elementRef.set(elementRef);\n }\n}\n\nconst cpfMask: MaskitoMaskExpression = [/\\d/, /\\d/, /\\d/, '.', /\\d/, /\\d/, /\\d/, '.', /\\d/, /\\d/, /\\d/, '-', /\\d/, /\\d/];\n//Mascara para CNPJ com letra E numero (padrão 2026)\nconst cnpjMask: MaskitoMaskExpression = [\n /[A-Z0-9]/, /[A-Z0-9]/, '.', /[A-Z0-9]/, /[A-Z0-9]/, /[A-Z0-9]/, '.', /[A-Z0-9]/, /[A-Z0-9]/, /[A-Z0-9]/, '/',\n /[A-Z0-9]/, /[A-Z0-9]/, /[A-Z0-9]/, /[A-Z0-9]/, '-', /\\d/, /\\d/\n];\n// O CNPJ alfanumérico só aceita maiúsculas; converte o que for digitado/colado\nconst toUpperCasePreprocessor: MaskitoPreprocessor = ({ elementState, data }) => ({ elementState, data: data.toUpperCase() });\n\nexport const maskitoOptionsCPF: MaskitoOptions = {\n mask: cpfMask,\n}\nexport const maskitoOptionsCNPJ: MaskitoOptions = {\n mask: cnpjMask,\n preprocessors: [toUpperCasePreprocessor],\n};\nexport const maskitoOptionsCPFOrCNPJ: MaskitoOptions = {\n mask: ({ value }: ElementState): MaskitoMaskExpression => {\n const raw = value.replace(/[^A-Z0-9]/gi, '');\n // CPF só tem dígitos; qualquer letra ou mais de 11 caracteres indica CNPJ\n return raw.length <= 11 && /^\\d*$/.test(raw) ? cpfMask : cnpjMask;\n },\n preprocessors: [toUpperCasePreprocessor],\n};\nexport enum InputCpfCnpjType {\n CPF = 'CPF',\n CNPJ = 'CNPJ',\n CPFCNPJ = 'CPFCNPJ'\n}","<div hlmField [forceInvalid]=\"touched() && invalid()\">\n @if(label()){\n <label hlmFieldLabel [attr.for]=\"id()\">\n {{label()}}\n\n @if(tooltipInfo()){\n <ng-icon name=\"lucideCircleQuestionMark\" [hlmTooltip]=\"tooltipInfo()!\" position=\"top\"></ng-icon>\n }\n </label>\n }\n <div class=\"relative\">\n <input \n hlmInput \n [forceInvalid]=\"touched() && invalid()\" \n [(ngModel)]=\"value\"\n [disabled]=\"isReadonly()\"\n [maskito]=\"maskitoOptions()\" \n [unmaskHandler]=\"unmask\" \n [attr.id]=\"id()\" \n type=\"text\" \n [placeholder]=\"placeholder() || ''\"\n >\n \n <loading-input [loading]=\"loading()\"></loading-input>\n </div>\n\n <error-message-provider [errors]=\"errors()\" [invalid]=\"invalid()\" [touched]=\"touched()\"></error-message-provider>\n</div>\n","import { CommonModule } from '@angular/common';\nimport { Component, input, InputSignal } from '@angular/core';\n\nimport { HlmSpinnerImports } from '@sapphire-caitlyn/schema-kit-ng/helm';\n\ntype Position = 'absolute' | 'relative';\n\n@Component({\n imports: [\n HlmSpinnerImports,\n CommonModule\n ],\n selector: 'loading',\n styleUrl: './loading.component.scss',\n templateUrl: './loading.component.html',\n})\nexport class LoadingComponent {\n position: InputSignal<Position> = input<Position>('absolute');\n active: InputSignal<boolean> = input<boolean>(true);\n}\n\n","<div \n class=\"flex justify-center bg-white/10 items-center size-full \n mask-y-from-30% mask-x-from-30%\n \" \n [ngClass]=\"{\n 'absolute inset-0': position() === 'absolute',\n 'relative': position() === 'relative',\n 'animate-in fade-in-0 slide-in-from-left-2': active(),\n 'animate-out fade-out-0 slide-out-to-left-2 fill-mode-forwards pointer-events-none': !active(),\n 'w-0': !active() && position() == 'relative',\n 'transition-[width] duration-150 ease-in-out': position() == 'relative'\n }\" \n>\n <hlm-spinner></hlm-spinner>\n</div>","import { Component, computed, input, InputSignal, linkedSignal } from '@angular/core';\n\nimport { NgIcon } from '@ng-icons/core';\nimport { HlmButtonImports, HlmPopoverImports } from '@sapphire-caitlyn/schema-kit-ng/helm';\n\nimport { LoadingComponent } from '../loading/loading.component';\n\n/** Arquivo exibido, com a URL usada para pré-visualizar (imagem) ou baixar */\nexport interface FileItem {\n name: string;\n url: string;\n image: boolean;\n /** Presente quando o item vem de um `File`, cuja `url` é uma object URL */\n file?: File;\n}\n\n/** Identifica imagens quando o valor é uma string (URL ou data URL) */\nconst IMAGE_REGEX = /^data:image\\/|\\.(png|jpe?g|gif|webp|avif|svg|bmp|ico)([?#].*)?$/i;\n\n/** Nome exibido para uma URL: o último segmento do caminho (ex.: URL assinada do bucket), ou a própria string */\nfunction fileName(url: string): string {\n try {\n const { protocol, pathname } = new URL(url);\n const name = protocol === 'data:' ? '' : decodeURIComponent(pathname.split('/').pop() ?? '');\n return name || url;\n } catch {\n return url;\n }\n}\n\n/** Item de um arquivo já existente, identificado pela URL */\nexport function fileItemFromUrl(url: string): FileItem {\n return { name: fileName(url), url, image: IMAGE_REGEX.test(url) };\n}\n\n/** Itens de um valor de arquivo vindo da API: uma URL, uma lista de URLs ou vazio */\nexport function fileItemsFromValue(value: unknown): FileItem[] {\n return [value]\n .flat()\n .filter((url): url is string => typeof url === 'string' && !!url)\n .map(fileItemFromUrl);\n}\n\n/**\n * Botão de um arquivo: imagens abrem uma pré-visualização no popover (com loading enquanto carrega);\n * os demais arquivos são baixados.\n */\n@Component({\n imports: [\n HlmButtonImports,\n HlmPopoverImports,\n LoadingComponent,\n NgIcon,\n ],\n selector: 'file-preview',\n styleUrl: './file-preview.component.scss',\n templateUrl: './file-preview.component.html',\n})\nexport class FilePreviewComponent {\n item: InputSignal<FileItem> = input.required<FileItem>();\n\n /**\n * Em `computed` para só mudar quando a URL muda: quem usa pode passar um objeto novo a cada detecção de mudanças\n * (ex.: o template da schema-table), e o `linkedSignal` reiniciaria a cada objeto novo, mesmo com a mesma URL.\n */\n private url = computed(() => this.item().url);\n\n /**\n * Se a imagem já carregou (ou falhou). O popover recria a imagem a cada abertura, mas o navegador reaproveita\n * a já carregada, então o loading só aparece na primeira vez; volta a aparecer quando a URL muda.\n */\n loaded = linkedSignal({\n source: this.url,\n computation: () => false,\n });\n}\n","@let file = item();\n@if(file.image) {\n <hlm-popover sideOffset=\"5\" align=\"start\">\n <button\n hlmBtn\n hlmPopoverTrigger\n variant=\"ghost\"\n size=\"icon-xs\"\n type=\"button\"\n [attr.aria-label]=\"'Visualizar ' + file.name\"\n >\n <ng-icon name=\"lucideImage\" />\n </button>\n <hlm-popover-content *hlmPopoverPortal=\"let ctx\" class=\"w-auto\">\n <div class=\"relative\" [class.size-24]=\"!loaded()\">\n <img\n [src]=\"file.url\"\n [alt]=\"file.name\"\n class=\"max-h-80 max-w-80 rounded-md object-contain\"\n (load)=\"loaded.set(true)\"\n (error)=\"loaded.set(true)\"\n />\n <loading [active]=\"!loaded()\" />\n </div>\n </hlm-popover-content>\n </hlm-popover>\n} @else {\n <a\n hlmBtn\n variant=\"ghost\"\n size=\"icon-xs\"\n target=\"_blank\"\n rel=\"noopener\"\n [href]=\"file.url\"\n [attr.download]=\"file.file ? file.name : ''\"\n [attr.aria-label]=\"'Baixar ' + file.name\"\n >\n <ng-icon name=\"lucideFileDown\" />\n </a>\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, computed, effect, input, InputSignal, model, Signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { FormValueControl } from '@angular/forms/signals';\n\nimport {\n HlmFieldImports,\n HlmInputImports,\n HlmInputGroupImports,\n HlmSkeletonImports,\n HlmButtonImports,\n HlmTooltipImports,\n} from '@sapphire-caitlyn/schema-kit-ng/helm';\nimport { NgIcon } from '@ng-icons/core';\n\nimport { InputBaseComponent } from '../input-base/input-base.component';\nimport { LoadingInputComponent } from '../loading-input/loading-input.component';\nimport { FileItem, fileItemFromUrl, FilePreviewComponent } from '../../ui/file-preview/file-preview.component';\nimport { ErrorMessageProviderComponent } from '../../error-message-provider/error-message-provider.component';\n\n/**\n * Valor aceito pelo input: string (arquivo já existente, ex.: nome/URL), um arquivo ou vários arquivos.\n * `FileList` também é aceito na entrada, mas o input sempre emite `File` ou `File[]`.\n */\nexport type InputFileValue = string | File | File[] | FileList | null | undefined;\n\n@Component({\n imports: [\n HlmTooltipImports,\n HlmInputImports,\n HlmInputGroupImports,\n HlmButtonImports,\n HlmFieldImports,\n HlmSkeletonImports,\n FormsModule,\n CommonModule,\n LoadingInputComponent,\n FilePreviewComponent,\n ErrorMessageProviderComponent,\n NgIcon\n ],\n selector: 'input-file',\n styleUrl: './input-file.component.scss',\n templateUrl: './input-file.component.html',\n})\nexport class InputFileComponent extends InputBaseComponent implements FormValueControl<InputFileValue> {\n value = model<InputFileValue>(null);\n\n type = input<FileInputType>(FileInputType.INPUT, {\n alias: 'type',\n });\n\n multiple = input<boolean>(false);\n\n /** Exibe o botão de limpar quando há um arquivo (no `multiple`, cada arquivo já tem o seu botão de remover) */\n clearable: InputSignal<boolean> = input<boolean>(false);\n\n /** Arquivos do valor atual como lista (`File[]` ou `FileList`); vazio para string ou arquivo único */\n private files: Signal<File[]> = computed(() => {\n const value = this.value();\n if (Array.isArray(value) || value instanceof FileList) {\n return Array.from(value);\n }\n return value instanceof File ? [value] : [];\n });\n\n /** Itens do valor atual, na mesma ordem do valor */\n items: Signal<FileItem[]> = computed(() => {\n const value = this.value();\n if (typeof value === 'string') {\n return value ? [fileItemFromUrl(value)] : [];\n }\n return this.files().map((file) => ({\n name: file.name,\n url: URL.createObjectURL(file),\n image: file.type.startsWith('image/'),\n file,\n }));\n });\n\n constructor() {\n super();\n // Revoga as object URLs criadas para os arquivos quando o valor muda ou o componente é destruído\n effect((onCleanup) => {\n const items = this.items();\n onCleanup(() => items.forEach((item) => item.file && URL.revokeObjectURL(item.url)));\n });\n }\n\n onSelect(event: Event) {\n const input = event.target as HTMLInputElement;\n const files = Array.from(input.files ?? []);\n // Limpa o input nativo para permitir selecionar o mesmo arquivo novamente\n input.value = '';\n if (!files.length) {\n return;\n }\n\n if (this.multiple()) {\n this.value.set([...this.files(), ...files]);\n } else {\n this.value.set(files[0]);\n }\n this.touch.emit();\n }\n\n clear() {\n this.value.set(null);\n this.touch.emit();\n }\n\n remove(index: number) {\n const next = this.files().filter((_, i) => i !== index);\n this.value.set(next.length ? next : null);\n this.touch.emit();\n }\n}\nenum FileInputType {\n DROPZONE = 'dropzone',\n INPUT = 'input',\n}\n","<div hlmField [forceInvalid]=\"touched() && invalid()\">\n @if(label()) {\n <label hlmFieldLabel [attr.for]=\"id()\">\n {{label()}}\n\n @if(tooltipInfo()){\n <ng-icon name=\"lucideCircleQuestionMark\" [hlmTooltip]=\"tooltipInfo()!\" position=\"top\"></ng-icon>\n }\n </label>\n }\n <hlm-input-group class=\"relative\">\n <hlm-input-group-addon>\n @if(!multiple() && items().length) {\n <file-preview class=\"mx-[-.3rem]\" [item]=\"items()[0]\" />\n } @else {\n <ng-icon name=\"lucideFile\" />\n }\n </hlm-input-group-addon>\n\n <hlm-input-group-addon class=\"w-full text-start overflow-hidden\">\n <ng-content select=\"[slot=input]\"></ng-content>\n <span class=\"w-full shrink-0 truncate\" [class.text-foreground]=\"items().length\">\n @if(!items().length) {\n {{placeholder() || 'Nenhum arquivo selecionado'}}\n } @else if(multiple()) {\n {{items().length}} {{items().length === 1 ? 'arquivo selecionado' : 'arquivos selecionados'}}\n } @else {\n {{items()[0].name}}\n }\n </span>\n </hlm-input-group-addon>\n\n @if(clearable() && !multiple() && items().length && !isReadonly()) {\n <hlm-input-group-addon align=\"inline-end\">\n <button hlmInputGroupButton variant=\"ghost\" size=\"icon-xs\" type=\"button\" aria-label=\"Remover arquivo\" (click)=\"clear()\">\n <ng-icon name=\"lucideCircleX\" />\n </button>\n </hlm-input-group-addon>\n }\n <hlm-input-group-addon align=\"inline-end\">\n <button hlmInputGroupButton variant=\"ghost\" size=\"icon-xs\" type=\"button\" (click)=\"fileInput.click()\" [disabled]=\"isReadonly()\">\n <ng-icon name=\"lucideUpload\" />\n </button>\n </hlm-input-group-addon>\n\n <loading-input [loading]=\"loading()\"></loading-input>\n </hlm-input-group>\n\n @if(multiple() && items().length) {\n <ul class=\"flex flex-col gap-1\">\n @for(item of items(); track $index) {\n <li class=\"flex items-center gap-2 rounded-md border px-2 py-1 text-sm\">\n <file-preview [item]=\"item\" />\n <span class=\"w-full truncate\">{{item.name}}</span>\n <button\n hlmBtn\n variant=\"ghost\"\n size=\"icon-xs\"\n type=\"button\"\n aria-label=\"Remover arquivo\"\n (click)=\"remove($index)\"\n [disabled]=\"isReadonly()\"\n >\n <ng-icon name=\"lucideCircleX\" />\n </button>\n </li>\n }\n </ul>\n }\n\n <input #fileInput [attr.id]=\"id()\" type=\"file\" (change)=\"onSelect($event)\" [multiple]=\"multiple()\" [disabled]=\"isReadonly()\" hidden/>\n\n <error-message-provider [errors]=\"errors()\" [invalid]=\"invalid()\" [touched]=\"touched()\"></error-message-provider>\n</div>\n","import { CommonModule } from '@angular/common';\nimport { Component, computed, model, signal, Signal, WritableSignal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { FormValueControl } from '@angular/forms/signals';\n\nimport { NgIcon, provideIcons } from '@ng-icons/core';\nimport {\n HlmInputImports,\n HlmFieldImports,\n HlmSkeletonImports,\n HlmComboboxImports,\n HlmTooltipImports,\n} from '@sapphire-caitlyn/schema-kit-ng/helm';\nimport * as IconsLucide from '@ng-icons/lucide';\n\nimport { InputBaseComponent } from '../../inputs/input-base/input-base.component';\nimport { LoadingInputComponent } from '../loading-input/loading-input.component';\nimport { ErrorMessageProviderComponent } from '../../error-message-provider/error-message-provider.component';\n\nconst ICONS: Record<string, string> = { ...IconsLucide };\n\nconst ICON_NAMES: string[] = Object.keys(ICONS);\n\n/** Quantidade máxima de ícones renderizados na lista (são milhares, renderizar todos trava a UI) */\nconst MAX_RESULTS = 60;\n\n@Component({\n imports: [\n HlmTooltipImports,\n HlmInputImports,\n HlmFieldImports,\n HlmSkeletonImports,\n HlmComboboxImports,\n FormsModule,\n CommonModule,\n NgIcon,\n LoadingInputComponent,\n ErrorMessageProviderComponent\n ],\n providers: [provideIcons(ICONS)],\n selector: 'input-icon',\n styleUrl: './input-icon.component.scss',\n templateUrl: './input-icon.component.html',\n})\nexport class InputIconComponent extends InputBaseComponent implements FormValueControl<string | null | undefined> {\n value = model<string | null | undefined>(null);\n\n search: WritableSignal<string> = signal('');\n\n /** Todos os ícones que correspondem à busca (cada palavra da busca deve estar no nome) */\n matches: Signal<string[]> = computed(() => {\n const terms = this.search().toLowerCase().split(/[\\s_-]+/).filter(Boolean);\n if(!terms.length) {\n return ICON_NAMES;\n }\n return ICON_NAMES.filter(name => {\n const normalized = name.toLowerCase();\n return terms.every(term => normalized.includes(term));\n });\n });\n\n /** Ícones exibidos na lista, sempre mantendo o ícone selecionado */\n icons: Signal<string[]> = computed(() => {\n const result = this.matches().slice(0, MAX_RESULTS);\n const selected = this.value();\n if(selected && ICONS[selected] && !result.includes(selected)) {\n result.unshift(selected);\n }\n return result;\n });\n\n onSelect(name: string | null) {\n this.value.set(name ?? null);\n this.touch.emit();\n }\n\n // A filtragem é feita em `icons`, então o combobox não deve esconder nenhum item\n filter = (): boolean => true;\n\n itemToString = (name: string): string => this.iconLabel(name);\n\n /** Converte `lucideHouse` em `Home Smile Linear` */\n iconLabel(name: string): string {\n return name\n .replace(/^lucide/, '')\n .replace(/([a-z0-9])([A-Z])/g, '$1 $2')\n .replace(/([A-Z])([A-Z][a-z])/g, '$1 $2')\n .trim();\n }\n}\n","<div hlmField [forceInvalid]=\"touched() && invalid()\">\n @if(label()) {\n <label hlmFieldLabel [attr.for]=\"id()\">\n {{label()}}\n\n @if(tooltipInfo()){\n <ng-icon name=\"lucideCircleQuestionMark\" [hlmTooltip]=\"tooltipInfo()!\" position=\"top\"></ng-icon>\n }\n </label>\n }\n <div class=\"relative\">\n <hlm-combobox\n [disabled]=\"isReadonly()\"\n [(search)]=\"search\"\n [ngModel]=\"value()\"\n (ngModelChange)=\"onSelect($event)\"\n [filter]=\"filter\"\n [itemToString]=\"itemToString\"\n >\n <hlm-combobox-trigger [buttonId]=\"id()\" class=\"w-full truncate justify-between font-normal\" [forceInvalid]=\"touched() && invalid()\">\n <span class=\"flex min-w-0 items-center gap-2\">\n <ng-template hlmComboboxValueTemplate let-value>\n <ng-icon [name]=\"value\" class=\"shrink-0 text-base\" />\n </ng-template>\n <hlm-combobox-value class=\"truncate\" [placeholder]=\"placeholder() || 'Selecione um ícone'\" />\n </span>\n </hlm-combobox-trigger>\n <hlm-combobox-content *hlmComboboxPortal>\n <hlm-combobox-input showTrigger=\"false\" placeholder=\"Pesquisar ícone...\" showClear />\n <hlm-combobox-empty>Nenhum ícone encontrado.</hlm-combobox-empty>\n <div hlmComboboxList>\n @for (name of icons(); track name) {\n <hlm-combobox-item [value]=\"name\" class=\"wrap-anywhere\">\n <ng-icon [name]=\"name\" class=\"text-base\" />\n {{ iconLabel(name) }}\n </hlm-combobox-item>\n }\n </div>\n @if(matches().length > icons().length) {\n <p class=\"text-muted-foreground px-2 py-1.5 text-xs\">\n Exibindo {{ icons().length }} de {{ matches().length }} ícones. Refine a busca para ver mais.\n </p>\n }\n </hlm-combobox-content>\n </hlm-combobox>\n\n <loading-input [loading]=\"loading()\"></loading-input>\n </div>\n\n <error-message-provider [errors]=\"errors()\" [invalid]=\"invalid()\" [touched]=\"touched()\"></error-message-provider>\n</div>\n","import { CommonModule } from '@angular/common';\nimport { Component, input, model } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { FormValueControl } from '@angular/forms/signals';\nimport { MaskitoDirective } from '@maskito/angular';\nimport { MaskitoOptions } from '@maskito/core';\n\nimport { HlmFieldImports, HlmInputImports, HlmTooltipImports } from '@sapphire-caitlyn/schema-kit-ng/helm';\nimport { NgIcon } from '@ng-icons/core';\n\nimport { LoadingInputComponent } from '../loading-input/loading-input.component';\nimport { ErrorMessageProviderComponent } from '../../error-message-provider/error-message-provider.component';\nimport { MaskitoUnmaskDirective } from '../../../directives/maskito-unmask.directive';\nimport { InputBaseComponent } from '../input-base/input-base.component';\n\n@Component({\n imports: [\n HlmTooltipImports,\n NgIcon,\n HlmInputImports,\n HlmFieldImports,\n FormsModule,\n CommonModule,\n MaskitoDirective,\n MaskitoUnmaskDirective,\n LoadingInputComponent,\n ErrorMessageProviderComponent\n ],\n selector: 'input-mask',\n styleUrl: './input-mask.component.scss',\n templateUrl: './input-mask.component.html',\n})\nexport class InputMaskComponent extends InputBaseComponent implements FormValueControl<string | null> {\n value = model<string | null>(null);\n\n maskitoOptions = input.required<MaskitoOptions>();\n unmaskHandler = input<(value: string) => string | null>();\n\n /** Sem `unmaskHandler`, o model recebe o valor mascarado */\n unmask = (value: string): string | null => {\n const handler = this.unmaskHandler();\n return handler ? handler(value) : value;\n };\n}\n","<div hlmField [forceInvalid]=\"touched() && invalid()\">\n @if(label()) {\n <label hlmFieldLabel [attr.for]=\"id()\">\n {{label()}}\n\n @if(tooltipInfo()){\n <ng-icon name=\"lucideCircleQuestionMark\" [hlmTooltip]=\"tooltipInfo()!\" position=\"top\"></ng-icon>\n }\n </label>\n }\n <div class=\"relative\">\n <input \n hlmInput \n [forceInvalid]=\"touched() && invalid()\" \n [(ngModel)]=\"value\"\n [disabled]=\"isReadonly()\"\n [maskito]=\"maskitoOptions()\" \n [unmaskHandler]=\"unmask\"\n [attr.id]=\"id()\" \n type=\"text\" \n [placeholder]=\"placeholder() || ''\"\n >\n \n <loading-input [loading]=\"loading()\"></loading-input>\n </div>\n\n <error-message-provider [errors]=\"errors()\" [invalid]=\"invalid()\" [touched]=\"touched()\"></error-message-provider>\n</div>\n","import { CommonModule } from '@angular/common';\nimport { Component, computed, input, InputSignal, model, ModelSignal, Signal, ElementRef, signal, WritableSignal, inject } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { FormValueControl } from '@angular/forms/signals';\nimport { MaskitoDirective } from '@maskito/angular';\nimport { MaskitoOptions } from '@maskito/core';\nimport { maskitoNumber, MaskitoNumberParams, maskitoParseNumber, maskitoPostfixPostprocessorGenerator, maskitoPrefixPostprocessorGenerator, maskitoStringifyNumber } from '@maskito/kit';\n\nimport {\n HlmFieldImports,\n HlmInputImports,\n HlmSkeletonImports,\n HlmTooltipImports,\n} from '@sapphire-caitlyn/schema-kit-ng/helm';\nimport { NgIcon } from '@ng-icons/core';\n\nimport { InputBaseComponent } from '../input-base/input-base.component';\nimport { LoadingInputComponent } from '../loading-input/loading-input.component';\nimport { ErrorMessageProviderComponent } from '../../error-message-provider/error-message-provider.component';\nimport { MaskitoUnmaskDirective } from '../../../directives/maskito-unmask.directive';\n\n@Component({\n imports: [\n HlmTooltipImports,\n NgIcon,\n HlmInputImports,\n HlmFieldImports,\n HlmSkeletonImports,\n FormsModule,\n CommonModule,\n MaskitoDirective,\n MaskitoUnmaskDirective,\n LoadingInputComponent,\n ErrorMessageProviderComponent\n ],\n selector: 'input-number, input-decimal, input-currency, input-percentage',\n styleUrl: './input-number.component.scss',\n templateUrl: './input-number.component.html',\n})\nexport class InputNumberComponent extends InputBaseComponent implements FormValueControl<number | null> {\n \n value: ModelSignal<number | null> = model<number | null>(null);\n\n minimumFractionDigits: InputSignal<number | undefined> = input<number | undefined>(undefined);\n\n maximumFractionDigits: InputSignal<number | undefined> = input<number | undefined>(undefined);\n\n postfix: InputSignal<string | undefined> = input<string | undefined>(undefined);\n \n prefix: InputSignal<string | undefined> = input<string | undefined>(undefined);\n\n min: InputSignal<number | undefined> = input<number | undefined>(undefined);\n\n max: InputSignal<number | undefined> = input<number | undefined>(undefined);\n\n numberParams: Signal<MaskitoNumberParams> = computed(() => {\n let maximumFractionDigits: number;\n let minimumFractionDigits: number;\n let postfix: string;\n let prefix: string\n let min: number;\n let max: number;\n\n switch(this.inputType()) {\n case InputNumberType.DECIMAL:\n maximumFractionDigits = this.maximumFractionDigits() ?? 2;\n minimumFractionDigits = this.minimumFractionDigits() ?? 2;\n postfix = this.postfix() ?? '';\n prefix = this.prefix() ?? '';\n break;\n case InputNumberType.CURRENCY:\n maximumFractionDigits = this.maximumFractionDigits() ?? 2;\n minimumFractionDigits = this.minimumFractionDigits() ?? 2;\n postfix = this.postfix() ?? '';\n prefix = this.prefix() ?? 'R$ ';\n break;\n case InputNumberType.NUMBER:\n maximumFractionDigits = this.maximumFractionDigits() ?? 0;\n minimumFractionDigits = this.minimumFractionDigits() ?? 0;\n postfix = this.postfix() ?? '';\n prefix = this.prefix() ?? '';\n break;\n default:\n maximumFractionDigits = this.maximumFractionDigits() ?? 0;\n minimumFractionDigits = this.minimumFractionDigits() ?? 0;\n postfix = this.postfix() ?? '';\n prefix = this.prefix() ?? '';\n break;\n }\n min = this.min() ?? Number.MIN_SAFE_INTEGER;\n max = this.max() ?? Number.MAX_SAFE_INTEGER;\n\n return {\n maximumFractionDigits: maximumFractionDigits,\n minimumFractionDigits: minimumFractionDigits,\n postfix: postfix,\n prefix: prefix,\n min: min,\n max: max,\n decimalSeparator: ',',\n thousandSeparator: '.',\n };\n })\n\n maskitoOptions: Signal<MaskitoOptions> = computed(() => maskitoOptionsNumber(this.numberParams()));\n\n // Converte o texto mascarado (ex.: \"R$ 1.000,42\") para number (1000.42)\n unmask = (masked: string): number | null => {\n const parsed = maskitoParseNumber(masked, this.numberParams());\n return Number.isNaN(parsed) ? null : parsed;\n };\n\n // Converte o number do model para o texto mascarado exibido no campo\n stringify = (value: number | string | null | undefined): string =>\n value == null || value === '' ? '' : maskitoStringifyNumber(Number(value), this.numberParams());\n\n inputType: Signal<InputNumberType> = computed(() => {\n if(!this.elementRef()) {\n return InputNumberType.NUMBER;\n }\n const tagName = this.elementRef()!.nativeElement.tagName.toUpperCase().split('-')[1] as InputNumberType;\n return tagName;\n });\n\n elementRef: WritableSignal<ElementRef | null> = signal(null);\n\n constructor(\n elementRef: ElementRef\n ) {\n super();\n this.elementRef.set(elementRef);\n }\n}\n\nexport function maskitoOptionsNumber(options?: MaskitoNumberParams | undefined): MaskitoOptions {\n if(!options) {\n options = {\n decimalSeparator: ',',\n thousandSeparator: '.',\n }\n }\n if(!options.decimalSeparator && !options.thousandSeparator) {\n options.decimalSeparator = ',';\n options.thousandSeparator = '.';\n }\n\n const maskitoNumberIns = maskitoNumber(options)\n const maskitoOptions: MaskitoOptions = {\n mask: maskitoNumberIns.mask,\n plugins: maskitoNumberIns.plugins,\n postprocessors: maskitoNumberIns.postprocessors,\n preprocessors: maskitoNumberIns.preprocessors,\n overwriteMode: maskitoNumberIns.overwriteMode,\n }\n return maskitoOptions;\n}\n\nexport enum InputNumberType {\n NUMBER = 'NUMBER',\n DECIMAL = 'DECIMAL',\n CURRENCY = 'CURRENCY',\n PERCENTAGE = 'PERCENTAGE',\n}","<div hlmField>\n <label hlmFieldLabel [attr.for]=\"id()\">\n {{label()}}\n\n @if(tooltipInfo()){\n <ng-icon name=\"lucideCircleQuestionMark\" [hlmTooltip]=\"tooltipInfo()!\" position=\"top\"></ng-icon>\n }\n </label>\n <div class=\"relative\">\n <input \n hlmInput \n [(ngModel)]=\"value\"\n [disabled]=\"isReadonly()\"\n [maskito]=\"maskitoOptions()\" \n [unmaskHandler]=\"unmask\" \n [stringifyHandler]=\"stringify\" \n [attr.id]=\"id()\" \n type=\"text\" \n [placeholder]=\"placeholder() || ''\"\n >\n \n <loading-input [loading]=\"loading()\"></loading-input>\n </div>\n\n <error-message-provider [errors]=\"errors()\" [invalid]=\"invalid()\" [touched]=\"touched()\"></error-message-provider>\n</div>\n","import { Component, input, model, signal } from '@angular/core';\nimport { FormValueControl } from '@angular/forms/signals';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { MaskitoOptions } from '@maskito/core';\nimport { maskitoPhone, MaskitoPhoneParams } from '@maskito/phone';\nimport metadata from 'libphonenumber-js/min/metadata';\nimport { MaskitoDirective } from '@maskito/angular';\n\nimport {\n HlmFieldImports,\n HlmInputImports,\n HlmSkeletonImports,\n HlmTooltipImports,\n} from '@sapphire-caitlyn/schema-kit-ng/helm';\nimport { NgIcon } from '@ng-icons/core';\n\nimport { InputBaseComponent } from '../input-base/input-base.component';\nimport { LoadingInputComponent } from '../loading-input/loading-input.component';\nimport { ErrorMessageProviderComponent } from '../../error-message-provider/error-message-provider.component';\nimport { MaskitoUnmaskDirective } from '../../../directives/maskito-unmask.directive';\n\n@Component({\n imports: [\n HlmTooltipImports,\n NgIcon,\n HlmInputImports,\n HlmFieldImports,\n HlmSkeletonImports,\n FormsModule,\n CommonModule,\n MaskitoDirective,\n MaskitoUnmaskDirective,\n LoadingInputComponent,\n ErrorMessageProviderComponent\n ],\n selector: 'input-phone',\n styleUrl: './input-phone.component.scss',\n templateUrl: './input-phone.component.html',\n})\nexport class InputPhoneComponent extends InputBaseComponent implements FormValueControl<string | null> {\n value = model<string | null>(null);\n\n maskitoOptions: MaskitoOptions = maskitoOptionsPhone;\n\n unmaskPhone = (masked: string): string | null => {\n const raw = masked.replace(/[^\\d+]/g, '');\n return raw && raw !== '+' ? raw : null;\n };\n}\n\n\t \nconst phoneOptions = maskitoPhone({\n metadata,\n strict: true,\n});\n\t \n\nexport const maskitoOptionsPhone: MaskitoOptions = {\n plugins: [...phoneOptions.plugins], mask: phoneOptions.mask,\n}","<div hlmField [forceInvalid]=\"touched() && invalid()\">\n @if(label()) {\n <label hlmFieldLabel [attr.for]=\"id()\">\n {{label()}}\n\n @if(tooltipInfo()){\n <ng-icon name=\"lucideCircleQuestionMark\" [hlmTooltip]=\"tooltipInfo()!\" position=\"top\"></ng-icon>\n }\n </label>\n }\n <div class=\"relative\">\n <input \n hlmInput \n [forceInvalid]=\"touched() && invalid()\" \n [(ngModel)]=\"value\"\n [disabled]=\"isReadonly()\"\n [maskito]=\"maskitoOptions\" \n [unmaskHandler]=\"unmaskPhone\"\n [attr.id]=\"id()\" \n type=\"text\" \n [placeholder]=\"placeholder() || ''\"\n >\n \n <loading-input [loading]=\"loading()\"></loading-input>\n </div>\n\n <error-message-provider [errors]=\"errors()\" [invalid]=\"invalid()\" [touched]=\"touched()\"></error-message-provider>\n</div>\n","import { InjectionToken, ModuleWithProviders, NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nimport { EnvironmentService } from './services/environment.service';\n\nexport const SCHEMA_KIT_OPTIONS = new InjectionToken<SchemaKitModuleOptions>('SCHEMA_KIT_OPTIONS');\nexport const SCHEMA_KIT_PERMISSAO_CHECKER = new InjectionToken<PerfilCheckerFn>('SCHEMA_KIT_PERMISSAO_CHECKER');\n\nexport type PerfilCheckerFn = (perfil: string | string[]) => boolean;\n\n@NgModule({\n declarations: [],\n imports: [CommonModule],\n})\nexport class SchemaKitModule {\n static forRoot<Environment = any>(\n options: SchemaKitModuleInputOptions<Environment>\n ): ModuleWithProviders<SchemaKitModule> {\n const _options: SchemaKitModuleOptions<Environment> = {\n apiUrlGetter: options.apiUrlGetter,\n paginationOptions: {\n rows: options.paginationOptions?.rows ?? 20,\n },\n environmentKey: options.environmentKey,\n };\n\n return {\n ngModule: SchemaKitModule,\n providers: [\n { provide: SCHEMA_KIT_OPTIONS, useValue: _options },\n {\n provide: EnvironmentService,\n useFactory: (opts: SchemaKitModuleOptions<Environment>) => {\n const service = new EnvironmentService<Environment>();\n service.registerApiUrlGetter(() => opts.apiUrlGetter(service.getEnvironment()));\n return service;\n },\n deps: [SCHEMA_KIT_OPTIONS],\n },\n {\n provide: SCHEMA_KIT_PERMISSAO_CHECKER,\n useFactory: options.perfilCheckerFactory ?? (() => () => {\n console.warn('No perfil checker provided. All permissao checks will return false.');\n false\n }),\n },\n ],\n };\n }\n}\nexport interface SchemaKitModuleInputOptions<Environment = any> {\n apiUrlGetter: (environment: Environment) => string;\n paginationOptions?: {\n /**\n * Number of rows to display per page.\n * @group Props\n */\n rows: number;\n }\n /**\n * Factory that returns the perfil checker. Runs in an injection context, so `inject()` is allowed.\n */\n perfilCheckerFactory?: () => PerfilCheckerFn;\n environmentKey: string;\n}\nexport interface SchemaKitModuleOptions<Environment = any> extends Required<Omit<SchemaKitModuleInputOptions<Environment>, 'perfilCheckerFactory'>> {\n}\n","import { computed, inject, Injectable, Signal, signal, WritableSignal } from '@angular/core';\nimport { SCHEMA_KIT_OPTIONS, SchemaKitModuleOptions } from '../schema-kit.module';\n\n/**\n * Provê o ambiente da aplicação (lido de `window[environmentKey]`) como signals,\n * permitindo a configuração e recuperação de variáveis de ambiente.\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class EnvironmentService<Environment> {\n private readonly _environment: WritableSignal<Environment | undefined>;\n\n /**\n * Ambiente da aplicação. Lança um erro ao ser lido se `window[environmentKey]` não estiver definido.\n */\n public readonly environment: Signal<Environment> = computed(() => {\n const environment: Environment | undefined = this._environment();\n if (!environment) {\n throw new Error('Environment is not defined');\n }\n return environment;\n });\n\n // Registrado depois da construção pelo `SchemaKitModule.forRoot`; signal para o `apiUrl` recalcular\n private readonly apiUrlGetter: WritableSignal<() => string> = signal<() => string>(() => {\n throw new Error('API URL getter not registered');\n });\n\n /**\n * URL da API. Recalcula quando o ambiente ou o getter registrado mudam.\n */\n public readonly apiUrl: Signal<string> = computed(() => this.apiUrlGetter()());\n\n constructor() {\n const options: SchemaKitModuleOptions = inject(SCHEMA_KIT_OPTIONS);\n const environment: Environment | undefined = (\n window as unknown as Record<string, Environment | undefined>\n )[options.environmentKey];\n this._environment = signal<Environment | undefined>(environment);\n }\n\n /**\n * Altera uma chave do ambiente. Gera um novo objeto para notificar quem depende do signal.\n */\n public set<K extends keyof Environment>(key: K, value: Environment[K]): void {\n this._environment.set({ ...this.environment(), [key]: value });\n }\n\n /**\n * Retorna uma chave do ambiente. Dentro de `computed`/`effect`/template, vira dependência.\n */\n public get<K extends keyof Environment>(key: K): Environment[K] {\n return this.environment()[key];\n }\n\n /**\n * Retorna a URL de um recurso da API.\n * @param path O caminho do recurso.\n */\n public resource(path: string): string {\n return `${this.apiUrl()}/${path}`;\n }\n\n /**\n * Retorna o ambiente da aplicação. Equivale a ler o signal `environment`.\n */\n public getEnvironment(): Environment {\n return this.environment();\n }\n\n /**\n * Registra a função que retorna a URL da API.\n * @param getter A função que retorna a URL da API.\n */\n public registerApiUrlGetter(getter: () => string): void {\n this.apiUrlGetter.set(getter);\n }\n}\n","import { Component, input, viewChild } from '@angular/core';\nimport { outputToObservable } from '@angular/core/rxjs-interop';\nimport { firstValueFrom } from 'rxjs';\n\nimport { NgIcon } from '@ng-icons/core';\nimport {\n ButtonVariants,\n HlmButtonImports,\n HlmAlertDialog,\n HlmAlertDialogImports,\n} from '@sapphire-caitlyn/schema-kit-ng/helm';\n\nexport interface AlertButton {\n id: string;\n label: string;\n variant?: ButtonVariants['variant'];\n handler?: () => void | Promise<void>;\n}\n\n@Component({\n imports: [\n HlmAlertDialogImports, HlmButtonImports, NgIcon\n ],\n selector: 'alert',\n styleUrl: './alert.component.scss',\n templateUrl: './alert.component.html',\n})\nexport class AlertComponent {\n constructor() {}\n\n icon = input<string>()\n\n description = input<string>()\n\n buttons = input<AlertButton[]>([])\n\n title = input<string>()\n\n size = input<'sm' | 'default'>('sm')\n\n private dialogRef = viewChild.required(HlmAlertDialog)\n\n /** Opens the alert and resolves with the id of the clicked button (undefined if dismissed). */\n public async present(): Promise<string | undefined> {\n const dialog = this.dialogRef();\n const closed = firstValueFrom(outputToObservable(dialog.closed), { defaultValue: undefined });\n dialog.open();\n return (await closed) as string | undefined;\n }\n\n async onClick(button: AlertButton) {\n await button.handler?.();\n this.dialogRef().close(button.id);\n }\n}\n","<hlm-alert-dialog>\n <hlm-alert-dialog-content *hlmAlertDialogPortal=\"let ctx\" [size]=\"size()\">\n <hlm-alert-dialog-header>\n @if(icon()){\n <hlm-alert-dialog-media\n class=\"bg-destructive/10 text-destructive dark:bg-destructive/20 dark:text-destructive\"\n >\n <ng-icon [name]=\"icon()!\"/>\n </hlm-alert-dialog-media>\n }\n <h2 hlmAlertDialogTitle>{{ title() }}</h2>\n <p hlmAlertDialogDescription>\n {{ description() }}\n </p>\n </hlm-alert-dialog-header>\n <hlm-alert-dialog-footer>\n @for (button of buttons(); track button.id) {\n <button hlmAlertDialogAction [variant]=\"button.variant ?? 'default'\" (click)=\"onClick(button)\">\n {{ button.label }}\n </button>\n }\n </hlm-alert-dialog-footer>\n </hlm-alert-dialog-content>\n</hlm-alert-dialog>\n","import { ApplicationRef, createComponent, EnvironmentInjector, inject, Service } from '@angular/core';\n\nimport { ButtonVariants } from '@sapphire-caitlyn/schema-kit-ng/helm';\n\nimport { AlertButton, AlertComponent } from '../components/alert/alert.component';\n\n@Service()\nexport class AlertService {\n constructor() {}\n\n private appRef = inject(ApplicationRef);\n private injector = inject(EnvironmentInjector);\n\n /** Shows the alert and resolves with the id of the clicked button (undefined if dismissed). */\n async present(options: {\n titulo: string;\n mensagem: string;\n icon?: string;\n size?: 'sm' | 'default';\n buttons: AlertButton[];\n }): Promise<string | undefined> {\n const host = document.createElement('div');\n document.body.appendChild(host);\n\n const alert = createComponent(AlertComponent, {\n environmentInjector: this.injector,\n hostElement: host,\n });\n alert.setInput('title', options.titulo);\n alert.setInput('description', options.mensagem);\n alert.setInput('buttons', options.buttons);\n if (options.icon) alert.setInput('icon', options.icon);\n if (options.size) alert.setInput('size', options.size);\n\n this.appRef.attachView(alert.hostView);\n alert.changeDetectorRef.detectChanges();\n\n try {\n return await alert.instance.present();\n } finally {\n this.appRef.detachView(alert.hostView);\n alert.destroy();\n host.remove();\n }\n }\n\n async alert(options: {\n icon?: string;\n titulo: string;\n mensagem: string;\n variant?: ButtonVariants['variant'];\n }): Promise<void> {\n await this.present({\n titulo: options.titulo,\n mensagem: options.mensagem,\n icon: options.icon,\n buttons: [{ id: 'ok', label: 'OK', variant: options.variant }],\n });\n }\n\n async confirm(options: {\n icon?: string;\n titulo: string;\n mensagem: string;\n confirmar?: string;\n cancelar?: string;\n variant?: ButtonVariants['variant'];\n }): Promise<boolean> {\n const result = await this.present({\n titulo: options.titulo,\n mensagem: options.mensagem,\n icon: options.icon,\n buttons: [\n { id: 'cancel', label: options.cancelar ?? 'Cancelar', variant: 'outline' },\n { id: 'confirm', label: options.confirmar ?? 'Confirmar', variant: options.variant },\n ],\n });\n return result === 'confirm';\n }\n}\n","import { inject, Injector } from '@angular/core';\nimport { HttpClient, HttpParams } from '@angular/common/http';\nimport { lastValueFrom } from 'rxjs';\n\nimport { EnvironmentService } from '../environment.service';\nimport { SchemaField } from '../../classes/schema-field/schema-field';\nimport { IIndexParams } from '../../interfaces/index-params';\nimport { IPaginatedResult } from '../../interfaces/paginated-result';\nimport { IView } from '../../interfaces/view';\nimport { SchemaBuilder, SchemaFieldOptionsRecord } from '../../classes/schema-field/schema-builder';\nimport type { IBreadcrumbItem } from '../../components/ui/breadcrumbs/breadcrumbs.component';\nimport { AlertService } from '../../services/alert.service';\n\nexport class SchemaService<\n T extends IView, \n IndexParams extends IIndexParams = IIndexParams, Environment = any, \n> {\n constructor(\n public options: SchemaServiceOptions<T>\n ) {\n this.environmentService = inject(EnvironmentService);\n this.fullRoute = this.environmentService.apiUrl() + this.options.endpoint;\n\n this.schema = this.options.schema;\n this.lstFields = SchemaBuilder.build(this.schema);\n if(this.options.listSchema) {\n this.lstFieldsList = SchemaBuilder.build(this.options.listSchema);\n } else {\n this.lstFieldsList = this.lstFields;\n }\n }\n\n public readonly schema: SchemaFieldOptionsRecord<T>;\n public readonly lstFields: SchemaField<T>[];\n public readonly lstFieldsList: SchemaField<T>[];\n \n public listBreadCrumbs(): IBreadcrumbItem[] {\n if(this.options.breadcrumbs) {\n return this.options.breadcrumbs;\n } else \n\n return [\n { label: this.options.title }\n ]\n }\n public viewBreadCrumbs(uuid: string): IBreadcrumbItem[] {\n if(this.options.breadcrumbs) {\n return this.options.breadcrumbs;\n } else\n\n return [\n { label: this.options.title, routerLink: this.options.endpoint },\n { label: uuid ? 'Edição' : 'Novo' }\n ]\n }\n\n protected fullRoute: string;\n protected environmentService: EnvironmentService<Environment>;\n protected httpClient: HttpClient = inject(HttpClient);\n\n public index(params?: IndexParams, method: 'get' | 'post' = 'get'): Promise<IPaginatedResult<T>> {\n if(method === 'get') {\n return lastValueFrom(this.httpClient.get<IPaginatedResult<T>>(this.fullRoute + '/index', {\n params: this.toHttpParams(params)\n }));\n }\n return lastValueFrom(this.httpClient.post<IPaginatedResult<T>>(this.fullRoute + '/index', params));\n }\n \n private toHttpParams(params?: IndexParams): HttpParams {\n let httpParams = new HttpParams();\n if (!params) return httpParams;\n\n for (const [key, value] of Object.entries(params)) {\n if (value == null || (Array.isArray(value) && !value.length)) {\n continue;\n }\n httpParams = httpParams.set(key, typeof value === 'string' ? value : JSON.stringify(value));\n }\n\n return httpParams;\n }\n\n public show(uuid: string){\n return lastValueFrom(this.httpClient.get<T>(this.fullRoute + `/${uuid}`));\n }\n public async save(values: T | Partial<T>): Promise<T> {\n if(values.uuid) {\n return this.patch(values.uuid, values);\n } else {\n return this.create(values as Omit<T, 'uuid'>);\n }\n }\n public async patch(uuid: string, values: Partial<T>): Promise<T> {\n const route = this.fullRoute + `/${uuid}`;\n return lastValueFrom(this.httpClient.patch<T>(route, this.toBody(values)));\n }\n public async create(values: Omit<T, 'uuid'>){\n const route = this.fullRoute;\n return lastValueFrom(this.httpClient.post<T>(route, this.toBody(values)));\n }\n\n /**\n * Converte os valores em `FormData` quando algum campo contém arquivo; caso contrário, retorna os valores para envio como JSON.\n * No `FormData`, um arquivo vai na chave do campo e uma lista de arquivos em `campo[]` (a API remonta o array);\n * os demais valores vão serializados em JSON, como num body JSON. Campos `undefined` são ignorados.\n */\n private toBody<V extends object>(values: V): V | FormData {\n const entries = Object.entries(values);\n if (!entries.some(([, value]) => this.toFiles(value)?.length)) {\n return values;\n }\n\n const formData = new FormData();\n for (const [key, value] of entries) {\n if (value === undefined) {\n continue;\n }\n const files = this.toFiles(value);\n if (!files) {\n formData.append(key, JSON.stringify(value));\n } else if (value instanceof Blob) {\n formData.append(key, value);\n } else {\n files.forEach((file) => formData.append(`${key}[]`, file));\n }\n }\n return formData;\n }\n\n /** Arquivos do valor (`Blob`/`File`, `FileList` ou array de `Blob`), ou `null` se o valor não for arquivo */\n private toFiles(value: unknown): Blob[] | null {\n if (value instanceof Blob) return [value];\n if (value instanceof FileList) return Array.from(value);\n if (Array.isArray(value) && value.length && value.every((item) => item instanceof Blob)) return value;\n return null;\n }\n public async delete(uuid: string): Promise<void> {\n return lastValueFrom(this.httpClient.delete<void>(this.fullRoute + `/${uuid}`));\n }\n\n private injector = inject(Injector);\n public createForm() {\n return SchemaBuilder.createForm<T>(this.injector, this.schema);\n }\n public defaultValues(): T {\n return SchemaBuilder.defaultValues<T>(this.lstFields);\n }\n\n\n\n public bindLabelFn(): (value: T) => string { \n if(typeof this.options.bindLabel === 'function') {\n return this.options.bindLabel as (value: T) => string;\n } else {\n const prop = this.options.bindLabel as keyof T;\n return (value: T) => value[prop] as unknown as string;\n }\n }\n\n public bindValueFn(): (value: T) => T[keyof T] {\n if(typeof this.options.bindValue === 'function') {\n return this.options.bindValue as (value: T) => T[keyof T];\n } else {\n const prop = this.options.bindValue as keyof T;\n return (value: T) => value[prop];\n }\n }\n\n private alertService = inject(AlertService);\n public async deleteAlert(item: T): Promise<boolean> {\n const message = `Deseja realmente excluir \"${this.bindLabelFn()(item)}\"?`;\n \n const result = await this.alertService.confirm({\n titulo: 'Confirmação',\n mensagem: message,\n confirmar: 'Sim',\n icon: 'lucideTrash2',\n variant: 'destructive',\n });\n if(!result) {\n return false;\n }\n\n await this.delete(item.uuid);\n return true;\n }\n}\n/**\n * Referência a um `SchemaService` de qualquer entidade (ex.: fonte de dados de um Select).\n * `createForm` é omitido porque `FieldTree<any>` do signal forms não aceita `FieldTree<T>` concreto.\n */\nexport type AnySchemaService = Omit<SchemaService<any, any>, 'createForm'>;\n\nexport interface SchemaServiceOptions<T> {\n /** Rota base para as requisições */\n endpoint: string;\n /** Título do schema */\n title: string;\n /** Descrição do schema */\n schema: SchemaFieldOptionsRecord<T>;\n /** Breadcrumbs do schema */\n breadcrumbs?: IBreadcrumbItem[]\n /** Função/propriedade para vincular o valor do campo */\n bindValue: ((value: T) => T[keyof T]) | keyof T;\n /** Função/propriedade para vincular o rótulo do campo */\n bindLabel: ((value: T) => string | T[keyof T]) | keyof T;\n\n listSchema?: SchemaFieldOptionsRecord<T>;\n}","import { CommonModule } from '@angular/common';\nimport { Component, computed, effect, input, InputSignal, model, ModelSignal, resource, ResourceRef, signal, Signal, TemplateRef, untracked, WritableSignal } from '@angular/core';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { FormValueControl } from '@angular/forms/signals';\nimport { Observable, lastValueFrom } from 'rxjs';\n\nimport {\n HlmFieldImports,\n HlmInputImports,\n HlmSelectImports,\n HlmSkeletonImports,\n HlmComboboxImports,\n HlmTooltipImports,\n HlmButtonImports,\n HlmSpinner,\n HlmSpinnerImports,\n} from '@sapphire-caitlyn/schema-kit-ng/helm';\nimport { NgIcon } from '@ng-icons/core';\n\nimport { IPaginatedResult } from '../../../interfaces/paginated-result';\nimport { InputBaseComponent } from '../input-base/input-base.component';\nimport { AnySchemaService, SchemaService } from '../../../services/web/schema.service';\nimport { LoadingInputComponent } from '../loading-input/loading-input.component';\nimport { ErrorMessageProviderComponent } from '../../error-message-provider/error-message-provider.component';\nimport { IIndexFilter } from '../../../interfaces/index-params';\n\ninterface ISelectInternalItem<T, V> {\n model: T;\n label: string | TemplateRef<any>;\n value: V;\n isTemplate: boolean;\n}\n\n@Component({\n imports: [\n HlmSelectImports,\n HlmInputImports,\n HlmFieldImports,\n HlmSkeletonImports,\n HlmComboboxImports,\n HlmTooltipImports,\n HlmButtonImports,\n FormsModule,\n ReactiveFormsModule,\n CommonModule,\n NgIcon,\n LoadingInputComponent,\n ErrorMessageProviderComponent,\n HlmSpinnerImports\n],\n selector: 'input-select',\n styleUrl: './input-select.component.scss',\n templateUrl: './input-select.component.html',\n})\nexport class InputSelectComponent<T, V> extends InputBaseComponent implements FormValueControl<V | null> {\n value: ModelSignal<V | null> = model<V | null>(null);\n\n _value: WritableSignal<ISelectInternalItem<T, V> | null> = signal<ISelectInternalItem<T, V> | null>(null)\n\n _items: InputSignal<readonly T[]> = input<readonly T[]>([], {\n alias: 'items'\n });\n\n _bindLabel: ModelSignal<TBindLabel<T> | null> = model<TBindLabel<T> | null>(null, {\n alias: 'bindLabel'\n });\n bindLabel: Signal<(v: T) => string | TemplateRef<any>> = computed(() => {\n if(this._bindLabel() && typeof this._bindLabel() === 'string') {\n const key = this._bindLabel()! as keyof T;\n return (v: T) => v[key] as string;\n } else \n if (this._bindLabel() && typeof this._bindLabel() === 'function') {\n return this._bindLabel() as (v: T) => string | TemplateRef<any>;\n } else\n if(!this._bindLabel()) {\n return this.schemaService()?.bindLabelFn() ?? (() => { throw new Error('bindLabel is not defined') });\n }\n throw new Error('bindLabel must be defined');\n })\n\n _bindValue: ModelSignal<TBindValue<T, V> | null> = model<TBindValue<T, V> | null>(null, {\n alias: 'bindValue'\n });\n bindValue: Signal<(v: T) => V> = computed(() => {\n if(this._bindValue() && typeof this._bindValue() === 'string') {\n const key = this._bindValue()! as keyof T;\n return (v: T) => v[key] as V;\n } else \n if (this._bindValue() && typeof this._bindValue() === 'function') {\n return this._bindValue() as (v: T) => V;\n } else \n if(!this._bindValue()) {\n return this.schemaService()?.bindValueFn() ?? (() => { throw new Error('bindValue is not defined') });\n }\n throw new Error('bindValue must be defined');\n });\n\n // lstItems: Signal<ISelectInternalItem<T, V>[]> = computed(() => {\n // return this.items().map(item => {\n // const label = this.bindLabel()(item);\n // const value = this.bindValue()(item);\n // return {\n // model: item,\n // label: label,\n // value: value,\n // isTemplate: label instanceof TemplateRef\n // }\n // });\n // })\n //Loads entity unrelated to the index, via query\n // Depende apenas de `value`: ler `items` aqui criaria um ciclo (items depende de preloaded)\n preloaded: ResourceRef<T | null> = resource({\n defaultValue: null,\n params: () => ({ value: this.value() }),\n loader: async ({ params }): Promise<T | null> => {\n const value = params.value;\n const isWithin = untracked(() => this.items.value()).some(item => item.value == value);\n if(isWithin) {\n return null;\n }\n const loadFrom = this.loadFrom();\n if(loadFrom instanceof SchemaService && value && typeof value === 'string') {\n const result = await loadFrom.show(String(value));\n return result;\n }\n return null;\n },\n });\n\n search: WritableSignal<string> = signal('');\n items: ResourceRef<ISelectInternalItem<T, V>[]> = resource({\n\t\tdefaultValue: [],\n\t\tparams: () => ({ search: this.search(), preloaded: this.preloaded.value() }),\n\t\tloader: async ({ params }) => {\n\t\t\tconst search = params.search;\n const items = (await this.searchItems(search)) \n if(params.preloaded) {\n const preloadedItem = params.preloaded;\n const preloadedValue = this.bindValue()(preloadedItem);\n if(!items.some(item => this.bindValue()(item) === preloadedValue)) {\n items.unshift(preloadedItem);\n }\n }\n\n\t\t\treturn items.map(item => {\n const label = this.bindLabel()(item);\n const value = this.bindValue()(item);\n return {\n model: item,\n label: label,\n value: value,\n isTemplate: label instanceof TemplateRef\n }\n });\n },\n\t});\n async searchItems(query: string): Promise<T[]> {\n const loadFrom = this.loadFrom();\n if(loadFrom === null) {\n // Cópia: o loader de `items` faz `unshift` do item pré-carregado\n return [...this._items()];\n }\n if(loadFrom instanceof Observable) {\n const result = await lastValueFrom(loadFrom);\n return result.data;\n }\n if(loadFrom instanceof Promise) {\n const result = await loadFrom;\n return result.data;\n }\n if(loadFrom instanceof SchemaService) {\n const result = await loadFrom.index({ \n lstFilter: this.lstFilter()?.filter(p => p.value !== undefined),\n page: this.page(), \n size: this.size(), \n search: query \n });\n return result.data;\n }\n throw new Error('loadFrom must be an Observable or a Promise');\n }\n\n\n schemaService: InputSignal<AnySchemaService | null> = input<AnySchemaService | null>(null);\n\n lstFilter: InputSignal<IIndexFilter<any, any>[] | null> = input<IIndexFilter<any, any>[] | null>(null);\n\n /** Item selecionado, resolvido a partir de `value` quando ele é alterado externamente (ex.: formulário) */\n selectedItem: Signal<ISelectInternalItem<T, V> | null> = computed(() => {\n const value = this.value();\n if(value === null || value === undefined) {\n return null;\n }\n const current = this._value();\n if(current && current.value === value) {\n return current;\n }\n return this.items.value().find(item => item.value === value) ?? null;\n });\n\n onSelect(item: ISelectInternalItem<T, V> | null) {\n this._value.set(item);\n this.value.set(item?.value ?? null);\n this.touch.emit();\n }\n\n // Os itens são recriados a cada busca, então a comparação é feita pelo value e não pela referência\n isItemEqualToValue = (item: ISelectInternalItem<T, V> | null | undefined, selected: ISelectInternalItem<T, V> | null | undefined): boolean => {\n return !!item && !!selected && item.value === selected.value;\n };\n\n itemToString = (item: ISelectInternalItem<T, V>): string => {\n return typeof item.label === 'string' ? item.label : String(item.value ?? '');\n };\n\n _loadFrom: InputSignal<LoadFrom<T> | null> = input<LoadFrom<T> | null>(null, {\n alias: 'loadFrom'\n });\n loadFrom: Signal<LoadFrom<T> | null> = computed(() => this._loadFrom() || this.schemaService());\n\n page: WritableSignal<number> = signal(1);\n size: WritableSignal<number> = signal(10);\n\n clearable: InputSignal<boolean> = input<boolean>(false)\n} \n\ntype LoadFrom<T> = \n Observable<IPaginatedResult<T>> |\n Promise<IPaginatedResult<T>> |\n AnySchemaService\n\nexport type TBindLabel<T> = keyof T | ((item: T) => string | TemplateRef<any>);\nexport type TBindValue<T, V> = keyof T | ((item: T) => V);\n","<div hlmField [forceInvalid]=\"touched() && invalid()\">\n @if(label()) {\n <label hlmFieldLabel [attr.for]=\"id()\">\n {{label()}}\n\n @if(tooltipInfo()){\n <ng-icon name=\"lucideCircleQuestionMark\" [hlmTooltip]=\"tooltipInfo()!\" position=\"top\"></ng-icon>\n }\n </label>\n }\n <div class=\"relative\">\n <hlm-combobox\n [disabled]=\"isReadonly()\"\n [id]=\"id()\"\n [(search)]=\"search\"\n [ngModel]=\"selectedItem()\"\n (ngModelChange)=\"onSelect($event)\"\n [isItemEqualToValue]=\"isItemEqualToValue\"\n [itemToString]=\"itemToString\"\n >\n <hlm-combobox-trigger [forceInvalid]=\"touched() && invalid()\" [showChevron]=\"false\" class=\"w-full justify-between font-normal truncate\">\n <hlm-combobox-value class=\"truncate\" [placeholder]=\"this.placeholder() || 'Selecione um item'\" />\n \n <ng-template hlmComboboxValueTemplate let-value>\n \n </ng-template>\n\n @if(selectedItem() && clearable() && !isReadonly()) {\n <button hlmBtn variant=\"ghost\" class=\"-mr-2\" size=\"icon-sm\" (click)=\"onSelect(null); $event.stopPropagation()\">\n <ng-icon name=\"lucideCircleX\" />\n </button>\n <!-- <ng-icon name=\"lucideCircleX\" (click)=\"onSelect(null)\"/> -->\n }\n @else {\n <ng-icon name=\"lucideChevronDown\"/>\n }\n </hlm-combobox-trigger>\n <hlm-combobox-content *hlmComboboxPortal>\n <hlm-combobox-input showTrigger=\"false\" placeholder=\"Pesquisar...\" [showClear]=\"true\" />\n <hlm-combobox-empty>Sem itens encontrados.</hlm-combobox-empty>\n @if(loading() || preloaded.isLoading()) {\n <hlm-spinner class=\"mx-auto my-2\" size=\"sm\"></hlm-spinner>\n }\n <div hlmComboboxList>\n @for (item of items.value(); track item.value) {\n <hlm-combobox-item [value]=\"item\" class=\"wrap-anywhere\">\n @if(item.isTemplate){\n <ng-container\n [ngTemplateOutlet]=\"$any(item.label)\"\n [ngTemplateOutletContext]=\"{ $implicit: item.model }\"\n ></ng-container>\n } @else {\n {{ item.label }}\n }\n </hlm-combobox-item>\n }\n </div>\n </hlm-combobox-content>\n </hlm-combobox>\n\n <loading-input [loading]=\"loading() || preloaded.isLoading()\"></loading-input>\n </div>\n\n <error-message-provider [errors]=\"errors()\" [invalid]=\"invalid()\" [touched]=\"touched()\"></error-message-provider>\n</div>\n","import { CommonModule } from '@angular/common';\nimport { Component, computed, input, model, Signal, signal, WritableSignal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { FormValueControl } from '@angular/forms/signals';\n\nimport {\n HlmFieldImports,\n HlmInputImports,\n HlmSkeletonImports,\n HlmTooltipImports,\n} from '@sapphire-caitlyn/schema-kit-ng/helm';\nimport { NgIcon } from '@ng-icons/core';\n\nimport { InputBaseComponent } from '../input-base/input-base.component';\nimport { LoadingInputComponent } from '../loading-input/loading-input.component';\nimport { ErrorMessageProviderComponent } from '../../error-message-provider/error-message-provider.component';\n\n@Component({\n imports: [\n HlmTooltipImports,\n NgIcon,\n HlmInputImports,\n HlmFieldImports,\n HlmSkeletonImports,\n FormsModule,\n CommonModule,\n LoadingInputComponent,\n ErrorMessageProviderComponent\n ],\n selector: 'input-string',\n styleUrl: './input-string.component.scss',\n templateUrl: './input-string.component.html',\n})\nexport class InputStringComponent extends InputBaseComponent implements FormValueControl<string | null | undefined> {\n value = model<string | null | undefined>(null);\n\n _type = input<HTMLInputElement['type'] | undefined>('text', {\n alias: 'type',\n });\n type: Signal<HTMLInputElement['type']> = computed(() => this._type() || 'text');\n}\n","<div hlmField [forceInvalid]=\"touched() && invalid()\">\n @if(label()) {\n <label hlmFieldLabel [attr.for]=\"id()\">\n {{label()}}\n\n @if(tooltipInfo()){\n <ng-icon name=\"lucideCircleQuestionMark\" [hlmTooltip]=\"tooltipInfo()!\" position=\"top\"></ng-icon>\n }\n </label>\n }\n <ng-content select=\"[slot=field]\"></ng-content>\n <div class=\"relative\">\n <input \n hlmInput \n [(ngModel)]=\"value\"\n [disabled]=\"isReadonly()\"\n [attr.id]=\"id()\" \n [attr.type]=\"type()\" \n [placeholder]=\"placeholder() || ''\"\n (blur)=\"touch.emit()\"\n [forceInvalid]=\"touched() && invalid()\"\n >\n <ng-content select=\"[slot=input]\"></ng-content>\n \n <loading-input [loading]=\"loading()\"></loading-input>\n </div>\n\n <error-message-provider [errors]=\"errors()\" [invalid]=\"invalid()\" [touched]=\"touched()\"></error-message-provider>\n</div>\n","import { CommonModule } from '@angular/common';\nimport { Component, computed, input, model, Signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { FormValueControl } from '@angular/forms/signals';\n\nimport {\n HlmFieldImports,\n HlmInputImports,\n HlmSkeletonImports,\n HlmTextareaImports,\n HlmTooltipImports,\n} from '@sapphire-caitlyn/schema-kit-ng/helm';\nimport { NgIcon } from '@ng-icons/core';\n\nimport { InputBaseComponent } from '../input-base/input-base.component';\nimport { LoadingInputComponent } from '../loading-input/loading-input.component';\nimport { ErrorMessageProviderComponent } from '../../error-message-provider/error-message-provider.component';\n\n@Component({\n imports: [\n HlmTooltipImports,\n NgIcon,\n HlmInputImports,\n HlmTextareaImports,\n HlmFieldImports,\n HlmSkeletonImports,\n FormsModule,\n CommonModule,\n LoadingInputComponent,\n ErrorMessageProviderComponent\n ],\n selector: 'input-text-area',\n styleUrl: './input-text-area.component.scss',\n templateUrl: './input-text-area.component.html',\n})\nexport class InputTextAreaComponent extends InputBaseComponent implements FormValueControl<string | null | undefined> {\n value = model<string | null | undefined>(null);\n\n _type = input<HTMLInputElement['type'] | undefined>('text', {\n alias: 'type',\n });\n type: Signal<HTMLInputElement['type']> = computed(() => this._type() || 'text');\n}\n\n","<div hlmField [forceInvalid]=\"touched() && invalid()\">\n @if(label()) {\n <label hlmFieldLabel [attr.for]=\"id()\">\n {{label()}}\n\n @if(tooltipInfo()){\n <ng-icon name=\"lucideCircleQuestionMark\" [hlmTooltip]=\"tooltipInfo()!\" position=\"top\"></ng-icon>\n }\n </label>\n }\n <div class=\"relative\">\n <textarea \n hlmTextarea \n [(ngModel)]=\"value\"\n [disabled]=\"isReadonly()\"\n [attr.id]=\"id()\" \n [attr.type]=\"type()\" \n [placeholder]=\"placeholder() || ''\"\n (blur)=\"touch.emit()\"\n [forceInvalid]=\"touched() && invalid()\"\n ></textarea>\n <ng-content select=\"[slot=input]\"></ng-content>\n \n <loading-input [loading]=\"loading()\"></loading-input>\n </div>\n\n <error-message-provider [errors]=\"errors()\" [invalid]=\"invalid()\" [touched]=\"touched()\"></error-message-provider>\n</div>\n","import { CommonModule } from '@angular/common';\nimport { Component, model } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { FormValueControl } from '@angular/forms/signals';\n\nimport { NgIcon } from '@ng-icons/core';\nimport {\n HlmFieldImports,\n HlmInputImports,\n HlmSkeletonImports,\n HlmTooltipImports,\n HlmCodeBlockImports,\n HlmButtonImports,\n} from '@sapphire-caitlyn/schema-kit-ng/helm';\n\nimport { ErrorMessageProviderComponent } from '../../../components/error-message-provider/error-message-provider.component';\nimport { LoadingInputComponent } from '../loading-input/loading-input.component';\nimport { InputBaseComponent } from '../input-base/input-base.component';\n\n@Component({\n imports: [\n HlmTooltipImports,\n NgIcon,\n HlmInputImports,\n HlmFieldImports,\n HlmSkeletonImports,\n HlmCodeBlockImports,\n FormsModule,\n CommonModule,\n LoadingInputComponent,\n ErrorMessageProviderComponent,\n HlmButtonImports\n],\n selector: 'input-json',\n styleUrl: './input-json.component.scss',\n templateUrl: './input-json.component.html',\n})\nexport class InputJsonComponent extends InputBaseComponent implements FormValueControl<string | null | undefined | object> {\n value = model<string | null | undefined | object>(null);\n\n mode = model<'edit' | 'view'>('view');\n\n formatJson() {\n try {\n const parsed = JSON.parse(String(this.value()) || '{}');\n this.value.set(JSON.stringify(parsed, null, 2));\n } catch (error) {\n console.error('Invalid JSON:', error);\n }\n }\n}\n","<div hlmField [forceInvalid]=\"touched() && invalid()\">\n @if(label()) {\n <label hlmFieldLabel [attr.for]=\"id()\">\n {{label()}}\n\n @if(tooltipInfo()){\n <ng-icon name=\"lucideCircleQuestionMark\" [hlmTooltip]=\"tooltipInfo()!\" position=\"top\"></ng-icon>\n }\n </label>\n }\n <ng-content select=\"[slot=field]\"></ng-content>\n <div class=\"relative\">\n <hlm-code-block class=\"size-full min-h-12 max-h-[50vh]\">\n <hlm-code-block-header>\n <hlm-code-block-title>{{ label() }}</hlm-code-block-title>\n <hlm-code-block-actions>\n <button hlmCodeBlockCopyButton [value]=\"value()?.toString() || 'null'\"></button>\n <button hlmBtn (click)=\"mode.set(mode() == 'edit' ? 'view' : 'edit')\" [variant]=\"'ghost'\" size=\"icon-sm\">\n <ng-icon name=\"lucidePencil\"></ng-icon>\n </button>\n <button hlmBtn (click)=\"formatJson()\" [variant]=\"'ghost'\" size=\"icon-sm\">\n <ng-icon name=\"lucideTextCursorInput\"></ng-icon>\n </button>\n </hlm-code-block-actions>\n </hlm-code-block-header>\n @if(mode() === 'edit') {\n <textarea\n hlmInput\n class=\"size-full bg-transparent! text-sm font-mono! mt-2 border-0 focus:ring-0 focus-visible:ring-0\"\n [id]=\"id()\"\n [placeholder]=\"placeholder() || ''\"\n [(ngModel)]=\"value\" \n ></textarea>\n } @else {\n <pre \n class=\"min-h-fit\"\n hlmCodeBlockContent \n lineNumbers\n wrap\n [code]=\"value()?.toString() || 'null'\"\n >\n </pre>\n }\n <!-- <pre \n class=\"min-h-fit\"\n hlmCodeBlockContent \n lineNumbers\n wrap\n [code]=\"value() || 'null'\"\n >\n </pre> -->\n </hlm-code-block>\n\n\n\n\n <ng-content select=\"[slot=input]\"></ng-content>\n \n <loading-input [loading]=\"loading()\"></loading-input>\n </div>\n\n <error-message-provider [errors]=\"errors()\" [invalid]=\"invalid()\" [touched]=\"touched()\"></error-message-provider>\n</div>\n","import { InputDateComponent } from './date/input-date/input-date.component';\nimport { InputDateSpanComponent } from './date/input-date-span/input-date-span.component';\nimport { InputDateTimeComponent } from './date/input-date-time/input-date-time.component';\nimport { InputDateTimeSpanComponent } from './date/input-date-time-span/input-date-time-span.component';\nimport { InputTimeComponent } from './date/input-time/input-time.component';\nimport { InputTimeSpanComponent } from './date/input-time-span/input-time-span.component';\nimport { InputBoolComponent } from './input-bool/input-bool.component';\nimport { InputColorComponent } from './input-color/input-color.component';\nimport { InputCpfCnpjComponent } from './input-cpf-cnpj/input-cpf-cnpj.component';\nimport { InputFileComponent } from './input-file/input-file.component';\nimport { InputIconComponent } from './input-icon/input-icon.component';\nimport { InputMaskComponent } from './input-mask/input-mask.component';\nimport { InputNumberComponent } from './input-number/input-number.component';\nimport { InputPhoneComponent } from './input-phone/input-phone.component';\nimport { InputSelectComponent } from './input-select/input-select.component';\nimport { InputStringComponent } from './input-string/input-string.component';\nimport { InputTextAreaComponent } from './input-text-area/input-text-area.component';\nimport { InputJsonComponent } from './input-json/input-json.component';\n\nexport * from './date/input-date/input-date.component';\nexport * from './date/input-date-span/input-date-span.component';\nexport * from './date/input-date-time/input-date-time.component';\nexport * from './date/input-date-time-span/input-date-time-span.component';\nexport * from './date/input-time/input-time.component';\nexport * from './date/input-time-span/input-time-span.component';\nexport * from './date/span';\nexport * from './input-bool/input-bool.component';\nexport * from './input-color/input-color.component';\nexport * from './input-cpf-cnpj/input-cpf-cnpj.component';\nexport * from './input-file/input-file.component';\nexport * from './input-icon/input-icon.component';\nexport * from './input-mask/input-mask.component';\nexport * from './input-number/input-number.component';\nexport * from './input-phone/input-phone.component';\nexport * from './input-select/input-select.component';\nexport * from './input-string/input-string.component';\nexport * from './input-text-area/input-text-area.component';\nexport * from './input-json/input-json.component';\n\nexport const InputImports = [\n InputDateComponent, \n InputDateSpanComponent,\n InputDateTimeComponent,\n InputDateTimeSpanComponent,\n InputTimeComponent,\n InputTimeSpanComponent,\n InputBoolComponent,\n InputColorComponent,\n InputCpfCnpjComponent,\n InputFileComponent,\n InputIconComponent,\n InputMaskComponent,\n InputNumberComponent,\n InputPhoneComponent,\n InputSelectComponent,\n InputStringComponent,\n InputTextAreaComponent,\n InputJsonComponent\n] as const;","import { Component, computed, input, InputSignal, model, ModelSignal, Signal } from '@angular/core';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { FormValueControl } from '@angular/forms/signals';\nimport { CommonModule } from '@angular/common';\nimport z from 'zod';\n\nimport { NgIcon } from '@ng-icons/core';\nimport {\n HlmButtonImports,\n HlmPopoverImports,\n HlmTooltipImports,\n HlmButtonGroupImports,\n} from '@sapphire-caitlyn/schema-kit-ng/helm';\n\nimport { FieldType } from '../../../classes/schema-field/field-type';\nimport { InputStringComponent } from '../../inputs/input-string/input-string.component';\nimport { setSpanEdge, Span } from '../../inputs/date/span';\nimport { SchemaFieldAnyTypeOptions } from '../../../classes/schema-field/schema-field';\nimport { AnySchemaService } from '../../../services/web/schema.service';\nimport { InputImports } from '../../inputs/input-index';\n\ntype TFilterValue<V> = V | null | undefined;\n\n@Component({\n imports: [\n HlmPopoverImports,\n HlmButtonImports,\n HlmButtonGroupImports,\n HlmTooltipImports,\n CommonModule,\n ReactiveFormsModule,\n FormsModule,\n InputStringComponent,\n InputImports,\n NgIcon,\n ],\n selector: 'schema-table-filter',\n styleUrl: './schema-table-filter.component.scss',\n templateUrl: './schema-table-filter.component.html',\n})\nexport class SchemaTableFilterComponent<V, T extends FieldType> implements FormValueControl<TFilterValue<V>> {\n value: ModelSignal<TFilterValue<V>> = model<TFilterValue<V>>(null);\n\n label: InputSignal<string> = input<string>('');\n\n type: InputSignal<T> = input<T>(FieldType.String as T);\n\n options: InputSignal<SchemaFieldAnyTypeOptions | null> = input<SchemaFieldAnyTypeOptions | null>(null);\n\n FieldType = FieldType;\n\n hasValue: Signal<boolean> = computed(() => hasFilterValue(this.value()));\n\n schemaService: Signal<AnySchemaService | null> = computed(() => this.options()?.service?.() ?? null);\n\n /** Value dos filtros de intervalo (Number/Decimal/Currency): `[min, max]`, igual aos filtros de data */\n range: Signal<Span<number> | null> = computed(() => {\n const value = this.value();\n return Array.isArray(value) ? value as Span<number> : null;\n });\n\n setRangeEdge(index: 0 | 1, edge: number | null): void {\n this.setValue(setSpanEdge(this.range(), index, edge) as TFilterValue<V>);\n }\n\n // The inner inputs emit null/'' when cleared, so those mean \"no filter\" here.\n setValue(value: TFilterValue<V>): void {\n const setValue: TFilterValue<V> = value === null || value === '' ? null : value;\n \n if(this.type() === FieldType.UUID && setValue){\n const parse = z.uuid().safeParse(setValue)\n if(parse.success) {\n this.value.set(setValue);\n }\n return;\n }\n\n this.value.set(setValue);\n }\n}\n\nexport function hasFilterValue(v: unknown): boolean {\n if (v === null || v === undefined) return false;\n if (typeof v === 'string') return v.trim() !== '';\n if (Array.isArray(v)) return v.length > 0; // multi-select filters\n return true;\n}\n","<hlm-popover sideOffset=\"5\" align=\"start\">\n\n <div hlmButtonGroup>\n <button hlmPopoverTrigger hlmBtn variant=\"outline\" size=\"sm\">\n <ng-icon name=\"lucideFunnel\" class=\"text-lg shrink-0\"></ng-icon>\n {{ label() }}\n </button>\n @if (hasValue()) {\n <button hlmBtn size=\"icon-sm\" variant=\"outline\" (click)=\"setValue(null)\" hlmTooltip=\"Limpar filtro\" position=\"top\">\n <ng-icon name=\"lucideSquareX\" class=\"text-lg shrink-0\"></ng-icon>\n </button>\n }\n </div>\n\n\n <hlm-popover-content *hlmPopoverPortal=\"let ctx\">\n <hlm-popover-header>\n <div hlmPopoverTitle>\n {{ label() }}\n </div>\n <p hlmPopoverDescription>\n Filtros de {{ label() }}.\n </p>\n\n @switch (type()) {\n @case (FieldType.UUID)\n @case (FieldType.TextArea)\n @case (FieldType.String) {\n <input-string\n [ngModel]=\"value()\" (ngModelChange)=\"setValue($event)\"\n [placeholder]=\"'Digite o valor do filtro'\"\n ></input-string>\n }\n @case (FieldType.Mask) {\n <input-mask\n [ngModel]=\"value()\" (ngModelChange)=\"setValue($event)\"\n [maskitoOptions]=\"options()?.maskitoOptions!\"\n [unmaskHandler]=\"options()?.unmaskHandler\"\n [placeholder]=\"'Digite o valor do filtro'\"\n ></input-mask>\n }\n @case (FieldType.Icon) {\n <input-icon\n [ngModel]=\"value()\" (ngModelChange)=\"setValue($event)\"\n [placeholder]=\"'Selecione o valor do filtro'\"\n ></input-icon>\n }\n @case (FieldType.Number) {\n <div class=\"grid grid-cols-2 gap-2\">\n <input-number\n label=\"Mínimo\"\n [ngModel]=\"range()?.[0] ?? null\" (ngModelChange)=\"setRangeEdge(0, $event)\"\n ></input-number>\n <input-number\n label=\"Máximo\"\n [ngModel]=\"range()?.[1] ?? null\" (ngModelChange)=\"setRangeEdge(1, $event)\"\n ></input-number>\n </div>\n }\n @case (FieldType.Decimal) {\n <div class=\"grid grid-cols-2 gap-2\">\n <input-decimal\n label=\"Mínimo\"\n [ngModel]=\"range()?.[0] ?? null\" (ngModelChange)=\"setRangeEdge(0, $event)\"\n ></input-decimal>\n <input-decimal\n label=\"Máximo\"\n [ngModel]=\"range()?.[1] ?? null\" (ngModelChange)=\"setRangeEdge(1, $event)\"\n ></input-decimal>\n </div>\n }\n @case (FieldType.Currency) {\n <div class=\"grid grid-cols-2 gap-2\">\n <input-currency\n label=\"Mínimo\"\n [ngModel]=\"range()?.[0] ?? null\" (ngModelChange)=\"setRangeEdge(0, $event)\"\n ></input-currency>\n <input-currency\n label=\"Máximo\"\n [ngModel]=\"range()?.[1] ?? null\" (ngModelChange)=\"setRangeEdge(1, $event)\"\n ></input-currency>\n </div>\n }\n @case (FieldType.Date) {\n <input-date-span\n [ngModel]=\"value()\" (ngModelChange)=\"setValue($event)\"\n ></input-date-span>\n }\n @case (FieldType.DateTime) {\n <input-date-time-span\n [ngModel]=\"value()\" (ngModelChange)=\"setValue($event)\"\n ></input-date-time-span>\n }\n @case (FieldType.Time) {\n <input-time-span\n [ngModel]=\"value()\" (ngModelChange)=\"setValue($event)\"\n ></input-time-span>\n }\n @case (FieldType.Bool) {\n <input-select\n bindLabel=\"label\"\n bindValue=\"value\"\n [items]=\"[ \n { label: 'Sim', value: true }, \n { label: 'Não', value: false } \n ]\"\n [ngModel]=\"value()\" (ngModelChange)=\"setValue($event)\"\n ></input-select>\n }\n @case (FieldType.Phone) {\n <input-phone\n [ngModel]=\"value()\" (ngModelChange)=\"setValue($event)\"\n [placeholder]=\"'Digite o valor do filtro'\"\n ></input-phone>\n }\n @case (FieldType.CpfCnpj) {\n <input-cpf-cnpj\n [ngModel]=\"value()\" (ngModelChange)=\"setValue($event)\"\n [placeholder]=\"'Digite o valor do filtro'\"\n ></input-cpf-cnpj>\n }\n @case (FieldType.Cpf) {\n <input-cpf\n [ngModel]=\"value()\" (ngModelChange)=\"setValue($event)\"\n [placeholder]=\"'Digite o valor do filtro'\"\n ></input-cpf>\n }\n @case (FieldType.Cnpj) {\n <input-cnpj\n [ngModel]=\"value()\" (ngModelChange)=\"setValue($event)\"\n [placeholder]=\"'Digite o valor do filtro'\"\n ></input-cnpj>\n }\n @case (FieldType.Select) {\n <input-select\n [ngModel]=\"value()\" (ngModelChange)=\"setValue($event)\"\n [schemaService]=\"schemaService()\"\n [lstFilter]=\"options()?.lstFilter ?? null\"\n [items]=\"options()?.lstOptions ?? []\"\n [bindValue]=\"options()?.bindValue ?? null\"\n [bindLabel]=\"options()?.bindLabel ?? null\"\n [placeholder]=\"'Selecione o valor do filtro'\"\n ></input-select>\n }\n }\n\n </hlm-popover-header>\n </hlm-popover-content>\n</hlm-popover>\n","import { inject, Pipe, PipeTransform } from '@angular/core';\n\nimport { SCHEMA_KIT_PERMISSAO_CHECKER } from '../schema-kit.module';\n\n@Pipe({\n name: 'hasPermissao',\n // Impuro: o checker lê signals (lista de permissões), que um pipe puro não reavaliaria\n pure: false,\n})\nexport class HasPermissaoPipe<PermissaoPath extends string> implements PipeTransform {\n private permissaoChecker = inject(SCHEMA_KIT_PERMISSAO_CHECKER);\n\n transform(permissao: PermissaoPath | PermissaoPath[] | null | undefined): boolean {\n return permissao == null || this.permissaoChecker(permissao);\n }\n}\n","export enum SortOrder {\n ASC = 'ASC',\n DESC = 'DESC',\n}\n\nexport interface IIndexParamsSort<T> {\n field: keyof T;\n order: SortOrder;\n}\n\nexport interface IIndexParams<T = any> {\n page?: number;\n size?: number;\n sort?: IIndexParamsSort<T>[];\n \n query?: string;\n lstUuids?: string[];\n lstFilter?: IIndexFilter<T, any>[];\n}\n\nexport interface IIndexFilter<T, V> {\n index: keyof T;\n value: V\n}","import { Directive, inject, input, TemplateRef } from '@angular/core';\n\n@Directive({\n selector: 'ng-template[schemaTableActions]',\n})\nexport class SchemaTableActionsDirective<T = any> {\n template = inject<TemplateRef<{ $implicit: T }>>(TemplateRef);\n\n position = input<'start' | 'end'>('end');\n\n static ngTemplateContextGuard<T>(\n _dir: SchemaTableActionsDirective<T>,\n _ctx: unknown,\n ): _ctx is { $implicit: T } {\n return true;\n }\n}\n","import { Directive, inject, input, TemplateRef } from '@angular/core';\n\nimport type { ITemplateContext } from './schema-table.component';\n\n/** Substitui a célula da coluna `schemaTableReplacementFor` pelo template */\n@Directive({\n selector: 'ng-template[schemaTableReplacementFor]',\n})\nexport class SchemaTableReplacementForDirective<T = any, V = any> {\n template = inject<TemplateRef<ITemplateContext<T, V>>>(TemplateRef);\n\n /** Index do campo cuja célula será substituída */\n index = input.required<keyof T>({ alias: 'schemaTableReplacementFor' });\n\n static ngTemplateContextGuard<T, V>(\n _dir: SchemaTableReplacementForDirective<T, V>,\n _ctx: unknown,\n ): _ctx is ITemplateContext<T, V> {\n return true;\n }\n}\n","import { Component, input, InputSignal } from '@angular/core';\nimport { RouterModule } from '@angular/router';\n\nimport { NgIcon } from '@ng-icons/core';\nimport { HlmBreadcrumbImports } from '@sapphire-caitlyn/schema-kit-ng/helm';\n\n@Component({\n imports: [\n HlmBreadcrumbImports,\n RouterModule,\n NgIcon\n ],\n selector: 'breadcrumbs',\n styleUrl: './breadcrumbs.component.scss',\n templateUrl: './breadcrumbs.component.html',\n})\nexport class BreadcrumbsComponent {\n items: InputSignal<IBreadcrumbItem[]> = input<IBreadcrumbItem[]>([])\n}\n\nexport interface IBreadcrumbItem {\n routerLink?: string;\n label: string;\n icon?: string;\n}\n","<nav hlmBreadcrumb>\n <ol hlmBreadcrumbList>\n @for (item of items(); track $index; let last = $last) {\n <li hlmBreadcrumbItem>\n @if (!last && item.routerLink) {\n <a hlmBreadcrumbLink [routerLink]=\"item.routerLink\">\n <ng-icon [name]=\"item.icon\"></ng-icon>\n {{ item.label }}\n </a>\n } @else {\n <span hlmBreadcrumbPage>{{ item.label }}</span>\n }\n </li>\n @if (!last) {\n <li hlmBreadcrumbSeparator></li>\n }\n }\n </ol>\n</nav>","import { Directive, inject, input, TemplateRef } from '@angular/core';\n\n@Directive({\n selector: 'ng-template[schemaTableToolbar]',\n})\nexport class SchemaTableToolbarDirective<T = any> {\n template = inject<TemplateRef<{ $implicit: T }>>(TemplateRef);\n\n position = input<'start' | 'end'>('end');\n\n static ngTemplateContextGuard<T>(\n _dir: SchemaTableToolbarDirective<T>,\n _ctx: unknown,\n ): _ctx is { $implicit: T } {\n return true;\n }\n}\n","import {\n Component,\n computed,\n contentChildren,\n effect,\n inject,\n input,\n InputSignal,\n linkedSignal,\n model,\n ModelSignal,\n output,\n reflectComponentType,\n resource,\n signal,\n Signal,\n TemplateRef,\n Type,\n untracked,\n viewChild,\n WritableSignal,\n} from '@angular/core';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { CommonModule } from '@angular/common';\nimport { ActivatedRoute, Router, RouterLink } from '@angular/router';\nimport { applyEach, debounce, form, FormField } from '@angular/forms/signals';\nimport { NgScrollbarModule } from 'ngx-scrollbar';\nimport { maskitoTransform } from '@maskito/core';\nimport { maskitoStringifyNumber } from '@maskito/kit';\nimport { DateTime } from 'luxon';\n\nimport { NgIcon } from '@ng-icons/core';\nimport {\n HlmNumberedPagination,\n HlmInputImports,\n HlmBreadcrumbImports,\n HlmCardImports,\n HlmTableImports,\n HlmButtonImports,\n HlmSpinnerImports,\n HlmScrollAreaImports,\n HlmSkeletonImports,\n HlmPopoverImports,\n HlmTooltipImports,\n HlmInputGroupImports,\n HlmCodeBlockImports,\n HlmButtonGroupImports,\n HlmDialogImports,\n HlmSwitchImports,\n} from '@sapphire-caitlyn/schema-kit-ng/helm';\nimport { provideBrnTooltipGroup, BrnTooltip } from '@spartan-ng/brain/tooltip';\nimport { toast } from '@spartan-ng/brain/sonner';\n\nimport { IView } from '../../interfaces/view';\nimport { IPaginatedResult } from '../../interfaces/paginated-result';\nimport { maskitoOptionsCNPJ, maskitoOptionsCPF, maskitoOptionsCPFOrCNPJ } from '../inputs/input-cpf-cnpj/input-cpf-cnpj.component';\nimport { Span } from '../inputs/date/span';\nimport { maskitoOptionsPhone } from '../inputs/input-phone/input-phone.component';\nimport { LoadingComponent } from '../ui/loading/loading.component';\nimport { fileItemsFromValue, FilePreviewComponent } from '../ui/file-preview/file-preview.component';\nimport { hasFilterValue, SchemaTableFilterComponent } from './schema-table-filter/schema-table-filter.component';\nimport { HasPermissaoPipe } from '../../pipes/has-permissao.pipe';\nimport { IIndexFilter, IIndexParams, SortOrder } from '../../interfaces/index-params';\nimport { SchemaField } from '../../classes/schema-field/schema-field';\nimport { SchemaService } from '../../services/web/schema.service';\nimport { SCHEMA_KIT_OPTIONS, SchemaKitModuleOptions } from '../../schema-kit.module';\nimport { SchemaTableActionsDirective } from './schema-table-actions.directive';\nimport { SchemaTableReplacementForDirective } from './schema-table-replacement-for.directive';\nimport { IBreadcrumbItem, BreadcrumbsComponent } from '../ui/breadcrumbs/breadcrumbs.component';\nimport { FieldType } from '../../classes/schema-field/field-type';\nimport { SchemaTableToolbarDirective } from '../../components/schema-table/schema-table-toolbar.directive';\n\n@Component({\n selector: 'schema-table',\n imports: [\n FormsModule,\n ReactiveFormsModule,\n CommonModule,\n RouterLink,\n FormField,\n NgScrollbarModule,\n NgIcon,\n HlmNumberedPagination,\n HlmInputImports,\n HlmBreadcrumbImports,\n HlmCardImports,\n HlmDialogImports,\n HlmPopoverImports,\n HlmTableImports,\n HlmButtonImports,\n HlmSpinnerImports,\n HlmScrollAreaImports,\n HlmSkeletonImports,\n HlmPopoverImports,\n HlmTooltipImports,\n BrnTooltip,\n HlmInputGroupImports,\n HlmCodeBlockImports,\n HlmButtonGroupImports,\n HlmSwitchImports,\n LoadingComponent,\n FilePreviewComponent,\n SchemaTableFilterComponent,\n HasPermissaoPipe,\n SchemaTableActionsDirective,\n BreadcrumbsComponent,\n // IfHasPermissaoDirective,\n ],\n providers: [provideBrnTooltipGroup()],\n templateUrl: './schema-table.component.html',\n styleUrl: './schema-table.component.scss',\n})\nexport class SchemaTableComponent<\n T extends IView,\n IP extends IIndexParams = IIndexParams,\n Permissao extends string = string\n> {\n options: SchemaKitModuleOptions = inject(SCHEMA_KIT_OPTIONS);\n\n noQuery = input<boolean>(false);\n\n schemaService: InputSignal<SchemaService<T, IP>> = input.required();\n templateBool: Signal<TemplateRef<ITemplateContext<T, boolean>> | undefined> = viewChild('templateBool');\n templateIcon: Signal<TemplateRef<ITemplateContext<T, string>> | undefined> = viewChild('templateIcon');\n templateJSON: Signal<TemplateRef<ITemplateContext<T, unknown>> | undefined> = viewChild('templateJSON');\n templateFile: Signal<TemplateRef<ITemplateContext<T, string | string[] | null>> | undefined> = viewChild('templateFile');\n\n\n lstReplacements = contentChildren(SchemaTableReplacementForDirective);\n\n lstField: Signal<SchemaField<T>[]> = computed(() => {\n const templateBool = this.templateBool();\n const replacements = this.lstReplacements();\n\n return this.schemaService().lstFieldsList.map((f) => {\n const newF = { ...f };\n\n // O template informado no uso da tabela tem prioridade sobre o do schema e o padrão do tipo\n let templateReplacement: TableCellTemplate<T> | null | undefined =\n replacements.find((r) => r.index() === newF.index)?.template;\n\n if(!templateReplacement && !newF.listOptions?.template) {\n switch(newF.type) {\n case FieldType.Bool:\n templateReplacement = templateBool;\n break;\n case FieldType.Cnpj:\n templateReplacement = (obj: T) => {\n const v = obj[newF.index] as unknown as string;\n return maskitoTransform(v, maskitoOptionsCNPJ);\n };\n break;\n case FieldType.Cpf:\n templateReplacement = (obj: T) => {\n const v = obj[newF.index] as unknown as string;\n return v ? maskitoTransform(v, maskitoOptionsCPF) : '';\n };\n break;\n case FieldType.CpfCnpj:\n templateReplacement = (obj: T) => {\n const v = obj[newF.index] as unknown as string;\n return v ? maskitoTransform(v, maskitoOptionsCPFOrCNPJ) : '';\n };\n break;\n case FieldType.Phone:\n templateReplacement = (obj: T) => {\n const v = obj[newF.index] as unknown as string;\n return maskitoTransform(v, maskitoOptionsPhone);\n };\n break;\n case FieldType.Mask: {\n const maskitoOptions = newF.options?.maskitoOptions;\n if(maskitoOptions) {\n templateReplacement = (obj: T) => {\n const v = obj[newF.index] as unknown as string;\n return v ? maskitoTransform(v, maskitoOptions) : '';\n };\n }\n break;\n }\n case FieldType.Number:\n case FieldType.Decimal:\n case FieldType.Currency:\n templateReplacement = (obj: T) => formatNumber(obj[newF.index], newF.type);\n break;\n case FieldType.Icon:\n templateReplacement = this.templateIcon();\n break;\n case FieldType.Date:\n templateReplacement = (obj: T) => {\n const v = obj[newF.index] as unknown as string;\n return v ? DateTime.fromISO(v).toFormat('dd/MM/yyyy') : '';\n }\n break;\n case FieldType.DateTime:\n templateReplacement = (obj: T) => {\n const v = obj[newF.index] as unknown as string;\n return v ? DateTime.fromISO(v).toFormat('dd/MM/yyyy HH:mm:ss') : '';\n }\n break;\n case FieldType.Time:\n templateReplacement = (obj: T) => {\n const v = obj[newF.index] as unknown as string;\n return v ? DateTime.fromISO(v).toFormat('HH:mm:ss') : '';\n }\n break;\n case FieldType.DateSpan:\n templateReplacement = (obj: T) => formatSpan(obj[newF.index] as unknown as Span, 'dd/MM/yyyy');\n break;\n case FieldType.DateTimeSpan:\n templateReplacement = (obj: T) => formatSpan(obj[newF.index] as unknown as Span, 'dd/MM/yyyy HH:mm:ss');\n break;\n case FieldType.TimeSpan:\n templateReplacement = (obj: T) => formatSpan(obj[newF.index] as unknown as Span, 'HH:mm:ss');\n break;\n case FieldType.JSON:\n templateReplacement = this.templateJSON();\n break;\n case FieldType.File:\n templateReplacement = this.templateFile();\n break;\n default:\n break;\n }\n }\n\n if (templateReplacement) {\n newF.listOptions = {\n ...newF.listOptions,\n template: templateReplacement,\n };\n }\n\n return newF;\n });\n });\n\n lstFieldSort: Signal<Partial<Record<keyof T, SortOrder | undefined>>> = computed(() => {\n const sort = this.sort();\n const sortMap: Partial<Record<keyof T, SortOrder | undefined>> = {};\n if (sort) {\n for (const s of sort) {\n sortMap[s.field] = s.order;\n }\n }\n return sortMap;\n });\n\n SortOrder = SortOrder;\n fileItemsFromValue = fileItemsFromValue;\n\n lstBreadCrumbs: Signal<IBreadcrumbItem[]> = computed(() => this.schemaService().listBreadCrumbs());\n\n \n lstActions = contentChildren(SchemaTableActionsDirective);\n actionsStart = computed(() => this.lstActions().filter((a) => a.position() === 'start'));\n actionsEnd = computed(() => this.lstActions().filter((a) => a.position() === 'end'));\n\n lstToolbarContent = contentChildren(SchemaTableToolbarDirective);\n toolbarStart = computed(() => this.lstToolbarContent().filter((a) => a.position() === 'start'));\n toolbarEnd = computed(() => this.lstToolbarContent().filter((a) => a.position() === 'end'));\n\n /** Valores de cada item da tabela calculados em signal (memoizado) */\n // rows: Signal<TableRow<T>[]> = computed(() => {\n // const fields = this.lstField();\n\n // return this.lstItems().map((item) => {\n // const cells = {} as Record<keyof T, TableCell<T>>;\n\n // for (const field of fields) {\n // cells[field.index] = this.toCell(item, field);\n // }\n\n // return { item, cells };\n // });\n // });\n\n // /** Resolve o template de um campo para uma célula tipada */\n\n rows = resource({\n params: () => ({ \n items: this.lstItems(), \n fields: this.lstField() \n }),\n loader: async ({ params }) => {\n const { items, fields } = params;\n\n //Carrega os items de select\n const lstField = fields.filter((f) => f.options?.service && f.type === FieldType.Select);\n\n const lstRequests = lstField.map(async (f) => {\n const localItems = items.map((item) => item[f.index]).filter((v) => v !== null && v !== undefined);\n const service = f.options!.service!();\n if(!localItems.length || !service) {\n return {\n valid: false,\n endpoint: service?.options.endpoint,\n }\n }\n \n return {\n valid: true,\n endpoint: service?.options.endpoint,\n request: await service?.index({ \n lstUuids: localItems,\n page: 1,\n size: localItems.length\n }, 'post')\n }\n })\n \n const lstResponses = await Promise.all(lstRequests);\n const responseMap: Record<string, IPaginatedResult<unknown>> = lstResponses.reduce((acc, response) => {\n if (!response.valid || !response.endpoint || !response.request) {\n return acc;\n }\n return {\n ...acc,\n [response.endpoint]: response.request\n }\n }, {})\n\n return this.lstItems().map((item) => {\n const cells = {} as Record<keyof T, TableCell<T>>;\n\n for (const field of fields) {\n const service = field.options?.service?.();\n let endpoint = service?.options.endpoint;\n if(endpoint && responseMap[endpoint]) {\n let response = responseMap[endpoint];\n cells[field.index] = this.toCell(item, field, {\n response,\n bindLabelFn: service?.bindLabelFn(),\n bindValueFn: service?.bindValueFn()\n });\n continue;\n }\n cells[field.index] = this.toCell(item, field);\n }\n\n return { item, cells };\n });\n }\n })\n private toCell(item: T, field: SchemaField<T>, fromService?: {\n response?: IPaginatedResult<any>,\n bindLabelFn?: (value: any) => string,\n bindValueFn?: (value: any) => any\n }): TableCell<T> {\n const template = field.listOptions?.template as TableCellTemplate<T> | undefined;\n\n if(fromService?.response && fromService?.bindLabelFn && fromService?.bindValueFn && !template) {\n const { response, bindValueFn, bindLabelFn } = fromService;\n const rawValue = item[field.index];\n const match = response.data?.find((p) => bindValueFn(p) == rawValue);\n\n // Falls back to the raw value when the related record wasn't returned by the service\n return { text: match ? bindLabelFn(match) : rawValue };\n }\n\n if (!template) {\n return { text: item[field.index] || '-' };\n }\n\n if (template instanceof TemplateRef) {\n return { template };\n }\n\n // Component classes are also `typeof 'function'`, so check them before calling\n if (reflectComponentType(template as Type<unknown>)) {\n return { component: template as Type<unknown> };\n }\n\n\n return { text: (template as (item: T) => string)(item) };\n }\n\n\n page: ModelSignal<number> = model(1);\n limit: ModelSignal<number> = model(this.options.paginationOptions.rows);\n // Keeps the last known total while a new page is loading, so pagination doesn't reset.\n total: Signal<number> = linkedSignal<number | undefined, number>({\n source: () => (this.itemsResource.hasValue() ? this.itemsResource.value().total : undefined),\n computation: (count, previous) => count ?? previous?.value ?? 0,\n });\n\n sort: ModelSignal<IIndexParams<T>['sort']> = model<IIndexParams<T>['sort']>([]);\n\n onSort(field: keyof T): void {\n const currentSort = this.sort()!;\n const newSort = currentSort.filter((s) => s.field !== field);\n const currentFieldSort = currentSort.find((s) => s.field === field);\n const order =\n !currentFieldSort ? SortOrder.ASC :\n currentFieldSort.order === SortOrder.ASC ? SortOrder.DESC : null;\n if (order) {\n newSort.push({\n field,\n order,\n });\n }\n // If order is null, the sort for this field is removed (nothing pushed).\n this.sort.set(newSort);\n }\n\n private emptyFilters(): Record<keyof T, IIndexFilter<T, unknown>> {\n // Reads the raw schema fields (not lstField) so filter state isn't reset when templateBool resolves.\n return this.schemaService().lstFieldsList.reduce((acc, f) => {\n acc[f.index] = {\n index: f.index,\n value: '',\n };\n return acc;\n }, {} as Record<keyof T, IIndexFilter<T, unknown>>);\n }\n\n filterModels: WritableSignal<Record<string, IIndexFilter<T, any>>> =\n linkedSignal(() => this.emptyFilters());\n\n lstFilterForms = form(this.filterModels, (path) => {\n applyEach(path, (filter) => debounce(filter.value, 400));\n });\n\n searchModel: WritableSignal<{ query: string }> = signal({ query: '' });\n\n searchForm = form(this.searchModel, (path) => {\n debounce(path.query, 400);\n });\n\n lstPresetFilters: InputSignal<NonNullable<IP['lstFilter']>> = input<NonNullable<IP['lstFilter']>>([]);\n lstActiveFilters = computed(() =>\n [\n ...Object.values(this.filterModels()),\n ...this.lstPresetFilters(),\n ].filter((f) => hasFilterValue(f.value)),\n );\n\n constructor() {\n //Reseta os filtros quando o schemaService muda (ex: troca de módulo)\n let previousService: SchemaService<T, IP> | undefined;\n effect(() => {\n const service = this.schemaService();\n if (previousService && previousService !== service) {\n untracked(() => this.reset());\n }\n previousService = service;\n });\n }\n\n private indexParams: Signal<IIndexParams & IP> = computed(() => ({\n lstFilter: this.lstActiveFilters(),\n query: this.searchModel().query.trim() || undefined,\n page: this.page(),\n size: this.limit(),\n sort: this.sort(),\n }) as IIndexParams & IP);\n\n itemsResource = resource({\n params: () => ({ service: this.schemaService(), query: this.indexParams() }),\n loader: ({ params }) => params.service.index(params.query),\n });\n\n lstItems: Signal<T[]> = computed(() =>\n this.itemsResource.hasValue() ? this.itemsResource.value().data : [],\n );\n\n loading: Signal<boolean> = this.itemsResource.isLoading;\n error: Signal<Error | undefined> = this.itemsResource.error;\n\n refresh(): void {\n this.itemsResource.reload();\n }\n\n FieldType = FieldType;\n\n async patch<K extends keyof T>(item: T, value: T[K], index: K): Promise<void> {\n const uuid = item.uuid;\n\n this.setLoading(uuid, index, true);\n try {\n const patchValue: Partial<T> = {};\n patchValue[index] = value;\n\n await this.schemaService().patch(uuid, patchValue);\n toast.success('Dados salvos com sucesso');\n } catch (error) {\n toast.error('Erro ao salvar os dados');\n this.refresh();\n } finally {\n this.setLoading(uuid, index, false);\n }\n }\n\n loadingMap = signal<Record<string, Partial<Record<keyof T, boolean>>>>({});\n\n private setLoading(uuid: string, index: keyof T, value: boolean): void {\n this.loadingMap.update((map) => ({\n ...map,\n [uuid]: { ...map[uuid], [index]: value },\n }));\n }\n\n reset(): void {\n this.page.set(1);\n this.limit.set(this.options.paginationOptions.rows);\n this.sort.set([]);\n this.filterModels.set(this.emptyFilters());\n this.searchModel.set({ query: '' });\n }\n\n protected async deleteAlert(item: T) {\n const result = await this.schemaService().deleteAlert(item);\n if(result){\n this.refresh()\n }\n }\n\n router: Router = inject(Router);\n activatedRoute: ActivatedRoute = inject(ActivatedRoute);\n noNew: InputSignal<boolean> = input<boolean>(false);\n _novo = output<Event>({\n alias: 'novo',\n });\n novo(){\n const event = new Event('novo', { cancelable: true });\n this._novo.emit(event);\n if(event.defaultPrevented) {\n return;\n }\n this.router.navigate(['./view'], { relativeTo: this.activatedRoute });\n }\n edit(item: T){\n this.router.navigate(['./view', item.uuid], { relativeTo: this.activatedRoute });\n }\n\n deletePermissao = input<Permissao | null>(null)\n editPermissao = input<Permissao | null>(null)\n}\n\n/** Formata um intervalo [início, fim]; a ponta vazia (intervalo aberto) aparece como `…` */\nfunction formatSpan(span: Span | null | undefined, format: string): string {\n if (!span || (span[0] == null && span[1] == null)) {\n return '';\n }\n return span.map((v) => (v ? DateTime.fromISO(v).toFormat(format) : '…')).join(' - ');\n}\n\n/** Formata números com os mesmos padrões do input-number (Number, Decimal, Currency) */\nfunction formatNumber(value: unknown, type: FieldType): string {\n if (value == null || value === '') {\n return '';\n }\n const fractionDigits = type === FieldType.Number ? 0 : 2;\n return maskitoStringifyNumber(Number(value), {\n minimumFractionDigits: fractionDigits,\n maximumFractionDigits: fractionDigits,\n prefix: type === FieldType.Currency ? 'R$ ' : '',\n decimalSeparator: ',',\n thousandSeparator: '.',\n });\n}\n\n/** Context passed to a column's ng-template */\nexport interface ITemplateContext<T, V> {\n $implicit: T;\n value: V;\n index: keyof T;\n label: string;\n loading: boolean;\n readonly: boolean;\n}\n/** What a column's `listOptions.template` may hold */\nexport type TableCellTemplate<T> =\n | ((item: T) => string)\n | TemplateRef<ITemplateContext<T, unknown>>\n | Type<unknown>;\n\n/** A resolved cell, discriminated by `kind` so templates can narrow `value` */\n/** A resolved cell: exactly one of these is set */\nexport interface TableCell<T> {\n text?: T[keyof T] | string;\n template?: TemplateRef<ITemplateContext<T, unknown>>;\n component?: Type<unknown>;\n}\n\nexport interface TableRow<T> {\n item: T;\n cells: Record<keyof T, TableCell<T>>;\n}","<div class=\"size-full flex flex-col gap-2\">\n <div class=\"flex flex-col gap-3 flex-1 min-h-0\">\n <breadcrumbs [items]=\"lstBreadCrumbs()\"></breadcrumbs>\n \n <hlm-card class=\"flex-1 flex flex-col min-h-0 py-0\">\n <div hlmCardContent class=\"flex flex-col flex-1 min-h-0 px-0\">\n <div class=\"p-2 w-full flex flex-wrap md:flex-nowrap md:h-12 gap-2 items-center\">\n <!-- <input hlmInput placeholder=\"Pesquisar...\"/> -->\n \n @if(!noQuery()){\n <div hlmInputGroup class=\"flex-1 min-w-0 md:flex-none md:min-w-32 md:max-w-1/3\">\n <div hlmInputGroupAddon align=\"inline-start\">\n <ng-icon name=\"lucideSearch\" />\n </div>\n <input hlmInputGroupInput placeholder=\"Pesquisar...\" [formField]=\"searchForm.query\" />\n </div>\n }\n \n <ng-scrollbar class=\"order-last basis-full min-w-0 md:order-0 md:basis-auto md:flex-1\" hlm appearance=\"compact\">\n <div class=\"flex w-max space-x-2 h-full items-center\" scrollViewport>\n @for (item of lstField(); track item.index) {\n @if(!item.hiddenList){\n <schema-table-filter\n [label]=\"item.label\"\n [formField]=\"$any(lstFilterForms[$any(item.index)].value)\"\n [options]=\"item.options || null\"\n [type]=\"item.type\"\n ></schema-table-filter>\n }\n }\n </div>\n </ng-scrollbar>\n @for (toolbar of toolbarStart(); track $index) {\n <ng-container\n (click)=\"$event.stopPropagation()\"\n [ngTemplateOutlet]=\"toolbar.template\"\n />\n }\n @if(!noNew()){\n <button hlmBtn size=\"icon-sm\" variant=\"outline\" class=\"shrink-0\" (click)=\"novo()\" hlmTooltip=\"Novo\" position=\"top\">\n <ng-icon name=\"lucideCirclePlus\" class=\"text-lg shrink-0\"></ng-icon>\n </button>\n }\n <button hlmBtn size=\"icon-sm\" variant=\"outline\" class=\"shrink-0\" (click)=\"reset()\" hlmTooltip=\"Resetar filtros\" position=\"top\">\n <ng-icon name=\"lucideSquareX\" class=\"text-lg shrink-0\"></ng-icon>\n </button>\n <button hlmBtn size=\"icon-sm\" class=\"shrink-0\" (click)=\"refresh()\" hlmTooltip=\"Atualizar dados\" position=\"top\">\n <ng-icon name=\"lucideRefreshCcw\" class=\"text-lg shrink-0\"></ng-icon>\n </button>\n @for (toolbar of toolbarEnd(); track $index) {\n <ng-container\n (click)=\"$event.stopPropagation()\"\n [ngTemplateOutlet]=\"toolbar.template\"\n />\n }\n </div>\n\n <div class=\"flex-1 min-h-0 relative overflow-hidden\">\n <div\n [ngClass]=\"loading() ? 'opacity-100 translate-y-0' : 'opacity-0 -translate-y-10 pointer-events-none'\"\n class=\"absolute mask-y-from-10% z-10 left-0 top-0 w-full h-full flex items-center justify-center bg-white/10 transition-all duration-300 ease-in-out\">\n <hlm-spinner class=\"text-2xl\"/>\n </div>\n \n @if(!loading() && !lstItems().length){\n <div class=\"absolute left-0 top-0 size-full flex items-center justify-center\">\n <span>\n Nenhum dado encontrado.\n </span>\n </div>\n <!-- <tr hlmTableRow>\n <td hlmTableCell [attr.colspan]=\"lstField().length + actionsStart().length + actionsEnd().length\" class=\"text-center py-6 text-muted-foreground\">\n </td>\n </tr> -->\n }\n\n <div hlmTableContainer class=\"h-full overflow-auto rounded-t-2xl portrait:hidden\">\n <table hlmTable>\n @let hasPermissaoEdit = editPermissao() | hasPermissao;\n @let hasPermissaoDelete = deletePermissao() | hasPermissao;\n\n <thead hlmTableHeader class=\"sticky top-0 z-1 backdrop-blur-2xl\">\n <tr hlmTableRow>\n @if (actionsStart().length) {\n <th hlmTableHead></th>\n }\n @for (item of lstField(); track $index) {\n @if (!item.hiddenList) {\n <th hlmTableHead>\n <div class=\"flex justify-start items-center size-full gap-2\">\n @let sort = lstFieldSort()[item.index];\n \n <button hlmBtn size=\"sm\" variant=\"ghost\" class=\"capitalize\" (click)=\"onSort(item.index)\">\n {{ item.label }}\n <ng-icon [ngClass]=\"{\n 'opacity-0!': !sort,\n 'first-path:text-brand-primary': sort === 'ASC',\n 'second-path:text-brand-primary': sort === 'DESC',\n }\" class=\"first-path:opacity-100 second-path:opacity-100 child-path:transition-all\" name=\"lucideArrowUpDown\"/>\n </button>\n \n @if(item.tooltipInfo){\n <ng-icon name=\"lucideCircleQuestionMark\" [hlmTooltip]=\"item.tooltipInfo\" position=\"top\"></ng-icon>\n }\n </div>\n </th>\n }\n }\n @if (actionsEnd().length || hasPermissaoEdit || hasPermissaoDelete) {\n <th hlmTableHead>\n Ações\n </th>\n }\n </tr>\n </thead>\n <tbody hlmTableBody class=\"relative\">\n <!-- #region Loading -->\n @if(loading()){\n @for (item of [1,2,3,4,5,6,7,8,9,10,1,2,3,4,5,6,7,8,9,10]; track $index) {\n <tr hlmTableRow class=\"animate-in slide-in-from-top-10\">\n @for (item of lstField(); track $index; let rowIndex = $index) {\n <td hlmTableCell class=\"py-3\">\n <hlm-skeleton class=\"h-3 w-25 rounded-full\" />\n </td>\n }\n </tr>\n }\n }\n <!-- #endregion Loading -->\n @else if(error()){\n <tr hlmTableRow>\n <td hlmTableCell [attr.colspan]=\"lstField().length + actionsStart().length + actionsEnd().length\" class=\"text-center py-6 text-destructive\">\n Erro ao carregar os dados.\n <button hlmBtn variant=\"link\" size=\"sm\" (click)=\"refresh()\">Tentar novamente</button>\n </td>\n </tr>\n } \n @else if(!loading() && lstItems().length){ \n @for (row of rows.value(); track row.item.uuid) {\n <tr hlmTableRow class=\"animate-in slide-in-from-top-10 cursor-pointer\" (click)=\"hasPermissaoEdit && edit(row.item)\">\n\n @if (actionsStart().length) {\n <td hlmTableCell>\n <div class=\"flex gap-1 justify-end items-center h-fit\">\n @for (action of actionsStart(); track $index) {\n <div class=\"contents\" (click)=\"$event.stopPropagation()\">\n <ng-container\n [ngTemplateOutlet]=\"action.template\"\n [ngTemplateOutletContext]=\"{ $implicit: row.item }\"\n />\n </div>\n }\n </div>\n </td>\n }\n\n @for (field of lstField(); track field.index) {\n @if (!field.hiddenList) {\n <td hlmTableCell class=\"relative\">\n @let loading = loadingMap()[row.item.uuid]?.[field.index] || false;\n <loading [active]=\"loading\" />\n\n @let cell = row.cells[field.index];\n @if (cell.template; as template) {\n <div class=\"contents\" (click)=\"$event.stopPropagation()\">\n <ng-container\n [ngTemplateOutlet]=\"template\"\n [ngTemplateOutletContext]=\"{\n $implicit: row.item,\n value: row.item[field.index],\n index: field.index,\n label: field.label,\n loading: loading,\n readonly: field.readonly\n }\"\n />\n </div>\n } @else if (cell.component; as component) {\n <div class=\"contents\" (click)=\"$event.stopPropagation()\">\n <ng-container [ngComponentOutlet]=\"component\" />\n </div>\n } @else {\n <span class=\"p-2\" (click)=\"$event.stopPropagation()\">{{ cell.text }}</span>\n }\n </td>\n }\n }\n\n @if (actionsEnd().length || hasPermissaoEdit || hasPermissaoDelete) {\n <td hlmTableCell>\n <div class=\"flex gap-1 justify-end items-center h-fit\">\n @if(hasPermissaoEdit) {\n <div class=\"contents\" (click)=\"$event.stopPropagation()\">\n <ng-container\n [ngTemplateOutlet]=\"templateView\"\n [ngTemplateOutletContext]=\"{ $implicit: row.item.uuid }\"\n />\n </div>\n }\n\n @for (action of actionsEnd(); track $index) {\n <div (click)=\"$event.stopPropagation()\">\n <ng-container\n [ngTemplateOutlet]=\"action.template\"\n [ngTemplateOutletContext]=\"{ $implicit: row.item }\"\n />\n </div>\n }\n\n @if(hasPermissaoDelete) {\n <div class=\"contents\" (click)=\"$event.stopPropagation()\">\n <ng-container\n [ngTemplateOutlet]=\"templateDelete\"\n [ngTemplateOutletContext]=\"{ $implicit: row.item }\"\n />\n </div>\n }\n </div>\n </td>\n }\n </tr>\n }\n }\n </tbody>\n </table>\n </div>\n\n <div class=\"flex flex-col p-2 gap-2 mask-y-from-98% no-scrollbar overflow-y-auto size-full\">\n @if(!loading()){\n @for (row of rows.value(); track row.item.uuid) {\n <div hlmCard class=\"animate-in slide-in-from-top-10 cursor-pointer shrink-0 p-2 flex flex-col gap-1.5\" (click)=\"hasPermissaoEdit && edit(row.item)\">\n @if (actionsStart().length) {\n <td hlmTableCell>\n <div class=\"flex gap-1 justify-end items-center h-fit\">\n @for (action of actionsStart(); track $index) {\n <div class=\"contents\" (click)=\"$event.stopPropagation()\">\n <ng-container\n [ngTemplateOutlet]=\"action.template\"\n [ngTemplateOutletContext]=\"{ $implicit: row.item }\"\n />\n </div>\n }\n </div>\n </td>\n }\n \n @for (field of lstField(); track field.index) {\n @if (!field.hiddenList) {\n <div class=\"relative\">\n @let loading = loadingMap()[row.item.uuid]?.[field.index] || false;\n <loading [active]=\"loading\" />\n \n <span class=\"text-sm text-muted-foreground\"> {{field.label}} </span> <br>\n\n @let cell = row.cells[field.index];\n @if (cell.template; as template) {\n <div class=\"contents\" (click)=\"$event.stopPropagation()\">\n <ng-container\n [ngTemplateOutlet]=\"template\"\n [ngTemplateOutletContext]=\"{\n $implicit: row.item,\n value: row.item[field.index],\n index: field.index,\n label: field.label,\n loading: loading,\n readonly: field.readonly\n }\"\n />\n </div>\n } @else if (cell.component; as component) {\n <div class=\"contents\" (click)=\"$event.stopPropagation()\">\n <ng-container [ngComponentOutlet]=\"component\" />\n </div>\n } @else {\n <span (click)=\"$event.stopPropagation()\">{{ cell.text }}</span>\n }\n </div>\n }\n }\n \n @if (actionsEnd().length || hasPermissaoDelete) {\n <td hlmTableCell>\n <div class=\"flex gap-1 justify-end items-center h-fit\" (click)=\"$event.stopPropagation()\">\n @for (action of actionsEnd(); track $index) {\n <ng-container\n (click)=\"$event.stopPropagation()\"\n [ngTemplateOutlet]=\"action.template\"\n [ngTemplateOutletContext]=\"{ $implicit: row.item }\"\n />\n }\n\n @if(hasPermissaoDelete) {\n <ng-container \n (click)=\"$event.stopPropagation()\"\n [ngTemplateOutlet]=\"templateDelete\" \n [ngTemplateOutletContext]=\"{ $implicit: row.item }\" \n />\n }\n </div>\n </td>\n }\n </div>\n }\n }\n </div>\n\n </div>\n\n <hlm-numbered-pagination \n [(currentPage)]=\"page\" \n [(itemsPerPage)]=\"limit\"\n [totalItems]=\"total()\" \n />\n </div>\n </hlm-card>\n </div>\n</div>\n\n<ng-template #templateBool let-item let-value=\"value\" let-index=\"index\" let-loading=\"loading\" let-readonly=\"readonly\">\n <div (click)=\"$event.stopPropagation()\">\n <hlm-switch \n [checked]=\"value\" \n (checkedChange)=\"patch(item, $event, index)\" \n class=\"mr-2\"\n [disabled]=\"loading || readonly\" \n />\n </div>\n</ng-template>\n\n<ng-template #templateView let-uuid>\n <button hlmBtn variant=\"ghost\" size=\"icon-sm\" [routerLink]=\"'./view/' + uuid\">\n <ng-icon name=\"lucideChevronRight\"></ng-icon>\n </button>\n</ng-template>\n\n<ng-template #templateDelete [schemaTableActions] let-item>\n <button class=\"portrait:hidden\" hlmBtn variant=\"destructive\" size=\"icon-sm\" (click)=\"$event.stopPropagation(); deleteAlert(item)\">\n <ng-icon name=\"lucideTrash2\"></ng-icon>\n </button>\n <button class=\"landscape:hidden\" hlmBtn variant=\"destructive\" size=\"sm\" (click)=\"$event.stopPropagation(); deleteAlert(item)\">\n <ng-icon name=\"lucideTrash2\"></ng-icon>\n <span> Excluir </span>\n </button>\n</ng-template>\n\n<ng-template #templateIcon let-item let-value=\"value\" let-index=\"index\" let-loading=\"loading\">\n <ng-icon [name]=\"value\" class=\"text-2xl\"/>\n</ng-template>\n\n<ng-template #templateFile let-item let-value=\"value\" let-index=\"index\" let-loading=\"loading\">\n @let lstFile = fileItemsFromValue(value);\n @if (lstFile.length) {\n <div class=\"flex flex-col gap-1\" (click)=\"$event.stopPropagation()\">\n @for (file of lstFile; track file.url) {\n <div class=\"flex items-center gap-1 min-w-0\">\n <file-preview [item]=\"file\" />\n <span class=\"truncate max-w-48\">{{ file.name }}</span>\n </div>\n }\n </div>\n } @else {\n <span>-</span>\n }\n</ng-template>\n\n<ng-template #templateJSON let-item let-value=\"value\" let-label=\"label\" let-index=\"index\" let-loading=\"loading\">\n <hlm-dialog>\n \n <button class=\"portrait:hidden\" hlmBtn hlmDialogTrigger size=\"icon-sm\" variant=\"outline\" (click)=\"$event.stopPropagation()\">\n <ng-icon name=\"lucideCode\"></ng-icon>\n </button>\n\n <button class=\"landscape:hidden w-full\" hlmBtn hlmDialogTrigger size=\"sm\" variant=\"outline\" (click)=\"$event.stopPropagation()\">\n <ng-icon name=\"lucideCode\"></ng-icon>\n <span> {{label}} - JSON </span>\n </button>\n\n <hlm-dialog-content *hlmDialogPortal=\"let ctx\" class=\"flex max-h-[80vh] min-w-[50vw] flex-col\">\n <hlm-dialog-header>\n <h3 hlmDialogTitle>{{label}}</h3>\n </hlm-dialog-header>\n <hlm-code-block class=\"min-h-8\">\n <hlm-code-block-header>\n <!-- <hlm-code-block-title>Title goes here</hlm-code-block-title> -->\n <hlm-code-block-actions>\n <button hlmCodeBlockCopyButton [value]=\"value | json\"></button>\n </hlm-code-block-actions>\n </hlm-code-block-header>\n <pre \n class=\"min-h-fit\"\n hlmCodeBlockContent \n lineNumbers\n wrap\n [code]=\"value | json\"\n >\n </pre>\n </hlm-code-block>\n <hlm-dialog-footer>\n <button hlmBtn variant=\"outline\" hlmDialogClose>\n <ng-icon name=\"lucideCircleX\" class=\"text-lg shrink-0\"></ng-icon>\n Fechar\n </button>\n </hlm-dialog-footer>\n </hlm-dialog-content>\n </hlm-dialog>\n\n</ng-template>","import { Directive, inject, input, TemplateRef } from '@angular/core';\n\n@Directive({\n selector: 'ng-template[schemaViewContent]',\n})\nexport class SchemaViewContentDirective<T = any> {\n template = inject<TemplateRef<{ $implicit: T }>>(TemplateRef);\n\n position = input<'start' | 'end'>('end');\n\n static ngTemplateContextGuard<T>(\n _dir: SchemaViewContentDirective<T>,\n _ctx: unknown,\n ): _ctx is { $implicit: T } {\n return true;\n }\n}\n","import { Component, input, output } from '@angular/core';\n\nimport { NgIcon } from '@ng-icons/core';\nimport { HlmButtonImports } from '@sapphire-caitlyn/schema-kit-ng/helm';\n\n@Component({\n imports: [\n HlmButtonImports,\n NgIcon\n ],\n selector: 'save-button',\n styleUrl: './save-button.component.scss',\n templateUrl: './save-button.component.html',\n})\nexport class SaveButtonComponent {\n saving = input<boolean>(false);\n disabled = input<boolean>(false);\n\n save = output<void>();\n}\n","<button class=\"relative\" hlmBtn [variant]=\"saving() ? 'ghost' : 'default'\" size=\"sm\" [disabled]=\"disabled()\" (click)=\"!disabled() && !saving() && save.emit()\">\n @if(saving()) {\n <span class=\"absolute inset-0 rounded-[inherit] border-shimmer pointer-events-none\"></span>\n\n <ng-icon name=\"lucideRefreshCw\" class=\"text-lg shrink-0 animate-spin\"></ng-icon>\n Salvando...\n } @else {\n <ng-icon name=\"lucideSave\" class=\"text-lg shrink-0\"></ng-icon>\n Salvar\n }\n</button>","import { Component, computed, contentChildren, effect, inject, Injector, input, InputSignal, linkedSignal, OnInit, output, signal, Signal, untracked, WritableSignal } from '@angular/core';\nimport { FieldState, FieldTree, FormField } from '@angular/forms/signals';\nimport { ActivatedRoute, Router, RouterModule } from '@angular/router';\nimport { extractValue } from '@angular/forms/signals/compat';\nimport { CommonModule } from '@angular/common';\nimport { toSignal } from '@angular/core/rxjs-interop';\n\nimport { NgIcon } from '@ng-icons/core';\nimport {\n HlmProgressImports,\n HlmSkeletonImports,\n HlmButtonImports,\n HlmFieldImports,\n HlmInputImports,\n HlmCardImports,\n HlmCodeBlockImports,\n} from '@sapphire-caitlyn/schema-kit-ng/helm';\nimport { toast } from '@spartan-ng/brain/sonner';\n\nimport { BreadcrumbsComponent, IBreadcrumbItem } from '../ui/breadcrumbs/breadcrumbs.component';\nimport { FieldType } from '../../classes/schema-field/field-type';\nimport { IView } from '../../interfaces/view';\nimport { IIndexParams } from '../../interfaces/index-params';\nimport { SchemaField } from '../../classes/schema-field/schema-field';\nimport { SchemaService } from '../../services/web/schema.service';\nimport { SCHEMA_KIT_OPTIONS, SchemaKitModuleOptions } from '../../schema-kit.module';\nimport { SchemaViewContentDirective } from '../../components/schema-view/schema-view-content.directive';\nimport { SchemaBuilder, SchemaFieldOptionsRecord } from '../../classes/schema-field/schema-builder';\nimport { SaveButtonComponent } from '../ui/save-button/save-button.component';\nimport { InputImports } from '../inputs/input-index';\n\n@Component({\n imports: [\n HlmFieldImports,\n HlmInputImports,\n HlmButtonImports,\n HlmProgressImports,\n HlmSkeletonImports,\n HlmCardImports,\n HlmCodeBlockImports,\n FormField,\n CommonModule,\n NgIcon,\n RouterModule,\n BreadcrumbsComponent,\n SaveButtonComponent,\n ...InputImports\n ],\n selector: 'schema-view',\n styleUrl: './schema-view.component.scss',\n templateUrl: './schema-view.component.html',\n})\nexport class SchemaViewComponent <\n T extends IView,\n IP extends IIndexParams,\n R = T,\n> implements OnInit {\n\n /** Opções do módulo */\n options: SchemaKitModuleOptions = inject(SCHEMA_KIT_OPTIONS);\n\n /** Indica se o botão de voltar deve ser ocultado */\n noBack: InputSignal<boolean> = input<boolean>(false);\n\n /** Indica se o botão de novo deve ser ocultado */\n noNew: InputSignal<boolean> = input<boolean>(false);\n\n /** Indica se o botão de salvar deve ser ocultado */\n noSave: InputSignal<boolean> = input<boolean>(false);\n\n /** Serviço de schema */\n schemaService: InputSignal<SchemaService<T, IP> | null> = input<SchemaService<T, IP> | null>(null);\n\n /** Lista de itens do breadcrumb customizados */\n _lstBreadCrumbs: InputSignal<IBreadcrumbItem[]> = input<IBreadcrumbItem[]>([], {\n alias: 'lstBreadCrumbs',\n });\n lstBreadCrumbs: Signal<IBreadcrumbItem[]> = computed(() => {\n if(this._lstBreadCrumbs().length) {\n return this._lstBreadCrumbs();\n }\n if(this.schemaService()) {\n return this.schemaService()!.viewBreadCrumbs(this.uuid());\n }\n return [];\n });\n\n activatedRoute: ActivatedRoute = inject(ActivatedRoute);\n private params = toSignal(this.activatedRoute.params, { initialValue: \n this.activatedRoute.snapshot.params \n });\n\n /** Identificador do parâmetro da rota que contém o uuid */\n uuidIdentifier: InputSignal<string> = input<string>('uuid');\n private routeUuid: Signal<string> = computed(() => this.params()[this.uuidIdentifier()] || '');\n\n /** uuid informado de fora (ex.: dialog de edição). Tem prioridade sobre o parâmetro da rota */\n _uuid: InputSignal<string | null | undefined> = input<string | null | undefined>(undefined, {\n alias: 'uuid',\n });\n /**\n * uuid do registro em edição; vazio é criação. Vem do input `uuid` ou da rota e pode ser trocado por código\n * (ex.: depois de criar sem redirect): o registro é carregado sem navegar\n */\n uuid: WritableSignal<string> = linkedSignal(() => this._uuid() || this.routeUuid());\n\n\n\n\n /** Schema customizado para criação do formulário */\n _schema: InputSignal<SchemaFieldOptionsRecord<T> | null> = input<SchemaFieldOptionsRecord<T> | null>(null, {\n alias: 'schema',\n });\n\n injector: Injector = inject(Injector);\n\n /** Schema da tela (inputs e form): o input `schema`, se informado, ou o do service */\n private effectiveSchema: Signal<SchemaFieldOptionsRecord<T>> = computed(() =>\n this._schema() ?? this.schemaService()?.schema ?? {}\n );\n\n lstFields: Signal<SchemaField<T>[]> = computed(() => SchemaBuilder.build(this.effectiveSchema()));\n\n defaultFormValues: Signal<T> = computed(() => SchemaBuilder.defaultValues<T>(this.lstFields()));\n\n ngOnInit(): void {\n // Recarrega sempre que o uuid muda (rota, input `uuid` ou `uuid.set()`) ou o form é recriado\n let previousUuid = '';\n effect(() => {\n const form = this.form();\n const uuid = this.uuid();\n untracked(() => {\n if (uuid) {\n this.load(uuid);\n }\n else if (previousUuid) {\n // Saiu da edição sem trocar de rota (ex.: Novo): volta para os valores iniciais\n (form() as FieldState<T>).reset(this.defaultFormValues());\n }\n previousUuid = uuid;\n });\n }, { injector: this.injector });\n }\n\n lstContent = contentChildren(SchemaViewContentDirective);\n contentStart = computed(() => this.lstContent().filter((a) => a.position() === 'start'));\n contentEnd = computed(() => this.lstContent().filter((a) => a.position() === 'end'));\n\n\n /**\n * O form (signal forms), criado a partir do mesmo schema dos inputs (`effectiveSchema`).\n * Recriado quando o schema ou o `schemaService` muda\n */\n form: Signal<FieldTree<T>> = linkedSignal<\n { service: SchemaService<T, IP> | null; schema: SchemaFieldOptionsRecord<T> },\n FieldTree<T>\n >({\n source: () => ({ service: this.schemaService(), schema: this.effectiveSchema() }),\n // untracked: criar o form não pode virar dependência, senão ele seria recriado a cada valor digitado\n computation: (source, previous) => untracked(() => {\n // Injector do componente: o que o form registra acaba junto com a tela, não com o service\n const form = SchemaBuilder.createForm<T>(this.injector, source.schema);\n\n // Mesmo service, só o `schema` mudou: mantém o que o usuário alterou nos campos que continuam.\n // Os intocados ficam com o valor inicial do schema novo (ex.: um `defaultValue` que mudou)\n if (previous && previous.source.service === source.service) {\n type TFieldMap = Record<string, (() => FieldState<unknown>) | undefined>;\n const previousForm = previous.value() as unknown as TFieldMap;\n const nextForm = form as unknown as TFieldMap;\n for (const key of Object.keys(source.schema)) {\n const previousField = previousForm[key]?.();\n const nextField = nextForm[key]?.();\n if (previousField?.dirty() && nextField) {\n nextField.value.set(previousField.value());\n nextField.markAsDirty();\n }\n }\n }\n return form;\n }),\n });\n\n loading: WritableSignal<boolean> = signal(false);\n async load(uuid: string = this.uuid()){\n const service = this.schemaService();\n // Sem service não há como buscar o registro (ex.: só `schema` + `saveFn`)\n if(!uuid || !service) {\n return;\n }\n this.loading.set(true);\n try{\n const data: T = await service.show(uuid);\n // Trocou de registro enquanto carregava: o load mais novo é quem preenche\n if(uuid !== this.uuid()) {\n return;\n }\n // reset: troca o valor e limpa dirty/touched, então o próximo PATCH só leva o que mudar daqui pra frente\n (this.form()() as FieldState<T>).reset(data);\n }catch(error){\n if(uuid === this.uuid()) {\n toast.error('Erro ao carregar os dados');\n }\n }\n this.loading.set(false);\n }\n\n /** Executado antes de salvar os dados (pode ser síncrono ou assíncrono) */\n protected onWillSave<D extends Partial<T> | undefined>(data: D): D | Promise<D> {\n return data;\n }\n\n /** Executado após salvar os dados */\n protected async onDidSave(){\n }\n\n\n saving: WritableSignal<boolean> = signal(false);\n\n /** Função para salvar os dados (Utilizado para customizar o comportamento de salvamento) */\n saveFn = input<((values: Partial<T>) => Promise<R>) | null>(null);\n \n /** Redireciona para a visualização do registro após a criação (Caso false cancela o redirecionamento) */\n redirectOnCreate: InputSignal<string | false> = input<string | false>('../view');\n\n\n \n async save(){\n // Lido uma vez: se o form for recriado durante o salvamento, o salvamento continua no mesmo\n const form = this.form();\n if(form().valid()) {\n this.loading.set(true);\n if(!this.saveFn() && !this.schemaService()){\n throw new Error('Nenhum serviço de schema foi fornecido para salvar os dados');\n }\n \n type TSaveResponse = {\n saved: boolean;\n data?: R;\n }\n const save = async (): Promise<TSaveResponse> => {\n let response: R | null = null;\n let saved = false;\n const uuid = this.uuid();\n if(uuid){\n //Patch\n let dirtyValues = extractValue(form, {\n dirty: true,\n }) as Partial<T> | undefined;\n dirtyValues = await this.onWillSave(dirtyValues);\n\n if(!dirtyValues) {\n toast.info('Nenhum dado foi alterado');\n this.loading.set(false);\n return { \n saved: false\n };\n }\n this.saving.set(true);\n \n if(this.saveFn()){\n response = await this.saveFn()!(dirtyValues);\n } else if (this.schemaService()){\n response = await this.schemaService()!.patch(uuid, dirtyValues) as unknown as R;\n }\n saved = true;\n } else {\n this.saving.set(true);\n //Create\n let allValues = extractValue(form) as T;\n allValues = await this.onWillSave(allValues);\n\n if(this.saveFn()){\n response = await this.saveFn()!(allValues);\n } else if (this.schemaService()){\n response = await this.schemaService()!.create(allValues) as unknown as R;\n }\n saved = true;\n\n const createdUuid = (response as Partial<IView> | null)?.uuid;\n if(this.redirectOnCreate() && createdUuid) {\n try{\n this.router.navigate([this.redirectOnCreate(), createdUuid], {\n relativeTo: this.activatedRoute,\n replaceUrl: true\n });\n }catch(error){\n console.error('Erro ao redirecionar após salvar', error);\n }\n }else if(createdUuid) {\n // Fica na tela e vira edição do registro criado (o effect do uuid recarrega os dados).\n // O reset limpa o dirty da criação, para o próximo PATCH não reenviar tudo\n form().reset();\n this.uuid.set(createdUuid);\n } else {\n // Criou, mas sem uuid não há registro para editar: volta para um form de criação limpo\n (form() as FieldState<T>).reset(this.defaultFormValues());\n }\n\n }\n return { saved, data: response ?? undefined };\n }\n\n try{\n const { saved, data } = await save();\n // `saved` diz se salvou; `data` pode vir vazio mesmo salvando (ex.: resposta 204)\n if(saved) {\n this._onDidSave.emit(data as R);\n toast.success('Dados salvos com sucesso');\n }\n }catch(error){\n toast.error('Erro ao salvar os dados');\n }\n this.saving.set(false);\n this.loading.set(false);\n }else {\n // get controls with errors\n form().markAsTouched();\n\n const invalidKeys = new Set(\n form().errorSummary().map((error) => error.fieldTree().keyInParent())\n );\n\n const invalidLabels = this.lstFields()\n .filter((field) => invalidKeys.has(field.index as string | number))\n .map((field) => field.label);\n\n toast.error('Formulário inválido', {\n description: invalidLabels.length\n ? `Verifique os campos: ${invalidLabels.join(', ')}`\n : undefined,\n });\n }\n\n await this.onDidSave();\n }\n\n /** Evento disparado após salvar os dados */\n _onDidSave = output<R>({\n alias: 'onDidSave',\n });\n\n FieldType = FieldType\n \n router: Router = inject(Router);\n\n /** Evento disparado quando o usuário clica no botão de novo */\n _novo = output<Event>({\n alias: 'novo',\n });\n\n /** Função executada quando o usuário clica no botão de novo */\n protected novo(){\n const event = new Event('novo', { cancelable: true });\n this._novo.emit(event);\n if(event.defaultPrevented) {\n return;\n }\n // uuid que não veio da rota (input ou definido depois de criar): volta para a criação na mesma tela\n if(!this.routeUuid()) {\n this.uuid.set('');\n return;\n }\n this.router.navigate(['../view'], { relativeTo: this.activatedRoute });\n }\n\n /** Função executada quando o usuário clica no botão de voltar */\n protected voltar(){\n // A profundidade da rota depende só da rota: um uuid vindo do input não muda o caminho\n this.router.navigate([\n this.routeUuid() ? '../../' : '../'\n ], { relativeTo: this.activatedRoute });\n }\n}\n","<div class=\"size-full flex flex-col gap-2\">\n \n <div class=\"flex flex-col gap-3 flex-1 min-h-0\">\n <breadcrumbs [items]=\"lstBreadCrumbs()\"></breadcrumbs>\n \n <hlm-card class=\"flex-1 min-h-0 w-full py-0\">\n <div class=\"flex-1 min-h-0 w-full rounded-t-2xl p-3 flex flex-col gap-2\">\n @if(!noBack() || (!noNew() && uuid())) {\n <div class=\"w-full shrink-0 flex gap-2 justify-between\">\n @if(!noBack()){\n <button hlmBtn size=\"sm\" variant=\"outline\" (click)=\"voltar()\">\n <ng-icon name=\"lucideArrowLeft\" class=\"text-lg shrink-0\"></ng-icon>\n Voltar\n </button>\n }\n @if(uuid() && !noNew()){\n <button hlmBtn size=\"sm\" variant=\"outline\" (click)=\"novo()\">\n <ng-icon name=\"lucideCirclePlus\" class=\"text-lg shrink-0\"></ng-icon>\n Novo\n </button>\n }\n </div>\n }\n \n @for (item of contentStart(); track $index) {\n <ng-container *ngTemplateOutlet=\"item.template\"></ng-container>\n }\n\n @if(form(); as formTree){\n <fieldset hlmFieldSet class=\"grid grid-cols-12 mask-y-from-98% flex-1 min-h-0 content-start *:min-w-0 overflow-y-auto py-2\">\n @for (item of lstFields(); track item.index) {\n @switch(item.type) {\n @case(FieldType.Phone) {\n <input-phone \n [ngClass]=\"item.class\" \n [class.hidden]=\"item.hiddenForm\" \n [formField]=\"$any(formTree)[item.index]\"\n [label]=\"item.label\"\n [placeholder]=\"item.placeholder\" \n [loading]=\"loading()\"\n [tooltipInfo]=\"item.tooltipInfo\"\n />\n }\n @case (FieldType.Cnpj) {\n <input-cnpj \n [ngClass]=\"item.class\" \n [class.hidden]=\"item.hiddenForm\" \n [formField]=\"$any(formTree)[item.index]\"\n [label]=\"item.label\"\n [placeholder]=\"item.placeholder\" \n [loading]=\"loading()\"\n [tooltipInfo]=\"item.tooltipInfo\"\n />\n }\n @case (FieldType.Bool) {\n <input-bool \n [ngClass]=\"item.class\" \n [class.hidden]=\"item.hiddenForm\" \n [formField]=\"$any(formTree)[item.index]\"\n [label]=\"item.label\"\n [placeholder]=\"item.placeholder\" \n [loading]=\"loading()\"\n [tooltipInfo]=\"item.tooltipInfo\"\n />\n }\n @case (FieldType.Cpf) {\n <input-cpf \n [ngClass]=\"item.class\" \n [class.hidden]=\"item.hiddenForm\" \n [formField]=\"$any(formTree)[item.index]\"\n [label]=\"item.label\"\n [placeholder]=\"item.placeholder\" \n [loading]=\"loading()\"\n [tooltipInfo]=\"item.tooltipInfo\"\n />\n }\n @case (FieldType.CpfCnpj) {\n <input-cpf-cnpj\n [ngClass]=\"item.class\"\n [class.hidden]=\"item.hiddenForm\"\n [formField]=\"$any(formTree)[item.index]\"\n [label]=\"item.label\"\n [placeholder]=\"item.placeholder\"\n [loading]=\"loading()\"\n [tooltipInfo]=\"item.tooltipInfo\"\n />\n }\n @case (FieldType.UUID) {\n <input-string\n [ngClass]=\"item.class\"\n [class.hidden]=\"item.hiddenForm\"\n [formField]=\"$any(formTree)[item.index]\"\n [label]=\"item.label\"\n [placeholder]=\"item.placeholder\"\n [loading]=\"loading()\"\n [tooltipInfo]=\"item.tooltipInfo\"\n />\n }\n @case (FieldType.TextArea) {\n <input-text-area\n [ngClass]=\"item.class\"\n [class.hidden]=\"item.hiddenForm\"\n [formField]=\"$any(formTree)[item.index]\"\n [label]=\"item.label\"\n [placeholder]=\"item.placeholder\"\n [loading]=\"loading()\"\n [tooltipInfo]=\"item.tooltipInfo\"\n />\n }\n @case (FieldType.Number) {\n <input-number\n [ngClass]=\"item.class\"\n [class.hidden]=\"item.hiddenForm\"\n [formField]=\"$any(formTree)[item.index]\"\n [label]=\"item.label\"\n [placeholder]=\"item.placeholder\"\n [loading]=\"loading()\"\n [tooltipInfo]=\"item.tooltipInfo\"\n />\n }\n @case (FieldType.Decimal) {\n <input-decimal\n [ngClass]=\"item.class\"\n [class.hidden]=\"item.hiddenForm\"\n [formField]=\"$any(formTree)[item.index]\"\n [label]=\"item.label\"\n [placeholder]=\"item.placeholder\"\n [loading]=\"loading()\"\n [tooltipInfo]=\"item.tooltipInfo\"\n />\n }\n @case (FieldType.Currency) {\n <input-currency\n [ngClass]=\"item.class\"\n [class.hidden]=\"item.hiddenForm\"\n [formField]=\"$any(formTree)[item.index]\"\n [label]=\"item.label\"\n [placeholder]=\"item.placeholder\"\n [loading]=\"loading()\"\n [tooltipInfo]=\"item.tooltipInfo\"\n />\n }\n @case (FieldType.File) {\n <input-file\n [ngClass]=\"item.class\"\n [class.hidden]=\"item.hiddenForm\"\n [clearable]=\"item.options?.clearable ?? false\"\n [formField]=\"$any(formTree)[item.index]\"\n [label]=\"item.label\"\n [placeholder]=\"item.placeholder\"\n [loading]=\"loading()\"\n [tooltipInfo]=\"item.tooltipInfo\"\n />\n }\n @case (FieldType.String) {\n <input-string\n [ngClass]=\"item.class\" \n [class.hidden]=\"item.hiddenForm\" \n [formField]=\"$any(formTree)[item.index]\"\n [label]=\"item.label\"\n [placeholder]=\"item.placeholder\" \n [loading]=\"loading()\"\n [type]=\"item.options?.type\"\n [tooltipInfo]=\"item.tooltipInfo\"\n />\n }\n @case (FieldType.Mask) {\n <input-mask \n [ngClass]=\"item.class\" \n [class.hidden]=\"item.hiddenForm\" \n [formField]=\"$any(formTree)[item.index]\"\n [label]=\"item.label\"\n [maskitoOptions]=\"item.options?.maskitoOptions!\"\n [unmaskHandler]=\"item.options?.unmaskHandler\"\n [placeholder]=\"item.placeholder\" \n [loading]=\"loading()\"\n [tooltipInfo]=\"item.tooltipInfo\"\n ></input-mask>\n }\n @case (FieldType.Select) {\n <input-select \n [ngClass]=\"item.class\" \n [class.hidden]=\"item.hiddenForm\" \n [schemaService]=\"item.options?.service?.() ?? null\"\n [items]=\"item.options?.lstOptions ?? []\"\n [bindValue]=\"item.options?.bindValue ?? null\"\n [bindLabel]=\"item.options?.bindLabel ?? null\"\n [lstFilter]=\"item.options?.lstFilter || null\"\n [clearable]=\"item.options?.clearable ?? false\"\n [formField]=\"$any(formTree)[item.index]\"\n [label]=\"item.label\"\n [placeholder]=\"item.placeholder\" \n [loading]=\"loading()\"\n [tooltipInfo]=\"item.tooltipInfo\"\n />\n }\n @case (FieldType.Date) {\n <input-date \n [ngClass]=\"item.class\" \n [class.hidden]=\"item.hiddenForm\" \n [formField]=\"$any(formTree)[item.index]\"\n [label]=\"item.label\"\n [placeholder]=\"item.placeholder\" \n [loading]=\"loading()\"\n [tooltipInfo]=\"item.tooltipInfo\"\n />\n }\n @case (FieldType.DateTime) {\n <input-date-time \n [ngClass]=\"item.class\" \n [class.hidden]=\"item.hiddenForm\" \n [formField]=\"$any(formTree)[item.index]\"\n [label]=\"item.label\"\n [placeholder]=\"item.placeholder\" \n [loading]=\"loading()\"\n [tooltipInfo]=\"item.tooltipInfo\"\n />\n }\n @case (FieldType.Time) {\n <input-time\n [ngClass]=\"item.class\"\n [class.hidden]=\"item.hiddenForm\"\n [formField]=\"$any(formTree)[item.index]\"\n [label]=\"item.label\"\n [placeholder]=\"item.placeholder\"\n [loading]=\"loading()\"\n [tooltipInfo]=\"item.tooltipInfo\"\n />\n }\n @case (FieldType.DateSpan) {\n <input-date-span\n [ngClass]=\"item.class\"\n [class.hidden]=\"item.hiddenForm\"\n [formField]=\"$any(formTree)[item.index]\"\n [label]=\"item.label\"\n [placeholder]=\"item.placeholder\"\n [loading]=\"loading()\"\n [tooltipInfo]=\"item.tooltipInfo\"\n />\n }\n @case (FieldType.DateTimeSpan) {\n <input-date-time-span\n [ngClass]=\"item.class\"\n [class.hidden]=\"item.hiddenForm\"\n [formField]=\"$any(formTree)[item.index]\"\n [label]=\"item.label\"\n [placeholder]=\"item.placeholder\"\n [loading]=\"loading()\"\n [tooltipInfo]=\"item.tooltipInfo\"\n />\n }\n @case (FieldType.TimeSpan) {\n <input-time-span\n [ngClass]=\"item.class\"\n [class.hidden]=\"item.hiddenForm\"\n [formField]=\"$any(formTree)[item.index]\"\n [label]=\"item.label\"\n [placeholder]=\"item.placeholder\"\n [loading]=\"loading()\"\n [tooltipInfo]=\"item.tooltipInfo\"\n />\n }\n @case (FieldType.Icon) {\n <input-icon \n [ngClass]=\"item.class\" \n [class.hidden]=\"item.hiddenForm\" \n [formField]=\"$any(formTree)[item.index]\"\n [label]=\"item.label\"\n [placeholder]=\"item.placeholder\" \n [loading]=\"loading()\"\n [tooltipInfo]=\"item.tooltipInfo\"\n />\n }\n @case (FieldType.JSON) {\n <!-- @let json = $any(formTree)[item.index]().value() | json;\n <hlm-code-block class=\"min-h-8\" [ngClass]=\"item.class\">\n <hlm-code-block-header>\n <hlm-code-block-title>{{ item.label }}</hlm-code-block-title>\n <hlm-code-block-actions>\n <button hlmCodeBlockCopyButton [value]=\"json\"></button>\n </hlm-code-block-actions>\n </hlm-code-block-header>\n <pre \n class=\"min-h-fit\"\n hlmCodeBlockContent \n lineNumbers\n wrap\n [code]=\"json\"\n >\n </pre>\n </hlm-code-block> -->\n <input-json\n [ngClass]=\"item.class\" \n [class.hidden]=\"item.hiddenForm\" \n [formField]=\"$any(formTree)[item.index]\"\n [label]=\"item.label\"\n [placeholder]=\"item.placeholder\" \n [loading]=\"loading()\"\n [tooltipInfo]=\"item.tooltipInfo\"\n />\n }\n @default {\n <div hlmField [ngClass]=\"item.class\" [hidden]=\"item.hiddenForm\">\n <label hlmFieldLabel [attr.for]=\"item.index\">\n {{ item.label }}\n </label>\n @if(!loading()){\n <input hlmInput [formField]=\"$any(formTree)[item.index]\" [attr.id]=\"item.index\" type=\"text\" [placeholder]=\"item.placeholder || ''\"/>\n <!-- <p hlmFieldDescription>This appears on invoices and emails.</p> -->\n }@else {\n <hlm-skeleton class=\"h-8 w-full rounded-lg\" [ngClass]=\"item.class\"/>\n }\n </div>\n }\n }\n }\n </fieldset>\n }\n \n @for (item of contentEnd(); track $index) {\n <ng-container *ngTemplateOutlet=\"item.template\"></ng-container>\n }\n\n\n @if(!noSave()){\n <div class=\"w-full shrink-0 flex items-center gap-2 justify-end\">\n <save-button [saving]=\"saving()\" (save)=\"save()\"></save-button>\n <!-- \n <button class=\"relative\" hlmBtn [variant]=\"saving() ? 'ghost' : 'default'\" size=\"sm\" (click)=\"save()\">\n @if(saving()) {\n <span class=\"absolute inset-0 rounded-[inherit] border-shimmer pointer-events-none\"></span>\n \n <ng-icon name=\"lucideRefreshCw\" class=\"text-lg shrink-0 animate-spin\"></ng-icon>\n Salvando...\n } @else {\n <ng-icon name=\"lucideSave\" class=\"text-lg shrink-0\"></ng-icon>\n Salvar\n }\n </button> -->\n </div>\n }\n </div>\n </hlm-card>\n </div>\n</div>","import { Component, computed, input } from '@angular/core';\n\n@Component({\n imports: [],\n selector: 'blurry-text-reveal',\n styleUrl: './blurry-text-reveal.component.scss',\n templateUrl: './blurry-text-reveal.component.html',\n})\nexport class BlurryTextRevealComponent {\n text = input<string>('Text');\n\n protected lstValues = computed(() => this.text().split(''));\n}\n","@for (item of lstValues(); track $index) {\n <span class=\"letter-reveal\">{{ item }}</span>\n}","import { Directive, inject, input, TemplateRef } from '@angular/core';\n\n@Directive({\n selector: 'ng-template[suspendedSlide]',\n})\nexport class SuspendedSlideDirective {\n template = inject(TemplateRef);\n\n name = input.required<string>({ alias: 'suspendedSlide' });\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, contentChildren, input } from '@angular/core';\n\nimport { SuspendedSlideDirective } from './suspended-slide.directive';\n\n@Component({\n imports: [CommonModule],\n selector: 'suspended-slider',\n styleUrl: './suspended-slider.component.scss',\n templateUrl: './suspended-slider.component.html',\n host: { class: 'block' },\n})\nexport class SuspendedSliderComponent {\n step = input.required<string>();\n\n protected lstSlides = contentChildren(SuspendedSlideDirective);\n}\n","<div class=\"relative size-full overflow-hidden p-[inherit]\">\n @for (slide of lstSlides(); track slide.name()) {\n <div \n class=\"w-full absolute right-0 top-0 inset-0 p-[inherit]\n animate-in fade-in-0 slide-in-from-right-2 fill-mode-forwards pointer-events-auto\n \"\n [ngClass]=\"{\n 'animate-out fade-out-0 slide-out-to-right-2 fill-mode-forwards pointer-events-none!':\n step() != slide.name()\n }\"\n [attr.aria-hidden]=\"step() != slide.name()\"\n [attr.inert]=\"step() != slide.name() ? '' : null\"\n >\n <div class=\"size-full p-[inherit] flex items-center justify-center\">\n <ng-container [ngTemplateOutlet]=\"slide.template\"></ng-container>\n </div>\n </div>\n }\n</div>\n","import { Directive, inject, TemplateRef } from '@angular/core';\n\nimport type { ITreeNodeContext } from './tree-drag-drop.component';\n\n/** Substitui o conteúdo padrão (ícone + label) de cada nó da `tree-drag-drop` pelo template */\n@Directive({\n selector: 'ng-template[treeDragDropNode]',\n})\nexport class TreeDragDropNodeDirective<T = any> {\n template = inject<TemplateRef<ITreeNodeContext<T>>>(TemplateRef);\n\n static ngTemplateContextGuard<T>(\n _dir: TreeDragDropNodeDirective<T>,\n _ctx: unknown,\n ): _ctx is ITreeNodeContext<T> {\n return true;\n }\n}\n","import type { ITreeNode, TreeNodeId } from './tree-drag-drop.component';\n\n/** Nó da árvore achatada em pré-ordem, como é renderizado na lista. */\nexport interface IFlatTreeNode<T> {\n node: ITreeNode<T>;\n parentId: TreeNodeId | null;\n depth: number;\n /** Posição entre os irmãos */\n index: number;\n /** Quantidade de irmãos, incluindo o próprio nó */\n setSize: number;\n /** Quantidade total de descendentes, visíveis ou não */\n descendants: number;\n expanded: boolean;\n}\n\nexport interface ITreeLocation<T> {\n node: ITreeNode<T>;\n parent: ITreeNode<T> | null;\n index: number;\n depth: number;\n}\n\nexport interface ITreeProjection<T> {\n /** Novo pai (`null` = raiz) */\n parent: ITreeNode<T> | null;\n depth: number;\n /** Posição entre os novos irmãos, desconsiderando o próprio nó */\n index: number;\n}\n\nexport type TreeDropPredicate<T> = (node: ITreeNode<T>, parent: ITreeNode<T> | null, depth: number) => boolean;\n\n/** Achata a árvore em pré-ordem, omitindo os descendentes dos nós em `hidden`. */\nexport function flattenTree<T>(\n nodes: readonly ITreeNode<T>[],\n hidden: ReadonlySet<TreeNodeId>,\n parentId: TreeNodeId | null = null,\n depth = 0,\n): IFlatTreeNode<T>[] {\n return nodes.flatMap((node, index) => {\n const descendants = countDescendants(node);\n const expanded = descendants > 0 && !hidden.has(node.id);\n return [\n { node, parentId, depth, index, setSize: nodes.length, descendants, expanded },\n ...(expanded ? flattenTree(node.children!, hidden, node.id, depth + 1) : []),\n ];\n });\n}\n\nexport function countDescendants<T>(node: ITreeNode<T>): number {\n return (node.children ?? []).reduce((total, child) => total + 1 + countDescendants(child), 0);\n}\n\n/** Níveis abaixo do nó: 0 para folhas, 1 se tem apenas filhos, e assim por diante. */\nexport function subtreeHeight<T>(node: ITreeNode<T>): number {\n return Math.max(0, ...(node.children ?? []).map((child) => 1 + subtreeHeight(child)));\n}\n\nexport function locateNode<T>(\n nodes: readonly ITreeNode<T>[],\n id: TreeNodeId,\n parent: ITreeNode<T> | null = null,\n depth = 0,\n): ITreeLocation<T> | null {\n for (const [index, node] of nodes.entries()) {\n if (node.id === id) return { node, parent, index, depth };\n const found = node.children && locateNode(node.children, id, node, depth + 1);\n if (found) return found;\n }\n return null;\n}\n\n/**\n * Calcula onde o nó em `activeIndex` cairá ao ser solto em `overIndex`, deslocado `levelOffset` níveis na horizontal.\n * O nível fica entre o do próximo item (para não tomar os filhos dele) e o do item anterior + 1 (no máximo vira\n * filho dele); dentro desse intervalo vence o nível mais próximo do desejado que `accepts` aceitar.\n * @returns `null` quando nenhum nível é aceito nessa posição.\n */\nexport function projectDrop<T>(\n flat: readonly IFlatTreeNode<T>[],\n activeIndex: number,\n overIndex: number,\n levelOffset: number,\n accepts: TreeDropPredicate<T>,\n): ITreeProjection<T> | null {\n const items = [...flat];\n const [active] = items.splice(activeIndex, 1);\n const before = items.slice(0, overIndex);\n const previous = before.at(-1);\n const next = items[overIndex];\n\n const minDepth = next?.depth ?? 0;\n const maxDepth = previous ? previous.depth + 1 : 0;\n const desired = Math.min(Math.max(active.depth + levelOffset, minDepth), maxDepth);\n const candidates = Array.from({ length: maxDepth - minDepth + 1 }, (_, i) => minDepth + i).sort(\n (a, b) => Math.abs(a - desired) - Math.abs(b - desired),\n );\n\n for (const depth of candidates) {\n // O pai é o item mais próximo acima com um nível a menos\n const parent = depth === 0 ? null : [...before].reverse().find((item) => item.depth === depth - 1)!.node;\n if (accepts(active.node, parent, depth)) {\n const index = before.filter((item) => item.parentId === (parent?.id ?? null)).length;\n return { parent, depth, index };\n }\n }\n return null;\n}\n\n/** Move o nó de `from` para a posição `index` entre os filhos de `parentId` (`null` = raiz), sem mutar a árvore. */\nexport function moveNode<T>(\n nodes: ITreeNode<T>[],\n from: ITreeLocation<T>,\n parentId: TreeNodeId | null,\n index: number,\n): ITreeNode<T>[] {\n const without = updateChildren(nodes, from.parent?.id ?? null, (children) =>\n children.filter((child) => child.id !== from.node.id),\n );\n return updateChildren(without, parentId, (children) => [\n ...children.slice(0, index),\n from.node,\n ...children.slice(index),\n ]);\n}\n\n/** Substitui os filhos de `parentId`, recriando apenas os nós no caminho até ele. */\nfunction updateChildren<T>(\n nodes: ITreeNode<T>[],\n parentId: TreeNodeId | null,\n update: (children: ITreeNode<T>[]) => ITreeNode<T>[],\n): ITreeNode<T>[] {\n if (parentId === null) return update(nodes);\n\n let changed = false;\n const result = nodes.map((node) => {\n const children =\n node.id === parentId\n ? update(node.children ?? [])\n : node.children && updateChildren(node.children, parentId, update);\n if (children === node.children) return node;\n changed = true;\n return { ...node, children };\n });\n return changed ? result : nodes;\n}\n","import { LiveAnnouncer } from '@angular/cdk/a11y';\nimport { CdkDrag, CdkDragDrop, CdkDragHandle, CdkDragMove, CdkDropList } from '@angular/cdk/drag-drop';\nimport { NgTemplateOutlet } from '@angular/common';\nimport {\n afterNextRender,\n booleanAttribute,\n Component,\n computed,\n contentChild,\n DestroyRef,\n ElementRef,\n inject,\n Injector,\n input,\n model,\n output,\n signal,\n viewChildren,\n} from '@angular/core';\n\nimport { NgIcon, provideIcons } from '@ng-icons/core';\nimport { lucideChevronRight, lucideLockKeyhole, lucideGripVertical } from '@ng-icons/lucide';\nimport { HlmBadgeImports, HlmButtonImports } from '@sapphire-caitlyn/schema-kit-ng/helm';\n\nimport { IdService } from '../../../services/id.service';\nimport { TreeDragDropNodeDirective } from './tree-drag-drop-node.directive';\nimport {\n flattenTree,\n IFlatTreeNode,\n locateNode,\n moveNode,\n projectDrop,\n subtreeHeight,\n TreeDropPredicate,\n} from './tree-drag-drop.utils';\n\n/**\n * Árvore com reordenação por drag and drop, inclusive entre níveis.\n * Arrastar na vertical define a posição e na horizontal o nível (cada `indent` px = um nível); o placeholder\n * mostra onde o item vai cair. Pelo teclado, Alt + ↑/↓ reordena entre irmãos e Alt + →/← muda de nível.\n */\n@Component({\n imports: [\n CdkDropList,\n CdkDrag,\n CdkDragHandle,\n NgTemplateOutlet,\n NgIcon,\n HlmButtonImports,\n HlmBadgeImports,\n ],\n providers: [provideIcons({ lucideChevronRight, lucideLockKeyhole, lucideGripVertical })],\n selector: 'tree-drag-drop',\n styleUrl: './tree-drag-drop.component.scss',\n templateUrl: './tree-drag-drop.component.html',\n})\nexport class TreeDragDropComponent<T = any> {\n private announcer = inject(LiveAnnouncer);\n private injector = inject(Injector);\n\n /** Árvore exibida; a cada movimentação é substituída por uma nova referência */\n nodes = model.required<ITreeNode<T>[]>();\n\n /** Rótulo acessível da árvore */\n label = input<string>();\n\n /** Recuo, em px, de cada nível. Também é o quanto se arrasta na horizontal para mudar de nível */\n indent = input(24);\n\n /** Quantidade máxima de níveis (1 = lista plana) */\n maxLevels = input(Infinity);\n\n /** Define se `node` pode ser filho de `parent` (`null` = raiz) */\n canDrop = input<(node: ITreeNode<T>, parent: ITreeNode<T> | null) => boolean>(() => true);\n\n /** Define se `node` pode ser movido. Os bloqueados exibem um cadeado no lugar da alça de arrasto */\n canDrag = input<(node: ITreeNode<T>) => boolean>(() => true);\n\n disabled = input(false, { transform: booleanAttribute });\n\n /** Emitido após cada movimentação, com a árvore já atualizada em `nodes` */\n nodeMoved = output<ITreeNodeMove<T>>();\n\n protected nodeTemplate = contentChild<TreeDragDropNodeDirective<T>>(TreeDragDropNodeDirective);\n private treeItems = viewChildren<ElementRef<HTMLElement>>('treeItem');\n\n protected hintId = inject(IdService).next('tree-drag-drop-hint');\n\n protected collapsed = signal<ReadonlySet<TreeNodeId>>(new Set());\n protected focusedId = signal<TreeNodeId | null>(null);\n\n /** Nó sendo arrastado. Seus descendentes saem da lista durante o drag e acompanham o pai */\n protected activeId = signal<TreeNodeId | null>(null);\n protected overIndex = signal(0);\n private levelOffset = signal(0);\n\n protected flat = computed(() => {\n const activeId = this.activeId();\n const hidden = activeId === null ? this.collapsed() : new Set([...this.collapsed(), activeId]);\n return flattenTree(this.nodes(), hidden);\n });\n\n /** Item que recebe o foco ao entrar na árvore via Tab (roving tabindex) */\n protected tabbableId = computed(() => {\n const flat = this.flat();\n const focusedId = this.focusedId();\n return flat.some((item) => item.node.id === focusedId) ? focusedId : flat[0]?.node.id;\n });\n\n protected projection = computed(() => {\n const activeId = this.activeId();\n if (activeId === null) return null;\n const flat = this.flat();\n return projectDrop(flat, this.indexOf(activeId), this.overIndex(), this.levelOffset(), this.accepts);\n });\n\n /** Recuo do placeholder: nível projetado ou, se a posição for inválida, o nível de origem */\n protected dropIndent = computed(() => {\n const activeId = this.activeId();\n if (activeId === null) return null;\n const depth = this.projection()?.depth ?? this.flat()[this.indexOf(activeId)].depth;\n return `${depth * this.indent()}px`;\n });\n\n constructor() {\n inject(DestroyRef).onDestroy(() => this.dragEnded());\n }\n\n private accepts: TreeDropPredicate<T> = (node, parent, depth) =>\n depth + subtreeHeight(node) < this.maxLevels() && this.canDrop()(node, parent);\n\n protected toggle(id: TreeNodeId) {\n this.collapsed.update((collapsed) => {\n const next = new Set(collapsed);\n if (!next.delete(id)) next.add(id);\n return next;\n });\n }\n\n protected dragStarted(item: IFlatTreeNode<T>) {\n this.overIndex.set(this.indexOf(item.node.id));\n this.levelOffset.set(0);\n this.activeId.set(item.node.id);\n this.guardClick();\n }\n\n protected dragMoved(event: CdkDragMove) {\n this.levelOffset.set(Math.round(event.distance.x / this.indent()));\n }\n\n private releaseClickGuard?: () => void;\n\n /**\n * Durante o drag o CDK move o item para o <body>; o click disparado ao soltar cai fora de\n * overlays (ex.: dialog) e seria tratado como clique fora, fechando-os. Descarta esse click.\n */\n private guardClick() {\n const swallow = (event: Event) => {\n event.stopPropagation();\n this.dragEnded();\n };\n window.addEventListener('click', swallow, { capture: true });\n this.releaseClickGuard = () => window.removeEventListener('click', swallow, { capture: true });\n }\n\n protected dragEnded() {\n this.releaseClickGuard?.();\n this.releaseClickGuard = undefined;\n }\n\n /** O `cdkDragEnded` dispara antes deste evento, então o estado do drag só é limpo aqui */\n protected dropped(event: CdkDragDrop<unknown, unknown, IFlatTreeNode<T>>) {\n const { node } = event.item.data;\n const levelOffset = Math.round(event.distance.x / this.indent());\n const projection = projectDrop(this.flat(), this.indexOf(node.id), event.currentIndex, levelOffset, this.accepts);\n this.activeId.set(null);\n if (projection) this.move(node, projection.parent, projection.index);\n }\n\n protected onKeydown(event: KeyboardEvent, item: IFlatTreeNode<T>) {\n const handled = event.altKey ? this.moveByKey(event.key, item) : this.navigateByKey(event.key, item);\n if (handled) event.preventDefault();\n }\n\n /** Navegação do padrão WAI-ARIA de tree view */\n private navigateByKey(key: string, item: IFlatTreeNode<T>): boolean {\n const index = this.indexOf(item.node.id);\n switch (key) {\n case 'ArrowDown':\n this.focusAt(index + 1);\n return true;\n case 'ArrowUp':\n this.focusAt(index - 1);\n return true;\n case 'Home':\n this.focusAt(0);\n return true;\n case 'End':\n this.focusAt(this.flat().length - 1);\n return true;\n case 'ArrowRight':\n if (item.expanded) this.focusAt(index + 1);\n else if (item.descendants) this.toggle(item.node.id);\n return true;\n case 'ArrowLeft':\n if (item.expanded) this.toggle(item.node.id);\n else if (item.parentId !== null) this.focusAt(this.indexOf(item.parentId));\n return true;\n default:\n return false;\n }\n }\n\n /** Alternativa de teclado ao arrasto (WCAG 2.5.7) */\n private moveByKey(key: string, item: IFlatTreeNode<T>): boolean {\n if (this.disabled() || !key.startsWith('Arrow')) return false;\n if (!this.canDrag()(item.node)) {\n this.announcer.announce(`${item.node.label} não pode ser movido`);\n return true;\n }\n\n const from = locateNode(this.nodes(), item.node.id)!;\n const siblings = from.parent?.children ?? this.nodes();\n let target: Pick<ITreeNodeMove<T>, 'parent' | 'index'> | null = null;\n\n switch (key) {\n case 'ArrowUp':\n if (from.index > 0) target = { parent: from.parent, index: from.index - 1 };\n break;\n case 'ArrowDown':\n if (from.index < siblings.length - 1) target = { parent: from.parent, index: from.index + 1 };\n break;\n case 'ArrowRight': {\n // Vira o último filho do irmão anterior\n const previous = siblings[from.index - 1];\n if (previous && this.accepts(from.node, previous, from.depth + 1)) {\n target = { parent: previous, index: previous.children?.length ?? 0 };\n }\n break;\n }\n case 'ArrowLeft': {\n // Vira o irmão seguinte do pai\n if (!from.parent) break;\n const parent = locateNode(this.nodes(), from.parent.id)!;\n if (this.accepts(from.node, parent.parent, from.depth - 1)) {\n target = { parent: parent.parent, index: parent.index + 1 };\n }\n break;\n }\n default:\n return false;\n }\n\n if (target && this.move(from.node, target.parent, target.index)) {\n // O @for move o elemento no DOM, o que tira o foco dele\n afterNextRender(() => this.focusAt(this.indexOf(from.node.id)), { injector: this.injector });\n }\n return true;\n }\n\n /** Move `node` para a posição `index` entre os filhos de `parent` (`null` = raiz) */\n private move(node: ITreeNode<T>, parent: ITreeNode<T> | null, index: number): boolean {\n const from = locateNode(this.nodes(), node.id)!;\n if (from.parent?.id === parent?.id && from.index === index) return false;\n\n const nodes = moveNode(this.nodes(), from, parent?.id ?? null, index);\n this.nodes.set(nodes);\n if (parent && this.collapsed().has(parent.id)) this.toggle(parent.id);\n\n const to = locateNode(nodes, node.id)!;\n this.nodeMoved.emit({\n node,\n previousParent: from.parent,\n previousIndex: from.index,\n parent: to.parent,\n index: to.index,\n });\n this.announcer.announce(`${node.label} movido para o nível ${to.depth + 1}, posição ${to.index + 1}`);\n return true;\n }\n\n private focusAt(index: number) {\n this.treeItems()[index]?.nativeElement.focus();\n }\n\n private indexOf(id: TreeNodeId) {\n return this.flat().findIndex((item) => item.node.id === id);\n }\n}\n\nexport type TreeNodeId = string | number;\n\nexport interface ITreeNode<T = any> {\n id: TreeNodeId;\n label: string;\n icon?: string;\n data?: T;\n children?: ITreeNode<T>[];\n}\n\nexport interface ITreeNodeMove<T = any> {\n node: ITreeNode<T>;\n previousParent: ITreeNode<T> | null;\n previousIndex: number;\n /** Novo pai (`null` = raiz), já com `node` entre os filhos */\n parent: ITreeNode<T> | null;\n index: number;\n}\n\nexport interface ITreeNodeContext<T = any> {\n $implicit: ITreeNode<T>;\n level: number;\n expanded: boolean;\n}\n","<div\n role=\"tree\"\n cdkDropList\n class=\"tree flex flex-col gap-1\"\n [cdkDropListDisabled]=\"disabled()\"\n [attr.aria-label]=\"label()\"\n [attr.aria-describedby]=\"hintId\"\n [attr.data-drop-invalid]=\"activeId() !== null && !projection() ? '' : null\"\n [style.--tree-drop-indent]=\"dropIndent()\"\n (cdkDropListSorted)=\"overIndex.set($event.currentIndex)\"\n (cdkDropListDropped)=\"dropped($event)\"\n>\n @for (item of flat(); track item.node.id) {\n @let draggable = canDrag()(item.node);\n <div\n #treeItem\n cdkDrag\n role=\"treeitem\"\n class=\"tree-item group/item rounded-md outline-none\"\n [cdkDragData]=\"item\"\n [cdkDragDisabled]=\"!draggable\"\n [style.padding-inline-start.px]=\"item.depth * indent()\"\n [tabindex]=\"item.node.id === tabbableId() ? 0 : -1\"\n [attr.aria-label]=\"item.node.label\"\n [attr.aria-level]=\"item.depth + 1\"\n [attr.aria-posinset]=\"item.index + 1\"\n [attr.aria-setsize]=\"item.setSize\"\n [attr.aria-expanded]=\"item.descendants ? item.expanded : null\"\n (focusin)=\"focusedId.set(item.node.id)\"\n (keydown)=\"onKeydown($event, item)\"\n (cdkDragStarted)=\"dragStarted(item)\"\n (cdkDragMoved)=\"dragMoved($event)\"\n (cdkDragEnded)=\"dragEnded()\"\n >\n <div\n class=\"tree-card bg-card group-focus-visible/item:border-ring group-focus-visible/item:ring-ring/50 flex items-center gap-2 rounded-md border p-2 group-focus-visible/item:ring-[3px]\"\n >\n <ng-icon\n cdkDragHandle\n aria-hidden=\"true\"\n class=\"text-muted-foreground shrink-0 text-lg\"\n [name]=\"draggable ? 'lucideGripVertical' : 'lucideLockKeyhole'\"\n [class.cursor-grab]=\"draggable\"\n [class.cursor-not-allowed]=\"!draggable\"\n />\n\n @if (item.descendants) {\n <button\n hlmBtn\n variant=\"ghost\"\n size=\"icon-sm\"\n tabindex=\"-1\"\n class=\"text-muted-foreground shrink-0\"\n [attr.aria-label]=\"(item.expanded ? 'Recolher ' : 'Expandir ') + item.node.label\"\n (click)=\"toggle(item.node.id)\"\n >\n <ng-icon name=\"lucideChevronRight\" class=\"transition-transform\" [class.rotate-90]=\"item.expanded\" />\n </button>\n } @else {\n <span class=\"size-7 shrink-0\"></span>\n }\n\n @if (nodeTemplate(); as nodeTemplate) {\n <ng-container\n *ngTemplateOutlet=\"\n nodeTemplate.template;\n context: { $implicit: item.node, level: item.depth + 1, expanded: item.expanded }\n \"\n />\n } @else {\n @if (item.node.icon) {\n <ng-icon [name]=\"item.node.icon\" class=\"shrink-0 text-lg\" />\n }\n <span class=\"truncate text-sm\">{{ item.node.label }}</span>\n }\n\n @if (item.descendants) {\n <!-- Visível apenas no preview do drag, já que os descendentes somem da lista enquanto isso -->\n <span hlmBadge variant=\"secondary\" class=\"tree-descendants ms-auto\">+{{ item.descendants }}</span>\n }\n </div>\n </div>\n }\n</div>\n\n<span [id]=\"hintId\" class=\"sr-only\">\n Use Alt + seta para cima ou para baixo para reordenar e Alt + seta para a direita ou para a esquerda para mudar de\n nível.\n</span>\n","import { Component, viewChild } from '@angular/core';\n\nimport { HlmDialog } from '@sapphire-caitlyn/schema-kit-ng/helm';\n\n@Component({\n imports: [],\n selector: 'schema-dialog',\n styleUrl: './schema-dialog.component.scss',\n templateUrl: './schema-dialog.component.html',\n})\nexport class SchemaDialogComponent<Result = void> {\n dialog = viewChild.required<HlmDialog>(HlmDialog);\n\n close(result: Result) {\n this.dialog().close(result);\n }\n}\n","<p>\n there should be a dialog here, if you see this message,\n you did not implement the dialog correctly, please check the documentation\n</p>\n","import { ApplicationRef, ComponentRef, createComponent, EnvironmentInjector, inject, InputSignalWithTransform, ModelSignal, Service, Type } from '@angular/core';\n\nimport { SchemaDialogComponent } from './schema-dialog.component';\n\n// Apenas inputs baseados em signal (input()/model()), com o valor desembrulhado, como no setInput\ntype DialogInputs<T> = {\n [K in keyof T as T[K] extends InputSignalWithTransform<unknown, unknown> | ModelSignal<unknown> ? K : never]?:\n T[K] extends InputSignalWithTransform<unknown, infer W> ? W : T[K] extends ModelSignal<infer V> ? V : never;\n};\n\n// Tipo do resultado declarado no SchemaDialogComponent<Result> estendido pelo componente\ntype DialogResult<T> = T extends SchemaDialogComponent<infer R> ? R : never;\n\n@Service()\nexport class SchemaDialogController {\n\n private environmentInjector = inject(EnvironmentInjector);\n\n private appRef = inject(ApplicationRef);\n\n // O componente é destruído ao fechar o dialog, exceto com destroyOnClose: false ou se não for aberto; nesses casos cabe a quem chamou destruir a ref\n open<T extends SchemaDialogComponent<any>>(\n component: Type<T>,\n inputs?: DialogInputs<T>,\n options: ISchemaDialogOptions = {},\n ): ISchemaDialogReturn<T> {\n const componentRef = createComponent(component, {\n environmentInjector: this.environmentInjector,\n });\n for (const [name, value] of Object.entries(inputs ?? {})) {\n componentRef.setInput(name, value);\n }\n this.appRef.attachView(componentRef.hostView);\n\n const dialog = componentRef.instance.dialog();\n // Um único listener: resolve antes de destruir, senão o destroy completa o output antes do valor chegar\n const closed = new Promise<DialogResult<T> | undefined>((resolve) => {\n dialog.closed.subscribe((result) => {\n resolve(result as DialogResult<T> | undefined);\n if (options.destroyOnClose ?? true) {\n componentRef.destroy();\n }\n });\n // Resolve também se a ref for destruída sem fechar o dialog\n componentRef.onDestroy(() => resolve(undefined));\n });\n\n if (options.open ?? true) {\n dialog.open();\n }\n return {\n component: componentRef,\n instance: componentRef.instance,\n closed,\n };\n }\n}\nexport interface ISchemaDialogOptions {\n /** Default: true */\n destroyOnClose?: boolean;\n /** Default: true */\n open?: boolean;\n}\nexport interface ISchemaDialogReturn<T extends SchemaDialogComponent<any>> {\n component: ComponentRef<T>;\n instance: T;\n /** Resolve com o valor passado em close(result), ou undefined se fechado sem resultado (ex.: hlmDialogClose, ESC, clique fora) */\n closed: Promise<DialogResult<T> | undefined>;\n}","import { FieldValidator, SchemaPath, validate } from \"@angular/forms/signals\";\n\nexport const fieldValidatorAsRule = <T>(validator: FieldValidator<T>) => (p: SchemaPath<T>) => validate(p, validator);","import { FieldValidator } from '@angular/forms/signals';\n\nimport { fieldValidatorAsRule } from '../utils/field-validator-as-rule'\n\n/**\n * Calcula o dígito verificador de um CNPJ usando o algoritmo Módulo 11\n * com pesos cíclicos 2..9.\n *\n * Aceita tanto CNPJs puramente numéricos quanto no formato alfanumérico\n * da Nota Técnica RFB 49/2024 (letras A-Z convertidas via ASCII - 48).\n *\n * @param digits - String com 12 dígitos (para DV1) ou 13 dígitos (para DV2).\n * @returns Dígito verificador (0..9).\n */\nfunction cnpjDigit(digits: string): number {\n let sum = 0\n let weight = 2\n for (let i = digits.length - 1; i >= 0; i--) {\n sum += (digits.charCodeAt(i) - 48) * weight\n weight = weight === 9 ? 2 : weight + 1\n }\n const mod = sum % 11\n return mod < 2 ? 0 : 11 - mod\n}\n\nconst BLACKLIST = new Set<string>([\n '00000000000000',\n '11111111111111',\n '22222222222222',\n '33333333333333',\n '44444444444444',\n '55555555555555',\n '66666666666666',\n '77777777777777',\n '88888888888888',\n '99999999999999'\n])\n\nconst STRICT_STRIP_REGEX = /[./-]/g\nconst LOOSE_STRIP_REGEX = /[^\\dA-Z]/g\nconst STRICT_MASK_REGEX =\n /^(?:[\\dA-Z]{2}\\.[\\dA-Z]{3}\\.[\\dA-Z]{3}\\/[\\dA-Z]{4}-\\d{2}|[\\dA-Z]{12}\\d{2})$/\nconst VALID_CHARS = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'\n\n/** Opções para `cnpj.generate()`. */\nexport interface GenerateOptions {\n /** Retorna o CNPJ com máscara `XX.XXX.XXX/XXXX-YY` quando `true`. */\n formatted?: boolean\n}\n\n/**\n * Remove caracteres de máscara e normaliza um CNPJ.\n *\n * Em modo padrão (loose), converte minúsculas para maiúsculas e remove\n * qualquer caractere que não seja dígito ou letra A-Z. Em modo strict,\n * remove apenas `.`, `/` e `-` (máscara oficial) sem normalizar o case.\n *\n * @param value - Entrada a ser normalizada.\n * @param strict - Se `true`, só remove os caracteres da máscara oficial.\n * @returns Apenas dígitos e letras A-Z remanescentes.\n */\nfunction strip(value: string, strict?: boolean): string {\n if (typeof value !== 'string') return ''\n const normalized = strict ? value : value.toUpperCase()\n const regex = strict ? STRICT_STRIP_REGEX : LOOSE_STRIP_REGEX\n return normalized.replace(regex, '')\n}\n\n/**\n * Aplica a máscara oficial `XX.XXX.XXX/XXXX-YY` no CNPJ (numérico ou\n * alfanumérico). Os 2 últimos caracteres (DVs) são sempre numéricos.\n *\n * @param value - CNPJ cru ou já formatado.\n * @returns CNPJ mascarado, ou entrada normalizada quando não casar com o\n * padrão de 14 posições.\n */\nfunction format(value: string): string {\n return strip(value).replace(\n /^([\\dA-Z]{2})([\\dA-Z]{3})([\\dA-Z]{3})([\\dA-Z]{4})(\\d{2})$/,\n '$1.$2.$3/$4-$5'\n )\n}\n\n/**\n * Valida um CNPJ verificando tamanho, lista negra, shape dos DVs e os\n * dois dígitos verificadores via Módulo 11.\n *\n * Aceita tanto CNPJs puramente numéricos (formato legado) quanto\n * alfanuméricos (novo formato da Nota Técnica RFB 49/2024 — vigência\n * obrigatória em julho/2026).\n *\n * @param value - CNPJ (cru, formatado ou com lixo, conforme `strict`).\n * @param strict - Se `true`, só aceita máscara canônica ou 14 caracteres\n * `[0-9A-Z]` sem normalização de case.\n * @returns `true` se o CNPJ é válido; `false` caso contrário.\n *\n * @example\n * ```ts\n * cnpj.isValid('54.550.752/0001-55') // true\n * cnpj.isValid('54550752000155') // true\n * cnpj.isValid('12ABC34501DE35') // true (novo formato RFB)\n * cnpj.isValid('12.ABC.345/01DE-35') // true\n * ```\n */\nfunction isValid(value: string, strict?: boolean): boolean {\n if (strict && (typeof value !== 'string' || !STRICT_MASK_REGEX.test(value))) {\n return false\n }\n const stripped = strip(value, strict)\n if (!stripped || stripped.length !== 14 || BLACKLIST.has(stripped)) {\n return false\n }\n // DVs (últimas 2 posições) devem ser numéricos pela regra da RFB.\n if (!/^\\d{2}$/.test(stripped.slice(-2))) {\n return false\n }\n\n let numbers = stripped.slice(0, 12)\n numbers += cnpjDigit(numbers)\n numbers += cnpjDigit(numbers)\n return numbers.slice(-2) === stripped.slice(-2)\n}\n\n/**\n * Gera um CNPJ alfanumérico matematicamente válido, seguindo o formato\n * da Nota Técnica RFB 49/2024.\n *\n * @param options - Boolean legado (apenas `formatted`) ou objeto de opções.\n * @returns CNPJ gerado com 14 caracteres (12 alfanuméricos + 2 DVs\n * numéricos) ou a máscara oficial.\n *\n * @example\n * ```ts\n * cnpj.generate() // '58A0Z919U001O6'\n * cnpj.generate(true) // '58.A0Z.919/U001-O6' (nope — DVs sempre numéricos)\n * cnpj.generate({ formatted: true }) // '58.A0Z.919/U001-06'\n * ```\n */\nfunction generate(options?: boolean | GenerateOptions): string {\n const opts: GenerateOptions =\n typeof options === 'boolean' ? { formatted: options } : (options ?? {})\n\n let numbers = ''\n for (let i = 0; i < 12; i++) {\n numbers += VALID_CHARS.charAt(Math.floor(Math.random() * VALID_CHARS.length))\n }\n numbers += cnpjDigit(numbers)\n numbers += cnpjDigit(numbers)\n return opts.formatted ? format(numbers) : numbers\n}\n\nconst cnpjFieldValidator: FieldValidator<string | null> = ({ value }) => {\n const v = value();\n if(!v) return null;\n return isValid(v) ? null : { kind: 'cnpj', message: 'CNPJ inválido' };\n};\nconst cnpjValidator = fieldValidatorAsRule(cnpjFieldValidator);\n\nexport { \n cnpjValidator,\n isValid as isCnpjValid,\n}","import { FieldValidator } from '@angular/forms/signals';\n\nimport { fieldValidatorAsRule } from '../utils/field-validator-as-rule'\n\n/**\n * Calcula o dígito verificador de um CPF usando o algoritmo Módulo 11\n * com pesos lineares crescentes.\n *\n * @param digits - String com 9 dígitos (para DV1) ou 10 dígitos (para DV2).\n * @returns Dígito verificador (0..9).\n */\nfunction cpfDigit(digits: string): number {\n let sum = 0\n const n = digits.length\n for (let i = n - 1; i >= 0; i--) {\n sum += (digits.charCodeAt(i) - 48) * (n - i + 1)\n }\n const mod = sum % 11\n return mod < 2 ? 0 : 11 - mod\n}\n\n\nconst BLACKLIST = new Set<string>([\n '00000000000',\n '11111111111',\n '22222222222',\n '33333333333',\n '44444444444',\n '55555555555',\n '66666666666',\n '77777777777',\n '88888888888',\n '99999999999',\n '12345678909'\n])\n\nconst STRICT_STRIP_REGEX = /[.-]/g\nconst LOOSE_STRIP_REGEX = /[^\\d]/g\nconst STRICT_MASK_REGEX = /^(?:\\d{3}\\.\\d{3}\\.\\d{3}-\\d{2}|\\d{11})$/\n\n/**\n * Mapa dos 27 UFs brasileiros para seus dígitos de Região Fiscal da\n * Receita Federal (0..9), codificados na 9ª posição do CPF.\n *\n * @example\n * ```ts\n * FISCAL_REGION_BY_UF.SP // 8 (São Paulo — 8ª Região Fiscal)\n * FISCAL_REGION_BY_UF.RS // 0 (Rio Grande do Sul — 10ª Região Fiscal)\n * ```\n */\nconst FISCAL_REGION_BY_UF = {\n DF: 1,\n GO: 1,\n MS: 1,\n MT: 1,\n TO: 1,\n AC: 2,\n AM: 2,\n AP: 2,\n PA: 2,\n RO: 2,\n RR: 2,\n CE: 3,\n MA: 3,\n PI: 3,\n AL: 4,\n PB: 4,\n PE: 4,\n RN: 4,\n BA: 5,\n SE: 5,\n MG: 6,\n ES: 7,\n RJ: 7,\n SP: 8,\n PR: 9,\n SC: 9,\n RS: 0\n} as const\n\n/** Unidade da Federação — um dos 26 estados brasileiros ou DF. */\n type UF = keyof typeof FISCAL_REGION_BY_UF\n\n/** Opções para `cpf.generate()`. */\n interface GenerateOptions {\n /** Retorna o CPF com máscara `XXX.XXX.XXX-XX` quando `true`. */\n formatted?: boolean\n /** UF de emissão — controla o dígito da Região Fiscal (9ª posição). */\n state?: UF\n}\n\n/**\n * Remove caracteres de máscara e normaliza um CPF.\n *\n * @param value - Entrada a ser normalizada.\n * @param strict - Se `true`, remove apenas `.` e `-`. Se `false` ou omitido,\n * remove qualquer caractere não numérico.\n * @returns Apenas os dígitos remanescentes.\n */\nfunction strip(value: string, strict?: boolean): string {\n if (typeof value !== 'string') return ''\n const regex = strict ? STRICT_STRIP_REGEX : LOOSE_STRIP_REGEX\n return value.replace(regex, '')\n}\n\n/**\n * Aplica a máscara oficial `XXX.XXX.XXX-XX` no CPF.\n *\n * @param value - CPF cru ou já formatado.\n * @returns O CPF com máscara, ou a entrada normalizada quando não casar\n * com o padrão de 11 dígitos.\n */\nfunction format(value: string): string {\n return strip(value).replace(/^(\\d{3})(\\d{3})(\\d{3})(\\d{2})$/, '$1.$2.$3-$4')\n}\n\n/**\n * Valida um CPF verificando tamanho, lista negra e os dois dígitos\n * verificadores via Módulo 11.\n *\n * @param value - CPF (cru, formatado ou com lixo, conforme `strict`).\n * @param strict - Se `true`, só aceita máscara canônica `XXX.XXX.XXX-XX`\n * ou 11 dígitos puros. Se `false` ou omitido, remove qualquer lixo.\n * @returns `true` se o CPF é válido; `false` caso contrário.\n *\n * @example\n * ```ts\n * cpf.isValid('295.379.955-93') // true\n * cpf.isValid('29537995593') // true\n * cpf.isValid('00000000000') // false (blacklist)\n * ```\n */\nfunction isValid(value: string, strict?: boolean): boolean {\n if (strict && (typeof value !== 'string' || !STRICT_MASK_REGEX.test(value))) {\n return false\n }\n const stripped = strip(value, strict)\n if (!stripped || stripped.length !== 11 || BLACKLIST.has(stripped)) {\n return false\n }\n\n let numbers = stripped.slice(0, 9)\n numbers += cpfDigit(numbers)\n numbers += cpfDigit(numbers)\n return numbers.slice(-2) === stripped.slice(-2)\n}\n\n/**\n * Gera um CPF matematicamente válido, opcionalmente formatado ou\n * vinculado a uma UF específica (via Região Fiscal da RFB).\n *\n * @param options - Boolean legado (apenas `formatted`) ou objeto com\n * `formatted` e/ou `state`. Quando `state` é informado, a 9ª posição\n * recebe o dígito da Região Fiscal correspondente.\n * @returns CPF gerado, com 11 dígitos crus ou a máscara oficial.\n * @throws {TypeError} Se `options.state` for informado mas não for um UF\n * conhecido.\n *\n * @example\n * ```ts\n * cpf.generate() // '32564428777'\n * cpf.generate(true) // '325.644.287-77'\n * cpf.generate({ state: 'SP' }) // '...8??' (8ª posição = RF SP)\n * cpf.generate({ formatted: true, state: 'SP' }) // '325.644.287-77' (9ª = '8')\n * ```\n */\nfunction generate(options?: boolean | GenerateOptions): string {\n const opts: GenerateOptions =\n typeof options === 'boolean' ? { formatted: options } : (options ?? {})\n\n let numbers = ''\n for (let i = 0; i < 8; i++) {\n numbers += Math.floor(Math.random() * 10)\n }\n\n if (opts.state !== undefined) {\n if (!Object.hasOwn(FISCAL_REGION_BY_UF, opts.state)) {\n throw new TypeError(\n `UF '${opts.state}' desconhecida — use uma das: ${Object.keys(FISCAL_REGION_BY_UF).join(', ')}`\n )\n }\n numbers += FISCAL_REGION_BY_UF[opts.state]\n } else {\n numbers += Math.floor(Math.random() * 10)\n }\n\n numbers += cpfDigit(numbers)\n numbers += cpfDigit(numbers)\n return opts.formatted ? format(numbers) : numbers\n}\n\nconst cpfFieldValidator: FieldValidator<string | null> = ({ value }) => {\n const v = value();\n if(!v) return null;\n return isValid(v) ? null : { kind: 'cpf', message: 'CPF inválido' };\n};\n\nconst cpfValidator = fieldValidatorAsRule(cpfFieldValidator);\n\nexport { \n cpfValidator,\n isValid as isCpfValid,\n}","import { FieldValidator } from '@angular/forms/signals';\n\nimport { isCnpjValid } from './cnpj.validator';\nimport { isCpfValid } from './cpf.validator';\nimport { fieldValidatorAsRule } from '../utils/field-validator-as-rule';\n\nfunction isValid(value: string): boolean {\n return isCpfValid(value) || isCnpjValid(value);\n}\n\nconst cpfCnpjFieldValidator: FieldValidator<string | null> = ({ value }) => {\n const v = value();\n if(!v) return null;\n return isValid(v) ? null : { kind: 'cpfCnpj', message: 'CPF/CNPJ inválido' };\n};\nconst cpfCnpjValidator = fieldValidatorAsRule(cpfCnpjFieldValidator);\n\nexport { \n cpfCnpjValidator,\n}","import { FieldValidator } from '@angular/forms/signals';\nimport z from 'zod';\n\nimport { fieldValidatorAsRule } from '../utils/field-validator-as-rule';\n\nfunction isValid(value: string | null) {\n return z.url().nullable().safeParse(value);\n}\nconst urlFieldValidator: FieldValidator<string | null> = ({ value }) => {\n if(!value() || isValid(value()).success) {\n return null;\n };\n return { kind: 'url', message: 'URL inválida' };\n};\nconst urlValidator = fieldValidatorAsRule(urlFieldValidator);\n\nfunction isValidPartial(value: string | null) {\n return z.string().regex(/^\\/[a-zA-Z0-9_-]+(?:\\/[a-zA-Z0-9_-]+)*$/, {\n message: \"Invalid URL path\",\n }).safeParse(value);\n}\nconst partialUrlFieldValidator: FieldValidator<string | null> = ({ value }) => {\n if(!value() || isValidPartial(value()).success) {\n return null;\n };\n return { kind: 'partialUrl', message: 'URL parcial inválida' };\n};\nconst partialUrlValidator = fieldValidatorAsRule(partialUrlFieldValidator);\n\nexport { \n urlValidator,\n partialUrlValidator\n}\n","import { FieldValidator } from '@angular/forms/signals';\nimport z from 'zod';\n\nimport { fieldValidatorAsRule } from '../utils/field-validator-as-rule';\n\nconst passwordSchema = z.string()\n .min(8, { message: 'A senha deve ter pelo menos 8 caracteres' })\n .regex(/[a-z]/, { message: 'A senha deve conter pelo menos uma letra minúscula' })\n .regex(/[A-Z]/, { message: 'A senha deve conter pelo menos uma letra maiúscula' })\n .regex(/[0-9]/, { message: 'A senha deve conter pelo menos um número' })\n .regex(/[^a-zA-Z0-9]/, { message: 'A senha deve conter pelo menos um símbolo' })\n .nullish();\n\nconst passwordFieldValidator: FieldValidator<string | null> = ({ value }) => {\n const result = passwordSchema.safeParse(value() ?? '');\n if(result.success) {\n return null;\n };\n return { kind: 'password', message: result.error.issues[0].message };\n};\nconst passwordValidator = fieldValidatorAsRule(passwordFieldValidator);\n\nfunction isValid(password: string): boolean {\n return passwordSchema.safeParse(password).success;\n}\n\nexport {\n passwordValidator,\n isValid as isValidPassword\n}\n","export const SCHEMA_KIT_VERSION = '0.0.1';\n\nexport * from './classes/schema-field/field-type';\nexport * from './classes/schema-field/schema-builder';\nexport * from './classes/schema-field/schema-field';\n\nexport * from './components/inputs/input-index';\n\nexport * from './components/schema-table/schema-table.component';\nexport * from './components/schema-view/schema-view.component';\nexport * from './components/ui/loading/loading.component';\nexport * from './components/ui/file-preview/file-preview.component';\nexport * from './components/ui/breadcrumbs/breadcrumbs.component';\nexport * from './components/ui/blurry-text-reveal/blurry-text-reveal.component';\nexport * from './components/ui/suspended-slider/suspended-slider.component';\nexport * from './components/ui/suspended-slider/suspended-slide.directive';\nexport * from './components/ui/save-button/save-button.component';\nexport * from './components/ui/tree-drag-drop/tree-drag-drop.component';\nexport * from './components/ui/tree-drag-drop/tree-drag-drop-node.directive';\nexport * from './components/ui/schema-dialog/schema-dialog.component';\nexport * from './components/ui/schema-dialog/schema-dialog-controller.service';\nexport * from './components/inputs/input-color/color-picker/color-picker.component';\nexport * from './components/error-message-provider/error-message-provider.component';\n\nexport * from './components/schema-table/schema-table-actions.directive';\nexport * from './components/schema-table/schema-table-replacement-for.directive';\nexport * from './components/schema-table/schema-table-toolbar.directive';\nexport * from './components/schema-view/schema-view-content.directive';\nexport * from './pipes/has-permissao.pipe';\nexport * from './schema-kit.module';\nexport * from './services/environment.service';\nexport * from './services/id.service';\nexport * from './services/web/schema.service';\n\nexport * from './validators/cnpj.validator';\nexport * from './validators/cpf.validator';\nexport * from './validators/cpf-cnpj.validator';\nexport * from './validators/url.validator';\nexport * from './validators/password.validator';\n\nexport * from './interfaces/index-params';\nexport * from './interfaces/paginated-result';\nexport * from './interfaces/view';"],"mappings":"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"}