@radix-ng/primitives 1.0.0-beta.0 → 1.0.0-beta.2

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 (117) hide show
  1. package/fesm2022/radix-ng-primitives-accordion.mjs +2 -2
  2. package/fesm2022/radix-ng-primitives-accordion.mjs.map +1 -1
  3. package/fesm2022/radix-ng-primitives-calendar.mjs +109 -84
  4. package/fesm2022/radix-ng-primitives-calendar.mjs.map +1 -1
  5. package/fesm2022/radix-ng-primitives-checkbox.mjs +2 -2
  6. package/fesm2022/radix-ng-primitives-checkbox.mjs.map +1 -1
  7. package/fesm2022/radix-ng-primitives-collapsible.mjs +1 -1
  8. package/fesm2022/radix-ng-primitives-collapsible.mjs.map +1 -1
  9. package/fesm2022/radix-ng-primitives-combobox.mjs +1923 -0
  10. package/fesm2022/radix-ng-primitives-combobox.mjs.map +1 -0
  11. package/fesm2022/radix-ng-primitives-context-menu.mjs +1 -1
  12. package/fesm2022/radix-ng-primitives-context-menu.mjs.map +1 -1
  13. package/fesm2022/radix-ng-primitives-core.mjs +591 -470
  14. package/fesm2022/radix-ng-primitives-core.mjs.map +1 -1
  15. package/fesm2022/radix-ng-primitives-cropper.mjs +287 -308
  16. package/fesm2022/radix-ng-primitives-cropper.mjs.map +1 -1
  17. package/fesm2022/radix-ng-primitives-date-field.mjs +66 -15
  18. package/fesm2022/radix-ng-primitives-date-field.mjs.map +1 -1
  19. package/fesm2022/radix-ng-primitives-dialog.mjs +1 -1
  20. package/fesm2022/radix-ng-primitives-dialog.mjs.map +1 -1
  21. package/fesm2022/radix-ng-primitives-drawer.mjs +7 -106
  22. package/fesm2022/radix-ng-primitives-drawer.mjs.map +1 -1
  23. package/fesm2022/radix-ng-primitives-editable.mjs +305 -24
  24. package/fesm2022/radix-ng-primitives-editable.mjs.map +1 -1
  25. package/fesm2022/radix-ng-primitives-field.mjs +86 -6
  26. package/fesm2022/radix-ng-primitives-field.mjs.map +1 -1
  27. package/fesm2022/radix-ng-primitives-fieldset.mjs +1 -1
  28. package/fesm2022/radix-ng-primitives-fieldset.mjs.map +1 -1
  29. package/fesm2022/radix-ng-primitives-focus-scope.mjs +1 -1
  30. package/fesm2022/radix-ng-primitives-focus-scope.mjs.map +1 -1
  31. package/fesm2022/radix-ng-primitives-form.mjs +207 -0
  32. package/fesm2022/radix-ng-primitives-form.mjs.map +1 -0
  33. package/fesm2022/radix-ng-primitives-input.mjs +85 -4
  34. package/fesm2022/radix-ng-primitives-input.mjs.map +1 -1
  35. package/fesm2022/radix-ng-primitives-menu.mjs +413 -5
  36. package/fesm2022/radix-ng-primitives-menu.mjs.map +1 -1
  37. package/fesm2022/radix-ng-primitives-menubar.mjs +1 -1
  38. package/fesm2022/radix-ng-primitives-menubar.mjs.map +1 -1
  39. package/fesm2022/radix-ng-primitives-meter.mjs +1 -1
  40. package/fesm2022/radix-ng-primitives-meter.mjs.map +1 -1
  41. package/fesm2022/radix-ng-primitives-navigation-menu.mjs +1 -1
  42. package/fesm2022/radix-ng-primitives-navigation-menu.mjs.map +1 -1
  43. package/fesm2022/radix-ng-primitives-number-field.mjs +2 -2
  44. package/fesm2022/radix-ng-primitives-number-field.mjs.map +1 -1
  45. package/fesm2022/radix-ng-primitives-popover.mjs +1 -1
  46. package/fesm2022/radix-ng-primitives-popover.mjs.map +1 -1
  47. package/fesm2022/radix-ng-primitives-popper.mjs +22 -5
  48. package/fesm2022/radix-ng-primitives-popper.mjs.map +1 -1
  49. package/fesm2022/radix-ng-primitives-portal.mjs.map +1 -1
  50. package/fesm2022/radix-ng-primitives-preview-card.mjs +1 -1
  51. package/fesm2022/radix-ng-primitives-preview-card.mjs.map +1 -1
  52. package/fesm2022/radix-ng-primitives-progress.mjs +1 -1
  53. package/fesm2022/radix-ng-primitives-progress.mjs.map +1 -1
  54. package/fesm2022/radix-ng-primitives-roving-focus.mjs +1 -1
  55. package/fesm2022/radix-ng-primitives-roving-focus.mjs.map +1 -1
  56. package/fesm2022/radix-ng-primitives-scroll-area.mjs +923 -0
  57. package/fesm2022/radix-ng-primitives-scroll-area.mjs.map +1 -0
  58. package/fesm2022/radix-ng-primitives-select.mjs +421 -224
  59. package/fesm2022/radix-ng-primitives-select.mjs.map +1 -1
  60. package/fesm2022/radix-ng-primitives-slider.mjs +1 -1
  61. package/fesm2022/radix-ng-primitives-slider.mjs.map +1 -1
  62. package/fesm2022/radix-ng-primitives-stepper.mjs.map +1 -1
  63. package/fesm2022/radix-ng-primitives-switch.mjs +3 -2
  64. package/fesm2022/radix-ng-primitives-switch.mjs.map +1 -1
  65. package/fesm2022/radix-ng-primitives-tabs.mjs +12 -3
  66. package/fesm2022/radix-ng-primitives-tabs.mjs.map +1 -1
  67. package/fesm2022/radix-ng-primitives-time-field.mjs +27 -3
  68. package/fesm2022/radix-ng-primitives-time-field.mjs.map +1 -1
  69. package/fesm2022/radix-ng-primitives-toast.mjs +839 -0
  70. package/fesm2022/radix-ng-primitives-toast.mjs.map +1 -0
  71. package/fesm2022/radix-ng-primitives-toggle-group.mjs +1 -1
  72. package/fesm2022/radix-ng-primitives-toggle-group.mjs.map +1 -1
  73. package/fesm2022/radix-ng-primitives-toolbar.mjs +2 -2
  74. package/fesm2022/radix-ng-primitives-toolbar.mjs.map +1 -1
  75. package/fesm2022/radix-ng-primitives-tooltip.mjs +11 -3
  76. package/fesm2022/radix-ng-primitives-tooltip.mjs.map +1 -1
  77. package/package.json +18 -2
  78. package/schematics/ng-add/index.js +57 -0
  79. package/schematics/ng-add/index.js.map +1 -1
  80. package/schematics/ng-add/schema.d.ts +1 -0
  81. package/schematics/ng-add/schema.json +6 -0
  82. package/types/radix-ng-primitives-accordion.d.ts +3 -2
  83. package/types/radix-ng-primitives-calendar.d.ts +38 -18
  84. package/types/radix-ng-primitives-checkbox.d.ts +5 -5
  85. package/types/radix-ng-primitives-collapsible.d.ts +2 -1
  86. package/types/radix-ng-primitives-combobox.d.ts +1265 -0
  87. package/types/radix-ng-primitives-context-menu.d.ts +3 -2
  88. package/types/radix-ng-primitives-core.d.ts +187 -56
  89. package/types/radix-ng-primitives-cropper.d.ts +89 -56
  90. package/types/radix-ng-primitives-date-field.d.ts +11 -5
  91. package/types/radix-ng-primitives-dialog.d.ts +2 -1
  92. package/types/radix-ng-primitives-drawer.d.ts +5 -27
  93. package/types/radix-ng-primitives-editable.d.ts +90 -13
  94. package/types/radix-ng-primitives-field.d.ts +74 -4
  95. package/types/radix-ng-primitives-fieldset.d.ts +3 -2
  96. package/types/radix-ng-primitives-focus-scope.d.ts +2 -1
  97. package/types/radix-ng-primitives-form.d.ts +124 -0
  98. package/types/radix-ng-primitives-input.d.ts +75 -5
  99. package/types/radix-ng-primitives-menu.d.ts +16 -4
  100. package/types/radix-ng-primitives-menubar.d.ts +2 -1
  101. package/types/radix-ng-primitives-meter.d.ts +3 -2
  102. package/types/radix-ng-primitives-navigation-menu.d.ts +1 -1
  103. package/types/radix-ng-primitives-number-field.d.ts +6 -6
  104. package/types/radix-ng-primitives-popover.d.ts +2 -1
  105. package/types/radix-ng-primitives-popper.d.ts +19 -2
  106. package/types/radix-ng-primitives-preview-card.d.ts +1 -1
  107. package/types/radix-ng-primitives-progress.d.ts +3 -2
  108. package/types/radix-ng-primitives-roving-focus.d.ts +4 -3
  109. package/types/radix-ng-primitives-scroll-area.d.ts +253 -0
  110. package/types/radix-ng-primitives-select.d.ts +296 -136
  111. package/types/radix-ng-primitives-slider.d.ts +1 -1
  112. package/types/radix-ng-primitives-switch.d.ts +1 -1
  113. package/types/radix-ng-primitives-tabs.d.ts +1 -1
  114. package/types/radix-ng-primitives-toast.d.ts +378 -0
  115. package/types/radix-ng-primitives-toggle-group.d.ts +2 -1
  116. package/types/radix-ng-primitives-toolbar.d.ts +3 -2
  117. package/types/radix-ng-primitives-tooltip.d.ts +3 -2
