domma-js 0.29.2 → 0.30.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.
@@ -48,16 +48,53 @@ export interface BindingOptions {
48
48
  twoWay?: boolean;
49
49
  }
50
50
 
51
+ /**
52
+ * A lazily-evaluated, dependency-tracked derived value.
53
+ */
54
+ export interface ComputedRef<T = any> {
55
+ /** Current value, recomputing only if a dependency changed. */
56
+ get(): T;
57
+
58
+ /** Current value without registering a dependency on the caller. */
59
+ peek(): T;
60
+
61
+ /** Unlink from the dependency graph. */
62
+ dispose(): void;
63
+ }
64
+
65
+ export interface ComputedOptions<T = any> {
66
+ /** Debug label used in console warnings. */
67
+ label?: string;
68
+
69
+ /** Called with the new value whenever it changes. */
70
+ onChange?: (value: T) => void;
71
+ }
72
+
73
+ export interface EffectOptions {
74
+ /** Debug label used in console warnings. */
75
+ label?: string;
76
+ }
77
+
51
78
  /**
52
79
  * Reactive Model class
53
80
  */
54
81
  export declare class Model {
55
82
  constructor(schema: Schema, data?: Record<string, any>, options?: ModelOptions);
56
83
 
57
- /** Get field value or all data */
84
+ /**
85
+ * Get field value or all data.
86
+ * Reads inside a computed or effect are tracked as dependencies.
87
+ */
58
88
  get(): Record<string, any>;
59
89
  get(field: string): any;
60
90
 
91
+ /**
92
+ * Read-tracked, write-through view of the model's data.
93
+ * Property reads register a dependency; writes route through set(),
94
+ * preserving validation, change notification and persistence.
95
+ */
96
+ tracked(): Record<string, any>;
97
+
61
98
  /** Set field value(s) */
62
99
  set(field: string, value: any): Model;
63
100
  set(data: Record<string, any>): Model;
@@ -68,9 +105,12 @@ export declare class Model {
68
105
  /** Get model data as JSON */
69
106
  toJSON(): Record<string, any>;
70
107
 
71
- /** Subscribe to any change */
108
+ /** Subscribe to any change; callback receives {field, newValue, oldValue, model} */
72
109
  onChange(callback: ChangeCallback): UnsubscribeFn;
73
110
 
111
+ /** Subscribe to changes on a single field; callback receives the same change object */
112
+ onChange(field: string, callback: ChangeCallback): UnsubscribeFn;
113
+
74
114
  /** Subscribe to specific field change */
75
115
  onFieldChange(field: string, callback: FieldChangeCallback): UnsubscribeFn;
76
116
 
@@ -158,6 +198,38 @@ export interface Models {
158
198
  /** Create a new reactive model */
159
199
  create(schema: Schema, initialData?: Record<string, any>, options?: ModelOptions): Model;
160
200
 
201
+ /** Extend a blueprint with additional fields */
202
+ extend(...blueprints: Schema[]): Schema;
203
+
204
+ /** Pick specific fields from a blueprint */
205
+ pick(blueprint: Schema, fields: string[]): Schema;
206
+
207
+ /** Omit specific fields from a blueprint */
208
+ omit(blueprint: Schema, fields: string[]): Schema;
209
+
210
+ // ============================================
211
+ // Dependency-Tracked Reactivity
212
+ // ============================================
213
+
214
+ /**
215
+ * Create a lazily-evaluated derived value that tracks whatever it reads.
216
+ * The body must be synchronous — tracking stops at the first `await`.
217
+ */
218
+ computed<T = any>(fn: () => T, options?: ComputedOptions<T>): ComputedRef<T>;
219
+
220
+ /**
221
+ * Run a function now, and again whenever any field it read changes.
222
+ * Re-runs are batched into a single microtask flush.
223
+ * Returns a function that stops the effect.
224
+ */
225
+ effect(fn: () => void, options?: EffectOptions): UnsubscribeFn;
226
+
227
+ /** Read values without registering them as dependencies. */
228
+ untracked<T = any>(fn: () => T): T;
229
+
230
+ /** Settle pending reactive work immediately instead of on the microtask. */
231
+ flush(): void;
232
+
161
233
  // ============================================
162
234
  // Type Validators
163
235
  // ============================================
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "domma-js",
3
- "version": "0.29.2",
3
+ "version": "0.30.0",
4
4
  "description": "Dynamic Object Manipulation & Modeling API - A complete front-end toolkit.",
5
5
  "main": "public/dist/domma.min.js",
6
6
  "module": "public/dist/domma.esm.js",
@@ -1,8 +1,8 @@
1
1
  /*!
2
- * Domma Complete CSS Bundle v0.29.2
2
+ * Domma Complete CSS Bundle v0.30.0
3
3
  * Dynamic Object Manipulation & Modeling API
4
4
  * (c) 2026 Darryl Waterhouse & DCBW-IT
5
- * Built: 2026-06-30T19:19:17.628Z
5
+ * Built: 2026-08-04T15:17:23.410Z
6
6
  */
7
7
 
8
8
  /* ============================================
@@ -11,11 +11,11 @@
11
11
  ============================================ */
12
12
 
13
13
  /*!
14
- * Domma Core CSS v0.29.2
14
+ * Domma Core CSS v0.30.0
15
15
  * Dynamic Object Manipulation & Modeling API
16
16
  * (c) 2026 Darryl Waterhouse & DCBW-IT
17
- * Built: 2026-06-30T19:19:17.433Z
18
- * Commit: 3e2c74c
17
+ * Built: 2026-08-04T15:17:23.192Z
18
+ * Commit: c70fd7c
19
19
  */
20
20
 
21
21
  /**
@@ -4829,11 +4829,11 @@ body.dm-cloaked.dm-ready {
4829
4829
  ============================================ */
4830
4830
 
4831
4831
  /*!
4832
- * Domma Grid CSS v0.29.2
4832
+ * Domma Grid CSS v0.30.0
4833
4833
  * Dynamic Object Manipulation & Modeling API
4834
4834
  * (c) 2026 Darryl Waterhouse & DCBW-IT
4835
- * Built: 2026-06-30T19:19:17.439Z
4836
- * Commit: 3e2c74c
4835
+ * Built: 2026-08-04T15:17:23.197Z
4836
+ * Commit: c70fd7c
4837
4837
  */
4838
4838
 
4839
4839
  /**
@@ -5454,11 +5454,11 @@ body.dm-cloaked.dm-ready {
5454
5454
  ============================================ */
5455
5455
 
5456
5456
  /*!
5457
- * Domma Elements CSS v0.29.2
5457
+ * Domma Elements CSS v0.30.0
5458
5458
  * Dynamic Object Manipulation & Modeling API
5459
5459
  * (c) 2026 Darryl Waterhouse & DCBW-IT
5460
- * Built: 2026-06-30T19:19:17.445Z
5461
- * Commit: 3e2c74c
5460
+ * Built: 2026-08-04T15:17:23.203Z
5461
+ * Commit: c70fd7c
5462
5462
  */
5463
5463
 
5464
5464
  /**
@@ -10758,6 +10758,32 @@ code {
10758
10758
  transform: translateY(0);
10759
10759
  }
10760
10760
 
10761
+ /*
10762
+ * Hover bridge: the menu is rendered as a document.body sibling positioned with a
10763
+ * small offset/margin gap from its trigger. On a hover-triggered dropdown that gap
10764
+ * is a dead-zone — the pointer leaves the trigger before reaching the menu, firing
10765
+ * the close. These transparent pseudo-elements extend the menu's hoverable area
10766
+ * above and below it, so the trigger→menu path is one continuous hover surface.
10767
+ * Only present on hover dropdowns, so click dropdowns are unaffected.
10768
+ */
10769
+ .domma-dropdown-menu-hover::before,
10770
+ .domma-dropdown-menu-hover::after {
10771
+ content: '';
10772
+ position: absolute;
10773
+ left: 0;
10774
+ right: 0;
10775
+ height: 0.75rem;
10776
+ /* transparent — a hover surface only, never painted */
10777
+ }
10778
+
10779
+ .domma-dropdown-menu-hover::before {
10780
+ bottom: 100%; /* bridges the gap when the menu opens below the trigger */
10781
+ }
10782
+
10783
+ .domma-dropdown-menu-hover::after {
10784
+ top: 100%; /* bridges the gap when the menu opens above the trigger */
10785
+ }
10786
+
10761
10787
  .domma-dropdown-item {
10762
10788
  display: block;
10763
10789
  width: 100%;
@@ -13413,11 +13439,11 @@ code {
13413
13439
  ============================================ */
13414
13440
 
13415
13441
  /*!
13416
- * Domma Themes v0.29.2
13442
+ * Domma Themes v0.30.0
13417
13443
  * Dynamic Object Manipulation & Modeling API
13418
13444
  * (c) 2026 Darryl Waterhouse & DCBW-IT
13419
- * Built: 2026-06-30T19:19:17.416Z
13420
- * Commit: 3e2c74c
13445
+ * Built: 2026-08-04T15:17:23.167Z
13446
+ * Commit: c70fd7c
13421
13447
  */
13422
13448
 
13423
13449
  /**
@@ -1,8 +1,8 @@
1
1
  /*!
2
- * Domma Data-Focused CSS Bundle v0.29.2
2
+ * Domma Data-Focused CSS Bundle v0.30.0
3
3
  * Dynamic Object Manipulation & Modeling API
4
4
  * (c) 2026 Darryl Waterhouse & DCBW-IT
5
- * Built: 2026-06-30T19:19:17.623Z
5
+ * Built: 2026-08-04T15:17:23.406Z
6
6
  */
7
7
 
8
8
  /* ============================================
@@ -11,11 +11,11 @@
11
11
  ============================================ */
12
12
 
13
13
  /*!
14
- * Domma Core CSS v0.29.2
14
+ * Domma Core CSS v0.30.0
15
15
  * Dynamic Object Manipulation & Modeling API
16
16
  * (c) 2026 Darryl Waterhouse & DCBW-IT
17
- * Built: 2026-06-30T19:19:17.433Z
18
- * Commit: 3e2c74c
17
+ * Built: 2026-08-04T15:17:23.192Z
18
+ * Commit: c70fd7c
19
19
  */
20
20
 
21
21
  /**
@@ -4829,11 +4829,11 @@ body.dm-cloaked.dm-ready {
4829
4829
  ============================================ */
4830
4830
 
4831
4831
  /*!
4832
- * Domma Grid CSS v0.29.2
4832
+ * Domma Grid CSS v0.30.0
4833
4833
  * Dynamic Object Manipulation & Modeling API
4834
4834
  * (c) 2026 Darryl Waterhouse & DCBW-IT
4835
- * Built: 2026-06-30T19:19:17.439Z
4836
- * Commit: 3e2c74c
4835
+ * Built: 2026-08-04T15:17:23.197Z
4836
+ * Commit: c70fd7c
4837
4837
  */
4838
4838
 
4839
4839
  /**
@@ -5454,11 +5454,11 @@ body.dm-cloaked.dm-ready {
5454
5454
  ============================================ */
5455
5455
 
5456
5456
  /*!
5457
- * Domma Elements CSS v0.29.2
5457
+ * Domma Elements CSS v0.30.0
5458
5458
  * Dynamic Object Manipulation & Modeling API
5459
5459
  * (c) 2026 Darryl Waterhouse & DCBW-IT
5460
- * Built: 2026-06-30T19:19:17.445Z
5461
- * Commit: 3e2c74c
5460
+ * Built: 2026-08-04T15:17:23.203Z
5461
+ * Commit: c70fd7c
5462
5462
  */
5463
5463
 
5464
5464
  /**
@@ -10758,6 +10758,32 @@ code {
10758
10758
  transform: translateY(0);
10759
10759
  }
10760
10760
 
10761
+ /*
10762
+ * Hover bridge: the menu is rendered as a document.body sibling positioned with a
10763
+ * small offset/margin gap from its trigger. On a hover-triggered dropdown that gap
10764
+ * is a dead-zone — the pointer leaves the trigger before reaching the menu, firing
10765
+ * the close. These transparent pseudo-elements extend the menu's hoverable area
10766
+ * above and below it, so the trigger→menu path is one continuous hover surface.
10767
+ * Only present on hover dropdowns, so click dropdowns are unaffected.
10768
+ */
10769
+ .domma-dropdown-menu-hover::before,
10770
+ .domma-dropdown-menu-hover::after {
10771
+ content: '';
10772
+ position: absolute;
10773
+ left: 0;
10774
+ right: 0;
10775
+ height: 0.75rem;
10776
+ /* transparent — a hover surface only, never painted */
10777
+ }
10778
+
10779
+ .domma-dropdown-menu-hover::before {
10780
+ bottom: 100%; /* bridges the gap when the menu opens below the trigger */
10781
+ }
10782
+
10783
+ .domma-dropdown-menu-hover::after {
10784
+ top: 100%; /* bridges the gap when the menu opens above the trigger */
10785
+ }
10786
+
10761
10787
  .domma-dropdown-item {
10762
10788
  display: block;
10763
10789
  width: 100%;
@@ -13413,11 +13439,11 @@ code {
13413
13439
  ============================================ */
13414
13440
 
13415
13441
  /*!
13416
- * Domma Themes v0.29.2
13442
+ * Domma Themes v0.30.0
13417
13443
  * Dynamic Object Manipulation & Modeling API
13418
13444
  * (c) 2026 Darryl Waterhouse & DCBW-IT
13419
- * Built: 2026-06-30T19:19:17.416Z
13420
- * Commit: 3e2c74c
13445
+ * Built: 2026-08-04T15:17:23.167Z
13446
+ * Commit: c70fd7c
13421
13447
  */
13422
13448
 
13423
13449
  /**
@@ -1,8 +1,8 @@
1
1
  /*!
2
- * Domma Essentials CSS Bundle v0.29.2
2
+ * Domma Essentials CSS Bundle v0.30.0
3
3
  * Dynamic Object Manipulation & Modeling API
4
4
  * (c) 2026 Darryl Waterhouse & DCBW-IT
5
- * Built: 2026-06-30T19:19:17.614Z
5
+ * Built: 2026-08-04T15:17:23.394Z
6
6
  */
7
7
 
8
8
  /* ============================================
@@ -11,11 +11,11 @@
11
11
  ============================================ */
12
12
 
13
13
  /*!
14
- * Domma Core CSS v0.29.2
14
+ * Domma Core CSS v0.30.0
15
15
  * Dynamic Object Manipulation & Modeling API
16
16
  * (c) 2026 Darryl Waterhouse & DCBW-IT
17
- * Built: 2026-06-30T19:19:17.433Z
18
- * Commit: 3e2c74c
17
+ * Built: 2026-08-04T15:17:23.192Z
18
+ * Commit: c70fd7c
19
19
  */
20
20
 
21
21
  /**
@@ -4829,11 +4829,11 @@ body.dm-cloaked.dm-ready {
4829
4829
  ============================================ */
4830
4830
 
4831
4831
  /*!
4832
- * Domma Grid CSS v0.29.2
4832
+ * Domma Grid CSS v0.30.0
4833
4833
  * Dynamic Object Manipulation & Modeling API
4834
4834
  * (c) 2026 Darryl Waterhouse & DCBW-IT
4835
- * Built: 2026-06-30T19:19:17.439Z
4836
- * Commit: 3e2c74c
4835
+ * Built: 2026-08-04T15:17:23.197Z
4836
+ * Commit: c70fd7c
4837
4837
  */
4838
4838
 
4839
4839
  /**
@@ -5454,11 +5454,11 @@ body.dm-cloaked.dm-ready {
5454
5454
  ============================================ */
5455
5455
 
5456
5456
  /*!
5457
- * Domma Elements CSS v0.29.2
5457
+ * Domma Elements CSS v0.30.0
5458
5458
  * Dynamic Object Manipulation & Modeling API
5459
5459
  * (c) 2026 Darryl Waterhouse & DCBW-IT
5460
- * Built: 2026-06-30T19:19:17.445Z
5461
- * Commit: 3e2c74c
5460
+ * Built: 2026-08-04T15:17:23.203Z
5461
+ * Commit: c70fd7c
5462
5462
  */
5463
5463
 
5464
5464
  /**
@@ -10758,6 +10758,32 @@ code {
10758
10758
  transform: translateY(0);
10759
10759
  }
10760
10760
 
10761
+ /*
10762
+ * Hover bridge: the menu is rendered as a document.body sibling positioned with a
10763
+ * small offset/margin gap from its trigger. On a hover-triggered dropdown that gap
10764
+ * is a dead-zone — the pointer leaves the trigger before reaching the menu, firing
10765
+ * the close. These transparent pseudo-elements extend the menu's hoverable area
10766
+ * above and below it, so the trigger→menu path is one continuous hover surface.
10767
+ * Only present on hover dropdowns, so click dropdowns are unaffected.
10768
+ */
10769
+ .domma-dropdown-menu-hover::before,
10770
+ .domma-dropdown-menu-hover::after {
10771
+ content: '';
10772
+ position: absolute;
10773
+ left: 0;
10774
+ right: 0;
10775
+ height: 0.75rem;
10776
+ /* transparent — a hover surface only, never painted */
10777
+ }
10778
+
10779
+ .domma-dropdown-menu-hover::before {
10780
+ bottom: 100%; /* bridges the gap when the menu opens below the trigger */
10781
+ }
10782
+
10783
+ .domma-dropdown-menu-hover::after {
10784
+ top: 100%; /* bridges the gap when the menu opens above the trigger */
10785
+ }
10786
+
10761
10787
  .domma-dropdown-item {
10762
10788
  display: block;
10763
10789
  width: 100%;
@@ -13413,11 +13439,11 @@ code {
13413
13439
  ============================================ */
13414
13440
 
13415
13441
  /*!
13416
- * Domma Themes v0.29.2
13442
+ * Domma Themes v0.30.0
13417
13443
  * Dynamic Object Manipulation & Modeling API
13418
13444
  * (c) 2026 Darryl Waterhouse & DCBW-IT
13419
- * Built: 2026-06-30T19:19:17.416Z
13420
- * Commit: 3e2c74c
13445
+ * Built: 2026-08-04T15:17:23.167Z
13446
+ * Commit: c70fd7c
13421
13447
  */
13422
13448
 
13423
13449
  /**
@@ -1,8 +1,8 @@
1
1
  /*!
2
- * Domma Full CSS Bundle v0.29.2
2
+ * Domma Full CSS Bundle v0.30.0
3
3
  * Dynamic Object Manipulation & Modeling API
4
4
  * (c) 2026 Darryl Waterhouse & DCBW-IT
5
- * Built: 2026-06-30T19:19:17.619Z
5
+ * Built: 2026-08-04T15:17:23.401Z
6
6
  */
7
7
 
8
8
  /* ============================================
@@ -11,11 +11,11 @@
11
11
  ============================================ */
12
12
 
13
13
  /*!
14
- * Domma Core CSS v0.29.2
14
+ * Domma Core CSS v0.30.0
15
15
  * Dynamic Object Manipulation & Modeling API
16
16
  * (c) 2026 Darryl Waterhouse & DCBW-IT
17
- * Built: 2026-06-30T19:19:17.433Z
18
- * Commit: 3e2c74c
17
+ * Built: 2026-08-04T15:17:23.192Z
18
+ * Commit: c70fd7c
19
19
  */
20
20
 
21
21
  /**
@@ -4829,11 +4829,11 @@ body.dm-cloaked.dm-ready {
4829
4829
  ============================================ */
4830
4830
 
4831
4831
  /*!
4832
- * Domma Grid CSS v0.29.2
4832
+ * Domma Grid CSS v0.30.0
4833
4833
  * Dynamic Object Manipulation & Modeling API
4834
4834
  * (c) 2026 Darryl Waterhouse & DCBW-IT
4835
- * Built: 2026-06-30T19:19:17.439Z
4836
- * Commit: 3e2c74c
4835
+ * Built: 2026-08-04T15:17:23.197Z
4836
+ * Commit: c70fd7c
4837
4837
  */
4838
4838
 
4839
4839
  /**
@@ -5454,11 +5454,11 @@ body.dm-cloaked.dm-ready {
5454
5454
  ============================================ */
5455
5455
 
5456
5456
  /*!
5457
- * Domma Elements CSS v0.29.2
5457
+ * Domma Elements CSS v0.30.0
5458
5458
  * Dynamic Object Manipulation & Modeling API
5459
5459
  * (c) 2026 Darryl Waterhouse & DCBW-IT
5460
- * Built: 2026-06-30T19:19:17.445Z
5461
- * Commit: 3e2c74c
5460
+ * Built: 2026-08-04T15:17:23.203Z
5461
+ * Commit: c70fd7c
5462
5462
  */
5463
5463
 
5464
5464
  /**
@@ -10758,6 +10758,32 @@ code {
10758
10758
  transform: translateY(0);
10759
10759
  }
10760
10760
 
10761
+ /*
10762
+ * Hover bridge: the menu is rendered as a document.body sibling positioned with a
10763
+ * small offset/margin gap from its trigger. On a hover-triggered dropdown that gap
10764
+ * is a dead-zone — the pointer leaves the trigger before reaching the menu, firing
10765
+ * the close. These transparent pseudo-elements extend the menu's hoverable area
10766
+ * above and below it, so the trigger→menu path is one continuous hover surface.
10767
+ * Only present on hover dropdowns, so click dropdowns are unaffected.
10768
+ */
10769
+ .domma-dropdown-menu-hover::before,
10770
+ .domma-dropdown-menu-hover::after {
10771
+ content: '';
10772
+ position: absolute;
10773
+ left: 0;
10774
+ right: 0;
10775
+ height: 0.75rem;
10776
+ /* transparent — a hover surface only, never painted */
10777
+ }
10778
+
10779
+ .domma-dropdown-menu-hover::before {
10780
+ bottom: 100%; /* bridges the gap when the menu opens below the trigger */
10781
+ }
10782
+
10783
+ .domma-dropdown-menu-hover::after {
10784
+ top: 100%; /* bridges the gap when the menu opens above the trigger */
10785
+ }
10786
+
10761
10787
  .domma-dropdown-item {
10762
10788
  display: block;
10763
10789
  width: 100%;
@@ -13413,11 +13439,11 @@ code {
13413
13439
  ============================================ */
13414
13440
 
13415
13441
  /*!
13416
- * Domma Themes v0.29.2
13442
+ * Domma Themes v0.30.0
13417
13443
  * Dynamic Object Manipulation & Modeling API
13418
13444
  * (c) 2026 Darryl Waterhouse & DCBW-IT
13419
- * Built: 2026-06-30T19:19:17.416Z
13420
- * Commit: 3e2c74c
13445
+ * Built: 2026-08-04T15:17:23.167Z
13446
+ * Commit: c70fd7c
13421
13447
  */
13422
13448
 
13423
13449
  /**
@@ -1,8 +1,8 @@
1
1
  /*!
2
- * Domma Minimal CSS Bundle v0.29.2
2
+ * Domma Minimal CSS Bundle v0.30.0
3
3
  * Dynamic Object Manipulation & Modeling API
4
4
  * (c) 2026 Darryl Waterhouse & DCBW-IT
5
- * Built: 2026-06-30T19:19:17.612Z
5
+ * Built: 2026-08-04T15:17:23.393Z
6
6
  */
7
7
 
8
8
  /* ============================================
@@ -11,11 +11,11 @@
11
11
  ============================================ */
12
12
 
13
13
  /*!
14
- * Domma Core CSS v0.29.2
14
+ * Domma Core CSS v0.30.0
15
15
  * Dynamic Object Manipulation & Modeling API
16
16
  * (c) 2026 Darryl Waterhouse & DCBW-IT
17
- * Built: 2026-06-30T19:19:17.433Z
18
- * Commit: 3e2c74c
17
+ * Built: 2026-08-04T15:17:23.192Z
18
+ * Commit: c70fd7c
19
19
  */
20
20
 
21
21
  /**
@@ -4829,11 +4829,11 @@ body.dm-cloaked.dm-ready {
4829
4829
  ============================================ */
4830
4830
 
4831
4831
  /*!
4832
- * Domma Grid CSS v0.29.2
4832
+ * Domma Grid CSS v0.30.0
4833
4833
  * Dynamic Object Manipulation & Modeling API
4834
4834
  * (c) 2026 Darryl Waterhouse & DCBW-IT
4835
- * Built: 2026-06-30T19:19:17.439Z
4836
- * Commit: 3e2c74c
4835
+ * Built: 2026-08-04T15:17:23.197Z
4836
+ * Commit: c70fd7c
4837
4837
  */
4838
4838
 
4839
4839
  /**
@@ -1,9 +1,9 @@
1
1
  /*!
2
- * Domma Flags v0.29.2
2
+ * Domma Flags v0.30.0
3
3
  * Nation flags as inline SVG (opt-in module)
4
4
  * (c) 2026 Darryl Waterhouse & DCBW-IT
5
- * Built: 2026-06-30T19:19:08.677Z
6
- * Commit: 3e2c74c
5
+ * Built: 2026-08-04T15:17:10.290Z
6
+ * Commit: c70fd7c
7
7
  *
8
8
  * Requires: domma.min.js
9
9
  */
@@ -1,9 +1,9 @@
1
1
  /*!
2
- * Domma Flags v0.29.2
2
+ * Domma Flags v0.30.0
3
3
  * Nation flags as inline SVG (opt-in module)
4
4
  * (c) 2026 Darryl Waterhouse & DCBW-IT
5
- * Built: 2026-06-30T19:19:08.677Z
6
- * Commit: 3e2c74c
5
+ * Built: 2026-08-04T15:17:10.290Z
6
+ * Commit: c70fd7c
7
7
  *
8
8
  * Requires: domma.min.js
9
9
  */
@@ -1,8 +1,8 @@
1
1
  /*!
2
- * Domma Syntax Highlighter v0.29.2
2
+ * Domma Syntax Highlighter v0.30.0
3
3
  * Lightweight code syntax highlighting for JavaScript, HTML, and CSS
4
4
  * (c) 2026 Darryl Waterhouse & DCBW-IT
5
- * Built: 2026-06-30T19:19:08.673Z
6
- * Commit: 3e2c74c
5
+ * Built: 2026-08-04T15:17:10.286Z
6
+ * Commit: c70fd7c
7
7
  */
8
8
  !function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).DommaSyntax={})}(this,function(t){"use strict";const e={javascript:[{type:"comment",pattern:/\/\*[\s\S]*?\*\//g},{type:"comment",pattern:/\/\/.*/g},{type:"template-string",pattern:/`(?:\\.|[^`\\])*`/g},{type:"string",pattern:/"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'/g},{type:"keyword",pattern:/\b(const|let|var|function|return|if|else|for|while|do|break|continue|switch|case|default|try|catch|finally|throw|async|await|class|extends|static|new|this|super|import|export|from|as|default|yield|typeof|instanceof|in|of|delete|void)\b/g},{type:"boolean",pattern:/\b(true|false|null|undefined|NaN|Infinity)\b/g},{type:"number",pattern:/\b\d+\.?\d*([eE][+-]?\d+)?\b/g},{type:"function",pattern:/\b([a-zA-Z_$][\w$]*)\s*(?=\()/g},{type:"class-name",pattern:/\b[A-Z][\w$]*\b/g},{type:"operator",pattern:/[+\-*/%=<>!&|^~?:]+|===|!==|==|!=|<=|>=|&&|\|\||<<|>>|>>>/g},{type:"punctuation",pattern:/[{}[\]();,.]/g}],html:[{type:"comment",pattern:/<!--[\s\S]*?-->/g},{type:"doctype",pattern:/<!DOCTYPE[^>]*>/gi},{type:"tag-open",pattern:/<\/?[a-zA-Z][\w-]*/g},{type:"tag-close",pattern:/\/?>/g},{type:"attr-name",pattern:/\s+[a-zA-Z:@][\w:.-]*(?=\s*=)/g},{type:"attr-value",pattern:/=\s*"[^"]*"|=\s*'[^']*'/g},{type:"entity",pattern:/&[#\w]+;/g}],css:[{type:"comment",pattern:/\/\*[\s\S]*?\*\//g},{type:"at-rule",pattern:/@[\w-]+/g},{type:"selector",pattern:/[.#]?[a-zA-Z][\w-]*(?=\s*[{,])/g},{type:"property",pattern:/\b[\w-]+(?=\s*:)/g},{type:"string",pattern:/"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'/g},{type:"function",pattern:/\b[\w-]+(?=\()/g},{type:"important",pattern:/!important\b/g},{type:"number",pattern:/\b\d+\.?\d*(px|em|rem|%|vh|vw|pt|cm|mm|in|pc|ex|ch|vmin|vmax|fr)?\b/g},{type:"color",pattern:/#[\da-fA-F]{3,8}\b/g},{type:"punctuation",pattern:/[{}:;,()]/g}]};function n(t){const e={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"};return t.replace(/[&<>"']/g,t=>e[t])}class a{constructor(){this.config={autoDetect:!0,preserveOriginal:!0,selector:".code-block",showLanguageBadge:!1,languagePrefix:"language-"}}highlight(t,a=null){const r="string"==typeof t?document.querySelector(t):t;if(!r||r.hasAttribute("data-syntax-highlighted"))return!1;if(!a&&this.config.autoDetect){const t=Array.from(r.classList).find(t=>t.startsWith(this.config.languagePrefix));t&&(a=t.substring(this.config.languagePrefix.length))}if(!a||!e[a])return!1;const o=r.textContent||"";this.config.preserveOriginal&&r.setAttribute("data-original-code",o);const i=function(t,a){const r=e[a];if(!r)return n(t);const o=[];for(const{type:e,pattern:n}of r){if("html"===a&&"entity"===e)continue;let r;for(n.lastIndex=0;null!==(r=n.exec(t));)o.push({start:r.index,end:r.index+r[0].length,text:r[0],type:e})}o.sort((t,e)=>t.start-e.start);const i=[];let s=0;for(const t of o)t.start>=s&&(i.push(t),s=t.end);let c="",p=0;for(const e of i)e.start>p&&(c+=n(t.substring(p,e.start))),c+=`<span class="syntax-${e.type}">${n(e.text)}</span>`,p=e.end;return p<t.length&&(c+=n(t.substring(p))),c}(o,a);return r.innerHTML=i,r.setAttribute("data-syntax-highlighted","true"),r.setAttribute("data-language",a),this.config.showLanguageBadge&&this.addLanguageBadge(r,a),!0}scan(t={}){const e=t.selector||this.config.selector,n=document.querySelectorAll(e);let a=0;return n.forEach(e=>{this.highlight(e,t.language||null)&&(this.addCopyButton(e),a++)}),a}register(t,n){t&&Array.isArray(n)?e[t]=n:console.error("SyntaxHighlighter: Invalid language registration")}configure(t){return t?(Object.assign(this.config,t),this.config):{...this.config}}addLanguageBadge(t,e){if(t.querySelector(".syntax-language-badge"))return;const n=document.createElement("div");n.className="syntax-language-badge",n.textContent=e.toUpperCase(),t.style.position="relative",t.insertBefore(n,t.firstChild)}getLanguages(){return Object.keys(e)}isLanguageSupported(t){return t in e}addCopyButton(t){if(t.parentElement&&t.parentElement.classList.contains("code-block-wrapper"))return;const e=document.createElement("div");e.className="code-block-wrapper";const n=document.createElement("button");n.className="code-block-copy",n.setAttribute("aria-label","Copy code to clipboard"),n.innerHTML='<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"></rect><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"></path></svg>',n.addEventListener("click",async()=>{const e=t.getAttribute("data-original-code")||t.textContent;try{if(navigator.clipboard&&navigator.clipboard.writeText)await navigator.clipboard.writeText(e);else{const t=document.createElement("textarea");t.value=e,t.style.position="fixed",t.style.opacity="0",document.body.appendChild(t),t.select(),document.execCommand("copy"),document.body.removeChild(t)}n.classList.add("copied"),n.innerHTML='<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="20 6 9 17 4 12"></polyline></svg>',setTimeout(()=>{n.classList.remove("copied"),n.innerHTML='<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="9" y="9" width="13" height="13" rx="2" ry="2"></rect><path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"></path></svg>'},2e3)}catch(t){console.error("Failed to copy code:",t)}}),t.parentNode.insertBefore(e,t),e.appendChild(t),e.appendChild(n)}}const r=new a;"undefined"!=typeof document&&("loading"===document.readyState?document.addEventListener("DOMContentLoaded",()=>{r.scan()}):setTimeout(()=>r.scan(),0)),"undefined"!=typeof window&&(window.Domma&&(window.Domma.syntax=r),window.DommaSyntax=r),t.LANGUAGES=e,t.SyntaxHighlighter=a,t.default=r,t.syntax=r,Object.defineProperty(t,"__esModule",{value:!0})});
@@ -1,9 +1,9 @@
1
1
  /*!
2
- * Domma Core CSS v0.29.2
2
+ * Domma Core CSS v0.30.0
3
3
  * Dynamic Object Manipulation & Modeling API
4
4
  * (c) 2026 Darryl Waterhouse & DCBW-IT
5
- * Built: 2026-06-30T19:19:17.433Z
6
- * Commit: 3e2c74c
5
+ * Built: 2026-08-04T15:17:23.192Z
6
+ * Commit: c70fd7c
7
7
  */
8
8
 
9
9
  /**