juxscript 1.1.4 → 1.1.6

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 (205) hide show
  1. package/index.d.ts +10 -10
  2. package/index.d.ts.map +1 -0
  3. package/lib/components/alert.d.ts +32 -0
  4. package/lib/components/alert.d.ts.map +1 -0
  5. package/lib/components/alert.js +153 -0
  6. package/lib/components/alert.ts +200 -0
  7. package/lib/components/app.d.ts +89 -0
  8. package/lib/components/app.d.ts.map +1 -0
  9. package/lib/components/app.js +175 -0
  10. package/lib/components/app.ts +247 -0
  11. package/lib/components/badge.d.ts +27 -0
  12. package/lib/components/badge.d.ts.map +1 -0
  13. package/lib/components/badge.js +70 -0
  14. package/lib/components/badge.ts +101 -0
  15. package/lib/components/base/BaseComponent.d.ts +142 -0
  16. package/lib/components/base/BaseComponent.d.ts.map +1 -0
  17. package/lib/components/base/BaseComponent.js +363 -0
  18. package/lib/components/base/BaseComponent.ts +421 -0
  19. package/lib/components/base/FormInput.d.ts +73 -0
  20. package/lib/components/base/FormInput.d.ts.map +1 -0
  21. package/lib/components/base/FormInput.js +163 -0
  22. package/lib/components/base/FormInput.ts +227 -0
  23. package/lib/components/button.d.ts +48 -0
  24. package/lib/components/button.d.ts.map +1 -0
  25. package/lib/components/button.js +121 -0
  26. package/lib/components/button.ts +178 -0
  27. package/lib/components/card.d.ts +34 -0
  28. package/lib/components/card.d.ts.map +1 -0
  29. package/lib/components/card.js +127 -0
  30. package/lib/components/card.ts +173 -0
  31. package/lib/components/chart.d.ts +45 -0
  32. package/lib/components/chart.d.ts.map +1 -0
  33. package/lib/components/chart.js +186 -0
  34. package/lib/components/chart.ts +231 -0
  35. package/lib/components/checkbox.d.ts +31 -0
  36. package/lib/components/checkbox.d.ts.map +1 -0
  37. package/lib/components/checkbox.js +185 -0
  38. package/lib/components/checkbox.ts +242 -0
  39. package/lib/components/code.d.ts +24 -0
  40. package/lib/components/code.d.ts.map +1 -0
  41. package/lib/components/code.js +88 -0
  42. package/lib/components/code.ts +123 -0
  43. package/lib/components/container.d.ts +42 -0
  44. package/lib/components/container.d.ts.map +1 -0
  45. package/lib/components/container.js +93 -0
  46. package/lib/components/container.ts +140 -0
  47. package/lib/components/data.d.ts +36 -0
  48. package/lib/components/data.d.ts.map +1 -0
  49. package/lib/components/data.js +110 -0
  50. package/lib/components/data.ts +135 -0
  51. package/lib/components/datepicker.d.ts +38 -0
  52. package/lib/components/datepicker.d.ts.map +1 -0
  53. package/lib/components/datepicker.js +177 -0
  54. package/lib/components/datepicker.ts +234 -0
  55. package/lib/components/dialog.d.ts +38 -0
  56. package/lib/components/dialog.d.ts.map +1 -0
  57. package/lib/components/dialog.js +126 -0
  58. package/lib/components/dialog.ts +172 -0
  59. package/lib/components/divider.d.ts +30 -0
  60. package/lib/components/divider.d.ts.map +1 -0
  61. package/lib/components/divider.js +69 -0
  62. package/lib/components/divider.ts +100 -0
  63. package/lib/components/dropdown.d.ts +39 -0
  64. package/lib/components/dropdown.d.ts.map +1 -0
  65. package/lib/components/dropdown.js +133 -0
  66. package/lib/components/dropdown.ts +186 -0
  67. package/lib/components/element.d.ts +50 -0
  68. package/lib/components/element.d.ts.map +1 -0
  69. package/lib/components/element.js +206 -0
  70. package/lib/components/element.ts +267 -0
  71. package/lib/components/fileupload.d.ts +40 -0
  72. package/lib/components/fileupload.d.ts.map +1 -0
  73. package/lib/components/fileupload.js +241 -0
  74. package/lib/components/fileupload.ts +309 -0
  75. package/lib/components/grid.d.ts +87 -0
  76. package/lib/components/grid.d.ts.map +1 -0
  77. package/lib/components/grid.js +205 -0
  78. package/lib/components/grid.ts +291 -0
  79. package/lib/components/guard.d.ts +41 -0
  80. package/lib/components/guard.d.ts.map +1 -0
  81. package/lib/components/guard.js +56 -0
  82. package/lib/components/guard.ts +92 -0
  83. package/lib/components/heading.d.ts +24 -0
  84. package/lib/components/heading.d.ts.map +1 -0
  85. package/lib/components/heading.js +67 -0
  86. package/lib/components/heading.ts +96 -0
  87. package/lib/components/helpers.d.ts +9 -0
  88. package/lib/components/helpers.d.ts.map +1 -0
  89. package/lib/components/helpers.js +30 -0
  90. package/lib/components/helpers.ts +41 -0
  91. package/lib/components/hero.d.ts +45 -0
  92. package/lib/components/hero.d.ts.map +1 -0
  93. package/lib/components/hero.js +165 -0
  94. package/lib/components/hero.ts +224 -0
  95. package/lib/components/icon.d.ts +35 -0
  96. package/lib/components/icon.d.ts.map +1 -0
  97. package/lib/components/icon.js +132 -0
  98. package/lib/components/icon.ts +178 -0
  99. package/lib/components/icons.d.ts +25 -0
  100. package/lib/components/icons.d.ts.map +1 -0
  101. package/lib/components/icons.js +440 -0
  102. package/lib/components/icons.ts +464 -0
  103. package/lib/components/include.d.ts +120 -0
  104. package/lib/components/include.d.ts.map +1 -0
  105. package/lib/components/include.js +350 -0
  106. package/lib/components/include.ts +410 -0
  107. package/lib/components/input.d.ts +83 -0
  108. package/lib/components/input.d.ts.map +1 -0
  109. package/lib/components/input.js +348 -0
  110. package/lib/components/input.ts +457 -0
  111. package/lib/components/list.d.ts +82 -0
  112. package/lib/components/list.d.ts.map +1 -0
  113. package/lib/components/list.js +311 -0
  114. package/lib/components/list.ts +419 -0
  115. package/lib/components/loading.d.ts +24 -0
  116. package/lib/components/loading.d.ts.map +1 -0
  117. package/lib/components/loading.js +73 -0
  118. package/lib/components/loading.ts +100 -0
  119. package/lib/components/menu.d.ts +37 -0
  120. package/lib/components/menu.d.ts.map +1 -0
  121. package/lib/components/menu.js +202 -0
  122. package/lib/components/menu.ts +275 -0
  123. package/lib/components/modal.d.ts +51 -0
  124. package/lib/components/modal.d.ts.map +1 -0
  125. package/lib/components/modal.js +227 -0
  126. package/lib/components/modal.ts +284 -0
  127. package/lib/components/nav.d.ts +45 -0
  128. package/lib/components/nav.d.ts.map +1 -0
  129. package/lib/components/nav.js +190 -0
  130. package/lib/components/nav.ts +257 -0
  131. package/lib/components/paragraph.d.ts +21 -0
  132. package/lib/components/paragraph.d.ts.map +1 -0
  133. package/lib/components/paragraph.js +70 -0
  134. package/lib/components/paragraph.ts +97 -0
  135. package/lib/components/progress.d.ts +39 -0
  136. package/lib/components/progress.d.ts.map +1 -0
  137. package/lib/components/progress.js +113 -0
  138. package/lib/components/progress.ts +159 -0
  139. package/lib/components/radio.d.ts +41 -0
  140. package/lib/components/radio.d.ts.map +1 -0
  141. package/lib/components/radio.js +203 -0
  142. package/lib/components/radio.ts +278 -0
  143. package/lib/components/req.d.ts +155 -0
  144. package/lib/components/req.d.ts.map +1 -0
  145. package/lib/components/req.js +253 -0
  146. package/lib/components/req.ts +303 -0
  147. package/lib/components/script.d.ts +14 -0
  148. package/lib/components/script.d.ts.map +1 -0
  149. package/lib/components/script.js +33 -0
  150. package/lib/components/script.ts +41 -0
  151. package/lib/components/select.d.ts +40 -0
  152. package/lib/components/select.d.ts.map +1 -0
  153. package/lib/components/select.js +183 -0
  154. package/lib/components/select.ts +252 -0
  155. package/lib/components/sidebar.d.ts +48 -0
  156. package/lib/components/sidebar.d.ts.map +1 -0
  157. package/lib/components/sidebar.js +207 -0
  158. package/lib/components/sidebar.ts +275 -0
  159. package/lib/components/style.d.ts +14 -0
  160. package/lib/components/style.d.ts.map +1 -0
  161. package/lib/components/style.js +33 -0
  162. package/lib/components/style.ts +41 -0
  163. package/lib/components/switch.d.ts +32 -0
  164. package/lib/components/switch.d.ts.map +1 -0
  165. package/lib/components/switch.js +186 -0
  166. package/lib/components/switch.ts +246 -0
  167. package/lib/components/table.d.ts +137 -0
  168. package/lib/components/table.d.ts.map +1 -0
  169. package/lib/components/table.js +1045 -0
  170. package/lib/components/table.ts +1249 -0
  171. package/lib/components/tabs.d.ts +36 -0
  172. package/lib/components/tabs.d.ts.map +1 -0
  173. package/lib/components/tabs.js +198 -0
  174. package/lib/components/tabs.ts +250 -0
  175. package/lib/components/theme-toggle.d.ts +44 -0
  176. package/lib/components/theme-toggle.d.ts.map +1 -0
  177. package/lib/components/theme-toggle.js +215 -0
  178. package/lib/components/theme-toggle.ts +293 -0
  179. package/lib/components/tooltip.d.ts +30 -0
  180. package/lib/components/tooltip.d.ts.map +1 -0
  181. package/lib/components/tooltip.js +109 -0
  182. package/lib/components/tooltip.ts +144 -0
  183. package/lib/components/view.d.ts +48 -0
  184. package/lib/components/view.d.ts.map +1 -0
  185. package/lib/components/view.js +149 -0
  186. package/lib/components/view.ts +190 -0
  187. package/lib/components/write.d.ts +107 -0
  188. package/lib/components/write.d.ts.map +1 -0
  189. package/lib/components/write.js +222 -0
  190. package/lib/components/write.ts +272 -0
  191. package/lib/layouts/default.css +260 -0
  192. package/lib/layouts/figma.css +334 -0
  193. package/lib/reactivity/state.d.ts +36 -0
  194. package/lib/reactivity/state.d.ts.map +1 -0
  195. package/lib/reactivity/state.js +67 -0
  196. package/lib/reactivity/state.ts +78 -0
  197. package/lib/utils/fetch.d.ts +176 -0
  198. package/lib/utils/fetch.d.ts.map +1 -0
  199. package/lib/utils/fetch.js +427 -0
  200. package/lib/utils/fetch.ts +553 -0
  201. package/machinery/compiler3.js +78 -0
  202. package/machinery/doc-generator.js +136 -0
  203. package/machinery/imports.js +155 -0
  204. package/machinery/ts-shim.js +46 -0
  205. package/package.json +9 -15
