@mk-kit/ui 0.42.0 → 0.44.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 (57) hide show
  1. package/README.md +5 -3
  2. package/THIRD_PARTY_NOTICES.md +4 -2
  3. package/fesm2022/mk-kit-ui-block-editor.mjs +4 -2
  4. package/fesm2022/mk-kit-ui-block-editor.mjs.map +1 -1
  5. package/fesm2022/mk-kit-ui-checkbox.mjs +4 -2
  6. package/fesm2022/mk-kit-ui-checkbox.mjs.map +1 -1
  7. package/fesm2022/mk-kit-ui-core.mjs +136 -1
  8. package/fesm2022/mk-kit-ui-core.mjs.map +1 -1
  9. package/fesm2022/mk-kit-ui-data.mjs +438 -8
  10. package/fesm2022/mk-kit-ui-data.mjs.map +1 -1
  11. package/fesm2022/mk-kit-ui-datetime.mjs +88 -50
  12. package/fesm2022/mk-kit-ui-datetime.mjs.map +1 -1
  13. package/fesm2022/mk-kit-ui-directives.mjs +27 -8
  14. package/fesm2022/mk-kit-ui-directives.mjs.map +1 -1
  15. package/fesm2022/mk-kit-ui-dnd.mjs +43 -8
  16. package/fesm2022/mk-kit-ui-dnd.mjs.map +1 -1
  17. package/fesm2022/mk-kit-ui-dynamic-form.mjs +149 -2
  18. package/fesm2022/mk-kit-ui-dynamic-form.mjs.map +1 -1
  19. package/fesm2022/mk-kit-ui-feedback.mjs +1 -1
  20. package/fesm2022/mk-kit-ui-feedback.mjs.map +1 -1
  21. package/fesm2022/mk-kit-ui-forms.mjs +326 -78
  22. package/fesm2022/mk-kit-ui-forms.mjs.map +1 -1
  23. package/fesm2022/mk-kit-ui-icon-extended.mjs +425 -0
  24. package/fesm2022/mk-kit-ui-icon-extended.mjs.map +1 -0
  25. package/fesm2022/mk-kit-ui-icon.mjs +296 -459
  26. package/fesm2022/mk-kit-ui-icon.mjs.map +1 -1
  27. package/fesm2022/mk-kit-ui-media.mjs +1 -1
  28. package/fesm2022/mk-kit-ui-media.mjs.map +1 -1
  29. package/fesm2022/mk-kit-ui-query-builder.mjs +1 -1
  30. package/fesm2022/mk-kit-ui-query-builder.mjs.map +1 -1
  31. package/fesm2022/mk-kit-ui-rich-text.mjs +4 -2
  32. package/fesm2022/mk-kit-ui-rich-text.mjs.map +1 -1
  33. package/fesm2022/mk-kit-ui-table.mjs +668 -24
  34. package/fesm2022/mk-kit-ui-table.mjs.map +1 -1
  35. package/fesm2022/mk-kit-ui-testing.mjs +54 -0
  36. package/fesm2022/mk-kit-ui-testing.mjs.map +1 -1
  37. package/fesm2022/mk-kit-ui.mjs +1 -0
  38. package/fesm2022/mk-kit-ui.mjs.map +1 -1
  39. package/package.json +5 -1
  40. package/schematics/migrate-primeng/transform.js +4 -1
  41. package/schematics/ng-add/index.js +30 -2
  42. package/schematics/ng-add/schema.json +6 -0
  43. package/types/mk-kit-ui-block-editor.d.ts +2 -0
  44. package/types/mk-kit-ui-checkbox.d.ts +2 -0
  45. package/types/mk-kit-ui-core.d.ts +82 -2
  46. package/types/mk-kit-ui-data.d.ts +203 -2
  47. package/types/mk-kit-ui-datetime.d.ts +41 -19
  48. package/types/mk-kit-ui-directives.d.ts +12 -6
  49. package/types/mk-kit-ui-dnd.d.ts +32 -4
  50. package/types/mk-kit-ui-dynamic-form.d.ts +44 -1
  51. package/types/mk-kit-ui-forms.d.ts +154 -16
  52. package/types/mk-kit-ui-icon-extended.d.ts +83 -0
  53. package/types/mk-kit-ui-icon.d.ts +100 -17
  54. package/types/mk-kit-ui-rich-text.d.ts +2 -0
  55. package/types/mk-kit-ui-table.d.ts +234 -25
  56. package/types/mk-kit-ui-testing.d.ts +16 -0
  57. package/types/mk-kit-ui.d.ts +1 -0
