sibujs 1.5.0 → 2.1.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 (208) hide show
  1. package/dist/browser.cjs +332 -121
  2. package/dist/browser.d.cts +5 -0
  3. package/dist/browser.d.ts +5 -0
  4. package/dist/browser.js +6 -6
  5. package/dist/build.cjs +1049 -344
  6. package/dist/build.js +15 -13
  7. package/dist/cdn.global.js +17 -16
  8. package/dist/chunk-2RA7SHDA.js +65 -0
  9. package/dist/chunk-2UPRY23K.js +80 -0
  10. package/dist/{chunk-BMPL52BF.js → chunk-3DZP6OIT.js} +118 -66
  11. package/dist/chunk-3JHCYHWN.js +125 -0
  12. package/dist/{chunk-CZUGLNJS.js → chunk-45YP72ZQ.js} +3 -3
  13. package/dist/{chunk-JCDUJN2F.js → chunk-AMK2TYNW.js} +490 -153
  14. package/dist/{chunk-NHUC2QWH.js → chunk-CWBVQML6.js} +1 -1
  15. package/dist/{chunk-XHK6BDAJ.js → chunk-DRUZZAK4.js} +25 -8
  16. package/dist/{chunk-RJ46C3CS.js → chunk-GWWURC5M.js} +71 -20
  17. package/dist/{chunk-3X2YG6YM.js → chunk-JYD2PWXH.js} +59 -28
  18. package/dist/{chunk-2BYQDGN3.js → chunk-KGYT6UO6.js} +234 -63
  19. package/dist/{chunk-5X6PP2UK.js → chunk-LMLD24FC.js} +2 -2
  20. package/dist/{chunk-M4NLBH4I.js → chunk-LYTCUZ7H.js} +3 -2
  21. package/dist/{chunk-XUEEGU5O.js → chunk-NASX6ST2.js} +16 -4
  22. package/dist/{chunk-VQDZK23A.js → chunk-O6EFQ3KT.js} +181 -66
  23. package/dist/{chunk-BGN5ZMP4.js → chunk-OJ3P4ECI.js} +14 -2
  24. package/dist/chunk-ON5MMR2J.js +1327 -0
  25. package/dist/{chunk-SFKNRVCU.js → chunk-P2HSJDDN.js} +135 -79
  26. package/dist/chunk-QO3WC6FS.js +384 -0
  27. package/dist/{chunk-WZSPOOER.js → chunk-RDTDJCAB.js} +8 -5
  28. package/dist/{chunk-7GRNSCFT.js → chunk-TH2ILCYW.js} +312 -185
  29. package/dist/chunk-UCS6AMJ7.js +79 -0
  30. package/dist/{chunk-VAPYJN4X.js → chunk-V6C4FADE.js} +93 -23
  31. package/dist/{chunk-OUZZEE4S.js → chunk-WANSMF2L.js} +17 -11
  32. package/dist/{chunk-23VV7YD3.js → chunk-WIPZPFBQ.js} +25 -30
  33. package/dist/chunk-WZA53FXU.js +149 -0
  34. package/dist/{chunk-BGTHZHJ5.js → chunk-ZAQSMOED.js} +188 -44
  35. package/dist/{customElement-BL3Uo8dL.d.cts → customElement-CPfIrbvg.d.cts} +14 -10
  36. package/dist/{customElement-BL3Uo8dL.d.ts → customElement-CPfIrbvg.d.ts} +14 -10
  37. package/dist/data.cjs +536 -151
  38. package/dist/data.d.cts +20 -2
  39. package/dist/data.d.ts +20 -2
  40. package/dist/data.js +11 -9
  41. package/dist/devtools.cjs +613 -266
  42. package/dist/devtools.d.cts +1 -1
  43. package/dist/devtools.d.ts +1 -1
  44. package/dist/devtools.js +12 -6
  45. package/dist/ecosystem.cjs +602 -197
  46. package/dist/ecosystem.d.cts +9 -7
  47. package/dist/ecosystem.d.ts +9 -7
  48. package/dist/ecosystem.js +12 -11
  49. package/dist/extras.cjs +3500 -1608
  50. package/dist/extras.d.cts +9 -9
  51. package/dist/extras.d.ts +9 -9
  52. package/dist/extras.js +58 -45
  53. package/dist/index.cjs +1055 -344
  54. package/dist/index.d.cts +85 -8
  55. package/dist/index.d.ts +85 -8
  56. package/dist/index.js +32 -16
  57. package/dist/{introspect-BumjnBKr.d.cts → introspect-2TOlQ7oa.d.cts} +25 -3
  58. package/dist/{introspect-CZrlcaYy.d.ts → introspect-DnIpHQQz.d.ts} +25 -3
  59. package/dist/motion.cjs +122 -63
  60. package/dist/motion.js +4 -4
  61. package/dist/patterns.cjs +450 -110
  62. package/dist/patterns.d.cts +11 -12
  63. package/dist/patterns.d.ts +11 -12
  64. package/dist/patterns.js +7 -7
  65. package/dist/performance.cjs +373 -149
  66. package/dist/performance.d.cts +23 -16
  67. package/dist/performance.d.ts +23 -16
  68. package/dist/performance.js +13 -8
  69. package/dist/plugin-D30wlGW5.d.cts +71 -0
  70. package/dist/plugin-D30wlGW5.d.ts +71 -0
  71. package/dist/plugins.cjs +729 -301
  72. package/dist/plugins.d.cts +10 -3
  73. package/dist/plugins.d.ts +10 -3
  74. package/dist/plugins.js +106 -38
  75. package/dist/{ssr-Do_SiVoL.d.cts → ssr-CrVNy6Pa.d.cts} +9 -15
  76. package/dist/{ssr-Do_SiVoL.d.ts → ssr-CrVNy6Pa.d.ts} +9 -15
  77. package/dist/{ssr-4PBXAOO3.js → ssr-FXD2PPMC.js} +4 -3
  78. package/dist/ssr.cjs +736 -274
  79. package/dist/ssr.d.cts +26 -6
  80. package/dist/ssr.d.ts +26 -6
  81. package/dist/ssr.js +12 -11
  82. package/dist/{tagFactory-DaJ0YWX6.d.cts → tagFactory-S17H2qxu.d.cts} +9 -1
  83. package/dist/{tagFactory-DaJ0YWX6.d.ts → tagFactory-S17H2qxu.d.ts} +9 -1
  84. package/dist/testing.cjs +303 -76
  85. package/dist/testing.d.cts +17 -4
  86. package/dist/testing.d.ts +17 -4
  87. package/dist/testing.js +100 -44
  88. package/dist/ui.cjs +589 -178
  89. package/dist/ui.d.cts +1 -1
  90. package/dist/ui.d.ts +1 -1
  91. package/dist/ui.js +20 -17
  92. package/dist/widgets.cjs +1103 -146
  93. package/dist/widgets.d.cts +104 -2
  94. package/dist/widgets.d.ts +104 -2
  95. package/dist/widgets.js +9 -7
  96. package/package.json +8 -2
  97. package/dist/chunk-32DY64NT.js +0 -282
  98. package/dist/chunk-3AIRKM3B.js +0 -1263
  99. package/dist/chunk-3ARAQO7B.js +0 -398
  100. package/dist/chunk-3CRQALYP.js +0 -877
  101. package/dist/chunk-4EI4AG32.js +0 -482
  102. package/dist/chunk-4MYMUBRS.js +0 -21
  103. package/dist/chunk-5ZYQ6KDD.js +0 -154
  104. package/dist/chunk-6BMPXPUW.js +0 -26
  105. package/dist/chunk-6HLLIF3K.js +0 -398
  106. package/dist/chunk-6LSNVCS2.js +0 -937
  107. package/dist/chunk-6SA3QQES.js +0 -61
  108. package/dist/chunk-77L6NL3X.js +0 -1097
  109. package/dist/chunk-7BF6TK55.js +0 -1097
  110. package/dist/chunk-7TQKR4PP.js +0 -294
  111. package/dist/chunk-7V26P53V.js +0 -712
  112. package/dist/chunk-AZ3ISID5.js +0 -298
  113. package/dist/chunk-B7SWRFUT.js +0 -332
  114. package/dist/chunk-BTU3TJDS.js +0 -365
  115. package/dist/chunk-BW3WT46K.js +0 -937
  116. package/dist/chunk-C6KFWOFV.js +0 -616
  117. package/dist/chunk-CHF5OHIA.js +0 -61
  118. package/dist/chunk-CHJ27IGK.js +0 -26
  119. package/dist/chunk-CMBFNA7L.js +0 -27
  120. package/dist/chunk-DAHRH4ON.js +0 -331
  121. package/dist/chunk-DKOHBI74.js +0 -924
  122. package/dist/chunk-DTCOOBMX.js +0 -725
  123. package/dist/chunk-EBGIRKQY.js +0 -616
  124. package/dist/chunk-EUZND3CB.js +0 -27
  125. package/dist/chunk-EVCZO745.js +0 -365
  126. package/dist/chunk-EWFVA3TJ.js +0 -282
  127. package/dist/chunk-F3FA4F32.js +0 -292
  128. package/dist/chunk-FGOEVHY3.js +0 -60
  129. package/dist/chunk-G3BOQPVO.js +0 -365
  130. package/dist/chunk-GCOK2LC3.js +0 -282
  131. package/dist/chunk-GJPXRJ45.js +0 -37
  132. package/dist/chunk-HGMJFBC7.js +0 -654
  133. package/dist/chunk-JAKHTMQU.js +0 -1000
  134. package/dist/chunk-JCI5M6U6.js +0 -956
  135. package/dist/chunk-K4G4ZQNR.js +0 -286
  136. package/dist/chunk-K5ZUMYVS.js +0 -89
  137. package/dist/chunk-KQPDEVVS.js +0 -398
  138. package/dist/chunk-L6JRBDNS.js +0 -60
  139. package/dist/chunk-LA6KQEDU.js +0 -712
  140. package/dist/chunk-MB6QFH3I.js +0 -2776
  141. package/dist/chunk-MDVXJWFN.js +0 -304
  142. package/dist/chunk-MEZVEBPN.js +0 -2008
  143. package/dist/chunk-MK4ERFYL.js +0 -2249
  144. package/dist/chunk-MLKGABMK.js +0 -9
  145. package/dist/chunk-MQ5GOYPH.js +0 -2249
  146. package/dist/chunk-MYRV7VDM.js +0 -742
  147. package/dist/chunk-N6IZB6KJ.js +0 -567
  148. package/dist/chunk-NEKUBFPT.js +0 -60
  149. package/dist/chunk-NMRUZALC.js +0 -1097
  150. package/dist/chunk-NYVAC6P5.js +0 -37
  151. package/dist/chunk-NZIIMDWI.js +0 -84
  152. package/dist/chunk-OF7UZIVB.js +0 -725
  153. package/dist/chunk-P3XWXJZU.js +0 -282
  154. package/dist/chunk-P6W3STU4.js +0 -2249
  155. package/dist/chunk-PBHF5WKN.js +0 -616
  156. package/dist/chunk-PDZQY43A.js +0 -616
  157. package/dist/chunk-PTQJDMRT.js +0 -146
  158. package/dist/chunk-PZEGYCF5.js +0 -61
  159. package/dist/chunk-QBMDLBU2.js +0 -975
  160. package/dist/chunk-QWZG56ET.js +0 -2744
  161. package/dist/chunk-RQGQSLQK.js +0 -725
  162. package/dist/chunk-SDLZDHKP.js +0 -107
  163. package/dist/chunk-TDGZL5CU.js +0 -365
  164. package/dist/chunk-TNQWPPE6.js +0 -37
  165. package/dist/chunk-TSOKIX5Z.js +0 -654
  166. package/dist/chunk-UHNL42EF.js +0 -2730
  167. package/dist/chunk-UNXCEF6S.js +0 -21
  168. package/dist/chunk-V2XTI523.js +0 -347
  169. package/dist/chunk-VAU366PN.js +0 -2241
  170. package/dist/chunk-VMVDTCXB.js +0 -712
  171. package/dist/chunk-VQNQZCWJ.js +0 -61
  172. package/dist/chunk-VRW3FULF.js +0 -725
  173. package/dist/chunk-WADYRCO2.js +0 -304
  174. package/dist/chunk-WILQZRO4.js +0 -282
  175. package/dist/chunk-WR5D4EGH.js +0 -26
  176. package/dist/chunk-WUHJISPP.js +0 -298
  177. package/dist/chunk-XYU6TZOW.js +0 -182
  178. package/dist/chunk-Y6GP4QGG.js +0 -276
  179. package/dist/chunk-YECR7UIA.js +0 -347
  180. package/dist/chunk-YUTWTI4B.js +0 -654
  181. package/dist/chunk-Z65KYU7I.js +0 -26
  182. package/dist/chunk-Z6POF5YC.js +0 -975
  183. package/dist/chunk-ZBJP6WFL.js +0 -482
  184. package/dist/chunk-ZD6OAMTH.js +0 -277
  185. package/dist/chunk-ZWKZCBO6.js +0 -317
  186. package/dist/contracts-DDrwxvJ-.d.cts +0 -245
  187. package/dist/contracts-DDrwxvJ-.d.ts +0 -245
  188. package/dist/contracts-DOrhwbke.d.cts +0 -245
  189. package/dist/contracts-DOrhwbke.d.ts +0 -245
  190. package/dist/contracts-xo5ckdRP.d.cts +0 -240
  191. package/dist/contracts-xo5ckdRP.d.ts +0 -240
  192. package/dist/customElement-BKQfbSZQ.d.cts +0 -262
  193. package/dist/customElement-BKQfbSZQ.d.ts +0 -262
  194. package/dist/customElement-D2DJp_xn.d.cts +0 -313
  195. package/dist/customElement-D2DJp_xn.d.ts +0 -313
  196. package/dist/customElement-yz8uyk-0.d.cts +0 -308
  197. package/dist/customElement-yz8uyk-0.d.ts +0 -308
  198. package/dist/introspect-Cb0zgpi2.d.cts +0 -477
  199. package/dist/introspect-Y2xNXGSf.d.ts +0 -477
  200. package/dist/plugin-Bek4RhJY.d.cts +0 -43
  201. package/dist/plugin-Bek4RhJY.d.ts +0 -43
  202. package/dist/ssr-3RXHP5ES.js +0 -38
  203. package/dist/ssr-6GIMY5MX.js +0 -38
  204. package/dist/ssr-BA6sxxUd.d.cts +0 -135
  205. package/dist/ssr-BA6sxxUd.d.ts +0 -135
  206. package/dist/ssr-WKUPVSSK.js +0 -36
  207. package/dist/tagFactory-Dl8QCLga.d.cts +0 -23
  208. package/dist/tagFactory-Dl8QCLga.d.ts +0 -23