@@ -0,0 +1,311 @@
1
+ import { BaseComponent } from './base/BaseComponent.js';
2
+ import { renderIcon } from './icons.js';
3
+ // Event definitions
4
+ const TRIGGER_EVENTS = [];
5
+ const CALLBACK_EVENTS = ['itemClick', 'itemDoubleClick', 'selectionChange'];
6
+ export class List extends BaseComponent {
7
+ constructor(id, options = {}) {
8
+ // ✅ Normalize items - convert strings to ListItem objects
9
+ const normalizedItems = (options.items ?? []).map(item => typeof item === 'string' ? { title: item } : item);
10
+ super(id, {
11
+ items: normalizedItems,
12
+ header: options.header ?? '',
13
+ gap: options.gap ?? '0.5rem',
14
+ direction: options.direction ?? 'vertical',
15
+ selectable: options.selectable ?? false,
16
+ multiSelect: options.multiSelect ?? false,
17
+ selectedIndex: options.selectedIndex ?? null,
18
+ selectedIndices: options.selectedIndices ?? [],
19
+ ordered: options.ordered ?? false,
20
+ striped: options.striped ?? false,
21
+ hoverable: options.hoverable ?? true,
22
+ bordered: options.bordered ?? false,
23
+ style: options.style ?? '',
24
+ class: options.class ?? ''
25
+ });
26
+ this._onItemClick = null;
27
+ this._onItemDoubleClick = null;
28
+ this._onSelectionChange = null;
29
+ this._listElement = null;
30
+ this._onItemClick = options.onItemClick ?? null;
31
+ this._onItemDoubleClick = options.onItemDoubleClick ?? null;
32
+ this._onSelectionChange = options.onSelectionChange ?? null;
33
+ }
34
+ getTriggerEvents() {
35
+ return TRIGGER_EVENTS;
36
+ }
37
+ getCallbackEvents() {
38
+ return CALLBACK_EVENTS;
39
+ }
40
+ /* ═════════════════════════════════════════════════════════════════
41
+ * FLUENT API
42
+ * ═════════════════════════════════════════════════════════════════ */
43
+ // ✅ Inherited from BaseComponent
44
+ items(value) {
45
+ // ✅ Normalize items when setting via fluent API
46
+ this.state.items = value.map(item => typeof item === 'string' ? { title: item } : item);
47
+ this._updateList();
48
+ return this;
49
+ }
50
+ addItem(value) {
51
+ // ✅ Normalize single item
52
+ const normalizedItem = typeof value === 'string' ? { title: value } : value;
53
+ this.state.items = [...this.state.items, normalizedItem];
54
+ this._updateList();
55
+ return this;
56
+ }
57
+ removeItem(index) {
58
+ this.state.items = this.state.items.filter((_, i) => i !== index);
59
+ this._updateList();
60
+ return this;
61
+ }
62
+ updateItem(index, updates) {
63
+ this.state.items = this.state.items.map((item, i) => i === index ? { ...item, ...updates } : item);
64
+ this._updateList();
65
+ return this;
66
+ }
67
+ clearItems() {
68
+ this.state.items = [];
69
+ this._updateList();
70
+ return this;
71
+ }
72
+ itemClass(className) {
73
+ this.state.items = this.state.items.map(item => ({
74
+ ...item,
75
+ itemClass: className
76
+ }));
77
+ this._updateList();
78
+ return this;
79
+ }
80
+ ordered(value) {
81
+ this.state.ordered = value;
82
+ return this;
83
+ }
84
+ selectable(value) {
85
+ this.state.selectable = value;
86
+ return this;
87
+ }
88
+ multiSelect(value) {
89
+ this.state.multiSelect = value;
90
+ return this;
91
+ }
92
+ striped(value) {
93
+ this.state.striped = value;
94
+ return this;
95
+ }
96
+ hoverable(value) {
97
+ this.state.hoverable = value;
98
+ return this;
99
+ }
100
+ bordered(value) {
101
+ this.state.bordered = value;
102
+ return this;
103
+ }
104
+ selectItem(index) {
105
+ if (!this.state.selectable)
106
+ return this;
107
+ if (this.state.multiSelect) {
108
+ if (!this.state.selectedIndices.includes(index)) {
109
+ this.state.selectedIndices = [...this.state.selectedIndices, index];
110
+ }
111
+ }
112
+ else {
113
+ this.state.selectedIndex = index;
114
+ this.state.selectedIndices = [index];
115
+ }
116
+ this._updateSelection();
117
+ this._triggerSelectionChange();
118
+ return this;
119
+ }
120
+ deselectItem(index) {
121
+ if (!this.state.selectable)
122
+ return this;
123
+ if (this.state.multiSelect) {
124
+ this.state.selectedIndices = this.state.selectedIndices.filter(i => i !== index);
125
+ }
126
+ else {
127
+ this.state.selectedIndex = null;
128
+ this.state.selectedIndices = [];
129
+ }
130
+ this._updateSelection();
131
+ this._triggerSelectionChange();
132
+ return this;
133
+ }
134
+ clearSelection() {
135
+ this.state.selectedIndex = null;
136
+ this.state.selectedIndices = [];
137
+ this._updateSelection();
138
+ this._triggerSelectionChange();
139
+ return this;
140
+ }
141
+ getSelectedItems() {
142
+ return this.state.selectedIndices.map(i => this.state.items[i]).filter(Boolean);
143
+ }
144
+ getSelectedIndices() {
145
+ return this.state.selectedIndices;
146
+ }
147
+ /* ═════════════════════════════════════════════════════════════════
148
+ * PRIVATE HELPERS
149
+ * ═════════════════════════════════════════════════════════════════ */
150
+ _updateList() {
151
+ if (!this._listElement)
152
+ return;
153
+ this._listElement.innerHTML = '';
154
+ this._renderItems(this._listElement);
155
+ }
156
+ _updateSelection() {
157
+ if (!this._listElement)
158
+ return;
159
+ const items = this._listElement.querySelectorAll('.jux-list-item');
160
+ items.forEach((el, index) => {
161
+ const isSelected = this.state.selectedIndices.includes(index);
162
+ el.classList.toggle('jux-list-item-selected', isSelected);
163
+ });
164
+ }
165
+ _triggerSelectionChange() {
166
+ const selectedItems = this.getSelectedItems();
167
+ const selectedIndices = this.getSelectedIndices();
168
+ if (this._onSelectionChange) {
169
+ this._onSelectionChange(selectedItems, selectedIndices);
170
+ }
171
+ // 🎯 Fire the selectionChange callback event
172
+ this._triggerCallback('selectionChange', { items: selectedItems, indices: selectedIndices });
173
+ }
174
+ _renderItems(list) {
175
+ const { items, selectable, hoverable, striped, bordered } = this.state;
176
+ items.forEach((item, index) => {
177
+ const li = document.createElement('li');
178
+ li.className = 'jux-list-item';
179
+ if (item.itemClass)
180
+ li.className += ` ${item.itemClass}`;
181
+ if (item.type && item.type !== 'default')
182
+ li.classList.add(`jux-list-item-${item.type}`);
183
+ if (item.disabled)
184
+ li.classList.add('jux-list-item-disabled');
185
+ if (this.state.selectedIndices.includes(index))
186
+ li.classList.add('jux-list-item-selected');
187
+ if (hoverable && !item.disabled)
188
+ li.classList.add('jux-list-item-hoverable');
189
+ if (striped && index % 2 === 1)
190
+ li.classList.add('jux-list-item-striped');
191
+ if (bordered)
192
+ li.classList.add('jux-list-item-bordered');
193
+ // Content container
194
+ const content = document.createElement('div');
195
+ content.className = 'jux-list-item-content';
196
+ // Icon
197
+ if (item.icon) {
198
+ const iconEl = document.createElement('span');
199
+ iconEl.className = 'jux-list-item-icon';
200
+ iconEl.appendChild(renderIcon(item.icon));
201
+ content.appendChild(iconEl);
202
+ }
203
+ // Text content
204
+ const textContainer = document.createElement('div');
205
+ textContainer.className = 'jux-list-item-text';
206
+ if (item.title) {
207
+ const titleEl = document.createElement('div');
208
+ titleEl.className = 'jux-list-item-title';
209
+ titleEl.textContent = item.title;
210
+ textContainer.appendChild(titleEl);
211
+ }
212
+ if (item.body) {
213
+ const bodyEl = document.createElement('div');
214
+ bodyEl.className = 'jux-list-item-body';
215
+ bodyEl.textContent = item.body;
216
+ textContainer.appendChild(bodyEl);
217
+ }
218
+ content.appendChild(textContainer);
219
+ // Metadata
220
+ if (item.metadata) {
221
+ const metaEl = document.createElement('div');
222
+ metaEl.className = 'jux-list-item-metadata';
223
+ metaEl.textContent = item.metadata;
224
+ content.appendChild(metaEl);
225
+ }
226
+ li.appendChild(content);
227
+ // Click handlers
228
+ if (!item.disabled) {
229
+ li.addEventListener('click', (e) => {
230
+ if (selectable) {
231
+ if (this.state.selectedIndices.includes(index)) {
232
+ this.deselectItem(index);
233
+ }
234
+ else {
235
+ if (!this.state.multiSelect) {
236
+ this.clearSelection();
237
+ }
238
+ this.selectItem(index);
239
+ }
240
+ }
241
+ if (this._onItemClick) {
242
+ this._onItemClick(item, index, e);
243
+ }
244
+ // 🎯 Fire the itemClick callback event
245
+ this._triggerCallback('itemClick', { item, index, event: e });
246
+ });
247
+ li.addEventListener('dblclick', (e) => {
248
+ if (this._onItemDoubleClick) {
249
+ this._onItemDoubleClick(item, index, e);
250
+ }
251
+ // 🎯 Fire the itemDoubleClick callback event
252
+ this._triggerCallback('itemDoubleClick', { item, index, event: e });
253
+ });
254
+ }
255
+ list.appendChild(li);
256
+ });
257
+ }
258
+ /* ═════════════════════════════════════════════════════════════════
259
+ * RENDER
260
+ * ═════════════════════════════════════════════════════════════════ */
261
+ render(targetId) {
262
+ const container = this._setupContainer(targetId);
263
+ const { header, ordered, style, class: className } = this.state;
264
+ const wrapper = document.createElement('div');
265
+ wrapper.className = 'jux-list-wrapper';
266
+ wrapper.id = `${this._id}-wrapper`;
267
+ // Header
268
+ if (header) {
269
+ const headerEl = document.createElement('div');
270
+ headerEl.className = 'jux-list-header';
271
+ headerEl.textContent = header;
272
+ wrapper.appendChild(headerEl);
273
+ }
274
+ // List
275
+ const list = document.createElement(ordered ? 'ol' : 'ul');
276
+ list.className = `jux-list ${ordered ? 'jux-list-ordered' : 'jux-list-unordered'}`;
277
+ list.id = this._id;
278
+ if (className)
279
+ list.className += ` ${className}`;
280
+ if (style)
281
+ list.setAttribute('style', style);
282
+ this._listElement = list;
283
+ this._renderItems(list);
284
+ wrapper.appendChild(list);
285
+ this._wireStandardEvents(list);
286
+ // Wire sync bindings
287
+ this._syncBindings.forEach(({ property, stateObj, toState, toComponent }) => {
288
+ if (property === 'items') {
289
+ const transform = toComponent || ((v) => v);
290
+ stateObj.subscribe((val) => {
291
+ const transformed = transform(val);
292
+ this.state.items = transformed;
293
+ this._updateList();
294
+ });
295
+ }
296
+ else if (property === 'selectedIndices') {
297
+ const transform = toComponent || ((v) => v);
298
+ stateObj.subscribe((val) => {
299
+ const transformed = transform(val);
300
+ this.state.selectedIndices = transformed;
301
+ this._updateSelection();
302
+ });
303
+ }
304
+ });
305
+ container.appendChild(wrapper);
306
+ return this;
307
+ }
308
+ }
309
+ export function list(id, options = {}) {
310
+ return new List(id, options);
311
+ }