@questpie/admin 1.1.1 → 2.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 (965) hide show
  1. package/README.md +245 -474
  2. package/dist/_virtual/rolldown_runtime.mjs +18 -0
  3. package/dist/augmentation.d.mts +315 -0
  4. package/dist/augmentation.d.mts.map +1 -0
  5. package/dist/client/blocks/block-registry.d.mts +199 -0
  6. package/dist/client/blocks/block-registry.d.mts.map +1 -0
  7. package/dist/client/blocks/block-registry.mjs +88 -0
  8. package/dist/client/blocks/block-registry.mjs.map +1 -0
  9. package/dist/client/blocks/block-renderer.d.mts +52 -0
  10. package/dist/client/blocks/block-renderer.d.mts.map +1 -0
  11. package/dist/client/blocks/block-renderer.mjs +71 -0
  12. package/dist/client/blocks/block-renderer.mjs.map +1 -0
  13. package/dist/client/blocks/index.d.mts +4 -0
  14. package/dist/client/blocks/prefetch.d.mts +45 -0
  15. package/dist/client/blocks/prefetch.d.mts.map +1 -0
  16. package/dist/client/blocks/prefetch.mjs +26 -0
  17. package/dist/client/blocks/prefetch.mjs.map +1 -0
  18. package/dist/client/blocks/types.d.mts +69 -0
  19. package/dist/client/blocks/types.d.mts.map +1 -0
  20. package/dist/client/blocks/types.mjs +20 -0
  21. package/dist/client/blocks/types.mjs.map +1 -0
  22. package/dist/client/builder/admin-builder.d.mts +112 -0
  23. package/dist/client/builder/admin-builder.d.mts.map +1 -0
  24. package/dist/client/builder/admin-builder.mjs +185 -0
  25. package/dist/client/builder/admin-builder.mjs.map +1 -0
  26. package/dist/client/builder/admin-types.d.mts +73 -0
  27. package/dist/client/builder/admin-types.d.mts.map +1 -0
  28. package/dist/client/builder/admin.d.mts +121 -0
  29. package/dist/client/builder/admin.d.mts.map +1 -0
  30. package/dist/client/builder/admin.mjs +160 -0
  31. package/dist/client/builder/admin.mjs.map +1 -0
  32. package/dist/client/builder/defaults/components.mjs +20 -0
  33. package/dist/client/builder/defaults/components.mjs.map +1 -0
  34. package/dist/client/builder/defaults/core.d.mts +354 -0
  35. package/dist/client/builder/defaults/core.d.mts.map +1 -0
  36. package/dist/client/builder/defaults/core.mjs +49 -0
  37. package/dist/client/builder/defaults/core.mjs.map +1 -0
  38. package/dist/client/builder/defaults/fields.mjs +328 -0
  39. package/dist/client/builder/defaults/fields.mjs.map +1 -0
  40. package/dist/client/builder/defaults/pages.mjs +58 -0
  41. package/dist/client/builder/defaults/pages.mjs.map +1 -0
  42. package/dist/client/builder/defaults/starter.d.mts +351 -0
  43. package/dist/client/builder/defaults/starter.d.mts.map +1 -0
  44. package/dist/client/builder/defaults/starter.mjs +28 -0
  45. package/dist/client/builder/defaults/starter.mjs.map +1 -0
  46. package/dist/client/builder/defaults/views.mjs +27 -0
  47. package/dist/client/builder/defaults/views.mjs.map +1 -0
  48. package/dist/client/builder/defaults/widgets.mjs +31 -0
  49. package/dist/client/builder/defaults/widgets.mjs.map +1 -0
  50. package/dist/client/builder/field/field.d.mts +229 -0
  51. package/dist/client/builder/field/field.d.mts.map +1 -0
  52. package/dist/client/builder/field/field.mjs +83 -0
  53. package/dist/client/builder/field/field.mjs.map +1 -0
  54. package/dist/client/builder/index.d.mts +36 -0
  55. package/dist/client/builder/index.d.mts.map +1 -0
  56. package/dist/client/builder/page/page.d.mts +36 -0
  57. package/dist/client/builder/page/page.d.mts.map +1 -0
  58. package/dist/client/builder/page/page.mjs +27 -0
  59. package/dist/client/builder/page/page.mjs.map +1 -0
  60. package/dist/client/builder/proxies.d.mts +2 -0
  61. package/dist/client/builder/proxies.mjs +24 -0
  62. package/dist/client/builder/proxies.mjs.map +1 -0
  63. package/dist/client/builder/qa.d.mts +50 -0
  64. package/dist/client/builder/qa.d.mts.map +1 -0
  65. package/dist/client/builder/qa.mjs +42 -0
  66. package/dist/client/builder/qa.mjs.map +1 -0
  67. package/dist/client/builder/registry.d.mts +70 -0
  68. package/dist/client/builder/registry.d.mts.map +1 -0
  69. package/dist/client/builder/types/action-registry.d.mts +2 -0
  70. package/dist/client/builder/types/action-registry.mjs +142 -0
  71. package/dist/client/builder/types/action-registry.mjs.map +1 -0
  72. package/dist/client/builder/types/action-types.d.mts +253 -0
  73. package/dist/client/builder/types/action-types.d.mts.map +1 -0
  74. package/dist/client/builder/types/collection-types.d.mts +199 -0
  75. package/dist/client/builder/types/collection-types.d.mts.map +1 -0
  76. package/dist/client/builder/types/collection-types.mjs +11 -0
  77. package/dist/client/builder/types/collection-types.mjs.map +1 -0
  78. package/dist/client/builder/types/common.d.mts +60 -0
  79. package/dist/client/builder/types/common.d.mts.map +1 -0
  80. package/dist/client/builder/types/field-types.d.mts +593 -0
  81. package/dist/client/builder/types/field-types.d.mts.map +1 -0
  82. package/dist/client/builder/types/field-types.mjs +19 -0
  83. package/dist/client/builder/types/field-types.mjs.map +1 -0
  84. package/dist/client/builder/types/global-types.d.mts +22 -0
  85. package/dist/client/builder/types/global-types.d.mts.map +1 -0
  86. package/dist/client/builder/types/ui-config.d.mts +160 -0
  87. package/dist/client/builder/types/ui-config.d.mts.map +1 -0
  88. package/dist/client/builder/types/views.d.mts +89 -0
  89. package/dist/client/builder/types/views.d.mts.map +1 -0
  90. package/dist/client/builder/types/widget-types.d.mts +563 -0
  91. package/dist/client/builder/types/widget-types.d.mts.map +1 -0
  92. package/dist/client/builder/validation.d.mts +3 -0
  93. package/dist/client/builder/validation.mjs +208 -0
  94. package/dist/client/builder/validation.mjs.map +1 -0
  95. package/dist/client/builder/view/view.d.mts +129 -0
  96. package/dist/client/builder/view/view.d.mts.map +1 -0
  97. package/dist/client/builder/view/view.mjs +109 -0
  98. package/dist/client/builder/view/view.mjs.map +1 -0
  99. package/dist/client/builder/widget/widget.d.mts +33 -0
  100. package/dist/client/builder/widget/widget.d.mts.map +1 -0
  101. package/dist/client/builder/widget/widget.mjs +26 -0
  102. package/dist/client/builder/widget/widget.mjs.map +1 -0
  103. package/dist/client/components/actions/action-button.d.mts +2 -0
  104. package/dist/client/components/actions/action-button.mjs +135 -0
  105. package/dist/client/components/actions/action-button.mjs.map +1 -0
  106. package/dist/client/components/actions/action-dialog.d.mts +2 -0
  107. package/dist/client/components/actions/action-dialog.mjs +264 -0
  108. package/dist/client/components/actions/action-dialog.mjs.map +1 -0
  109. package/dist/client/components/actions/confirmation-dialog.d.mts +2 -0
  110. package/dist/client/components/actions/confirmation-dialog.mjs +82 -0
  111. package/dist/client/components/actions/confirmation-dialog.mjs.map +1 -0
  112. package/dist/client/components/actions/header-actions.d.mts +2 -0
  113. package/dist/client/components/actions/header-actions.mjs +117 -0
  114. package/dist/client/components/actions/header-actions.mjs.map +1 -0
  115. package/dist/client/components/actions/index.d.mts +4 -0
  116. package/dist/client/components/admin-link.d.mts +67 -0
  117. package/dist/client/components/admin-link.d.mts.map +1 -0
  118. package/dist/client/components/admin-link.mjs +92 -0
  119. package/dist/client/components/admin-link.mjs.map +1 -0
  120. package/dist/client/components/auth/auth-guard.d.mts +51 -0
  121. package/dist/client/components/auth/auth-guard.d.mts.map +1 -0
  122. package/dist/client/components/auth/auth-guard.mjs +60 -0
  123. package/dist/client/components/auth/auth-guard.mjs.map +1 -0
  124. package/dist/client/components/auth/auth-loading.d.mts +36 -0
  125. package/dist/client/components/auth/auth-loading.d.mts.map +1 -0
  126. package/dist/client/components/auth/auth-loading.mjs +27 -0
  127. package/dist/client/components/auth/auth-loading.mjs.map +1 -0
  128. package/dist/client/components/auth/index.d.mts +2 -0
  129. package/dist/client/components/blocks/block-canvas.mjs +90 -0
  130. package/dist/client/components/blocks/block-canvas.mjs.map +1 -0
  131. package/dist/client/components/blocks/block-editor-context.mjs +58 -0
  132. package/dist/client/components/blocks/block-editor-context.mjs.map +1 -0
  133. package/dist/client/components/blocks/block-editor-layout.mjs +82 -0
  134. package/dist/client/components/blocks/block-editor-layout.mjs.map +1 -0
  135. package/dist/client/components/blocks/block-editor-provider.mjs +155 -0
  136. package/dist/client/components/blocks/block-editor-provider.mjs.map +1 -0
  137. package/dist/client/components/blocks/block-fields-renderer.mjs +70 -0
  138. package/dist/client/components/blocks/block-fields-renderer.mjs.map +1 -0
  139. package/dist/client/components/blocks/block-insert-button.mjs +72 -0
  140. package/dist/client/components/blocks/block-insert-button.mjs.map +1 -0
  141. package/dist/client/components/blocks/block-item-menu.mjs +161 -0
  142. package/dist/client/components/blocks/block-item-menu.mjs.map +1 -0
  143. package/dist/client/components/blocks/block-item.mjs +187 -0
  144. package/dist/client/components/blocks/block-item.mjs.map +1 -0
  145. package/dist/client/components/blocks/block-library-sidebar.mjs +190 -0
  146. package/dist/client/components/blocks/block-library-sidebar.mjs.map +1 -0
  147. package/dist/client/components/blocks/block-tree.mjs +45 -0
  148. package/dist/client/components/blocks/block-tree.mjs.map +1 -0
  149. package/dist/client/components/blocks/block-type-icon.mjs +50 -0
  150. package/dist/client/components/blocks/block-type-icon.mjs.map +1 -0
  151. package/dist/client/components/blocks/utils/tree-utils.mjs +186 -0
  152. package/dist/client/components/blocks/utils/tree-utils.mjs.map +1 -0
  153. package/dist/client/components/component-renderer.d.mts +125 -0
  154. package/dist/client/components/component-renderer.d.mts.map +1 -0
  155. package/dist/client/components/component-renderer.mjs +145 -0
  156. package/dist/client/components/component-renderer.mjs.map +1 -0
  157. package/dist/client/components/error-boundary.mjs +92 -0
  158. package/dist/client/components/error-boundary.mjs.map +1 -0
  159. package/dist/client/components/fields/array-field.d.mts +44 -0
  160. package/dist/client/components/fields/array-field.d.mts.map +1 -0
  161. package/dist/client/components/fields/array-field.mjs +231 -0
  162. package/dist/client/components/fields/array-field.mjs.map +1 -0
  163. package/dist/client/components/fields/asset-preview-field.d.mts +52 -0
  164. package/dist/client/components/fields/asset-preview-field.d.mts.map +1 -0
  165. package/dist/client/components/fields/asset-preview-field.mjs +60 -0
  166. package/dist/client/components/fields/asset-preview-field.mjs.map +1 -0
  167. package/dist/client/components/fields/blocks-field/blocks-field.d.mts +41 -0
  168. package/dist/client/components/fields/blocks-field/blocks-field.d.mts.map +1 -0
  169. package/dist/client/components/fields/blocks-field/blocks-field.mjs +101 -0
  170. package/dist/client/components/fields/blocks-field/blocks-field.mjs.map +1 -0
  171. package/dist/client/components/fields/blocks-field/index.d.mts +1 -0
  172. package/dist/client/components/fields/boolean-field.d.mts +30 -0
  173. package/dist/client/components/fields/boolean-field.d.mts.map +1 -0
  174. package/dist/client/components/fields/boolean-field.mjs +47 -0
  175. package/dist/client/components/fields/boolean-field.mjs.map +1 -0
  176. package/dist/client/components/fields/custom-field.d.mts +3 -0
  177. package/dist/client/components/fields/date-field.d.mts +22 -0
  178. package/dist/client/components/fields/date-field.d.mts.map +1 -0
  179. package/dist/client/components/fields/date-field.mjs +42 -0
  180. package/dist/client/components/fields/date-field.mjs.map +1 -0
  181. package/dist/client/components/fields/datetime-field.d.mts +23 -0
  182. package/dist/client/components/fields/datetime-field.d.mts.map +1 -0
  183. package/dist/client/components/fields/datetime-field.mjs +43 -0
  184. package/dist/client/components/fields/datetime-field.mjs.map +1 -0
  185. package/dist/client/components/fields/email-field.d.mts +19 -0
  186. package/dist/client/components/fields/email-field.d.mts.map +1 -0
  187. package/dist/client/components/fields/email-field.mjs +38 -0
  188. package/dist/client/components/fields/email-field.mjs.map +1 -0
  189. package/dist/client/components/fields/embedded-collection.d.mts +3 -0
  190. package/dist/client/components/fields/field-types.d.mts +571 -0
  191. package/dist/client/components/fields/field-types.d.mts.map +1 -0
  192. package/dist/client/components/fields/field-utils.d.mts +1 -0
  193. package/dist/client/components/fields/field-utils.mjs +65 -0
  194. package/dist/client/components/fields/field-utils.mjs.map +1 -0
  195. package/dist/client/components/fields/field-wrapper.d.mts +3 -0
  196. package/dist/client/components/fields/field-wrapper.mjs +49 -0
  197. package/dist/client/components/fields/field-wrapper.mjs.map +1 -0
  198. package/dist/client/components/fields/index.d.mts +33 -0
  199. package/dist/client/components/fields/json-field.d.mts +84 -0
  200. package/dist/client/components/fields/json-field.d.mts.map +1 -0
  201. package/dist/client/components/fields/json-field.mjs +248 -0
  202. package/dist/client/components/fields/json-field.mjs.map +1 -0
  203. package/dist/client/components/fields/locale-badge.d.mts +1 -0
  204. package/dist/client/components/fields/locale-badge.mjs +17 -0
  205. package/dist/client/components/fields/locale-badge.mjs.map +1 -0
  206. package/dist/client/components/fields/number-field.d.mts +23 -0
  207. package/dist/client/components/fields/number-field.d.mts.map +1 -0
  208. package/dist/client/components/fields/number-field.mjs +40 -0
  209. package/dist/client/components/fields/number-field.mjs.map +1 -0
  210. package/dist/client/components/fields/object-array-field.d.mts +2 -0
  211. package/dist/client/components/fields/object-array-field.mjs +313 -0
  212. package/dist/client/components/fields/object-array-field.mjs.map +1 -0
  213. package/dist/client/components/fields/object-field.d.mts +32 -0
  214. package/dist/client/components/fields/object-field.d.mts.map +1 -0
  215. package/dist/client/components/fields/object-field.mjs +128 -0
  216. package/dist/client/components/fields/object-field.mjs.map +1 -0
  217. package/dist/client/components/fields/relation/displays/cards-display.d.mts +2 -0
  218. package/dist/client/components/fields/relation/displays/cards-display.mjs +140 -0
  219. package/dist/client/components/fields/relation/displays/cards-display.mjs.map +1 -0
  220. package/dist/client/components/fields/relation/displays/chips-display.d.mts +2 -0
  221. package/dist/client/components/fields/relation/displays/chips-display.mjs +100 -0
  222. package/dist/client/components/fields/relation/displays/chips-display.mjs.map +1 -0
  223. package/dist/client/components/fields/relation/displays/grid-display.d.mts +2 -0
  224. package/dist/client/components/fields/relation/displays/grid-display.mjs +114 -0
  225. package/dist/client/components/fields/relation/displays/grid-display.mjs.map +1 -0
  226. package/dist/client/components/fields/relation/displays/index.d.mts +6 -0
  227. package/dist/client/components/fields/relation/displays/list-display.d.mts +2 -0
  228. package/dist/client/components/fields/relation/displays/list-display.mjs +128 -0
  229. package/dist/client/components/fields/relation/displays/list-display.mjs.map +1 -0
  230. package/dist/client/components/fields/relation/displays/table-display.d.mts +2 -0
  231. package/dist/client/components/fields/relation/displays/table-display.mjs +134 -0
  232. package/dist/client/components/fields/relation/displays/table-display.mjs.map +1 -0
  233. package/dist/client/components/fields/relation/displays/types.d.mts +22 -0
  234. package/dist/client/components/fields/relation/displays/types.d.mts.map +1 -0
  235. package/dist/client/components/fields/relation/displays/types.mjs +73 -0
  236. package/dist/client/components/fields/relation/displays/types.mjs.map +1 -0
  237. package/dist/client/components/fields/relation/index.d.mts +3 -0
  238. package/dist/client/components/fields/relation/relation-items-display.d.mts +5 -0
  239. package/dist/client/components/fields/relation/relation-items-display.mjs +47 -0
  240. package/dist/client/components/fields/relation/relation-items-display.mjs.map +1 -0
  241. package/dist/client/components/fields/relation-field.d.mts +134 -0
  242. package/dist/client/components/fields/relation-field.d.mts.map +1 -0
  243. package/dist/client/components/fields/relation-field.mjs +106 -0
  244. package/dist/client/components/fields/relation-field.mjs.map +1 -0
  245. package/dist/client/components/fields/relation-picker.d.mts +4 -0
  246. package/dist/client/components/fields/relation-picker.mjs +301 -0
  247. package/dist/client/components/fields/relation-picker.mjs.map +1 -0
  248. package/dist/client/components/fields/relation-select.d.mts +3 -0
  249. package/dist/client/components/fields/relation-select.mjs +219 -0
  250. package/dist/client/components/fields/relation-select.mjs.map +1 -0
  251. package/dist/client/components/fields/reverse-relation-field.d.mts +2 -0
  252. package/dist/client/components/fields/rich-text-editor/bubble-menu.mjs +56 -0
  253. package/dist/client/components/fields/rich-text-editor/bubble-menu.mjs.map +1 -0
  254. package/dist/client/components/fields/rich-text-editor/extensions.mjs +118 -0
  255. package/dist/client/components/fields/rich-text-editor/extensions.mjs.map +1 -0
  256. package/dist/client/components/fields/rich-text-editor/image-popover.mjs +196 -0
  257. package/dist/client/components/fields/rich-text-editor/image-popover.mjs.map +1 -0
  258. package/dist/client/components/fields/rich-text-editor/index.d.mts +4 -0
  259. package/dist/client/components/fields/rich-text-editor/index.mjs +187 -0
  260. package/dist/client/components/fields/rich-text-editor/index.mjs.map +1 -0
  261. package/dist/client/components/fields/rich-text-editor/link-popover.mjs +86 -0
  262. package/dist/client/components/fields/rich-text-editor/link-popover.mjs.map +1 -0
  263. package/dist/client/components/fields/rich-text-editor/presets.d.mts +11 -0
  264. package/dist/client/components/fields/rich-text-editor/presets.d.mts.map +1 -0
  265. package/dist/client/components/fields/rich-text-editor/presets.mjs +124 -0
  266. package/dist/client/components/fields/rich-text-editor/presets.mjs.map +1 -0
  267. package/dist/client/components/fields/rich-text-editor/slash-commands.mjs +145 -0
  268. package/dist/client/components/fields/rich-text-editor/slash-commands.mjs.map +1 -0
  269. package/dist/client/components/fields/rich-text-editor/table-controls.mjs +124 -0
  270. package/dist/client/components/fields/rich-text-editor/table-controls.mjs.map +1 -0
  271. package/dist/client/components/fields/rich-text-editor/toolbar.mjs +280 -0
  272. package/dist/client/components/fields/rich-text-editor/toolbar.mjs.map +1 -0
  273. package/dist/client/components/fields/rich-text-editor/types.d.mts +78 -0
  274. package/dist/client/components/fields/rich-text-editor/types.d.mts.map +1 -0
  275. package/dist/client/components/fields/rich-text-editor/types.mjs +31 -0
  276. package/dist/client/components/fields/rich-text-editor/types.mjs.map +1 -0
  277. package/dist/client/components/fields/rich-text-editor/utils.mjs +51 -0
  278. package/dist/client/components/fields/rich-text-editor/utils.mjs.map +1 -0
  279. package/dist/client/components/fields/rich-text-editor/variants.d.mts +2 -0
  280. package/dist/client/components/fields/rich-text-field.d.mts +14 -0
  281. package/dist/client/components/fields/rich-text-field.d.mts.map +1 -0
  282. package/dist/client/components/fields/rich-text-field.mjs +26 -0
  283. package/dist/client/components/fields/rich-text-field.mjs.map +1 -0
  284. package/dist/client/components/fields/select-field.d.mts +25 -0
  285. package/dist/client/components/fields/select-field.d.mts.map +1 -0
  286. package/dist/client/components/fields/select-field.mjs +53 -0
  287. package/dist/client/components/fields/select-field.mjs.map +1 -0
  288. package/dist/client/components/fields/status-field.d.mts +2 -0
  289. package/dist/client/components/fields/text-field.d.mts +22 -0
  290. package/dist/client/components/fields/text-field.d.mts.map +1 -0
  291. package/dist/client/components/fields/text-field.mjs +39 -0
  292. package/dist/client/components/fields/text-field.mjs.map +1 -0
  293. package/dist/client/components/fields/textarea-field.d.mts +22 -0
  294. package/dist/client/components/fields/textarea-field.d.mts.map +1 -0
  295. package/dist/client/components/fields/textarea-field.mjs +39 -0
  296. package/dist/client/components/fields/textarea-field.mjs.map +1 -0
  297. package/dist/client/components/fields/time-field.d.mts +20 -0
  298. package/dist/client/components/fields/time-field.d.mts.map +1 -0
  299. package/dist/client/components/fields/time-field.mjs +39 -0
  300. package/dist/client/components/fields/time-field.mjs.map +1 -0
  301. package/dist/client/components/fields/upload-field.d.mts +97 -0
  302. package/dist/client/components/fields/upload-field.d.mts.map +1 -0
  303. package/dist/client/components/fields/upload-field.mjs +497 -0
  304. package/dist/client/components/fields/upload-field.mjs.map +1 -0
  305. package/dist/client/components/filter-builder/columns-tab.d.mts +1 -0
  306. package/dist/client/components/filter-builder/columns-tab.mjs +131 -0
  307. package/dist/client/components/filter-builder/columns-tab.mjs.map +1 -0
  308. package/dist/client/components/filter-builder/filter-builder-sheet.d.mts +1 -0
  309. package/dist/client/components/filter-builder/filter-builder-sheet.mjs +157 -0
  310. package/dist/client/components/filter-builder/filter-builder-sheet.mjs.map +1 -0
  311. package/dist/client/components/filter-builder/filters-tab.d.mts +1 -0
  312. package/dist/client/components/filter-builder/filters-tab.mjs +380 -0
  313. package/dist/client/components/filter-builder/filters-tab.mjs.map +1 -0
  314. package/dist/client/components/filter-builder/index.d.mts +5 -0
  315. package/dist/client/components/filter-builder/saved-views-tab.d.mts +1 -0
  316. package/dist/client/components/filter-builder/saved-views-tab.mjs +125 -0
  317. package/dist/client/components/filter-builder/saved-views-tab.mjs.map +1 -0
  318. package/dist/client/components/index.d.mts +80 -0
  319. package/dist/client/components/locale-switcher.d.mts +2 -0
  320. package/dist/client/components/locale-switcher.mjs +128 -0
  321. package/dist/client/components/locale-switcher.mjs.map +1 -0
  322. package/dist/client/components/media/media-grid.mjs +139 -0
  323. package/dist/client/components/media/media-grid.mjs.map +1 -0
  324. package/dist/client/components/media/media-picker-dialog.mjs +255 -0
  325. package/dist/client/components/media/media-picker-dialog.mjs.map +1 -0
  326. package/dist/client/components/preview/live-preview-mode.mjs +211 -0
  327. package/dist/client/components/preview/live-preview-mode.mjs.map +1 -0
  328. package/dist/client/components/preview/preview-pane.mjs +179 -0
  329. package/dist/client/components/preview/preview-pane.mjs.map +1 -0
  330. package/dist/client/components/primitives/asset-preview.mjs +363 -0
  331. package/dist/client/components/primitives/asset-preview.mjs.map +1 -0
  332. package/dist/client/components/primitives/checkbox-input.mjs +33 -0
  333. package/dist/client/components/primitives/checkbox-input.mjs.map +1 -0
  334. package/dist/client/components/primitives/date-input.mjs +218 -0
  335. package/dist/client/components/primitives/date-input.mjs.map +1 -0
  336. package/dist/client/components/primitives/dropzone.mjs +239 -0
  337. package/dist/client/components/primitives/dropzone.mjs.map +1 -0
  338. package/dist/client/components/primitives/number-input.mjs +113 -0
  339. package/dist/client/components/primitives/number-input.mjs.map +1 -0
  340. package/dist/client/components/primitives/select-multi.mjs +256 -0
  341. package/dist/client/components/primitives/select-multi.mjs.map +1 -0
  342. package/dist/client/components/primitives/select-single.mjs +183 -0
  343. package/dist/client/components/primitives/select-single.mjs.map +1 -0
  344. package/dist/client/components/primitives/text-input.mjs +40 -0
  345. package/dist/client/components/primitives/text-input.mjs.map +1 -0
  346. package/dist/client/components/primitives/textarea-input.mjs +38 -0
  347. package/dist/client/components/primitives/textarea-input.mjs.map +1 -0
  348. package/dist/client/components/primitives/time-input.mjs +72 -0
  349. package/dist/client/components/primitives/time-input.mjs.map +1 -0
  350. package/dist/client/components/primitives/toggle-input.mjs +31 -0
  351. package/dist/client/components/primitives/toggle-input.mjs.map +1 -0
  352. package/dist/client/components/primitives/types.d.mts +14 -0
  353. package/dist/client/components/primitives/types.d.mts.map +1 -0
  354. package/dist/client/components/primitives/types.mjs +13 -0
  355. package/dist/client/components/primitives/types.mjs.map +1 -0
  356. package/dist/client/components/sheets/index.d.mts +1 -0
  357. package/dist/client/components/sheets/resource-sheet.d.mts +1 -0
  358. package/dist/client/components/sheets/resource-sheet.mjs +78 -0
  359. package/dist/client/components/sheets/resource-sheet.mjs.map +1 -0
  360. package/dist/client/components/ui/accordion.d.mts +2 -0
  361. package/dist/client/components/ui/accordion.mjs +50 -0
  362. package/dist/client/components/ui/accordion.mjs.map +1 -0
  363. package/dist/client/components/ui/alert.mjs +32 -0
  364. package/dist/client/components/ui/alert.mjs.map +1 -0
  365. package/dist/client/components/ui/avatar.d.mts +3 -0
  366. package/dist/client/components/ui/badge.d.mts +3 -0
  367. package/dist/client/components/ui/badge.mjs +35 -0
  368. package/dist/client/components/ui/badge.mjs.map +1 -0
  369. package/dist/client/components/ui/button.d.mts +3 -0
  370. package/dist/client/components/ui/button.mjs +49 -0
  371. package/dist/client/components/ui/button.mjs.map +1 -0
  372. package/dist/client/components/ui/card.d.mts +2 -0
  373. package/dist/{card-BKHjBQfw.mjs → client/components/ui/card.mjs} +3 -10
  374. package/dist/{card-BKHjBQfw.mjs.map → client/components/ui/card.mjs.map} +1 -1
  375. package/dist/client/components/ui/checkbox.d.mts +2 -0
  376. package/dist/client/components/ui/checkbox.mjs +27 -0
  377. package/dist/client/components/ui/checkbox.mjs.map +1 -0
  378. package/dist/client/components/ui/combobox.d.mts +3 -0
  379. package/dist/client/components/ui/command.mjs +69 -0
  380. package/dist/client/components/ui/command.mjs.map +1 -0
  381. package/dist/client/components/ui/dialog.d.mts +3 -0
  382. package/dist/client/components/ui/dialog.mjs +83 -0
  383. package/dist/client/components/ui/dialog.mjs.map +1 -0
  384. package/dist/client/components/ui/drawer.mjs +75 -0
  385. package/dist/client/components/ui/drawer.mjs.map +1 -0
  386. package/dist/client/components/ui/dropdown-menu.d.mts +3 -0
  387. package/dist/client/components/ui/dropdown-menu.mjs +89 -0
  388. package/dist/client/components/ui/dropdown-menu.mjs.map +1 -0
  389. package/dist/client/components/ui/empty-state.mjs +53 -0
  390. package/dist/client/components/ui/empty-state.mjs.map +1 -0
  391. package/dist/client/components/ui/field.d.mts +3 -0
  392. package/dist/client/components/ui/field.mjs +78 -0
  393. package/dist/client/components/ui/field.mjs.map +1 -0
  394. package/dist/client/components/ui/input-group.d.mts +4 -0
  395. package/dist/client/components/ui/input-group.mjs +68 -0
  396. package/dist/client/components/ui/input-group.mjs.map +1 -0
  397. package/dist/client/components/ui/input.d.mts +2 -0
  398. package/dist/client/components/ui/input.mjs +17 -0
  399. package/dist/client/components/ui/input.mjs.map +1 -0
  400. package/dist/client/components/ui/kbd.mjs +24 -0
  401. package/dist/client/components/ui/kbd.mjs.map +1 -0
  402. package/dist/client/components/ui/label.d.mts +2 -0
  403. package/dist/client/components/ui/label.mjs +15 -0
  404. package/dist/client/components/ui/label.mjs.map +1 -0
  405. package/dist/client/components/ui/popover.d.mts +3 -0
  406. package/dist/client/components/ui/popover.mjs +49 -0
  407. package/dist/client/components/ui/popover.mjs.map +1 -0
  408. package/dist/client/components/ui/responsive-dialog.mjs +102 -0
  409. package/dist/client/components/ui/responsive-dialog.mjs.map +1 -0
  410. package/dist/client/components/ui/scroll-area.d.mts +2 -0
  411. package/dist/client/components/ui/search-input.mjs +74 -0
  412. package/dist/client/components/ui/search-input.mjs.map +1 -0
  413. package/dist/client/components/ui/select.d.mts +3 -0
  414. package/dist/client/components/ui/select.mjs +85 -0
  415. package/dist/client/components/ui/select.mjs.map +1 -0
  416. package/dist/client/components/ui/separator.d.mts +2 -0
  417. package/dist/client/components/ui/separator.mjs +17 -0
  418. package/dist/client/components/ui/separator.mjs.map +1 -0
  419. package/dist/client/components/ui/sheet.d.mts +3 -0
  420. package/dist/client/components/ui/sheet.mjs +78 -0
  421. package/dist/client/components/ui/sheet.mjs.map +1 -0
  422. package/dist/client/components/ui/sidebar.d.mts +8 -0
  423. package/dist/client/components/ui/sidebar.mjs +256 -0
  424. package/dist/client/components/ui/sidebar.mjs.map +1 -0
  425. package/dist/client/components/ui/skeleton.d.mts +1 -0
  426. package/dist/client/components/ui/skeleton.mjs +15 -0
  427. package/dist/client/components/ui/skeleton.mjs.map +1 -0
  428. package/dist/client/components/ui/sonner.d.mts +14 -0
  429. package/dist/client/components/ui/sonner.d.mts.map +1 -0
  430. package/dist/client/components/ui/sonner.mjs +55 -0
  431. package/dist/client/components/ui/sonner.mjs.map +1 -0
  432. package/dist/client/components/ui/spinner.d.mts +1 -0
  433. package/dist/client/components/ui/spinner.mjs +18 -0
  434. package/dist/client/components/ui/spinner.mjs.map +1 -0
  435. package/dist/client/components/ui/switch.d.mts +2 -0
  436. package/dist/client/components/ui/switch.mjs +23 -0
  437. package/dist/client/components/ui/switch.mjs.map +1 -0
  438. package/dist/client/components/ui/table.d.mts +2 -0
  439. package/dist/client/components/ui/table.mjs +66 -0
  440. package/dist/client/components/ui/table.mjs.map +1 -0
  441. package/dist/client/components/ui/tabs.d.mts +3 -0
  442. package/dist/client/components/ui/tabs.mjs +49 -0
  443. package/dist/client/components/ui/tabs.mjs.map +1 -0
  444. package/dist/client/components/ui/textarea.d.mts +2 -0
  445. package/dist/client/components/ui/textarea.mjs +15 -0
  446. package/dist/client/components/ui/textarea.mjs.map +1 -0
  447. package/dist/client/components/ui/toolbar.mjs +54 -0
  448. package/dist/client/components/ui/toolbar.mjs.map +1 -0
  449. package/dist/client/components/ui/tooltip.d.mts +2 -0
  450. package/dist/client/components/ui/tooltip.mjs +45 -0
  451. package/dist/client/components/ui/tooltip.mjs.map +1 -0
  452. package/dist/client/components/widgets/chart-widget.d.mts +57 -0
  453. package/dist/client/components/widgets/chart-widget.d.mts.map +1 -0
  454. package/dist/client/components/widgets/chart-widget.mjs +282 -0
  455. package/dist/client/components/widgets/chart-widget.mjs.map +1 -0
  456. package/dist/client/components/widgets/progress-widget.d.mts +41 -0
  457. package/dist/client/components/widgets/progress-widget.d.mts.map +1 -0
  458. package/dist/client/components/widgets/progress-widget.mjs +110 -0
  459. package/dist/client/components/widgets/progress-widget.mjs.map +1 -0
  460. package/dist/client/components/widgets/quick-actions-widget.d.mts +29 -0
  461. package/dist/client/components/widgets/quick-actions-widget.d.mts.map +1 -0
  462. package/dist/client/components/widgets/quick-actions-widget.mjs +121 -0
  463. package/dist/client/components/widgets/quick-actions-widget.mjs.map +1 -0
  464. package/dist/client/components/widgets/recent-items-widget.d.mts +51 -0
  465. package/dist/client/components/widgets/recent-items-widget.d.mts.map +1 -0
  466. package/dist/client/components/widgets/recent-items-widget.mjs +101 -0
  467. package/dist/client/components/widgets/recent-items-widget.mjs.map +1 -0
  468. package/dist/client/components/widgets/stats-widget.d.mts +55 -0
  469. package/dist/client/components/widgets/stats-widget.d.mts.map +1 -0
  470. package/dist/client/components/widgets/stats-widget.mjs +150 -0
  471. package/dist/client/components/widgets/stats-widget.mjs.map +1 -0
  472. package/dist/client/components/widgets/table-widget.d.mts +31 -0
  473. package/dist/client/components/widgets/table-widget.d.mts.map +1 -0
  474. package/dist/client/components/widgets/table-widget.mjs +139 -0
  475. package/dist/client/components/widgets/table-widget.mjs.map +1 -0
  476. package/dist/client/components/widgets/timeline-widget.d.mts +51 -0
  477. package/dist/client/components/widgets/timeline-widget.d.mts.map +1 -0
  478. package/dist/client/components/widgets/timeline-widget.mjs +168 -0
  479. package/dist/client/components/widgets/timeline-widget.mjs.map +1 -0
  480. package/dist/client/components/widgets/value-widget.d.mts +39 -0
  481. package/dist/client/components/widgets/value-widget.d.mts.map +1 -0
  482. package/dist/client/components/widgets/value-widget.mjs +111 -0
  483. package/dist/client/components/widgets/value-widget.mjs.map +1 -0
  484. package/dist/client/components/widgets/widget-skeletons.mjs +145 -0
  485. package/dist/client/components/widgets/widget-skeletons.mjs.map +1 -0
  486. package/dist/client/context/focus-context.d.mts +88 -0
  487. package/dist/client/context/focus-context.d.mts.map +1 -0
  488. package/dist/client/context/focus-context.mjs +178 -0
  489. package/dist/client/context/focus-context.mjs.map +1 -0
  490. package/dist/client/contexts/breadcrumb-context.mjs +32 -0
  491. package/dist/client/contexts/breadcrumb-context.mjs.map +1 -0
  492. package/dist/client/hooks/typed-hooks.d.mts +84 -0
  493. package/dist/client/hooks/typed-hooks.d.mts.map +1 -0
  494. package/dist/client/hooks/typed-hooks.mjs +272 -0
  495. package/dist/client/hooks/typed-hooks.mjs.map +1 -0
  496. package/dist/client/hooks/use-action.mjs +201 -0
  497. package/dist/client/hooks/use-action.mjs.map +1 -0
  498. package/dist/client/hooks/use-admin-config.mjs +40 -0
  499. package/dist/client/hooks/use-admin-config.mjs.map +1 -0
  500. package/dist/client/hooks/use-admin-preferences.mjs +68 -0
  501. package/dist/client/hooks/use-admin-preferences.mjs.map +1 -0
  502. package/dist/client/hooks/use-admin-routes.mjs +97 -0
  503. package/dist/client/hooks/use-admin-routes.mjs.map +1 -0
  504. package/dist/client/hooks/use-auth.d.mts +98 -0
  505. package/dist/client/hooks/use-auth.d.mts.map +1 -0
  506. package/dist/{use-auth-BoLmWtmU.mjs → client/hooks/use-auth.mjs} +3 -3
  507. package/dist/client/hooks/use-auth.mjs.map +1 -0
  508. package/dist/client/hooks/use-collection-fields.mjs +32 -0
  509. package/dist/client/hooks/use-collection-fields.mjs.map +1 -0
  510. package/dist/client/hooks/use-collection-meta.mjs +121 -0
  511. package/dist/client/hooks/use-collection-meta.mjs.map +1 -0
  512. package/dist/client/hooks/use-collection-schema.mjs +67 -0
  513. package/dist/client/hooks/use-collection-schema.mjs.map +1 -0
  514. package/dist/client/hooks/use-collection-validation.mjs +74 -0
  515. package/dist/client/hooks/use-collection-validation.mjs.map +1 -0
  516. package/dist/client/hooks/use-collection.d.mts +86 -0
  517. package/dist/client/hooks/use-collection.d.mts.map +1 -0
  518. package/dist/client/hooks/use-collection.mjs +214 -0
  519. package/dist/client/hooks/use-collection.mjs.map +1 -0
  520. package/dist/client/hooks/use-current-user.d.mts +57 -0
  521. package/dist/client/hooks/use-current-user.d.mts.map +1 -0
  522. package/dist/client/hooks/use-current-user.mjs +79 -0
  523. package/dist/client/hooks/use-current-user.mjs.map +1 -0
  524. package/dist/client/hooks/use-field-hooks.mjs +191 -0
  525. package/dist/client/hooks/use-field-hooks.mjs.map +1 -0
  526. package/dist/client/hooks/use-field-options.d.mts +90 -0
  527. package/dist/client/hooks/use-field-options.d.mts.map +1 -0
  528. package/dist/client/hooks/use-field-options.mjs +184 -0
  529. package/dist/client/hooks/use-field-options.mjs.map +1 -0
  530. package/dist/client/hooks/use-global-fields.mjs +27 -0
  531. package/dist/client/hooks/use-global-fields.mjs.map +1 -0
  532. package/dist/client/hooks/use-global-meta.mjs +59 -0
  533. package/dist/client/hooks/use-global-meta.mjs.map +1 -0
  534. package/dist/client/hooks/use-global-schema.mjs +33 -0
  535. package/dist/client/hooks/use-global-schema.mjs.map +1 -0
  536. package/dist/client/hooks/use-global.d.mts +40 -0
  537. package/dist/client/hooks/use-global.d.mts.map +1 -0
  538. package/dist/client/hooks/use-global.mjs +74 -0
  539. package/dist/client/hooks/use-global.mjs.map +1 -0
  540. package/dist/client/hooks/use-locks.mjs +245 -0
  541. package/dist/client/hooks/use-locks.mjs.map +1 -0
  542. package/dist/client/hooks/use-media-query.d.mts +23 -0
  543. package/dist/client/hooks/use-media-query.d.mts.map +1 -0
  544. package/dist/client/hooks/use-media-query.mjs +62 -0
  545. package/dist/client/hooks/use-media-query.mjs.map +1 -0
  546. package/dist/client/hooks/use-prefill-params.mjs +47 -0
  547. package/dist/client/hooks/use-prefill-params.mjs.map +1 -0
  548. package/dist/client/hooks/use-questpie-query-options.mjs +28 -0
  549. package/dist/client/hooks/use-questpie-query-options.mjs.map +1 -0
  550. package/dist/client/hooks/use-reactive-fields.d.mts +75 -0
  551. package/dist/client/hooks/use-reactive-fields.d.mts.map +1 -0
  552. package/dist/client/hooks/use-reactive-fields.mjs +164 -0
  553. package/dist/client/hooks/use-reactive-fields.mjs.map +1 -0
  554. package/dist/client/hooks/use-realtime-highlight.mjs +96 -0
  555. package/dist/client/hooks/use-realtime-highlight.mjs.map +1 -0
  556. package/dist/client/hooks/use-saved-views.mjs +65 -0
  557. package/dist/client/hooks/use-saved-views.mjs.map +1 -0
  558. package/dist/client/hooks/use-search.mjs +147 -0
  559. package/dist/client/hooks/use-search.mjs.map +1 -0
  560. package/dist/client/hooks/use-server-validation.mjs +199 -0
  561. package/dist/client/hooks/use-server-validation.mjs.map +1 -0
  562. package/dist/client/hooks/use-server-widget-data.d.mts +26 -0
  563. package/dist/client/hooks/use-server-widget-data.d.mts.map +1 -0
  564. package/dist/client/hooks/use-server-widget-data.mjs +40 -0
  565. package/dist/client/hooks/use-server-widget-data.mjs.map +1 -0
  566. package/dist/client/hooks/use-setup-status.d.mts +39 -0
  567. package/dist/client/hooks/use-setup-status.d.mts.map +1 -0
  568. package/dist/client/hooks/use-setup-status.mjs +50 -0
  569. package/dist/client/hooks/use-setup-status.mjs.map +1 -0
  570. package/dist/client/hooks/use-upload-collection.mjs +32 -0
  571. package/dist/client/hooks/use-upload-collection.mjs.map +1 -0
  572. package/dist/client/hooks/use-upload.d.mts +23 -0
  573. package/dist/client/hooks/use-upload.d.mts.map +1 -0
  574. package/dist/client/hooks/use-upload.mjs +145 -0
  575. package/dist/client/hooks/use-upload.mjs.map +1 -0
  576. package/dist/client/hooks/use-validation-error-map.mjs +53 -0
  577. package/dist/client/hooks/use-validation-error-map.mjs.map +1 -0
  578. package/dist/client/hooks/use-view-state.mjs +261 -0
  579. package/dist/client/hooks/use-view-state.mjs.map +1 -0
  580. package/dist/client/i18n/hooks.mjs +160 -0
  581. package/dist/client/i18n/hooks.mjs.map +1 -0
  582. package/dist/client/i18n/intl-cache.mjs +65 -0
  583. package/dist/client/i18n/intl-cache.mjs.map +1 -0
  584. package/dist/client/i18n/messages.mjs +7 -0
  585. package/dist/client/i18n/messages.mjs.map +1 -0
  586. package/dist/client/i18n/simple.d.mts +22 -0
  587. package/dist/client/i18n/simple.d.mts.map +1 -0
  588. package/dist/client/i18n/simple.mjs +157 -0
  589. package/dist/client/i18n/simple.mjs.map +1 -0
  590. package/dist/client/i18n/types.d.mts +110 -0
  591. package/dist/client/i18n/types.d.mts.map +1 -0
  592. package/dist/client/lib/utils.d.mts +1 -0
  593. package/dist/client/lib/utils.mjs +28 -0
  594. package/dist/client/lib/utils.mjs.map +1 -0
  595. package/dist/client/preview/block-scope-context.d.mts +74 -0
  596. package/dist/client/preview/block-scope-context.d.mts.map +1 -0
  597. package/dist/client/preview/block-scope-context.mjs +93 -0
  598. package/dist/client/preview/block-scope-context.mjs.map +1 -0
  599. package/dist/client/preview/index.d.mts +5 -0
  600. package/dist/client/preview/preview-banner.d.mts +46 -0
  601. package/dist/client/preview/preview-banner.d.mts.map +1 -0
  602. package/dist/client/preview/preview-banner.mjs +95 -0
  603. package/dist/client/preview/preview-banner.mjs.map +1 -0
  604. package/dist/client/preview/preview-field.d.mts +108 -0
  605. package/dist/client/preview/preview-field.d.mts.map +1 -0
  606. package/dist/client/preview/preview-field.mjs +125 -0
  607. package/dist/client/preview/preview-field.mjs.map +1 -0
  608. package/dist/client/preview/types.d.mts +115 -0
  609. package/dist/client/preview/types.d.mts.map +1 -0
  610. package/dist/client/preview/types.mjs +21 -0
  611. package/dist/client/preview/types.mjs.map +1 -0
  612. package/dist/client/preview/use-collection-preview.d.mts +71 -0
  613. package/dist/client/preview/use-collection-preview.d.mts.map +1 -0
  614. package/dist/client/preview/use-collection-preview.mjs +114 -0
  615. package/dist/client/preview/use-collection-preview.mjs.map +1 -0
  616. package/dist/client/runtime/content-locales-provider.d.mts +1 -0
  617. package/dist/client/runtime/content-locales-provider.mjs +85 -0
  618. package/dist/client/runtime/content-locales-provider.mjs.map +1 -0
  619. package/dist/client/runtime/index.d.mts +7 -0
  620. package/dist/client/runtime/index.mjs +8 -0
  621. package/dist/client/runtime/locale-scope.d.mts +2 -0
  622. package/dist/{runtime-6VZM878K.mjs → client/runtime/locale-scope.mjs} +3 -4
  623. package/dist/client/runtime/locale-scope.mjs.map +1 -0
  624. package/dist/client/runtime/provider.d.mts +10107 -0
  625. package/dist/client/runtime/provider.d.mts.map +1 -0
  626. package/dist/client/runtime/provider.mjs +229 -0
  627. package/dist/client/runtime/provider.mjs.map +1 -0
  628. package/dist/client/runtime/routes.d.mts +49 -0
  629. package/dist/client/runtime/routes.d.mts.map +1 -0
  630. package/dist/client/runtime/routes.mjs +107 -0
  631. package/dist/client/runtime/routes.mjs.map +1 -0
  632. package/dist/client/runtime/translations-provider.d.mts +2 -0
  633. package/dist/client/runtime/translations-provider.mjs +181 -0
  634. package/dist/client/runtime/translations-provider.mjs.map +1 -0
  635. package/dist/client/scope/index.d.mts +3 -0
  636. package/dist/client/scope/picker.d.mts +54 -0
  637. package/dist/client/scope/picker.d.mts.map +1 -0
  638. package/dist/client/scope/picker.mjs +161 -0
  639. package/dist/client/scope/picker.mjs.map +1 -0
  640. package/dist/client/scope/provider.d.mts +104 -0
  641. package/dist/client/scope/provider.d.mts.map +1 -0
  642. package/dist/client/scope/provider.mjs +159 -0
  643. package/dist/client/scope/provider.mjs.map +1 -0
  644. package/dist/client/scope/types.d.mts +112 -0
  645. package/dist/client/scope/types.d.mts.map +1 -0
  646. package/dist/client/styles/index.css +80 -0
  647. package/dist/client/utils/auto-expand-fields.mjs +65 -0
  648. package/dist/client/utils/auto-expand-fields.mjs.map +1 -0
  649. package/dist/client/utils/build-field-definitions-from-schema.mjs +256 -0
  650. package/dist/client/utils/build-field-definitions-from-schema.mjs.map +1 -0
  651. package/dist/client/utils/detect-relations.mjs +46 -0
  652. package/dist/client/utils/detect-relations.mjs.map +1 -0
  653. package/dist/client/utils/locale-to-flag.d.mts +118 -0
  654. package/dist/client/utils/locale-to-flag.d.mts.map +1 -0
  655. package/dist/client/utils/locale-to-flag.mjs +130 -0
  656. package/dist/client/utils/locale-to-flag.mjs.map +1 -0
  657. package/dist/client/utils/routes.mjs +196 -0
  658. package/dist/client/utils/routes.mjs.map +1 -0
  659. package/dist/client/views/auth/accept-invite-form.d.mts +73 -0
  660. package/dist/client/views/auth/accept-invite-form.d.mts.map +1 -0
  661. package/dist/client/views/auth/accept-invite-form.mjs +180 -0
  662. package/dist/client/views/auth/accept-invite-form.mjs.map +1 -0
  663. package/dist/client/views/auth/auth-layout.d.mts +44 -0
  664. package/dist/client/views/auth/auth-layout.d.mts.map +1 -0
  665. package/dist/client/views/auth/auth-layout.mjs +53 -0
  666. package/dist/client/views/auth/auth-layout.mjs.map +1 -0
  667. package/dist/client/views/auth/forgot-password-form.d.mts +59 -0
  668. package/dist/client/views/auth/forgot-password-form.d.mts.map +1 -0
  669. package/dist/{forgot-password-page-Bcp-An4Y.mjs → client/views/auth/forgot-password-form.mjs} +22 -89
  670. package/dist/client/views/auth/forgot-password-form.mjs.map +1 -0
  671. package/dist/client/views/auth/index.d.mts +7 -0
  672. package/dist/client/views/auth/invite-form.d.mts +1 -0
  673. package/dist/client/views/auth/invite-form.mjs +155 -0
  674. package/dist/client/views/auth/invite-form.mjs.map +1 -0
  675. package/dist/client/views/auth/login-form.d.mts +76 -0
  676. package/dist/client/views/auth/login-form.d.mts.map +1 -0
  677. package/dist/client/views/auth/login-form.mjs +167 -0
  678. package/dist/client/views/auth/login-form.mjs.map +1 -0
  679. package/dist/client/views/auth/reset-password-form.d.mts +66 -0
  680. package/dist/client/views/auth/reset-password-form.d.mts.map +1 -0
  681. package/dist/client/views/auth/reset-password-form.mjs +188 -0
  682. package/dist/client/views/auth/reset-password-form.mjs.map +1 -0
  683. package/dist/client/views/auth/setup-form.d.mts +61 -0
  684. package/dist/client/views/auth/setup-form.d.mts.map +1 -0
  685. package/dist/{setup-page-YAP_fzqh.mjs → client/views/auth/setup-form.mjs} +46 -124
  686. package/dist/client/views/auth/setup-form.mjs.map +1 -0
  687. package/dist/client/views/collection/auto-form-fields.d.mts +4 -0
  688. package/dist/client/views/collection/auto-form-fields.mjs +453 -0
  689. package/dist/client/views/collection/auto-form-fields.mjs.map +1 -0
  690. package/dist/client/views/collection/bulk-action-toolbar.mjs +291 -0
  691. package/dist/client/views/collection/bulk-action-toolbar.mjs.map +1 -0
  692. package/dist/client/views/collection/cells/complex-cells.d.mts +46 -0
  693. package/dist/client/views/collection/cells/complex-cells.d.mts.map +1 -0
  694. package/dist/client/views/collection/cells/complex-cells.mjs +327 -0
  695. package/dist/client/views/collection/cells/complex-cells.mjs.map +1 -0
  696. package/dist/client/views/collection/cells/index.d.mts +7 -0
  697. package/dist/client/views/collection/cells/primitive-cells.d.mts +76 -0
  698. package/dist/client/views/collection/cells/primitive-cells.d.mts.map +1 -0
  699. package/dist/client/views/collection/cells/primitive-cells.mjs +165 -0
  700. package/dist/client/views/collection/cells/primitive-cells.mjs.map +1 -0
  701. package/dist/client/views/collection/cells/relation-cells.d.mts +21 -0
  702. package/dist/client/views/collection/cells/relation-cells.d.mts.map +1 -0
  703. package/dist/client/views/collection/cells/relation-cells.mjs +105 -0
  704. package/dist/client/views/collection/cells/relation-cells.mjs.map +1 -0
  705. package/dist/client/views/collection/cells/shared/asset-thumbnail.d.mts +1 -0
  706. package/dist/client/views/collection/cells/shared/asset-thumbnail.mjs +189 -0
  707. package/dist/client/views/collection/cells/shared/asset-thumbnail.mjs.map +1 -0
  708. package/dist/client/views/collection/cells/shared/cell-helpers.d.mts +2 -0
  709. package/dist/client/views/collection/cells/shared/cell-helpers.mjs +78 -0
  710. package/dist/client/views/collection/cells/shared/cell-helpers.mjs.map +1 -0
  711. package/dist/client/views/collection/cells/shared/relation-chip.d.mts +1 -0
  712. package/dist/client/views/collection/cells/shared/relation-chip.mjs +37 -0
  713. package/dist/client/views/collection/cells/shared/relation-chip.mjs.map +1 -0
  714. package/dist/client/views/collection/cells/upload-cells.d.mts +25 -0
  715. package/dist/client/views/collection/cells/upload-cells.d.mts.map +1 -0
  716. package/dist/client/views/collection/cells/upload-cells.mjs +20 -0
  717. package/dist/client/views/collection/cells/upload-cells.mjs.map +1 -0
  718. package/dist/client/views/collection/columns/build-columns.d.mts +2 -0
  719. package/dist/client/views/collection/columns/build-columns.mjs +156 -0
  720. package/dist/client/views/collection/columns/build-columns.mjs.map +1 -0
  721. package/dist/client/views/collection/columns/column-defaults.d.mts +2 -0
  722. package/dist/client/views/collection/columns/column-defaults.mjs +108 -0
  723. package/dist/client/views/collection/columns/column-defaults.mjs.map +1 -0
  724. package/dist/client/views/collection/columns/index.d.mts +3 -0
  725. package/dist/client/views/collection/columns/types.d.mts +2 -0
  726. package/dist/client/views/collection/field-context.mjs +127 -0
  727. package/dist/client/views/collection/field-context.mjs.map +1 -0
  728. package/dist/client/views/collection/field-renderer.mjs +171 -0
  729. package/dist/client/views/collection/field-renderer.mjs.map +1 -0
  730. package/dist/client/views/collection/form-view.d.mts +112 -0
  731. package/dist/client/views/collection/form-view.d.mts.map +1 -0
  732. package/dist/client/views/collection/form-view.mjs +903 -0
  733. package/dist/client/views/collection/form-view.mjs.map +1 -0
  734. package/dist/client/views/collection/index.d.mts +9 -0
  735. package/dist/client/views/collection/table-view.d.mts +102 -0
  736. package/dist/client/views/collection/table-view.d.mts.map +1 -0
  737. package/dist/client/views/collection/table-view.mjs +695 -0
  738. package/dist/client/views/collection/table-view.mjs.map +1 -0
  739. package/dist/client/views/collection/view-skeletons.mjs +121 -0
  740. package/dist/client/views/collection/view-skeletons.mjs.map +1 -0
  741. package/dist/client/views/common/global-search.d.mts +1 -0
  742. package/dist/client/views/common/global-search.mjs +376 -0
  743. package/dist/client/views/common/global-search.mjs.map +1 -0
  744. package/dist/client/views/common/index.d.mts +1 -0
  745. package/dist/client/views/dashboard/dashboard-grid.mjs +385 -0
  746. package/dist/client/views/dashboard/dashboard-grid.mjs.map +1 -0
  747. package/dist/client/views/dashboard/dashboard-widget.mjs +178 -0
  748. package/dist/client/views/dashboard/dashboard-widget.mjs.map +1 -0
  749. package/dist/client/views/dashboard/widget-card.mjs +159 -0
  750. package/dist/client/views/dashboard/widget-card.mjs.map +1 -0
  751. package/dist/client/views/globals/global-form-view.d.mts +74 -0
  752. package/dist/client/views/globals/global-form-view.d.mts.map +1 -0
  753. package/dist/client/views/globals/global-form-view.mjs +181 -0
  754. package/dist/client/views/globals/global-form-view.mjs.map +1 -0
  755. package/dist/client/views/index.d.mts +28 -0
  756. package/dist/client/views/layout/admin-layout-provider.d.mts +140 -0
  757. package/dist/client/views/layout/admin-layout-provider.d.mts.map +1 -0
  758. package/dist/client/views/layout/admin-layout-provider.mjs +90 -0
  759. package/dist/client/views/layout/admin-layout-provider.mjs.map +1 -0
  760. package/dist/client/views/layout/admin-layout.d.mts +151 -0
  761. package/dist/client/views/layout/admin-layout.d.mts.map +1 -0
  762. package/dist/client/views/layout/admin-layout.mjs +144 -0
  763. package/dist/client/views/layout/admin-layout.mjs.map +1 -0
  764. package/dist/client/views/layout/admin-root.d.mts +7 -0
  765. package/dist/client/views/layout/admin-router.d.mts +125 -0
  766. package/dist/client/views/layout/admin-router.d.mts.map +1 -0
  767. package/dist/client/views/layout/admin-router.mjs +594 -0
  768. package/dist/client/views/layout/admin-router.mjs.map +1 -0
  769. package/dist/client/views/layout/admin-sidebar.d.mts +105 -0
  770. package/dist/client/views/layout/admin-sidebar.d.mts.map +1 -0
  771. package/dist/client/views/layout/admin-sidebar.mjs +550 -0
  772. package/dist/client/views/layout/admin-sidebar.mjs.map +1 -0
  773. package/dist/client/views/layout/admin-topbar.mjs +128 -0
  774. package/dist/client/views/layout/admin-topbar.mjs.map +1 -0
  775. package/dist/client/views/layout/index.d.mts +5 -0
  776. package/dist/client/views/pages/accept-invite-page.d.mts +67 -0
  777. package/dist/client/views/pages/accept-invite-page.d.mts.map +1 -0
  778. package/dist/client/views/pages/accept-invite-page.mjs +143 -0
  779. package/dist/client/views/pages/accept-invite-page.mjs.map +1 -0
  780. package/dist/client/views/pages/dashboard-page.d.mts +52 -0
  781. package/dist/client/views/pages/dashboard-page.d.mts.map +1 -0
  782. package/dist/client/views/pages/dashboard-page.mjs +45 -0
  783. package/dist/client/views/pages/dashboard-page.mjs.map +1 -0
  784. package/dist/client/views/pages/forgot-password-page.d.mts +59 -0
  785. package/dist/client/views/pages/forgot-password-page.d.mts.map +1 -0
  786. package/dist/client/views/pages/forgot-password-page.mjs +80 -0
  787. package/dist/client/views/pages/forgot-password-page.mjs.map +1 -0
  788. package/dist/client/views/pages/index.d.mts +7 -0
  789. package/dist/client/views/pages/invite-page.d.mts +71 -0
  790. package/dist/client/views/pages/invite-page.d.mts.map +1 -0
  791. package/dist/client/views/pages/invite-page.mjs +86 -0
  792. package/dist/client/views/pages/invite-page.mjs.map +1 -0
  793. package/dist/client/views/pages/login-page.d.mts +76 -0
  794. package/dist/client/views/pages/login-page.d.mts.map +1 -0
  795. package/dist/client/views/pages/login-page.mjs +98 -0
  796. package/dist/client/views/pages/login-page.mjs.map +1 -0
  797. package/dist/client/views/pages/reset-password-page.d.mts +66 -0
  798. package/dist/client/views/pages/reset-password-page.d.mts.map +1 -0
  799. package/dist/client/views/pages/reset-password-page.mjs +105 -0
  800. package/dist/client/views/pages/reset-password-page.mjs.map +1 -0
  801. package/dist/client/views/pages/setup-page.d.mts +64 -0
  802. package/dist/client/views/pages/setup-page.d.mts.map +1 -0
  803. package/dist/client/views/pages/setup-page.mjs +91 -0
  804. package/dist/client/views/pages/setup-page.mjs.map +1 -0
  805. package/dist/client.d.mts +92 -3
  806. package/dist/client.d.mts.map +1 -0
  807. package/dist/client.mjs +54 -12
  808. package/dist/components/rich-text/index.d.mts +1 -0
  809. package/dist/components/rich-text/rich-text-renderer.d.mts +104 -0
  810. package/dist/components/rich-text/rich-text-renderer.d.mts.map +1 -0
  811. package/dist/components/rich-text/rich-text-renderer.mjs +210 -0
  812. package/dist/components/rich-text/rich-text-renderer.mjs.map +1 -0
  813. package/dist/index.d.mts +62 -3
  814. package/dist/index.mjs +54 -12
  815. package/dist/server/adapters/nextjs.d.mts +121 -0
  816. package/dist/server/adapters/nextjs.d.mts.map +1 -0
  817. package/dist/server/adapters/nextjs.mjs +111 -0
  818. package/dist/server/adapters/nextjs.mjs.map +1 -0
  819. package/dist/server/adapters/tanstack.d.mts +133 -0
  820. package/dist/server/adapters/tanstack.d.mts.map +1 -0
  821. package/dist/server/adapters/tanstack.mjs +90 -0
  822. package/dist/server/adapters/tanstack.mjs.map +1 -0
  823. package/dist/server/augmentation.d.mts +1523 -0
  824. package/dist/server/augmentation.d.mts.map +1 -0
  825. package/dist/server/auth-helpers.d.mts +143 -0
  826. package/dist/server/auth-helpers.d.mts.map +1 -0
  827. package/dist/server/auth-helpers.mjs +108 -0
  828. package/dist/server/auth-helpers.mjs.map +1 -0
  829. package/dist/server/block/block-builder.d.mts +319 -0
  830. package/dist/server/block/block-builder.d.mts.map +1 -0
  831. package/dist/server/block/block-builder.mjs +217 -0
  832. package/dist/server/block/block-builder.mjs.map +1 -0
  833. package/dist/server/block/index.d.mts +3 -0
  834. package/dist/server/block/introspection.d.mts +84 -0
  835. package/dist/server/block/introspection.d.mts.map +1 -0
  836. package/dist/server/block/introspection.mjs +89 -0
  837. package/dist/server/block/introspection.mjs.map +1 -0
  838. package/dist/server/block/prefetch.d.mts +78 -0
  839. package/dist/server/block/prefetch.d.mts.map +1 -0
  840. package/dist/server/block/prefetch.mjs +240 -0
  841. package/dist/server/block/prefetch.mjs.map +1 -0
  842. package/dist/server/fields/blocks.d.mts +139 -0
  843. package/dist/server/fields/blocks.d.mts.map +1 -0
  844. package/dist/server/fields/blocks.mjs +192 -0
  845. package/dist/server/fields/blocks.mjs.map +1 -0
  846. package/dist/server/fields/index.d.mts +48 -0
  847. package/dist/server/fields/index.d.mts.map +1 -0
  848. package/dist/server/fields/index.mjs +16 -0
  849. package/dist/server/fields/index.mjs.map +1 -0
  850. package/dist/server/fields/rich-text.d.mts +135 -0
  851. package/dist/server/fields/rich-text.d.mts.map +1 -0
  852. package/dist/server/fields/rich-text.mjs +188 -0
  853. package/dist/server/fields/rich-text.mjs.map +1 -0
  854. package/dist/server/i18n/index.d.mts +16 -0
  855. package/dist/server/i18n/index.d.mts.map +1 -0
  856. package/dist/server/i18n/index.mjs +44 -0
  857. package/dist/server/i18n/index.mjs.map +1 -0
  858. package/dist/server/i18n/messages/cs.mjs +461 -0
  859. package/dist/server/i18n/messages/cs.mjs.map +1 -0
  860. package/dist/server/i18n/messages/de.mjs +461 -0
  861. package/dist/server/i18n/messages/de.mjs.map +1 -0
  862. package/dist/server/i18n/messages/en.mjs +493 -0
  863. package/dist/server/i18n/messages/en.mjs.map +1 -0
  864. package/dist/server/i18n/messages/es.mjs +461 -0
  865. package/dist/server/i18n/messages/es.mjs.map +1 -0
  866. package/dist/server/i18n/messages/fr.mjs +461 -0
  867. package/dist/server/i18n/messages/fr.mjs.map +1 -0
  868. package/dist/server/i18n/messages/index.mjs +24 -0
  869. package/dist/server/i18n/messages/index.mjs.map +1 -0
  870. package/dist/server/i18n/messages/pl.mjs +461 -0
  871. package/dist/server/i18n/messages/pl.mjs.map +1 -0
  872. package/dist/server/i18n/messages/pt.mjs +464 -0
  873. package/dist/server/i18n/messages/pt.mjs.map +1 -0
  874. package/dist/server/i18n/messages/sk.mjs +490 -0
  875. package/dist/server/i18n/messages/sk.mjs.map +1 -0
  876. package/dist/server/index.d.mts +20 -0
  877. package/dist/server/modules/admin/functions/admin-config.mjs +348 -0
  878. package/dist/server/modules/admin/functions/admin-config.mjs.map +1 -0
  879. package/dist/server/modules/admin/functions/execute-action.d.mts +107 -0
  880. package/dist/server/modules/admin/functions/execute-action.d.mts.map +1 -0
  881. package/dist/server/modules/admin/functions/execute-action.mjs +331 -0
  882. package/dist/server/modules/admin/functions/execute-action.mjs.map +1 -0
  883. package/dist/server/modules/admin/functions/locales.mjs +80 -0
  884. package/dist/server/modules/admin/functions/locales.mjs.map +1 -0
  885. package/dist/server/modules/admin/functions/preview.d.mts +70 -0
  886. package/dist/server/modules/admin/functions/preview.d.mts.map +1 -0
  887. package/dist/server/modules/admin/functions/preview.mjs +243 -0
  888. package/dist/server/modules/admin/functions/preview.mjs.map +1 -0
  889. package/dist/server/modules/admin/functions/reactive.d.mts +99 -0
  890. package/dist/server/modules/admin/functions/reactive.d.mts.map +1 -0
  891. package/dist/server/modules/admin/functions/reactive.mjs +378 -0
  892. package/dist/server/modules/admin/functions/reactive.mjs.map +1 -0
  893. package/dist/server/modules/admin/functions/setup.d.mts +84 -0
  894. package/dist/server/modules/admin/functions/setup.d.mts.map +1 -0
  895. package/dist/server/modules/admin/functions/setup.mjs +131 -0
  896. package/dist/server/modules/admin/functions/setup.mjs.map +1 -0
  897. package/dist/server/modules/admin/functions/translations.mjs +125 -0
  898. package/dist/server/modules/admin/functions/translations.mjs.map +1 -0
  899. package/dist/server/modules/admin/functions/widget-data.d.mts +33 -0
  900. package/dist/server/modules/admin/functions/widget-data.d.mts.map +1 -0
  901. package/dist/server/modules/admin/functions/widget-data.mjs +70 -0
  902. package/dist/server/modules/admin/functions/widget-data.mjs.map +1 -0
  903. package/dist/server/modules/admin/index.d.mts +16879 -0
  904. package/dist/server/modules/admin/index.d.mts.map +1 -0
  905. package/dist/server/modules/admin/index.mjs +249 -0
  906. package/dist/server/modules/admin/index.mjs.map +1 -0
  907. package/dist/server/modules/admin-preferences/collections/admin-preferences.collection.d.mts +3 -0
  908. package/dist/server/modules/admin-preferences/collections/admin-preferences.collection.mjs +48 -0
  909. package/dist/server/modules/admin-preferences/collections/admin-preferences.collection.mjs.map +1 -0
  910. package/dist/server/modules/admin-preferences/collections/locks.collection.d.mts +3 -0
  911. package/dist/server/modules/admin-preferences/collections/locks.collection.mjs +79 -0
  912. package/dist/server/modules/admin-preferences/collections/locks.collection.mjs.map +1 -0
  913. package/dist/server/modules/admin-preferences/collections/saved-views.collection.d.mts +1490 -0
  914. package/dist/server/modules/admin-preferences/collections/saved-views.collection.d.mts.map +1 -0
  915. package/dist/server/modules/admin-preferences/collections/saved-views.collection.mjs +57 -0
  916. package/dist/server/modules/admin-preferences/collections/saved-views.collection.mjs.map +1 -0
  917. package/dist/server/patch.d.mts +100 -0
  918. package/dist/server/patch.d.mts.map +1 -0
  919. package/dist/server/patch.mjs +1062 -0
  920. package/dist/server/patch.mjs.map +1 -0
  921. package/dist/server.d.mts +21 -250
  922. package/dist/server.mjs +19 -832
  923. package/dist/shared/preview-utils.d.mts +54 -0
  924. package/dist/shared/preview-utils.d.mts.map +1 -0
  925. package/dist/{preview-utils-BKQ9-TMa.mjs → shared/preview-utils.mjs} +2 -2
  926. package/dist/shared/preview-utils.mjs.map +1 -0
  927. package/dist/{saved-views.types-BMsz5mCy.d.mts → shared/types/saved-views.types.d.mts} +7 -2
  928. package/dist/shared/types/saved-views.types.d.mts.map +1 -0
  929. package/dist/shared.d.mts +3 -57
  930. package/dist/shared.mjs +1 -1
  931. package/package.json +12 -17
  932. package/dist/auth-layout-M8K8_q5R.mjs +0 -181
  933. package/dist/auth-layout-M8K8_q5R.mjs.map +0 -1
  934. package/dist/bulk-upload-dialog-D7w7W1Hl.mjs +0 -273
  935. package/dist/bulk-upload-dialog-D7w7W1Hl.mjs.map +0 -1
  936. package/dist/client-D1DqawtP.d.mts +0 -13403
  937. package/dist/client-D1DqawtP.d.mts.map +0 -1
  938. package/dist/client-njX1rZmi.mjs +0 -22612
  939. package/dist/client-njX1rZmi.mjs.map +0 -1
  940. package/dist/content-locales-provider-BXvuIgfg.mjs +0 -1650
  941. package/dist/content-locales-provider-BXvuIgfg.mjs.map +0 -1
  942. package/dist/dashboard-page-B4PGEdc2.mjs +0 -2500
  943. package/dist/dashboard-page-B4PGEdc2.mjs.map +0 -1
  944. package/dist/dashboard-page-mCY0pgZv.mjs +0 -3
  945. package/dist/dropzone-Do3awXKd.mjs +0 -634
  946. package/dist/dropzone-Do3awXKd.mjs.map +0 -1
  947. package/dist/forgot-password-page-Bcp-An4Y.mjs.map +0 -1
  948. package/dist/forgot-password-page-CEwsdLwn.mjs +0 -3
  949. package/dist/index-B4H3amCD.d.mts +0 -2753
  950. package/dist/index-B4H3amCD.d.mts.map +0 -1
  951. package/dist/login-page-BUnpCbCa.mjs +0 -3
  952. package/dist/login-page-CP4gA-dl.mjs +0 -298
  953. package/dist/login-page-CP4gA-dl.mjs.map +0 -1
  954. package/dist/preview-utils-BKQ9-TMa.mjs.map +0 -1
  955. package/dist/reset-password-page-BqfDmLxA.mjs +0 -281
  956. package/dist/reset-password-page-BqfDmLxA.mjs.map +0 -1
  957. package/dist/reset-password-page-CufHz3h3.mjs +0 -3
  958. package/dist/runtime-6VZM878K.mjs.map +0 -1
  959. package/dist/saved-views.types-BMsz5mCy.d.mts.map +0 -1
  960. package/dist/server.d.mts.map +0 -1
  961. package/dist/server.mjs.map +0 -1
  962. package/dist/setup-page-BNNzt_Z6.mjs +0 -3
  963. package/dist/setup-page-YAP_fzqh.mjs.map +0 -1
  964. package/dist/shared.d.mts.map +0 -1
  965. package/dist/use-auth-BoLmWtmU.mjs.map +0 -1
