@livenetworks/ashlar 1.4.1 → 1.6.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.
Files changed (219) hide show
  1. package/README.md +189 -177
  2. package/js/COMPONENTS.md +55 -49
  3. package/js/index.js +22 -5
  4. package/js/ln-accordion/README.md +186 -137
  5. package/js/ln-accordion/ln-accordion.js +1 -1
  6. package/js/ln-ajax/README.md +73 -4
  7. package/js/ln-ajax/ln-ajax.js +1 -1
  8. package/js/ln-ajax/src/ln-ajax.js +13 -13
  9. package/js/ln-api-connector/README.md +261 -150
  10. package/js/ln-api-connector/ln-api-connector.js +1 -1
  11. package/js/ln-api-connector/src/ln-api-connector.js +368 -265
  12. package/js/ln-api-queue/README.md +219 -0
  13. package/js/ln-api-queue/ln-api-queue.js +1 -0
  14. package/js/ln-api-queue/src/ln-api-queue.js +320 -0
  15. package/js/ln-api-queue/src/queue-storage.js +455 -0
  16. package/js/ln-autoresize/README.md +47 -0
  17. package/js/ln-autoresize/ln-autoresize.js +1 -1
  18. package/js/ln-autosave/README.md +33 -1
  19. package/js/ln-autosave/ln-autosave.js +1 -1
  20. package/js/ln-autosave/src/ln-autosave.js +4 -4
  21. package/js/ln-circular-progress/README.md +27 -13
  22. package/js/ln-circular-progress/ln-circular-progress.js +1 -1
  23. package/js/ln-circular-progress/src/ln-circular-progress.js +18 -5
  24. package/js/ln-confirm/README.md +162 -86
  25. package/js/ln-confirm/_ln-confirm.scss +11 -0
  26. package/js/ln-confirm/ln-confirm.js +1 -1
  27. package/js/ln-confirm/src/ln-confirm.js +77 -41
  28. package/js/ln-core/README.md +896 -0
  29. package/js/ln-core/hash.js +92 -0
  30. package/js/ln-core/helpers.js +337 -8
  31. package/js/ln-core/index.js +4 -2
  32. package/js/ln-core/persist.js +29 -3
  33. package/js/ln-core/positioning.js +1 -35
  34. package/js/ln-core/window-cache.js +213 -0
  35. package/js/ln-couchdb-connector/README.md +177 -156
  36. package/js/ln-couchdb-connector/ln-couchdb-connector.js +1 -1
  37. package/js/ln-couchdb-connector/src/ln-couchdb-connector.js +398 -348
  38. package/js/ln-data-coordinator/README.md +536 -165
  39. package/js/ln-data-coordinator/ln-data-coordinator.js +1 -1
  40. package/js/ln-data-coordinator/src/data-read-policy.js +18 -0
  41. package/js/ln-data-coordinator/src/ln-data-coordinator.js +1042 -249
  42. package/js/ln-data-coordinator/src/mutation-receipts.js +46 -0
  43. package/js/ln-data-store/README.md +241 -94
  44. package/js/ln-data-store/ln-data-store.js +1 -1
  45. package/js/ln-data-store/src/ln-data-store.js +694 -699
  46. package/js/ln-date/README.md +39 -1
  47. package/js/ln-date/ln-date-dev.scss +14 -0
  48. package/js/ln-date/ln-date.js +1 -1
  49. package/js/ln-date/src/ln-date.js +236 -178
  50. package/js/ln-debug/README.md +58 -0
  51. package/js/ln-debug/ln-debug.js +1 -0
  52. package/js/ln-debug/src/ln-debug.js +19 -0
  53. package/js/ln-dropdown/README.md +31 -8
  54. package/js/ln-dropdown/ln-dropdown.js +1 -1
  55. package/js/ln-dropdown/src/ln-dropdown.js +30 -13
  56. package/js/ln-editor/README.md +274 -0
  57. package/js/ln-editor/ln-editor.js +1 -0
  58. package/js/ln-editor/ln-editor.scss +43 -0
  59. package/js/ln-editor/src/ln-editor.js +619 -0
  60. package/js/ln-external-links/README.md +44 -5
  61. package/js/ln-external-links/ln-external-links.js +1 -1
  62. package/js/ln-fill/README.md +199 -0
  63. package/js/ln-fill/ln-fill.js +1 -0
  64. package/js/ln-fill/src/ln-fill.js +87 -0
  65. package/js/ln-filter/README.md +189 -99
  66. package/js/ln-filter/ln-filter-dev.scss +8 -0
  67. package/js/ln-filter/ln-filter.js +1 -1
  68. package/js/ln-filter/src/ln-filter.js +22 -7
  69. package/js/ln-form/README.md +212 -49
  70. package/js/ln-form/ln-form.js +1 -1
  71. package/js/ln-form/src/ln-form.js +99 -199
  72. package/js/ln-http/README.md +125 -89
  73. package/js/ln-http/ln-http.js +1 -1
  74. package/js/ln-http/src/ln-http.js +32 -13
  75. package/js/ln-icon/README.md +130 -0
  76. package/js/ln-icon/ln-icon.js +1 -0
  77. package/js/{ln-icons/src/ln-icons.js → ln-icon/src/ln-icon.js} +20 -15
  78. package/js/ln-link/README.md +47 -9
  79. package/js/ln-link/ln-link.js +1 -1
  80. package/js/ln-link/src/ln-link.js +22 -6
  81. package/js/ln-list/README.md +129 -0
  82. package/js/ln-list/ln-list.js +1 -0
  83. package/js/ln-list/ln-list.scss +28 -0
  84. package/js/ln-list/src/ln-list.js +1216 -0
  85. package/js/ln-modal/README.md +185 -154
  86. package/js/ln-modal/ln-modal-dev.scss +13 -0
  87. package/js/ln-modal/ln-modal.js +1 -1
  88. package/js/ln-modal/ln-modal.scss +28 -4
  89. package/js/ln-modal/src/ln-modal.js +137 -201
  90. package/js/ln-modal-coordinator/README.md +99 -0
  91. package/js/ln-modal-coordinator/ln-modal-coordinator-dev.scss +8 -0
  92. package/js/ln-modal-coordinator/ln-modal-coordinator.js +1 -0
  93. package/js/ln-modal-coordinator/src/ln-modal-coordinator.js +345 -0
  94. package/js/ln-nav/README.md +46 -3
  95. package/js/ln-nav/ln-nav.js +1 -1
  96. package/js/ln-nav/src/ln-nav.js +92 -127
  97. package/js/ln-number/README.md +28 -1
  98. package/js/ln-number/ln-number-dev.scss +13 -0
  99. package/js/ln-number/ln-number.js +1 -1
  100. package/js/ln-number/src/ln-number.js +443 -350
  101. package/js/ln-options/README.md +66 -0
  102. package/js/ln-options/ln-options.js +1 -0
  103. package/js/ln-options/src/ln-options.js +74 -0
  104. package/js/ln-popover/README.md +40 -5
  105. package/js/ln-popover/ln-popover.js +1 -1
  106. package/js/ln-popover/src/ln-popover.js +38 -11
  107. package/js/ln-progress/README.md +413 -442
  108. package/js/ln-progress/ln-progress.js +1 -1
  109. package/js/ln-progress/src/ln-progress.js +98 -150
  110. package/js/ln-router/README.md +432 -0
  111. package/js/ln-router/ln-router.js +1 -0
  112. package/js/ln-router/src/ln-router.js +539 -0
  113. package/js/ln-search/README.md +158 -83
  114. package/js/ln-search/ln-search-dev.scss +8 -0
  115. package/js/ln-search/ln-search.js +1 -1
  116. package/js/ln-search/src/ln-search.js +12 -9
  117. package/js/ln-slug/README.md +110 -0
  118. package/js/ln-slug/ln-slug.js +1 -0
  119. package/js/ln-slug/src/ln-slug.js +74 -0
  120. package/js/ln-sort/README.md +170 -0
  121. package/js/ln-sort/ln-sort-dev.scss +8 -0
  122. package/js/ln-sort/ln-sort.js +1 -0
  123. package/js/ln-sort/src/ln-sort.js +178 -0
  124. package/js/ln-sortable/README.md +133 -95
  125. package/js/ln-sortable/ln-sortable.js +1 -1
  126. package/js/ln-stat/README.md +55 -0
  127. package/js/ln-stat/ln-stat.js +1 -0
  128. package/js/ln-stat/src/ln-stat.js +55 -0
  129. package/js/ln-table/README.md +285 -101
  130. package/js/ln-table/ln-table-dev.scss +17 -0
  131. package/js/ln-table/ln-table.js +1 -1
  132. package/js/ln-table/ln-table.scss +1 -1
  133. package/js/ln-table/src/ln-table.js +1493 -473
  134. package/js/ln-table-coordinator/README.md +73 -0
  135. package/js/ln-table-coordinator/ln-table-coordinator.js +1 -0
  136. package/js/ln-table-coordinator/src/ln-table-coordinator.js +160 -0
  137. package/js/ln-tabs/README.md +221 -137
  138. package/js/ln-tabs/ln-tabs-dev.scss +18 -0
  139. package/js/ln-tabs/ln-tabs.js +1 -1
  140. package/js/ln-tabs/src/ln-tabs.js +41 -24
  141. package/js/ln-time/README.md +14 -0
  142. package/js/ln-time/ln-time.js +1 -1
  143. package/js/ln-time/src/ln-time.js +223 -192
  144. package/js/ln-toast/README.md +178 -122
  145. package/js/ln-toast/ln-toast.js +1 -15
  146. package/js/ln-toast/src/ln-toast.js +232 -210
  147. package/js/ln-toast/template.html +16 -12
  148. package/js/ln-toggle/README.md +61 -2
  149. package/js/ln-toggle/ln-toggle-dev.scss +13 -0
  150. package/js/ln-toggle/ln-toggle.js +1 -1
  151. package/js/ln-toggle/src/ln-toggle.js +56 -43
  152. package/js/ln-tooltip/README.md +95 -58
  153. package/js/ln-tooltip/ln-tooltip-dev.scss +9 -0
  154. package/js/ln-tooltip/ln-tooltip.js +1 -1
  155. package/js/ln-tooltip/src/ln-tooltip.js +45 -6
  156. package/js/ln-translations/README.md +118 -96
  157. package/js/ln-translations/ln-translations.js +1 -1
  158. package/js/ln-translations/src/ln-translations.js +10 -5
  159. package/js/ln-upload/README.md +85 -10
  160. package/js/ln-upload/ln-upload.js +1 -1
  161. package/js/ln-upload/src/ln-upload.js +26 -10
  162. package/js/ln-validate/README.md +72 -0
  163. package/js/ln-validate/ln-validate-dev.scss +15 -0
  164. package/js/ln-validate/ln-validate.js +1 -1
  165. package/js/ln-validate/src/ln-validate.js +64 -0
  166. package/package.json +61 -55
  167. package/scss/base/_global.scss +2 -2
  168. package/scss/base/_typography.scss +1 -2
  169. package/scss/components/_date.scss +1 -0
  170. package/scss/components/_dropdown.scss +0 -5
  171. package/scss/components/_editor.scss +5 -0
  172. package/scss/components/_filter.scss +26 -0
  173. package/scss/components/_form.scss +7 -0
  174. package/scss/components/_ln-table.scss +14 -5
  175. package/scss/components/_sort.scss +10 -0
  176. package/scss/components/_table.scss +68 -1
  177. package/scss/components/_toast.scss +68 -41
  178. package/scss/components/_toggle.scss +16 -0
  179. package/scss/config/_density.scss +205 -117
  180. package/scss/config/_icons.scss +10 -9
  181. package/scss/config/_tokens.scss +69 -47
  182. package/scss/config/mixins/_accordion.scss +2 -7
  183. package/scss/config/mixins/_alert.scss +4 -4
  184. package/scss/config/mixins/_breadcrumbs.scss +2 -2
  185. package/scss/config/mixins/_btn.scss +1 -1
  186. package/scss/config/mixins/_card.scss +89 -14
  187. package/scss/config/mixins/_collapsible.scss +3 -0
  188. package/scss/config/mixins/_colors.scss +1 -1
  189. package/scss/config/mixins/_diagnostics.scss +48 -0
  190. package/scss/config/mixins/_display.scss +1 -0
  191. package/scss/config/mixins/_dropdown.scss +3 -5
  192. package/scss/config/mixins/_editor.scss +124 -0
  193. package/scss/config/mixins/_empty-state.scss +7 -0
  194. package/scss/config/mixins/_filter.scss +47 -0
  195. package/scss/config/mixins/_footer.scss +1 -2
  196. package/scss/config/mixins/_form.scss +207 -21
  197. package/scss/config/mixins/_index.scss +4 -1
  198. package/scss/config/mixins/_ln-table.scss +51 -93
  199. package/scss/config/mixins/_modal.scss +149 -66
  200. package/scss/config/mixins/_nav.scss +3 -4
  201. package/scss/config/mixins/_popover.scss +39 -0
  202. package/scss/config/mixins/_sidebar.scss +1 -1
  203. package/scss/config/mixins/_sort.scss +42 -0
  204. package/scss/config/mixins/_table.scss +232 -38
  205. package/scss/config/mixins/_toast.scss +179 -152
  206. package/scss/config/mixins/_tooltip.scss +17 -7
  207. package/scss/config/mixins/_typography.scss +4 -2
  208. package/scss/ln-ashlar-dev.scss +39 -0
  209. package/scss/ln-ashlar.scss +8 -2
  210. package/js/ln-data-table/README.md +0 -110
  211. package/js/ln-data-table/ln-data-table.js +0 -1
  212. package/js/ln-data-table/ln-data-table.scss +0 -10
  213. package/js/ln-data-table/src/ln-data-table.js +0 -1103
  214. package/js/ln-icons/README.md +0 -88
  215. package/js/ln-icons/ln-icons.js +0 -1
  216. package/js/ln-table/ln-table-sort.js +0 -1
  217. package/js/ln-table/src/ln-table-sort.js +0 -168
  218. package/scss/components/_data-table.scss +0 -83
  219. package/scss/config/mixins/_data-table.scss +0 -346
