@optionfactory/fml 8.0.2 → 8.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/ftl.mjs CHANGED
@@ -4694,27 +4694,30 @@ class ParsedElement extends HTMLElement {
4694
4694
  }
4695
4695
  this[attr] = this.unmarshal(attr, newValue);
4696
4696
  }
4697
- #disabledBeforeParsed = null;
4698
- formDisabledCallback(disabled) {
4699
- if (!this.#parsed) {
4700
- this.#disabledBeforeParsed = disabled;
4701
- return;
4702
- }
4703
- Reflect.set(this, 'disabled', disabled);
4704
- if (disabled) {
4705
- this.#unclaimFormDisabled();
4706
- }
4707
- }
4708
- //a disabled ancestor fieldset already matches the element through :disabled, and
4709
- //an attribute of its own would keep the element disabled once the fieldset is
4710
- //re-enabled, as formDisabledCallback(false) is only delivered on an actual state
4711
- //change. a claim of its own made while already disabled by ancestry is safe: the
4712
- //platform fires no callback for it, so it survives the fieldset being re-enabled
4713
- #unclaimFormDisabled() {
4714
- if (this.closest('fieldset:disabled')) {
4715
- this.removeAttribute('disabled');
4716
- }
4717
- }
4697
+ /**
4698
+ * The disabled protocol follows the semantics of a native form control:
4699
+ *
4700
+ * - the `disabled` attribute on the host is the field's own claim, and nothing
4701
+ * but its author ever writes or removes it, in markup or through the property.
4702
+ * The framework never claims on the form's behalf, so there is nothing to
4703
+ * unclaim and nothing to lose: a field declared disabled inside a disabled
4704
+ * `<fieldset>` stays disabled when the fieldset comes back, exactly like a
4705
+ * native input keeps its attribute.
4706
+ * - the effective state is the claim OR a disabled fieldset ancestry, which the
4707
+ * platform maintains on its own: `:disabled` matches both, a disabled field is
4708
+ * left out of the submitted values, and the inner native controls are reached
4709
+ * by the ancestry as descendants of the fieldset.
4710
+ * - the `disabled` property reflects the claim only, like a native input's: a
4711
+ * field disabled by its ancestry reads `false` while `matches(':disabled')`
4712
+ * tells the effective state. Un-claiming inside a disabled fieldset cannot
4713
+ * enable the field.
4714
+ * - the inner controls mirror the claim and nothing else: the ancestry state is
4715
+ * never written anywhere, so it can never go stale, and the browser composes
4716
+ * the two on its own when it disables and re-enables a fieldset's descendants.
4717
+ *
4718
+ * Because of this, formDisabledCallback carries nothing the framework needs to
4719
+ * apply, and the protocol does not define it.
4720
+ */
4718
4721
  async upgrade() {
4719
4722
  if (this.#parsed) {
4720
4723
  return;
@@ -4727,11 +4730,9 @@ class ParsedElement extends HTMLElement {
4727
4730
  this.unmarshal(attribute, this.getAttribute(attribute)),
4728
4731
  ]),
4729
4732
  );
4730
- const disabled = this.#disabledBeforeParsed ?? false;
4731
- await this.render({ slots, observed, disabled });
4732
- if (disabled) {
4733
- this.#unclaimFormDisabled();
4734
- }
4733
+ //the declared claim is what render receives: the ancestry state is not
4734
+ //passed around, it is already where it needs to be
4735
+ await this.render({ slots, observed, disabled: this.hasAttribute('disabled') });
4735
4736
  }
4736
4737
  render(c) {}
4737
4738
  reflect(fn) {