@@ -1,10 +1,10 @@
1
1
  import * as i0 from '@angular/core';
2
- import { inject, model, input, booleanAttribute, numberAttribute, computed, signal, afterNextRender, Directive } from '@angular/core';
3
- import { createContext, watch } from '@radix-ng/primitives/core';
2
+ import { inject, model, input, booleanAttribute, numberAttribute, output, computed, linkedSignal, signal, effect, afterRenderEffect, Directive, ElementRef, afterNextRender, NgModule } from '@angular/core';
3
+ import { createContext, watch, ENTER } from '@radix-ng/primitives/core';
4
4
  import * as i1 from '@radix-ng/primitives/dismissable-layer';
5
5
  import { RdxFocusOutside, RdxPointerDownOutside } from '@radix-ng/primitives/dismissable-layer';
6
6
 
7
- const [injectEditableRootContext, provideEditableRootContext] = createContext('EditableRoot');
7
+ const [injectEditableRootContext, provideEditableRootContext] = createContext('EditableRoot', 'components/editable');
8
8
  const rootContext = () => {
9
9
  const context = inject(RdxEditableRoot);
10
10
  return {
@@ -15,16 +15,19 @@ const rootContext = () => {
15
15
  isEditing: context.isEditing,
16
16
  submitMode: context.submitMode,
17
17
  activationMode: context.activationMode,
18
- edit: context.edit,
19
- cancel: context.cancel,
20
- submit: context.submit,
18
+ edit: () => context.edit(),
19
+ cancel: () => context.cancel(),
20
+ submit: () => context.submit(),
21
21
  maxLength: context.maxLength,
22
+ required: context.required,
22
23
  startWithEditMode: context.startWithEditMode,
23
24
  isEmpty: context.isEmpty,
24
25
  readonly: context.readonly,
25
26
  autoResize: context.autoResize,
26
27
  selectOnFocus: context.selectOnFocus,
27
- inputRef: context.inputRef
28
+ inputRef: context.inputRef,
29
+ previewRef: context.previewRef,
30
+ canActivateOnFocus: () => context.canActivateOnFocus()
28
31
  };
29
32
  };
30
33
  /**
@@ -35,6 +38,8 @@ class RdxEditableRoot {
35
38
  this.focusOutside = inject(RdxFocusOutside);
36
39
  this.pointerDownOutside = inject(RdxPointerDownOutside);
37
40
  this.value = model(...(ngDevMode ? [undefined, { debugName: "value" }] : /* istanbul ignore next */ []));
41
+ /** Uncontrolled initial value. */
42
+ this.defaultValue = input(...(ngDevMode ? [undefined, { debugName: "defaultValue" }] : /* istanbul ignore next */ []));
38
43
  this.placeholder = input('Enter text...', ...(ngDevMode ? [{ debugName: "placeholder" }] : /* istanbul ignore next */ []));
