sygnal 5.4.0 → 6.0.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 (316) hide show
  1. package/CHANGELOG.md +646 -0
  2. package/README.md +24 -9
  3. package/dist/astro/client.cjs.js +16 -9
  4. package/dist/astro/client.cjs.js.map +1 -1
  5. package/dist/astro/client.mjs +16 -9
  6. package/dist/astro/client.mjs.map +1 -1
  7. package/dist/astro/index.cjs.js +362 -91
  8. package/dist/astro/index.cjs.js.map +1 -1
  9. package/dist/astro/index.mjs +362 -92
  10. package/dist/astro/index.mjs.map +1 -1
  11. package/dist/astro/server.cjs.js +3396 -165
  12. package/dist/astro/server.cjs.js.map +1 -1
  13. package/dist/astro/server.mjs +3396 -165
  14. package/dist/astro/server.mjs.map +1 -1
  15. package/dist/devtools.cjs.js +1431 -0
  16. package/dist/devtools.cjs.js.map +1 -0
  17. package/dist/devtools.esm.js +1419 -0
  18. package/dist/devtools.esm.js.map +1 -0
  19. package/dist/diagnostics.cjs.js +3032 -296
  20. package/dist/diagnostics.cjs.js.map +1 -1
  21. package/dist/diagnostics.esm.js +3032 -296
  22. package/dist/diagnostics.esm.js.map +1 -1
  23. package/dist/element.cjs.js +230 -0
  24. package/dist/element.cjs.js.map +1 -0
  25. package/dist/element.esm.js +228 -0
  26. package/dist/element.esm.js.map +1 -0
  27. package/dist/guide/accessibility.md +257 -0
  28. package/dist/guide/adapters.md +221 -0
  29. package/dist/guide/behaviors.md +312 -0
  30. package/dist/guide/browser-sources.md +203 -0
  31. package/dist/guide/drag-and-drop.md +342 -0
  32. package/dist/guide/element-commands.md +306 -0
  33. package/dist/guide/error-boundaries.md +169 -0
  34. package/dist/guide/forms-reference.md +381 -0
  35. package/dist/guide/forms.md +250 -0
  36. package/dist/guide/http.md +299 -0
  37. package/dist/guide/inputs.md +173 -0
  38. package/dist/guide/persistence.md +245 -0
  39. package/dist/guide/recipes/carousel.md +155 -0
  40. package/dist/guide/recipes/charts.md +177 -0
  41. package/dist/guide/recipes/code-editor.md +135 -0
  42. package/dist/guide/recipes/data-grid.md +155 -0
  43. package/dist/guide/recipes/data-table.md +196 -0
  44. package/dist/guide/recipes/i18n.md +222 -0
  45. package/dist/guide/recipes/icons.md +115 -0
  46. package/dist/guide/recipes/overview.md +33 -0
  47. package/dist/guide/recipes/rich-text.md +154 -0
  48. package/dist/guide/resources.md +471 -0
  49. package/dist/guide/ssr.md +255 -0
  50. package/dist/guide/timers.md +178 -0
  51. package/dist/guide/ui/accordion.md +93 -0
  52. package/dist/guide/ui/combobox.md +144 -0
  53. package/dist/guide/ui/dialog.md +124 -0
  54. package/dist/guide/ui/disclosure.md +60 -0
  55. package/dist/guide/ui/menu.md +125 -0
  56. package/dist/guide/ui/overview.md +166 -0
  57. package/dist/guide/ui/popover.md +101 -0
  58. package/dist/guide/ui/select.md +114 -0
  59. package/dist/guide/ui/tabs.md +161 -0
  60. package/dist/guide/ui/toaster.md +152 -0
  61. package/dist/guide/ui/tooltip.md +103 -0
  62. package/dist/guide/undo.md +178 -0
  63. package/dist/guide/virtual-collections.md +183 -0
  64. package/dist/guide/web-components.md +179 -0
  65. package/dist/guide/widgets.md +217 -0
  66. package/dist/index.cjs.js +13178 -5769
  67. package/dist/index.cjs.js.map +1 -1
  68. package/dist/index.d.ts +2908 -276
  69. package/dist/index.esm.js +13149 -5779
  70. package/dist/index.esm.js.map +1 -1
  71. package/dist/jsx-dev-runtime.cjs.js +26 -334
  72. package/dist/jsx-dev-runtime.cjs.js.map +1 -1
  73. package/dist/jsx-dev-runtime.esm.js +19 -327
  74. package/dist/jsx-dev-runtime.esm.js.map +1 -1
  75. package/dist/jsx-runtime.cjs.js +26 -334
  76. package/dist/jsx-runtime.cjs.js.map +1 -1
  77. package/dist/jsx-runtime.esm.js +19 -327
  78. package/dist/jsx-runtime.esm.js.map +1 -1
  79. package/dist/jsx.cjs.js +10 -314
  80. package/dist/jsx.cjs.js.map +1 -1
  81. package/dist/jsx.esm.js +8 -315
  82. package/dist/jsx.esm.js.map +1 -1
  83. package/dist/react.cjs.js +117 -0
  84. package/dist/react.cjs.js.map +1 -0
  85. package/dist/react.esm.js +115 -0
  86. package/dist/react.esm.js.map +1 -0
  87. package/dist/shims/globalthis.cjs +20 -0
  88. package/dist/sygnal.min.js +1 -1
  89. package/dist/sygnal.min.js.map +1 -1
  90. package/dist/ui-combobox.cjs.js +169 -0
  91. package/dist/ui-combobox.cjs.js.map +1 -0
  92. package/dist/ui-combobox.esm.js +148 -0
  93. package/dist/ui-combobox.esm.js.map +1 -0
  94. package/dist/ui-menu.cjs.js +87 -0
  95. package/dist/ui-menu.cjs.js.map +1 -0
  96. package/dist/ui-menu.esm.js +66 -0
  97. package/dist/ui-menu.esm.js.map +1 -0
  98. package/dist/ui-select.cjs.js +104 -0
  99. package/dist/ui-select.cjs.js.map +1 -0
  100. package/dist/ui-select.esm.js +83 -0
  101. package/dist/ui-select.esm.js.map +1 -0
  102. package/dist/ui.cjs.js +738 -0
  103. package/dist/ui.cjs.js.map +1 -0
  104. package/dist/ui.esm.js +727 -0
  105. package/dist/ui.esm.js.map +1 -0
  106. package/dist/vike/ClientOnly.cjs.js +4 -14
  107. package/dist/vike/ClientOnly.cjs.js.map +1 -1
  108. package/dist/vike/ClientOnly.mjs +4 -14
  109. package/dist/vike/ClientOnly.mjs.map +1 -1
  110. package/dist/vike/{+config.js → config/+config.js} +9 -1
  111. package/dist/vike/config/+config.js.map +1 -0
  112. package/dist/vike/config/package.json +6 -0
  113. package/dist/vike/onRenderClient.cjs.js +165 -95
  114. package/dist/vike/onRenderClient.cjs.js.map +1 -1
  115. package/dist/vike/onRenderClient.mjs +165 -95
  116. package/dist/vike/onRenderClient.mjs.map +1 -1
  117. package/dist/vike/onRenderHtml.cjs.js +59 -24
  118. package/dist/vike/onRenderHtml.cjs.js.map +1 -1
  119. package/dist/vike/onRenderHtml.mjs +60 -25
  120. package/dist/vike/onRenderHtml.mjs.map +1 -1
  121. package/dist/vite/plugin.cjs.js +323 -88
  122. package/dist/vite/plugin.cjs.js.map +1 -1
  123. package/dist/vite/plugin.mjs +323 -89
  124. package/dist/vite/plugin.mjs.map +1 -1
  125. package/dist/zag.cjs.js +408 -0
  126. package/dist/zag.cjs.js.map +1 -0
  127. package/dist/zag.esm.js +405 -0
  128. package/dist/zag.esm.js.map +1 -0
  129. package/llms.txt +166 -103
  130. package/package.json +98 -14
  131. package/src/astro/client.ts +27 -16
  132. package/src/astro/index.d.ts +24 -0
  133. package/src/astro/index.ts +69 -3
  134. package/src/astro/server.ts +8 -2
  135. package/src/collection.ts +6 -93
  136. package/src/core/actions.ts +134 -0
  137. package/src/core/cell.ts +202 -0
  138. package/src/core/debug.ts +23 -0
  139. package/src/core/define.ts +242 -0
  140. package/src/core/hooks.ts +314 -0
  141. package/src/core/hosts/collection.ts +325 -0
  142. package/src/core/hosts/switchable.ts +146 -0
  143. package/src/core/instance.ts +592 -0
  144. package/src/core/markers/clientonly.ts +13 -0
  145. package/src/core/markers/lazy.ts +40 -0
  146. package/src/core/markers/portal.ts +96 -0
  147. package/src/core/markers/suspense.ts +41 -0
  148. package/src/core/markers/transition.ts +70 -0
  149. package/src/core/registry.ts +25 -0
  150. package/src/core/runtime.ts +573 -0
  151. package/src/core/statics.ts +104 -0
  152. package/src/core/teardown.ts +60 -0
  153. package/src/core/view.ts +37 -0
  154. package/src/cycle/dom/DocumentDOMSource.ts +13 -8
  155. package/src/cycle/dom/ElementFinder.ts +7 -9
  156. package/src/cycle/dom/EventDelegator.ts +174 -223
  157. package/src/cycle/dom/IsolateModule.ts +65 -35
  158. package/src/cycle/dom/MainDOMSource.ts +9 -2
  159. package/src/cycle/dom/PriorityQueue.ts +4 -2
  160. package/src/cycle/dom/SymbolTree.ts +18 -47
  161. package/src/cycle/dom/classNameModule.ts +9 -7
  162. package/src/cycle/dom/controlledInputModule.ts +23 -6
  163. package/src/cycle/dom/enrichEventStream.ts +25 -47
  164. package/src/cycle/dom/fragment.ts +7 -0
  165. package/src/cycle/dom/isolate.ts +30 -27
  166. package/src/cycle/dom/makeDOMDriver.ts +115 -56
  167. package/src/cycle/dom/mockDOMSource.ts +21 -1
  168. package/src/cycle/dom/modules.ts +16 -3
  169. package/src/cycle/dom/propsModule.ts +65 -0
  170. package/src/cycle/dom/selectModule.ts +22 -17
  171. package/src/cycle/dom/snabbdom.ts +1 -6
  172. package/src/cycle/dom/thunk.ts +3 -0
  173. package/src/cycle/dom/utils.ts +98 -0
  174. package/src/cycle/dom/viewTransition.ts +43 -0
  175. package/src/cycle/state/StateSource.ts +19 -3
  176. package/src/cycle/state/objIsEqual.ts +50 -0
  177. package/src/cycle/state/types.ts +0 -10
  178. package/src/defineComponent.ts +34 -0
  179. package/src/devtools.d.ts +151 -0
  180. package/src/devtools.ts +34 -0
  181. package/src/element.d.ts +59 -0
  182. package/src/element.ts +235 -0
  183. package/src/extra/backoff.ts +9 -0
  184. package/src/extra/behaviors.ts +169 -0
  185. package/src/extra/browserSignals.ts +23 -0
  186. package/src/extra/browserSources.ts +326 -0
  187. package/src/extra/command.ts +3 -3
  188. package/src/extra/controls.ts +47 -0
  189. package/src/extra/copyAsTest.ts +286 -0
  190. package/src/extra/devtools.ts +101 -31
  191. package/src/extra/devtoolsActions.ts +379 -0
  192. package/src/extra/devtoolsHook.ts +9 -0
  193. package/src/extra/devtoolsNext.ts +83 -0
  194. package/src/extra/diagnostics/checks/actionLog.ts +108 -0
  195. package/src/extra/diagnostics/checks/behaviors.ts +49 -0
  196. package/src/extra/diagnostics/checks/browserSources.ts +96 -0
  197. package/src/extra/diagnostics/checks/collections.ts +1 -1
  198. package/src/extra/diagnostics/checks/controls.ts +148 -0
  199. package/src/extra/diagnostics/checks/dataset.ts +57 -0
  200. package/src/extra/diagnostics/checks/dom.ts +20 -11
  201. package/src/extra/diagnostics/checks/elementCommands.ts +175 -0
  202. package/src/extra/diagnostics/checks/events.ts +17 -2
  203. package/src/extra/diagnostics/checks/fetch.ts +135 -0
  204. package/src/extra/diagnostics/checks/forms.ts +163 -0
  205. package/src/extra/diagnostics/checks/index.ts +97 -4
  206. package/src/extra/diagnostics/checks/inspect.ts +140 -32
  207. package/src/extra/diagnostics/checks/next.ts +417 -0
  208. package/src/extra/diagnostics/checks/persist.ts +54 -0
  209. package/src/extra/diagnostics/checks/props.ts +10 -5
  210. package/src/extra/diagnostics/checks/public.d.ts +98 -7
  211. package/src/extra/diagnostics/checks/replies.ts +128 -0
  212. package/src/extra/diagnostics/checks/router.ts +100 -0
  213. package/src/extra/diagnostics/checks/rxjsHints.ts +1 -1
  214. package/src/extra/diagnostics/checks/shared.ts +86 -2
  215. package/src/extra/diagnostics/checks/shorthand.ts +115 -0
  216. package/src/extra/diagnostics/checks/sortable.ts +129 -0
  217. package/src/extra/diagnostics/checks/state.ts +100 -7
  218. package/src/extra/diagnostics/checks/statics.ts +48 -0
  219. package/src/extra/diagnostics/checks/strict.ts +10 -67
  220. package/src/extra/diagnostics/checks/timers.ts +80 -0
  221. package/src/extra/diagnostics/checks/viewTransitions.ts +47 -0
  222. package/src/extra/diagnostics/checks/virtual.ts +73 -0
  223. package/src/extra/diagnostics/checks/widgets.ts +109 -0
  224. package/src/extra/diagnostics/checks/wiring.ts +66 -10
  225. package/src/extra/diagnostics/codes.ts +268 -23
  226. package/src/extra/diagnostics/index.ts +34 -9
  227. package/src/extra/diagnostics/legacy.ts +17 -0
  228. package/src/extra/driverFactories.ts +83 -19
  229. package/src/extra/elementCommands.ts +53 -0
  230. package/src/extra/fetchDriver.ts +519 -0
  231. package/src/extra/focusWithin.ts +27 -0
  232. package/src/extra/form.ts +268 -0
  233. package/src/extra/formHelpers.ts +139 -0
  234. package/src/extra/head.ts +106 -0
  235. package/src/extra/hmr.ts +2 -3
  236. package/src/extra/owned.ts +24 -0
  237. package/src/extra/pager.ts +50 -0
  238. package/src/extra/persist.ts +133 -0
  239. package/src/extra/pwa.ts +1 -1
  240. package/src/extra/queryCache.ts +107 -0
  241. package/src/extra/reducers.ts +1 -1
  242. package/src/extra/reduxDevtools.ts +92 -0
  243. package/src/extra/replies.ts +54 -0
  244. package/src/extra/router.ts +323 -0
  245. package/src/extra/run.ts +90 -217
  246. package/src/extra/selection.ts +76 -0
  247. package/src/extra/socketDriver.ts +265 -0
  248. package/src/extra/sortable.ts +377 -0
  249. package/src/extra/ssr.ts +427 -160
  250. package/src/extra/standardSchema.ts +27 -0
  251. package/src/extra/testing.ts +2433 -175
  252. package/src/extra/timers.ts +95 -0
  253. package/src/extra/undo.ts +261 -0
  254. package/src/extra/viewTransitions.ts +38 -0
  255. package/src/extra/virtual.ts +513 -0
  256. package/src/extra/widget.ts +201 -0
  257. package/src/index.d.ts +2631 -117
  258. package/src/index.ts +25 -4
  259. package/src/jsx-runtime.ts +15 -1
  260. package/src/jsx.ts +2 -1
  261. package/src/lazy.ts +50 -7
  262. package/src/portal.ts +3 -1
  263. package/src/pragma/index.ts +256 -133
  264. package/src/react-peers.d.ts +5 -0
  265. package/src/react.d.ts +43 -0
  266. package/src/react.ts +110 -0
  267. package/src/shared.ts +48 -0
  268. package/src/slot.ts +1 -1
  269. package/src/suspense.ts +3 -1
  270. package/src/switchable.ts +6 -121
  271. package/src/transition.ts +3 -1
  272. package/src/ui/accordion.ts +64 -0
  273. package/src/ui/dialog.ts +129 -0
  274. package/src/ui/disclosure.ts +35 -0
  275. package/src/ui/popover.ts +45 -0
  276. package/src/ui/shared.ts +94 -0
  277. package/src/ui/tabs.ts +82 -0
  278. package/src/ui/toaster.ts +198 -0
  279. package/src/ui/tooltip.ts +70 -0
  280. package/src/ui/zag/combobox.ts +115 -0
  281. package/src/ui/zag/menu.ts +40 -0
  282. package/src/ui/zag/select.ts +54 -0
  283. package/src/ui/zag/shared.ts +43 -0
  284. package/src/ui-combobox.d.ts +20 -0
  285. package/src/ui-combobox.ts +6 -0
  286. package/src/ui-menu.d.ts +30 -0
  287. package/src/ui-menu.ts +6 -0
  288. package/src/ui-select.d.ts +17 -0
  289. package/src/ui-select.ts +6 -0
  290. package/src/ui-zag-types.d.ts +42 -0
  291. package/src/ui.d.ts +208 -0
  292. package/src/ui.ts +15 -0
  293. package/src/vike/+config.ts +9 -1
  294. package/src/vike/ClientOnly.ts +1 -1
  295. package/src/vike/onRenderClient.ts +144 -96
  296. package/src/vike/onRenderHtml.ts +69 -26
  297. package/src/vike/types.ts +7 -1
  298. package/src/vite/globalthis-shim.ts +18 -0
  299. package/src/vite/globalthis.ts +56 -0
  300. package/src/vite/plugin.d.ts +22 -3
  301. package/src/vite/plugin.ts +222 -24
  302. package/src/zag.d.ts +64 -0
  303. package/src/zag.ts +238 -0
  304. package/dist/vike/+config.cjs.js +0 -66
  305. package/dist/vike/+config.cjs.js.map +0 -1
  306. package/dist/vike/+config.js.map +0 -1
  307. package/src/component.ts +0 -2301
  308. package/src/cycle/isolate/index.ts +0 -196
  309. package/src/cycle/run/index.ts +0 -151
  310. package/src/cycle/run/internals.ts +0 -143
  311. package/src/cycle/state/Collection.ts +0 -184
  312. package/src/cycle/state/index.ts +0 -5
  313. package/src/cycle/state/pickCombine.ts +0 -201
  314. package/src/cycle/state/pickMerge.ts +0 -122
  315. package/src/cycle/state/withState.ts +0 -47
  316. package/src/pragma/fn.ts +0 -55
