@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.d.mts CHANGED
@@ -351,7 +351,30 @@ declare class ParsedElement extends HTMLElement {
351
351
  template(name?: string): any;
352
352
  connectedCallback(): void;
353
353
  attributeChangedCallback(attr: any, oldValue: any, newValue: any): void;
354
- formDisabledCallback(disabled: any): void;
354
+ /**
355
+ * The disabled protocol follows the semantics of a native form control:
356
+ *
357
+ * - the `disabled` attribute on the host is the field's own claim, and nothing
358
+ * but its author ever writes or removes it, in markup or through the property.
359
+ * The framework never claims on the form's behalf, so there is nothing to
360
+ * unclaim and nothing to lose: a field declared disabled inside a disabled
361
+ * `<fieldset>` stays disabled when the fieldset comes back, exactly like a
362
+ * native input keeps its attribute.
363
+ * - the effective state is the claim OR a disabled fieldset ancestry, which the
364
+ * platform maintains on its own: `:disabled` matches both, a disabled field is
365
+ * left out of the submitted values, and the inner native controls are reached
366
+ * by the ancestry as descendants of the fieldset.
367
+ * - the `disabled` property reflects the claim only, like a native input's: a
368
+ * field disabled by its ancestry reads `false` while `matches(':disabled')`
369
+ * tells the effective state. Un-claiming inside a disabled fieldset cannot
370
+ * enable the field.
371
+ * - the inner controls mirror the claim and nothing else: the ancestry state is
372
+ * never written anywhere, so it can never go stale, and the browser composes
373
+ * the two on its own when it disables and re-enables a fieldset's descendants.
374
+ *
375
+ * Because of this, formDisabledCallback carries nothing the framework needs to
376
+ * apply, and the protocol does not define it.
377
+ */
355
378
  upgrade(): Promise<void>;
356
379
  render(c: any): void;
357
380
  reflect(fn: any): void;
package/dist/ftl.iife.js CHANGED
@@ -4697,27 +4697,30 @@ var ftl = (function (exports) {
4697
4697
  }
4698
4698
  this[attr] = this.unmarshal(attr, newValue);
4699
4699
  }
4700
- #disabledBeforeParsed = null;
4701
- formDisabledCallback(disabled) {
4702
- if (!this.#parsed) {
4703
- this.#disabledBeforeParsed = disabled;
4704
- return;
4705
- }
4706
- Reflect.set(this, 'disabled', disabled);
4707
- if (disabled) {
4708
- this.#unclaimFormDisabled();
4709
- }
4710
- }
4711
- //a disabled ancestor fieldset already matches the element through :disabled, and
4712
- //an attribute of its own would keep the element disabled once the fieldset is
4713
- //re-enabled, as formDisabledCallback(false) is only delivered on an actual state
4714
- //change. a claim of its own made while already disabled by ancestry is safe: the
4715
- //platform fires no callback for it, so it survives the fieldset being re-enabled
4716
- #unclaimFormDisabled() {
4717
- if (this.closest('fieldset:disabled')) {
4718
- this.removeAttribute('disabled');
4719
- }
4720
- }
4700
+ /**
4701
+ * The disabled protocol follows the semantics of a native form control:
4702
+ *
4703
+ * - the `disabled` attribute on the host is the field's own claim, and nothing
4704
+ * but its author ever writes or removes it, in markup or through the property.
4705
+ * The framework never claims on the form's behalf, so there is nothing to
4706
+ * unclaim and nothing to lose: a field declared disabled inside a disabled
4707
+ * `<fieldset>` stays disabled when the fieldset comes back, exactly like a
4708
+ * native input keeps its attribute.
4709
+ * - the effective state is the claim OR a disabled fieldset ancestry, which the
4710
+ * platform maintains on its own: `:disabled` matches both, a disabled field is
4711
+ * left out of the submitted values, and the inner native controls are reached
4712
+ * by the ancestry as descendants of the fieldset.
4713
+ * - the `disabled` property reflects the claim only, like a native input's: a
4714
+ * field disabled by its ancestry reads `false` while `matches(':disabled')`
4715
+ * tells the effective state. Un-claiming inside a disabled fieldset cannot
4716
+ * enable the field.
4717
+ * - the inner controls mirror the claim and nothing else: the ancestry state is
4718
+ * never written anywhere, so it can never go stale, and the browser composes
4719
+ * the two on its own when it disables and re-enables a fieldset's descendants.
4720
+ *
4721
+ * Because of this, formDisabledCallback carries nothing the framework needs to
4722
+ * apply, and the protocol does not define it.
4723
+ */
4721
4724
  async upgrade() {
4722
4725
  if (this.#parsed) {
4723
4726
  return;
@@ -4730,11 +4733,9 @@ var ftl = (function (exports) {
4730
4733
  this.unmarshal(attribute, this.getAttribute(attribute)),
4731
4734
  ]),
4732
4735
  );
4733
- const disabled = this.#disabledBeforeParsed ?? false;
4734
- await this.render({ slots, observed, disabled });
4735
- if (disabled) {
4736
- this.#unclaimFormDisabled();
4737
- }
4736
+ //the declared claim is what render receives: the ancestry state is not
4737
+ //passed around, it is already where it needs to be
4738
+ await this.render({ slots, observed, disabled: this.hasAttribute('disabled') });
4738
4739
  }
4739
4740
  render(c) {}
4740
4741
  reflect(fn) {