@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.
Files changed (59) hide show
  1. package/README.md +279 -34
  2. package/fesm2022/nexterajs-ui-charts.mjs +1096 -0
  3. package/fesm2022/nexterajs-ui-charts.mjs.map +1 -0
  4. package/fesm2022/nexterajs-ui-core.mjs +652 -12
  5. package/fesm2022/nexterajs-ui-core.mjs.map +1 -1
  6. package/fesm2022/nexterajs-ui-display.mjs +1142 -0
  7. package/fesm2022/nexterajs-ui-display.mjs.map +1 -0
  8. package/fesm2022/nexterajs-ui-dropdowns.mjs +321 -33
  9. package/fesm2022/nexterajs-ui-dropdowns.mjs.map +1 -1
  10. package/fesm2022/nexterajs-ui-file-uploader.mjs +572 -10
  11. package/fesm2022/nexterajs-ui-file-uploader.mjs.map +1 -1
  12. package/fesm2022/nexterajs-ui-forms.mjs +2027 -136
  13. package/fesm2022/nexterajs-ui-forms.mjs.map +1 -1
  14. package/fesm2022/nexterajs-ui-grid.mjs +1222 -188
  15. package/fesm2022/nexterajs-ui-grid.mjs.map +1 -1
  16. package/fesm2022/nexterajs-ui-intl.mjs +103 -11
  17. package/fesm2022/nexterajs-ui-intl.mjs.map +1 -1
  18. package/fesm2022/nexterajs-ui-navigation.mjs +1054 -0
  19. package/fesm2022/nexterajs-ui-navigation.mjs.map +1 -0
  20. package/fesm2022/nexterajs-ui-notify.mjs +46 -44
  21. package/fesm2022/nexterajs-ui-notify.mjs.map +1 -1
  22. package/fesm2022/nexterajs-ui-overlay.mjs +1671 -0
  23. package/fesm2022/nexterajs-ui-overlay.mjs.map +1 -0
  24. package/fesm2022/nexterajs-ui-pivot.mjs +51 -26
  25. package/fesm2022/nexterajs-ui-pivot.mjs.map +1 -1
  26. package/fesm2022/nexterajs-ui-shell.mjs +542 -0
  27. package/fesm2022/nexterajs-ui-shell.mjs.map +1 -0
  28. package/fesm2022/nexterajs-ui-tree-view.mjs +5 -2
  29. package/fesm2022/nexterajs-ui-tree-view.mjs.map +1 -1
  30. package/fesm2022/nexterajs-ui-validation.mjs +42 -11
  31. package/fesm2022/nexterajs-ui-validation.mjs.map +1 -1
  32. package/fesm2022/nexterajs-ui.mjs +5 -0
  33. package/fesm2022/nexterajs-ui.mjs.map +1 -1
  34. package/package.json +33 -2
  35. package/styles/_dropdown.scss +5 -5
  36. package/styles/_editor.scss +52 -17
  37. package/styles/_mixins.scss +1 -1
  38. package/styles/_scrollbar.scss +5 -5
  39. package/styles/_status.scss +21 -0
  40. package/styles/_toast.scss +14 -14
  41. package/styles/_tokens.scss +420 -3
  42. package/styles/_widget.scss +14 -3
  43. package/styles/index.scss +6 -4
  44. package/types/nexterajs-ui-charts.d.ts +446 -0
  45. package/types/nexterajs-ui-core.d.ts +387 -22
  46. package/types/nexterajs-ui-display.d.ts +720 -0
  47. package/types/nexterajs-ui-dropdowns.d.ts +191 -48
  48. package/types/nexterajs-ui-file-uploader.d.ts +236 -7
  49. package/types/nexterajs-ui-forms.d.ts +675 -30
  50. package/types/nexterajs-ui-grid.d.ts +448 -93
  51. package/types/nexterajs-ui-intl.d.ts +39 -4
  52. package/types/nexterajs-ui-navigation.d.ts +531 -0
  53. package/types/nexterajs-ui-notify.d.ts +4 -2
  54. package/types/nexterajs-ui-overlay.d.ts +703 -0
  55. package/types/nexterajs-ui-pivot.d.ts +56 -48
  56. package/types/nexterajs-ui-shell.d.ts +294 -0
  57. package/types/nexterajs-ui-tree-view.d.ts +6 -3
  58. package/types/nexterajs-ui-validation.d.ts +20 -11
  59. 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":";;;;;;;;;;;;;;AAAA;AACA;AACA;AACA;AACA;;ACJA;;AAEG"}
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.2",
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 twelve tree-shakeable entry points.",
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",
@@ -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 (loaded via styling/index.scss) so it
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 {
@@ -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;
@@ -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
@@ -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
+ }
@@ -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