@@ -1 +1 @@
1
- {"version":3,"file":"mk-kit-ui-query-builder.mjs","sources":["../../../projects/mk-kit/query-builder/query-group.ts","../../../projects/mk-kit/query-builder/query-group.html","../../../projects/mk-kit/query-builder/query-builder.ts","../../../projects/mk-kit/query-builder/index.ts","../../../projects/mk-kit/query-builder/mk-kit-ui-query-builder.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n booleanAttribute,\n computed,\n forwardRef,\n inject,\n input,\n numberAttribute,\n output,\n} from '@angular/core';\nimport {\n MK_I18N,\n MK_QUERY_UNARY,\n mkCreateQueryGroup,\n mkCreateQueryRule,\n mkIsQueryGroup,\n mkQueryOperatorLabel,\n mkQueryOperatorsFor,\n type MkQueryCombinator,\n type MkQueryField,\n type MkQueryGroup,\n type MkQueryNode,\n type MkQueryOperator,\n type MkQueryRule,\n} from '@mk-kit/ui/core';\nimport type { MkSize } from '@mk-kit/ui/core';\nimport { MkButton } from '@mk-kit/ui/button';\nimport { MkIcon } from '@mk-kit/ui/icon';\nimport { MkInput, MkMultiSelect, MkNumberInput, MkSelect, type MkSelectOption } from '@mk-kit/ui/forms';\nimport { MkDatePicker } from '@mk-kit/ui/datetime';\n\n/** Format a Date as an ISO calendar date (`YYYY-MM-DD`, local). */\nfunction toIsoDate(d: Date | null): string | null {\n if (!d) return null;\n const pad = (n: number) => String(n).padStart(2, '0');\n return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`;\n}\n\n/** Parse an ISO calendar date back into a local Date (`null` when invalid). */\nfunction fromIsoDate(v: unknown): Date | null {\n if (v instanceof Date) return v;\n if (typeof v !== 'string' || !v) return null;\n const m = /^(\\d{4})-(\\d{2})-(\\d{2})/.exec(v);\n if (!m) {\n const d = new Date(v);\n return Number.isNaN(d.getTime()) ? null : d;\n }\n return new Date(Number(m[1]), Number(m[2]) - 1, Number(m[3]));\n}\n\n/**\n * One group of the builder — its combinator toggle, rules, nested groups and\n * the add / remove actions. Used by `mk-query-builder`; every edit emits a\n * new immutable group upward.\n */\n@Component({\n selector: 'mk-query-group',\n templateUrl: './query-group.html',\n styleUrl: './query-group.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n forwardRef(() => MkQueryGroupComponent),\n MkButton,\n MkDatePicker,\n MkIcon,\n MkInput,\n MkMultiSelect,\n MkNumberInput,\n MkSelect,\n ],\n host: {\n class: 'mk-query-group',\n role: 'group',\n '[class.mk-query-group--root]': 'root()',\n '[class.mk-query-group--not]': '!!group().not',\n '[attr.aria-label]': 'root() ? null : i18n.queryAddGroup',\n },\n})\nexport class MkQueryGroupComponent {\n protected readonly i18n = inject(MK_I18N);\n\n readonly group = input.required<MkQueryGroup>();\n readonly fields = input.required<readonly MkQueryField[]>();\n readonly depth = input(0, { transform: numberAttribute });\n readonly maxDepth = input(3, { transform: numberAttribute });\n readonly allowNot = input(false, { transform: booleanAttribute });\n readonly disabled = input(false, { transform: booleanAttribute });\n readonly root = input(false, { transform: booleanAttribute });\n readonly size = input<MkSize>('sm');\n\n /** A new version of this group after an edit. */\n readonly groupChange = output<MkQueryGroup>();\n /** The user removed this (non-root) group. */\n readonly remove = output<void>();\n\n protected readonly fieldOptions = computed<MkSelectOption[]>(() =>\n this.fields().map((f) => ({ label: f.label, value: f.key })),\n );\n protected readonly canNest = computed(() => this.depth() < this.maxDepth());\n protected readonly booleanOptions = computed<MkSelectOption[]>(() => [\n { label: this.i18n.queryTrue, value: true },\n { label: this.i18n.queryFalse, value: false },\n ]);\n\n protected isGroup = mkIsQueryGroup;\n\n protected fieldOf(rule: MkQueryRule): MkQueryField | undefined {\n return this.fields().find((f) => f.key === rule.field);\n }\n\n protected typeOf(rule: MkQueryRule): string {\n return this.fieldOf(rule)?.type ?? 'string';\n }\n\n protected operatorOptions(rule: MkQueryRule): MkSelectOption[] {\n return mkQueryOperatorsFor(this.fieldOf(rule)).map((op) => ({\n label: mkQueryOperatorLabel(op, this.i18n),\n value: op,\n }));\n }\n\n protected needsValue(rule: MkQueryRule): boolean {\n return !MK_QUERY_UNARY.has(rule.operator);\n }\n\n protected selectOptions(rule: MkQueryRule): MkSelectOption[] {\n return (this.fieldOf(rule)?.options ?? []).map((o) => ({ label: o.label, value: o.value }));\n }\n\n protected isList(rule: MkQueryRule): boolean {\n return rule.operator === 'in' || rule.operator === 'notIn';\n }\n\n protected isRange(rule: MkQueryRule): boolean {\n return rule.operator === 'between';\n }\n\n protected asArray(value: unknown): unknown[] {\n return Array.isArray(value) ? value : [];\n }\n\n protected rangePart(rule: MkQueryRule, index: 0 | 1): unknown {\n return Array.isArray(rule.value) ? rule.value[index] : undefined;\n }\n\n protected dateValue(v: unknown): Date | null {\n return fromIsoDate(v);\n }\n\n protected numberValue(v: unknown): number | null {\n return typeof v === 'number' ? v : v == null || v === '' ? null : Number(v);\n }\n\n protected textValue(v: unknown): string {\n return v == null ? '' : String(v);\n }\n\n // --- Edits (all immutable) --------------------------------------------------\n\n protected setCombinator(combinator: MkQueryCombinator): void {\n if (this.group().combinator === combinator) return;\n this.groupChange.emit({ ...this.group(), combinator });\n }\n\n protected toggleNot(): void {\n this.groupChange.emit({ ...this.group(), not: !this.group().not });\n }\n\n protected addRule(): void {\n const field = this.fields()[0];\n if (!field) return;\n this.groupChange.emit({ ...this.group(), rules: [...this.group().rules, mkCreateQueryRule(field)] });\n }\n\n protected addGroup(): void {\n this.groupChange.emit({ ...this.group(), rules: [...this.group().rules, mkCreateQueryGroup()] });\n }\n\n protected removeAt(index: number): void {\n this.groupChange.emit({ ...this.group(), rules: this.group().rules.filter((_, i) => i !== index) });\n }\n\n protected replaceAt(index: number, node: MkQueryNode): void {\n this.groupChange.emit({ ...this.group(), rules: this.group().rules.map((n, i) => (i === index ? node : n)) });\n }\n\n protected setField(index: number, rule: MkQueryRule, key: unknown): void {\n const field = this.fields().find((f) => f.key === key);\n if (!field || field.key === rule.field) return;\n const ops = mkQueryOperatorsFor(field);\n const operator = ops.includes(rule.operator) ? rule.operator : ops[0];\n this.replaceAt(index, { ...rule, field: field.key, operator, value: undefined });\n }\n\n protected setOperator(index: number, rule: MkQueryRule, op: unknown): void {\n const operator = op as MkQueryOperator;\n if (operator === rule.operator) return;\n const shapeChanged =\n MK_QUERY_UNARY.has(operator) !== MK_QUERY_UNARY.has(rule.operator) ||\n (operator === 'between') !== (rule.operator === 'between') ||\n this.isList({ ...rule, operator }) !== this.isList(rule);\n this.replaceAt(index, { ...rule, operator, value: shapeChanged ? undefined : rule.value });\n }\n\n protected setValue(index: number, rule: MkQueryRule, value: unknown): void {\n this.replaceAt(index, { ...rule, value });\n }\n\n protected setRangePart(index: number, rule: MkQueryRule, part: 0 | 1, value: unknown): void {\n const current = Array.isArray(rule.value) ? [...rule.value] : [undefined, undefined];\n current[part] = value;\n this.setValue(index, rule, current);\n }\n\n protected setDate(index: number, rule: MkQueryRule, d: Date | null): void {\n this.setValue(index, rule, toIsoDate(d));\n }\n\n protected setDateRange(index: number, rule: MkQueryRule, part: 0 | 1, d: Date | null): void {\n this.setRangePart(index, rule, part, toIsoDate(d));\n }\n\n protected onTextInput(index: number, rule: MkQueryRule, event: Event): void {\n this.setValue(index, rule, (event.target as HTMLInputElement).value);\n }\n}\n","@let g = group();\n<div class=\"mk-query-group__bar\">\n <div class=\"mk-query-group__combinator\" role=\"group\" [attr.aria-label]=\"i18n.queryOperator\">\n <button\n type=\"button\"\n class=\"mk-query-group__toggle\"\n [class.mk-query-group__toggle--active]=\"g.combinator === 'and'\"\n [attr.aria-pressed]=\"g.combinator === 'and'\"\n [disabled]=\"disabled()\"\n (click)=\"setCombinator('and')\"\n >{{ i18n.queryAnd }}</button>\n <button\n type=\"button\"\n class=\"mk-query-group__toggle\"\n [class.mk-query-group__toggle--active]=\"g.combinator === 'or'\"\n [attr.aria-pressed]=\"g.combinator === 'or'\"\n [disabled]=\"disabled()\"\n (click)=\"setCombinator('or')\"\n >{{ i18n.queryOr }}</button>\n </div>\n @if (allowNot()) {\n <button\n type=\"button\"\n class=\"mk-query-group__toggle mk-query-group__toggle--not\"\n [class.mk-query-group__toggle--active]=\"!!g.not\"\n [attr.aria-pressed]=\"!!g.not\"\n [disabled]=\"disabled()\"\n (click)=\"toggleNot()\"\n >{{ i18n.queryNot }}</button>\n }\n <span class=\"mk-query-group__spacer\"></span>\n <button mkButton type=\"button\" variant=\"ghost\" tone=\"neutral\" [size]=\"size()\" [disabled]=\"disabled() || !fields().length\" (click)=\"addRule()\">\n <mk-icon name=\"plus\" size=\"sm\" /> {{ i18n.queryAddRule }}\n </button>\n @if (canNest()) {\n <button mkButton type=\"button\" variant=\"ghost\" tone=\"neutral\" [size]=\"size()\" [disabled]=\"disabled()\" (click)=\"addGroup()\">\n <mk-icon name=\"layers\" size=\"sm\" /> {{ i18n.queryAddGroup }}\n </button>\n }\n @if (!root()) {\n <button mkButton type=\"button\" variant=\"ghost\" tone=\"neutral\" [size]=\"size()\" class=\"mk-query-group__remove\" [disabled]=\"disabled()\" [attr.aria-label]=\"i18n.queryRemoveGroup\" (click)=\"remove.emit()\">\n <mk-icon name=\"trash\" size=\"sm\" />\n </button>\n }\n</div>\n\n<div class=\"mk-query-group__rules\">\n @if (!g.rules.length) {\n <p class=\"mk-query-group__empty\">{{ i18n.queryEmptyGroup }}</p>\n }\n @for (node of g.rules; track node.id; let i = $index) {\n @if (isGroup(node)) {\n <mk-query-group\n [group]=\"node\"\n [fields]=\"fields()\"\n [depth]=\"depth() + 1\"\n [maxDepth]=\"maxDepth()\"\n [allowNot]=\"allowNot()\"\n [disabled]=\"disabled()\"\n [size]=\"size()\"\n (groupChange)=\"replaceAt(i, $event)\"\n (remove)=\"removeAt(i)\"\n />\n } @else {\n <div class=\"mk-query-group__rule\" role=\"group\">\n <mk-select\n class=\"mk-query-group__field\"\n [options]=\"fieldOptions()\"\n [value]=\"node.field\"\n [size]=\"size()\"\n [disabled]=\"disabled()\"\n [attr.aria-label]=\"i18n.queryField\"\n (valueChange)=\"setField(i, node, $event)\"\n />\n <mk-select\n class=\"mk-query-group__operator\"\n [options]=\"operatorOptions(node)\"\n [value]=\"node.operator\"\n [size]=\"size()\"\n [disabled]=\"disabled()\"\n [attr.aria-label]=\"i18n.queryOperator\"\n (valueChange)=\"setOperator(i, node, $event)\"\n />\n @if (needsValue(node)) {\n @switch (typeOf(node)) {\n @case ('boolean') {\n <mk-select class=\"mk-query-group__value\" [options]=\"booleanOptions()\" [value]=\"node.value ?? null\" [size]=\"size()\" [disabled]=\"disabled()\" [attr.aria-label]=\"i18n.queryValue\" (valueChange)=\"setValue(i, node, $event)\" />\n }\n @case ('select') {\n @if (isList(node)) {\n <mk-multi-select class=\"mk-query-group__value\" [options]=\"selectOptions(node)\" [value]=\"asArray(node.value)\" [size]=\"size()\" [disabled]=\"disabled()\" [attr.aria-label]=\"i18n.queryValue\" (valueChange)=\"setValue(i, node, $event)\" />\n } @else {\n <mk-select class=\"mk-query-group__value\" [options]=\"selectOptions(node)\" [value]=\"node.value ?? null\" [size]=\"size()\" [disabled]=\"disabled()\" [attr.aria-label]=\"i18n.queryValue\" (valueChange)=\"setValue(i, node, $event)\" />\n }\n }\n @case ('number') {\n @if (isRange(node)) {\n <mk-number-input class=\"mk-query-group__value mk-query-group__value--half\" [value]=\"numberValue(rangePart(node, 0))\" [size]=\"size()\" [disabled]=\"disabled()\" [placeholder]=\"i18n.queryValueFrom\" [attr.aria-label]=\"i18n.queryValueFrom\" (valueChange)=\"setRangePart(i, node, 0, $event)\" />\n <mk-number-input class=\"mk-query-group__value mk-query-group__value--half\" [value]=\"numberValue(rangePart(node, 1))\" [size]=\"size()\" [disabled]=\"disabled()\" [placeholder]=\"i18n.queryValueTo\" [attr.aria-label]=\"i18n.queryValueTo\" (valueChange)=\"setRangePart(i, node, 1, $event)\" />\n } @else {\n <mk-number-input class=\"mk-query-group__value\" [value]=\"numberValue(node.value)\" [size]=\"size()\" [disabled]=\"disabled()\" [placeholder]=\"fieldOf(node)?.placeholder ?? ''\" [attr.aria-label]=\"i18n.queryValue\" (valueChange)=\"setValue(i, node, $event)\" />\n }\n }\n @case ('date') {\n @if (isRange(node)) {\n <mk-date-picker class=\"mk-query-group__value mk-query-group__value--half\" [value]=\"dateValue(rangePart(node, 0))\" [size]=\"size()\" [disabled]=\"disabled()\" [placeholder]=\"i18n.queryValueFrom\" (valueChange)=\"setDateRange(i, node, 0, $event)\" />\n <mk-date-picker class=\"mk-query-group__value mk-query-group__value--half\" [value]=\"dateValue(rangePart(node, 1))\" [size]=\"size()\" [disabled]=\"disabled()\" [placeholder]=\"i18n.queryValueTo\" (valueChange)=\"setDateRange(i, node, 1, $event)\" />\n } @else {\n <mk-date-picker class=\"mk-query-group__value\" [value]=\"dateValue(node.value)\" [size]=\"size()\" [disabled]=\"disabled()\" (valueChange)=\"setDate(i, node, $event)\" />\n }\n }\n @default {\n <input mkInput class=\"mk-query-group__value\" type=\"text\" [value]=\"textValue(node.value)\" [size]=\"size()\" [disabled]=\"disabled()\" [placeholder]=\"fieldOf(node)?.placeholder ?? ''\" [attr.aria-label]=\"i18n.queryValue\" (input)=\"onTextInput(i, node, $event)\" />\n }\n }\n }\n <button mkButton type=\"button\" variant=\"ghost\" tone=\"neutral\" [size]=\"size()\" class=\"mk-query-group__remove\" [disabled]=\"disabled()\" [attr.aria-label]=\"i18n.queryRemoveRule\" (click)=\"removeAt(i)\">\n <mk-icon name=\"close\" size=\"sm\" />\n </button>\n </div>\n }\n }\n</div>\n","import { ChangeDetectionStrategy, Component, booleanAttribute, inject, input, model, numberAttribute } from '@angular/core';\nimport { MK_I18N, mkCreateQueryGroup, type MkQueryField, type MkQueryGroup, type MkSize } from '@mk-kit/ui/core';\nimport { MkQueryGroupComponent } from './query-group';\n\n/**\n * QueryBuilder — a rule / group tree the user assembles from your `fields`,\n * held as plain JSON (`MkQueryGroup`) in the two-way `query` model. Pair it\n * with `mkQueryToPredicate()` to filter rows in the browser, with\n * `MkTableDataSource.setQuery()` to send it to the server, or with\n * `mkQueryToText()` for a readable summary.\n *\n * ```html\n * <mk-query-builder [fields]=\"fields\" [(query)]=\"query\" allowNot />\n *\n * fields: MkQueryField[] = [\n * { key: 'name', label: 'Name' },\n * { key: 'orders', label: 'Orders', type: 'number' },\n * { key: 'status', label: 'Status', type: 'select', options: [{ label: 'Active', value: 'active' }, …] },\n * { key: 'since', label: 'Customer since', type: 'date' },\n * { key: 'vip', label: 'VIP', type: 'boolean' },\n * ];\n * rows = computed(() => this.all.filter(mkQueryToPredicate(this.query(), this.fields)));\n * ```\n */\n@Component({\n selector: 'mk-query-builder',\n template: `\n <mk-query-group\n root\n [group]=\"query()\"\n [fields]=\"fields()\"\n [depth]=\"0\"\n [maxDepth]=\"maxDepth()\"\n [allowNot]=\"allowNot()\"\n [disabled]=\"disabled()\"\n [size]=\"size()\"\n (groupChange)=\"query.set($event)\"\n />\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [MkQueryGroupComponent],\n host: {\n class: 'mk-query-builder',\n role: 'group',\n '[attr.aria-label]': 'ariaLabel() ?? i18n.queryBuilderLabel',\n style: 'display: block',\n },\n})\nexport class MkQueryBuilder {\n protected readonly i18n = inject(MK_I18N);\n\n /** The filterable fields, in picker order. */\n readonly fields = input.required<readonly MkQueryField[]>();\n /** The query tree (two-way). Starts as an empty `and` group. */\n readonly query = model<MkQueryGroup>(mkCreateQueryGroup());\n /** How deep groups may nest (0 = rules only). */\n readonly maxDepth = input(3, { transform: numberAttribute });\n /** Offer a *Not* toggle on every group. */\n readonly allowNot = input(false, { transform: booleanAttribute });\n readonly disabled = input(false, { transform: booleanAttribute });\n /** Control size (default `sm`). */\n readonly size = input<MkSize>('sm');\n readonly ariaLabel = input<string | undefined>(undefined);\n\n /** Reset to an empty group. */\n clear(): void {\n this.query.set(mkCreateQueryGroup());\n }\n}\n","/**\n * @mk-kit/ui/query-builder — `mk-query-builder`, a rule / group tree editor\n * producing an `MkQueryGroup` (types and `mkQueryToPredicate` live in core).\n */\nexport * from './query-builder';\nexport * from './query-group';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mk-kit-ui-query-builder.mjs","sources":["../../../projects/mk-kit/query-builder/query-group.ts","../../../projects/mk-kit/query-builder/query-group.html","../../../projects/mk-kit/query-builder/query-builder.ts","../../../projects/mk-kit/query-builder/index.ts","../../../projects/mk-kit/query-builder/mk-kit-ui-query-builder.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n booleanAttribute,\n computed,\n forwardRef,\n inject,\n input,\n numberAttribute,\n output,\n} from '@angular/core';\nimport {\n MK_I18N,\n MK_QUERY_UNARY,\n mkCreateQueryGroup,\n mkCreateQueryRule,\n mkIsQueryGroup,\n mkQueryOperatorLabel,\n mkQueryOperatorsFor,\n type MkQueryCombinator,\n type MkQueryField,\n type MkQueryGroup,\n type MkQueryNode,\n type MkQueryOperator,\n type MkQueryRule,\n} from '@mk-kit/ui/core';\nimport type { MkSize } from '@mk-kit/ui/core';\nimport { MkButton } from '@mk-kit/ui/button';\nimport { MkIcon } from '@mk-kit/ui/icon';\nimport { MkInput, MkMultiSelect, MkNumberInput, MkSelect, type MkSelectOption } from '@mk-kit/ui/forms';\nimport { MkDatePicker } from '@mk-kit/ui/datetime';\n\n/** Format a Date as an ISO calendar date (`YYYY-MM-DD`, local). */\nfunction toIsoDate(d: Date | null): string | null {\n if (!d) return null;\n const pad = (n: number) => String(n).padStart(2, '0');\n return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`;\n}\n\n/** Parse an ISO calendar date back into a local Date (`null` when invalid). */\nfunction fromIsoDate(v: unknown): Date | null {\n if (v instanceof Date) return v;\n if (typeof v !== 'string' || !v) return null;\n const m = /^(\\d{4})-(\\d{2})-(\\d{2})/.exec(v);\n if (!m) {\n const d = new Date(v);\n return Number.isNaN(d.getTime()) ? null : d;\n }\n return new Date(Number(m[1]), Number(m[2]) - 1, Number(m[3]));\n}\n\n/**\n * One group of the builder — its combinator toggle, rules, nested groups and\n * the add / remove actions. Used by `mk-query-builder`; every edit emits a\n * new immutable group upward.\n */\n@Component({\n selector: 'mk-query-group',\n templateUrl: './query-group.html',\n styleUrl: './query-group.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n forwardRef(() => MkQueryGroupComponent),\n MkButton,\n MkDatePicker,\n MkIcon,\n MkInput,\n MkMultiSelect,\n MkNumberInput,\n MkSelect,\n ],\n host: {\n class: 'mk-query-group',\n role: 'group',\n '[class.mk-query-group--root]': 'root()',\n '[class.mk-query-group--not]': '!!group().not',\n '[attr.aria-label]': 'root() ? null : i18n.queryAddGroup',\n },\n})\nexport class MkQueryGroupComponent {\n protected readonly i18n = inject(MK_I18N);\n\n readonly group = input.required<MkQueryGroup>();\n readonly fields = input.required<readonly MkQueryField[]>();\n readonly depth = input(0, { transform: numberAttribute });\n readonly maxDepth = input(3, { transform: numberAttribute });\n readonly allowNot = input(false, { transform: booleanAttribute });\n readonly disabled = input(false, { transform: booleanAttribute });\n readonly root = input(false, { transform: booleanAttribute });\n readonly size = input<MkSize>('sm');\n\n /** A new version of this group after an edit. */\n readonly groupChange = output<MkQueryGroup>();\n /** The user removed this (non-root) group. */\n readonly remove = output<void>();\n\n protected readonly fieldOptions = computed<MkSelectOption[]>(() =>\n this.fields().map((f) => ({ label: f.label, value: f.key })),\n );\n protected readonly canNest = computed(() => this.depth() < this.maxDepth());\n protected readonly booleanOptions = computed<MkSelectOption[]>(() => [\n { label: this.i18n.queryTrue, value: true },\n { label: this.i18n.queryFalse, value: false },\n ]);\n\n protected isGroup = mkIsQueryGroup;\n\n protected fieldOf(rule: MkQueryRule): MkQueryField | undefined {\n return this.fields().find((f) => f.key === rule.field);\n }\n\n protected typeOf(rule: MkQueryRule): string {\n return this.fieldOf(rule)?.type ?? 'string';\n }\n\n protected operatorOptions(rule: MkQueryRule): MkSelectOption[] {\n return mkQueryOperatorsFor(this.fieldOf(rule)).map((op) => ({\n label: mkQueryOperatorLabel(op, this.i18n),\n value: op,\n }));\n }\n\n protected needsValue(rule: MkQueryRule): boolean {\n return !MK_QUERY_UNARY.has(rule.operator);\n }\n\n protected selectOptions(rule: MkQueryRule): MkSelectOption[] {\n return (this.fieldOf(rule)?.options ?? []).map((o) => ({ label: o.label, value: o.value }));\n }\n\n protected isList(rule: MkQueryRule): boolean {\n return rule.operator === 'in' || rule.operator === 'notIn';\n }\n\n protected isRange(rule: MkQueryRule): boolean {\n return rule.operator === 'between';\n }\n\n protected asArray(value: unknown): unknown[] {\n return Array.isArray(value) ? value : [];\n }\n\n protected rangePart(rule: MkQueryRule, index: 0 | 1): unknown {\n return Array.isArray(rule.value) ? rule.value[index] : undefined;\n }\n\n protected dateValue(v: unknown): Date | null {\n return fromIsoDate(v);\n }\n\n protected numberValue(v: unknown): number | null {\n return typeof v === 'number' ? v : v == null || v === '' ? null : Number(v);\n }\n\n protected textValue(v: unknown): string {\n return v == null ? '' : String(v);\n }\n\n // --- Edits (all immutable) --------------------------------------------------\n\n protected setCombinator(combinator: MkQueryCombinator): void {\n if (this.group().combinator === combinator) return;\n this.groupChange.emit({ ...this.group(), combinator });\n }\n\n protected toggleNot(): void {\n this.groupChange.emit({ ...this.group(), not: !this.group().not });\n }\n\n protected addRule(): void {\n const field = this.fields()[0];\n if (!field) return;\n this.groupChange.emit({ ...this.group(), rules: [...this.group().rules, mkCreateQueryRule(field)] });\n }\n\n protected addGroup(): void {\n this.groupChange.emit({ ...this.group(), rules: [...this.group().rules, mkCreateQueryGroup()] });\n }\n\n protected removeAt(index: number): void {\n this.groupChange.emit({ ...this.group(), rules: this.group().rules.filter((_, i) => i !== index) });\n }\n\n protected replaceAt(index: number, node: MkQueryNode): void {\n this.groupChange.emit({ ...this.group(), rules: this.group().rules.map((n, i) => (i === index ? node : n)) });\n }\n\n protected setField(index: number, rule: MkQueryRule, key: unknown): void {\n const field = this.fields().find((f) => f.key === key);\n if (!field || field.key === rule.field) return;\n const ops = mkQueryOperatorsFor(field);\n const operator = ops.includes(rule.operator) ? rule.operator : ops[0];\n this.replaceAt(index, { ...rule, field: field.key, operator, value: undefined });\n }\n\n protected setOperator(index: number, rule: MkQueryRule, op: unknown): void {\n const operator = op as MkQueryOperator;\n if (operator === rule.operator) return;\n const shapeChanged =\n MK_QUERY_UNARY.has(operator) !== MK_QUERY_UNARY.has(rule.operator) ||\n (operator === 'between') !== (rule.operator === 'between') ||\n this.isList({ ...rule, operator }) !== this.isList(rule);\n this.replaceAt(index, { ...rule, operator, value: shapeChanged ? undefined : rule.value });\n }\n\n protected setValue(index: number, rule: MkQueryRule, value: unknown): void {\n this.replaceAt(index, { ...rule, value });\n }\n\n protected setRangePart(index: number, rule: MkQueryRule, part: 0 | 1, value: unknown): void {\n const current = Array.isArray(rule.value) ? [...rule.value] : [undefined, undefined];\n current[part] = value;\n this.setValue(index, rule, current);\n }\n\n protected setDate(index: number, rule: MkQueryRule, d: Date | null): void {\n this.setValue(index, rule, toIsoDate(d));\n }\n\n protected setDateRange(index: number, rule: MkQueryRule, part: 0 | 1, d: Date | null): void {\n this.setRangePart(index, rule, part, toIsoDate(d));\n }\n\n protected onTextInput(index: number, rule: MkQueryRule, event: Event): void {\n this.setValue(index, rule, (event.target as HTMLInputElement).value);\n }\n}\n","@let g = group();\n<div class=\"mk-query-group__bar\">\n <div class=\"mk-query-group__combinator\" role=\"group\" [attr.aria-label]=\"i18n.queryOperator\">\n <button\n type=\"button\"\n class=\"mk-query-group__toggle\"\n [class.mk-query-group__toggle--active]=\"g.combinator === 'and'\"\n [attr.aria-pressed]=\"g.combinator === 'and'\"\n [disabled]=\"disabled()\"\n (click)=\"setCombinator('and')\"\n >{{ i18n.queryAnd }}</button>\n <button\n type=\"button\"\n class=\"mk-query-group__toggle\"\n [class.mk-query-group__toggle--active]=\"g.combinator === 'or'\"\n [attr.aria-pressed]=\"g.combinator === 'or'\"\n [disabled]=\"disabled()\"\n (click)=\"setCombinator('or')\"\n >{{ i18n.queryOr }}</button>\n </div>\n @if (allowNot()) {\n <button\n type=\"button\"\n class=\"mk-query-group__toggle mk-query-group__toggle--not\"\n [class.mk-query-group__toggle--active]=\"!!g.not\"\n [attr.aria-pressed]=\"!!g.not\"\n [disabled]=\"disabled()\"\n (click)=\"toggleNot()\"\n >{{ i18n.queryNot }}</button>\n }\n <span class=\"mk-query-group__spacer\"></span>\n <button mkButton type=\"button\" variant=\"ghost\" tone=\"neutral\" [size]=\"size()\" [disabled]=\"disabled() || !fields().length\" (click)=\"addRule()\">\n <mk-icon name=\"plus\" size=\"sm\" /> {{ i18n.queryAddRule }}\n </button>\n @if (canNest()) {\n <button mkButton type=\"button\" variant=\"ghost\" tone=\"neutral\" [size]=\"size()\" [disabled]=\"disabled()\" (click)=\"addGroup()\">\n <mk-icon name=\"layers\" size=\"sm\" /> {{ i18n.queryAddGroup }}\n </button>\n }\n @if (!root()) {\n <button mkButton type=\"button\" variant=\"ghost\" tone=\"neutral\" [size]=\"size()\" class=\"mk-query-group__remove\" [disabled]=\"disabled()\" [attr.aria-label]=\"i18n.queryRemoveGroup\" (click)=\"remove.emit()\">\n <mk-icon name=\"trash\" size=\"sm\" />\n </button>\n }\n</div>\n\n<div class=\"mk-query-group__rules\">\n @if (!g.rules.length) {\n <p class=\"mk-query-group__empty\">{{ i18n.queryEmptyGroup }}</p>\n }\n @for (node of g.rules; track node.id; let i = $index) {\n @if (isGroup(node)) {\n <mk-query-group\n [group]=\"node\"\n [fields]=\"fields()\"\n [depth]=\"depth() + 1\"\n [maxDepth]=\"maxDepth()\"\n [allowNot]=\"allowNot()\"\n [disabled]=\"disabled()\"\n [size]=\"size()\"\n (groupChange)=\"replaceAt(i, $event)\"\n (remove)=\"removeAt(i)\"\n />\n } @else {\n <div class=\"mk-query-group__rule\" role=\"group\">\n <mk-select\n class=\"mk-query-group__field\"\n [options]=\"fieldOptions()\"\n [value]=\"node.field\"\n [size]=\"size()\"\n [disabled]=\"disabled()\"\n [attr.aria-label]=\"i18n.queryField\"\n (valueChange)=\"setField(i, node, $event)\"\n />\n <mk-select\n class=\"mk-query-group__operator\"\n [options]=\"operatorOptions(node)\"\n [value]=\"node.operator\"\n [size]=\"size()\"\n [disabled]=\"disabled()\"\n [attr.aria-label]=\"i18n.queryOperator\"\n (valueChange)=\"setOperator(i, node, $event)\"\n />\n @if (needsValue(node)) {\n @switch (typeOf(node)) {\n @case ('boolean') {\n <mk-select class=\"mk-query-group__value\" [options]=\"booleanOptions()\" [value]=\"node.value ?? null\" [size]=\"size()\" [disabled]=\"disabled()\" [attr.aria-label]=\"i18n.queryValue\" (valueChange)=\"setValue(i, node, $event)\" />\n }\n @case ('select') {\n @if (isList(node)) {\n <mk-multi-select class=\"mk-query-group__value\" [options]=\"selectOptions(node)\" [value]=\"asArray(node.value)\" [size]=\"size()\" [disabled]=\"disabled()\" [attr.aria-label]=\"i18n.queryValue\" (valueChange)=\"setValue(i, node, $event)\" />\n } @else {\n <mk-select class=\"mk-query-group__value\" [options]=\"selectOptions(node)\" [value]=\"node.value ?? null\" [size]=\"size()\" [disabled]=\"disabled()\" [attr.aria-label]=\"i18n.queryValue\" (valueChange)=\"setValue(i, node, $event)\" />\n }\n }\n @case ('number') {\n @if (isRange(node)) {\n <mk-number-input class=\"mk-query-group__value mk-query-group__value--half\" [value]=\"numberValue(rangePart(node, 0))\" [size]=\"size()\" [disabled]=\"disabled()\" [placeholder]=\"i18n.queryValueFrom\" [attr.aria-label]=\"i18n.queryValueFrom\" (valueChange)=\"setRangePart(i, node, 0, $event)\" />\n <mk-number-input class=\"mk-query-group__value mk-query-group__value--half\" [value]=\"numberValue(rangePart(node, 1))\" [size]=\"size()\" [disabled]=\"disabled()\" [placeholder]=\"i18n.queryValueTo\" [attr.aria-label]=\"i18n.queryValueTo\" (valueChange)=\"setRangePart(i, node, 1, $event)\" />\n } @else {\n <mk-number-input class=\"mk-query-group__value\" [value]=\"numberValue(node.value)\" [size]=\"size()\" [disabled]=\"disabled()\" [placeholder]=\"fieldOf(node)?.placeholder ?? ''\" [attr.aria-label]=\"i18n.queryValue\" (valueChange)=\"setValue(i, node, $event)\" />\n }\n }\n @case ('date') {\n @if (isRange(node)) {\n <mk-date-picker class=\"mk-query-group__value mk-query-group__value--half\" [value]=\"dateValue(rangePart(node, 0))\" [size]=\"size()\" [disabled]=\"disabled()\" [placeholder]=\"i18n.queryValueFrom\" (valueChange)=\"setDateRange(i, node, 0, $event)\" />\n <mk-date-picker class=\"mk-query-group__value mk-query-group__value--half\" [value]=\"dateValue(rangePart(node, 1))\" [size]=\"size()\" [disabled]=\"disabled()\" [placeholder]=\"i18n.queryValueTo\" (valueChange)=\"setDateRange(i, node, 1, $event)\" />\n } @else {\n <mk-date-picker class=\"mk-query-group__value\" [value]=\"dateValue(node.value)\" [size]=\"size()\" [disabled]=\"disabled()\" (valueChange)=\"setDate(i, node, $event)\" />\n }\n }\n @default {\n <input mkInput class=\"mk-query-group__value\" type=\"text\" [value]=\"textValue(node.value)\" [size]=\"size()\" [disabled]=\"disabled()\" [placeholder]=\"fieldOf(node)?.placeholder ?? ''\" [attr.aria-label]=\"i18n.queryValue\" (input)=\"onTextInput(i, node, $event)\" />\n }\n }\n }\n <button mkButton type=\"button\" variant=\"ghost\" tone=\"neutral\" [size]=\"size()\" class=\"mk-query-group__remove\" [disabled]=\"disabled()\" [attr.aria-label]=\"i18n.queryRemoveRule\" (click)=\"removeAt(i)\">\n <mk-icon name=\"close\" size=\"sm\" />\n </button>\n </div>\n }\n }\n</div>\n","import { ChangeDetectionStrategy, Component, booleanAttribute, inject, input, model, numberAttribute } from '@angular/core';\nimport { MK_I18N, mkCreateQueryGroup, type MkQueryField, type MkQueryGroup, type MkSize } from '@mk-kit/ui/core';\nimport { MkQueryGroupComponent } from './query-group';\n\n/**\n * QueryBuilder — a rule / group tree the user assembles from your `fields`,\n * held as plain JSON (`MkQueryGroup`) in the two-way `query` model. Pair it\n * with `mkQueryToPredicate()` to filter rows in the browser, with\n * `MkTableDataSource.setQuery()` to send it to the server, or with\n * `mkQueryToText()` for a readable summary.\n *\n * ```html\n * <mk-query-builder [fields]=\"fields\" [(query)]=\"query\" allowNot />\n *\n * fields: MkQueryField[] = [\n * { key: 'name', label: 'Name' },\n * { key: 'orders', label: 'Orders', type: 'number' },\n * { key: 'status', label: 'Status', type: 'select', options: [{ label: 'Active', value: 'active' }, …] },\n * { key: 'since', label: 'Customer since', type: 'date' },\n * { key: 'vip', label: 'VIP', type: 'boolean' },\n * ];\n * rows = computed(() => this.all.filter(mkQueryToPredicate(this.query(), this.fields)));\n * ```\n */\n@Component({\n selector: 'mk-query-builder',\n template: `\n <mk-query-group\n root\n [group]=\"query()\"\n [fields]=\"fields()\"\n [depth]=\"0\"\n [maxDepth]=\"maxDepth()\"\n [allowNot]=\"allowNot()\"\n [disabled]=\"disabled()\"\n [size]=\"size()\"\n (groupChange)=\"query.set($event)\"\n />\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [MkQueryGroupComponent],\n host: {\n class: 'mk-query-builder',\n role: 'group',\n '[attr.aria-label]': 'ariaLabel() ?? i18n.queryBuilderLabel',\n style: 'display: block',\n },\n})\nexport class MkQueryBuilder {\n protected readonly i18n = inject(MK_I18N);\n\n /** The filterable fields, in picker order. */\n readonly fields = input.required<readonly MkQueryField[]>();\n /** The query tree (two-way). Starts as an empty `and` group. */\n readonly query = model<MkQueryGroup>(mkCreateQueryGroup());\n /** How deep groups may nest (0 = rules only). */\n readonly maxDepth = input(3, { transform: numberAttribute });\n /** Offer a *Not* toggle on every group. */\n readonly allowNot = input(false, { transform: booleanAttribute });\n readonly disabled = input(false, { transform: booleanAttribute });\n /** Control size (default `sm`). */\n readonly size = input<MkSize>('sm');\n readonly ariaLabel = input<string | undefined>(undefined);\n\n /** Reset to an empty group. */\n clear(): void {\n this.query.set(mkCreateQueryGroup());\n }\n}\n","/**\n * @mk-kit/ui/query-builder — `mk-query-builder`, a rule / group tree editor\n * producing an `MkQueryGroup` (types and `mkQueryToPredicate` live in core).\n */\nexport * from './query-builder';\nexport * from './query-group';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;AAgCA;AACA,SAAS,SAAS,CAAC,CAAc,EAAA;AAC/B,IAAA,IAAI,CAAC,CAAC;AAAE,QAAA,OAAO,IAAI;AACnB,IAAA,MAAM,GAAG,GAAG,CAAC,CAAS,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;IACrD,OAAO,CAAA,EAAG,CAAC,CAAC,WAAW,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAA,CAAA,EAAI,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAA,CAAE;AAC1E;AAEA;AACA,SAAS,WAAW,CAAC,CAAU,EAAA;IAC7B,IAAI,CAAC,YAAY,IAAI;AAAE,QAAA,OAAO,CAAC;AAC/B,IAAA,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC;AAAE,QAAA,OAAO,IAAI;IAC5C,MAAM,CAAC,GAAG,0BAA0B,CAAC,IAAI,CAAC,CAAC,CAAC;IAC5C,IAAI,CAAC,CAAC,EAAE;AACN,QAAA,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC;AACrB,QAAA,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC;IAC7C;AACA,IAAA,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/D;AAEA;;;;AAIG;MAwBU,qBAAqB,CAAA;AACb,IAAA,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC;IAEhC,KAAK,GAAG,KAAK,CAAC,QAAQ;8EAAgB;IACtC,MAAM,GAAG,KAAK,CAAC,QAAQ;+EAA2B;IAClD,KAAK,GAAG,KAAK,CAAC,CAAC,6EAAI,SAAS,EAAE,eAAe,EAAA,CAAG;IAChD,QAAQ,GAAG,KAAK,CAAC,CAAC,gFAAI,SAAS,EAAE,eAAe,EAAA,CAAG;IACnD,QAAQ,GAAG,KAAK,CAAC,KAAK,gFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;IACxD,QAAQ,GAAG,KAAK,CAAC,KAAK,gFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;IACxD,IAAI,GAAG,KAAK,CAAC,KAAK,4EAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;IACpD,IAAI,GAAG,KAAK,CAAS,IAAI;6EAAC;;IAG1B,WAAW,GAAG,MAAM,EAAgB;;IAEpC,MAAM,GAAG,MAAM,EAAQ;AAEb,IAAA,YAAY,GAAG,QAAQ,CAAmB,MAC3D,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;qFAC7D;AACkB,IAAA,OAAO,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE;gFAAC;AACxD,IAAA,cAAc,GAAG,QAAQ,CAAmB,MAAM;QACnE,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE;QAC3C,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE;AAC9C,KAAA;uFAAC;IAEQ,OAAO,GAAG,cAAc;AAExB,IAAA,OAAO,CAAC,IAAiB,EAAA;QACjC,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,KAAK,CAAC;IACxD;AAEU,IAAA,MAAM,CAAC,IAAiB,EAAA;QAChC,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,IAAI,QAAQ;IAC7C;AAEU,IAAA,eAAe,CAAC,IAAiB,EAAA;AACzC,QAAA,OAAO,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM;YAC1D,KAAK,EAAE,oBAAoB,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC;AAC1C,YAAA,KAAK,EAAE,EAAE;AACV,SAAA,CAAC,CAAC;IACL;AAEU,IAAA,UAAU,CAAC,IAAiB,EAAA;QACpC,OAAO,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC;IAC3C;AAEU,IAAA,aAAa,CAAC,IAAiB,EAAA;AACvC,QAAA,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,OAAO,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;IAC7F;AAEU,IAAA,MAAM,CAAC,IAAiB,EAAA;QAChC,OAAO,IAAI,CAAC,QAAQ,KAAK,IAAI,IAAI,IAAI,CAAC,QAAQ,KAAK,OAAO;IAC5D;AAEU,IAAA,OAAO,CAAC,IAAiB,EAAA;AACjC,QAAA,OAAO,IAAI,CAAC,QAAQ,KAAK,SAAS;IACpC;AAEU,IAAA,OAAO,CAAC,KAAc,EAAA;AAC9B,QAAA,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,EAAE;IAC1C;IAEU,SAAS,CAAC,IAAiB,EAAE,KAAY,EAAA;QACjD,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,SAAS;IAClE;AAEU,IAAA,SAAS,CAAC,CAAU,EAAA;AAC5B,QAAA,OAAO,WAAW,CAAC,CAAC,CAAC;IACvB;AAEU,IAAA,WAAW,CAAC,CAAU,EAAA;AAC9B,QAAA,OAAO,OAAO,CAAC,KAAK,QAAQ,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,GAAG,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC;IAC7E;AAEU,IAAA,SAAS,CAAC,CAAU,EAAA;AAC5B,QAAA,OAAO,CAAC,IAAI,IAAI,GAAG,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC;IACnC;;AAIU,IAAA,aAAa,CAAC,UAA6B,EAAA;AACnD,QAAA,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC,UAAU,KAAK,UAAU;YAAE;AAC5C,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,EAAE,UAAU,EAAE,CAAC;IACxD;IAEU,SAAS,GAAA;QACjB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,CAAC;IACpE;IAEU,OAAO,GAAA;QACf,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;AAC9B,QAAA,IAAI,CAAC,KAAK;YAAE;AACZ,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,iBAAiB,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;IACtG;IAEU,QAAQ,GAAA;AAChB,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,kBAAkB,EAAE,CAAC,EAAE,CAAC;IAClG;AAEU,IAAA,QAAQ,CAAC,KAAa,EAAA;AAC9B,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,EAAE,CAAC;IACrG;IAEU,SAAS,CAAC,KAAa,EAAE,IAAiB,EAAA;QAClD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/G;AAEU,IAAA,QAAQ,CAAC,KAAa,EAAE,IAAiB,EAAE,GAAY,EAAA;QAC/D,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC;QACtD,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,GAAG,KAAK,IAAI,CAAC,KAAK;YAAE;AACxC,QAAA,MAAM,GAAG,GAAG,mBAAmB,CAAC,KAAK,CAAC;QACtC,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC,CAAC,CAAC;QACrE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;IAClF;AAEU,IAAA,WAAW,CAAC,KAAa,EAAE,IAAiB,EAAE,EAAW,EAAA;QACjE,MAAM,QAAQ,GAAG,EAAqB;AACtC,QAAA,IAAI,QAAQ,KAAK,IAAI,CAAC,QAAQ;YAAE;AAChC,QAAA,MAAM,YAAY,GAChB,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC;YAClE,CAAC,QAAQ,KAAK,SAAS,OAAO,IAAI,CAAC,QAAQ,KAAK,SAAS,CAAC;AAC1D,YAAA,IAAI,CAAC,MAAM,CAAC,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;QAC1D,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,GAAG,SAAS,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;IAC5F;AAEU,IAAA,QAAQ,CAAC,KAAa,EAAE,IAAiB,EAAE,KAAc,EAAA;AACjE,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,CAAC;IAC3C;AAEU,IAAA,YAAY,CAAC,KAAa,EAAE,IAAiB,EAAE,IAAW,EAAE,KAAc,EAAA;QAClF,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC;AACpF,QAAA,OAAO,CAAC,IAAI,CAAC,GAAG,KAAK;QACrB,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC;IACrC;AAEU,IAAA,OAAO,CAAC,KAAa,EAAE,IAAiB,EAAE,CAAc,EAAA;AAChE,QAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;IAC1C;AAEU,IAAA,YAAY,CAAC,KAAa,EAAE,IAAiB,EAAE,IAAW,EAAE,CAAc,EAAA;AAClF,QAAA,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;IACpD;AAEU,IAAA,WAAW,CAAC,KAAa,EAAE,IAAiB,EAAE,KAAY,EAAA;AAClE,QAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,EAAG,KAAK,CAAC,MAA2B,CAAC,KAAK,CAAC;IACtE;uGAlJW,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAArB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,qBAAqB,m1CC/ElC,wrNA2HA,EAAA,MAAA,EAAA,CAAA,q4EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,UAAA,CAAA,MD5Ca,qBAAqB,CAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,OAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,MAAA,EAAA,MAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,UAAA,CAAA,MAhB9B,QAAQ,CAAA,EAAA,QAAA,EAAA,+BAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,MAAA,EAAA,MAAA,EAAA,SAAA,EAAA,WAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,UAAA,CAAA,MACR,YAAY,CAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,YAAA,EAAA,KAAA,EAAA,KAAA,EAAA,cAAA,EAAA,aAAA,EAAA,eAAA,EAAA,UAAA,EAAA,WAAA,EAAA,SAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,MAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,UAAA,CAAA,MACZ,MAAM,4GACN,OAAO,CAAA,EAAA,QAAA,EAAA,mCAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,UAAA,CAAA,MACP,aAAa,CAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,SAAA,EAAA,aAAA,EAAA,MAAA,EAAA,SAAA,EAAA,UAAA,EAAA,UAAA,EAAA,YAAA,EAAA,UAAA,EAAA,SAAA,EAAA,KAAA,EAAA,eAAA,EAAA,cAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,aAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,UAAA,CAAA,MACb,aAAa,4NACb,QAAQ,CAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,SAAA,EAAA,aAAA,EAAA,MAAA,EAAA,SAAA,EAAA,UAAA,EAAA,UAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAUC,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAvBjC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,gBAAgB,EAAA,eAAA,EAGT,uBAAuB,CAAC,MAAM,EAAA,OAAA,EACtC;AACP,wBAAA,UAAU,CAAC,MAAK,qBAAsB,CAAC;wBACvC,QAAQ;wBACR,YAAY;wBACZ,MAAM;wBACN,OAAO;wBACP,aAAa;wBACb,aAAa;wBACb,QAAQ;qBACT,EAAA,IAAA,EACK;AACJ,wBAAA,KAAK,EAAE,gBAAgB;AACvB,wBAAA,IAAI,EAAE,OAAO;AACb,wBAAA,8BAA8B,EAAE,QAAQ;AACxC,wBAAA,6BAA6B,EAAE,eAAe;AAC9C,wBAAA,mBAAmB,EAAE,oCAAoC;AAC1D,qBAAA,EAAA,QAAA,EAAA,wrNAAA,EAAA,MAAA,EAAA,CAAA,q4EAAA,CAAA,EAAA;;;AEzEH;;;;;;;;;;;;;;;;;;;AAmBG;MAyBU,cAAc,CAAA;AACN,IAAA,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC;;IAGhC,MAAM,GAAG,KAAK,CAAC,QAAQ;+EAA2B;;AAElD,IAAA,KAAK,GAAG,KAAK,CAAe,kBAAkB,EAAE;8EAAC;;IAEjD,QAAQ,GAAG,KAAK,CAAC,CAAC,gFAAI,SAAS,EAAE,eAAe,EAAA,CAAG;;IAEnD,QAAQ,GAAG,KAAK,CAAC,KAAK,gFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;IACxD,QAAQ,GAAG,KAAK,CAAC,KAAK,gFAAI,SAAS,EAAE,gBAAgB,EAAA,CAAG;;IAExD,IAAI,GAAG,KAAK,CAAS,IAAI;6EAAC;IAC1B,SAAS,GAAG,KAAK,CAAqB,SAAS;kFAAC;;IAGzD,KAAK,GAAA;QACH,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,kBAAkB,EAAE,CAAC;IACtC;uGAnBW,cAAc,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAd,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,cAAc,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,KAAA,EAAA,aAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,MAAA,EAAA,OAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,uCAAA,EAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,cAAA,EAAA,kBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAtBf;;;;;;;;;;;;AAYT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAES,qBAAqB,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,OAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,MAAA,EAAA,MAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,QAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAQpB,cAAc,EAAA,UAAA,EAAA,CAAA;kBAxB1B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,kBAAkB;AAC5B,oBAAA,QAAQ,EAAE;;;;;;;;;;;;AAYT,EAAA,CAAA;oBACD,eAAe,EAAE,uBAAuB,CAAC,MAAM;oBAC/C,OAAO,EAAE,CAAC,qBAAqB,CAAC;AAChC,oBAAA,IAAI,EAAE;AACJ,wBAAA,KAAK,EAAE,kBAAkB;AACzB,wBAAA,IAAI,EAAE,OAAO;AACb,wBAAA,mBAAmB,EAAE,uCAAuC;AAC5D,wBAAA,KAAK,EAAE,gBAAgB;AACxB,qBAAA;AACF,iBAAA;;;AC/CD;;;AAGG;;ACHH;;AAEG;;;;"}
@@ -1,7 +1,7 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { inject, DOCUMENT, ElementRef, viewChild, input, booleanAttribute, output, signal, computed, afterRenderEffect, ChangeDetectionStrategy, Component, model, forwardRef } from '@angular/core';
3
3
  import { NG_VALUE_ACCESSOR } from '@angular/forms';
4
- import { MK_I18N, MkFieldContext } from '@mk-kit/ui/core';
4
+ import { MK_I18N, MkFieldContext, mkInjectFieldTouched } from '@mk-kit/ui/core';
5
5
 
6
6
  /**
7
7
  * Rich-text engine — an accessible contenteditable surface with a floating
@@ -453,6 +453,8 @@ function sanitizeInlineHtml(html) {
453
453
  */
454
454
  class MkRichText {
455
455
  field = inject(MkFieldContext, { optional: true });
456
+ /** Signal Forms: gates `invalid` until the bound field is touched or dirty. */
457
+ fieldTouched = mkInjectFieldTouched();
456
458
  i18n = inject(MK_I18N);
457
459
  /** Two-way HTML string value (sanitised; `''` when visually empty). */
458
460
  value = model('', /* @ts-ignore */
@@ -475,7 +477,7 @@ class MkRichText {
475
477
  onTouched = () => { };
476
478
  isDisabled = computed(() => this.disabled() || this.cvaDisabled(), /* @ts-ignore */
477
479
  ...(ngDevMode ? [{ debugName: "isDisabled" }] : /* istanbul ignore next */ []));
478
- isInvalid = computed(() => this.invalid() || (this.field?.hasError() ?? false), /* @ts-ignore */
480
+ isInvalid = computed(() => (this.invalid() && this.fieldTouched()) || (this.field?.hasError() ?? false), /* @ts-ignore */
479
481
  ...(ngDevMode ? [{ debugName: "isInvalid" }] : /* istanbul ignore next */ []));
480
482
  labelledBy = this.field?.labelId ?? null;
481
483
  describedBy = computed(() => this.field?.describedBy() ?? null, /* @ts-ignore */
@@ -1 +1 @@
1
- {"version":3,"file":"mk-kit-ui-rich-text.mjs","sources":["../../../projects/mk-kit/rich-text/rich-text-engine.ts","../../../projects/mk-kit/rich-text/rich-text-engine.html","../../../projects/mk-kit/rich-text/sanitize.ts","../../../projects/mk-kit/rich-text/rich-text.ts","../../../projects/mk-kit/rich-text/rich-text.html","../../../projects/mk-kit/rich-text/index.ts","../../../projects/mk-kit/rich-text/mk-kit-ui-rich-text.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n DOCUMENT,\n ElementRef,\n OnDestroy,\n afterRenderEffect,\n booleanAttribute,\n computed,\n inject,\n input,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { MK_I18N } from '@mk-kit/ui/core';\n\n/** Payload for a split (Enter) event: text before/after the caret. */\nexport interface MkRichTextSplit {\n before: string;\n after: string;\n}\n\n/** A formatting command exposed by the floating toolbar. */\ninterface MkInlineTool {\n id: string;\n label: string;\n icon: string;\n shortcut?: string;\n}\n\n/**\n * Rich-text engine — an accessible contenteditable surface with a floating\n * inline formatting toolbar (Bold, Italic, Underline, Strikethrough, Inline\n * code, Link, Clear). Built on the native Selection API +\n * `document.execCommand` (deprecated but universally supported and\n * dependency-free — the only practical way to do inline formatting without a\n * heavyweight editor engine).\n *\n * This is the low-level building block: it emits HTML via `contentChange`, and\n * structural intents (`splitAt`, `removeEmpty`, `arrowOut`) so a block-editor\n * host can create, merge or navigate blocks. For a standalone form control use\n * {@link MkRichText} (`<mk-rich-text>`), which wraps this engine in a CVA over\n * a sanitised HTML string.\n */\n@Component({\n selector: 'mk-rich-text-engine',\n templateUrl: './rich-text-engine.html',\n styleUrl: './rich-text-engine.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'mk-rich-text' },\n})\nexport class MkRichTextEngine implements OnDestroy {\n private readonly document = inject(DOCUMENT);\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly editableRef = viewChild.required<ElementRef<HTMLElement>>('editable');\n protected readonly i18n = inject(MK_I18N);\n /** Pending toolbar-hide delay from `onBlur`; cleared on destroy. */\n private blurTimer: ReturnType<typeof setTimeout> | null = null;\n\n /** Current HTML content. */\n readonly html = input<string>('');\n /** Placeholder shown when empty. */\n readonly placeholder = input<string>('');\n /** Disable editing. */\n readonly disabled = input(false, { transform: booleanAttribute });\n /** Allow soft line breaks (Shift+Enter). Plain Enter always splits. */\n readonly multiline = input(true, { transform: booleanAttribute });\n /**\n * Emit `splitAt` on Enter (block-editor hosts). When `false` — standalone\n * field usage — Enter inserts a line break inside this surface instead.\n */\n readonly splitOnEnter = input(true, { transform: booleanAttribute });\n /** Minimum height of the editable surface (any CSS length). */\n readonly minHeight = input<string | null>(null);\n /** Accessible label for the editable region. */\n readonly ariaLabel = input<string>(this.i18n.blockEditor.editableText);\n /** Id of an external label element, for `aria-labelledby`. */\n readonly labelledBy = input<string | null>(null);\n /** Space-separated id list for `aria-describedby`. */\n readonly describedBy = input<string | null>(null);\n /** Reflect an invalid state via `aria-invalid`. */\n readonly invalid = input(false, { transform: booleanAttribute });\n\n /** Fired on every edit with the sanitised-by-construction HTML. */\n readonly contentChange = output<string>();\n /** Enter pressed: `before` stays in this block, `after` starts a new one. */\n readonly splitAt = output<MkRichTextSplit>();\n /** Backspace at the very start of an empty block. */\n readonly removeEmpty = output<void>();\n /** Caret tried to leave the top/bottom edge with an arrow key. */\n readonly arrowOut = output<'up' | 'down'>();\n /** Focus/blur bubbled so the wrapper can show selection chrome. */\n readonly focusChange = output<boolean>();\n\n protected readonly isEmpty = signal(true);\n protected readonly toolbar = signal<{ visible: boolean; top: number; left: number }>({\n visible: false,\n top: 0,\n left: 0,\n });\n protected readonly activeFormats = signal<Set<string>>(new Set());\n\n protected readonly tools: MkInlineTool[] = [\n { id: 'bold', label: this.i18n.blockEditor.bold, icon: 'B', shortcut: 'Ctrl+B' },\n { id: 'italic', label: this.i18n.blockEditor.italic, icon: 'I', shortcut: 'Ctrl+I' },\n { id: 'underline', label: this.i18n.blockEditor.underline, icon: 'U', shortcut: 'Ctrl+U' },\n { id: 'strikeThrough', label: this.i18n.blockEditor.strikethrough, icon: 'S' },\n { id: 'code', label: this.i18n.blockEditor.inlineCode, icon: '</>' },\n { id: 'link', label: this.i18n.blockEditor.link, icon: '🔗' },\n { id: 'clear', label: this.i18n.blockEditor.clearFormatting, icon: '⌫' },\n ];\n\n protected readonly showPlaceholder = computed(() => this.isEmpty());\n\n constructor() {\n // Sync the DOM from the `html` input only when the user is not actively\n // editing this element — otherwise setting innerHTML would reset the caret.\n afterRenderEffect(() => {\n const value = this.html() ?? '';\n const el = this.editableRef().nativeElement;\n if (this.document.activeElement === el) return;\n if (el.innerHTML !== value) el.innerHTML = value;\n this.isEmpty.set(this.computeEmpty(el));\n });\n }\n\n /** Places the caret and focuses (called by the host for navigation). */\n focus(position: 'start' | 'end' = 'end'): void {\n const el = this.editableRef().nativeElement;\n el.focus();\n this.setCaret(el, position);\n }\n\n protected onInput(): void {\n const el = this.editableRef().nativeElement;\n this.isEmpty.set(this.computeEmpty(el));\n this.contentChange.emit(el.innerHTML);\n }\n\n protected onFocus(): void {\n this.focusChange.emit(true);\n }\n\n ngOnDestroy(): void {\n if (this.blurTimer !== null) {\n clearTimeout(this.blurTimer);\n this.blurTimer = null;\n }\n }\n\n protected onBlur(): void {\n this.focusChange.emit(false);\n // Hide the toolbar on a delay, but only if focus really left the\n // component — Tabbing into the toolbar itself must not dismiss it.\n if (this.blurTimer !== null) clearTimeout(this.blurTimer);\n this.blurTimer = setTimeout(() => {\n this.blurTimer = null;\n const active = this.document.activeElement;\n if (active && this.host.nativeElement.contains(active)) return;\n this.toolbar.update((t) => (t.visible ? { ...t, visible: false } : t));\n }, 150);\n }\n\n protected onSelectionChange(): void {\n this.updateToolbar();\n }\n\n protected onKeydown(event: KeyboardEvent): void {\n if (this.disabled()) return;\n const el = this.editableRef().nativeElement;\n\n if (event.key === 'Enter' && !event.shiftKey) {\n event.preventDefault();\n if (this.splitOnEnter()) this.emitSplit(el);\n else this.insertLineBreak();\n return;\n }\n // Shift+Enter in single-line mode is a hard split too.\n if (event.key === 'Enter' && event.shiftKey && !this.multiline()) {\n event.preventDefault();\n if (this.splitOnEnter()) this.emitSplit(el);\n else this.insertLineBreak();\n return;\n }\n if (event.key === 'Backspace' && this.isCaretAtStart(el) && this.isSelectionCollapsed()) {\n if (this.computeEmpty(el)) {\n event.preventDefault();\n this.removeEmpty.emit();\n }\n return;\n }\n if (event.key === 'ArrowUp' && this.isCaretAtStart(el) && this.isSelectionCollapsed()) {\n event.preventDefault();\n this.arrowOut.emit('up');\n return;\n }\n if (event.key === 'ArrowDown' && this.isCaretAtEnd(el) && this.isSelectionCollapsed()) {\n event.preventDefault();\n this.arrowOut.emit('down');\n return;\n }\n }\n\n /** Escape inside the toolbar returns focus to the text; arrows move tools. */\n protected onToolbarKeydown(event: KeyboardEvent): void {\n if (event.key === 'Escape') {\n event.preventDefault();\n event.stopPropagation();\n this.toolbar.update((t) => ({ ...t, visible: false }));\n this.editableRef().nativeElement.focus();\n return;\n }\n if (event.key === 'ArrowRight' || event.key === 'ArrowLeft') {\n const bar = event.currentTarget as HTMLElement;\n const buttons = Array.from(bar.querySelectorAll<HTMLButtonElement>('.mk-rich-text__tool'));\n const current = buttons.indexOf(this.document.activeElement as HTMLButtonElement);\n if (current === -1 || buttons.length === 0) return;\n event.preventDefault();\n const delta = event.key === 'ArrowRight' ? 1 : -1;\n buttons[(current + delta + buttons.length) % buttons.length].focus();\n }\n }\n\n /** Runs a toolbar command, keeping the model + toolbar state in sync. */\n protected runTool(id: string): void {\n const el = this.editableRef().nativeElement;\n el.focus();\n switch (id) {\n case 'bold':\n case 'italic':\n case 'underline':\n case 'strikeThrough':\n this.document.execCommand(id);\n break;\n case 'code':\n this.wrapInlineCode();\n break;\n case 'link':\n this.applyLink();\n break;\n case 'clear':\n this.document.execCommand('removeFormat');\n this.document.execCommand('unlink');\n break;\n }\n this.onInput();\n this.updateToolbar();\n }\n\n protected isActive(id: string): boolean {\n return this.activeFormats().has(id);\n }\n\n // --- internals ------------------------------------------------------------\n\n private emitSplit(el: HTMLElement): void {\n const { before, after } = this.splitHtmlAtCaret(el);\n this.splitAt.emit({ before, after });\n }\n\n /** Inserts a `<br>` at the caret (Enter in `splitOnEnter=false` mode). */\n private insertLineBreak(): void {\n // insertHTML keeps the markup to the sanitiser's allow-list (`<br>`),\n // unlike the browser's default Enter handling which wraps lines in divs.\n this.document.execCommand('insertHTML', false, '<br>');\n this.onInput();\n }\n\n /** Extracts markup after the caret so the host can start a new block with it. */\n private splitHtmlAtCaret(el: HTMLElement): MkRichTextSplit {\n const selection = this.document.defaultView?.getSelection();\n if (!selection || selection.rangeCount === 0) {\n return { before: el.innerHTML, after: '' };\n }\n const range = selection.getRangeAt(0);\n const tail = range.cloneRange();\n tail.selectNodeContents(el);\n tail.setStart(range.endContainer, range.endOffset);\n const fragment = tail.cloneContents();\n const holder = this.document.createElement('div');\n holder.appendChild(fragment);\n const after = holder.innerHTML;\n\n const head = range.cloneRange();\n head.selectNodeContents(el);\n head.setEnd(range.startContainer, range.startOffset);\n const headHolder = this.document.createElement('div');\n headHolder.appendChild(head.cloneContents());\n const before = headHolder.innerHTML;\n return { before, after };\n }\n\n private wrapInlineCode(): void {\n const selection = this.document.defaultView?.getSelection();\n if (!selection || selection.rangeCount === 0 || selection.isCollapsed) return;\n const range = selection.getRangeAt(0);\n const code = this.document.createElement('code');\n try {\n range.surroundContents(code);\n } catch {\n // Selection crosses element boundaries — fall back to insertHTML.\n const html = range.toString();\n this.document.execCommand('insertHTML', false, `<code>${escapeText(html)}</code>`);\n }\n }\n\n private applyLink(): void {\n const selection = this.document.defaultView?.getSelection();\n if (!selection || selection.isCollapsed) return;\n const url = this.document.defaultView?.prompt(\n this.i18n.blockEditor.linkUrlPrompt,\n 'https://',\n );\n if (url == null) return;\n const trimmed = url.trim();\n if (trimmed === '') {\n this.document.execCommand('unlink');\n return;\n }\n if (!/^(https?:|mailto:|tel:|\\/|#)/i.test(trimmed)) return; // block javascript: etc.\n this.document.execCommand('createLink', false, trimmed);\n }\n\n private updateToolbar(): void {\n const el = this.editableRef().nativeElement;\n const selection = this.document.defaultView?.getSelection();\n if (\n this.disabled() ||\n !selection ||\n selection.rangeCount === 0 ||\n selection.isCollapsed ||\n !el.contains(selection.anchorNode)\n ) {\n this.toolbar.update((t) => (t.visible ? { ...t, visible: false } : t));\n return;\n }\n const rect = selection.getRangeAt(0).getBoundingClientRect();\n const host = el.getBoundingClientRect();\n this.toolbar.set({\n visible: true,\n top: rect.top - host.top - 8,\n left: rect.left - host.left + rect.width / 2,\n });\n const active = new Set<string>();\n for (const id of ['bold', 'italic', 'underline', 'strikeThrough']) {\n try {\n if (this.document.queryCommandState(id)) active.add(id);\n } catch {\n /* queryCommandState can throw in some engines */\n }\n }\n this.activeFormats.set(active);\n }\n\n private computeEmpty(el: HTMLElement): boolean {\n const text = el.textContent?.trim() ?? '';\n return text === '' && !el.querySelector('img, hr, iframe');\n }\n\n private setCaret(el: HTMLElement, position: 'start' | 'end'): void {\n const selection = this.document.defaultView?.getSelection();\n if (!selection) return;\n const range = this.document.createRange();\n range.selectNodeContents(el);\n range.collapse(position === 'start');\n selection.removeAllRanges();\n selection.addRange(range);\n }\n\n private isSelectionCollapsed(): boolean {\n return this.document.defaultView?.getSelection()?.isCollapsed ?? true;\n }\n\n private isCaretAtStart(el: HTMLElement): boolean {\n const selection = this.document.defaultView?.getSelection();\n if (!selection || selection.rangeCount === 0) return false;\n const range = selection.getRangeAt(0).cloneRange();\n range.selectNodeContents(el);\n range.setEnd(selection.anchorNode!, selection.anchorOffset);\n return range.toString().length === 0;\n }\n\n private isCaretAtEnd(el: HTMLElement): boolean {\n const selection = this.document.defaultView?.getSelection();\n if (!selection || selection.rangeCount === 0) return false;\n const range = selection.getRangeAt(0).cloneRange();\n range.selectNodeContents(el);\n range.setStart(selection.anchorNode!, selection.anchorOffset);\n return range.toString().length === 0;\n }\n}\n\nfunction escapeText(value: string): string {\n return value.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n}\n","@if (toolbar().visible && !disabled()) {\n <div\n class=\"mk-rich-text__toolbar\"\n role=\"toolbar\"\n [attr.aria-label]=\"i18n.blockEditor.textFormatting\"\n [style.top.px]=\"toolbar().top\"\n [style.left.px]=\"toolbar().left\"\n (keydown)=\"onToolbarKeydown($event)\"\n >\n @for (tool of tools; track tool.id) {\n <button\n type=\"button\"\n class=\"mk-rich-text__tool\"\n [class.mk-rich-text__tool--active]=\"isActive(tool.id)\"\n [class.mk-rich-text__tool--code]=\"tool.id === 'code'\"\n [attr.aria-pressed]=\"isActive(tool.id)\"\n [attr.aria-label]=\"tool.label + (tool.shortcut ? ' (' + tool.shortcut + ')' : '')\"\n [title]=\"tool.label\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"runTool(tool.id)\"\n >\n {{ tool.icon }}\n </button>\n }\n </div>\n}\n\n<div\n #editable\n class=\"mk-rich-text__editable\"\n data-mk-editable\n role=\"textbox\"\n aria-multiline=\"true\"\n [attr.aria-label]=\"labelledBy() ? null : ariaLabel()\"\n [attr.aria-labelledby]=\"labelledBy()\"\n [attr.aria-describedby]=\"describedBy()\"\n [attr.aria-invalid]=\"invalid() ? 'true' : null\"\n [attr.contenteditable]=\"disabled() ? null : 'true'\"\n [attr.data-placeholder]=\"placeholder()\"\n [style.min-height]=\"minHeight()\"\n [class.mk-rich-text__editable--empty]=\"showPlaceholder()\"\n (input)=\"onInput()\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n (keydown)=\"onKeydown($event)\"\n (keyup)=\"onSelectionChange()\"\n (mouseup)=\"onSelectionChange()\"\n></div>\n","/**\n * Allow-list sanitiser for inline rich-text HTML — the security backbone of\n * both `<mk-rich-text>` and the block editor's text blocks.\n *\n * SECURITY MODEL: rich-text surfaces store HTML authored through the editor's\n * restricted formatting commands. Before that markup is emitted, persisted or\n * re-rendered it is passed through {@link sanitizeInlineHtml}, an allow-list\n * cleaner that strips scripts, event handlers and dangerous URLs. Angular's\n * `DomSanitizer` re-sanitises at display time where applicable. This module is\n * dependency-free so it can run on a server (SSG/SSR) — never feed its output\n * back into `innerHTML` without sanitising again.\n */\n\nconst ALLOWED_INLINE_TAGS = new Set([\n 'b', 'strong', 'i', 'em', 'u', 's', 'strike', 'code', 'a', 'br', 'span', 'mark', 'sub', 'sup',\n]);\n\n/** Escapes a value for safe placement in a double-quoted attribute. */\nfunction escapeAttr(value: string): string {\n return String(value ?? '')\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;');\n}\n\n/** True for URL schemes safe to place in `href`/`src`. */\nfunction isSafeUrl(url: string): boolean {\n const trimmed = String(url ?? '').trim();\n if (trimmed === '') return false;\n // Allow relative, http(s), mailto, tel and data:image.\n if (/^(https?:|mailto:|tel:)/i.test(trimmed)) return true;\n if (/^data:image\\//i.test(trimmed)) return true;\n if (/^[a-z][a-z0-9+.-]*:/i.test(trimmed)) return false; // any other scheme\n return true; // relative / anchor / protocol-relative-ish\n}\n\n/**\n * Allow-list cleaner for inline rich text. Keeps a small set of formatting\n * tags, strips everything else's tags (preserving their text), removes event\n * handler attributes and unsafe `href`s. Not a substitute for `DomSanitizer`,\n * but makes the serialised string safe by construction.\n */\nexport function sanitizeInlineHtml(html: string): string {\n if (!html) return '';\n let out = String(html);\n // Drop script/style blocks entirely.\n out = out.replace(/<\\s*(script|style)[\\s\\S]*?<\\s*\\/\\s*\\1\\s*>/gi, '');\n // Rewrite each tag: keep allow-listed ones with a scrubbed attribute set.\n out = out.replace(/<\\/?[a-z][a-z0-9]*\\b[^>]*>/gi, (tag) => {\n const closing = /^<\\s*\\//.test(tag);\n const name = (tag.match(/^<\\s*\\/?\\s*([a-z0-9]+)/i)?.[1] ?? '').toLowerCase();\n if (!ALLOWED_INLINE_TAGS.has(name)) return '';\n if (closing) return `</${name}>`;\n if (name === 'a') {\n const href = tag.match(/\\shref\\s*=\\s*(?:\"([^\"]*)\"|'([^']*)')/i);\n const url = href?.[1] ?? href?.[2] ?? '';\n if (url && isSafeUrl(url)) {\n return `<a href=\"${escapeAttr(url)}\" rel=\"noopener noreferrer nofollow\" target=\"_blank\">`;\n }\n return '<a>';\n }\n return `<${name}>`;\n });\n return out;\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n booleanAttribute,\n computed,\n forwardRef,\n inject,\n input,\n model,\n signal,\n} from '@angular/core';\nimport { NG_VALUE_ACCESSOR, type ControlValueAccessor } from '@angular/forms';\nimport { MK_I18N, MkFieldContext } from '@mk-kit/ui/core';\nimport { MkRichTextEngine } from './rich-text-engine';\nimport { sanitizeInlineHtml } from './sanitize';\n\n/**\n * Rich text — a small WYSIWYG form control over a sanitised HTML string, for\n * single \"description\"-style fields where the full block editor is overkill.\n * Renders a textarea-like surface with the floating inline formatting toolbar\n * (Bold, Italic, Underline, Strikethrough, Inline code, Link, Clear) on text\n * selection; Enter inserts a line break.\n *\n * Implements `ControlValueAccessor` with a two-way `value` model, so it works\n * with `[(ngModel)]`, reactive forms and `[(value)]`. Every value — written or\n * emitted — passes through {@link sanitizeInlineHtml}, and a visually empty\n * surface (whitespace / lone `<br>`s) normalises to `''` so `required`\n * validation behaves.\n *\n * ```html\n * <mk-rich-text [(ngModel)]=\"description\" placeholder=\"Describe it…\" />\n * <mk-rich-text [(value)]=\"html\" minHeight=\"8rem\" />\n * ```\n */\n@Component({\n selector: 'mk-rich-text',\n templateUrl: './rich-text.html',\n styleUrl: './rich-text.scss',\n imports: [MkRichTextEngine],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'mk-rich-text-field',\n '[class.mk-rich-text-field--disabled]': 'isDisabled()',\n '[class.mk-rich-text-field--invalid]': 'isInvalid()',\n },\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => MkRichText),\n multi: true,\n },\n ],\n})\nexport class MkRichText implements ControlValueAccessor {\n private readonly field = inject(MkFieldContext, { optional: true });\n private readonly i18n = inject(MK_I18N);\n\n /** Two-way HTML string value (sanitised; `''` when visually empty). */\n readonly value = model<string>('');\n /** Placeholder shown when empty. */\n readonly placeholder = input<string>('');\n /** Disable the control. */\n readonly disabled = input(false, { transform: booleanAttribute });\n /** Force the invalid visual + `aria-invalid` when used standalone. */\n readonly invalid = input(false, { transform: booleanAttribute });\n /** Minimum height of the editable area (any CSS length). */\n readonly minHeight = input<string>('4.5em');\n /** Accessible label when not labelled by an `mk-form-field`. */\n readonly ariaLabel = input<string>('', { alias: 'aria-label' });\n\n private readonly cvaDisabled = signal(false);\n private onChange: (value: string) => void = () => {};\n private onTouched: () => void = () => {};\n\n protected readonly isDisabled = computed(() => this.disabled() || this.cvaDisabled());\n protected readonly isInvalid = computed(\n () => this.invalid() || (this.field?.hasError() ?? false),\n );\n protected readonly labelledBy = this.field?.labelId ?? null;\n protected readonly describedBy = computed(() => this.field?.describedBy() ?? null);\n protected readonly effectiveAriaLabel = computed(\n () => this.ariaLabel() || this.i18n.blockEditor.editableText,\n );\n\n /** Sanitised view of the model, rendered into the engine. */\n protected readonly safeHtml = computed(() => sanitizeInlineHtml(this.value()));\n\n /** User edit: sanitise, normalise the empty state, propagate. */\n protected onContentChange(html: string): void {\n const value = normalizeRichTextValue(html);\n this.value.set(value);\n this.onChange(value);\n }\n\n protected onFocusChange(focused: boolean): void {\n if (!focused) this.onTouched();\n }\n\n // --- ControlValueAccessor -------------------------------------------------\n writeValue(value: unknown): void {\n this.value.set(normalizeRichTextValue(value == null ? '' : String(value)));\n }\n registerOnChange(fn: (value: string) => void): void {\n this.onChange = fn;\n }\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n setDisabledState(isDisabled: boolean): void {\n this.cvaDisabled.set(isDisabled);\n }\n}\n\n/**\n * Sanitises an HTML string and collapses visually empty markup (whitespace,\n * `&nbsp;`s, lone `<br>`s and empty formatting tags) to `''`.\n */\nfunction normalizeRichTextValue(html: string): string {\n const sanitized = sanitizeInlineHtml(html);\n const text = sanitized\n .replace(/<[^>]*>/g, '')\n .replace(/&nbsp;/gi, ' ')\n .trim();\n return text === '' ? '' : sanitized;\n}\n","<mk-rich-text-engine\n [html]=\"safeHtml()\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"isDisabled()\"\n [splitOnEnter]=\"false\"\n [minHeight]=\"minHeight()\"\n [ariaLabel]=\"effectiveAriaLabel()\"\n [labelledBy]=\"labelledBy\"\n [describedBy]=\"describedBy()\"\n [invalid]=\"isInvalid()\"\n (contentChange)=\"onContentChange($event)\"\n (focusChange)=\"onFocusChange($event)\"\n/>\n","/**\n * RICH TEXT entry for @mk-kit/ui.\n *\n * A small WYSIWYG form control (`<mk-rich-text>`) over a sanitised HTML\n * string, plus the low-level contenteditable engine and the allow-list\n * sanitiser it is built on. The block editor composes the same engine for its\n * paragraph, heading, quote and list blocks.\n *\n * NOTE: this barrel deliberately does not export an HTML-escape helper — the\n * block-editor entry exports `mkEscapeHtml` and the root umbrella re-exports\n * both entries.\n */\nexport { MkRichText } from './rich-text';\nexport { MkRichTextEngine, type MkRichTextSplit } from './rich-text-engine';\nexport { sanitizeInlineHtml } from './sanitize';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mk-kit-ui-rich-text.mjs","sources":["../../../projects/mk-kit/rich-text/rich-text-engine.ts","../../../projects/mk-kit/rich-text/rich-text-engine.html","../../../projects/mk-kit/rich-text/sanitize.ts","../../../projects/mk-kit/rich-text/rich-text.ts","../../../projects/mk-kit/rich-text/rich-text.html","../../../projects/mk-kit/rich-text/index.ts","../../../projects/mk-kit/rich-text/mk-kit-ui-rich-text.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n DOCUMENT,\n ElementRef,\n OnDestroy,\n afterRenderEffect,\n booleanAttribute,\n computed,\n inject,\n input,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { MK_I18N } from '@mk-kit/ui/core';\n\n/** Payload for a split (Enter) event: text before/after the caret. */\nexport interface MkRichTextSplit {\n before: string;\n after: string;\n}\n\n/** A formatting command exposed by the floating toolbar. */\ninterface MkInlineTool {\n id: string;\n label: string;\n icon: string;\n shortcut?: string;\n}\n\n/**\n * Rich-text engine — an accessible contenteditable surface with a floating\n * inline formatting toolbar (Bold, Italic, Underline, Strikethrough, Inline\n * code, Link, Clear). Built on the native Selection API +\n * `document.execCommand` (deprecated but universally supported and\n * dependency-free — the only practical way to do inline formatting without a\n * heavyweight editor engine).\n *\n * This is the low-level building block: it emits HTML via `contentChange`, and\n * structural intents (`splitAt`, `removeEmpty`, `arrowOut`) so a block-editor\n * host can create, merge or navigate blocks. For a standalone form control use\n * {@link MkRichText} (`<mk-rich-text>`), which wraps this engine in a CVA over\n * a sanitised HTML string.\n */\n@Component({\n selector: 'mk-rich-text-engine',\n templateUrl: './rich-text-engine.html',\n styleUrl: './rich-text-engine.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'mk-rich-text' },\n})\nexport class MkRichTextEngine implements OnDestroy {\n private readonly document = inject(DOCUMENT);\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly editableRef = viewChild.required<ElementRef<HTMLElement>>('editable');\n protected readonly i18n = inject(MK_I18N);\n /** Pending toolbar-hide delay from `onBlur`; cleared on destroy. */\n private blurTimer: ReturnType<typeof setTimeout> | null = null;\n\n /** Current HTML content. */\n readonly html = input<string>('');\n /** Placeholder shown when empty. */\n readonly placeholder = input<string>('');\n /** Disable editing. */\n readonly disabled = input(false, { transform: booleanAttribute });\n /** Allow soft line breaks (Shift+Enter). Plain Enter always splits. */\n readonly multiline = input(true, { transform: booleanAttribute });\n /**\n * Emit `splitAt` on Enter (block-editor hosts). When `false` — standalone\n * field usage — Enter inserts a line break inside this surface instead.\n */\n readonly splitOnEnter = input(true, { transform: booleanAttribute });\n /** Minimum height of the editable surface (any CSS length). */\n readonly minHeight = input<string | null>(null);\n /** Accessible label for the editable region. */\n readonly ariaLabel = input<string>(this.i18n.blockEditor.editableText);\n /** Id of an external label element, for `aria-labelledby`. */\n readonly labelledBy = input<string | null>(null);\n /** Space-separated id list for `aria-describedby`. */\n readonly describedBy = input<string | null>(null);\n /** Reflect an invalid state via `aria-invalid`. */\n readonly invalid = input(false, { transform: booleanAttribute });\n\n /** Fired on every edit with the sanitised-by-construction HTML. */\n readonly contentChange = output<string>();\n /** Enter pressed: `before` stays in this block, `after` starts a new one. */\n readonly splitAt = output<MkRichTextSplit>();\n /** Backspace at the very start of an empty block. */\n readonly removeEmpty = output<void>();\n /** Caret tried to leave the top/bottom edge with an arrow key. */\n readonly arrowOut = output<'up' | 'down'>();\n /** Focus/blur bubbled so the wrapper can show selection chrome. */\n readonly focusChange = output<boolean>();\n\n protected readonly isEmpty = signal(true);\n protected readonly toolbar = signal<{ visible: boolean; top: number; left: number }>({\n visible: false,\n top: 0,\n left: 0,\n });\n protected readonly activeFormats = signal<Set<string>>(new Set());\n\n protected readonly tools: MkInlineTool[] = [\n { id: 'bold', label: this.i18n.blockEditor.bold, icon: 'B', shortcut: 'Ctrl+B' },\n { id: 'italic', label: this.i18n.blockEditor.italic, icon: 'I', shortcut: 'Ctrl+I' },\n { id: 'underline', label: this.i18n.blockEditor.underline, icon: 'U', shortcut: 'Ctrl+U' },\n { id: 'strikeThrough', label: this.i18n.blockEditor.strikethrough, icon: 'S' },\n { id: 'code', label: this.i18n.blockEditor.inlineCode, icon: '</>' },\n { id: 'link', label: this.i18n.blockEditor.link, icon: '🔗' },\n { id: 'clear', label: this.i18n.blockEditor.clearFormatting, icon: '⌫' },\n ];\n\n protected readonly showPlaceholder = computed(() => this.isEmpty());\n\n constructor() {\n // Sync the DOM from the `html` input only when the user is not actively\n // editing this element — otherwise setting innerHTML would reset the caret.\n afterRenderEffect(() => {\n const value = this.html() ?? '';\n const el = this.editableRef().nativeElement;\n if (this.document.activeElement === el) return;\n if (el.innerHTML !== value) el.innerHTML = value;\n this.isEmpty.set(this.computeEmpty(el));\n });\n }\n\n /** Places the caret and focuses (called by the host for navigation). */\n focus(position: 'start' | 'end' = 'end'): void {\n const el = this.editableRef().nativeElement;\n el.focus();\n this.setCaret(el, position);\n }\n\n protected onInput(): void {\n const el = this.editableRef().nativeElement;\n this.isEmpty.set(this.computeEmpty(el));\n this.contentChange.emit(el.innerHTML);\n }\n\n protected onFocus(): void {\n this.focusChange.emit(true);\n }\n\n ngOnDestroy(): void {\n if (this.blurTimer !== null) {\n clearTimeout(this.blurTimer);\n this.blurTimer = null;\n }\n }\n\n protected onBlur(): void {\n this.focusChange.emit(false);\n // Hide the toolbar on a delay, but only if focus really left the\n // component — Tabbing into the toolbar itself must not dismiss it.\n if (this.blurTimer !== null) clearTimeout(this.blurTimer);\n this.blurTimer = setTimeout(() => {\n this.blurTimer = null;\n const active = this.document.activeElement;\n if (active && this.host.nativeElement.contains(active)) return;\n this.toolbar.update((t) => (t.visible ? { ...t, visible: false } : t));\n }, 150);\n }\n\n protected onSelectionChange(): void {\n this.updateToolbar();\n }\n\n protected onKeydown(event: KeyboardEvent): void {\n if (this.disabled()) return;\n const el = this.editableRef().nativeElement;\n\n if (event.key === 'Enter' && !event.shiftKey) {\n event.preventDefault();\n if (this.splitOnEnter()) this.emitSplit(el);\n else this.insertLineBreak();\n return;\n }\n // Shift+Enter in single-line mode is a hard split too.\n if (event.key === 'Enter' && event.shiftKey && !this.multiline()) {\n event.preventDefault();\n if (this.splitOnEnter()) this.emitSplit(el);\n else this.insertLineBreak();\n return;\n }\n if (event.key === 'Backspace' && this.isCaretAtStart(el) && this.isSelectionCollapsed()) {\n if (this.computeEmpty(el)) {\n event.preventDefault();\n this.removeEmpty.emit();\n }\n return;\n }\n if (event.key === 'ArrowUp' && this.isCaretAtStart(el) && this.isSelectionCollapsed()) {\n event.preventDefault();\n this.arrowOut.emit('up');\n return;\n }\n if (event.key === 'ArrowDown' && this.isCaretAtEnd(el) && this.isSelectionCollapsed()) {\n event.preventDefault();\n this.arrowOut.emit('down');\n return;\n }\n }\n\n /** Escape inside the toolbar returns focus to the text; arrows move tools. */\n protected onToolbarKeydown(event: KeyboardEvent): void {\n if (event.key === 'Escape') {\n event.preventDefault();\n event.stopPropagation();\n this.toolbar.update((t) => ({ ...t, visible: false }));\n this.editableRef().nativeElement.focus();\n return;\n }\n if (event.key === 'ArrowRight' || event.key === 'ArrowLeft') {\n const bar = event.currentTarget as HTMLElement;\n const buttons = Array.from(bar.querySelectorAll<HTMLButtonElement>('.mk-rich-text__tool'));\n const current = buttons.indexOf(this.document.activeElement as HTMLButtonElement);\n if (current === -1 || buttons.length === 0) return;\n event.preventDefault();\n const delta = event.key === 'ArrowRight' ? 1 : -1;\n buttons[(current + delta + buttons.length) % buttons.length].focus();\n }\n }\n\n /** Runs a toolbar command, keeping the model + toolbar state in sync. */\n protected runTool(id: string): void {\n const el = this.editableRef().nativeElement;\n el.focus();\n switch (id) {\n case 'bold':\n case 'italic':\n case 'underline':\n case 'strikeThrough':\n this.document.execCommand(id);\n break;\n case 'code':\n this.wrapInlineCode();\n break;\n case 'link':\n this.applyLink();\n break;\n case 'clear':\n this.document.execCommand('removeFormat');\n this.document.execCommand('unlink');\n break;\n }\n this.onInput();\n this.updateToolbar();\n }\n\n protected isActive(id: string): boolean {\n return this.activeFormats().has(id);\n }\n\n // --- internals ------------------------------------------------------------\n\n private emitSplit(el: HTMLElement): void {\n const { before, after } = this.splitHtmlAtCaret(el);\n this.splitAt.emit({ before, after });\n }\n\n /** Inserts a `<br>` at the caret (Enter in `splitOnEnter=false` mode). */\n private insertLineBreak(): void {\n // insertHTML keeps the markup to the sanitiser's allow-list (`<br>`),\n // unlike the browser's default Enter handling which wraps lines in divs.\n this.document.execCommand('insertHTML', false, '<br>');\n this.onInput();\n }\n\n /** Extracts markup after the caret so the host can start a new block with it. */\n private splitHtmlAtCaret(el: HTMLElement): MkRichTextSplit {\n const selection = this.document.defaultView?.getSelection();\n if (!selection || selection.rangeCount === 0) {\n return { before: el.innerHTML, after: '' };\n }\n const range = selection.getRangeAt(0);\n const tail = range.cloneRange();\n tail.selectNodeContents(el);\n tail.setStart(range.endContainer, range.endOffset);\n const fragment = tail.cloneContents();\n const holder = this.document.createElement('div');\n holder.appendChild(fragment);\n const after = holder.innerHTML;\n\n const head = range.cloneRange();\n head.selectNodeContents(el);\n head.setEnd(range.startContainer, range.startOffset);\n const headHolder = this.document.createElement('div');\n headHolder.appendChild(head.cloneContents());\n const before = headHolder.innerHTML;\n return { before, after };\n }\n\n private wrapInlineCode(): void {\n const selection = this.document.defaultView?.getSelection();\n if (!selection || selection.rangeCount === 0 || selection.isCollapsed) return;\n const range = selection.getRangeAt(0);\n const code = this.document.createElement('code');\n try {\n range.surroundContents(code);\n } catch {\n // Selection crosses element boundaries — fall back to insertHTML.\n const html = range.toString();\n this.document.execCommand('insertHTML', false, `<code>${escapeText(html)}</code>`);\n }\n }\n\n private applyLink(): void {\n const selection = this.document.defaultView?.getSelection();\n if (!selection || selection.isCollapsed) return;\n const url = this.document.defaultView?.prompt(\n this.i18n.blockEditor.linkUrlPrompt,\n 'https://',\n );\n if (url == null) return;\n const trimmed = url.trim();\n if (trimmed === '') {\n this.document.execCommand('unlink');\n return;\n }\n if (!/^(https?:|mailto:|tel:|\\/|#)/i.test(trimmed)) return; // block javascript: etc.\n this.document.execCommand('createLink', false, trimmed);\n }\n\n private updateToolbar(): void {\n const el = this.editableRef().nativeElement;\n const selection = this.document.defaultView?.getSelection();\n if (\n this.disabled() ||\n !selection ||\n selection.rangeCount === 0 ||\n selection.isCollapsed ||\n !el.contains(selection.anchorNode)\n ) {\n this.toolbar.update((t) => (t.visible ? { ...t, visible: false } : t));\n return;\n }\n const rect = selection.getRangeAt(0).getBoundingClientRect();\n const host = el.getBoundingClientRect();\n this.toolbar.set({\n visible: true,\n top: rect.top - host.top - 8,\n left: rect.left - host.left + rect.width / 2,\n });\n const active = new Set<string>();\n for (const id of ['bold', 'italic', 'underline', 'strikeThrough']) {\n try {\n if (this.document.queryCommandState(id)) active.add(id);\n } catch {\n /* queryCommandState can throw in some engines */\n }\n }\n this.activeFormats.set(active);\n }\n\n private computeEmpty(el: HTMLElement): boolean {\n const text = el.textContent?.trim() ?? '';\n return text === '' && !el.querySelector('img, hr, iframe');\n }\n\n private setCaret(el: HTMLElement, position: 'start' | 'end'): void {\n const selection = this.document.defaultView?.getSelection();\n if (!selection) return;\n const range = this.document.createRange();\n range.selectNodeContents(el);\n range.collapse(position === 'start');\n selection.removeAllRanges();\n selection.addRange(range);\n }\n\n private isSelectionCollapsed(): boolean {\n return this.document.defaultView?.getSelection()?.isCollapsed ?? true;\n }\n\n private isCaretAtStart(el: HTMLElement): boolean {\n const selection = this.document.defaultView?.getSelection();\n if (!selection || selection.rangeCount === 0) return false;\n const range = selection.getRangeAt(0).cloneRange();\n range.selectNodeContents(el);\n range.setEnd(selection.anchorNode!, selection.anchorOffset);\n return range.toString().length === 0;\n }\n\n private isCaretAtEnd(el: HTMLElement): boolean {\n const selection = this.document.defaultView?.getSelection();\n if (!selection || selection.rangeCount === 0) return false;\n const range = selection.getRangeAt(0).cloneRange();\n range.selectNodeContents(el);\n range.setStart(selection.anchorNode!, selection.anchorOffset);\n return range.toString().length === 0;\n }\n}\n\nfunction escapeText(value: string): string {\n return value.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n}\n","@if (toolbar().visible && !disabled()) {\n <div\n class=\"mk-rich-text__toolbar\"\n role=\"toolbar\"\n [attr.aria-label]=\"i18n.blockEditor.textFormatting\"\n [style.top.px]=\"toolbar().top\"\n [style.left.px]=\"toolbar().left\"\n (keydown)=\"onToolbarKeydown($event)\"\n >\n @for (tool of tools; track tool.id) {\n <button\n type=\"button\"\n class=\"mk-rich-text__tool\"\n [class.mk-rich-text__tool--active]=\"isActive(tool.id)\"\n [class.mk-rich-text__tool--code]=\"tool.id === 'code'\"\n [attr.aria-pressed]=\"isActive(tool.id)\"\n [attr.aria-label]=\"tool.label + (tool.shortcut ? ' (' + tool.shortcut + ')' : '')\"\n [title]=\"tool.label\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"runTool(tool.id)\"\n >\n {{ tool.icon }}\n </button>\n }\n </div>\n}\n\n<div\n #editable\n class=\"mk-rich-text__editable\"\n data-mk-editable\n role=\"textbox\"\n aria-multiline=\"true\"\n [attr.aria-label]=\"labelledBy() ? null : ariaLabel()\"\n [attr.aria-labelledby]=\"labelledBy()\"\n [attr.aria-describedby]=\"describedBy()\"\n [attr.aria-invalid]=\"invalid() ? 'true' : null\"\n [attr.contenteditable]=\"disabled() ? null : 'true'\"\n [attr.data-placeholder]=\"placeholder()\"\n [style.min-height]=\"minHeight()\"\n [class.mk-rich-text__editable--empty]=\"showPlaceholder()\"\n (input)=\"onInput()\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n (keydown)=\"onKeydown($event)\"\n (keyup)=\"onSelectionChange()\"\n (mouseup)=\"onSelectionChange()\"\n></div>\n","/**\n * Allow-list sanitiser for inline rich-text HTML — the security backbone of\n * both `<mk-rich-text>` and the block editor's text blocks.\n *\n * SECURITY MODEL: rich-text surfaces store HTML authored through the editor's\n * restricted formatting commands. Before that markup is emitted, persisted or\n * re-rendered it is passed through {@link sanitizeInlineHtml}, an allow-list\n * cleaner that strips scripts, event handlers and dangerous URLs. Angular's\n * `DomSanitizer` re-sanitises at display time where applicable. This module is\n * dependency-free so it can run on a server (SSG/SSR) — never feed its output\n * back into `innerHTML` without sanitising again.\n */\n\nconst ALLOWED_INLINE_TAGS = new Set([\n 'b', 'strong', 'i', 'em', 'u', 's', 'strike', 'code', 'a', 'br', 'span', 'mark', 'sub', 'sup',\n]);\n\n/** Escapes a value for safe placement in a double-quoted attribute. */\nfunction escapeAttr(value: string): string {\n return String(value ?? '')\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;');\n}\n\n/** True for URL schemes safe to place in `href`/`src`. */\nfunction isSafeUrl(url: string): boolean {\n const trimmed = String(url ?? '').trim();\n if (trimmed === '') return false;\n // Allow relative, http(s), mailto, tel and data:image.\n if (/^(https?:|mailto:|tel:)/i.test(trimmed)) return true;\n if (/^data:image\\//i.test(trimmed)) return true;\n if (/^[a-z][a-z0-9+.-]*:/i.test(trimmed)) return false; // any other scheme\n return true; // relative / anchor / protocol-relative-ish\n}\n\n/**\n * Allow-list cleaner for inline rich text. Keeps a small set of formatting\n * tags, strips everything else's tags (preserving their text), removes event\n * handler attributes and unsafe `href`s. Not a substitute for `DomSanitizer`,\n * but makes the serialised string safe by construction.\n */\nexport function sanitizeInlineHtml(html: string): string {\n if (!html) return '';\n let out = String(html);\n // Drop script/style blocks entirely.\n out = out.replace(/<\\s*(script|style)[\\s\\S]*?<\\s*\\/\\s*\\1\\s*>/gi, '');\n // Rewrite each tag: keep allow-listed ones with a scrubbed attribute set.\n out = out.replace(/<\\/?[a-z][a-z0-9]*\\b[^>]*>/gi, (tag) => {\n const closing = /^<\\s*\\//.test(tag);\n const name = (tag.match(/^<\\s*\\/?\\s*([a-z0-9]+)/i)?.[1] ?? '').toLowerCase();\n if (!ALLOWED_INLINE_TAGS.has(name)) return '';\n if (closing) return `</${name}>`;\n if (name === 'a') {\n const href = tag.match(/\\shref\\s*=\\s*(?:\"([^\"]*)\"|'([^']*)')/i);\n const url = href?.[1] ?? href?.[2] ?? '';\n if (url && isSafeUrl(url)) {\n return `<a href=\"${escapeAttr(url)}\" rel=\"noopener noreferrer nofollow\" target=\"_blank\">`;\n }\n return '<a>';\n }\n return `<${name}>`;\n });\n return out;\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n booleanAttribute,\n computed,\n forwardRef,\n inject,\n input,\n model,\n signal,\n} from '@angular/core';\nimport { NG_VALUE_ACCESSOR, type ControlValueAccessor } from '@angular/forms';\nimport { MK_I18N, MkFieldContext } from '@mk-kit/ui/core';\nimport { mkInjectFieldTouched } from '@mk-kit/ui/core';\nimport { MkRichTextEngine } from './rich-text-engine';\nimport { sanitizeInlineHtml } from './sanitize';\n\n/**\n * Rich text — a small WYSIWYG form control over a sanitised HTML string, for\n * single \"description\"-style fields where the full block editor is overkill.\n * Renders a textarea-like surface with the floating inline formatting toolbar\n * (Bold, Italic, Underline, Strikethrough, Inline code, Link, Clear) on text\n * selection; Enter inserts a line break.\n *\n * Implements `ControlValueAccessor` with a two-way `value` model, so it works\n * with `[(ngModel)]`, reactive forms and `[(value)]`. Every value — written or\n * emitted — passes through {@link sanitizeInlineHtml}, and a visually empty\n * surface (whitespace / lone `<br>`s) normalises to `''` so `required`\n * validation behaves.\n *\n * ```html\n * <mk-rich-text [(ngModel)]=\"description\" placeholder=\"Describe it…\" />\n * <mk-rich-text [(value)]=\"html\" minHeight=\"8rem\" />\n * ```\n */\n@Component({\n selector: 'mk-rich-text',\n templateUrl: './rich-text.html',\n styleUrl: './rich-text.scss',\n imports: [MkRichTextEngine],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'mk-rich-text-field',\n '[class.mk-rich-text-field--disabled]': 'isDisabled()',\n '[class.mk-rich-text-field--invalid]': 'isInvalid()',\n },\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => MkRichText),\n multi: true,\n },\n ],\n})\nexport class MkRichText implements ControlValueAccessor {\n private readonly field = inject(MkFieldContext, { optional: true });\n /** Signal Forms: gates `invalid` until the bound field is touched or dirty. */\n private readonly fieldTouched = mkInjectFieldTouched();\n private readonly i18n = inject(MK_I18N);\n\n /** Two-way HTML string value (sanitised; `''` when visually empty). */\n readonly value = model<string>('');\n /** Placeholder shown when empty. */\n readonly placeholder = input<string>('');\n /** Disable the control. */\n readonly disabled = input(false, { transform: booleanAttribute });\n /** Force the invalid visual + `aria-invalid` when used standalone. */\n readonly invalid = input(false, { transform: booleanAttribute });\n /** Minimum height of the editable area (any CSS length). */\n readonly minHeight = input<string>('4.5em');\n /** Accessible label when not labelled by an `mk-form-field`. */\n readonly ariaLabel = input<string>('', { alias: 'aria-label' });\n\n private readonly cvaDisabled = signal(false);\n private onChange: (value: string) => void = () => {};\n private onTouched: () => void = () => {};\n\n protected readonly isDisabled = computed(() => this.disabled() || this.cvaDisabled());\n protected readonly isInvalid = computed(\n () => (this.invalid() && this.fieldTouched()) || (this.field?.hasError() ?? false),\n );\n protected readonly labelledBy = this.field?.labelId ?? null;\n protected readonly describedBy = computed(() => this.field?.describedBy() ?? null);\n protected readonly effectiveAriaLabel = computed(\n () => this.ariaLabel() || this.i18n.blockEditor.editableText,\n );\n\n /** Sanitised view of the model, rendered into the engine. */\n protected readonly safeHtml = computed(() => sanitizeInlineHtml(this.value()));\n\n /** User edit: sanitise, normalise the empty state, propagate. */\n protected onContentChange(html: string): void {\n const value = normalizeRichTextValue(html);\n this.value.set(value);\n this.onChange(value);\n }\n\n protected onFocusChange(focused: boolean): void {\n if (!focused) this.onTouched();\n }\n\n // --- ControlValueAccessor -------------------------------------------------\n writeValue(value: unknown): void {\n this.value.set(normalizeRichTextValue(value == null ? '' : String(value)));\n }\n registerOnChange(fn: (value: string) => void): void {\n this.onChange = fn;\n }\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n setDisabledState(isDisabled: boolean): void {\n this.cvaDisabled.set(isDisabled);\n }\n}\n\n/**\n * Sanitises an HTML string and collapses visually empty markup (whitespace,\n * `&nbsp;`s, lone `<br>`s and empty formatting tags) to `''`.\n */\nfunction normalizeRichTextValue(html: string): string {\n const sanitized = sanitizeInlineHtml(html);\n const text = sanitized\n .replace(/<[^>]*>/g, '')\n .replace(/&nbsp;/gi, ' ')\n .trim();\n return text === '' ? '' : sanitized;\n}\n","<mk-rich-text-engine\n [html]=\"safeHtml()\"\n [placeholder]=\"placeholder()\"\n [disabled]=\"isDisabled()\"\n [splitOnEnter]=\"false\"\n [minHeight]=\"minHeight()\"\n [ariaLabel]=\"effectiveAriaLabel()\"\n [labelledBy]=\"labelledBy\"\n [describedBy]=\"describedBy()\"\n [invalid]=\"isInvalid()\"\n (contentChange)=\"onContentChange($event)\"\n (focusChange)=\"onFocusChange($event)\"\n/>\n","/**\n * RICH TEXT entry for @mk-kit/ui.\n *\n * A small WYSIWYG form control (`<mk-rich-text>`) over a sanitised HTML\n * string, plus the low-level contenteditable engine and the allow-list\n * sanitiser it is built on. The block editor composes the same engine for its\n * paragraph, heading, quote and list blocks.\n *\n * NOTE: this barrel deliberately does not export an HTML-escape helper — the\n * block-editor entry exports `mkEscapeHtml` and the root umbrella re-exports\n * both entries.\n */\nexport { MkRichText } from './rich-text';\nexport { MkRichTextEngine, type MkRichTextSplit } from './rich-text-engine';\nexport { sanitizeInlineHtml } from './sanitize';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}