@@ -0,0 +1,104 @@
1
+ 'use strict';
2
+
3
+ var select = require('@zag-js/select');
4
+ var zag = require('sygnal/zag');
5
+ var sygnal = require('sygnal');
6
+
7
+ function _interopNamespaceDefault(e) {
8
+ var n = Object.create(null);
9
+ if (e) {
10
+ Object.keys(e).forEach(function (k) {
11
+ if (k !== 'default') {
12
+ var d = Object.getOwnPropertyDescriptor(e, k);
13
+ Object.defineProperty(n, k, d.get ? d : {
14
+ enumerable: true,
15
+ get: function () { return e[k]; }
16
+ });
17
+ }
18
+ });
19
+ }
20
+ n.default = e;
21
+ return Object.freeze(n);
22
+ }
23
+
24
+ var select__namespace = /*#__PURE__*/_interopNamespaceDefault(select);
25
+
26
+ /*
27
+ * PLAN-5 2-Z: helpers the Zag-based parts (Menu, Select, Combobox) share. '../../zag' becomes the
28
+ * external 'sygnal/zag' and '../../index' the external 'sygnal' in the 'sygnal/ui/menu', 'sygnal/ui/select' and 'sygnal/ui/combobox' builds.
29
+ */
30
+ /** G-413: the naming props a part applies to its control (not the host) */
31
+ const NAMING = ['aria-label', 'aria-labelledby', 'aria-describedby'];
32
+ /**
33
+ * A control's (or listbox's) Zag props named from the part's props: without a label element, no
34
+ * aria-labelledby to it; the props' aria-label / aria-labelledby (/ aria-describedby) win
35
+ */
36
+ const named = (bag, p, describe) => {
37
+ const a = bag.attrs;
38
+ if (p.label == null)
39
+ delete a['aria-labelledby'];
40
+ for (const k of NAMING)
41
+ if (p[k] != null && (describe || k != 'aria-describedby'))
42
+ a[k] = p[k];
43
+ if (p['aria-labelledby'] != null)
44
+ delete a['aria-label'];
45
+ return bag;
46
+ };
47
+ /** An item as the parts take it: a string, or { value, label?, disabled? } (Menu also { separator: true }) */
48
+ const norm = (items) => (items || []).map((i) => (i && typeof i == 'object'
49
+ ? { ...i, value: String(i.value ?? ''), label: i.label ?? String(i.value ?? '') }
50
+ : { value: String(i), label: String(i) }));
51
+ /** A Select / Combobox value prop as Zag's string[] (undefined: uncontrolled; null or '': none) */
52
+ const arr = (v) => v === undefined ? undefined : v == null || v === '' ? [] : Array.isArray(v) ? v.map(String) : [String(v)];
53
+ /** The listbox collection options for Zag's collection() */
54
+ const collectionOf = (z, items) => z.collection({ items, itemToValue: (i) => i.value, itemToString: (i) => i.label, isItemDisabled: (i) => !!i.disabled });
55
+ /** value-change's detail: the value (single) or the values (multiple) */
56
+ const valueOut = (d, x) => (x.multiple ? d.value : d.value[0] ?? null);
57
+ /** Item rows of a listbox (Select, Combobox): text + a ✓ indicator Zag hides when unselected */
58
+ const options = (h, api) => api.collection.items.map((item) => h('div', { key: item.value, ...api.getItemProps({ item }) }, h('span', api.getItemTextProps({ item }), item.label), h('span', api.getItemIndicatorProps({ item }), '✓')));
59
+
60
+ /*
61
+ * PLAN-5 2-Z (U-1): Select, a Zag select machine (WAI-ARIA select-only combobox + listbox) as a
62
+ * widget tag.
63
+ *
64
+ * <Select className="size" label="Size" items={['S', 'M', 'L']} value={state.size} placeholder="Pick a size" name="size" />
65
+ * intent: SIZE: DOM.select('.size').events('value-change').detail() // 'M' (multiple: ['M', 'L'])
66
+ *
67
+ * Renders a label, a trigger button (role="combobox", named by the label) showing the selected
68
+ * label or the placeholder, the listbox (items role="option", aria-selected, a ✓ indicator Zag
69
+ * hides when unselected) in a positioner, and a hidden native <select> for forms (`name`).
70
+ * Keyboard and typeahead are Zag's. Styling hooks: `data-scope="select"` + `data-part` (root,
71
+ * label, control, trigger, value-text, indicator, positioner, content, item, item-text,
72
+ * item-indicator), `data-state`, `data-highlighted`, `data-placeholder-shown`.
73
+ *
74
+ * Props: `label`, `items` (strings or { value, label?, disabled? }), `value` (controlled: a
75
+ * string, or an array when `multiple`; null for none), `defaultValue`, `placeholder`, and Zag's
76
+ * select props (`multiple`, `name`, `form`, `disabled`, `required`, `readOnly`, `invalid`,
77
+ * `deselectable`, `closeOnSelect`, `loopFocus`, `positioning`, `open`, `id`). Events:
78
+ * `value-change` (the value, or the values when multiple), `open-change` (boolean).
79
+ * Commands: `open`, `close`, `clear`, `focus` (the trigger).
80
+ */
81
+ const Select = /*#__PURE__*/ zag.fromZag(select__namespace, (api, p, x) => {
82
+ const hidden = api.getHiddenSelectProps(), v = api.value;
83
+ // multiple: the options' selected props carry the value (a select's value prop is one string)
84
+ if (x.multiple)
85
+ delete hidden.props.value;
86
+ if (p.label == null)
87
+ delete hidden.attrs['aria-labelledby'];
88
+ return sygnal.createElement('div', api.getRootProps(), p.label != null && sygnal.createElement('label', api.getLabelProps(), p.label), sygnal.createElement('div', api.getControlProps(), sygnal.createElement('button', named(api.getTriggerProps(), p, 1), sygnal.createElement('span', api.getValueTextProps(), api.valueAsString || p.placeholder || ''), sygnal.createElement('span', api.getIndicatorProps(), '▾'))), sygnal.createElement('div', api.getPositionerProps(), sygnal.createElement('div', named(api.getContentProps(), p), options(sygnal.createElement, api))), sygnal.createElement('select', hidden, sygnal.createElement('option', { value: '' }), x.items.map((i) => sygnal.createElement('option', { key: i.value, value: i.value, selected: v.includes(i.value) }, i.label))));
89
+ }, {
90
+ name: 'Select',
91
+ $own: 1,
92
+ ownProps: [...NAMING, 'name'],
93
+ props: ({ items, label, placeholder, value, defaultValue, 'aria-label': _l, 'aria-labelledby': _b, 'aria-describedby': _d, ...p }, x) => {
94
+ x.items = norm(items);
95
+ x.multiple = !!p.multiple;
96
+ return { ...p, collection: collectionOf(select__namespace, x.items), value: arr(value), defaultValue: arr(defaultValue) };
97
+ },
98
+ events: { 'value-change': ['onValueChange', valueOut], 'open-change': ['onOpenChange', (d) => d.open] },
99
+ commands: { open: (api) => api.setOpen(true), close: (api) => api.setOpen(false), clear: (api) => api.clearValue(), focus: (api) => api.focus() },
100
+ fallback: (p, hh) => hh('div', null, p.label != null && hh('label', null, p.label), hh('button', { type: 'button', disabled: true }, p.placeholder || '')),
101
+ });
102
+
103
+ exports.Select = Select;
104
+ //# sourceMappingURL=ui-select.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui-select.cjs.js","sources":["../src/ui/zag/shared.ts","../src/ui/zag/select.ts"],"sourcesContent":["/*\n * PLAN-5 2-Z: helpers the Zag-based parts (Menu, Select, Combobox) share. '../../zag' becomes the\n * external 'sygnal/zag' and '../../index' the external 'sygnal' in the 'sygnal/ui/menu', 'sygnal/ui/select' and 'sygnal/ui/combobox' builds.\n */\n\n/** G-413: the naming props a part applies to its control (not the host) */\nexport const NAMING = ['aria-label', 'aria-labelledby', 'aria-describedby']\n\n/**\n * A control's (or listbox's) Zag props named from the part's props: without a label element, no\n * aria-labelledby to it; the props' aria-label / aria-labelledby (/ aria-describedby) win\n */\nexport const named = (bag: any, p: any, describe?: any) => {\n const a = bag.attrs\n if (p.label == null) delete a['aria-labelledby']\n for (const k of NAMING) if (p[k] != null && (describe || k != 'aria-describedby')) a[k] = p[k]\n if (p['aria-labelledby'] != null) delete a['aria-label']\n return bag\n}\n\n/** An item as the parts take it: a string, or { value, label?, disabled? } (Menu also { separator: true }) */\nexport const norm = (items: any): any[] =>\n (items || []).map((i: any) => (i && typeof i == 'object'\n ? {...i, value: String(i.value ?? ''), label: i.label ?? String(i.value ?? '')}\n : {value: String(i), label: String(i)}))\n\n/** A Select / Combobox value prop as Zag's string[] (undefined: uncontrolled; null or '': none) */\nexport const arr = (v: any): any =>\n v === undefined ? undefined : v == null || v === '' ? [] : Array.isArray(v) ? v.map(String) : [String(v)]\n\n/** The listbox collection options for Zag's collection() */\nexport const collectionOf = (z: any, items: any[]) =>\n z.collection({items, itemToValue: (i: any) => i.value, itemToString: (i: any) => i.label, isItemDisabled: (i: any) => !!i.disabled})\n\n/** value-change's detail: the value (single) or the values (multiple) */\nexport const valueOut = (d: any, x: any) => (x.multiple ? d.value : d.value[0] ?? null)\n\n/** Item rows of a listbox (Select, Combobox): text + a ✓ indicator Zag hides when unselected */\nexport const options = (h: any, api: any) =>\n api.collection.items.map((item: any) =>\n h('div', {key: item.value, ...api.getItemProps({item})},\n h('span', api.getItemTextProps({item}), item.label),\n h('span', api.getItemIndicatorProps({item}), '✓')))\n","/*\n * PLAN-5 2-Z (U-1): Select, a Zag select machine (WAI-ARIA select-only combobox + listbox) as a\n * widget tag.\n *\n * <Select className=\"size\" label=\"Size\" items={['S', 'M', 'L']} value={state.size} placeholder=\"Pick a size\" name=\"size\" />\n * intent: SIZE: DOM.select('.size').events('value-change').detail() // 'M' (multiple: ['M', 'L'])\n *\n * Renders a label, a trigger button (role=\"combobox\", named by the label) showing the selected\n * label or the placeholder, the listbox (items role=\"option\", aria-selected, a ✓ indicator Zag\n * hides when unselected) in a positioner, and a hidden native <select> for forms (`name`).\n * Keyboard and typeahead are Zag's. Styling hooks: `data-scope=\"select\"` + `data-part` (root,\n * label, control, trigger, value-text, indicator, positioner, content, item, item-text,\n * item-indicator), `data-state`, `data-highlighted`, `data-placeholder-shown`.\n *\n * Props: `label`, `items` (strings or { value, label?, disabled? }), `value` (controlled: a\n * string, or an array when `multiple`; null for none), `defaultValue`, `placeholder`, and Zag's\n * select props (`multiple`, `name`, `form`, `disabled`, `required`, `readOnly`, `invalid`,\n * `deselectable`, `closeOnSelect`, `loopFocus`, `positioning`, `open`, `id`). Events:\n * `value-change` (the value, or the values when multiple), `open-change` (boolean).\n * Commands: `open`, `close`, `clear`, `focus` (the trigger).\n */\nimport * as select from '@zag-js/select'\nimport {fromZag} from '../../zag'\nimport {createElement as h} from '../../index'\nimport {NAMING, arr, collectionOf, named, norm, options, valueOut} from './shared'\n\nexport const Select: any = /*#__PURE__*/ fromZag(select, (api: any, p: any, x: any) => {\n const hidden = api.getHiddenSelectProps(), v = api.value\n // multiple: the options' selected props carry the value (a select's value prop is one string)\n if (x.multiple) delete hidden.props.value\n if (p.label == null) delete hidden.attrs['aria-labelledby']\n return h('div', api.getRootProps(),\n p.label != null && h('label', api.getLabelProps(), p.label),\n h('div', api.getControlProps(),\n h('button', named(api.getTriggerProps(), p, 1),\n h('span', api.getValueTextProps(), api.valueAsString || p.placeholder || ''),\n h('span', api.getIndicatorProps(), '▾'))),\n h('div', api.getPositionerProps(), h('div', named(api.getContentProps(), p), options(h, api))),\n h('select', hidden,\n h('option', {value: ''}),\n x.items.map((i: any) => h('option', {key: i.value, value: i.value, selected: v.includes(i.value)}, i.label))))\n}, {\n name: 'Select',\n $own: 1,\n ownProps: [...NAMING, 'name'],\n props: ({items, label, placeholder, value, defaultValue, 'aria-label': _l, 'aria-labelledby': _b, 'aria-describedby': _d, ...p}: any, x: any) => {\n x.items = norm(items)\n x.multiple = !!p.multiple\n return {...p, collection: collectionOf(select, x.items), value: arr(value), defaultValue: arr(defaultValue)}\n },\n events: {'value-change': ['onValueChange', valueOut], 'open-change': ['onOpenChange', (d: any) => d.open]},\n commands: {open: (api: any) => api.setOpen(true), close: (api: any) => api.setOpen(false), clear: (api: any) => api.clearValue(), focus: (api: any) => api.focus()},\n fallback: (p: any, hh: any) => hh('div', null, p.label != null && hh('label', null, p.label), hh('button', {type: 'button', disabled: true}, p.placeholder || '')),\n})\n"],"names":["fromZag","select","h"],"mappings":"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"}
@@ -0,0 +1,83 @@
1
+ import * as select from '@zag-js/select';
2
+ import { fromZag } from 'sygnal/zag';
3
+ import { createElement } from 'sygnal';
4
+
5
+ /*
6
+ * PLAN-5 2-Z: helpers the Zag-based parts (Menu, Select, Combobox) share. '../../zag' becomes the
7
+ * external 'sygnal/zag' and '../../index' the external 'sygnal' in the 'sygnal/ui/menu', 'sygnal/ui/select' and 'sygnal/ui/combobox' builds.
8
+ */
9
+ /** G-413: the naming props a part applies to its control (not the host) */
10
+ const NAMING = ['aria-label', 'aria-labelledby', 'aria-describedby'];
11
+ /**
12
+ * A control's (or listbox's) Zag props named from the part's props: without a label element, no
13
+ * aria-labelledby to it; the props' aria-label / aria-labelledby (/ aria-describedby) win
14
+ */
15
+ const named = (bag, p, describe) => {
16
+ const a = bag.attrs;
17
+ if (p.label == null)
18
+ delete a['aria-labelledby'];
19
+ for (const k of NAMING)
20
+ if (p[k] != null && (describe || k != 'aria-describedby'))
21
+ a[k] = p[k];
22
+ if (p['aria-labelledby'] != null)
23
+ delete a['aria-label'];
24
+ return bag;
25
+ };
26
+ /** An item as the parts take it: a string, or { value, label?, disabled? } (Menu also { separator: true }) */
27
+ const norm = (items) => (items || []).map((i) => (i && typeof i == 'object'
28
+ ? { ...i, value: String(i.value ?? ''), label: i.label ?? String(i.value ?? '') }
29
+ : { value: String(i), label: String(i) }));
30
+ /** A Select / Combobox value prop as Zag's string[] (undefined: uncontrolled; null or '': none) */
31
+ const arr = (v) => v === undefined ? undefined : v == null || v === '' ? [] : Array.isArray(v) ? v.map(String) : [String(v)];
32
+ /** The listbox collection options for Zag's collection() */
33
+ const collectionOf = (z, items) => z.collection({ items, itemToValue: (i) => i.value, itemToString: (i) => i.label, isItemDisabled: (i) => !!i.disabled });
34
+ /** value-change's detail: the value (single) or the values (multiple) */
35
+ const valueOut = (d, x) => (x.multiple ? d.value : d.value[0] ?? null);
36
+ /** Item rows of a listbox (Select, Combobox): text + a ✓ indicator Zag hides when unselected */
37
+ const options = (h, api) => api.collection.items.map((item) => h('div', { key: item.value, ...api.getItemProps({ item }) }, h('span', api.getItemTextProps({ item }), item.label), h('span', api.getItemIndicatorProps({ item }), '✓')));
38
+
39
+ /*
40
+ * PLAN-5 2-Z (U-1): Select, a Zag select machine (WAI-ARIA select-only combobox + listbox) as a
41
+ * widget tag.
42
+ *
43
+ * <Select className="size" label="Size" items={['S', 'M', 'L']} value={state.size} placeholder="Pick a size" name="size" />
44
+ * intent: SIZE: DOM.select('.size').events('value-change').detail() // 'M' (multiple: ['M', 'L'])
45
+ *
46
+ * Renders a label, a trigger button (role="combobox", named by the label) showing the selected
47
+ * label or the placeholder, the listbox (items role="option", aria-selected, a ✓ indicator Zag
48
+ * hides when unselected) in a positioner, and a hidden native <select> for forms (`name`).
49
+ * Keyboard and typeahead are Zag's. Styling hooks: `data-scope="select"` + `data-part` (root,
50
+ * label, control, trigger, value-text, indicator, positioner, content, item, item-text,
51
+ * item-indicator), `data-state`, `data-highlighted`, `data-placeholder-shown`.
52
+ *
53
+ * Props: `label`, `items` (strings or { value, label?, disabled? }), `value` (controlled: a
54
+ * string, or an array when `multiple`; null for none), `defaultValue`, `placeholder`, and Zag's
55
+ * select props (`multiple`, `name`, `form`, `disabled`, `required`, `readOnly`, `invalid`,
56
+ * `deselectable`, `closeOnSelect`, `loopFocus`, `positioning`, `open`, `id`). Events:
57
+ * `value-change` (the value, or the values when multiple), `open-change` (boolean).
58
+ * Commands: `open`, `close`, `clear`, `focus` (the trigger).
59
+ */
60
+ const Select = /*#__PURE__*/ fromZag(select, (api, p, x) => {
61
+ const hidden = api.getHiddenSelectProps(), v = api.value;
62
+ // multiple: the options' selected props carry the value (a select's value prop is one string)
63
+ if (x.multiple)
64
+ delete hidden.props.value;
65
+ if (p.label == null)
66
+ delete hidden.attrs['aria-labelledby'];
67
+ return createElement('div', api.getRootProps(), p.label != null && createElement('label', api.getLabelProps(), p.label), createElement('div', api.getControlProps(), createElement('button', named(api.getTriggerProps(), p, 1), createElement('span', api.getValueTextProps(), api.valueAsString || p.placeholder || ''), createElement('span', api.getIndicatorProps(), '▾'))), createElement('div', api.getPositionerProps(), createElement('div', named(api.getContentProps(), p), options(createElement, api))), createElement('select', hidden, createElement('option', { value: '' }), x.items.map((i) => createElement('option', { key: i.value, value: i.value, selected: v.includes(i.value) }, i.label))));
68
+ }, {
69
+ name: 'Select',
70
+ $own: 1,
71
+ ownProps: [...NAMING, 'name'],
72
+ props: ({ items, label, placeholder, value, defaultValue, 'aria-label': _l, 'aria-labelledby': _b, 'aria-describedby': _d, ...p }, x) => {
73
+ x.items = norm(items);
74
+ x.multiple = !!p.multiple;
75
+ return { ...p, collection: collectionOf(select, x.items), value: arr(value), defaultValue: arr(defaultValue) };
76
+ },
77
+ events: { 'value-change': ['onValueChange', valueOut], 'open-change': ['onOpenChange', (d) => d.open] },
78
+ commands: { open: (api) => api.setOpen(true), close: (api) => api.setOpen(false), clear: (api) => api.clearValue(), focus: (api) => api.focus() },
79
+ fallback: (p, hh) => hh('div', null, p.label != null && hh('label', null, p.label), hh('button', { type: 'button', disabled: true }, p.placeholder || '')),
80
+ });
81
+
82
+ export { Select };
83
+ //# sourceMappingURL=ui-select.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui-select.esm.js","sources":["../src/ui/zag/shared.ts","../src/ui/zag/select.ts"],"sourcesContent":["/*\n * PLAN-5 2-Z: helpers the Zag-based parts (Menu, Select, Combobox) share. '../../zag' becomes the\n * external 'sygnal/zag' and '../../index' the external 'sygnal' in the 'sygnal/ui/menu', 'sygnal/ui/select' and 'sygnal/ui/combobox' builds.\n */\n\n/** G-413: the naming props a part applies to its control (not the host) */\nexport const NAMING = ['aria-label', 'aria-labelledby', 'aria-describedby']\n\n/**\n * A control's (or listbox's) Zag props named from the part's props: without a label element, no\n * aria-labelledby to it; the props' aria-label / aria-labelledby (/ aria-describedby) win\n */\nexport const named = (bag: any, p: any, describe?: any) => {\n const a = bag.attrs\n if (p.label == null) delete a['aria-labelledby']\n for (const k of NAMING) if (p[k] != null && (describe || k != 'aria-describedby')) a[k] = p[k]\n if (p['aria-labelledby'] != null) delete a['aria-label']\n return bag\n}\n\n/** An item as the parts take it: a string, or { value, label?, disabled? } (Menu also { separator: true }) */\nexport const norm = (items: any): any[] =>\n (items || []).map((i: any) => (i && typeof i == 'object'\n ? {...i, value: String(i.value ?? ''), label: i.label ?? String(i.value ?? '')}\n : {value: String(i), label: String(i)}))\n\n/** A Select / Combobox value prop as Zag's string[] (undefined: uncontrolled; null or '': none) */\nexport const arr = (v: any): any =>\n v === undefined ? undefined : v == null || v === '' ? [] : Array.isArray(v) ? v.map(String) : [String(v)]\n\n/** The listbox collection options for Zag's collection() */\nexport const collectionOf = (z: any, items: any[]) =>\n z.collection({items, itemToValue: (i: any) => i.value, itemToString: (i: any) => i.label, isItemDisabled: (i: any) => !!i.disabled})\n\n/** value-change's detail: the value (single) or the values (multiple) */\nexport const valueOut = (d: any, x: any) => (x.multiple ? d.value : d.value[0] ?? null)\n\n/** Item rows of a listbox (Select, Combobox): text + a ✓ indicator Zag hides when unselected */\nexport const options = (h: any, api: any) =>\n api.collection.items.map((item: any) =>\n h('div', {key: item.value, ...api.getItemProps({item})},\n h('span', api.getItemTextProps({item}), item.label),\n h('span', api.getItemIndicatorProps({item}), '✓')))\n","/*\n * PLAN-5 2-Z (U-1): Select, a Zag select machine (WAI-ARIA select-only combobox + listbox) as a\n * widget tag.\n *\n * <Select className=\"size\" label=\"Size\" items={['S', 'M', 'L']} value={state.size} placeholder=\"Pick a size\" name=\"size\" />\n * intent: SIZE: DOM.select('.size').events('value-change').detail() // 'M' (multiple: ['M', 'L'])\n *\n * Renders a label, a trigger button (role=\"combobox\", named by the label) showing the selected\n * label or the placeholder, the listbox (items role=\"option\", aria-selected, a ✓ indicator Zag\n * hides when unselected) in a positioner, and a hidden native <select> for forms (`name`).\n * Keyboard and typeahead are Zag's. Styling hooks: `data-scope=\"select\"` + `data-part` (root,\n * label, control, trigger, value-text, indicator, positioner, content, item, item-text,\n * item-indicator), `data-state`, `data-highlighted`, `data-placeholder-shown`.\n *\n * Props: `label`, `items` (strings or { value, label?, disabled? }), `value` (controlled: a\n * string, or an array when `multiple`; null for none), `defaultValue`, `placeholder`, and Zag's\n * select props (`multiple`, `name`, `form`, `disabled`, `required`, `readOnly`, `invalid`,\n * `deselectable`, `closeOnSelect`, `loopFocus`, `positioning`, `open`, `id`). Events:\n * `value-change` (the value, or the values when multiple), `open-change` (boolean).\n * Commands: `open`, `close`, `clear`, `focus` (the trigger).\n */\nimport * as select from '@zag-js/select'\nimport {fromZag} from '../../zag'\nimport {createElement as h} from '../../index'\nimport {NAMING, arr, collectionOf, named, norm, options, valueOut} from './shared'\n\nexport const Select: any = /*#__PURE__*/ fromZag(select, (api: any, p: any, x: any) => {\n const hidden = api.getHiddenSelectProps(), v = api.value\n // multiple: the options' selected props carry the value (a select's value prop is one string)\n if (x.multiple) delete hidden.props.value\n if (p.label == null) delete hidden.attrs['aria-labelledby']\n return h('div', api.getRootProps(),\n p.label != null && h('label', api.getLabelProps(), p.label),\n h('div', api.getControlProps(),\n h('button', named(api.getTriggerProps(), p, 1),\n h('span', api.getValueTextProps(), api.valueAsString || p.placeholder || ''),\n h('span', api.getIndicatorProps(), '▾'))),\n h('div', api.getPositionerProps(), h('div', named(api.getContentProps(), p), options(h, api))),\n h('select', hidden,\n h('option', {value: ''}),\n x.items.map((i: any) => h('option', {key: i.value, value: i.value, selected: v.includes(i.value)}, i.label))))\n}, {\n name: 'Select',\n $own: 1,\n ownProps: [...NAMING, 'name'],\n props: ({items, label, placeholder, value, defaultValue, 'aria-label': _l, 'aria-labelledby': _b, 'aria-describedby': _d, ...p}: any, x: any) => {\n x.items = norm(items)\n x.multiple = !!p.multiple\n return {...p, collection: collectionOf(select, x.items), value: arr(value), defaultValue: arr(defaultValue)}\n },\n events: {'value-change': ['onValueChange', valueOut], 'open-change': ['onOpenChange', (d: any) => d.open]},\n commands: {open: (api: any) => api.setOpen(true), close: (api: any) => api.setOpen(false), clear: (api: any) => api.clearValue(), focus: (api: any) => api.focus()},\n fallback: (p: any, hh: any) => hh('div', null, p.label != null && hh('label', null, p.label), hh('button', {type: 'button', disabled: true}, p.placeholder || '')),\n})\n"],"names":["h"],"mappings":"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"}