@nexterajs/ui 0.0.2 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +279 -34
- package/fesm2022/nexterajs-ui-charts.mjs +1096 -0
- package/fesm2022/nexterajs-ui-charts.mjs.map +1 -0
- package/fesm2022/nexterajs-ui-core.mjs +652 -12
- package/fesm2022/nexterajs-ui-core.mjs.map +1 -1
- package/fesm2022/nexterajs-ui-display.mjs +1142 -0
- package/fesm2022/nexterajs-ui-display.mjs.map +1 -0
- package/fesm2022/nexterajs-ui-dropdowns.mjs +321 -33
- package/fesm2022/nexterajs-ui-dropdowns.mjs.map +1 -1
- package/fesm2022/nexterajs-ui-file-uploader.mjs +572 -10
- package/fesm2022/nexterajs-ui-file-uploader.mjs.map +1 -1
- package/fesm2022/nexterajs-ui-forms.mjs +2027 -136
- package/fesm2022/nexterajs-ui-forms.mjs.map +1 -1
- package/fesm2022/nexterajs-ui-grid.mjs +1222 -188
- package/fesm2022/nexterajs-ui-grid.mjs.map +1 -1
- package/fesm2022/nexterajs-ui-intl.mjs +103 -11
- package/fesm2022/nexterajs-ui-intl.mjs.map +1 -1
- package/fesm2022/nexterajs-ui-navigation.mjs +1054 -0
- package/fesm2022/nexterajs-ui-navigation.mjs.map +1 -0
- package/fesm2022/nexterajs-ui-notify.mjs +46 -44
- package/fesm2022/nexterajs-ui-notify.mjs.map +1 -1
- package/fesm2022/nexterajs-ui-overlay.mjs +1671 -0
- package/fesm2022/nexterajs-ui-overlay.mjs.map +1 -0
- package/fesm2022/nexterajs-ui-pivot.mjs +51 -26
- package/fesm2022/nexterajs-ui-pivot.mjs.map +1 -1
- package/fesm2022/nexterajs-ui-shell.mjs +542 -0
- package/fesm2022/nexterajs-ui-shell.mjs.map +1 -0
- package/fesm2022/nexterajs-ui-tree-view.mjs +5 -2
- package/fesm2022/nexterajs-ui-tree-view.mjs.map +1 -1
- package/fesm2022/nexterajs-ui-validation.mjs +42 -11
- package/fesm2022/nexterajs-ui-validation.mjs.map +1 -1
- package/fesm2022/nexterajs-ui.mjs +5 -0
- package/fesm2022/nexterajs-ui.mjs.map +1 -1
- package/package.json +33 -2
- package/styles/_dropdown.scss +5 -5
- package/styles/_editor.scss +52 -17
- package/styles/_mixins.scss +1 -1
- package/styles/_scrollbar.scss +5 -5
- package/styles/_status.scss +21 -0
- package/styles/_toast.scss +14 -14
- package/styles/_tokens.scss +420 -3
- package/styles/_widget.scss +14 -3
- package/styles/index.scss +6 -4
- package/types/nexterajs-ui-charts.d.ts +446 -0
- package/types/nexterajs-ui-core.d.ts +387 -22
- package/types/nexterajs-ui-display.d.ts +720 -0
- package/types/nexterajs-ui-dropdowns.d.ts +191 -48
- package/types/nexterajs-ui-file-uploader.d.ts +236 -7
- package/types/nexterajs-ui-forms.d.ts +675 -30
- package/types/nexterajs-ui-grid.d.ts +448 -93
- package/types/nexterajs-ui-intl.d.ts +39 -4
- package/types/nexterajs-ui-navigation.d.ts +531 -0
- package/types/nexterajs-ui-notify.d.ts +4 -2
- package/types/nexterajs-ui-overlay.d.ts +703 -0
- package/types/nexterajs-ui-pivot.d.ts +56 -48
- package/types/nexterajs-ui-shell.d.ts +294 -0
- package/types/nexterajs-ui-tree-view.d.ts +6 -3
- package/types/nexterajs-ui-validation.d.ts +20 -11
- package/types/nexterajs-ui.d.ts +5 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nexterajs-ui-validation.mjs","sources":["../../../projects/nextera-ui/validation/src/lib/validation/nxe-validation-rule.component.ts","../../../projects/nextera-ui/validation/src/lib/validation/nxe-validator.component.ts","../../../projects/nextera-ui/validation/src/lib/validation/nxe-validators.ts","../../../projects/nextera-ui/validation/src/lib/validation/nxe-validation-group.component.ts","../../../projects/nextera-ui/validation/src/public-api.ts","../../../projects/nextera-ui/validation/src/nexterajs-ui-validation.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, computed, input, ViewEncapsulation } from '@angular/core';\r\n\r\n/** DevExtreme validation rule type (the codebase uses `required`, `compare`, and `range`). */\r\nexport type NxeValidationRuleType = 'required' | 'compare' | 'custom' | 'pattern' | 'email' | 'range';\r\n\r\n/**\r\n * The message shown when a rule fails and the caller gave none.\r\n *\r\n * These are DevExtreme's own defaults, verbatim from its `validation-*` message keys. Without\r\n * them a rule with no `message` blocks its group and displays nothing at all, because every\r\n * editor renders its error bubble under `@if (validationError())` — falsy for the empty string.\r\n */\r\nexport const NXE_DEFAULT_VALIDATION_MESSAGES: Readonly<Record<NxeValidationRuleType, string>> = {\r\n required: 'Required',\r\n email: 'Email is invalid',\r\n pattern: 'Value does not match pattern',\r\n range: 'Value is out of range',\r\n compare: 'Values do not match',\r\n custom: 'Value is invalid',\r\n};\r\n\r\n/** Payload passed to a `custom` rule's `validationCallback` (mirrors DevExtreme). */\r\nexport interface NxeCustomRuleData {\r\n value: unknown;\r\n /** Absent when the rule came from `[validationRules]` rather than a projected element. */\r\n rule?: NxeValidationRuleComponent;\r\n}\r\n\r\n/**\r\n * A rule as plain data.\r\n *\r\n * The projected `<nxe-validation-rule>` and the `[validationRules]` array are two ways of saying\r\n * the same thing, so they evaluate through one function rather than two implementations that\r\n * could drift.\r\n */\r\nexport interface NxeRuleSpec {\r\n type: NxeValidationRuleType;\r\n message?: string;\r\n comparisonTarget?: () => unknown;\r\n comparisonType?: '==' | '===' | '!=' | '!==' | '>' | '<' | '>=' | '<=';\r\n validationCallback?: (data: NxeCustomRuleData) => boolean;\r\n pattern?: string | RegExp;\r\n min?: number;\r\n max?: number;\r\n}\r\n\r\n/** DevExtreme RequiredRule semantics: null/undefined/''/false are \"not specified\". */\r\nexport function nxeIsEmptyValue(value: unknown): boolean {\r\n return (\r\n value === null ||\r\n value === undefined ||\r\n value === '' ||\r\n value === false ||\r\n (Array.isArray(value) && value.length === 0)\r\n );\r\n}\r\n\r\n/** The message for a rule with none of its own. */\r\nexport function nxeDefaultMessage(type: NxeValidationRuleType): string {\r\n return NXE_DEFAULT_VALIDATION_MESSAGES[type] ?? '';\r\n}\r\n\r\n/** Whether `value` satisfies `spec`. The single evaluator behind both rule forms. */\r\nexport function nxeEvaluateRule(spec: NxeRuleSpec, value: unknown, rule?: NxeValidationRuleComponent): boolean {\r\n switch (spec.type) {\r\n case 'required':\r\n return !nxeIsEmptyValue(value);\r\n case 'compare': {\r\n const target = spec.comparisonTarget?.();\r\n switch (spec.comparisonType) {\r\n case '===':\r\n return value === target;\r\n case '!=':\r\n // eslint-disable-next-line eqeqeq\r\n return value != target;\r\n case '!==':\r\n return value !== target;\r\n case '>':\r\n return (value as number) > (target as number);\r\n case '<':\r\n return (value as number) < (target as number);\r\n case '>=':\r\n return (value as number) >= (target as number);\r\n case '<=':\r\n return (value as number) <= (target as number);\r\n case '==':\r\n default:\r\n // eslint-disable-next-line eqeqeq\r\n return value == target;\r\n }\r\n }\r\n case 'range': {\r\n if (nxeIsEmptyValue(value)) {\r\n return true;\r\n }\r\n const num = Number(value);\r\n if (Number.isNaN(num)) {\r\n return false;\r\n }\r\n return (\r\n (spec.min === undefined || num >= spec.min) &&\r\n (spec.max === undefined || num <= spec.max)\r\n );\r\n }\r\n case 'pattern': {\r\n if (nxeIsEmptyValue(value) || !spec.pattern) {\r\n return true;\r\n }\r\n const regex = typeof spec.pattern === 'string' ? new RegExp(spec.pattern) : spec.pattern;\r\n return regex.test(String(value));\r\n }\r\n case 'email':\r\n return nxeIsEmptyValue(value) || /^[^@\\s]+@[^@\\s]+\\.[^@\\s]+$/.test(String(value));\r\n case 'custom':\r\n return spec.validationCallback?.({ value, rule }) ?? true;\r\n default:\r\n return true;\r\n }\r\n}\r\n\r\n/**\r\n * `nxe-validation-rule` — drop-in for DevExtreme `dxi-validation-rule`.\r\n *\r\n * A no-template configuration child of `nxe-validator`. The codebase uses the universal element\r\n * with a `type` attribute (overwhelmingly `type=\"required\"`), so a single component with a\r\n * `type` input covers 100% of usage.\r\n */\r\n@Component({\r\n selector: 'nxe-validation-rule',\r\n standalone: true,\r\n template: '',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class NxeValidationRuleComponent {\r\n readonly type = input<NxeValidationRuleType>('required');\r\n readonly message = input<string>('');\r\n\r\n /** `compare` rule: returns the value to compare against. Mirrors `comparisonTarget`. */\r\n readonly comparisonTarget = input<(() => unknown) | undefined>(undefined);\r\n /** `compare` rule comparison operator (default `==`). */\r\n readonly comparisonType = input<'==' | '===' | '!=' | '!==' | '>' | '<' | '>=' | '<='>('==');\r\n\r\n /** `custom` rule: returns true when valid. Mirrors `validationCallback`. */\r\n readonly validationCallback = input<((data: NxeCustomRuleData) => boolean) | undefined>(undefined);\r\n\r\n /** `pattern` rule. */\r\n readonly pattern = input<string | RegExp | undefined>(undefined);\r\n\r\n /** `range` rule bounds (DevExtreme RangeRule: empty values pass, bounds are inclusive). */\r\n readonly min = input<number | undefined>(undefined);\r\n readonly max = input<number | undefined>(undefined);\r\n\r\n /**\r\n * The message to show when this rule fails: the caller's, or DevExtreme's default for the\r\n * rule type. Whitespace counts as absent — a message of spaces is still an empty bubble.\r\n */\r\n readonly resolvedMessage = computed(\r\n () => this.message().trim() || NXE_DEFAULT_VALIDATION_MESSAGES[this.type()] || '',\r\n );\r\n\r\n /** This rule as plain data, so both rule forms evaluate through one function. */\r\n toSpec(): NxeRuleSpec {\r\n return {\r\n type: this.type(),\r\n message: this.message(),\r\n comparisonTarget: this.comparisonTarget(),\r\n comparisonType: this.comparisonType(),\r\n validationCallback: this.validationCallback(),\r\n pattern: this.pattern(),\r\n min: this.min(),\r\n max: this.max(),\r\n };\r\n }\r\n\r\n /** Whether `value` satisfies this rule. */\r\n evaluate(value: unknown): boolean {\r\n return nxeEvaluateRule(this.toSpec(), value, this);\r\n }\r\n}\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n contentChildren,\r\n DestroyRef,\r\n inject,\r\n Injector,\r\n input,\r\n output,\r\n signal,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';\r\nimport { distinctUntilChanged, pairwise, skip, startWith } from 'rxjs';\r\nimport { NxeValidationGroupRegistry } from '@nexterajs/ui/core';\r\nimport {\r\n NXE_VALIDATION_GROUP,\r\n NXE_VALIDATION_TARGET,\r\n NxeBrokenRule,\r\n NxeValidatedEvent,\r\n NxeValidationResult,\r\n} from '@nexterajs/ui/core';\r\nimport {\r\n nxeDefaultMessage,\r\n nxeEvaluateRule,\r\n NxeRuleSpec,\r\n NxeValidationRuleComponent,\r\n} from './nxe-validation-rule.component';\r\n\r\n/**\r\n * `nxe-validator` — drop-in for DevExtreme `dx-validator`.\r\n *\r\n * Placed inside an editor (`<nxe-text-box><nxe-validator><nxe-validation-rule .../></nxe-validator></nxe-text-box>`),\r\n * it adapts the editor via {@link NXE_VALIDATION_TARGET}, collects its rules, and registers into\r\n * the {@link NxeValidationGroupRegistry} under the editor's `validationGroup`.\r\n *\r\n * Validation is on demand, as in DevExtreme — `validate()` is invoked by\r\n * `nxe-button[validationGroup]` or directly. With one exception, which is also dx's: once a\r\n * validator HAS been validated, it re-validates as the value changes, so a field that has gone\r\n * red clears itself as the user fixes it rather than staying red until the next submit.\r\n */\r\n@Component({\r\n selector: 'nxe-validator',\r\n standalone: true,\r\n template: '<ng-content />',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class NxeValidatorComponent {\r\n private readonly target = inject(NXE_VALIDATION_TARGET, { optional: true });\r\n private readonly registry = inject(NxeValidationGroupRegistry);\r\n private readonly groupScope = inject(NXE_VALIDATION_GROUP, { optional: true });\r\n\r\n readonly rules = contentChildren(NxeValidationRuleComponent);\r\n\r\n /**\r\n * dx `validationRules` — rules as data instead of projected children. Both forms combine;\r\n * projected children come first, matching declaration order.\r\n */\r\n readonly validationRules = input<readonly NxeRuleSpec[] | undefined>(undefined);\r\n\r\n /** Explicit group; otherwise inherited from the wrapped editor's `validationGroup`. */\r\n readonly validationGroupInput = input<string | undefined>(undefined, { alias: 'validationGroup' });\r\n\r\n /** dx `onValidated`, fired on every validation, valid or not. */\r\n readonly onValidated = output<NxeValidatedEvent>();\r\n\r\n // An explicit name wins over a surrounding `nxe-validation-group`, as in dx. Bare validators\r\n // with neither join the implicit default group `''` — dx's global group — so a groupless\r\n // `nxe-button` validates them.\r\n private readonly group = computed(\r\n () =>\r\n this.validationGroupInput() ??\r\n this.target?.validationGroup() ??\r\n this.groupScope?.groupKey ??\r\n '',\r\n );\r\n\r\n /** Last validation outcome (false once a rule has failed, until re-validated). */\r\n readonly isValid = signal(true);\r\n\r\n /** Every rule broken by the last validation, in declaration order. */\r\n readonly brokenRules = signal<readonly NxeBrokenRule[]>([]);\r\n\r\n /** Whether `validate()` has ever run — the gate on live re-validation. */\r\n private readonly validated = signal(false);\r\n\r\n /** DevExtreme parity: existing code calls `validator.instance.validate()` via `@ViewChild`. */\r\n get instance(): NxeValidatorComponent {\r\n return this;\r\n }\r\n\r\n private readonly member = { validate: () => this.validate(), reset: () => this.reset() };\r\n\r\n /** Projected children plus `[validationRules]`, as one evaluable list. */\r\n private readonly allRules = computed(() => [\r\n ...this.rules().map((rule) => ({\r\n type: rule.type(),\r\n evaluate: (value: unknown) => rule.evaluate(value),\r\n message: () => rule.resolvedMessage(),\r\n })),\r\n ...(this.validationRules() ?? []).map((spec) => ({\r\n type: spec.type,\r\n evaluate: (value: unknown) => nxeEvaluateRule(spec, value),\r\n message: () => spec.message?.trim() || nxeDefaultMessage(spec.type),\r\n })),\r\n ]);\r\n\r\n constructor() {\r\n const injector = inject(Injector);\r\n\r\n // Register/unregister into the named group reactively (handles dynamic group changes).\r\n /* ⚠ NOT an effect - UI-48. The registration follows ONE signal, and the unregister that\r\n `onCleanup` used to run is the pairwise step below: a group change unregisters the old\r\n one before registering the new, and destruction unregisters the last. */\r\n toObservable(this.group, { injector })\r\n .pipe(\r\n distinctUntilChanged(),\r\n startWith(undefined as string | undefined),\r\n pairwise(),\r\n takeUntilDestroyed(),\r\n )\r\n .subscribe(([previous, group]) => {\r\n if (previous !== undefined) {\r\n this.registry.unregister(previous, this.member);\r\n }\r\n\r\n this.registry.register(group, this.member);\r\n });\r\n\r\n // dx re-validates a field that has already been validated as its value changes, so an\r\n // error clears while the user types rather than surviving until the next submit.\r\n /* ⚠ NOT an effect - UI-48. This takes exactly one dependency, the target's value, named\r\n here rather than inferred from whatever `validate()` happens to read. */\r\n toObservable(\r\n computed(() => this.target?.getValue()),\r\n { injector },\r\n )\r\n .pipe(skip(1), takeUntilDestroyed())\r\n .subscribe(() => {\r\n if (this.validated()) {\r\n this.validate();\r\n }\r\n });\r\n\r\n // Tell the editor whether it is required, so it can render aria-required. The rule is\r\n // where the requirement is stated; the editor should not have to be told twice.\r\n /* ⚠ NOT an effect - UI-48: one named dependency, the resolved rule list. */\r\n toObservable(\r\n computed(() => this.allRules().some((rule) => rule.type === 'required')),\r\n { injector },\r\n )\r\n .pipe(takeUntilDestroyed())\r\n .subscribe((required) => this.target?.setRequired?.(required));\r\n\r\n inject(DestroyRef).onDestroy(() => {\r\n this.registry.unregister(this.group(), this.member);\r\n // The editor outlives its validator when the validator sits inside an @if, and a\r\n // field left advertising aria-required by a rule that no longer exists is worse than\r\n // one that never advertised it.\r\n this.target?.setRequired?.(false);\r\n this.target?.setValidationError(null);\r\n });\r\n }\r\n\r\n\r\n /**\r\n * Run every rule against the editor's current value.\r\n *\r\n * dx reports ALL broken rules, not just the first — a `brokenRules` array with at most one\r\n * entry cannot tell a caller whether a field failed once or three times. The editor's bubble\r\n * still shows the first message, which is what dx renders.\r\n */\r\n validate(): NxeValidationResult {\r\n const value = this.target?.getValue();\r\n const broken: NxeBrokenRule[] = [];\r\n for (const rule of this.allRules()) {\r\n if (!rule.evaluate(value)) {\r\n // resolvedMessage(), not message(): a rule declared without one would otherwise\r\n // push the empty string, and every editor guards its bubble with\r\n // `@if (validationError())` — so the field would block the group in silence.\r\n broken.push({ type: rule.type, message: rule.message() });\r\n }\r\n }\r\n this.validated.set(true);\r\n this.brokenRules.set(broken);\r\n this.isValid.set(broken.length === 0);\r\n this.target?.setValidationError(broken.length ? broken[0].message : null);\r\n\r\n const result: NxeValidationResult = {\r\n isValid: broken.length === 0,\r\n brokenRules: broken,\r\n status: broken.length === 0 ? 'valid' : 'invalid',\r\n };\r\n this.onValidated.emit({ ...result, value, validationGroup: this.group() });\r\n return result;\r\n }\r\n\r\n /**\r\n * Clear the error state without validating (dx `reset()`).\r\n *\r\n * Also clears `validated`, so the field goes back to staying quiet until it is validated\r\n * again — otherwise a reset field would light up on the next keystroke.\r\n */\r\n reset(): void {\r\n this.validated.set(false);\r\n this.brokenRules.set([]);\r\n this.isValid.set(true);\r\n this.target?.setValidationError(null);\r\n }\r\n}\r\n","import { AbstractControl, ValidationErrors, ValidatorFn } from '@angular/forms';\r\n\r\nexport class NxeValidators {\r\n /**\r\n * Check for empty (optional fields) values\r\n *\r\n * @param value\r\n */\r\n static isEmptyInputValue(value: any): boolean {\r\n return value == null || value.length === 0;\r\n }\r\n\r\n /**\r\n * Must match validator\r\n *\r\n * @param controlPath A dot-delimited string values that define the path to the control.\r\n * @param matchingControlPath A dot-delimited string values that define the path to the matching control.\r\n */\r\n static mustMatch(controlPath: string, matchingControlPath: string): ValidatorFn {\r\n return (formGroup: AbstractControl): ValidationErrors | null => {\r\n // Get the control and matching control\r\n const control = formGroup.get(controlPath);\r\n const matchingControl = formGroup.get(matchingControlPath);\r\n\r\n // Return if control or matching control doesn't exist\r\n if (!control || !matchingControl) {\r\n return null;\r\n }\r\n\r\n // Delete the mustMatch error to reset the error on the matching control\r\n if (matchingControl.hasError('mustMatch')) {\r\n delete matchingControl.errors.mustMatch;\r\n matchingControl.updateValueAndValidity();\r\n }\r\n\r\n // Don't validate empty values on the matching control\r\n // Don't validate if values are matching\r\n if (this.isEmptyInputValue(matchingControl.value) || control.value === matchingControl.value) {\r\n return null;\r\n }\r\n\r\n // Prepare the validation errors\r\n const errors = { mustMatch: true };\r\n\r\n // Set the validation error on the matching control\r\n matchingControl.setErrors(errors);\r\n\r\n // Return the errors\r\n return errors;\r\n };\r\n }\r\n}\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n inject,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport {\r\n NXE_VALIDATION_GROUP,\r\n NxeValidationGroupRegistry,\r\n NxeValidationResult,\r\n} from '@nexterajs/ui/core';\r\n\r\nlet nextGroupId = 0;\r\n\r\n/**\r\n * `nxe-validation-group` — drop-in for DevExtreme `dx-validation-group`.\r\n *\r\n * DevExtreme lets a group be addressed two ways. Either a string name is repeated on the\r\n * validator and on the button, or both are wrapped in a group element and the relationship is\r\n * structural. Only the string form existed here, which meant a form could not be validated as a\r\n * unit without inventing a name for it and keeping that name in two places.\r\n *\r\n * The key is generated, not derived from anything the application controls, so two groups on one\r\n * page cannot collide and a group can never accidentally share a name with a string group. An\r\n * explicit `validationGroup` on a descendant still wins, as in dx — the structural form is a\r\n * default, not an override.\r\n */\r\n@Component({\r\n selector: 'nxe-validation-group',\r\n standalone: true,\r\n template: '<ng-content />',\r\n providers: [\r\n {\r\n provide: NXE_VALIDATION_GROUP,\r\n useFactory: () => ({ groupKey: `nxe-group-${nextGroupId++}` }),\r\n },\r\n ],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class NxeValidationGroupComponent {\r\n private readonly registry = inject(NxeValidationGroupRegistry);\r\n private readonly scope = inject(NXE_VALIDATION_GROUP);\r\n\r\n /** The generated key descendants register under. Exposed for a caller that needs to name it. */\r\n get groupKey(): string {\r\n return this.scope.groupKey;\r\n }\r\n\r\n /** DevExtreme parity: `group.instance.validate()` / `.reset()`. */\r\n get instance(): NxeValidationGroupComponent {\r\n return this;\r\n }\r\n\r\n /** Validate every validator inside this group. */\r\n validate(): NxeValidationResult {\r\n return this.registry.validate(this.scope.groupKey);\r\n }\r\n\r\n /** Clear every validator inside this group without validating (dx `reset()`). */\r\n reset(): void {\r\n this.registry.reset(this.scope.groupKey);\r\n }\r\n}\r\n","// @nexterajs/ui/validation — public API.\r\nexport * from './lib/validation/nxe-validation-rule.component';\r\nexport * from './lib/validation/nxe-validator.component';\r\nexport * from './lib/validation/nxe-validators';\r\nexport * from './lib/validation/nxe-validation-group.component';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"nexterajs-ui-validation.mjs","sources":["../../../projects/nextera-ui/validation/src/lib/validation/nxe-validation-rule.component.ts","../../../projects/nextera-ui/validation/src/lib/validation/nxe-validator.component.ts","../../../projects/nextera-ui/validation/src/lib/validation/nxe-validators.ts","../../../projects/nextera-ui/validation/src/lib/validation/nxe-validation-group.component.ts","../../../projects/nextera-ui/validation/src/public-api.ts","../../../projects/nextera-ui/validation/src/nexterajs-ui-validation.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, computed, inject, input, ViewEncapsulation } from '@angular/core';\r\nimport { NxeMessageService } from '@nexterajs/ui/core';\r\n\r\n/** DevExtreme validation rule type (the codebase uses `required`, `compare`, and `range`). */\r\nexport type NxeValidationRuleType = 'required' | 'compare' | 'custom' | 'pattern' | 'email' | 'range';\r\n\r\n/**\r\n * The English message shown when a rule fails and the caller gave none. The components resolve it\r\n * through `NxeMessageService` (`validation.rule.*`), which starts as these same strings and\r\n * follows the active language; this table stays for code that reads it directly.\r\n *\r\n * These are DevExtreme's own defaults, verbatim from its `validation-*` message keys. Without\r\n * them a rule with no `message` blocks its group and displays nothing at all, because every\r\n * editor renders its error bubble under `@if (validationError())` — falsy for the empty string.\r\n */\r\nexport const NXE_DEFAULT_VALIDATION_MESSAGES: Readonly<Record<NxeValidationRuleType, string>> = {\r\n required: 'Required',\r\n email: 'Email is invalid',\r\n pattern: 'Value does not match pattern',\r\n range: 'Value is out of range',\r\n compare: 'Values do not match',\r\n custom: 'Value is invalid',\r\n};\r\n\r\n/** Payload passed to a `custom` rule's `validationCallback` (mirrors DevExtreme). */\r\nexport interface NxeCustomRuleData {\r\n value: unknown;\r\n /** Absent when the rule came from `[validationRules]` rather than a projected element. */\r\n rule?: NxeValidationRuleComponent;\r\n}\r\n\r\n/**\r\n * A rule as plain data.\r\n *\r\n * The projected `<nxe-validation-rule>` and the `[validationRules]` array are two ways of saying\r\n * the same thing, so they evaluate through one function rather than two implementations that\r\n * could drift.\r\n */\r\nexport interface NxeRuleSpec {\r\n type: NxeValidationRuleType;\r\n message?: string;\r\n comparisonTarget?: () => unknown;\r\n comparisonType?: '==' | '===' | '!=' | '!==' | '>' | '<' | '>=' | '<=';\r\n validationCallback?: (data: NxeCustomRuleData) => boolean;\r\n pattern?: string | RegExp;\r\n min?: number;\r\n max?: number;\r\n}\r\n\r\n/** DevExtreme RequiredRule semantics: null/undefined/''/false are \"not specified\". */\r\nexport function nxeIsEmptyValue(value: unknown): boolean {\r\n return (\r\n value === null ||\r\n value === undefined ||\r\n value === '' ||\r\n value === false ||\r\n (Array.isArray(value) && value.length === 0)\r\n );\r\n}\r\n\r\n/**\r\n * The message for a rule with none of its own: the active language's when a message service is\r\n * given, English otherwise.\r\n */\r\nexport function nxeDefaultMessage(type: NxeValidationRuleType, messages?: NxeMessageService): string {\r\n return messages && type in NXE_DEFAULT_VALIDATION_MESSAGES\r\n ? messages.t(`validation.rule.${type}`)\r\n : (NXE_DEFAULT_VALIDATION_MESSAGES[type] ?? '');\r\n}\r\n\r\n/** Whether `value` satisfies `spec`. The single evaluator behind both rule forms. */\r\nexport function nxeEvaluateRule(spec: NxeRuleSpec, value: unknown, rule?: NxeValidationRuleComponent): boolean {\r\n switch (spec.type) {\r\n case 'required':\r\n return !nxeIsEmptyValue(value);\r\n case 'compare': {\r\n const target = spec.comparisonTarget?.();\r\n switch (spec.comparisonType) {\r\n case '===':\r\n return value === target;\r\n case '!=':\r\n // eslint-disable-next-line eqeqeq\r\n return value != target;\r\n case '!==':\r\n return value !== target;\r\n case '>':\r\n return (value as number) > (target as number);\r\n case '<':\r\n return (value as number) < (target as number);\r\n case '>=':\r\n return (value as number) >= (target as number);\r\n case '<=':\r\n return (value as number) <= (target as number);\r\n case '==':\r\n default:\r\n // eslint-disable-next-line eqeqeq\r\n return value == target;\r\n }\r\n }\r\n case 'range': {\r\n if (nxeIsEmptyValue(value)) {\r\n return true;\r\n }\r\n const num = Number(value);\r\n if (Number.isNaN(num)) {\r\n return false;\r\n }\r\n return (\r\n (spec.min === undefined || num >= spec.min) &&\r\n (spec.max === undefined || num <= spec.max)\r\n );\r\n }\r\n case 'pattern': {\r\n if (nxeIsEmptyValue(value) || !spec.pattern) {\r\n return true;\r\n }\r\n const regex = typeof spec.pattern === 'string' ? new RegExp(spec.pattern) : spec.pattern;\r\n return regex.test(String(value));\r\n }\r\n case 'email':\r\n return nxeIsEmptyValue(value) || /^[^@\\s]+@[^@\\s]+\\.[^@\\s]+$/.test(String(value));\r\n case 'custom':\r\n return spec.validationCallback?.({ value, rule }) ?? true;\r\n default:\r\n return true;\r\n }\r\n}\r\n\r\n/**\r\n * `nxe-validation-rule` — drop-in for DevExtreme `dxi-validation-rule`.\r\n *\r\n * A no-template configuration child of `nxe-validator`. The codebase uses the universal element\r\n * with a `type` attribute (overwhelmingly `type=\"required\"`), so a single component with a\r\n * `type` input covers 100% of usage.\r\n */\r\n@Component({\r\n selector: 'nxe-validation-rule',\r\n standalone: true,\r\n template: '',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class NxeValidationRuleComponent {\r\n private readonly messages = inject(NxeMessageService);\r\n\r\n readonly type = input<NxeValidationRuleType>('required');\r\n readonly message = input<string>('');\r\n\r\n /** `compare` rule: returns the value to compare against. Mirrors `comparisonTarget`. */\r\n readonly comparisonTarget = input<(() => unknown) | undefined>(undefined);\r\n /** `compare` rule comparison operator (default `==`). */\r\n readonly comparisonType = input<'==' | '===' | '!=' | '!==' | '>' | '<' | '>=' | '<='>('==');\r\n\r\n /** `custom` rule: returns true when valid. Mirrors `validationCallback`. */\r\n readonly validationCallback = input<((data: NxeCustomRuleData) => boolean) | undefined>(undefined);\r\n\r\n /** `pattern` rule. */\r\n readonly pattern = input<string | RegExp | undefined>(undefined);\r\n\r\n /** `range` rule bounds (DevExtreme RangeRule: empty values pass, bounds are inclusive). */\r\n readonly min = input<number | undefined>(undefined);\r\n readonly max = input<number | undefined>(undefined);\r\n\r\n /**\r\n * The message to show when this rule fails: the caller's, or DevExtreme's default for the\r\n * rule type. Whitespace counts as absent — a message of spaces is still an empty bubble.\r\n */\r\n readonly resolvedMessage = computed(\r\n () => this.message().trim() || nxeDefaultMessage(this.type(), this.messages),\r\n );\r\n\r\n /** This rule as plain data, so both rule forms evaluate through one function. */\r\n toSpec(): NxeRuleSpec {\r\n return {\r\n type: this.type(),\r\n message: this.message(),\r\n comparisonTarget: this.comparisonTarget(),\r\n comparisonType: this.comparisonType(),\r\n validationCallback: this.validationCallback(),\r\n pattern: this.pattern(),\r\n min: this.min(),\r\n max: this.max(),\r\n };\r\n }\r\n\r\n /** Whether `value` satisfies this rule. */\r\n evaluate(value: unknown): boolean {\r\n return nxeEvaluateRule(this.toSpec(), value, this);\r\n }\r\n}\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n contentChildren,\r\n DestroyRef,\r\n inject,\r\n Injector,\r\n input,\r\n output,\r\n signal,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';\r\nimport { distinctUntilChanged, pairwise, skip, startWith } from 'rxjs';\r\nimport { NxeMessageService, NxeValidationGroupRegistry } from '@nexterajs/ui/core';\r\nimport {\r\n NXE_VALIDATION_GROUP,\r\n NXE_VALIDATION_TARGET,\r\n NxeBrokenRule,\r\n NxeValidatedEvent,\r\n NxeValidationResult,\r\n} from '@nexterajs/ui/core';\r\nimport {\r\n nxeDefaultMessage,\r\n nxeEvaluateRule,\r\n NxeRuleSpec,\r\n NxeValidationRuleComponent,\r\n} from './nxe-validation-rule.component';\r\n\r\n/**\r\n * `nxe-validator` — drop-in for DevExtreme `dx-validator`.\r\n *\r\n * Placed inside an editor (`<nxe-text-box><nxe-validator><nxe-validation-rule .../></nxe-validator></nxe-text-box>`),\r\n * it adapts the editor via {@link NXE_VALIDATION_TARGET}, collects its rules, and registers into\r\n * the {@link NxeValidationGroupRegistry} under the editor's `validationGroup`.\r\n *\r\n * Validation is on demand, as in DevExtreme — `validate()` is invoked by\r\n * `nxe-button[validationGroup]` or directly. With one exception, which is also dx's: once a\r\n * validator HAS been validated, it re-validates as the value changes, so a field that has gone\r\n * red clears itself as the user fixes it rather than staying red until the next submit.\r\n */\r\n@Component({\r\n selector: 'nxe-validator',\r\n standalone: true,\r\n template: '<ng-content />',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class NxeValidatorComponent {\r\n private readonly target = inject(NXE_VALIDATION_TARGET, { optional: true });\r\n private readonly registry = inject(NxeValidationGroupRegistry);\r\n private readonly messages = inject(NxeMessageService);\r\n private readonly groupScope = inject(NXE_VALIDATION_GROUP, { optional: true });\r\n\r\n readonly rules = contentChildren(NxeValidationRuleComponent);\r\n\r\n /**\r\n * dx `validationRules` — rules as data instead of projected children. Both forms combine;\r\n * projected children come first, matching declaration order.\r\n */\r\n readonly validationRules = input<readonly NxeRuleSpec[] | undefined>(undefined);\r\n\r\n /** Explicit group; otherwise inherited from the wrapped editor's `validationGroup`. */\r\n readonly validationGroupInput = input<string | undefined>(undefined, { alias: 'validationGroup' });\r\n\r\n /** dx `onValidated`, fired on every validation, valid or not. */\r\n readonly onValidated = output<NxeValidatedEvent>();\r\n\r\n // An explicit name wins over a surrounding `nxe-validation-group`, as in dx. Bare validators\r\n // with neither join the implicit default group `''` — dx's global group — so a groupless\r\n // `nxe-button` validates them.\r\n private readonly group = computed(\r\n () =>\r\n this.validationGroupInput() ??\r\n this.target?.validationGroup() ??\r\n this.groupScope?.groupKey ??\r\n '',\r\n );\r\n\r\n /** Last validation outcome (false once a rule has failed, until re-validated). */\r\n readonly isValid = signal(true);\r\n\r\n /** Every rule broken by the last validation, in declaration order. */\r\n readonly brokenRules = signal<readonly NxeBrokenRule[]>([]);\r\n\r\n /** Whether `validate()` has ever run — the gate on live re-validation. */\r\n private readonly validated = signal(false);\r\n\r\n /** DevExtreme parity: existing code calls `validator.instance.validate()` via `@ViewChild`. */\r\n get instance(): NxeValidatorComponent {\r\n return this;\r\n }\r\n\r\n private readonly member = { validate: () => this.validate(), reset: () => this.reset() };\r\n\r\n /** Projected children plus `[validationRules]`, as one evaluable list. */\r\n private readonly allRules = computed(() => [\r\n ...this.rules().map((rule) => ({\r\n type: rule.type(),\r\n evaluate: (value: unknown) => rule.evaluate(value),\r\n message: () => rule.resolvedMessage(),\r\n })),\r\n ...(this.validationRules() ?? []).map((spec) => ({\r\n type: spec.type,\r\n evaluate: (value: unknown) => nxeEvaluateRule(spec, value),\r\n message: () => spec.message?.trim() || nxeDefaultMessage(spec.type, this.messages),\r\n })),\r\n ]);\r\n\r\n constructor() {\r\n const injector = inject(Injector);\r\n\r\n // Register/unregister into the named group reactively (handles dynamic group changes).\r\n /* ⚠ NOT an effect - UI-48. The registration follows ONE signal, and the unregister that\r\n `onCleanup` used to run is the pairwise step below: a group change unregisters the old\r\n one before registering the new, and destruction unregisters the last. */\r\n toObservable(this.group, { injector })\r\n .pipe(\r\n distinctUntilChanged(),\r\n startWith(undefined as string | undefined),\r\n pairwise(),\r\n takeUntilDestroyed(),\r\n )\r\n .subscribe(([previous, group]) => {\r\n if (previous !== undefined) {\r\n this.registry.unregister(previous, this.member);\r\n }\r\n\r\n if (group !== undefined) {\n this.registry.register(group, this.member);\n }\r\n });\r\n\r\n // dx re-validates a field that has already been validated as its value changes, so an\r\n // error clears while the user types rather than surviving until the next submit.\r\n /* ⚠ NOT an effect - UI-48. This takes exactly one dependency, the target's value, named\r\n here rather than inferred from whatever `validate()` happens to read. */\r\n toObservable(\r\n computed(() => this.target?.getValue()),\r\n { injector },\r\n )\r\n .pipe(skip(1), takeUntilDestroyed())\r\n .subscribe(() => {\r\n if (this.validated()) {\r\n this.validate();\r\n }\r\n });\r\n\r\n // A bubble that is already showing is a string the editor holds, so it would keep the old\r\n // language after a switch: rewrite it when the bundle changes.\r\n /* NOT an effect: one named dependency, the active bundle. */\r\n toObservable(this.messages.messages, { injector })\r\n .pipe(skip(1), takeUntilDestroyed())\r\n .subscribe(() => this.refreshMessages());\r\n\r\n // Tell the editor whether it is required, so it can render aria-required. The rule is\r\n // where the requirement is stated; the editor should not have to be told twice.\r\n /* ⚠ NOT an effect - UI-48: one named dependency, the resolved rule list. */\r\n toObservable(\r\n computed(() => this.allRules().some((rule) => rule.type === 'required')),\r\n { injector },\r\n )\r\n .pipe(takeUntilDestroyed())\r\n .subscribe((required) => this.target?.setRequired?.(required));\r\n\r\n inject(DestroyRef).onDestroy(() => {\r\n this.registry.unregister(this.group(), this.member);\r\n // The editor outlives its validator when the validator sits inside an @if, and a\r\n // field left advertising aria-required by a rule that no longer exists is worse than\r\n // one that never advertised it.\r\n this.target?.setRequired?.(false);\r\n this.target?.setValidationError(null);\r\n });\r\n }\r\n\r\n\r\n /** Re-word the broken rules after a language switch, without validating again or emitting. */\r\n private refreshMessages(): void {\r\n if (!this.validated() || this.isValid()) {\r\n return;\r\n }\r\n const value = this.target?.getValue();\r\n const broken = this.allRules()\r\n .filter((rule) => !rule.evaluate(value))\r\n .map((rule) => ({ type: rule.type, message: rule.message() }));\r\n if (broken.length) {\r\n this.brokenRules.set(broken);\r\n this.target?.setValidationError(broken[0].message);\r\n }\r\n }\r\n\r\n /**\r\n * Run every rule against the editor's current value.\r\n *\r\n * dx reports ALL broken rules, not just the first — a `brokenRules` array with at most one\r\n * entry cannot tell a caller whether a field failed once or three times. The editor's bubble\r\n * still shows the first message, which is what dx renders.\r\n */\r\n validate(): NxeValidationResult {\r\n const value = this.target?.getValue();\r\n const broken: NxeBrokenRule[] = [];\r\n for (const rule of this.allRules()) {\r\n if (!rule.evaluate(value)) {\r\n // resolvedMessage(), not message(): a rule declared without one would otherwise\r\n // push the empty string, and every editor guards its bubble with\r\n // `@if (validationError())` — so the field would block the group in silence.\r\n broken.push({ type: rule.type, message: rule.message() });\r\n }\r\n }\r\n this.validated.set(true);\r\n this.brokenRules.set(broken);\r\n this.isValid.set(broken.length === 0);\r\n this.target?.setValidationError(broken.length ? broken[0].message : null);\r\n\r\n const result: NxeValidationResult = {\r\n isValid: broken.length === 0,\r\n brokenRules: broken,\r\n status: broken.length === 0 ? 'valid' : 'invalid',\r\n };\r\n this.onValidated.emit({ ...result, value, validationGroup: this.group() });\r\n return result;\r\n }\r\n\r\n /**\r\n * Clear the error state without validating (dx `reset()`).\r\n *\r\n * Also clears `validated`, so the field goes back to staying quiet until it is validated\r\n * again — otherwise a reset field would light up on the next keystroke.\r\n */\r\n reset(): void {\r\n this.validated.set(false);\r\n this.brokenRules.set([]);\r\n this.isValid.set(true);\r\n this.target?.setValidationError(null);\r\n }\r\n}\r\n","import { AbstractControl, ValidationErrors, ValidatorFn } from '@angular/forms';\n\nexport class NxeValidators {\n /**\n * Check for empty (optional fields) values\n *\n * @param value\n */\n static isEmptyInputValue(value: any): boolean {\n return value == null || value.length === 0;\n }\n\n /**\n * Must match validator\n *\n * @param controlPath A dot-delimited string values that define the path to the control.\n * @param matchingControlPath A dot-delimited string values that define the path to the matching control.\n */\n static mustMatch(controlPath: string, matchingControlPath: string): ValidatorFn {\n return (formGroup: AbstractControl): ValidationErrors | null => {\n // Get the control and matching control\n const control = formGroup.get(controlPath);\n const matchingControl = formGroup.get(matchingControlPath);\n\n // Return if control or matching control doesn't exist\n if (!control || !matchingControl) {\n return null;\n }\n\n // Delete the mustMatch error to reset the error on the matching control\n if (matchingControl.errors?.['mustMatch']) {\n delete matchingControl.errors['mustMatch'];\n matchingControl.updateValueAndValidity();\n }\n\n // Don't validate empty values on the matching control\n // Don't validate if values are matching\n if (this.isEmptyInputValue(matchingControl.value) || control.value === matchingControl.value) {\n return null;\n }\n\n // Prepare the validation errors\n const errors = { mustMatch: true };\n\n // Set the validation error on the matching control\n matchingControl.setErrors(errors);\n\n // Return the errors\n return errors;\n };\n }\n}\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n inject,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport {\r\n NXE_VALIDATION_GROUP,\r\n NxeValidationGroupRegistry,\r\n NxeValidationResult,\r\n} from '@nexterajs/ui/core';\r\n\r\nlet nextGroupId = 0;\r\n\r\n/**\r\n * `nxe-validation-group` — drop-in for DevExtreme `dx-validation-group`.\r\n *\r\n * DevExtreme lets a group be addressed two ways. Either a string name is repeated on the\r\n * validator and on the button, or both are wrapped in a group element and the relationship is\r\n * structural. Only the string form existed here, which meant a form could not be validated as a\r\n * unit without inventing a name for it and keeping that name in two places.\r\n *\r\n * The key is generated, not derived from anything the application controls, so two groups on one\r\n * page cannot collide and a group can never accidentally share a name with a string group. An\r\n * explicit `validationGroup` on a descendant still wins, as in dx — the structural form is a\r\n * default, not an override.\r\n */\r\n@Component({\r\n selector: 'nxe-validation-group',\r\n standalone: true,\r\n template: '<ng-content />',\r\n providers: [\r\n {\r\n provide: NXE_VALIDATION_GROUP,\r\n useFactory: () => ({ groupKey: `nxe-group-${nextGroupId++}` }),\r\n },\r\n ],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class NxeValidationGroupComponent {\r\n private readonly registry = inject(NxeValidationGroupRegistry);\r\n private readonly scope = inject(NXE_VALIDATION_GROUP);\r\n\r\n /** The generated key descendants register under. Exposed for a caller that needs to name it. */\r\n get groupKey(): string {\r\n return this.scope.groupKey;\r\n }\r\n\r\n /** DevExtreme parity: `group.instance.validate()` / `.reset()`. */\r\n get instance(): NxeValidationGroupComponent {\r\n return this;\r\n }\r\n\r\n /** Validate every validator inside this group. */\r\n validate(): NxeValidationResult {\r\n return this.registry.validate(this.scope.groupKey);\r\n }\r\n\r\n /** Clear every validator inside this group without validating (dx `reset()`). */\r\n reset(): void {\r\n this.registry.reset(this.scope.groupKey);\r\n }\r\n}\r\n","// @nexterajs/ui/validation — public API.\r\nexport * from './lib/validation/nxe-validation-rule.component';\r\nexport * from './lib/validation/nxe-validator.component';\r\nexport * from './lib/validation/nxe-validators';\r\nexport * from './lib/validation/nxe-validation-group.component';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +1,18 @@
|
|
|
1
1
|
export * from '@nexterajs/ui/animations';
|
|
2
|
+
export * from '@nexterajs/ui/charts';
|
|
2
3
|
export * from '@nexterajs/ui/core';
|
|
4
|
+
export * from '@nexterajs/ui/display';
|
|
3
5
|
export * from '@nexterajs/ui/dropdowns';
|
|
4
6
|
export * from '@nexterajs/ui/excel';
|
|
5
7
|
export * from '@nexterajs/ui/file-uploader';
|
|
6
8
|
export * from '@nexterajs/ui/forms';
|
|
7
9
|
export * from '@nexterajs/ui/grid';
|
|
8
10
|
export * from '@nexterajs/ui/intl';
|
|
11
|
+
export * from '@nexterajs/ui/navigation';
|
|
9
12
|
export * from '@nexterajs/ui/notify';
|
|
13
|
+
export * from '@nexterajs/ui/overlay';
|
|
10
14
|
export * from '@nexterajs/ui/pivot';
|
|
15
|
+
export * from '@nexterajs/ui/shell';
|
|
11
16
|
export * from '@nexterajs/ui/styling';
|
|
12
17
|
export * from '@nexterajs/ui/tree-view';
|
|
13
18
|
export * from '@nexterajs/ui/validation';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nexterajs-ui.mjs","sources":["../../../projects/nextera-ui/src/public-api.ts","../../../projects/nextera-ui/src/nexterajs-ui.ts"],"sourcesContent":["// @nexterajs/ui — compatibility barrel.\r\n//\r\n// Re-exports every secondary entry point so importing from the bare specifier keeps working.\r\n// Prefer the specific entry point (@nexterajs/ui/grid) in new code: it keeps the pivot engine\r\n// and the xlsx writer out of your bundle and out of your dev-server rebuilds.\r\nexport * from '@nexterajs/ui/animations';\r\nexport * from '@nexterajs/ui/core';\r\nexport * from '@nexterajs/ui/dropdowns';\r\nexport * from '@nexterajs/ui/excel';\r\nexport * from '@nexterajs/ui/file-uploader';\r\nexport * from '@nexterajs/ui/forms';\r\nexport * from '@nexterajs/ui/grid';\r\nexport * from '@nexterajs/ui/intl';\r\nexport * from '@nexterajs/ui/notify';\r\nexport * from '@nexterajs/ui/pivot';\r\nexport * from '@nexterajs/ui/styling';\r\nexport * from '@nexterajs/ui/tree-view';\r\nexport * from '@nexterajs/ui/validation';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"nexterajs-ui.mjs","sources":["../../../projects/nextera-ui/src/public-api.ts","../../../projects/nextera-ui/src/nexterajs-ui.ts"],"sourcesContent":["// @nexterajs/ui — compatibility barrel.\r\n//\r\n// Re-exports every secondary entry point so importing from the bare specifier keeps working.\r\n// Prefer the specific entry point (@nexterajs/ui/grid) in new code: it keeps the pivot engine\r\n// and the xlsx writer out of your bundle and out of your dev-server rebuilds.\r\nexport * from '@nexterajs/ui/animations';\r\nexport * from '@nexterajs/ui/charts';\r\nexport * from '@nexterajs/ui/core';\r\nexport * from '@nexterajs/ui/display';\r\nexport * from '@nexterajs/ui/dropdowns';\r\nexport * from '@nexterajs/ui/excel';\r\nexport * from '@nexterajs/ui/file-uploader';\r\nexport * from '@nexterajs/ui/forms';\r\nexport * from '@nexterajs/ui/grid';\r\nexport * from '@nexterajs/ui/intl';\r\nexport * from '@nexterajs/ui/navigation';\r\nexport * from '@nexterajs/ui/notify';\r\nexport * from '@nexterajs/ui/overlay';\r\nexport * from '@nexterajs/ui/pivot';\r\nexport * from '@nexterajs/ui/shell';\r\nexport * from '@nexterajs/ui/styling';\r\nexport * from '@nexterajs/ui/tree-view';\r\nexport * from '@nexterajs/ui/validation';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;AAAA;AACA;AACA;AACA;AACA;;ACJA;;AAEG"}
|
package/package.json
CHANGED
|
@@ -1,20 +1,31 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nexterajs/ui",
|
|
3
|
-
"version": "0.0
|
|
3
|
+
"version": "0.1.0",
|
|
4
4
|
"peerDependencies": {
|
|
5
5
|
"@angular/animations": "^22.0.0",
|
|
6
6
|
"@angular/cdk": "^22.0.0",
|
|
7
7
|
"@angular/common": "^22.0.0",
|
|
8
8
|
"@angular/core": "^22.0.0",
|
|
9
9
|
"@angular/forms": "^22.0.0",
|
|
10
|
+
"@angular/router": "^22.0.0",
|
|
10
11
|
"luxon": "^3.0.0",
|
|
11
12
|
"rxjs": "^7.8.0"
|
|
12
13
|
},
|
|
14
|
+
"peerDependenciesMeta": {
|
|
15
|
+
"@angular/router": {
|
|
16
|
+
"optional": true
|
|
17
|
+
}
|
|
18
|
+
},
|
|
13
19
|
"dependencies": {
|
|
14
20
|
"tslib": "^2.3.0"
|
|
15
21
|
},
|
|
16
22
|
"sideEffects": false,
|
|
23
|
+
"sass": "styles/index.scss",
|
|
17
24
|
"exports": {
|
|
25
|
+
"./styles": {
|
|
26
|
+
"sass": "./styles/index.scss",
|
|
27
|
+
"default": "./styles/index.scss"
|
|
28
|
+
},
|
|
18
29
|
"./styles/*": {
|
|
19
30
|
"sass": "./styles/*",
|
|
20
31
|
"default": "./styles/*"
|
|
@@ -30,10 +41,18 @@
|
|
|
30
41
|
"types": "./types/nexterajs-ui-animations.d.ts",
|
|
31
42
|
"default": "./fesm2022/nexterajs-ui-animations.mjs"
|
|
32
43
|
},
|
|
44
|
+
"./charts": {
|
|
45
|
+
"types": "./types/nexterajs-ui-charts.d.ts",
|
|
46
|
+
"default": "./fesm2022/nexterajs-ui-charts.mjs"
|
|
47
|
+
},
|
|
33
48
|
"./core": {
|
|
34
49
|
"types": "./types/nexterajs-ui-core.d.ts",
|
|
35
50
|
"default": "./fesm2022/nexterajs-ui-core.mjs"
|
|
36
51
|
},
|
|
52
|
+
"./display": {
|
|
53
|
+
"types": "./types/nexterajs-ui-display.d.ts",
|
|
54
|
+
"default": "./fesm2022/nexterajs-ui-display.mjs"
|
|
55
|
+
},
|
|
37
56
|
"./dropdowns": {
|
|
38
57
|
"types": "./types/nexterajs-ui-dropdowns.d.ts",
|
|
39
58
|
"default": "./fesm2022/nexterajs-ui-dropdowns.mjs"
|
|
@@ -58,14 +77,26 @@
|
|
|
58
77
|
"types": "./types/nexterajs-ui-intl.d.ts",
|
|
59
78
|
"default": "./fesm2022/nexterajs-ui-intl.mjs"
|
|
60
79
|
},
|
|
80
|
+
"./navigation": {
|
|
81
|
+
"types": "./types/nexterajs-ui-navigation.d.ts",
|
|
82
|
+
"default": "./fesm2022/nexterajs-ui-navigation.mjs"
|
|
83
|
+
},
|
|
61
84
|
"./notify": {
|
|
62
85
|
"types": "./types/nexterajs-ui-notify.d.ts",
|
|
63
86
|
"default": "./fesm2022/nexterajs-ui-notify.mjs"
|
|
64
87
|
},
|
|
88
|
+
"./overlay": {
|
|
89
|
+
"types": "./types/nexterajs-ui-overlay.d.ts",
|
|
90
|
+
"default": "./fesm2022/nexterajs-ui-overlay.mjs"
|
|
91
|
+
},
|
|
65
92
|
"./pivot": {
|
|
66
93
|
"types": "./types/nexterajs-ui-pivot.d.ts",
|
|
67
94
|
"default": "./fesm2022/nexterajs-ui-pivot.mjs"
|
|
68
95
|
},
|
|
96
|
+
"./shell": {
|
|
97
|
+
"types": "./types/nexterajs-ui-shell.d.ts",
|
|
98
|
+
"default": "./fesm2022/nexterajs-ui-shell.mjs"
|
|
99
|
+
},
|
|
69
100
|
"./styling": {
|
|
70
101
|
"types": "./types/nexterajs-ui-styling.d.ts",
|
|
71
102
|
"default": "./fesm2022/nexterajs-ui-styling.mjs"
|
|
@@ -87,7 +118,7 @@
|
|
|
87
118
|
"engines": {
|
|
88
119
|
"node": "^22.22.3 || ^24.15.0 || >=26.0.0"
|
|
89
120
|
},
|
|
90
|
-
"description": "Angular 22 component library replacing DevExtreme: data grid, pivot grid, editors, pickers and a zero-dependency XLSX engine, in
|
|
121
|
+
"description": "Angular 22 component library replacing DevExtreme: data grid, pivot grid, editors, pickers and a zero-dependency XLSX engine, in eighteen tree-shakeable entry points, with one global style bundle.",
|
|
91
122
|
"keywords": [
|
|
92
123
|
"angular",
|
|
93
124
|
"angular-components",
|
package/styles/_dropdown.scss
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// Shared dropdown list panel for the nxe select family (select-box, tag-box, drop-down-box).
|
|
2
|
-
// Reproduces the DevExtreme `.dx-dropdownlist-popup`. Global (
|
|
2
|
+
// Reproduces the DevExtreme `.dx-dropdownlist-popup`. Global (part of the styles/index.scss bundle) so it
|
|
3
3
|
// applies inside the CDK overlay regardless of which component opened it.
|
|
4
4
|
//
|
|
5
5
|
// The file also holds the editors' trailing-button rule set (`nxe-dropdown-editor-buttons`, below),
|
|
@@ -165,7 +165,7 @@
|
|
|
165
165
|
padding: 1px;
|
|
166
166
|
border-radius: 4px;
|
|
167
167
|
background-clip: content-box;
|
|
168
|
-
color: #333;
|
|
168
|
+
color: var(--nxe-ui-text, #333);
|
|
169
169
|
cursor: pointer;
|
|
170
170
|
|
|
171
171
|
svg {
|
|
@@ -191,11 +191,11 @@
|
|
|
191
191
|
@mixin nxe-drop-button-states($button, $open) {
|
|
192
192
|
&:hover:not(.nxe-disabled) #{$button},
|
|
193
193
|
&:active:not(.nxe-disabled) #{$button} {
|
|
194
|
-
background-color: #e6e6e6;
|
|
194
|
+
background-color: var(--nxe-ui-neutral-150, #e6e6e6);
|
|
195
195
|
}
|
|
196
196
|
|
|
197
197
|
#{$open} {
|
|
198
|
-
background-color: #b3b3b3;
|
|
198
|
+
background-color: var(--nxe-ui-neutral-350, #b3b3b3);
|
|
199
199
|
}
|
|
200
200
|
}
|
|
201
201
|
|
|
@@ -215,7 +215,7 @@
|
|
|
215
215
|
width: 34px;
|
|
216
216
|
min-width: 34px;
|
|
217
217
|
padding: 0;
|
|
218
|
-
color: #999;
|
|
218
|
+
color: var(--nxe-ui-text-muted, #999);
|
|
219
219
|
cursor: pointer;
|
|
220
220
|
|
|
221
221
|
svg {
|
package/styles/_editor.scss
CHANGED
|
@@ -13,20 +13,20 @@
|
|
|
13
13
|
position: relative;
|
|
14
14
|
display: block;
|
|
15
15
|
box-sizing: border-box;
|
|
16
|
-
background: #fff;
|
|
17
|
-
border: 1px solid #ddd;
|
|
16
|
+
background: var(--nxe-ui-surface, #fff);
|
|
17
|
+
border: 1px solid var(--nxe-ui-border, #ddd);
|
|
18
18
|
border-radius: 4px;
|
|
19
|
-
color: #333;
|
|
19
|
+
color: var(--nxe-ui-text, #333);
|
|
20
20
|
line-height: 1.35715;
|
|
21
21
|
}
|
|
22
22
|
|
|
23
23
|
.nxe-editor {
|
|
24
24
|
&:hover {
|
|
25
|
-
border-color: rgba(51, 122, 183, 0.4); // faded primary blue
|
|
25
|
+
border-color: var(--nxe-ui-accent-faded, rgba(51, 122, 183, 0.4)); // faded primary blue
|
|
26
26
|
}
|
|
27
27
|
|
|
28
28
|
&.nxe-focused {
|
|
29
|
-
border-color: #337ab7; // solid primary blue
|
|
29
|
+
border-color: var(--nxe-ui-accent, #337ab7); // solid primary blue
|
|
30
30
|
}
|
|
31
31
|
|
|
32
32
|
&.nxe-readonly {
|
|
@@ -46,11 +46,11 @@
|
|
|
46
46
|
// The width is compensated with an inset shadow rather than a 2px border: growing the border
|
|
47
47
|
// would shift the input inside it by a pixel and jog the text as the field goes valid.
|
|
48
48
|
&.nxe-invalid {
|
|
49
|
-
border-color: rgba(217, 83, 79, 0.4);
|
|
49
|
+
border-color: var(--nxe-ui-invalid-faded, rgba(217, 83, 79, 0.4));
|
|
50
50
|
|
|
51
51
|
&.nxe-focused,
|
|
52
52
|
&:hover {
|
|
53
|
-
border-color: #d9534f;
|
|
53
|
+
border-color: var(--nxe-ui-invalid, #d9534f);
|
|
54
54
|
}
|
|
55
55
|
|
|
56
56
|
// Invalid badge — dx `.dx-invalid.dx-texteditor.dx-editor-outlined.dx-show-invalid-badge
|
|
@@ -71,8 +71,8 @@
|
|
|
71
71
|
width: 18px;
|
|
72
72
|
height: 18px;
|
|
73
73
|
border-radius: 50%;
|
|
74
|
-
background-color: #d9534f;
|
|
75
|
-
color: #fff;
|
|
74
|
+
background-color: var(--nxe-ui-invalid, #d9534f);
|
|
75
|
+
color: var(--nxe-ui-invalid-contrast, #fff);
|
|
76
76
|
font-weight: 700;
|
|
77
77
|
font-size: 13px;
|
|
78
78
|
line-height: 18px;
|
|
@@ -112,6 +112,41 @@
|
|
|
112
112
|
--nxe-invalid-badge-inset: 38px;
|
|
113
113
|
}
|
|
114
114
|
|
|
115
|
+
// `showPasswordToggle` on the text box: a real <button> (so it is a tab stop with a name and
|
|
116
|
+
// aria-pressed) in the clear button's 34px area, after the input and the clear button. The
|
|
117
|
+
// badge clears it the same way it clears the clear area, and both together make 72px.
|
|
118
|
+
.nxe-password-toggle {
|
|
119
|
+
@include dropdown.nxe-clear-button;
|
|
120
|
+
appearance: none;
|
|
121
|
+
border: 0;
|
|
122
|
+
background: transparent;
|
|
123
|
+
font: inherit;
|
|
124
|
+
|
|
125
|
+
&:hover {
|
|
126
|
+
color: var(--nxe-ui-text, #333);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
&:focus-visible {
|
|
130
|
+
outline: 2px solid var(--nxe-ui-focus-ring-color, #5c95c5);
|
|
131
|
+
outline-offset: -2px;
|
|
132
|
+
border-radius: 4px;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
.nxe-password-toggle-slash {
|
|
136
|
+
fill: currentColor;
|
|
137
|
+
stroke: var(--nxe-ui-surface, #fff);
|
|
138
|
+
stroke-width: 1px;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
.nxe-editor-container:has(> .nxe-password-toggle) {
|
|
143
|
+
--nxe-invalid-badge-inset: 38px;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
.nxe-editor-container:has(> .nxe-password-toggle):has(> .nxe-clear-button-area) {
|
|
147
|
+
--nxe-invalid-badge-inset: 72px;
|
|
148
|
+
}
|
|
149
|
+
|
|
115
150
|
.nxe-editor-input {
|
|
116
151
|
-webkit-appearance: none;
|
|
117
152
|
appearance: none;
|
|
@@ -121,12 +156,12 @@
|
|
|
121
156
|
flex: 1 1 auto;
|
|
122
157
|
margin: 0;
|
|
123
158
|
width: 100%;
|
|
124
|
-
min-height: 34px;
|
|
125
|
-
padding: 7px 9px 8px;
|
|
159
|
+
min-height: var(--nxe-ui-control-min-height, 34px);
|
|
160
|
+
padding: var(--nxe-ui-editor-padding, 7px 9px 8px);
|
|
126
161
|
border: 0;
|
|
127
162
|
outline: 0;
|
|
128
163
|
background: transparent;
|
|
129
|
-
color: #333;
|
|
164
|
+
color: var(--nxe-ui-text, #333);
|
|
130
165
|
// dx `.dx-texteditor-input { max-width: 100%; text-overflow: ellipsis }` — a value longer
|
|
131
166
|
// than the field is truncated with an ellipsis rather than clipped mid-glyph.
|
|
132
167
|
max-width: 100%;
|
|
@@ -135,14 +170,14 @@
|
|
|
135
170
|
border-radius: 4px;
|
|
136
171
|
|
|
137
172
|
&::placeholder {
|
|
138
|
-
color: #999;
|
|
173
|
+
color: var(--nxe-ui-text-muted, #999);
|
|
139
174
|
}
|
|
140
175
|
|
|
141
176
|
&:disabled {
|
|
142
177
|
// dx keeps the input itself opaque; the host `.nxe-disabled` dims the whole editor
|
|
143
178
|
opacity: 1;
|
|
144
|
-
color: #333;
|
|
145
|
-
-webkit-text-fill-color: #333;
|
|
179
|
+
color: var(--nxe-ui-text, #333);
|
|
180
|
+
-webkit-text-fill-color: var(--nxe-ui-text, #333);
|
|
146
181
|
}
|
|
147
182
|
}
|
|
148
183
|
|
|
@@ -156,8 +191,8 @@
|
|
|
156
191
|
max-width: 100%;
|
|
157
192
|
padding: 10px;
|
|
158
193
|
border-radius: 4px;
|
|
159
|
-
background-color: #d9534f;
|
|
160
|
-
color: #fff;
|
|
194
|
+
background-color: var(--nxe-ui-invalid, #d9534f);
|
|
195
|
+
color: var(--nxe-ui-invalid-contrast, #fff);
|
|
161
196
|
font-size: 0.85em;
|
|
162
197
|
line-height: normal;
|
|
163
198
|
word-wrap: break-word;
|
package/styles/_mixins.scss
CHANGED
|
@@ -75,7 +75,7 @@
|
|
|
75
75
|
// on the engines that never implemented the standard properties (Chrome < 121, Safari < 18.2).
|
|
76
76
|
// Exactly one of the two branches applies anywhere.
|
|
77
77
|
@mixin nxe-thin-scrollbar(
|
|
78
|
-
$thumb: rgba(0, 0, 0, 0.5),
|
|
78
|
+
$thumb: var(--nxe-ui-scrollbar-thumb, rgba(0, 0, 0, 0.5)),
|
|
79
79
|
$track: transparent,
|
|
80
80
|
$size: 8px,
|
|
81
81
|
$thumb-hover: $thumb
|
package/styles/_scrollbar.scss
CHANGED
|
@@ -86,7 +86,7 @@
|
|
|
86
86
|
.nxe-scrollbar .nxe-scrollbar__rail-y:focus,
|
|
87
87
|
.nxe-scrollbar .nxe-scrollbar__rail-x.nxe-scrollbar--clicking,
|
|
88
88
|
.nxe-scrollbar .nxe-scrollbar__rail-y.nxe-scrollbar--clicking {
|
|
89
|
-
background-color: #eee;
|
|
89
|
+
background-color: var(--nxe-ui-neutral-110, #eee);
|
|
90
90
|
opacity: 0.9;
|
|
91
91
|
}
|
|
92
92
|
|
|
@@ -94,7 +94,7 @@
|
|
|
94
94
|
// Scrollbar thumb styles
|
|
95
95
|
//
|
|
96
96
|
.nxe-scrollbar__thumb-x {
|
|
97
|
-
background-color: #aaa;
|
|
97
|
+
background-color: var(--nxe-ui-neutral-400, #aaa);
|
|
98
98
|
border-radius: 6px;
|
|
99
99
|
transition:
|
|
100
100
|
background-color 0.2s linear,
|
|
@@ -107,7 +107,7 @@
|
|
|
107
107
|
}
|
|
108
108
|
|
|
109
109
|
.nxe-scrollbar__thumb-y {
|
|
110
|
-
background-color: #aaa;
|
|
110
|
+
background-color: var(--nxe-ui-neutral-400, #aaa);
|
|
111
111
|
border-radius: 6px;
|
|
112
112
|
transition:
|
|
113
113
|
background-color 0.2s linear,
|
|
@@ -122,13 +122,13 @@
|
|
|
122
122
|
.nxe-scrollbar__rail-x:hover > .nxe-scrollbar__thumb-x,
|
|
123
123
|
.nxe-scrollbar__rail-x:focus > .nxe-scrollbar__thumb-x,
|
|
124
124
|
.nxe-scrollbar__rail-x.nxe-scrollbar--clicking .nxe-scrollbar__thumb-x {
|
|
125
|
-
background-color: #999;
|
|
125
|
+
background-color: var(--nxe-ui-text-muted, #999);
|
|
126
126
|
height: 11px;
|
|
127
127
|
}
|
|
128
128
|
|
|
129
129
|
.nxe-scrollbar__rail-y:hover > .nxe-scrollbar__thumb-y,
|
|
130
130
|
.nxe-scrollbar__rail-y:focus > .nxe-scrollbar__thumb-y,
|
|
131
131
|
.nxe-scrollbar__rail-y.nxe-scrollbar--clicking .nxe-scrollbar__thumb-y {
|
|
132
|
-
background-color: #999;
|
|
132
|
+
background-color: var(--nxe-ui-text-muted, #999);
|
|
133
133
|
width: 11px;
|
|
134
134
|
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
// Status families (docs/TOKENS.md, "Status families"). `nxe-tag` and `nxe-badge` read the same six
|
|
2
|
+
// families, so the family -> token wiring lives here once: `@include status.families('.nxe-tag')`
|
|
3
|
+
// emits `.nxe-tag-<family>` classes that set the private `--nxe-status-{fg,bg,border}` triple the
|
|
4
|
+
// component's own rules then use. Colours come only from `--nxe-ui-status-*` tokens.
|
|
5
|
+
|
|
6
|
+
$families: neutral, info, attention, success, danger, muted;
|
|
7
|
+
|
|
8
|
+
@mixin families($prefix) {
|
|
9
|
+
@each $family in $families {
|
|
10
|
+
#{$prefix}-#{$family} {
|
|
11
|
+
--nxe-status-fg: var(--nxe-ui-status-#{$family}-fg);
|
|
12
|
+
--nxe-status-bg: var(--nxe-ui-status-#{$family}-bg);
|
|
13
|
+
--nxe-status-border: var(--nxe-ui-status-#{$family}-border);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
// `muted` is the one family that is also drawn differently: a dashed edge says "no longer live".
|
|
18
|
+
#{$prefix}-muted {
|
|
19
|
+
--nxe-status-border-style: dashed;
|
|
20
|
+
}
|
|
21
|
+
}
|
package/styles/_toast.scss
CHANGED
|
@@ -69,11 +69,11 @@
|
|
|
69
69
|
|
|
70
70
|
.nxe-toast-message a,
|
|
71
71
|
.nxe-toast-message label {
|
|
72
|
-
color: #ffffff;
|
|
72
|
+
color: var(--nxe-ui-toast-fg, #ffffff);
|
|
73
73
|
}
|
|
74
74
|
|
|
75
75
|
.nxe-toast-message a:hover {
|
|
76
|
-
color: #cccccc;
|
|
76
|
+
color: var(--nxe-ui-toast-fg-muted, #cccccc);
|
|
77
77
|
text-decoration: none;
|
|
78
78
|
}
|
|
79
79
|
|
|
@@ -84,13 +84,13 @@
|
|
|
84
84
|
float: right;
|
|
85
85
|
font-size: 20px;
|
|
86
86
|
font-weight: bold;
|
|
87
|
-
color: #ffffff;
|
|
88
|
-
text-shadow: 0 1px 0 #ffffff;
|
|
87
|
+
color: var(--nxe-ui-toast-fg, #ffffff);
|
|
88
|
+
text-shadow: 0 1px 0 var(--nxe-ui-toast-fg, #ffffff);
|
|
89
89
|
}
|
|
90
90
|
|
|
91
91
|
.nxe-toast-close:hover,
|
|
92
92
|
.nxe-toast-close:focus {
|
|
93
|
-
color: #000000;
|
|
93
|
+
color: var(--nxe-ui-toast-ink, #000000);
|
|
94
94
|
text-decoration: none;
|
|
95
95
|
cursor: pointer;
|
|
96
96
|
opacity: 0.4;
|
|
@@ -123,12 +123,12 @@ button.nxe-toast-close {
|
|
|
123
123
|
background-position: 15px center;
|
|
124
124
|
background-repeat: no-repeat;
|
|
125
125
|
background-size: 24px;
|
|
126
|
-
box-shadow: 0 0 12px #999999;
|
|
127
|
-
color: #ffffff;
|
|
126
|
+
box-shadow: 0 0 12px var(--nxe-ui-toast-shadow-hover, #999999);
|
|
127
|
+
color: var(--nxe-ui-toast-fg, #ffffff);
|
|
128
128
|
}
|
|
129
129
|
|
|
130
130
|
.nxe-toast-container .nxe-toast:hover {
|
|
131
|
-
box-shadow: 0 0 12px #000000;
|
|
131
|
+
box-shadow: 0 0 12px var(--nxe-ui-toast-ink, #000000);
|
|
132
132
|
opacity: 1;
|
|
133
133
|
cursor: pointer;
|
|
134
134
|
}
|
|
@@ -171,7 +171,7 @@ button.nxe-toast-close {
|
|
|
171
171
|
// the `width`, `padding` and `margin` above do nothing at all, silently.
|
|
172
172
|
display: block;
|
|
173
173
|
|
|
174
|
-
background-color: #030303;
|
|
174
|
+
background-color: var(--nxe-ui-toast-bg, #030303);
|
|
175
175
|
pointer-events: auto;
|
|
176
176
|
|
|
177
177
|
// ngx-toastr animated between `inactive`/`active`/`removed` states that differ only in
|
|
@@ -186,19 +186,19 @@ button.nxe-toast-close {
|
|
|
186
186
|
}
|
|
187
187
|
|
|
188
188
|
.nxe-toast-success {
|
|
189
|
-
background-color: #51a351;
|
|
189
|
+
background-color: var(--nxe-ui-toast-success-bg, #51a351);
|
|
190
190
|
}
|
|
191
191
|
|
|
192
192
|
.nxe-toast-error {
|
|
193
|
-
background-color: #bd362f;
|
|
193
|
+
background-color: var(--nxe-ui-toast-error-bg, #bd362f);
|
|
194
194
|
}
|
|
195
195
|
|
|
196
196
|
.nxe-toast-info {
|
|
197
|
-
background-color: #2f96b4;
|
|
197
|
+
background-color: var(--nxe-ui-toast-info-bg, #2f96b4);
|
|
198
198
|
}
|
|
199
199
|
|
|
200
200
|
.nxe-toast-warning {
|
|
201
|
-
background-color: #f89406;
|
|
201
|
+
background-color: var(--nxe-ui-toast-warning-bg, #f89406);
|
|
202
202
|
}
|
|
203
203
|
|
|
204
204
|
.nxe-toast-progress {
|
|
@@ -206,7 +206,7 @@ button.nxe-toast-close {
|
|
|
206
206
|
left: 0;
|
|
207
207
|
bottom: 0;
|
|
208
208
|
height: 4px;
|
|
209
|
-
background-color: #000000;
|
|
209
|
+
background-color: var(--nxe-ui-toast-ink, #000000);
|
|
210
210
|
opacity: 0.4;
|
|
211
211
|
}
|
|
212
212
|
|