juxscript 1.1.77 → 1.1.79

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.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "totalComponents": 63,
3
- "generatedAt": "2026-02-11T22:32:45.675Z",
3
+ "generatedAt": "2026-02-12T02:37:11.919Z",
4
4
  "components": [
5
5
  {
6
6
  "file": "alert.js",
package/index.d.ts CHANGED
@@ -44,6 +44,7 @@ import { renderIcon, renderEmoji } from './lib/components/icons.js';
44
44
  import { state } from './lib/reactivity/state.js';
45
45
  import { registry } from './lib/components/registry.js';
46
46
  import { stateHistory } from './lib/components/history/StateHistory.js';
47
+ import { eventChain } from './lib/components/event-chain.js';
47
48
  export { state, registry, stateHistory };
48
49
  export declare const jux: {
49
50
  alert: typeof alert;
@@ -198,5 +199,6 @@ export declare const jux: {
198
199
  renderIcon: typeof renderIcon;
199
200
  renderEmoji: typeof renderEmoji;
200
201
  getOrCreateContainer: typeof getOrCreateContainer;
202
+ eventChain: typeof eventChain;
201
203
  };
202
204
  //# sourceMappingURL=index.d.ts.map
package/index.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"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"}
package/index.js CHANGED
@@ -46,6 +46,7 @@ import { renderIcon, renderEmoji } from './lib/components/icons.js';
46
46
  import { state } from './lib/reactivity/state.js';
47
47
  import { registry } from './lib/components/registry.js'; // ✅ Import registry
48
48
  import { stateHistory } from './lib/components/history/StateHistory.js'; // ✅ Import history
49
+ import { eventChain } from './lib/components/event-chain.js';
49
50
  export { state, registry, stateHistory }; // ✅ Export history
50
51
  // Utilities
51
52
  export const jux = {
@@ -95,5 +96,6 @@ export const jux = {
95
96
  fetch: fetchAPI,
96
97
  renderIcon,
97
98
  renderEmoji,
98
- getOrCreateContainer
99
+ getOrCreateContainer,
100
+ eventChain
99
101
  };
@@ -58,7 +58,7 @@ export declare abstract class FormInput<TState extends FormInputState> extends B
58
58
  */
59
59
  protected _clearError(): void;
60
60
  /**
61
- * Build label element
61
+ * Build label element with auto-generated text from ID if not provided
62
62
  */
63
63
  protected _renderLabel(): HTMLLabelElement;
64
64
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"FormInput.d.ts","sourceRoot":"","sources":["FormInput.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD;;GAEG;AACH,MAAM,WAAW,cAAe,SAAQ,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IACvD,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;;GAGG;AACH,8BAAsB,SAAS,CAAC,MAAM,SAAS,cAAc,CAAE,SAAQ,aAAa,CAAC,MAAM,CAAC;IACxF,SAAS,CAAC,aAAa,EAAE,WAAW,GAAG,IAAI,CAAQ;IACnD,SAAS,CAAC,aAAa,EAAE,gBAAgB,GAAG,IAAI,CAAQ;IACxD,SAAS,CAAC,aAAa,EAAE,WAAW,GAAG,IAAI,CAAQ;IACnD,SAAS,CAAC,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,OAAO,GAAG,MAAM,CAAC;IACzD,SAAS,CAAC,iBAAiB,EAAE,OAAO,CAAS;IAM7C;;OAEG;IACH,QAAQ,CAAC,QAAQ,IAAI,GAAG;IAExB;;OAEG;IACH,QAAQ,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,GAAG,IAAI;IAEnC;;OAEG;IACH,SAAS,CAAC,QAAQ,CAAC,kBAAkB,IAAI,WAAW;IAEpD;;OAEG;IACH,SAAS,CAAC,QAAQ,CAAC,cAAc,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,GAAG,MAAM;IAM/D,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAQ1B,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IAK9B,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAKzB,UAAU,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,OAAO,GAAG,MAAM,GAAG,IAAI;IAS3D;;OAEG;IACH,QAAQ,IAAI,OAAO;IAcnB;;OAEG;IACH,OAAO,IAAI,OAAO;IAKlB;;OAEG;IACH,SAAS,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAa3C;;OAEG;IACH,SAAS,CAAC,WAAW,IAAI,IAAI;IAiB7B;;OAEG;IACH,SAAS,CAAC,YAAY,IAAI,gBAAgB;IAmB1C;;OAEG;IACH,SAAS,CAAC,YAAY,IAAI,WAAW;IAUrC;;OAEG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,IAAI;IAItC;;OAEG;IACH,SAAS,CAAC,aAAa,CAAC,YAAY,EAAE,WAAW,EAAE,SAAS,GAAE,MAAgB,GAAG,IAAI;CA8CxF"}
1
+ {"version":3,"file":"FormInput.d.ts","sourceRoot":"","sources":["FormInput.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGnD;;GAEG;AACH,MAAM,WAAW,cAAe,SAAQ,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IACvD,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;;GAGG;AACH,8BAAsB,SAAS,CAAC,MAAM,SAAS,cAAc,CAAE,SAAQ,aAAa,CAAC,MAAM,CAAC;IACxF,SAAS,CAAC,aAAa,EAAE,WAAW,GAAG,IAAI,CAAQ;IACnD,SAAS,CAAC,aAAa,EAAE,gBAAgB,GAAG,IAAI,CAAQ;IACxD,SAAS,CAAC,aAAa,EAAE,WAAW,GAAG,IAAI,CAAQ;IACnD,SAAS,CAAC,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,OAAO,GAAG,MAAM,CAAC;IACzD,SAAS,CAAC,iBAAiB,EAAE,OAAO,CAAS;IAM7C;;OAEG;IACH,QAAQ,CAAC,QAAQ,IAAI,GAAG;IAExB;;OAEG;IACH,QAAQ,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,GAAG,IAAI;IAEnC;;OAEG;IACH,SAAS,CAAC,QAAQ,CAAC,kBAAkB,IAAI,WAAW;IAEpD;;OAEG;IACH,SAAS,CAAC,QAAQ,CAAC,cAAc,CAAC,KAAK,EAAE,GAAG,GAAG,OAAO,GAAG,MAAM;IAM/D,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAQ1B,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IAK9B,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAKzB,UAAU,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,OAAO,GAAG,MAAM,GAAG,IAAI;IAS3D;;OAEG;IACH,QAAQ,IAAI,OAAO;IAcnB;;OAEG;IACH,OAAO,IAAI,OAAO;IAKlB;;OAEG;IACH,SAAS,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAa3C;;OAEG;IACH,SAAS,CAAC,WAAW,IAAI,IAAI;IAiB7B;;OAEG;IACH,SAAS,CAAC,YAAY,IAAI,gBAAgB;IAqB1C;;OAEG;IACH,SAAS,CAAC,YAAY,IAAI,WAAW;IAUrC;;OAEG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,IAAI;IAItC;;OAEG;IACH,SAAS,CAAC,aAAa,CAAC,YAAY,EAAE,WAAW,EAAE,SAAS,GAAE,MAAgB,GAAG,IAAI;CA8CxF"}
@@ -1,4 +1,5 @@
1
1
  import { BaseComponent } from './BaseComponent.js';
2
+ import { formatIdAsLabel } from '../../utils/formatId.js'; // ✅ Import utility
2
3
  /**
3
4
  * Abstract base class for all form input components
4
5
  * Extends BaseComponent with form-specific functionality
@@ -89,14 +90,15 @@ export class FormInput extends BaseComponent {
89
90
  * COMMON RENDER HELPERS
90
91
  * ═════════════════════════════════════════════════════════════════ */
91
92
  /**
92
- * Build label element
93
+ * Build label element with auto-generated text from ID if not provided
93
94
  */
94
95
  _renderLabel() {
95
96
  const { label, required } = this.state;
96
97
  const labelEl = document.createElement('label');
97
98
  labelEl.className = 'jux-input-label';
98
99
  labelEl.htmlFor = `${this._id}-input`;
99
- labelEl.textContent = label;
100
+ // Use provided label or auto-generate from ID
101
+ labelEl.textContent = label || formatIdAsLabel(this._id);
100
102
  if (required) {
101
103
  const requiredSpan = document.createElement('span');
102
104
  requiredSpan.className = 'jux-input-required';
@@ -1,4 +1,5 @@
1
1
  import { BaseComponent } from './BaseComponent.js';
2
+ import { formatIdAsLabel } from '../../utils/formatId.js'; // ✅ Import utility
2
3
 
3
4
  /**
4
5
  * Base state interface for all form inputs
@@ -141,7 +142,7 @@ export abstract class FormInput<TState extends FormInputState> extends BaseCompo
141
142
  * ═════════════════════════════════════════════════════════════════ */
142
143
 
143
144
  /**
144
- * Build label element
145
+ * Build label element with auto-generated text from ID if not provided
145
146
  */
146
147
  protected _renderLabel(): HTMLLabelElement {
147
148
  const { label, required } = this.state;
@@ -149,7 +150,9 @@ export abstract class FormInput<TState extends FormInputState> extends BaseCompo
149
150
  const labelEl = document.createElement('label');
150
151
  labelEl.className = 'jux-input-label';
151
152
  labelEl.htmlFor = `${this._id}-input`;
152
- labelEl.textContent = label;
153
+
154
+ // ✅ Use provided label or auto-generate from ID
155
+ labelEl.textContent = label || formatIdAsLabel(this._id);
153
156
 
154
157
  if (required) {
155
158
  const requiredSpan = document.createElement('span');
@@ -1 +1 @@
1
- {"version":3,"file":"button.d.ts","sourceRoot":"","sources":["button.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAOxD,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IAChG,IAAI,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAChC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,IAAI,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;IACrC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,KAAK,WAAW,GAAG;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;IACnB,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,qBAAa,MAAO,SAAQ,aAAa,CAAC,WAAW,CAAC;IACpD,OAAO,CAAC,cAAc,CAAkC;gBAE5C,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa;IAkB/C,SAAS,CAAC,gBAAgB,IAAI,SAAS,MAAM,EAAE;IAI/C,SAAS,CAAC,iBAAiB,IAAI,SAAS,MAAM,EAAE;IAUhD,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAK1B,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAKzB,OAAO,CAAC,KAAK,EAAE,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI;IAK3G,IAAI,CAAC,KAAK,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,IAAI;IAK/C,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI;IAK3C,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IAK/B,IAAI,CAAC,KAAK,EAAE,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,IAAI;IAKhD,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,IAAI;IAQtC;;OAEG;IACH,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IAW7B,MAAM,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,aAAa,CAAC,GAAG,CAAC,GAAG,IAAI;CAkDnE;AAED,wBAAgB,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,MAAM,CAElE"}
1
+ {"version":3,"file":"button.d.ts","sourceRoot":"","sources":["button.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAQxD,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IAChG,IAAI,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAChC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,IAAI,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;IACrC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,KAAK,WAAW,GAAG;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;IACnB,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,qBAAa,MAAO,SAAQ,aAAa,CAAC,WAAW,CAAC;IACpD,OAAO,CAAC,cAAc,CAAkC;gBAE5C,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa;IAkB/C,SAAS,CAAC,gBAAgB,IAAI,SAAS,MAAM,EAAE;IAI/C,SAAS,CAAC,iBAAiB,IAAI,SAAS,MAAM,EAAE;IAUhD,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAK1B,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAKzB,OAAO,CAAC,KAAK,EAAE,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI;IAK3G,IAAI,CAAC,KAAK,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,IAAI;IAK/C,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI;IAK3C,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IAK/B,IAAI,CAAC,KAAK,EAAE,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,IAAI;IAKhD,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,IAAI;IAQtC;;OAEG;IACH,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IAW7B,MAAM,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,aAAa,CAAC,GAAG,CAAC,GAAG,IAAI;CAkDnE;AAED,wBAAgB,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,MAAM,CAElE"}
@@ -1,5 +1,6 @@
1
1
  import { BaseComponent } from './base/BaseComponent.js';
2
2
  import { renderIcon } from './icons.js';
3
+ import { formatIdAsLabel } from '../utils/formatId.js'; // ✅ Import utility
3
4
  // Event definitions
4
5
  const TRIGGER_EVENTS = [];
5
6
  const CALLBACK_EVENTS = ['click']; // ✅ Button fires click events
@@ -7,7 +8,7 @@ export class Button extends BaseComponent {
7
8
  constructor(id, options) {
8
9
  const opts = options || {};
9
10
  super(id, {
10
- label: opts.label ?? 'Button',
11
+ label: opts.label ?? formatIdAsLabel(id), // ✅ Use utility for default
11
12
  icon: opts.icon ?? '',
12
13
  variant: opts.variant ?? 'primary',
13
14
  size: opts.size ?? 'medium',
@@ -1,5 +1,6 @@
1
1
  import { BaseComponent } from './base/BaseComponent.js';
2
2
  import { renderIcon } from './icons.js';
3
+ import { formatIdAsLabel } from '../utils/formatId.js'; // ✅ Import utility
3
4
 
4
5
  // Event definitions
5
6
  const TRIGGER_EVENTS = [] as const;
@@ -40,7 +41,7 @@ export class Button extends BaseComponent<ButtonState> {
40
41
  const opts = options || {};
41
42
 
42
43
  super(id, {
43
- label: opts.label ?? 'Button',
44
+ label: opts.label ?? formatIdAsLabel(id), // ✅ Use utility for default
44
45
  icon: opts.icon ?? '',
45
46
  variant: opts.variant ?? 'primary',
46
47
  size: opts.size ?? 'medium',
@@ -0,0 +1,9 @@
1
+ export declare class EventChain {
2
+ #private;
3
+ constructor();
4
+ register(event: string, callback: Function): void;
5
+ trigger(event: string, ...args: any[]): void;
6
+ unregister(event: string, callback: Function): void;
7
+ }
8
+ export declare function eventChain(): EventChain;
9
+ //# sourceMappingURL=event-chain.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-chain.d.ts","sourceRoot":"","sources":["event-chain.ts"],"names":[],"mappings":"AACA,qBAAa,UAAU;;;IAMnB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,IAAI;IAOjD,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAO5C,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,IAAI;CAMtD;AAED,wBAAgB,UAAU,IAAI,UAAU,CAEvC"}
@@ -0,0 +1,33 @@
1
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
2
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
3
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
4
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
5
+ };
6
+ var _EventChain_registeredEvents;
7
+ export class EventChain {
8
+ constructor() {
9
+ _EventChain_registeredEvents.set(this, {});
10
+ }
11
+ register(event, callback) {
12
+ if (!__classPrivateFieldGet(this, _EventChain_registeredEvents, "f")[event]) {
13
+ __classPrivateFieldGet(this, _EventChain_registeredEvents, "f")[event] = [];
14
+ }
15
+ __classPrivateFieldGet(this, _EventChain_registeredEvents, "f")[event].push(callback);
16
+ }
17
+ trigger(event, ...args) {
18
+ const callbacks = __classPrivateFieldGet(this, _EventChain_registeredEvents, "f")[event];
19
+ if (callbacks) {
20
+ callbacks.forEach(callback => callback(...args));
21
+ }
22
+ }
23
+ unregister(event, callback) {
24
+ const callbacks = __classPrivateFieldGet(this, _EventChain_registeredEvents, "f")[event];
25
+ if (callbacks) {
26
+ __classPrivateFieldGet(this, _EventChain_registeredEvents, "f")[event] = callbacks.filter(cb => cb !== callback);
27
+ }
28
+ }
29
+ }
30
+ _EventChain_registeredEvents = new WeakMap();
31
+ export function eventChain() {
32
+ return new EventChain();
33
+ }
@@ -0,0 +1,32 @@
1
+
2
+ export class EventChain {
3
+
4
+ constructor() {
5
+ }
6
+ #registeredEvents: { [key: string]: Function[] } = {};
7
+
8
+ register(event: string, callback: Function): void {
9
+ if (!this.#registeredEvents[event]) {
10
+ this.#registeredEvents[event] = [];
11
+ }
12
+ this.#registeredEvents[event].push(callback);
13
+ }
14
+
15
+ trigger(event: string, ...args: any[]): void {
16
+ const callbacks = this.#registeredEvents[event];
17
+ if (callbacks) {
18
+ callbacks.forEach(callback => callback(...args));
19
+ }
20
+ }
21
+
22
+ unregister(event: string, callback: Function): void {
23
+ const callbacks = this.#registeredEvents[event];
24
+ if (callbacks) {
25
+ this.#registeredEvents[event] = callbacks.filter(cb => cb !== callback);
26
+ }
27
+ }
28
+ }
29
+
30
+ export function eventChain(): EventChain {
31
+ return new EventChain();
32
+ }
@@ -9,7 +9,7 @@ export class Input extends FormInput {
9
9
  type: options.type ?? 'text',
10
10
  value: options.value ?? '',
11
11
  placeholder: options.placeholder ?? '',
12
- label: options.label ?? '',
12
+ label: options.label ?? '', // ✅ Empty string = auto-generate in _renderLabel()
13
13
  icon: options.icon ?? '',
14
14
  required: options.required ?? false,
15
15
  disabled: options.disabled ?? false,
@@ -47,7 +47,7 @@ export class Input extends FormInput<InputState> {
47
47
  type: options.type ?? 'text',
48
48
  value: options.value ?? '',
49
49
  placeholder: options.placeholder ?? '',
50
- label: options.label ?? '',
50
+ label: options.label ?? '', // ✅ Empty string = auto-generate in _renderLabel()
51
51
  icon: options.icon ?? '',
52
52
  required: options.required ?? false,
53
53
  disabled: options.disabled ?? false,
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Convert a component ID to a human-readable label
3
+ *
4
+ * Examples:
5
+ * 'btn-1' → 'Btn 1'
6
+ * 'btn1' → 'Btn1'
7
+ * 'btn-primary-1' → 'Btn Primary 1'
8
+ * 'user-email-input' → 'User Email Input'
9
+ * 'firstName' → 'First Name'
10
+ * 'first_name' → 'First Name'
11
+ *
12
+ * @param id - Component ID (kebab-case, snake_case, or camelCase)
13
+ * @returns Human-readable label with proper capitalization
14
+ */
15
+ export declare function formatIdAsLabel(id: string): string;
16
+ //# sourceMappingURL=formatId.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatId.d.ts","sourceRoot":"","sources":["formatId.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAalD"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Convert a component ID to a human-readable label
3
+ *
4
+ * Examples:
5
+ * 'btn-1' → 'Btn 1'
6
+ * 'btn1' → 'Btn1'
7
+ * 'btn-primary-1' → 'Btn Primary 1'
8
+ * 'user-email-input' → 'User Email Input'
9
+ * 'firstName' → 'First Name'
10
+ * 'first_name' → 'First Name'
11
+ *
12
+ * @param id - Component ID (kebab-case, snake_case, or camelCase)
13
+ * @returns Human-readable label with proper capitalization
14
+ */
15
+ export function formatIdAsLabel(id) {
16
+ if (!id)
17
+ return '';
18
+ // Split by common delimiters: hyphens, underscores, or camelCase boundaries
19
+ const words = id
20
+ .replace(/([a-z])([A-Z])/g, '$1 $2') // camelCase → separate words
21
+ .split(/[-_\s]+/) // Split by hyphens, underscores, spaces
22
+ .filter(word => word.length > 0);
23
+ // Capitalize first letter of each word
24
+ return words
25
+ .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())
26
+ .join(' ');
27
+ }
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Convert a component ID to a human-readable label
3
+ *
4
+ * Examples:
5
+ * 'btn-1' → 'Btn 1'
6
+ * 'btn1' → 'Btn1'
7
+ * 'btn-primary-1' → 'Btn Primary 1'
8
+ * 'user-email-input' → 'User Email Input'
9
+ * 'firstName' → 'First Name'
10
+ * 'first_name' → 'First Name'
11
+ *
12
+ * @param id - Component ID (kebab-case, snake_case, or camelCase)
13
+ * @returns Human-readable label with proper capitalization
14
+ */
15
+ export function formatIdAsLabel(id: string): string {
16
+ if (!id) return '';
17
+
18
+ // Split by common delimiters: hyphens, underscores, or camelCase boundaries
19
+ const words = id
20
+ .replace(/([a-z])([A-Z])/g, '$1 $2') // camelCase → separate words
21
+ .split(/[-_\s]+/) // Split by hyphens, underscores, spaces
22
+ .filter(word => word.length > 0);
23
+
24
+ // Capitalize first letter of each word
25
+ return words
26
+ .map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())
27
+ .join(' ');
28
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "juxscript",
3
- "version": "1.1.77",
3
+ "version": "1.1.79",
4
4
  "type": "module",
5
5
  "description": "A JavaScript UX authorship platform",
6
6
  "main": "index.js",