@@ -8,18 +8,39 @@ import { registerComponent, dispatch } from '../../ln-core';
8
8
 
9
9
  if (window[DOM_ATTRIBUTE] !== undefined) return;
10
10
 
11
+ function _log(...args) {
12
+ const isDebug = document.documentElement.hasAttribute('data-ln-debug') ||
13
+ (document.body && document.body.hasAttribute('data-ln-debug'));
14
+ if (isDebug) {
15
+ console.warn('[ln-confirm]', ...args);
16
+ }
17
+ }
18
+
11
19
  // ─── Component ─────────────────────────────────────────────
12
20
 
13
21
  function _component(dom) {
22
+ _log('constructor called on', dom);
14
23
  this.dom = dom;
15
24
  this.confirming = false;
16
- this.originalText = dom.textContent.trim();
17
- this.confirmText = dom.getAttribute(DOM_SELECTOR) || 'Confirm?';
18
25
  this.revertTimer = null;
19
26
  this._submitted = false;
20
27
 
28
+ // Detect two-element mode
29
+ this.idleEl = dom.querySelector('[data-ln-confirm-idle]');
30
+ this.activeEl = dom.querySelector('[data-ln-confirm-active]');
31
+ this.isTwoElementMode = !!(this.idleEl || this.activeEl);
32
+
33
+ if (this.isTwoElementMode) {
34
+ this.originalText = '';
35
+ this.confirmText = '';
36
+ } else {
37
+ this.originalText = dom.textContent.trim();
38
+ this.confirmText = dom.getAttribute(DOM_SELECTOR) || 'Confirm?';
39
+ }
40
+
21
41
  const self = this;
22
42
  this._onClick = function (e) {
43
+ _log('click handler, confirming:', self.confirming, 'submitted:', self._submitted, 'target:', e.target);
23
44
  if (!self.confirming) {
24
45
  e.preventDefault();
25
46
  e.stopImmediatePropagation();
@@ -45,26 +66,31 @@ import { registerComponent, dispatch } from '../../ln-core';
45
66
  this.confirming = true;
46
67
  this.dom.setAttribute('data-confirming', 'true');
47
68
 
48
- var iconUse = this.dom.querySelector('svg.ln-icon use');
49
- if (iconUse && this.originalText === '') {
50
- this.isIconButton = true;
51
- this.originalIconHref = iconUse.getAttribute('href');
52
- iconUse.setAttribute('href', '#ln-check');
53
- this.dom.classList.add('ln-confirm-tooltip');
54
- this.dom.setAttribute('data-tooltip-text', this.confirmText);
55
- // Accessibility — swap aria-label so the new accessible name
56
- // matches the prompt, and append a transient role="alert"
57
- // announcer so AT speaks the prompt immediately (aria-label
58
- // mutation alone is not announced on a focused element).
59
- this.originalAriaLabel = this.dom.getAttribute('aria-label');
60
- this.dom.setAttribute('aria-label', this.confirmText);
61
- this.alertNode = document.createElement('span');
62
- this.alertNode.className = 'sr-only';
63
- this.alertNode.setAttribute('role', 'alert');
64
- this.alertNode.textContent = this.confirmText;
65
- this.dom.appendChild(this.alertNode);
69
+ this.originalAriaLabel = this.dom.getAttribute('aria-label');
70
+ this.originalAriaLive = this.dom.getAttribute('aria-live');
71
+
72
+ if (this.isTwoElementMode) {
73
+ if (this.idleEl) this.idleEl.setAttribute('hidden', 'true');
74
+ if (this.activeEl) this.activeEl.removeAttribute('hidden');
75
+
76
+ const promptText = this.activeEl ? this.activeEl.textContent.trim() : '';
77
+ if (promptText) {
78
+ this.dom.setAttribute('aria-label', promptText);
79
+ this.dom.setAttribute('aria-live', 'polite');
80
+ }
66
81
  } else {
67
- this.dom.textContent = this.confirmText;
82
+ var iconUse = this.dom.querySelector('svg.ln-icon use');
83
+ if (iconUse && this.originalText === '') {
84
+ this.isIconButton = true;
85
+ this.originalIconHref = iconUse.getAttribute('href');
86
+ iconUse.setAttribute('href', '#ln-icon-check');
87
+ this.dom.classList.add('ln-confirm-tooltip');
88
+ this.dom.setAttribute('data-tooltip-text', this.confirmText);
89
+ this.dom.setAttribute('aria-label', this.confirmText);
90
+ this.dom.setAttribute('aria-live', 'polite');
91
+ } else {
92
+ this.dom.textContent = this.confirmText;
93
+ }
68
94
  }
69
95
 
70
96
  this._startTimer();
@@ -88,29 +114,38 @@ import { registerComponent, dispatch } from '../../ln-core';
88
114
  this.confirming = false;
89
115
  this.dom.removeAttribute('data-confirming');
90
116
 
91
- if (this.isIconButton) {
92
- var iconUse = this.dom.querySelector('svg.ln-icon use');
93
- if (iconUse && this.originalIconHref) {
94
- iconUse.setAttribute('href', this.originalIconHref);
95
- }
96
- this.dom.classList.remove('ln-confirm-tooltip');
97
- this.dom.removeAttribute('data-tooltip-text');
98
- // Accessibility — restore aria-label and remove the announcer.
99
- if (this.originalAriaLabel !== null && this.originalAriaLabel !== undefined) {
100
- this.dom.setAttribute('aria-label', this.originalAriaLabel);
117
+ if (this.isTwoElementMode) {
118
+ if (this.idleEl) this.idleEl.removeAttribute('hidden');
119
+ if (this.activeEl) this.activeEl.setAttribute('hidden', 'true');
120
+ } else {
121
+ if (this.isIconButton) {
122
+ var iconUse = this.dom.querySelector('svg.ln-icon use');
123
+ if (iconUse && this.originalIconHref) {
124
+ iconUse.setAttribute('href', this.originalIconHref);
125
+ }
126
+ this.dom.classList.remove('ln-confirm-tooltip');
127
+ this.dom.removeAttribute('data-tooltip-text');
128
+ this.isIconButton = false;
129
+ this.originalIconHref = null;
101
130
  } else {
102
- this.dom.removeAttribute('aria-label');
103
- }
104
- this.originalAriaLabel = null;
105
- if (this.alertNode && this.alertNode.parentNode === this.dom) {
106
- this.dom.removeChild(this.alertNode);
131
+ this.dom.textContent = this.originalText;
107
132
  }
108
- this.alertNode = null;
109
- this.isIconButton = false;
110
- this.originalIconHref = null;
133
+ }
134
+
135
+ // Restore Accessibility Attributes directly on host button
136
+ if (this.originalAriaLabel !== null && this.originalAriaLabel !== undefined) {
137
+ this.dom.setAttribute('aria-label', this.originalAriaLabel);
138
+ } else {
139
+ this.dom.removeAttribute('aria-label');
140
+ }
141
+ this.originalAriaLabel = null;
142
+
143
+ if (this.originalAriaLive !== null && this.originalAriaLive !== undefined) {
144
+ this.dom.setAttribute('aria-live', this.originalAriaLive);
111
145
  } else {
112
- this.dom.textContent = this.originalText;
146
+ this.dom.removeAttribute('aria-live');
113
147
  }
148
+ this.originalAriaLive = null;
114
149
 
115
150
  if (this.revertTimer) {
116
151
  clearTimeout(this.revertTimer);
@@ -119,8 +154,9 @@ import { registerComponent, dispatch } from '../../ln-core';
119
154
  };
120
155
 
121
156
  _component.prototype.destroy = function () {
157
+ _log('destroy called on', this.dom);
122
158
  if (!this.dom[DOM_ATTRIBUTE]) return;
123
- this._reset();
159
+ if (this.confirming) this._reset();
124
160
  this.dom.removeEventListener('click', this._onClick);
125
161
  delete this.dom[DOM_ATTRIBUTE];
126
162
  };