@@ -0,0 +1,256 @@
1
+ "use client";
2
+
3
+ import { useResolveText } from "../../i18n/hooks.mjs";
4
+ import { cn } from "../../lib/utils.mjs";
5
+ import { useIsMobile } from "../../hooks/use-media-query.mjs";
6
+ import { Drawer, DrawerContent, DrawerHeader, DrawerTitle, DrawerTrigger } from "../ui/drawer.mjs";
7
+ import { Badge } from "../ui/badge.mjs";
8
+ import { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList } from "../ui/command.mjs";
9
+ import { Popover, PopoverContent, PopoverTrigger } from "../ui/popover.mjs";
10
+ import { flattenOptions } from "./types.mjs";
11
+ import { Icon } from "@iconify/react";
12
+ import { useCallback, useEffect, useMemo, useRef, useState } from "react";
13
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
14
+
15
+ //#region src/client/components/primitives/select-multi.tsx
16
+ /**
17
+ * SelectMulti - Multi-select component with chips
18
+ *
19
+ * Features:
20
+ * - Always searchable
21
+ * - Responsive: Popover on desktop, Drawer on mobile
22
+ * - Chip display with remove buttons
23
+ * - Supports static and async options
24
+ * - Keyboard navigation
25
+ *
26
+ * @example
27
+ * ```tsx
28
+ * <SelectMulti
29
+ * value={selectedTags}
30
+ * onChange={setSelectedTags}
31
+ * options={[
32
+ * { value: "react", label: "React" },
33
+ * { value: "vue", label: "Vue" },
34
+ * { value: "angular", label: "Angular" },
35
+ * ]}
36
+ * />
37
+ * ```
38
+ */
39
+ function SelectMulti({ value = [], onChange, options: staticOptions = [], loadOptions, maxSelections, debounceMs = 300, loading: externalLoading = false, emptyMessage = "No options found", placeholder = "Select...", disabled, className, id, "aria-invalid": ariaInvalid, drawerTitle = "Select options", maxVisibleChips = 3 }) {
40
+ const resolveText = useResolveText();
41
+ const resolvedPlaceholder = resolveText(placeholder);
42
+ const resolvedEmptyMessage = resolveText(emptyMessage);
43
+ const resolvedDrawerTitle = resolveText(drawerTitle);
44
+ const [open, setOpen] = useState(false);
45
+ const [search, setSearch] = useState("");
46
+ const [dynamicOptions, setDynamicOptions] = useState([]);
47
+ const [isLoading, setIsLoading] = useState(false);
48
+ const debounceRef = useRef(null);
49
+ const isMobile = useIsMobile();
50
+ const flatStaticOptions = useMemo(() => flattenOptions(staticOptions), [staticOptions]);
51
+ const allOptions = useMemo(() => {
52
+ if (loadOptions) return dynamicOptions;
53
+ return flatStaticOptions;
54
+ }, [
55
+ loadOptions,
56
+ dynamicOptions,
57
+ flatStaticOptions
58
+ ]);
59
+ const filteredOptions = useMemo(() => {
60
+ if (loadOptions) return allOptions;
61
+ if (!search) return allOptions;
62
+ return allOptions.filter((opt) => resolveText(opt.label).toLowerCase().includes(search.toLowerCase()));
63
+ }, [
64
+ allOptions,
65
+ search,
66
+ loadOptions,
67
+ resolveText
68
+ ]);
69
+ useEffect(() => {
70
+ if (!loadOptions) return;
71
+ if (debounceRef.current) clearTimeout(debounceRef.current);
72
+ debounceRef.current = setTimeout(async () => {
73
+ setIsLoading(true);
74
+ try {
75
+ setDynamicOptions(await loadOptions(search));
76
+ } catch (error) {
77
+ console.error("Failed to load options:", error);
78
+ setDynamicOptions([]);
79
+ } finally {
80
+ setIsLoading(false);
81
+ }
82
+ }, debounceMs);
83
+ return () => {
84
+ if (debounceRef.current) clearTimeout(debounceRef.current);
85
+ };
86
+ }, [
87
+ search,
88
+ loadOptions,
89
+ debounceMs
90
+ ]);
91
+ const getLabel = useCallback((val) => {
92
+ const option = allOptions.find((opt) => opt.value === val);
93
+ return option?.label ? resolveText(option.label) : String(val);
94
+ }, [allOptions, resolveText]);
95
+ const handleToggle = useCallback((selectedValue) => {
96
+ const typedValue = selectedValue;
97
+ if (value.includes(typedValue)) onChange(value.filter((v) => v !== typedValue));
98
+ else {
99
+ if (maxSelections && value.length >= maxSelections) return;
100
+ onChange([...value, typedValue]);
101
+ }
102
+ }, [
103
+ value,
104
+ onChange,
105
+ maxSelections
106
+ ]);
107
+ const handleRemove = useCallback((removedValue, e) => {
108
+ e?.stopPropagation();
109
+ onChange(value.filter((v) => v !== removedValue));
110
+ }, [value, onChange]);
111
+ const handleClearAll = useCallback((e) => {
112
+ e.stopPropagation();
113
+ onChange([]);
114
+ }, [onChange]);
115
+ const showLoading = isLoading || externalLoading;
116
+ const canAddMore = !maxSelections || value.length < maxSelections;
117
+ const visibleChips = value.slice(0, maxVisibleChips);
118
+ const hiddenCount = value.length - maxVisibleChips;
119
+ const TriggerContent = /* @__PURE__ */ jsxs("div", {
120
+ id,
121
+ role: "combobox",
122
+ "aria-controls": "select-multi-list",
123
+ "aria-haspopup": "listbox",
124
+ "aria-expanded": open,
125
+ "aria-invalid": ariaInvalid,
126
+ tabIndex: 0,
127
+ className: cn("flex min-h-9 w-full flex-wrap items-center gap-1 rounded-md border border-input/80 bg-input/20 backdrop-blur-sm px-3 py-1.5 text-sm transition-colors", "focus-within:ring-2 focus-within:ring-ring focus-within:border-ring", disabled && "cursor-not-allowed opacity-50", ariaInvalid && "border-destructive ring-destructive/20", className),
128
+ children: [value.length === 0 ? /* @__PURE__ */ jsx("span", {
129
+ className: "text-muted-foreground text-xs",
130
+ children: resolvedPlaceholder
131
+ }) : /* @__PURE__ */ jsxs(Fragment, { children: [visibleChips.map((val) => /* @__PURE__ */ jsxs(Badge, {
132
+ variant: "secondary",
133
+ className: "gap-1 pr-1",
134
+ children: [/* @__PURE__ */ jsx("span", {
135
+ className: "truncate max-w-24",
136
+ children: getLabel(val)
137
+ }), !disabled && /* @__PURE__ */ jsx("button", {
138
+ type: "button",
139
+ onClick: (e) => handleRemove(val, e),
140
+ className: "rounded-full hover:bg-muted-foreground/20 p-0.5",
141
+ children: /* @__PURE__ */ jsx(Icon, {
142
+ icon: "ph:x",
143
+ className: "size-2.5"
144
+ })
145
+ })]
146
+ }, String(val))), hiddenCount > 0 && /* @__PURE__ */ jsxs(Badge, {
147
+ variant: "outline",
148
+ className: "text-muted-foreground",
149
+ children: [
150
+ "+",
151
+ hiddenCount,
152
+ " more"
153
+ ]
154
+ })] }), /* @__PURE__ */ jsxs("div", {
155
+ className: "ml-auto flex items-center gap-1 shrink-0",
156
+ children: [value.length > 0 && !disabled && /* @__PURE__ */ jsx("button", {
157
+ type: "button",
158
+ onClick: handleClearAll,
159
+ className: "rounded-sm opacity-50 hover:opacity-100 hover:bg-muted p-0.5",
160
+ children: /* @__PURE__ */ jsx(Icon, {
161
+ icon: "ph:x",
162
+ className: "size-3"
163
+ })
164
+ }), /* @__PURE__ */ jsx(Icon, {
165
+ icon: "ph:plus",
166
+ className: "size-3.5 opacity-50"
167
+ })]
168
+ })]
169
+ });
170
+ const CommandContent = /* @__PURE__ */ jsxs(Command, {
171
+ shouldFilter: !loadOptions,
172
+ children: [
173
+ /* @__PURE__ */ jsx(CommandInput, {
174
+ placeholder: "Search...",
175
+ value: search,
176
+ onValueChange: setSearch
177
+ }),
178
+ /* @__PURE__ */ jsxs(CommandList, { children: [
179
+ showLoading && /* @__PURE__ */ jsx("div", {
180
+ className: "flex items-center justify-center py-6",
181
+ children: /* @__PURE__ */ jsx(Icon, {
182
+ icon: "ph:circle-notch",
183
+ className: "size-4 animate-spin text-muted-foreground"
184
+ })
185
+ }),
186
+ /* @__PURE__ */ jsx(CommandEmpty, { children: resolvedEmptyMessage }),
187
+ /* @__PURE__ */ jsx(CommandGroup, { children: filteredOptions.map((option) => {
188
+ const isSelected = value.includes(option.value);
189
+ const isDisabled = option.disabled || !isSelected && !canAddMore;
190
+ return /* @__PURE__ */ jsxs(CommandItem, {
191
+ value: String(option.value),
192
+ onSelect: handleToggle,
193
+ disabled: isDisabled,
194
+ children: [
195
+ /* @__PURE__ */ jsx("div", {
196
+ className: cn("flex size-4 items-center justify-center rounded-sm border", isSelected ? "bg-primary border-primary text-primary-foreground" : "border-muted-foreground/30"),
197
+ children: isSelected && /* @__PURE__ */ jsx(Icon, {
198
+ icon: "ph:check",
199
+ className: "size-3"
200
+ })
201
+ }),
202
+ option.icon,
203
+ /* @__PURE__ */ jsx("span", {
204
+ className: "truncate",
205
+ children: resolveText(option.label)
206
+ })
207
+ ]
208
+ }, String(option.value));
209
+ }) })
210
+ ] }),
211
+ maxSelections && /* @__PURE__ */ jsxs("div", {
212
+ className: "border-t p-2 text-center text-xs text-muted-foreground",
213
+ children: [
214
+ value.length,
215
+ " / ",
216
+ maxSelections,
217
+ " selected"
218
+ ]
219
+ })
220
+ ]
221
+ });
222
+ if (isMobile) return /* @__PURE__ */ jsxs(Drawer, {
223
+ open,
224
+ onOpenChange: setOpen,
225
+ children: [/* @__PURE__ */ jsx(DrawerTrigger, {
226
+ asChild: true,
227
+ children: /* @__PURE__ */ jsx("button", {
228
+ type: "button",
229
+ disabled,
230
+ className: "w-full text-left",
231
+ children: TriggerContent
232
+ })
233
+ }), /* @__PURE__ */ jsxs(DrawerContent, { children: [/* @__PURE__ */ jsx(DrawerHeader, { children: /* @__PURE__ */ jsx(DrawerTitle, { children: resolvedDrawerTitle }) }), /* @__PURE__ */ jsx("div", {
234
+ className: "px-4 pb-6",
235
+ children: CommandContent
236
+ })] })]
237
+ });
238
+ return /* @__PURE__ */ jsxs(Popover, {
239
+ open,
240
+ onOpenChange: setOpen,
241
+ children: [/* @__PURE__ */ jsx(PopoverTrigger, { render: /* @__PURE__ */ jsx("button", {
242
+ type: "button",
243
+ disabled,
244
+ className: "w-full text-left",
245
+ children: TriggerContent
246
+ }) }), /* @__PURE__ */ jsx(PopoverContent, {
247
+ className: "w-(--anchor-width) p-0",
248
+ align: "start",
249
+ children: CommandContent
250
+ })]
251
+ });
252
+ }
253
+
254
+ //#endregion
255
+ export { SelectMulti };
256
+ //# sourceMappingURL=select-multi.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"select-multi.mjs","names":[],"sources":["../../../../src/client/components/primitives/select-multi.tsx"],"sourcesContent":["\"use client\";\n\nimport { Icon } from \"@iconify/react\";\nimport type * as React from \"react\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { useIsMobile } from \"../../hooks/use-media-query\";\nimport { useResolveText } from \"../../i18n/hooks\";\nimport { cn } from \"../../lib/utils\";\nimport { Badge } from \"../ui/badge\";\nimport {\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n} from \"../ui/command\";\nimport {\n Drawer,\n DrawerContent,\n DrawerHeader,\n DrawerTitle,\n DrawerTrigger,\n} from \"../ui/drawer\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"../ui/popover\";\nimport type { BasePrimitiveProps, SelectOption, SelectOptions } from \"./types\";\nimport { flattenOptions } from \"./types\";\n\nexport interface SelectMultiProps<\n TValue extends string = string,\n> extends BasePrimitiveProps {\n /** Selected values */\n value: TValue[];\n /** Change handler */\n onChange: (value: TValue[]) => void;\n /** Static options */\n options?: SelectOptions<TValue>;\n /** Dynamic options loader */\n loadOptions?: (search: string) => Promise<SelectOption<TValue>[]>;\n /** Max selections */\n maxSelections?: number;\n /** Debounce delay for loadOptions (ms) */\n debounceMs?: number;\n /** External loading state */\n loading?: boolean;\n /** Empty state message */\n emptyMessage?: string;\n /** Title for mobile drawer */\n drawerTitle?: string;\n /** Max visible chips before collapsing */\n maxVisibleChips?: number;\n}\n\n/**\n * SelectMulti - Multi-select component with chips\n *\n * Features:\n * - Always searchable\n * - Responsive: Popover on desktop, Drawer on mobile\n * - Chip display with remove buttons\n * - Supports static and async options\n * - Keyboard navigation\n *\n * @example\n * ```tsx\n * <SelectMulti\n * value={selectedTags}\n * onChange={setSelectedTags}\n * options={[\n * { value: \"react\", label: \"React\" },\n * { value: \"vue\", label: \"Vue\" },\n * { value: \"angular\", label: \"Angular\" },\n * ]}\n * />\n * ```\n */\nexport function SelectMulti<TValue extends string = string>({\n value = [],\n onChange,\n options: staticOptions = [],\n loadOptions,\n maxSelections,\n debounceMs = 300,\n loading: externalLoading = false,\n emptyMessage = \"No options found\",\n placeholder = \"Select...\",\n disabled,\n className,\n id,\n \"aria-invalid\": ariaInvalid,\n drawerTitle = \"Select options\",\n maxVisibleChips = 3,\n}: SelectMultiProps<TValue>) {\n const resolveText = useResolveText();\n const resolvedPlaceholder = resolveText(placeholder);\n const resolvedEmptyMessage = resolveText(emptyMessage);\n const resolvedDrawerTitle = resolveText(drawerTitle);\n const [open, setOpen] = useState(false);\n const [search, setSearch] = useState(\"\");\n const [dynamicOptions, setDynamicOptions] = useState<SelectOption<TValue>[]>(\n [],\n );\n const [isLoading, setIsLoading] = useState(false);\n const debounceRef = useRef<ReturnType<typeof setTimeout>>(null);\n const isMobile = useIsMobile();\n\n // Flatten static options\n const flatStaticOptions = useMemo(\n () => flattenOptions(staticOptions),\n [staticOptions],\n );\n\n // Merge static and dynamic options\n const allOptions = useMemo(() => {\n if (loadOptions) {\n return dynamicOptions;\n }\n return flatStaticOptions;\n }, [loadOptions, dynamicOptions, flatStaticOptions]);\n\n // Filter options by search (for static options)\n const filteredOptions = useMemo(() => {\n if (loadOptions) {\n return allOptions;\n }\n if (!search) {\n return allOptions;\n }\n return allOptions.filter((opt) =>\n resolveText(opt.label).toLowerCase().includes(search.toLowerCase()),\n );\n }, [allOptions, search, loadOptions, resolveText]);\n\n // Load dynamic options\n useEffect(() => {\n if (!loadOptions) return;\n\n if (debounceRef.current) {\n clearTimeout(debounceRef.current);\n }\n\n debounceRef.current = setTimeout(async () => {\n setIsLoading(true);\n try {\n const results = await loadOptions(search);\n setDynamicOptions(results);\n } catch (error) {\n console.error(\"Failed to load options:\", error);\n setDynamicOptions([]);\n } finally {\n setIsLoading(false);\n }\n }, debounceMs);\n\n return () => {\n if (debounceRef.current) {\n clearTimeout(debounceRef.current);\n }\n };\n }, [search, loadOptions, debounceMs]);\n\n // Get label for a value\n const getLabel = useCallback(\n (val: TValue): string => {\n const option = allOptions.find((opt) => opt.value === val);\n return option?.label ? resolveText(option.label) : String(val);\n },\n [allOptions, resolveText],\n );\n\n const handleToggle = useCallback(\n (selectedValue: string) => {\n const typedValue = selectedValue as TValue;\n const isSelected = value.includes(typedValue);\n\n if (isSelected) {\n onChange(value.filter((v) => v !== typedValue));\n } else {\n if (maxSelections && value.length >= maxSelections) return;\n onChange([...value, typedValue]);\n }\n },\n [value, onChange, maxSelections],\n );\n\n const handleRemove = useCallback(\n (removedValue: TValue, e?: React.MouseEvent) => {\n e?.stopPropagation();\n onChange(value.filter((v) => v !== removedValue));\n },\n [value, onChange],\n );\n\n const handleClearAll = useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation();\n onChange([]);\n },\n [onChange],\n );\n\n const showLoading = isLoading || externalLoading;\n const canAddMore = !maxSelections || value.length < maxSelections;\n\n // Visible and hidden chips\n const visibleChips = value.slice(0, maxVisibleChips);\n const hiddenCount = value.length - maxVisibleChips;\n\n const TriggerContent = (\n <div\n id={id}\n role=\"combobox\"\n aria-controls=\"select-multi-list\"\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n aria-invalid={ariaInvalid}\n tabIndex={0}\n className={cn(\n \"flex min-h-9 w-full flex-wrap items-center gap-1 rounded-md border border-input/80 bg-input/20 backdrop-blur-sm px-3 py-1.5 text-sm transition-colors\",\n \"focus-within:ring-2 focus-within:ring-ring focus-within:border-ring\",\n disabled && \"cursor-not-allowed opacity-50\",\n ariaInvalid && \"border-destructive ring-destructive/20\",\n className,\n )}\n >\n {value.length === 0 ? (\n <span className=\"text-muted-foreground text-xs\">\n {resolvedPlaceholder}\n </span>\n ) : (\n <>\n {visibleChips.map((val) => (\n <Badge key={String(val)} variant=\"secondary\" className=\"gap-1 pr-1\">\n <span className=\"truncate max-w-24\">{getLabel(val)}</span>\n {!disabled && (\n <button\n type=\"button\"\n onClick={(e) => handleRemove(val, e)}\n className=\"rounded-full hover:bg-muted-foreground/20 p-0.5\"\n >\n <Icon icon=\"ph:x\" className=\"size-2.5\" />\n </button>\n )}\n </Badge>\n ))}\n {hiddenCount > 0 && (\n <Badge variant=\"outline\" className=\"text-muted-foreground\">\n +{hiddenCount} more\n </Badge>\n )}\n </>\n )}\n <div className=\"ml-auto flex items-center gap-1 shrink-0\">\n {value.length > 0 && !disabled && (\n <button\n type=\"button\"\n onClick={handleClearAll}\n className=\"rounded-sm opacity-50 hover:opacity-100 hover:bg-muted p-0.5\"\n >\n <Icon icon=\"ph:x\" className=\"size-3\" />\n </button>\n )}\n <Icon icon=\"ph:plus\" className=\"size-3.5 opacity-50\" />\n </div>\n </div>\n );\n\n const CommandContent = (\n <Command shouldFilter={!loadOptions}>\n <CommandInput\n placeholder=\"Search...\"\n value={search}\n onValueChange={setSearch}\n />\n <CommandList>\n {showLoading && (\n <div className=\"flex items-center justify-center py-6\">\n <Icon\n icon=\"ph:circle-notch\"\n className=\"size-4 animate-spin text-muted-foreground\"\n />\n </div>\n )}\n <CommandEmpty>{resolvedEmptyMessage}</CommandEmpty>\n <CommandGroup>\n {filteredOptions.map((option) => {\n const isSelected = value.includes(option.value);\n const isDisabled = option.disabled || (!isSelected && !canAddMore);\n\n return (\n <CommandItem\n key={String(option.value)}\n value={String(option.value)}\n onSelect={handleToggle}\n disabled={isDisabled}\n >\n <div\n className={cn(\n \"flex size-4 items-center justify-center rounded-sm border\",\n isSelected\n ? \"bg-primary border-primary text-primary-foreground\"\n : \"border-muted-foreground/30\",\n )}\n >\n {isSelected && <Icon icon=\"ph:check\" className=\"size-3\" />}\n </div>\n {option.icon}\n <span className=\"truncate\">{resolveText(option.label)}</span>\n </CommandItem>\n );\n })}\n </CommandGroup>\n </CommandList>\n {maxSelections && (\n <div className=\"border-t p-2 text-center text-xs text-muted-foreground\">\n {value.length} / {maxSelections} selected\n </div>\n )}\n </Command>\n );\n\n // Mobile: Drawer\n if (isMobile) {\n return (\n <Drawer open={open} onOpenChange={setOpen}>\n <DrawerTrigger asChild>\n <button\n type=\"button\"\n disabled={disabled}\n className=\"w-full text-left\"\n >\n {TriggerContent}\n </button>\n </DrawerTrigger>\n <DrawerContent>\n <DrawerHeader>\n <DrawerTitle>{resolvedDrawerTitle}</DrawerTitle>\n </DrawerHeader>\n <div className=\"px-4 pb-6\">{CommandContent}</div>\n </DrawerContent>\n </Drawer>\n );\n }\n\n // Desktop: Popover\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger\n render={\n <button\n type=\"button\"\n disabled={disabled}\n className=\"w-full text-left\"\n >\n {TriggerContent}\n </button>\n }\n />\n <PopoverContent className=\"w-(--anchor-width) p-0\" align=\"start\">\n {CommandContent}\n </PopoverContent>\n </Popover>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,183 @@
1
+ "use client";
2
+
3
+ import { useResolveText } from "../../i18n/hooks.mjs";
4
+ import { cn } from "../../lib/utils.mjs";
5
+ import { Button } from "../ui/button.mjs";
6
+ import { useIsMobile } from "../../hooks/use-media-query.mjs";
7
+ import { Drawer, DrawerContent, DrawerHeader, DrawerTitle, DrawerTrigger } from "../ui/drawer.mjs";
8
+ import { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList } from "../ui/command.mjs";
9
+ import { Popover, PopoverContent, PopoverTrigger } from "../ui/popover.mjs";
10
+ import { flattenOptions } from "./types.mjs";
11
+ import { Icon } from "@iconify/react";
12
+ import { useQuery } from "@tanstack/react-query";
13
+ import { useCallback, useDeferredValue, useId, useMemo, useState } from "react";
14
+ import { jsx, jsxs } from "react/jsx-runtime";
15
+
16
+ //#region src/client/components/primitives/select-single.tsx
17
+ /**
18
+ * SelectSingle - Single select component with search
19
+ *
20
+ * Features:
21
+ * - Always searchable
22
+ * - Responsive: Popover on desktop, Drawer on mobile
23
+ * - Supports static and async options
24
+ * - Keyboard navigation
25
+ *
26
+ * @example
27
+ * ```tsx
28
+ * <SelectSingle
29
+ * value={status}
30
+ * onChange={setStatus}
31
+ * options={[
32
+ * { value: "active", label: "Active" },
33
+ * { value: "inactive", label: "Inactive" },
34
+ * ]}
35
+ * />
36
+ * ```
37
+ */
38
+ function SelectSingle({ value, onChange, options: staticOptions = [], loadOptions, queryKey, prefetchOnMount = false, clearable = true, loading: externalLoading = false, emptyMessage = "No options found", placeholder = "Select...", disabled, className, id, "aria-invalid": ariaInvalid, drawerTitle = "Select option" }) {
39
+ const resolveText = useResolveText();
40
+ const resolvedPlaceholder = resolveText(placeholder);
41
+ const resolvedEmptyMessage = resolveText(emptyMessage);
42
+ const resolvedDrawerTitle = resolveText(drawerTitle);
43
+ const [open, setOpen] = useState(false);
44
+ const [search, setSearch] = useState("");
45
+ const instanceId = useId();
46
+ const deferredSearch = useDeferredValue(search);
47
+ const isMobile = useIsMobile();
48
+ const flatStaticOptions = useMemo(() => flattenOptions(staticOptions), [staticOptions]);
49
+ const { data: dynamicOptions = [], isFetching } = useQuery({
50
+ queryKey: useMemo(() => queryKey ? queryKey(deferredSearch) : [
51
+ "select-single",
52
+ instanceId,
53
+ deferredSearch
54
+ ], [
55
+ queryKey,
56
+ deferredSearch,
57
+ instanceId
58
+ ]),
59
+ queryFn: () => loadOptions?.(deferredSearch) ?? Promise.resolve([]),
60
+ enabled: !!loadOptions && (open || prefetchOnMount),
61
+ staleTime: 3e4,
62
+ gcTime: 5 * 6e4
63
+ });
64
+ const allOptions = useMemo(() => {
65
+ if (!loadOptions) return flatStaticOptions;
66
+ if (flatStaticOptions.length === 0) return dynamicOptions;
67
+ const mergedMap = [...flatStaticOptions, ...dynamicOptions].reduce((map, opt) => new Map(map).set(opt.value, opt), /* @__PURE__ */ new Map());
68
+ return Array.from(mergedMap.values());
69
+ }, [
70
+ loadOptions,
71
+ dynamicOptions,
72
+ flatStaticOptions
73
+ ]);
74
+ const filteredOptions = useMemo(() => {
75
+ if (loadOptions) return allOptions;
76
+ if (!search) return allOptions;
77
+ return allOptions.filter((opt) => resolveText(opt.label).toLowerCase().includes(search.toLowerCase()));
78
+ }, [
79
+ allOptions,
80
+ search,
81
+ loadOptions,
82
+ resolveText
83
+ ]);
84
+ const getLabel = useCallback((val) => {
85
+ const option = allOptions.find((opt) => opt.value === val);
86
+ return option?.label ? resolveText(option.label) : String(val);
87
+ }, [allOptions, resolveText]);
88
+ const handleSelect = useCallback((selectedValue) => {
89
+ onChange(selectedValue);
90
+ setOpen(false);
91
+ setSearch("");
92
+ }, [onChange]);
93
+ const handleClear = useCallback((e) => {
94
+ e.stopPropagation();
95
+ onChange(null);
96
+ }, [onChange]);
97
+ const showLoading = isFetching || externalLoading;
98
+ const TriggerButton = /* @__PURE__ */ jsxs(Button, {
99
+ id,
100
+ variant: "outline",
101
+ role: "combobox",
102
+ "aria-expanded": open,
103
+ "aria-invalid": ariaInvalid,
104
+ disabled,
105
+ className: cn("w-full justify-between font-normal", !value && "text-muted-foreground", className),
106
+ children: [/* @__PURE__ */ jsx("span", {
107
+ className: "truncate",
108
+ children: value ? getLabel(value) : resolvedPlaceholder
109
+ }), /* @__PURE__ */ jsxs("div", {
110
+ className: "flex items-center gap-1 shrink-0",
111
+ children: [clearable && value && !disabled && /* @__PURE__ */ jsx("span", {
112
+ role: "button",
113
+ tabIndex: -1,
114
+ onClick: handleClear,
115
+ onKeyDown: (event) => {
116
+ if (event.key === "Enter" || event.key === " ") {
117
+ event.preventDefault();
118
+ handleClear(event);
119
+ }
120
+ },
121
+ className: "rounded-sm opacity-50 hover:opacity-100 hover:bg-muted p-0.5 -mr-1",
122
+ children: /* @__PURE__ */ jsx(Icon, {
123
+ icon: "ph:x",
124
+ className: "size-3"
125
+ })
126
+ }), /* @__PURE__ */ jsx(Icon, {
127
+ icon: "ph:caret-up-down",
128
+ className: "size-3.5 opacity-50"
129
+ })]
130
+ })]
131
+ });
132
+ const CommandContent = /* @__PURE__ */ jsxs(Command, {
133
+ shouldFilter: !loadOptions,
134
+ children: [/* @__PURE__ */ jsx(CommandInput, {
135
+ placeholder: "Search...",
136
+ value: search,
137
+ onValueChange: setSearch
138
+ }), /* @__PURE__ */ jsxs(CommandList, { children: [
139
+ showLoading && /* @__PURE__ */ jsx("div", {
140
+ className: "flex items-center justify-center py-6",
141
+ children: /* @__PURE__ */ jsx(Icon, {
142
+ icon: "ph:circle-notch",
143
+ className: "size-4 animate-spin text-muted-foreground"
144
+ })
145
+ }),
146
+ /* @__PURE__ */ jsx(CommandEmpty, { children: resolvedEmptyMessage }),
147
+ /* @__PURE__ */ jsx(CommandGroup, { children: filteredOptions.map((option) => /* @__PURE__ */ jsxs(CommandItem, {
148
+ value: String(option.value),
149
+ onSelect: handleSelect,
150
+ disabled: option.disabled,
151
+ "data-checked": value === option.value,
152
+ children: [option.icon, /* @__PURE__ */ jsx("span", {
153
+ className: "truncate",
154
+ children: resolveText(option.label)
155
+ })]
156
+ }, String(option.value))) })
157
+ ] })]
158
+ });
159
+ if (isMobile) return /* @__PURE__ */ jsxs(Drawer, {
160
+ open,
161
+ onOpenChange: setOpen,
162
+ children: [/* @__PURE__ */ jsx(DrawerTrigger, {
163
+ asChild: true,
164
+ children: TriggerButton
165
+ }), /* @__PURE__ */ jsxs(DrawerContent, { children: [/* @__PURE__ */ jsx(DrawerHeader, { children: /* @__PURE__ */ jsx(DrawerTitle, { children: resolvedDrawerTitle }) }), /* @__PURE__ */ jsx("div", {
166
+ className: "px-4 pb-6",
167
+ children: CommandContent
168
+ })] })]
169
+ });
170
+ return /* @__PURE__ */ jsxs(Popover, {
171
+ open,
172
+ onOpenChange: setOpen,
173
+ children: [/* @__PURE__ */ jsx(PopoverTrigger, { render: TriggerButton }), /* @__PURE__ */ jsx(PopoverContent, {
174
+ className: "w-(--anchor-width) p-0",
175
+ align: "start",
176
+ children: CommandContent
177
+ })]
178
+ });
179
+ }
180
+
181
+ //#endregion
182
+ export { SelectSingle };
183
+ //# sourceMappingURL=select-single.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"select-single.mjs","names":[],"sources":["../../../../src/client/components/primitives/select-single.tsx"],"sourcesContent":["\"use client\";\n\nimport { Icon } from \"@iconify/react\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport type * as React from \"react\";\nimport { useCallback, useDeferredValue, useId, useMemo, useState } from \"react\";\nimport { useIsMobile } from \"../../hooks/use-media-query\";\nimport { useResolveText } from \"../../i18n/hooks\";\nimport { cn } from \"../../lib/utils\";\nimport { Button } from \"../ui/button\";\nimport {\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n} from \"../ui/command\";\nimport {\n Drawer,\n DrawerContent,\n DrawerHeader,\n DrawerTitle,\n DrawerTrigger,\n} from \"../ui/drawer\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"../ui/popover\";\nimport type { BasePrimitiveProps, SelectOption, SelectOptions } from \"./types\";\nimport { flattenOptions } from \"./types\";\n\nexport interface SelectSingleProps<\n TValue extends string = string,\n> extends BasePrimitiveProps {\n /** Selected value */\n value: TValue | null;\n /** Change handler */\n onChange: (value: TValue | null) => void;\n /** Static options */\n options?: SelectOptions<TValue>;\n /** Dynamic options loader */\n loadOptions?: (search: string) => Promise<SelectOption<TValue>[]>;\n /** Query key builder for loadOptions */\n queryKey?: (search: string) => readonly unknown[];\n /** Prefetch options on mount */\n prefetchOnMount?: boolean;\n\n /** Allow clearing selection */\n clearable?: boolean;\n /** Debounce delay for loadOptions (ms) */\n debounceMs?: number;\n /** External loading state */\n loading?: boolean;\n /** Empty state message */\n emptyMessage?: string;\n /** Title for mobile drawer */\n drawerTitle?: string;\n}\n\n/**\n * SelectSingle - Single select component with search\n *\n * Features:\n * - Always searchable\n * - Responsive: Popover on desktop, Drawer on mobile\n * - Supports static and async options\n * - Keyboard navigation\n *\n * @example\n * ```tsx\n * <SelectSingle\n * value={status}\n * onChange={setStatus}\n * options={[\n * { value: \"active\", label: \"Active\" },\n * { value: \"inactive\", label: \"Inactive\" },\n * ]}\n * />\n * ```\n */\nexport function SelectSingle<TValue extends string = string>({\n value,\n onChange,\n options: staticOptions = [],\n loadOptions,\n queryKey,\n prefetchOnMount = false,\n clearable = true,\n loading: externalLoading = false,\n emptyMessage = \"No options found\",\n placeholder = \"Select...\",\n disabled,\n className,\n id,\n \"aria-invalid\": ariaInvalid,\n drawerTitle = \"Select option\",\n}: SelectSingleProps<TValue>) {\n const resolveText = useResolveText();\n const resolvedPlaceholder = resolveText(placeholder);\n const resolvedEmptyMessage = resolveText(emptyMessage);\n const resolvedDrawerTitle = resolveText(drawerTitle);\n const [open, setOpen] = useState(false);\n const [search, setSearch] = useState(\"\");\n const instanceId = useId();\n const deferredSearch = useDeferredValue(search);\n const isMobile = useIsMobile();\n\n // Flatten static options\n const flatStaticOptions = useMemo(\n () => flattenOptions(staticOptions),\n [staticOptions],\n );\n\n const loadOptionsKey = useMemo(\n () =>\n queryKey\n ? queryKey(deferredSearch)\n : [\"select-single\", instanceId, deferredSearch],\n [queryKey, deferredSearch, instanceId],\n );\n\n const { data: dynamicOptions = [], isFetching } = useQuery({\n queryKey: loadOptionsKey,\n queryFn: () => loadOptions?.(deferredSearch) ?? Promise.resolve([]),\n enabled: !!loadOptions && (open || prefetchOnMount),\n staleTime: 30_000,\n gcTime: 5 * 60_000,\n });\n\n // Merge static and dynamic options (immutable pattern for React Compiler)\n const allOptions = useMemo(() => {\n if (!loadOptions) {\n return flatStaticOptions;\n }\n if (flatStaticOptions.length === 0) {\n return dynamicOptions;\n }\n // Use reduce to build Map immutably - dynamic options override static\n const mergedMap = [...flatStaticOptions, ...dynamicOptions].reduce(\n (map, opt) => new Map(map).set(opt.value, opt),\n new Map<TValue, SelectOption<TValue>>(),\n );\n return Array.from(mergedMap.values());\n }, [loadOptions, dynamicOptions, flatStaticOptions]);\n\n // Filter options by search (for static options)\n const filteredOptions = useMemo(() => {\n if (loadOptions) {\n return allOptions; // Dynamic options are already filtered by server\n }\n if (!search) {\n return allOptions;\n }\n return allOptions.filter((opt: SelectOption<TValue>) =>\n resolveText(opt.label).toLowerCase().includes(search.toLowerCase()),\n );\n }, [allOptions, search, loadOptions, resolveText]);\n\n // Get label for a value\n const getLabel = useCallback(\n (val: TValue): string => {\n const option = allOptions.find(\n (opt: SelectOption<TValue>) => opt.value === val,\n );\n return option?.label ? resolveText(option.label) : String(val);\n },\n [allOptions, resolveText],\n );\n\n const handleSelect = useCallback(\n (selectedValue: string) => {\n onChange(selectedValue as TValue);\n setOpen(false);\n setSearch(\"\");\n },\n [onChange],\n );\n\n const handleClear = useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation();\n onChange(null);\n },\n [onChange],\n );\n\n const showLoading = isFetching || externalLoading;\n\n const TriggerButton = (\n <Button\n id={id}\n variant=\"outline\"\n role=\"combobox\"\n aria-expanded={open}\n aria-invalid={ariaInvalid}\n disabled={disabled}\n className={cn(\n \"w-full justify-between font-normal\",\n !value && \"text-muted-foreground\",\n className,\n )}\n >\n <span className=\"truncate\">\n {value ? getLabel(value) : resolvedPlaceholder}\n </span>\n <div className=\"flex items-center gap-1 shrink-0\">\n {clearable && value && !disabled && (\n <span\n role=\"button\"\n tabIndex={-1}\n onClick={handleClear}\n onKeyDown={(event) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n handleClear(event as unknown as React.MouseEvent);\n }\n }}\n className=\"rounded-sm opacity-50 hover:opacity-100 hover:bg-muted p-0.5 -mr-1\"\n >\n <Icon icon=\"ph:x\" className=\"size-3\" />\n </span>\n )}\n <Icon icon=\"ph:caret-up-down\" className=\"size-3.5 opacity-50\" />\n </div>\n </Button>\n );\n\n const CommandContent = (\n <Command shouldFilter={!loadOptions}>\n <CommandInput\n placeholder=\"Search...\"\n value={search}\n onValueChange={setSearch}\n />\n <CommandList>\n {showLoading && (\n <div className=\"flex items-center justify-center py-6\">\n <Icon\n icon=\"ph:circle-notch\"\n className=\"size-4 animate-spin text-muted-foreground\"\n />\n </div>\n )}\n <CommandEmpty>{resolvedEmptyMessage}</CommandEmpty>\n <CommandGroup>\n {filteredOptions.map((option) => (\n <CommandItem\n key={String(option.value)}\n value={String(option.value)}\n onSelect={handleSelect}\n disabled={option.disabled}\n data-checked={value === option.value}\n >\n {option.icon}\n <span className=\"truncate\">{resolveText(option.label)}</span>\n </CommandItem>\n ))}\n </CommandGroup>\n </CommandList>\n </Command>\n );\n\n // Mobile: Drawer\n if (isMobile) {\n return (\n <Drawer open={open} onOpenChange={setOpen}>\n <DrawerTrigger asChild>{TriggerButton}</DrawerTrigger>\n <DrawerContent>\n <DrawerHeader>\n <DrawerTitle>{resolvedDrawerTitle}</DrawerTitle>\n </DrawerHeader>\n <div className=\"px-4 pb-6\">{CommandContent}</div>\n </DrawerContent>\n </Drawer>\n );\n }\n\n // Desktop: Popover\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger render={TriggerButton} />\n <PopoverContent className=\"w-(--anchor-width) p-0\" align=\"start\">\n {CommandContent}\n </PopoverContent>\n </Popover>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import { useResolveText } from "../../i18n/hooks.mjs";
2
+ import { Input } from "../ui/input.mjs";
3
+ import { jsx } from "react/jsx-runtime";
4
+
5
+ //#region src/client/components/primitives/text-input.tsx
6
+ /**
7
+ * Text Input Primitive
8
+ *
9
+ * A basic text input with value/onChange pattern.
10
+ * Supports different input types: text, email, password, url, tel, search.
11
+ *
12
+ * @example
13
+ * ```tsx
14
+ * <TextInput
15
+ * value={email}
16
+ * onChange={setEmail}
17
+ * type="email"
18
+ * placeholder="Enter email"
19
+ * />
20
+ * ```
21
+ */
22
+ function TextInput({ value, onChange, type = "text", placeholder, disabled, readOnly, maxLength, autoComplete, className, id, "aria-invalid": ariaInvalid }) {
23
+ return /* @__PURE__ */ jsx(Input, {
24
+ id,
25
+ type,
26
+ value,
27
+ onChange: (e) => onChange(e.target.value),
28
+ placeholder: useResolveText()(placeholder),
29
+ disabled,
30
+ readOnly,
31
+ maxLength,
32
+ autoComplete,
33
+ "aria-invalid": ariaInvalid,
34
+ className
35
+ });
36
+ }
37
+
38
+ //#endregion
39
+ export { TextInput };
40
+ //# sourceMappingURL=text-input.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text-input.mjs","names":[],"sources":["../../../../src/client/components/primitives/text-input.tsx"],"sourcesContent":["import { useResolveText } from \"../../i18n/hooks\";\nimport { Input } from \"../ui/input\";\nimport type { TextInputProps } from \"./types\";\n\n/**\n * Text Input Primitive\n *\n * A basic text input with value/onChange pattern.\n * Supports different input types: text, email, password, url, tel, search.\n *\n * @example\n * ```tsx\n * <TextInput\n * value={email}\n * onChange={setEmail}\n * type=\"email\"\n * placeholder=\"Enter email\"\n * />\n * ```\n */\nexport function TextInput({\n value,\n onChange,\n type = \"text\",\n placeholder,\n disabled,\n readOnly,\n maxLength,\n autoComplete,\n className,\n id,\n \"aria-invalid\": ariaInvalid,\n}: TextInputProps) {\n const resolveText = useResolveText();\n\n return (\n <Input\n id={id}\n type={type}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n placeholder={resolveText(placeholder)}\n disabled={disabled}\n readOnly={readOnly}\n maxLength={maxLength}\n autoComplete={autoComplete}\n aria-invalid={ariaInvalid}\n className={className}\n />\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAoBA,SAAgB,UAAU,EACxB,OACA,UACA,OAAO,QACP,aACA,UACA,UACA,WACA,cACA,WACA,IACA,gBAAgB,eACC;AAGjB,QACE,oBAAC;EACK;EACE;EACC;EACP,WAAW,MAAM,SAAS,EAAE,OAAO,MAAM;EACzC,aARgB,gBAAgB,CAQP,YAAY;EAC3B;EACA;EACC;EACG;EACd,gBAAc;EACH;GACX"}
@@ -0,0 +1,38 @@
1
+ import { useResolveText } from "../../i18n/hooks.mjs";
2
+ import { Textarea } from "../ui/textarea.mjs";
3
+ import { jsx } from "react/jsx-runtime";
4
+
5
+ //#region src/client/components/primitives/textarea-input.tsx
6
+ /**
7
+ * Textarea Input Primitive
8
+ *
9
+ * A multi-line text input.
10
+ *
11
+ * @example
12
+ * ```tsx
13
+ * <TextareaInput
14
+ * value={description}
15
+ * onChange={setDescription}
16
+ * rows={4}
17
+ * placeholder="Enter description..."
18
+ * />
19
+ * ```
20
+ */
21
+ function TextareaInput({ value, onChange, rows = 3, maxLength, placeholder, disabled, readOnly, className, id, "aria-invalid": ariaInvalid }) {
22
+ return /* @__PURE__ */ jsx(Textarea, {
23
+ id,
24
+ value,
25
+ onChange: (e) => onChange(e.target.value),
26
+ rows,
27
+ maxLength,
28
+ placeholder: useResolveText()(placeholder),
29
+ disabled,
30
+ readOnly,
31
+ "aria-invalid": ariaInvalid,
32
+ className
33
+ });
34
+ }
35
+
36
+ //#endregion
37
+ export { TextareaInput };
38
+ //# sourceMappingURL=textarea-input.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"textarea-input.mjs","names":[],"sources":["../../../../src/client/components/primitives/textarea-input.tsx"],"sourcesContent":["import { useResolveText } from \"../../i18n/hooks\";\nimport { Textarea } from \"../ui/textarea\";\nimport type { TextareaInputProps } from \"./types\";\n\n/**\n * Textarea Input Primitive\n *\n * A multi-line text input.\n *\n * @example\n * ```tsx\n * <TextareaInput\n * value={description}\n * onChange={setDescription}\n * rows={4}\n * placeholder=\"Enter description...\"\n * />\n * ```\n */\nexport function TextareaInput({\n value,\n onChange,\n rows = 3,\n maxLength,\n placeholder,\n disabled,\n readOnly,\n className,\n id,\n \"aria-invalid\": ariaInvalid,\n}: TextareaInputProps) {\n const resolveText = useResolveText();\n\n return (\n <Textarea\n id={id}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n rows={rows}\n maxLength={maxLength}\n placeholder={resolveText(placeholder)}\n disabled={disabled}\n readOnly={readOnly}\n aria-invalid={ariaInvalid}\n className={className}\n />\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAmBA,SAAgB,cAAc,EAC5B,OACA,UACA,OAAO,GACP,WACA,aACA,UACA,UACA,WACA,IACA,gBAAgB,eACK;AAGrB,QACE,oBAAC;EACK;EACG;EACP,WAAW,MAAM,SAAS,EAAE,OAAO,MAAM;EACnC;EACK;EACX,aATgB,gBAAgB,CASP,YAAY;EAC3B;EACA;EACV,gBAAc;EACH;GACX"}
@@ -0,0 +1,72 @@
1
+ "use client";
2
+
3
+ import { useResolveText } from "../../i18n/hooks.mjs";
4
+ import { cn } from "../../lib/utils.mjs";
5
+ import { Icon } from "@iconify/react";
6
+ import { jsx, jsxs } from "react/jsx-runtime";
7
+
8
+ //#region src/client/components/primitives/time-input.tsx
9
+ /**
10
+ * Time Input Primitive
11
+ *
12
+ * A time-only input using the native HTML time picker.
13
+ * Returns time as string in "HH:mm" or "HH:mm:ss" format.
14
+ *
15
+ * @example
16
+ * ```tsx
17
+ * <TimeInput
18
+ * value={selectedTime}
19
+ * onChange={setSelectedTime}
20
+ * placeholder="Select time"
21
+ * />
22
+ * ```
23
+ */
24
+ function TimeInput({ value, onChange, precision = "minute", placeholder = "Select time", disabled, className, id, "aria-invalid": ariaInvalid }) {
25
+ const resolveText = useResolveText();
26
+ const handleChange = (e) => {
27
+ const timeValue = e.target.value;
28
+ onChange(timeValue || null);
29
+ };
30
+ const handleClear = (e) => {
31
+ e.preventDefault();
32
+ e.stopPropagation();
33
+ onChange(null);
34
+ };
35
+ return /* @__PURE__ */ jsx("div", {
36
+ className: "relative",
37
+ children: /* @__PURE__ */ jsxs("div", {
38
+ className: cn("flex h-9 w-full items-center gap-2 border border-input/80 bg-input/20 backdrop-blur-sm px-3 py-2 text-sm", "focus-within:ring-2 focus-within:ring-ring focus-within:ring-offset-2", disabled && "cursor-not-allowed opacity-50", ariaInvalid && "border-destructive", className),
39
+ children: [
40
+ /* @__PURE__ */ jsx(Icon, {
41
+ icon: "ph:clock",
42
+ className: "size-4 text-muted-foreground"
43
+ }),
44
+ /* @__PURE__ */ jsx("input", {
45
+ type: "time",
46
+ id,
47
+ value: value ?? "",
48
+ onChange: handleChange,
49
+ step: precision === "second" ? 1 : 60,
50
+ disabled,
51
+ "aria-invalid": ariaInvalid,
52
+ placeholder: resolveText(placeholder),
53
+ className: cn("flex-1 bg-transparent outline-none", "placeholder:text-muted-foreground", "disabled:cursor-not-allowed", "[&::-webkit-calendar-picker-indicator]:hidden")
54
+ }),
55
+ value && !disabled && /* @__PURE__ */ jsx("button", {
56
+ type: "button",
57
+ onClick: handleClear,
58
+ className: "text-muted-foreground hover:text-foreground",
59
+ tabIndex: -1,
60
+ children: /* @__PURE__ */ jsx(Icon, {
61
+ icon: "ph:x",
62
+ className: "size-4"
63
+ })
64
+ })
65
+ ]
66
+ })
67
+ });
68
+ }
69
+
70
+ //#endregion
71
+ export { TimeInput };
72
+ //# sourceMappingURL=time-input.mjs.map