39
44
  this.disabled = input(false, { ...(ngDevMode ? { debugName: "disabled" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
40
45
  this.readonly = input(false, { ...(ngDevMode ? { debugName: "readonly" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
@@ -48,18 +53,28 @@ class RdxEditableRoot {
48
53
  this.activationMode = input('focus', ...(ngDevMode ? [{ debugName: "activationMode" }] : /* istanbul ignore next */ []));
49
54
  this.autoResize = input(false, { ...(ngDevMode ? { debugName: "autoResize" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
50
55
  this.required = input(false, { ...(ngDevMode ? { debugName: "required" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
51
- this.isEmpty = computed(() => this.value() === '', ...(ngDevMode ? [{ debugName: "isEmpty" }] : /* istanbul ignore next */ []));
56
+ /** Emitted when the value is committed (on submit). */
57
+ this.onValueChange = output();
58
+ this.isEmpty = computed(() => {
59
+ const value = this.value();
60
+ return value === undefined || value === null || value === '';
61
+ }, ...(ngDevMode ? [{ debugName: "isEmpty" }] : /* istanbul ignore next */ []));
52
62
  this.$placeholder = computed(() => {
53
- return typeof this.placeholder() === 'string'
54
- ? { edit: this.placeholder(), preview: this.placeholder() }
55
- : this.placeholder();
63
+ const placeholder = this.placeholder();
64
+ return { edit: placeholder, preview: placeholder };
56
65
  }, ...(ngDevMode ? [{ debugName: "$placeholder" }] : /* istanbul ignore next */ []));
57
- this.isEditing = signal(false, ...(ngDevMode ? [{ debugName: "isEditing" }] : /* istanbul ignore next */ []));
58
- this.inputValue = signal(this.value(), ...(ngDevMode ? [{ debugName: "inputValue" }] : /* istanbul ignore next */ []));
66
+ /** Seeded from `startWithEditMode`; flipped imperatively by edit/submit/cancel. */
67
+ this.isEditing = linkedSignal(() => this.startWithEditMode(), ...(ngDevMode ? [{ debugName: "isEditing" }] : /* istanbul ignore next */ []));
68
+ /** Working copy of the value while editing; reseeded whenever the committed value changes. */
69
+ this.inputValue = linkedSignal(() => this.value(), ...(ngDevMode ? [{ debugName: "inputValue" }] : /* istanbul ignore next */ []));
59
70
  this.inputRef = signal(undefined, ...(ngDevMode ? [{ debugName: "inputRef" }] : /* istanbul ignore next */ []));
60
- watch([this.value], ([value]) => {
61
- if (value) {
62
- this.inputValue.set(this.value());
71
+ this.previewRef = signal(undefined, ...(ngDevMode ? [{ debugName: "previewRef" }] : /* istanbul ignore next */ []));
72
+ this.restoreFocusOnExit = false;
73
+ /** True while focus is being restored programmatically, to avoid re-entering edit mode. */
74
+ this.suppressFocusActivation = false;
75
+ effect(() => {
76
+ if (this.defaultValue() !== undefined) {
77
+ this.value.set(this.defaultValue());
63
78
  }
64
79
  });
65
80
  watch([this.isEditing], ([value]) => {
@@ -68,11 +83,24 @@ class RdxEditableRoot {
68
83
  });
69
84
  this.pointerDownOutside.pointerDownOutside.subscribe(() => this.handleDismiss());
70
85
  this.focusOutside.focusOutside.subscribe(() => this.handleDismiss());
71
- afterNextRender(() => {
72
- this.isEditing.set(this.startWithEditMode() ?? false);
73
- this.inputValue.set(this.value());
86
+ // Restore focus to the preview after leaving edit mode, once the input is hidden
87
+ // and the preview is visible again. Runs after render so the DOM reflects isEditing.
88
+ afterRenderEffect(() => {
89
+ const editing = this.isEditing();
90
+ if (!editing && this.restoreFocusOnExit) {
91
+ this.restoreFocusOnExit = false;
92
+ const preview = this.previewRef();
93
+ if (preview) {
94
+ this.suppressFocusActivation = true;
95
+ preview.focus({ preventScroll: true });
96
+ this.suppressFocusActivation = false;
97
+ }
98
+ }
74
99
  });
75
100
  }
101
+ canActivateOnFocus() {
102
+ return !this.suppressFocusActivation;
103
+ }
76
104
  handleDismiss() {
77
105
  if (this.isEditing()) {
78
106
  if (this.submitMode() === 'blur' || this.submitMode() === 'both') {
@@ -84,18 +112,23 @@ class RdxEditableRoot {
84
112
  }
85
113
  }
86
114
  submit() {
87
- this.value.set(this.inputValue());
115
+ const value = this.inputValue() ?? '';
116
+ this.value.set(value);
117
+ this.onValueChange.emit(value);
118
+ this.restoreFocusOnExit = true;
88
119
  this.isEditing.set(false);
89
120
  }
90
121
  cancel() {
122
+ this.inputValue.set(this.value());
123
+ this.restoreFocusOnExit = true;
91
124
  this.isEditing.set(false);
92
125
  }
93
126
  edit() {
94
- this.isEditing.set(true);
95
127
  this.inputValue.set(this.value());
128
+ this.isEditing.set(true);
96
129
  }
97
130
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: RdxEditableRoot, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
98
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.9", type: RdxEditableRoot, isStandalone: true, selector: "[rdxEditableRoot]", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, selectOnFocus: { classPropertyName: "selectOnFocus", publicName: "selectOnFocus", isSignal: true, isRequired: false, transformFunction: null }, submitMode: { classPropertyName: "submitMode", publicName: "submitMode", isSignal: true, isRequired: false, transformFunction: null }, maxLength: { classPropertyName: "maxLength", publicName: "maxLength", isSignal: true, isRequired: false, transformFunction: null }, startWithEditMode: { classPropertyName: "startWithEditMode", publicName: "startWithEditMode", isSignal: true, isRequired: false, transformFunction: null }, activationMode: { classPropertyName: "activationMode", publicName: "activationMode", isSignal: true, isRequired: false, transformFunction: null }, autoResize: { classPropertyName: "autoResize", publicName: "autoResize", isSignal: true, isRequired: false, transformFunction: null }, required: { classPropertyName: "required", publicName: "required", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange" }, host: { properties: { "attr.data-dismissable-layer": "\"\"" } }, providers: [provideEditableRootContext(rootContext)], exportAs: ["rdxEditableRoot"], hostDirectives: [{ directive: i1.RdxFocusOutside }, { directive: i1.RdxPointerDownOutside }], ngImport: i0 }); }
131
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.9", type: RdxEditableRoot, isStandalone: true, selector: "[rdxEditableRoot]", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, defaultValue: { classPropertyName: "defaultValue", publicName: "defaultValue", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, selectOnFocus: { classPropertyName: "selectOnFocus", publicName: "selectOnFocus", isSignal: true, isRequired: false, transformFunction: null }, submitMode: { classPropertyName: "submitMode", publicName: "submitMode", isSignal: true, isRequired: false, transformFunction: null }, maxLength: { classPropertyName: "maxLength", publicName: "maxLength", isSignal: true, isRequired: false, transformFunction: null }, startWithEditMode: { classPropertyName: "startWithEditMode", publicName: "startWithEditMode", isSignal: true, isRequired: false, transformFunction: null }, activationMode: { classPropertyName: "activationMode", publicName: "activationMode", isSignal: true, isRequired: false, transformFunction: null }, autoResize: { classPropertyName: "autoResize", publicName: "autoResize", isSignal: true, isRequired: false, transformFunction: null }, required: { classPropertyName: "required", publicName: "required", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange", onValueChange: "onValueChange" }, host: { properties: { "attr.data-dismissable-layer": "\"\"" } }, providers: [provideEditableRootContext(rootContext)], exportAs: ["rdxEditableRoot"], hostDirectives: [{ directive: i1.RdxFocusOutside }, { directive: i1.RdxPointerDownOutside }], ngImport: i0 }); }
99
132
  }
100
133
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: RdxEditableRoot, decorators: [{
101
134
  type: Directive,
@@ -108,11 +141,259 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
108
141
  '[attr.data-dismissable-layer]': '""'
109
142
  }
110
143
  }]
111
- }], ctorParameters: () => [], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], readonly: [{ type: i0.Input, args: [{ isSignal: true, alias: "readonly", required: false }] }], selectOnFocus: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectOnFocus", required: false }] }], submitMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "submitMode", required: false }] }], maxLength: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxLength", required: false }] }], startWithEditMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "startWithEditMode", required: false }] }], activationMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "activationMode", required: false }] }], autoResize: [{ type: i0.Input, args: [{ isSignal: true, alias: "autoResize", required: false }] }], required: [{ type: i0.Input, args: [{ isSignal: true, alias: "required", required: false }] }] } });
144
+ }], ctorParameters: () => [], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], defaultValue: [{ type: i0.Input, args: [{ isSignal: true, alias: "defaultValue", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], readonly: [{ type: i0.Input, args: [{ isSignal: true, alias: "readonly", required: false }] }], selectOnFocus: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectOnFocus", required: false }] }], submitMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "submitMode", required: false }] }], maxLength: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxLength", required: false }] }], startWithEditMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "startWithEditMode", required: false }] }], activationMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "activationMode", required: false }] }], autoResize: [{ type: i0.Input, args: [{ isSignal: true, alias: "autoResize", required: false }] }], required: [{ type: i0.Input, args: [{ isSignal: true, alias: "required", required: false }] }], onValueChange: [{ type: i0.Output, args: ["onValueChange"] }] } });
145
+
146
+ class RdxEditableArea {
147
+ constructor() {
148
+ this.rootContext = injectEditableRootContext();
149
+ }
150
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: RdxEditableArea, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
151
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.9", type: RdxEditableArea, isStandalone: true, selector: "[rdxEditableArea]", host: { properties: { "attr.data-placeholder-shown": "rootContext.isEditing() ? undefined : \"\"", "attr.data-focus": "rootContext.isEditing() ? \"\" : undefined", "attr.data-empty": "rootContext.isEmpty() ? \"\" : undefined", "attr.data-readonly": "rootContext.readonly() ? \"\" : undefined", "attr.data-disabled": "rootContext.disabled() ? \"\" : undefined", "attr.data-auto-resize": "rootContext.autoResize() ? \"\" : undefined", "style.display": "rootContext.autoResize() ? \"inline-grid\" : undefined" } }, ngImport: i0 }); }
152
+ }
153
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: RdxEditableArea, decorators: [{
154
+ type: Directive,
155
+ args: [{
156
+ selector: '[rdxEditableArea]',
157
+ host: {
158
+ '[attr.data-placeholder-shown]': 'rootContext.isEditing() ? undefined : ""',
159
+ '[attr.data-focus]': 'rootContext.isEditing() ? "" : undefined',
160
+ '[attr.data-empty]': 'rootContext.isEmpty() ? "" : undefined',
161
+ '[attr.data-readonly]': 'rootContext.readonly() ? "" : undefined',
162
+ '[attr.data-disabled]': 'rootContext.disabled() ? "" : undefined',
163
+ '[attr.data-auto-resize]': 'rootContext.autoResize() ? "" : undefined',
164
+ // Auto-resize overlays the preview and input in a single grid cell so the area
165
+ // sizes to the larger of the two. This is the layout mechanism for the feature,
166
+ // not theming; consumers style everything else via the data-* attributes above.
167
+ '[style.display]': 'rootContext.autoResize() ? "inline-grid" : undefined'
168
+ }
169
+ }]
170
+ }] });
171
+
172
+ class RdxEditableCancelTrigger {
173
+ constructor() {
174
+ this.rootContext = injectEditableRootContext();
175
+ /** Accessible label for the trigger. Override to localize. */
176
+ this.ariaLabel = input('cancel', { ...(ngDevMode ? { debugName: "ariaLabel" } : /* istanbul ignore next */ {}), alias: 'aria-label' });
177
+ }
178
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: RdxEditableCancelTrigger, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
179
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.9", type: RdxEditableCancelTrigger, isStandalone: true, selector: "button[rdxEditableCancelTrigger]", inputs: { ariaLabel: { classPropertyName: "ariaLabel", publicName: "aria-label", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "type": "button" }, listeners: { "click": "rootContext.cancel()" }, properties: { "attr.aria-label": "ariaLabel()", "attr.data-disabled": "rootContext.disabled() ? \"\" : undefined", "attr.disabled": "rootContext.disabled() ? \"\" : undefined", "attr.hidden": "rootContext.isEditing() ? \"\" : undefined" } }, ngImport: i0 }); }
180
+ }
181
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: RdxEditableCancelTrigger, decorators: [{
182
+ type: Directive,
183
+ args: [{
184
+ selector: 'button[rdxEditableCancelTrigger]',
185
+ host: {
186
+ type: 'button',
187
+ '[attr.aria-label]': 'ariaLabel()',
188
+ '[attr.data-disabled]': 'rootContext.disabled() ? "" : undefined',
189
+ '[attr.disabled]': 'rootContext.disabled() ? "" : undefined',
190
+ '[attr.hidden]': 'rootContext.isEditing() ? "" : undefined',
191
+ '(click)': 'rootContext.cancel()'
192
+ }
193
+ }]
194
+ }], propDecorators: { ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "aria-label", required: false }] }] } });
195
+
196
+ class RdxEditableEditTrigger {
197
+ constructor() {
198
+ this.rootContext = injectEditableRootContext();
199
+ /** Accessible label for the trigger. Override to localize. */
200
+ this.ariaLabel = input('edit', { ...(ngDevMode ? { debugName: "ariaLabel" } : /* istanbul ignore next */ {}), alias: 'aria-label' });
201
+ }
202
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: RdxEditableEditTrigger, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
203
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.9", type: RdxEditableEditTrigger, isStandalone: true, selector: "button[rdxEditableEditTrigger]", inputs: { ariaLabel: { classPropertyName: "ariaLabel", publicName: "aria-label", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "type": "button" }, listeners: { "click": "rootContext.edit()" }, properties: { "attr.aria-label": "ariaLabel()", "attr.data-disabled": "rootContext.disabled() ? \"\" : undefined", "attr.disabled": "rootContext.disabled() ? \"\" : undefined", "attr.hidden": "rootContext.isEditing() ? \"\" : undefined" } }, ngImport: i0 }); }
204
+ }
205
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: RdxEditableEditTrigger, decorators: [{
206
+ type: Directive,
207
+ args: [{
208
+ selector: 'button[rdxEditableEditTrigger]',
209
+ host: {
210
+ type: 'button',
211
+ '[attr.aria-label]': 'ariaLabel()',
212
+ '[attr.data-disabled]': 'rootContext.disabled() ? "" : undefined',
213
+ '[attr.disabled]': 'rootContext.disabled() ? "" : undefined',
214
+ '[attr.hidden]': 'rootContext.isEditing() ? "" : undefined',
215
+ '(click)': 'rootContext.edit()'
216
+ }
217
+ }]
218
+ }], propDecorators: { ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "aria-label", required: false }] }] } });
219
+
220
+ class RdxEditableInput {
221
+ constructor() {
222
+ this.inputRef = inject(ElementRef).nativeElement;
223
+ this.rootContext = injectEditableRootContext();
224
+ /** Accessible label for the input. Override to localize. */
225
+ this.ariaLabel = input('editable input', { ...(ngDevMode ? { debugName: "ariaLabel" } : /* istanbul ignore next */ {}), alias: 'aria-label' });
226
+ this.placeholder = computed(() => this.rootContext.placeholder().edit, ...(ngDevMode ? [{ debugName: "placeholder" }] : /* istanbul ignore next */ []));
227
+ this.disabled = computed(() => this.rootContext.disabled(), ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
228
+ afterNextRender(() => {
229
+ this.rootContext.inputRef.set(this.inputRef);
230
+ });
231
+ // Focus (and optionally select) the input whenever it enters edit mode.
232
+ // Runs after render so the input is no longer hidden, and is browser-only (SSR-safe).
233
+ afterRenderEffect(() => {
234
+ const editing = this.rootContext.isEditing();
235
+ const el = this.rootContext.inputRef();
236
+ if (editing && el) {
237
+ el.focus({ preventScroll: true });
238
+ if (this.rootContext.selectOnFocus()) {
239
+ el.select();
240
+ }
241
+ }
242
+ });
243
+ }
244
+ handleInput(event) {
245
+ this.rootContext.inputValue.set(event.target.value);
246
+ }
247
+ handleSubmitKeyDown(event) {
248
+ const keyEvent = event;
249
+ if ((this.rootContext.submitMode() === 'enter' || this.rootContext.submitMode() === 'both') &&
250
+ keyEvent.key === ENTER &&
251
+ !keyEvent.shiftKey &&
252
+ !keyEvent.metaKey) {
253
+ this.rootContext.submit();
254
+ }
255
+ }
256
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: RdxEditableInput, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
257
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.9", type: RdxEditableInput, isStandalone: true, selector: "input[rdxEditableInput]", inputs: { ariaLabel: { classPropertyName: "ariaLabel", publicName: "aria-label", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "input": "handleInput($event)", "keydown.escape": "rootContext.cancel()", "keydown.enter": "handleSubmitKeyDown($event)" }, properties: { "attr.aria-label": "ariaLabel()", "attr.aria-required": "rootContext.required() ? \"true\" : undefined", "attr.data-disabled": "disabled() ? \"\" : undefined", "attr.data-readonly": "rootContext.readonly() ? \"\" : undefined", "readonly": "rootContext.readonly()", "required": "rootContext.required()", "attr.disabled": "disabled() ? \"\" : undefined", "attr.maxlength": "rootContext.maxLength()", "attr.value": "rootContext.inputValue()", "attr.placeholder": "placeholder()", "attr.data-auto-resize": "rootContext.autoResize() ? \"\" : undefined", "attr.hidden": "rootContext.autoResize() || rootContext.isEditing() ? undefined : \"\"", "style.all": "rootContext.autoResize() ? \"unset\" : undefined", "style.grid-area": "rootContext.autoResize() ? \"1 / 1 / auto / auto\" : undefined", "style.visibility": "rootContext.autoResize() && !rootContext.isEditing() ? \"hidden\" : undefined" } }, ngImport: i0 }); }
258
+ }
259
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: RdxEditableInput, decorators: [{
260
+ type: Directive,
261
+ args: [{
262
+ selector: 'input[rdxEditableInput]',
263
+ host: {
264
+ '[attr.aria-label]': 'ariaLabel()',
265
+ '[attr.aria-required]': 'rootContext.required() ? "true" : undefined',
266
+ '[attr.data-disabled]': 'disabled() ? "" : undefined',
267
+ '[attr.data-readonly]': 'rootContext.readonly() ? "" : undefined',
268
+ '[readonly]': 'rootContext.readonly()',
269
+ '[required]': 'rootContext.required()',
270
+ '[attr.disabled]': 'disabled() ? "" : undefined',
271
+ '[attr.maxlength]': 'rootContext.maxLength()',
272
+ '[attr.value]': 'rootContext.inputValue()',
273
+ '[attr.placeholder]': 'placeholder()',
274
+ '[attr.data-auto-resize]': 'rootContext.autoResize() ? "" : undefined',
275
+ '[attr.hidden]': 'rootContext.autoResize() || rootContext.isEditing() ? undefined : ""',
276
+ // Auto-resize overlay mechanism (see RdxEditableArea): strip native chrome with `all: unset`
277
+ // and share the preview's grid cell so the input inherits its measured width.
278
+ '[style.all]': 'rootContext.autoResize() ? "unset" : undefined',
279
+ '[style.grid-area]': 'rootContext.autoResize() ? "1 / 1 / auto / auto" : undefined',
280
+ '[style.visibility]': 'rootContext.autoResize() && !rootContext.isEditing() ? "hidden" : undefined',
281
+ '(input)': 'handleInput($event)',
282
+ '(keydown.escape)': 'rootContext.cancel()',
283
+ '(keydown.enter)': 'handleSubmitKeyDown($event)'
284
+ }
285
+ }]
286
+ }], ctorParameters: () => [], propDecorators: { ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "aria-label", required: false }] }] } });
287
+
288
+ class RdxEditablePreview {
289
+ constructor() {
290
+ this.elementRef = inject(ElementRef);
291
+ this.rootContext = injectEditableRootContext();
292
+ this.placeholder = computed(() => {
293
+ return this.rootContext.placeholder().preview;
294
+ }, ...(ngDevMode ? [{ debugName: "placeholder" }] : /* istanbul ignore next */ []));
295
+ afterNextRender(() => {
296
+ this.rootContext.previewRef.set(this.elementRef.nativeElement);
297
+ });
298
+ }
299
+ handleFocus() {
300
+ // Ignore focus that we restored programmatically after leaving edit mode,
301
+ // otherwise focus-mode activation would immediately re-open the editor.
302
+ if (this.rootContext.activationMode() === 'focus' && this.rootContext.canActivateOnFocus()) {
303
+ this.rootContext.edit();
304
+ }
305
+ }
306
+ handleDoubleClick() {
307
+ if (this.rootContext.activationMode() === 'dblclick') {
308
+ this.rootContext.edit();
309
+ }
310
+ }
311
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: RdxEditablePreview, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
312
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.9", type: RdxEditablePreview, isStandalone: true, selector: "span[rdxEditablePreview]", host: { attributes: { "tabindex": "0" }, listeners: { "focusin": "handleFocus()", "dblclick": "handleDoubleClick()" }, properties: { "attr.data-placeholder-shown": "rootContext.isEditing() ? undefined : \"\"", "attr.data-auto-resize": "rootContext.autoResize() ? \"\" : undefined", "attr.hidden": "!rootContext.autoResize() && rootContext.isEditing() ? \"\" : undefined", "style.grid-area": "rootContext.autoResize() ? \"1 / 1 / auto / auto\" : undefined", "style.white-space": "rootContext.autoResize() ? \"pre\" : undefined", "style.visibility": "rootContext.autoResize() && rootContext.isEditing() ? \"hidden\" : undefined" } }, exportAs: ["rdxEditablePreview"], ngImport: i0 }); }
313
+ }
314
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: RdxEditablePreview, decorators: [{
315
+ type: Directive,
316
+ args: [{
317
+ selector: 'span[rdxEditablePreview]',
318
+ exportAs: 'rdxEditablePreview',
319
+ host: {
320
+ tabindex: '0',
321
+ '[attr.data-placeholder-shown]': 'rootContext.isEditing() ? undefined : ""',
322
+ '[attr.data-auto-resize]': 'rootContext.autoResize() ? "" : undefined',
323
+ '[attr.hidden]': '!rootContext.autoResize() && rootContext.isEditing() ? "" : undefined',
324
+ // Auto-resize overlay mechanism (see RdxEditableArea): share the grid cell with the input
325
+ // and stay measurable so the area keeps the preview's width while editing. `white-space: pre`
326
+ // keeps that measured width stable. Cosmetics (overflow, ellipsis, user-select) are left to
327
+ // the consumer via [data-auto-resize].
328
+ '[style.grid-area]': 'rootContext.autoResize() ? "1 / 1 / auto / auto" : undefined',
329
+ '[style.white-space]': 'rootContext.autoResize() ? "pre" : undefined',
330
+ '[style.visibility]': 'rootContext.autoResize() && rootContext.isEditing() ? "hidden" : undefined',
331
+ '(focusin)': 'handleFocus()',
332
+ '(dblclick)': 'handleDoubleClick()'
333
+ }
334
+ }]
335
+ }], ctorParameters: () => [] });
336
+
337
+ class RdxEditableSubmitTrigger {
338
+ constructor() {
339
+ this.rootContext = injectEditableRootContext();
340
+ /** Accessible label for the trigger. Override to localize. */
341
+ this.ariaLabel = input('submit', { ...(ngDevMode ? { debugName: "ariaLabel" } : /* istanbul ignore next */ {}), alias: 'aria-label' });
342
+ }
343
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: RdxEditableSubmitTrigger, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
344
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.2.9", type: RdxEditableSubmitTrigger, isStandalone: true, selector: "button[rdxEditableSubmitTrigger]", inputs: { ariaLabel: { classPropertyName: "ariaLabel", publicName: "aria-label", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "type": "button" }, listeners: { "click": "rootContext.submit()" }, properties: { "attr.aria-label": "ariaLabel()", "attr.data-disabled": "rootContext.disabled() ? \"\" : undefined", "attr.disabled": "rootContext.disabled() ? \"\" : undefined" } }, ngImport: i0 }); }
345
+ }
346
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: RdxEditableSubmitTrigger, decorators: [{
347
+ type: Directive,
348
+ args: [{
349
+ selector: 'button[rdxEditableSubmitTrigger]',
350
+ host: {
351
+ type: 'button',
352
+ '[attr.aria-label]': 'ariaLabel()',
353
+ '[attr.data-disabled]': 'rootContext.disabled() ? "" : undefined',
354
+ '[attr.disabled]': 'rootContext.disabled() ? "" : undefined',
355
+ '(click)': 'rootContext.submit()'
356
+ }
357
+ }]
358
+ }], propDecorators: { ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "aria-label", required: false }] }] } });
359
+
360
+ const _imports = [
361
+ RdxEditableRoot,
362
+ RdxEditableArea,
363
+ RdxEditablePreview,
364
+ RdxEditableInput,
365
+ RdxEditableEditTrigger,
366
+ RdxEditableSubmitTrigger,
367
+ RdxEditableCancelTrigger
368
+ ];
369
+ class RdxEditableModule {
370
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: RdxEditableModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
371
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.2.9", ngImport: i0, type: RdxEditableModule, imports: [RdxEditableRoot,
372
+ RdxEditableArea,
373
+ RdxEditablePreview,
374
+ RdxEditableInput,
375
+ RdxEditableEditTrigger,
376
+ RdxEditableSubmitTrigger,
377
+ RdxEditableCancelTrigger], exports: [RdxEditableRoot,
378
+ RdxEditableArea,
379
+ RdxEditablePreview,
380
+ RdxEditableInput,
381
+ RdxEditableEditTrigger,
382
+ RdxEditableSubmitTrigger,
383
+ RdxEditableCancelTrigger] }); }
384
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: RdxEditableModule }); }
385
+ }
386
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: RdxEditableModule, decorators: [{
387
+ type: NgModule,
388
+ args: [{
389
+ imports: [..._imports],
390
+ exports: [..._imports]
391
+ }]
392
+ }] });
112
393
 