@@ -16,6 +16,14 @@ declare function combobox<T>(options: ComboboxOptions<T>): {
16
16
  isOpen: () => boolean;
17
17
  open: () => void;
18
18
  close: () => void;
19
+ /** WAI-ARIA Combobox 1.2 wiring: `role=combobox` on input,
20
+ * `aria-expanded`/`aria-controls`/`aria-activedescendant`, listbox option
21
+ * ids, Down/Up/Enter/Escape/Home/End. Returns dispose. */
22
+ bind: (els: {
23
+ input: HTMLInputElement;
24
+ listbox: HTMLElement;
25
+ option: (item: T, index: number) => HTMLElement | null;
26
+ }) => () => void;
19
27
  };
20
28
 
21
29
  interface TabsOptions {
@@ -26,6 +34,15 @@ interface TabsOptions {
26
34
  }>;
27
35
  defaultTab?: string;
28
36
  }
37
+ interface TabsAriaBinding {
38
+ /** WAI-ARIA Tabs pattern — wires `role`/`aria-*` and arrow/Home/End keys
39
+ * to the provided tablist + per-tab elements. Returns dispose. */
40
+ bind: (els: {
41
+ tablist: HTMLElement;
42
+ tabs: Record<string, HTMLElement>;
43
+ panels?: Record<string, HTMLElement>;
44
+ }) => () => void;
45
+ }
29
46
  declare function tabs(options: TabsOptions): {
30
47
  activeTab: () => string;
31
48
  setActiveTab: (id: string) => void;
@@ -38,6 +55,7 @@ declare function tabs(options: TabsOptions): {
38
55
  nextTab: () => void;
39
56
  prevTab: () => void;
40
57
  isActive: (id: string) => boolean;
58
+ bind: TabsAriaBinding["bind"];
41
59
  };
42
60
 
43
61
  interface AccordionOptions {
@@ -48,6 +66,18 @@ interface AccordionOptions {
48
66
  multiple?: boolean;
49
67
  defaultExpanded?: string[];
50
68
  }
69
+ interface AccordionAriaBinding {
70
+ /** WAI-ARIA Accordion pattern — wires `aria-expanded`/`aria-controls`,
71
+ * Enter/Space toggle, and panel `role=region`. Returns dispose.
72
+ * Pass `root` (any stable container element) to anchor the WeakMap
73
+ * idempotency key — without it, double-bind detection falls back to
74
+ * the first trigger and breaks if items re-render. */
75
+ bind: (els: {
76
+ root?: HTMLElement;
77
+ triggers: Record<string, HTMLElement>;
78
+ panels: Record<string, HTMLElement>;
79
+ }) => () => void;
80
+ }
51
81
  declare function accordion(options: AccordionOptions): {
52
82
  items: () => Array<{
53
83
  id: string;
@@ -60,6 +90,7 @@ declare function accordion(options: AccordionOptions): {
60
90
  expandAll: () => void;
61
91
  collapseAll: () => void;
62
92
  isExpanded: (id: string) => boolean;
93
+ bind: AccordionAriaBinding["bind"];
63
94
  };
64
95
 
65
96
  /**
@@ -71,12 +102,22 @@ declare function popover(): {
71
102
  open: () => void;
72
103
  close: () => void;
73
104
  toggle: () => void;
105
+ /** WAI-ARIA non-modal dialog wiring: `role=dialog`, `aria-expanded` on
106
+ * trigger, Escape closes, click-outside closes. Returns dispose. */
107
+ bind: (els: {
108
+ trigger: HTMLElement;
109
+ popover: HTMLElement;
110
+ labelledBy?: HTMLElement;
111
+ }) => () => void;
74
112
  };
75
113
 
76
114
  interface SelectOptions<T> {
77
115
  items: T[];
78
116
  multiple?: boolean;
79
117
  itemToString?: (item: T) => string;
118
+ /** Optional predicate marking items as disabled — such items are skipped
119
+ * by `highlightNext`/`highlightPrev`/typeahead and rejected by `select`. */
120
+ isDisabled?: (item: T) => boolean;
80
121
  }
81
122
  declare function select<T>(options: SelectOptions<T>): {
82
123
  selectedItems: () => T[];
@@ -93,6 +134,14 @@ declare function select<T>(options: SelectOptions<T>): {
93
134
  highlightPrev: () => void;
94
135
  selectHighlighted: () => void;
95
136
  clear: () => void;
137
+ /** WAI-ARIA Listbox wiring: `role=listbox`, `aria-multiselectable`,
138
+ * `aria-selected`/`aria-activedescendant`, arrow + Home/End/Enter/Space
139
+ * + typeahead. Returns dispose. */
140
+ bind: (els: {
141
+ listbox: HTMLElement;
142
+ option: (item: T, index: number) => HTMLElement | null;
143
+ itemToString?: (item: T) => string;
144
+ }) => () => void;
96
145
  };
97
146
 
98
147
  /**
@@ -101,12 +150,19 @@ declare function select<T>(options: SelectOptions<T>): {
101
150
  */
102
151
  declare function tooltip(options?: {
103
152
  delay?: number;
153
+ hideDelay?: number;
104
154
  }): {
105
155
  isVisible: () => boolean;
106
156
  show: () => void;
107
157
  hide: () => void;
108
158
  content: () => string;
109
159
  setContent: (text: string) => void;
160
+ /** WAI-ARIA Tooltip pattern — wires `role=tooltip`, `aria-describedby`,
161
+ * Escape-to-dismiss, and pointer hover-grace per WCAG 1.4.13. */
162
+ bind: (els: {
163
+ trigger: HTMLElement;
164
+ tooltip: HTMLElement;
165
+ }) => () => void;
110
166
  };
111
167
 
112
168
  interface FileUploadOptions {
@@ -123,8 +179,37 @@ declare function fileUpload(options?: FileUploadOptions): {
123
179
  errors: () => string[];
124
180
  isDragOver: () => boolean;
125
181
  setDragOver: (v: boolean) => void;
182
+ /** Wires native file input + drop zone with proper labeling, hint
183
+ * description, and keyboard activation. Returns dispose. */
184
+ bind: (els: {
185
+ input: HTMLInputElement;
186
+ dropZone?: HTMLElement;
187
+ hint?: HTMLElement;
188
+ errorRegion?: HTMLElement;
189
+ }) => () => void;
126
190
  };
127
191
 
192
+ /**
193
+ * Options for `setContent`.
194
+ *
195
+ * WARNING: passing `sanitize: false` bypasses the built-in protection and
196
+ * requires the caller to guarantee the HTML has already been sanitized with
197
+ * a trusted library. Any untrusted input that reaches `setContent` with
198
+ * `sanitize: false` is an XSS vector.
199
+ */
200
+ interface SetContentOptions {
201
+ /** Raw HTML to assign. Sanitized by default (tags are stripped). */
202
+ html?: string;
203
+ /** Plain text. Always safe — assigned via `textContent`. */
204
+ text?: string;
205
+ /**
206
+ * When true (default), `html` is run through the framework's HTML
207
+ * stripper before assignment — tags are removed, only text content is
208
+ * preserved. Set to `false` ONLY when `html` has already been sanitized
209
+ * with a dedicated library (e.g. DOMPurify).
210
+ */
211
+ sanitize?: boolean;
212
+ }
128
213
  /**
129
214
  * contentEditable provides reactive binding for contenteditable elements.
130
215
  *
@@ -134,7 +219,18 @@ declare function fileUpload(options?: FileUploadOptions): {
134
219
  */
135
220
  declare function contentEditable(): {
136
221
  content: () => string;
137
- setContent: (html: string) => void;
222
+ /**
223
+ * Update the reactive content value.
224
+ *
225
+ * - `setContent("<b>x</b>")` — LEGACY: treated as `{ html, sanitize: true }`.
226
+ * The HTML is stripped to text by default to prevent XSS. Prefer the
227
+ * options form below.
228
+ * - `setContent({ text: "hello" })` — plain text, always safe.
229
+ * - `setContent({ html, sanitize: true })` — sanitized HTML (default).
230
+ * - `setContent({ html, sanitize: false })` — raw HTML; the caller MUST
231
+ * have pre-sanitized it with a trusted library (e.g. DOMPurify).
232
+ */
233
+ setContent: (input: string | SetContentOptions) => void;
138
234
  isFocused: () => boolean;
139
235
  setFocused: (v: boolean) => void;
140
236
  bold: () => void;
@@ -165,6 +261,12 @@ declare function datePicker(options?: DatePickerOptions): {
165
261
  }>;
166
262
  isDateDisabled: (date: Date) => boolean;
167
263
  isSelected: (date: Date) => boolean;
264
+ /** WAI-ARIA Date Picker dialog grid wiring: `role=grid`, arrow nav,
265
+ * PageUp/Down (month), Shift+PageUp/Down (year), Home/End. */
266
+ bind: (els: {
267
+ grid: HTMLElement;
268
+ cell: (date: Date) => HTMLElement | null;
269
+ }) => () => void;
168
270
  };
169
271
 
170
- export { type AccordionOptions, type ComboboxOptions, type DatePickerOptions, type FileUploadOptions, type SelectOptions, type TabsOptions, accordion, combobox, contentEditable, datePicker, fileUpload, popover, select, tabs, tooltip };
272
+ export { type AccordionAriaBinding, type AccordionOptions, type ComboboxOptions, type DatePickerOptions, type FileUploadOptions, type SelectOptions, type SetContentOptions, type TabsAriaBinding, type TabsOptions, accordion, combobox, contentEditable, datePicker, fileUpload, popover, select, tabs, tooltip };
package/dist/widgets.d.ts CHANGED
@@ -16,6 +16,14 @@ declare function combobox<T>(options: ComboboxOptions<T>): {
16
16
  isOpen: () => boolean;
17
17
  open: () => void;
18
18
  close: () => void;
19
+ /** WAI-ARIA Combobox 1.2 wiring: `role=combobox` on input,
20
+ * `aria-expanded`/`aria-controls`/`aria-activedescendant`, listbox option
21
+ * ids, Down/Up/Enter/Escape/Home/End. Returns dispose. */
22
+ bind: (els: {
23
+ input: HTMLInputElement;
24
+ listbox: HTMLElement;
25
+ option: (item: T, index: number) => HTMLElement | null;
26
+ }) => () => void;
19
27
  };
20
28
 
21
29
  interface TabsOptions {
@@ -26,6 +34,15 @@ interface TabsOptions {
26
34
  }>;
27
35
  defaultTab?: string;
28
36
  }
37
+ interface TabsAriaBinding {
38
+ /** WAI-ARIA Tabs pattern — wires `role`/`aria-*` and arrow/Home/End keys
39
+ * to the provided tablist + per-tab elements. Returns dispose. */
40
+ bind: (els: {
41
+ tablist: HTMLElement;
42
+ tabs: Record<string, HTMLElement>;
43
+ panels?: Record<string, HTMLElement>;
44
+ }) => () => void;
45
+ }
29
46
  declare function tabs(options: TabsOptions): {
30
47
  activeTab: () => string;
31
48
  setActiveTab: (id: string) => void;
@@ -38,6 +55,7 @@ declare function tabs(options: TabsOptions): {
38
55
  nextTab: () => void;
39
56
  prevTab: () => void;
40
57
  isActive: (id: string) => boolean;
58
+ bind: TabsAriaBinding["bind"];
41
59
  };
42
60
 
43
61
  interface AccordionOptions {
@@ -48,6 +66,18 @@ interface AccordionOptions {
48
66
  multiple?: boolean;
49
67
  defaultExpanded?: string[];
50
68
  }
69
+ interface AccordionAriaBinding {
70
+ /** WAI-ARIA Accordion pattern — wires `aria-expanded`/`aria-controls`,
71
+ * Enter/Space toggle, and panel `role=region`. Returns dispose.
72
+ * Pass `root` (any stable container element) to anchor the WeakMap
73
+ * idempotency key — without it, double-bind detection falls back to
74
+ * the first trigger and breaks if items re-render. */
75
+ bind: (els: {
76
+ root?: HTMLElement;
77
+ triggers: Record<string, HTMLElement>;
78
+ panels: Record<string, HTMLElement>;
79
+ }) => () => void;
80
+ }
51
81
  declare function accordion(options: AccordionOptions): {
52
82
  items: () => Array<{
53
83
  id: string;
@@ -60,6 +90,7 @@ declare function accordion(options: AccordionOptions): {
60
90
  expandAll: () => void;
61
91
  collapseAll: () => void;
62
92
  isExpanded: (id: string) => boolean;
93
+ bind: AccordionAriaBinding["bind"];
63
94
  };
64
95
 
65
96
  /**
@@ -71,12 +102,22 @@ declare function popover(): {
71
102
  open: () => void;
72
103
  close: () => void;
73
104
  toggle: () => void;
105
+ /** WAI-ARIA non-modal dialog wiring: `role=dialog`, `aria-expanded` on
106
+ * trigger, Escape closes, click-outside closes. Returns dispose. */
107
+ bind: (els: {
108
+ trigger: HTMLElement;
109
+ popover: HTMLElement;
110
+ labelledBy?: HTMLElement;
111
+ }) => () => void;
74
112
  };
75
113
 
76
114
  interface SelectOptions<T> {
77
115
  items: T[];
78
116
  multiple?: boolean;
79
117
  itemToString?: (item: T) => string;
118
+ /** Optional predicate marking items as disabled — such items are skipped
119
+ * by `highlightNext`/`highlightPrev`/typeahead and rejected by `select`. */
120
+ isDisabled?: (item: T) => boolean;
80
121
  }
81
122
  declare function select<T>(options: SelectOptions<T>): {
82
123
  selectedItems: () => T[];
@@ -93,6 +134,14 @@ declare function select<T>(options: SelectOptions<T>): {
93
134
  highlightPrev: () => void;
94
135
  selectHighlighted: () => void;
95
136
  clear: () => void;
137
+ /** WAI-ARIA Listbox wiring: `role=listbox`, `aria-multiselectable`,
138
+ * `aria-selected`/`aria-activedescendant`, arrow + Home/End/Enter/Space
139
+ * + typeahead. Returns dispose. */
140
+ bind: (els: {
141
+ listbox: HTMLElement;
142
+ option: (item: T, index: number) => HTMLElement | null;
143
+ itemToString?: (item: T) => string;
144
+ }) => () => void;
96
145
  };
97
146
 
98
147
  /**
@@ -101,12 +150,19 @@ declare function select<T>(options: SelectOptions<T>): {
101
150
  */
102
151
  declare function tooltip(options?: {
103
152
  delay?: number;
153
+ hideDelay?: number;
104
154
  }): {
105
155
  isVisible: () => boolean;
106
156
  show: () => void;
107
157
  hide: () => void;
108
158
  content: () => string;
109
159
  setContent: (text: string) => void;
160
+ /** WAI-ARIA Tooltip pattern — wires `role=tooltip`, `aria-describedby`,
161
+ * Escape-to-dismiss, and pointer hover-grace per WCAG 1.4.13. */
162
+ bind: (els: {
163
+ trigger: HTMLElement;
164
+ tooltip: HTMLElement;
165
+ }) => () => void;
110
166
  };
111
167
 
112
168
  interface FileUploadOptions {
@@ -123,8 +179,37 @@ declare function fileUpload(options?: FileUploadOptions): {
123
179
  errors: () => string[];
124
180
  isDragOver: () => boolean;
125
181
  setDragOver: (v: boolean) => void;
182
+ /** Wires native file input + drop zone with proper labeling, hint
183
+ * description, and keyboard activation. Returns dispose. */
184
+ bind: (els: {
185
+ input: HTMLInputElement;
186
+ dropZone?: HTMLElement;
187
+ hint?: HTMLElement;
188
+ errorRegion?: HTMLElement;
189
+ }) => () => void;
126
190
  };
127
191
 
192
+ /**
193
+ * Options for `setContent`.
194
+ *
195
+ * WARNING: passing `sanitize: false` bypasses the built-in protection and
196
+ * requires the caller to guarantee the HTML has already been sanitized with
197
+ * a trusted library. Any untrusted input that reaches `setContent` with
198
+ * `sanitize: false` is an XSS vector.
199
+ */
200
+ interface SetContentOptions {
201
+ /** Raw HTML to assign. Sanitized by default (tags are stripped). */
202
+ html?: string;
203
+ /** Plain text. Always safe — assigned via `textContent`. */
204
+ text?: string;
205
+ /**
206
+ * When true (default), `html` is run through the framework's HTML
207
+ * stripper before assignment — tags are removed, only text content is
208
+ * preserved. Set to `false` ONLY when `html` has already been sanitized
209
+ * with a dedicated library (e.g. DOMPurify).
210
+ */
211
+ sanitize?: boolean;
212
+ }
128
213
  /**
129
214
  * contentEditable provides reactive binding for contenteditable elements.
130
215
  *
@@ -134,7 +219,18 @@ declare function fileUpload(options?: FileUploadOptions): {
134
219
  */
135
220
  declare function contentEditable(): {
136
221
  content: () => string;
137
- setContent: (html: string) => void;
222
+ /**
223
+ * Update the reactive content value.
224
+ *
225
+ * - `setContent("<b>x</b>")` — LEGACY: treated as `{ html, sanitize: true }`.
226
+ * The HTML is stripped to text by default to prevent XSS. Prefer the
227
+ * options form below.
228
+ * - `setContent({ text: "hello" })` — plain text, always safe.
229
+ * - `setContent({ html, sanitize: true })` — sanitized HTML (default).
230
+ * - `setContent({ html, sanitize: false })` — raw HTML; the caller MUST
231
+ * have pre-sanitized it with a trusted library (e.g. DOMPurify).
232
+ */
233
+ setContent: (input: string | SetContentOptions) => void;
138
234
  isFocused: () => boolean;
139
235
  setFocused: (v: boolean) => void;
140
236
  bold: () => void;
@@ -165,6 +261,12 @@ declare function datePicker(options?: DatePickerOptions): {
165
261
  }>;
166
262
  isDateDisabled: (date: Date) => boolean;
167
263
  isSelected: (date: Date) => boolean;
264
+ /** WAI-ARIA Date Picker dialog grid wiring: `role=grid`, arrow nav,
265
+ * PageUp/Down (month), Shift+PageUp/Down (year), Home/End. */
266
+ bind: (els: {
267
+ grid: HTMLElement;
268
+ cell: (date: Date) => HTMLElement | null;
269
+ }) => () => void;
168
270
  };
169
271
 
170
- export { type AccordionOptions, type ComboboxOptions, type DatePickerOptions, type FileUploadOptions, type SelectOptions, type TabsOptions, accordion, combobox, contentEditable, datePicker, fileUpload, popover, select, tabs, tooltip };
272
+ export { type AccordionAriaBinding, type AccordionOptions, type ComboboxOptions, type DatePickerOptions, type FileUploadOptions, type SelectOptions, type SetContentOptions, type TabsAriaBinding, type TabsOptions, accordion, combobox, contentEditable, datePicker, fileUpload, popover, select, tabs, tooltip };
package/dist/widgets.js CHANGED
@@ -8,13 +8,15 @@ import {
8
8
  select,
9
9
  tabs,
10
10
  tooltip
11
- } from "./chunk-PDZQY43A.js";
12
- import "./chunk-GJPXRJ45.js";
13
- import "./chunk-XHK6BDAJ.js";
14
- import "./chunk-EUZND3CB.js";
15
- import "./chunk-NZIIMDWI.js";
16
- import "./chunk-K4G4ZQNR.js";
17
- import "./chunk-5X6PP2UK.js";
11
+ } from "./chunk-ON5MMR2J.js";
12
+ import "./chunk-45YP72ZQ.js";
13
+ import "./chunk-DRUZZAK4.js";
14
+ import "./chunk-UCS6AMJ7.js";
15
+ import "./chunk-WZA53FXU.js";
16
+ import "./chunk-2RA7SHDA.js";
17
+ import "./chunk-RDTDJCAB.js";
18
+ import "./chunk-QO3WC6FS.js";
19
+ import "./chunk-LMLD24FC.js";
18
20
  export {
19
21
  accordion,
20
22
  combobox,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sibujs",
3
- "version": "1.5.0",
3
+ "version": "2.1.0",
4
4
  "description": "A lightweight, function-based frontend framework that combines the best of React, Svelte, and Vue — with zero VDOM and maximum simplicity. Designed for developers who want fine-grained reactivity and full control without compilation or magic.",
5
5
  "keywords": [
6
6
  "frontend",
@@ -33,7 +33,7 @@
33
33
  "format": "biome format --write src/ tests/",
34
34
  "test": "vitest",
35
35
  "test:ui": "vitest --ui",
36
- "build": "tsup index.ts data.ts browser.ts patterns.ts motion.ts ui.ts widgets.ts ssr.ts devtools.ts performance.ts ecosystem.ts plugins.ts build.ts testing.ts extras.ts --dts --format esm,cjs --out-dir dist && tsup cdn.ts --format iife --globalName Sibu --out-dir dist --no-dts --minify",
36
+ "build": "tsup index.ts data.ts browser.ts patterns.ts motion.ts ui.ts widgets.ts ssr.ts devtools.ts performance.ts ecosystem.ts plugins.ts build.ts testing.ts extras.ts --dts --format esm,cjs --out-dir dist --clean && tsup cdn.ts --format iife --globalName Sibu --out-dir dist --no-dts --minify",
37
37
  "bench": "node bench.mjs",
38
38
  "bench:save": "node bench.mjs --save",
39
39
  "bench:check": "node bench.mjs --compare",
@@ -116,8 +116,14 @@
116
116
  "types": "./dist/extras.d.ts",
117
117
  "import": "./dist/extras.js",
118
118
  "require": "./dist/extras.cjs"
119
+ },
120
+ "./cdn": {
121
+ "default": "./dist/cdn.global.js"
119
122
  }
120
123
  },
124
+ "publishConfig": {
125
+ "access": "public"
126
+ },
121
127
  "browserslist": [
122
128
  "Chrome >= 80",
123
129
  "Firefox >= 78",