113
394
  /**
114
395
  * Generated bundle index. Do not edit.
115
396
  */
116
397
 
117
- export { RdxEditableRoot, injectEditableRootContext, provideEditableRootContext };
398
+ export { RdxEditableArea, RdxEditableCancelTrigger, RdxEditableEditTrigger, RdxEditableInput, RdxEditableModule, RdxEditablePreview, RdxEditableRoot, RdxEditableSubmitTrigger, injectEditableRootContext, provideEditableRootContext };
118
399
  //# sourceMappingURL=radix-ng-primitives-editable.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"radix-ng-primitives-editable.mjs","sources":["../../../packages/primitives/editable/src/editable-root.ts","../../../packages/primitives/editable/radix-ng-primitives-editable.ts"],"sourcesContent":["import {\n afterNextRender,\n booleanAttribute,\n computed,\n Directive,\n inject,\n input,\n model,\n numberAttribute,\n Signal,\n signal,\n WritableSignal\n} from '@angular/core';\nimport { BooleanInput, createContext, NumberInput, watch } from '@radix-ng/primitives/core';\nimport { RdxFocusOutside, RdxPointerDownOutside } from '@radix-ng/primitives/dismissable-layer';\n\ntype EditableRootContext = {\n disabled: Signal<boolean>;\n value: Signal<string | null | undefined>;\n inputValue: WritableSignal<string | undefined>;\n placeholder: Signal<{ edit: string; preview: string }>;\n isEditing: Signal<boolean>;\n submitMode: Signal<SubmitMode>;\n activationMode: Signal<ActivationMode>;\n edit: () => void;\n cancel: () => void;\n submit: () => void;\n maxLength: Signal<number | undefined>;\n startWithEditMode: Signal<boolean>;\n isEmpty: Signal<boolean>;\n readonly: Signal<boolean>;\n selectOnFocus: Signal<boolean>;\n autoResize: Signal<boolean>;\n inputRef: WritableSignal<HTMLInputElement | undefined>;\n};\n\nexport const [injectEditableRootContext, provideEditableRootContext] =\n createContext<EditableRootContext>('EditableRoot');\n\nconst rootContext = (): EditableRootContext => {\n const context = inject(RdxEditableRoot);\n return {\n disabled: context.disabled,\n value: context.value,\n inputValue: context.inputValue,\n placeholder: context.$placeholder as Signal<{ edit: string; preview: string }>,\n isEditing: context.isEditing,\n submitMode: context.submitMode,\n activationMode: context.activationMode,\n edit: context.edit,\n cancel: context.cancel,\n submit: context.submit,\n maxLength: context.maxLength,\n startWithEditMode: context.startWithEditMode,\n isEmpty: context.isEmpty,\n readonly: context.readonly,\n autoResize: context.autoResize,\n selectOnFocus: context.selectOnFocus,\n inputRef: context.inputRef\n };\n};\n\ntype ActivationMode = 'focus' | 'dblclick' | 'none';\ntype SubmitMode = 'blur' | 'enter' | 'none' | 'both';\n\n/**\n * @group Components\n */\n@Directive({\n selector: '[rdxEditableRoot]',\n exportAs: 'rdxEditableRoot',\n providers: [provideEditableRootContext(rootContext)],\n hostDirectives: [RdxFocusOutside, RdxPointerDownOutside],\n host: {\n '[attr.data-dismissable-layer]': '\"\"'\n }\n})\nexport class RdxEditableRoot {\n private readonly focusOutside = inject(RdxFocusOutside);\n readonly pointerDownOutside = inject(RdxPointerDownOutside);\n\n readonly value = model<string>();\n\n readonly placeholder = input<string>('Enter text...');\n\n readonly disabled = input<boolean, BooleanInput>(false, { transform: booleanAttribute });\n\n readonly readonly = input<boolean, BooleanInput>(false, { transform: booleanAttribute });\n\n readonly selectOnFocus = input<boolean, BooleanInput>(false, { transform: booleanAttribute });\n\n readonly submitMode = input<SubmitMode>('blur');\n\n readonly maxLength = input<number, NumberInput>(undefined, { transform: numberAttribute });\n\n /**\n * Whether to start with the edit mode active\n */\n readonly startWithEditMode = input<boolean, BooleanInput>(false, { transform: booleanAttribute });\n\n readonly activationMode = input<ActivationMode>('focus');\n\n readonly autoResize = input<boolean, BooleanInput>(false, { transform: booleanAttribute });\n\n readonly required = input<boolean, BooleanInput>(false, { transform: booleanAttribute });\n\n readonly isEmpty = computed(() => this.value() === '');\n\n readonly $placeholder = computed(() => {\n return typeof this.placeholder() === 'string'\n ? { edit: this.placeholder(), preview: this.placeholder() }\n : this.placeholder();\n });\n\n readonly isEditing = signal(false);\n\n readonly inputValue = signal(this.value());\n\n readonly inputRef = signal<HTMLInputElement | undefined>(undefined);\n\n constructor() {\n watch([this.value], ([value]) => {\n if (value) {\n this.inputValue.set(this.value());\n }\n });\n\n watch([this.isEditing], ([value]) => {\n this.pointerDownOutside.enabled = value;\n this.focusOutside.enabled = value;\n });\n\n this.pointerDownOutside.pointerDownOutside.subscribe(() => this.handleDismiss());\n this.focusOutside.focusOutside.subscribe(() => this.handleDismiss());\n\n afterNextRender(() => {\n this.isEditing.set(this.startWithEditMode() ?? false);\n this.inputValue.set(this.value());\n });\n }\n\n handleDismiss() {\n if (this.isEditing()) {\n if (this.submitMode() === 'blur' || this.submitMode() === 'both') {\n this.submit();\n } else {\n this.cancel();\n }\n }\n }\n\n submit() {\n this.value.set(this.inputValue());\n this.isEditing.set(false);\n }\n\n cancel() {\n this.isEditing.set(false);\n }\n\n edit() {\n this.isEditing.set(true);\n this.inputValue.set(this.value());\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"radix-ng-primitives-editable.mjs","sources":["../../../packages/primitives/editable/src/editable-root.ts","../../../packages/primitives/editable/src/editable-area.ts","../../../packages/primitives/editable/src/editable-cancel-trigger.ts","../../../packages/primitives/editable/src/editable-edit-trigger.ts","../../../packages/primitives/editable/src/editable-input.ts","../../../packages/primitives/editable/src/editable-preview.ts","../../../packages/primitives/editable/src/editable-submit-trigger.ts","../../../packages/primitives/editable/index.ts","../../../packages/primitives/editable/radix-ng-primitives-editable.ts"],"sourcesContent":["import {\n afterRenderEffect,\n booleanAttribute,\n computed,\n Directive,\n effect,\n inject,\n input,\n linkedSignal,\n model,\n numberAttribute,\n output,\n signal,\n Signal,\n WritableSignal\n} from '@angular/core';\nimport { BooleanInput, createContext, NumberInput, watch } from '@radix-ng/primitives/core';\nimport { RdxFocusOutside, RdxPointerDownOutside } from '@radix-ng/primitives/dismissable-layer';\n\nexport type EditableActivationMode = 'focus' | 'dblclick' | 'none';\nexport type EditableSubmitMode = 'blur' | 'enter' | 'none' | 'both';\n\nexport type EditableRootContext = {\n disabled: Signal<boolean>;\n value: Signal<string | undefined>;\n inputValue: WritableSignal<string | undefined>;\n placeholder: Signal<{ edit: string; preview: string }>;\n isEditing: Signal<boolean>;\n submitMode: Signal<EditableSubmitMode>;\n activationMode: Signal<EditableActivationMode>;\n edit: () => void;\n cancel: () => void;\n submit: () => void;\n maxLength: Signal<number | undefined>;\n required: Signal<boolean>;\n startWithEditMode: Signal<boolean>;\n isEmpty: Signal<boolean>;\n readonly: Signal<boolean>;\n selectOnFocus: Signal<boolean>;\n autoResize: Signal<boolean>;\n inputRef: WritableSignal<HTMLInputElement | undefined>;\n previewRef: WritableSignal<HTMLElement | undefined>;\n canActivateOnFocus: () => boolean;\n};\n\nexport const [injectEditableRootContext, provideEditableRootContext] = createContext<EditableRootContext>(\n 'EditableRoot',\n 'components/editable'\n);\n\nconst rootContext = (): EditableRootContext => {\n const context = inject(RdxEditableRoot);\n return {\n disabled: context.disabled,\n value: context.value,\n inputValue: context.inputValue,\n placeholder: context.$placeholder,\n isEditing: context.isEditing,\n submitMode: context.submitMode,\n activationMode: context.activationMode,\n edit: () => context.edit(),\n cancel: () => context.cancel(),\n submit: () => context.submit(),\n maxLength: context.maxLength,\n required: context.required,\n startWithEditMode: context.startWithEditMode,\n isEmpty: context.isEmpty,\n readonly: context.readonly,\n autoResize: context.autoResize,\n selectOnFocus: context.selectOnFocus,\n inputRef: context.inputRef,\n previewRef: context.previewRef,\n canActivateOnFocus: () => context.canActivateOnFocus()\n };\n};\n\n/**\n * @group Components\n */\n@Directive({\n selector: '[rdxEditableRoot]',\n exportAs: 'rdxEditableRoot',\n providers: [provideEditableRootContext(rootContext)],\n hostDirectives: [RdxFocusOutside, RdxPointerDownOutside],\n host: {\n '[attr.data-dismissable-layer]': '\"\"'\n }\n})\nexport class RdxEditableRoot {\n private readonly focusOutside = inject(RdxFocusOutside);\n private readonly pointerDownOutside = inject(RdxPointerDownOutside);\n\n readonly value = model<string>();\n\n /** Uncontrolled initial value. */\n readonly defaultValue = input<string>();\n\n readonly placeholder = input<string>('Enter text...');\n\n readonly disabled = input<boolean, BooleanInput>(false, { transform: booleanAttribute });\n\n readonly readonly = input<boolean, BooleanInput>(false, { transform: booleanAttribute });\n\n readonly selectOnFocus = input<boolean, BooleanInput>(false, { transform: booleanAttribute });\n\n readonly submitMode = input<EditableSubmitMode>('blur');\n\n readonly maxLength = input<number | undefined, NumberInput>(undefined, { transform: numberAttribute });\n\n /**\n * Whether to start with the edit mode active\n */\n readonly startWithEditMode = input<boolean, BooleanInput>(false, { transform: booleanAttribute });\n\n readonly activationMode = input<EditableActivationMode>('focus');\n\n readonly autoResize = input<boolean, BooleanInput>(false, { transform: booleanAttribute });\n\n readonly required = input<boolean, BooleanInput>(false, { transform: booleanAttribute });\n\n /** Emitted when the value is committed (on submit). */\n readonly onValueChange = output<string>();\n\n readonly isEmpty = computed(() => {\n const value = this.value();\n return value === undefined || value === null || value === '';\n });\n\n readonly $placeholder = computed(() => {\n const placeholder = this.placeholder();\n return { edit: placeholder, preview: placeholder };\n });\n\n /** Seeded from `startWithEditMode`; flipped imperatively by edit/submit/cancel. */\n readonly isEditing = linkedSignal(() => this.startWithEditMode());\n\n /** Working copy of the value while editing; reseeded whenever the committed value changes. */\n readonly inputValue = linkedSignal(() => this.value());\n\n readonly inputRef = signal<HTMLInputElement | undefined>(undefined);\n\n readonly previewRef = signal<HTMLElement | undefined>(undefined);\n\n private restoreFocusOnExit = false;\n\n /** True while focus is being restored programmatically, to avoid re-entering edit mode. */\n private suppressFocusActivation = false;\n\n constructor() {\n effect(() => {\n if (this.defaultValue() !== undefined) {\n this.value.set(this.defaultValue());\n }\n });\n\n watch([this.isEditing], ([value]) => {\n this.pointerDownOutside.enabled = value;\n this.focusOutside.enabled = value;\n });\n\n this.pointerDownOutside.pointerDownOutside.subscribe(() => this.handleDismiss());\n this.focusOutside.focusOutside.subscribe(() => this.handleDismiss());\n\n // Restore focus to the preview after leaving edit mode, once the input is hidden\n // and the preview is visible again. Runs after render so the DOM reflects isEditing.\n afterRenderEffect(() => {\n const editing = this.isEditing();\n if (!editing && this.restoreFocusOnExit) {\n this.restoreFocusOnExit = false;\n const preview = this.previewRef();\n if (preview) {\n this.suppressFocusActivation = true;\n preview.focus({ preventScroll: true });\n this.suppressFocusActivation = false;\n }\n }\n });\n }\n\n canActivateOnFocus(): boolean {\n return !this.suppressFocusActivation;\n }\n\n handleDismiss() {\n if (this.isEditing()) {\n if (this.submitMode() === 'blur' || this.submitMode() === 'both') {\n this.submit();\n } else {\n this.cancel();\n }\n }\n }\n\n submit() {\n const value = this.inputValue() ?? '';\n this.value.set(value);\n this.onValueChange.emit(value);\n this.restoreFocusOnExit = true;\n this.isEditing.set(false);\n }\n\n cancel() {\n this.inputValue.set(this.value());\n this.restoreFocusOnExit = true;\n this.isEditing.set(false);\n }\n\n edit() {\n this.inputValue.set(this.value());\n this.isEditing.set(true);\n }\n}\n","import { Directive } from '@angular/core';\nimport { injectEditableRootContext } from './editable-root';\n\n@Directive({\n selector: '[rdxEditableArea]',\n host: {\n '[attr.data-placeholder-shown]': 'rootContext.isEditing() ? undefined : \"\"',\n '[attr.data-focus]': 'rootContext.isEditing() ? \"\" : undefined',\n '[attr.data-empty]': 'rootContext.isEmpty() ? \"\" : undefined',\n '[attr.data-readonly]': 'rootContext.readonly() ? \"\" : undefined',\n '[attr.data-disabled]': 'rootContext.disabled() ? \"\" : undefined',\n '[attr.data-auto-resize]': 'rootContext.autoResize() ? \"\" : undefined',\n // Auto-resize overlays the preview and input in a single grid cell so the area\n // sizes to the larger of the two. This is the layout mechanism for the feature,\n // not theming; consumers style everything else via the data-* attributes above.\n '[style.display]': 'rootContext.autoResize() ? \"inline-grid\" : undefined'\n }\n})\nexport class RdxEditableArea {\n protected readonly rootContext = injectEditableRootContext();\n}\n","import { Directive, input } from '@angular/core';\nimport { injectEditableRootContext } from './editable-root';\n\n@Directive({\n selector: 'button[rdxEditableCancelTrigger]',\n host: {\n type: 'button',\n '[attr.aria-label]': 'ariaLabel()',\n '[attr.data-disabled]': 'rootContext.disabled() ? \"\" : undefined',\n '[attr.disabled]': 'rootContext.disabled() ? \"\" : undefined',\n '[attr.hidden]': 'rootContext.isEditing() ? \"\" : undefined',\n\n '(click)': 'rootContext.cancel()'\n }\n})\nexport class RdxEditableCancelTrigger {\n protected readonly rootContext = injectEditableRootContext();\n\n /** Accessible label for the trigger. Override to localize. */\n readonly ariaLabel = input<string>('cancel', { alias: 'aria-label' });\n}\n","import { Directive, input } from '@angular/core';\nimport { injectEditableRootContext } from './editable-root';\n\n@Directive({\n selector: 'button[rdxEditableEditTrigger]',\n host: {\n type: 'button',\n '[attr.aria-label]': 'ariaLabel()',\n '[attr.data-disabled]': 'rootContext.disabled() ? \"\" : undefined',\n '[attr.disabled]': 'rootContext.disabled() ? \"\" : undefined',\n '[attr.hidden]': 'rootContext.isEditing() ? \"\" : undefined',\n\n '(click)': 'rootContext.edit()'\n }\n})\nexport class RdxEditableEditTrigger {\n protected readonly rootContext = injectEditableRootContext();\n\n /** Accessible label for the trigger. Override to localize. */\n readonly ariaLabel = input<string>('edit', { alias: 'aria-label' });\n}\n","import { afterNextRender, afterRenderEffect, computed, Directive, ElementRef, inject, input } from '@angular/core';\nimport { ENTER } from '@radix-ng/primitives/core';\nimport { injectEditableRootContext } from './editable-root';\n\n@Directive({\n selector: 'input[rdxEditableInput]',\n host: {\n '[attr.aria-label]': 'ariaLabel()',\n '[attr.aria-required]': 'rootContext.required() ? \"true\" : undefined',\n '[attr.data-disabled]': 'disabled() ? \"\" : undefined',\n '[attr.data-readonly]': 'rootContext.readonly() ? \"\" : undefined',\n '[readonly]': 'rootContext.readonly()',\n '[required]': 'rootContext.required()',\n '[attr.disabled]': 'disabled() ? \"\" : undefined',\n '[attr.maxlength]': 'rootContext.maxLength()',\n '[attr.value]': 'rootContext.inputValue()',\n '[attr.placeholder]': 'placeholder()',\n '[attr.data-auto-resize]': 'rootContext.autoResize() ? \"\" : undefined',\n '[attr.hidden]': 'rootContext.autoResize() || rootContext.isEditing() ? undefined : \"\"',\n\n // Auto-resize overlay mechanism (see RdxEditableArea): strip native chrome with `all: unset`\n // and share the preview's grid cell so the input inherits its measured width.\n '[style.all]': 'rootContext.autoResize() ? \"unset\" : undefined',\n '[style.grid-area]': 'rootContext.autoResize() ? \"1 / 1 / auto / auto\" : undefined',\n '[style.visibility]': 'rootContext.autoResize() && !rootContext.isEditing() ? \"hidden\" : undefined',\n\n '(input)': 'handleInput($event)',\n '(keydown.escape)': 'rootContext.cancel()',\n '(keydown.enter)': 'handleSubmitKeyDown($event)'\n }\n})\nexport class RdxEditableInput {\n private readonly inputRef = inject(ElementRef).nativeElement as HTMLInputElement;\n\n protected readonly rootContext = injectEditableRootContext();\n\n /** Accessible label for the input. Override to localize. */\n readonly ariaLabel = input<string>('editable input', { alias: 'aria-label' });\n\n readonly placeholder = computed(() => this.rootContext.placeholder().edit);\n\n readonly disabled = computed(() => this.rootContext.disabled());\n\n constructor() {\n afterNextRender(() => {\n this.rootContext.inputRef.set(this.inputRef);\n });\n\n // Focus (and optionally select) the input whenever it enters edit mode.\n // Runs after render so the input is no longer hidden, and is browser-only (SSR-safe).\n afterRenderEffect(() => {\n const editing = this.rootContext.isEditing();\n const el = this.rootContext.inputRef();\n if (editing && el) {\n el.focus({ preventScroll: true });\n if (this.rootContext.selectOnFocus()) {\n el.select();\n }\n }\n });\n }\n\n handleInput(event: Event) {\n this.rootContext.inputValue.set((event.target as HTMLInputElement).value);\n }\n\n handleSubmitKeyDown(event: Event) {\n const keyEvent = event as KeyboardEvent;\n if (\n (this.rootContext.submitMode() === 'enter' || this.rootContext.submitMode() === 'both') &&\n keyEvent.key === ENTER &&\n !keyEvent.shiftKey &&\n !keyEvent.metaKey\n ) {\n this.rootContext.submit();\n }\n }\n}\n","import { afterNextRender, computed, Directive, ElementRef, inject } from '@angular/core';\nimport { injectEditableRootContext } from './editable-root';\n\n@Directive({\n selector: 'span[rdxEditablePreview]',\n exportAs: 'rdxEditablePreview',\n host: {\n tabindex: '0',\n '[attr.data-placeholder-shown]': 'rootContext.isEditing() ? undefined : \"\"',\n '[attr.data-auto-resize]': 'rootContext.autoResize() ? \"\" : undefined',\n '[attr.hidden]': '!rootContext.autoResize() && rootContext.isEditing() ? \"\" : undefined',\n\n // Auto-resize overlay mechanism (see RdxEditableArea): share the grid cell with the input\n // and stay measurable so the area keeps the preview's width while editing. `white-space: pre`\n // keeps that measured width stable. Cosmetics (overflow, ellipsis, user-select) are left to\n // the consumer via [data-auto-resize].\n '[style.grid-area]': 'rootContext.autoResize() ? \"1 / 1 / auto / auto\" : undefined',\n '[style.white-space]': 'rootContext.autoResize() ? \"pre\" : undefined',\n '[style.visibility]': 'rootContext.autoResize() && rootContext.isEditing() ? \"hidden\" : undefined',\n\n '(focusin)': 'handleFocus()',\n '(dblclick)': 'handleDoubleClick()'\n }\n})\nexport class RdxEditablePreview {\n private readonly elementRef = inject(ElementRef);\n\n protected readonly rootContext = injectEditableRootContext();\n\n readonly placeholder = computed(() => {\n return this.rootContext.placeholder().preview;\n });\n\n constructor() {\n afterNextRender(() => {\n this.rootContext.previewRef.set(this.elementRef.nativeElement);\n });\n }\n\n handleFocus() {\n // Ignore focus that we restored programmatically after leaving edit mode,\n // otherwise focus-mode activation would immediately re-open the editor.\n if (this.rootContext.activationMode() === 'focus' && this.rootContext.canActivateOnFocus()) {\n this.rootContext.edit();\n }\n }\n\n handleDoubleClick() {\n if (this.rootContext.activationMode() === 'dblclick') {\n this.rootContext.edit();\n }\n }\n}\n","import { Directive, input } from '@angular/core';\nimport { injectEditableRootContext } from './editable-root';\n\n@Directive({\n selector: 'button[rdxEditableSubmitTrigger]',\n host: {\n type: 'button',\n '[attr.aria-label]': 'ariaLabel()',\n '[attr.data-disabled]': 'rootContext.disabled() ? \"\" : undefined',\n '[attr.disabled]': 'rootContext.disabled() ? \"\" : undefined',\n '(click)': 'rootContext.submit()'\n }\n})\nexport class RdxEditableSubmitTrigger {\n protected readonly rootContext = injectEditableRootContext();\n\n /** Accessible label for the trigger. Override to localize. */\n readonly ariaLabel = input<string>('submit', { alias: 'aria-label' });\n}\n","import { NgModule } from '@angular/core';\nimport { RdxEditableArea } from './src/editable-area';\nimport { RdxEditableCancelTrigger } from './src/editable-cancel-trigger';\nimport { RdxEditableEditTrigger } from './src/editable-edit-trigger';\nimport { RdxEditableInput } from './src/editable-input';\nimport { RdxEditablePreview } from './src/editable-preview';\nimport { RdxEditableRoot } from './src/editable-root';\nimport { RdxEditableSubmitTrigger } from './src/editable-submit-trigger';\n\nexport * from './src/editable-area';\nexport * from './src/editable-cancel-trigger';\nexport * from './src/editable-edit-trigger';\nexport * from './src/editable-input';\nexport * from './src/editable-preview';\nexport * from './src/editable-root';\nexport * from './src/editable-submit-trigger';\n\nconst _imports = [\n RdxEditableRoot,\n RdxEditableArea,\n RdxEditablePreview,\n RdxEditableInput,\n RdxEditableEditTrigger,\n RdxEditableSubmitTrigger,\n RdxEditableCancelTrigger\n];\n\n@NgModule({\n imports: [..._imports],\n exports: [..._imports]\n})\nexport class RdxEditableModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}