@trebired/frontend 0.3.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 (433) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/LICENSE +661 -0
  3. package/README.md +212 -0
  4. package/dist/actions/buttons.d.ts +8 -0
  5. package/dist/actions/buttons.d.ts.map +1 -0
  6. package/dist/actions/buttons.js +116 -0
  7. package/dist/actions/buttons.js.map +1 -0
  8. package/dist/actions/components/index.d.ts +26 -0
  9. package/dist/actions/components/index.d.ts.map +1 -0
  10. package/dist/actions/components/index.js +25 -0
  11. package/dist/actions/components/index.js.map +1 -0
  12. package/dist/actions/confetti.d.ts +12 -0
  13. package/dist/actions/confetti.d.ts.map +1 -0
  14. package/dist/actions/confetti.js +36 -0
  15. package/dist/actions/confetti.js.map +1 -0
  16. package/dist/actions/forms.d.ts +12 -0
  17. package/dist/actions/forms.d.ts.map +1 -0
  18. package/dist/actions/forms.js +159 -0
  19. package/dist/actions/forms.js.map +1 -0
  20. package/dist/actions/index.d.ts +8 -0
  21. package/dist/actions/index.d.ts.map +1 -0
  22. package/dist/actions/index.js +7 -0
  23. package/dist/actions/index.js.map +1 -0
  24. package/dist/actions/request.d.ts +13 -0
  25. package/dist/actions/request.d.ts.map +1 -0
  26. package/dist/actions/request.js +83 -0
  27. package/dist/actions/request.js.map +1 -0
  28. package/dist/actions/response.d.ts +18 -0
  29. package/dist/actions/response.d.ts.map +1 -0
  30. package/dist/actions/response.js +104 -0
  31. package/dist/actions/response.js.map +1 -0
  32. package/dist/actions/styles/index.scss +42 -0
  33. package/dist/actions/triggers.d.ts +24 -0
  34. package/dist/actions/triggers.d.ts.map +1 -0
  35. package/dist/actions/triggers.js +107 -0
  36. package/dist/actions/triggers.js.map +1 -0
  37. package/dist/actions/types.d.ts +63 -0
  38. package/dist/actions/types.d.ts.map +1 -0
  39. package/dist/actions/types.js +2 -0
  40. package/dist/actions/types.js.map +1 -0
  41. package/dist/components/index.d.ts +5 -0
  42. package/dist/components/index.d.ts.map +1 -0
  43. package/dist/components/index.js +11 -0
  44. package/dist/components/index.js.map +1 -0
  45. package/dist/dom/index.d.ts +26 -0
  46. package/dist/dom/index.d.ts.map +1 -0
  47. package/dist/dom/index.js +164 -0
  48. package/dist/dom/index.js.map +1 -0
  49. package/dist/flash/components/index.d.ts +28 -0
  50. package/dist/flash/components/index.d.ts.map +1 -0
  51. package/dist/flash/components/index.js +27 -0
  52. package/dist/flash/components/index.js.map +1 -0
  53. package/dist/flash/dialogs.d.ts +6 -0
  54. package/dist/flash/dialogs.d.ts.map +1 -0
  55. package/dist/flash/dialogs.js +120 -0
  56. package/dist/flash/dialogs.js.map +1 -0
  57. package/dist/flash/duration.d.ts +8 -0
  58. package/dist/flash/duration.d.ts.map +1 -0
  59. package/dist/flash/duration.js +20 -0
  60. package/dist/flash/duration.js.map +1 -0
  61. package/dist/flash/elements.d.ts +14 -0
  62. package/dist/flash/elements.d.ts.map +1 -0
  63. package/dist/flash/elements.js +67 -0
  64. package/dist/flash/elements.js.map +1 -0
  65. package/dist/flash/index.d.ts +8 -0
  66. package/dist/flash/index.d.ts.map +1 -0
  67. package/dist/flash/index.js +18 -0
  68. package/dist/flash/index.js.map +1 -0
  69. package/dist/flash/stack.d.ts +6 -0
  70. package/dist/flash/stack.d.ts.map +1 -0
  71. package/dist/flash/stack.js +56 -0
  72. package/dist/flash/stack.js.map +1 -0
  73. package/dist/flash/styles/index.scss +118 -0
  74. package/dist/flash/toast.d.ts +24 -0
  75. package/dist/flash/toast.d.ts.map +1 -0
  76. package/dist/flash/toast.js +67 -0
  77. package/dist/flash/toast.js.map +1 -0
  78. package/dist/flash/types.d.ts +29 -0
  79. package/dist/flash/types.d.ts.map +1 -0
  80. package/dist/flash/types.js +2 -0
  81. package/dist/flash/types.js.map +1 -0
  82. package/dist/http/index.d.ts +30 -0
  83. package/dist/http/index.d.ts.map +1 -0
  84. package/dist/http/index.js +104 -0
  85. package/dist/http/index.js.map +1 -0
  86. package/dist/index.d.ts +40 -0
  87. package/dist/index.d.ts.map +1 -0
  88. package/dist/index.js +104 -0
  89. package/dist/index.js.map +1 -0
  90. package/dist/inputs/components/index.d.ts +16 -0
  91. package/dist/inputs/components/index.d.ts.map +1 -0
  92. package/dist/inputs/components/index.js +112 -0
  93. package/dist/inputs/components/index.js.map +1 -0
  94. package/dist/inputs/index.d.ts +17 -0
  95. package/dist/inputs/index.d.ts.map +1 -0
  96. package/dist/inputs/index.js +54 -0
  97. package/dist/inputs/index.js.map +1 -0
  98. package/dist/inputs/styles/cropper.scss +244 -0
  99. package/dist/inputs/styles/field.scss +15 -0
  100. package/dist/inputs/styles/index.scss +3 -0
  101. package/dist/inputs/styles/upload.scss +125 -0
  102. package/dist/inputs/upload/config.d.ts +57 -0
  103. package/dist/inputs/upload/config.d.ts.map +1 -0
  104. package/dist/inputs/upload/config.js +61 -0
  105. package/dist/inputs/upload/config.js.map +1 -0
  106. package/dist/inputs/upload/crop-session.d.ts +6 -0
  107. package/dist/inputs/upload/crop-session.d.ts.map +1 -0
  108. package/dist/inputs/upload/crop-session.js +204 -0
  109. package/dist/inputs/upload/crop-session.js.map +1 -0
  110. package/dist/inputs/upload/crop.d.ts +20 -0
  111. package/dist/inputs/upload/crop.d.ts.map +1 -0
  112. package/dist/inputs/upload/crop.js +124 -0
  113. package/dist/inputs/upload/crop.js.map +1 -0
  114. package/dist/inputs/upload/dom.d.ts +19 -0
  115. package/dist/inputs/upload/dom.d.ts.map +1 -0
  116. package/dist/inputs/upload/dom.js +74 -0
  117. package/dist/inputs/upload/dom.js.map +1 -0
  118. package/dist/inputs/upload/drop.d.ts +10 -0
  119. package/dist/inputs/upload/drop.d.ts.map +1 -0
  120. package/dist/inputs/upload/drop.js +92 -0
  121. package/dist/inputs/upload/drop.js.map +1 -0
  122. package/dist/inputs/upload/files.d.ts +14 -0
  123. package/dist/inputs/upload/files.d.ts.map +1 -0
  124. package/dist/inputs/upload/files.js +82 -0
  125. package/dist/inputs/upload/files.js.map +1 -0
  126. package/dist/inputs/upload/manager.d.ts +36 -0
  127. package/dist/inputs/upload/manager.d.ts.map +1 -0
  128. package/dist/inputs/upload/manager.js +236 -0
  129. package/dist/inputs/upload/manager.js.map +1 -0
  130. package/dist/inputs/upload/markup.d.ts +30 -0
  131. package/dist/inputs/upload/markup.d.ts.map +1 -0
  132. package/dist/inputs/upload/markup.js +118 -0
  133. package/dist/inputs/upload/markup.js.map +1 -0
  134. package/dist/inputs/upload/model.d.ts +41 -0
  135. package/dist/inputs/upload/model.d.ts.map +1 -0
  136. package/dist/inputs/upload/model.js +76 -0
  137. package/dist/inputs/upload/model.js.map +1 -0
  138. package/dist/inputs/upload/state.d.ts +16 -0
  139. package/dist/inputs/upload/state.d.ts.map +1 -0
  140. package/dist/inputs/upload/state.js +181 -0
  141. package/dist/inputs/upload/state.js.map +1 -0
  142. package/dist/inputs/upload/text.d.ts +7 -0
  143. package/dist/inputs/upload/text.d.ts.map +1 -0
  144. package/dist/inputs/upload/text.js +29 -0
  145. package/dist/inputs/upload/text.js.map +1 -0
  146. package/dist/inputs/upload/types.d.ts +86 -0
  147. package/dist/inputs/upload/types.d.ts.map +1 -0
  148. package/dist/inputs/upload/types.js +2 -0
  149. package/dist/inputs/upload/types.js.map +1 -0
  150. package/dist/layer/components/index.d.ts +12 -0
  151. package/dist/layer/components/index.d.ts.map +1 -0
  152. package/dist/layer/components/index.js +12 -0
  153. package/dist/layer/components/index.js.map +1 -0
  154. package/dist/layer/index.d.ts +22 -0
  155. package/dist/layer/index.d.ts.map +1 -0
  156. package/dist/layer/index.js +159 -0
  157. package/dist/layer/index.js.map +1 -0
  158. package/dist/layer/styles/index.scss +6 -0
  159. package/dist/live/components/index.d.ts +15 -0
  160. package/dist/live/components/index.d.ts.map +1 -0
  161. package/dist/live/components/index.js +12 -0
  162. package/dist/live/components/index.js.map +1 -0
  163. package/dist/live/index.d.ts +29 -0
  164. package/dist/live/index.d.ts.map +1 -0
  165. package/dist/live/index.js +103 -0
  166. package/dist/live/index.js.map +1 -0
  167. package/dist/logging/index.d.ts +17 -0
  168. package/dist/logging/index.d.ts.map +1 -0
  169. package/dist/logging/index.js +68 -0
  170. package/dist/logging/index.js.map +1 -0
  171. package/dist/modal/components/index.d.ts +18 -0
  172. package/dist/modal/components/index.d.ts.map +1 -0
  173. package/dist/modal/components/index.js +20 -0
  174. package/dist/modal/components/index.js.map +1 -0
  175. package/dist/modal/index.d.ts +24 -0
  176. package/dist/modal/index.d.ts.map +1 -0
  177. package/dist/modal/index.js +184 -0
  178. package/dist/modal/index.js.map +1 -0
  179. package/dist/modal/styles/index.scss +50 -0
  180. package/dist/popover/components/index.d.ts +14 -0
  181. package/dist/popover/components/index.d.ts.map +1 -0
  182. package/dist/popover/components/index.js +16 -0
  183. package/dist/popover/components/index.js.map +1 -0
  184. package/dist/popover/index.d.ts +16 -0
  185. package/dist/popover/index.d.ts.map +1 -0
  186. package/dist/popover/index.js +140 -0
  187. package/dist/popover/index.js.map +1 -0
  188. package/dist/popover/styles/index.scss +24 -0
  189. package/dist/progress/components/index.d.ts +10 -0
  190. package/dist/progress/components/index.d.ts.map +1 -0
  191. package/dist/progress/components/index.js +14 -0
  192. package/dist/progress/components/index.js.map +1 -0
  193. package/dist/progress/index.d.ts +18 -0
  194. package/dist/progress/index.d.ts.map +1 -0
  195. package/dist/progress/index.js +89 -0
  196. package/dist/progress/index.js.map +1 -0
  197. package/dist/progress/styles/index.scss +16 -0
  198. package/dist/react/index.d.ts +17 -0
  199. package/dist/react/index.d.ts.map +1 -0
  200. package/dist/react/index.js +47 -0
  201. package/dist/react/index.js.map +1 -0
  202. package/dist/src/actions/buttons.d.ts +8 -0
  203. package/dist/src/actions/buttons.d.ts.map +1 -0
  204. package/dist/src/actions/buttons.js +116 -0
  205. package/dist/src/actions/buttons.js.map +1 -0
  206. package/dist/src/actions/components/index.d.ts +26 -0
  207. package/dist/src/actions/components/index.d.ts.map +1 -0
  208. package/dist/src/actions/components/index.js +25 -0
  209. package/dist/src/actions/components/index.js.map +1 -0
  210. package/dist/src/actions/confetti.d.ts +12 -0
  211. package/dist/src/actions/confetti.d.ts.map +1 -0
  212. package/dist/src/actions/confetti.js +36 -0
  213. package/dist/src/actions/confetti.js.map +1 -0
  214. package/dist/src/actions/forms.d.ts +12 -0
  215. package/dist/src/actions/forms.d.ts.map +1 -0
  216. package/dist/src/actions/forms.js +159 -0
  217. package/dist/src/actions/forms.js.map +1 -0
  218. package/dist/src/actions/index.d.ts +8 -0
  219. package/dist/src/actions/index.d.ts.map +1 -0
  220. package/dist/src/actions/index.js +7 -0
  221. package/dist/src/actions/index.js.map +1 -0
  222. package/dist/src/actions/request.d.ts +13 -0
  223. package/dist/src/actions/request.d.ts.map +1 -0
  224. package/dist/src/actions/request.js +83 -0
  225. package/dist/src/actions/request.js.map +1 -0
  226. package/dist/src/actions/response.d.ts +18 -0
  227. package/dist/src/actions/response.d.ts.map +1 -0
  228. package/dist/src/actions/response.js +104 -0
  229. package/dist/src/actions/response.js.map +1 -0
  230. package/dist/src/actions/triggers.d.ts +24 -0
  231. package/dist/src/actions/triggers.d.ts.map +1 -0
  232. package/dist/src/actions/triggers.js +107 -0
  233. package/dist/src/actions/triggers.js.map +1 -0
  234. package/dist/src/actions/types.d.ts +63 -0
  235. package/dist/src/actions/types.d.ts.map +1 -0
  236. package/dist/src/actions/types.js +2 -0
  237. package/dist/src/actions/types.js.map +1 -0
  238. package/dist/src/components/index.d.ts +5 -0
  239. package/dist/src/components/index.d.ts.map +1 -0
  240. package/dist/src/components/index.js +11 -0
  241. package/dist/src/components/index.js.map +1 -0
  242. package/dist/src/dom/index.d.ts +26 -0
  243. package/dist/src/dom/index.d.ts.map +1 -0
  244. package/dist/src/dom/index.js +164 -0
  245. package/dist/src/dom/index.js.map +1 -0
  246. package/dist/src/flash/components/index.d.ts +28 -0
  247. package/dist/src/flash/components/index.d.ts.map +1 -0
  248. package/dist/src/flash/components/index.js +27 -0
  249. package/dist/src/flash/components/index.js.map +1 -0
  250. package/dist/src/flash/dialogs.d.ts +6 -0
  251. package/dist/src/flash/dialogs.d.ts.map +1 -0
  252. package/dist/src/flash/dialogs.js +120 -0
  253. package/dist/src/flash/dialogs.js.map +1 -0
  254. package/dist/src/flash/duration.d.ts +8 -0
  255. package/dist/src/flash/duration.d.ts.map +1 -0
  256. package/dist/src/flash/duration.js +20 -0
  257. package/dist/src/flash/duration.js.map +1 -0
  258. package/dist/src/flash/elements.d.ts +14 -0
  259. package/dist/src/flash/elements.d.ts.map +1 -0
  260. package/dist/src/flash/elements.js +67 -0
  261. package/dist/src/flash/elements.js.map +1 -0
  262. package/dist/src/flash/index.d.ts +8 -0
  263. package/dist/src/flash/index.d.ts.map +1 -0
  264. package/dist/src/flash/index.js +18 -0
  265. package/dist/src/flash/index.js.map +1 -0
  266. package/dist/src/flash/stack.d.ts +6 -0
  267. package/dist/src/flash/stack.d.ts.map +1 -0
  268. package/dist/src/flash/stack.js +56 -0
  269. package/dist/src/flash/stack.js.map +1 -0
  270. package/dist/src/flash/toast.d.ts +24 -0
  271. package/dist/src/flash/toast.d.ts.map +1 -0
  272. package/dist/src/flash/toast.js +67 -0
  273. package/dist/src/flash/toast.js.map +1 -0
  274. package/dist/src/flash/types.d.ts +29 -0
  275. package/dist/src/flash/types.d.ts.map +1 -0
  276. package/dist/src/flash/types.js +2 -0
  277. package/dist/src/flash/types.js.map +1 -0
  278. package/dist/src/http/index.d.ts +30 -0
  279. package/dist/src/http/index.d.ts.map +1 -0
  280. package/dist/src/http/index.js +104 -0
  281. package/dist/src/http/index.js.map +1 -0
  282. package/dist/src/index.d.ts +40 -0
  283. package/dist/src/index.d.ts.map +1 -0
  284. package/dist/src/index.js +104 -0
  285. package/dist/src/index.js.map +1 -0
  286. package/dist/src/inputs/components/index.d.ts +16 -0
  287. package/dist/src/inputs/components/index.d.ts.map +1 -0
  288. package/dist/src/inputs/components/index.js +112 -0
  289. package/dist/src/inputs/components/index.js.map +1 -0
  290. package/dist/src/inputs/index.d.ts +17 -0
  291. package/dist/src/inputs/index.d.ts.map +1 -0
  292. package/dist/src/inputs/index.js +54 -0
  293. package/dist/src/inputs/index.js.map +1 -0
  294. package/dist/src/inputs/upload/config.d.ts +57 -0
  295. package/dist/src/inputs/upload/config.d.ts.map +1 -0
  296. package/dist/src/inputs/upload/config.js +61 -0
  297. package/dist/src/inputs/upload/config.js.map +1 -0
  298. package/dist/src/inputs/upload/crop-session.d.ts +6 -0
  299. package/dist/src/inputs/upload/crop-session.d.ts.map +1 -0
  300. package/dist/src/inputs/upload/crop-session.js +204 -0
  301. package/dist/src/inputs/upload/crop-session.js.map +1 -0
  302. package/dist/src/inputs/upload/crop.d.ts +20 -0
  303. package/dist/src/inputs/upload/crop.d.ts.map +1 -0
  304. package/dist/src/inputs/upload/crop.js +124 -0
  305. package/dist/src/inputs/upload/crop.js.map +1 -0
  306. package/dist/src/inputs/upload/dom.d.ts +19 -0
  307. package/dist/src/inputs/upload/dom.d.ts.map +1 -0
  308. package/dist/src/inputs/upload/dom.js +74 -0
  309. package/dist/src/inputs/upload/dom.js.map +1 -0
  310. package/dist/src/inputs/upload/drop.d.ts +10 -0
  311. package/dist/src/inputs/upload/drop.d.ts.map +1 -0
  312. package/dist/src/inputs/upload/drop.js +92 -0
  313. package/dist/src/inputs/upload/drop.js.map +1 -0
  314. package/dist/src/inputs/upload/files.d.ts +14 -0
  315. package/dist/src/inputs/upload/files.d.ts.map +1 -0
  316. package/dist/src/inputs/upload/files.js +82 -0
  317. package/dist/src/inputs/upload/files.js.map +1 -0
  318. package/dist/src/inputs/upload/manager.d.ts +36 -0
  319. package/dist/src/inputs/upload/manager.d.ts.map +1 -0
  320. package/dist/src/inputs/upload/manager.js +236 -0
  321. package/dist/src/inputs/upload/manager.js.map +1 -0
  322. package/dist/src/inputs/upload/markup.d.ts +30 -0
  323. package/dist/src/inputs/upload/markup.d.ts.map +1 -0
  324. package/dist/src/inputs/upload/markup.js +118 -0
  325. package/dist/src/inputs/upload/markup.js.map +1 -0
  326. package/dist/src/inputs/upload/model.d.ts +41 -0
  327. package/dist/src/inputs/upload/model.d.ts.map +1 -0
  328. package/dist/src/inputs/upload/model.js +76 -0
  329. package/dist/src/inputs/upload/model.js.map +1 -0
  330. package/dist/src/inputs/upload/state.d.ts +16 -0
  331. package/dist/src/inputs/upload/state.d.ts.map +1 -0
  332. package/dist/src/inputs/upload/state.js +181 -0
  333. package/dist/src/inputs/upload/state.js.map +1 -0
  334. package/dist/src/inputs/upload/text.d.ts +7 -0
  335. package/dist/src/inputs/upload/text.d.ts.map +1 -0
  336. package/dist/src/inputs/upload/text.js +29 -0
  337. package/dist/src/inputs/upload/text.js.map +1 -0
  338. package/dist/src/inputs/upload/types.d.ts +86 -0
  339. package/dist/src/inputs/upload/types.d.ts.map +1 -0
  340. package/dist/src/inputs/upload/types.js +2 -0
  341. package/dist/src/inputs/upload/types.js.map +1 -0
  342. package/dist/src/layer/components/index.d.ts +12 -0
  343. package/dist/src/layer/components/index.d.ts.map +1 -0
  344. package/dist/src/layer/components/index.js +12 -0
  345. package/dist/src/layer/components/index.js.map +1 -0
  346. package/dist/src/layer/index.d.ts +22 -0
  347. package/dist/src/layer/index.d.ts.map +1 -0
  348. package/dist/src/layer/index.js +159 -0
  349. package/dist/src/layer/index.js.map +1 -0
  350. package/dist/src/live/components/index.d.ts +15 -0
  351. package/dist/src/live/components/index.d.ts.map +1 -0
  352. package/dist/src/live/components/index.js +12 -0
  353. package/dist/src/live/components/index.js.map +1 -0
  354. package/dist/src/live/index.d.ts +29 -0
  355. package/dist/src/live/index.d.ts.map +1 -0
  356. package/dist/src/live/index.js +103 -0
  357. package/dist/src/live/index.js.map +1 -0
  358. package/dist/src/logging/index.d.ts +17 -0
  359. package/dist/src/logging/index.d.ts.map +1 -0
  360. package/dist/src/logging/index.js +68 -0
  361. package/dist/src/logging/index.js.map +1 -0
  362. package/dist/src/modal/components/index.d.ts +18 -0
  363. package/dist/src/modal/components/index.d.ts.map +1 -0
  364. package/dist/src/modal/components/index.js +20 -0
  365. package/dist/src/modal/components/index.js.map +1 -0
  366. package/dist/src/modal/index.d.ts +24 -0
  367. package/dist/src/modal/index.d.ts.map +1 -0
  368. package/dist/src/modal/index.js +184 -0
  369. package/dist/src/modal/index.js.map +1 -0
  370. package/dist/src/popover/components/index.d.ts +14 -0
  371. package/dist/src/popover/components/index.d.ts.map +1 -0
  372. package/dist/src/popover/components/index.js +16 -0
  373. package/dist/src/popover/components/index.js.map +1 -0
  374. package/dist/src/popover/index.d.ts +16 -0
  375. package/dist/src/popover/index.d.ts.map +1 -0
  376. package/dist/src/popover/index.js +140 -0
  377. package/dist/src/popover/index.js.map +1 -0
  378. package/dist/src/progress/components/index.d.ts +10 -0
  379. package/dist/src/progress/components/index.d.ts.map +1 -0
  380. package/dist/src/progress/components/index.js +14 -0
  381. package/dist/src/progress/components/index.js.map +1 -0
  382. package/dist/src/progress/index.d.ts +18 -0
  383. package/dist/src/progress/index.d.ts.map +1 -0
  384. package/dist/src/progress/index.js +89 -0
  385. package/dist/src/progress/index.js.map +1 -0
  386. package/dist/src/react/index.d.ts +17 -0
  387. package/dist/src/react/index.d.ts.map +1 -0
  388. package/dist/src/react/index.js +47 -0
  389. package/dist/src/react/index.js.map +1 -0
  390. package/dist/src/styles/index.d.ts +3 -0
  391. package/dist/src/styles/index.d.ts.map +1 -0
  392. package/dist/src/styles/index.js +14 -0
  393. package/dist/src/styles/index.js.map +1 -0
  394. package/dist/src/theme/components/index.d.ts +14 -0
  395. package/dist/src/theme/components/index.d.ts.map +1 -0
  396. package/dist/src/theme/components/index.js +13 -0
  397. package/dist/src/theme/components/index.js.map +1 -0
  398. package/dist/src/theme/index.d.ts +26 -0
  399. package/dist/src/theme/index.d.ts.map +1 -0
  400. package/dist/src/theme/index.js +119 -0
  401. package/dist/src/theme/index.js.map +1 -0
  402. package/dist/src/tooltip/components/index.d.ts +17 -0
  403. package/dist/src/tooltip/components/index.d.ts.map +1 -0
  404. package/dist/src/tooltip/components/index.js +20 -0
  405. package/dist/src/tooltip/components/index.js.map +1 -0
  406. package/dist/src/tooltip/index.d.ts +10 -0
  407. package/dist/src/tooltip/index.d.ts.map +1 -0
  408. package/dist/src/tooltip/index.js +171 -0
  409. package/dist/src/tooltip/index.js.map +1 -0
  410. package/dist/styles/index.d.ts +3 -0
  411. package/dist/styles/index.d.ts.map +1 -0
  412. package/dist/styles/index.js +14 -0
  413. package/dist/styles/index.js.map +1 -0
  414. package/dist/styles/tokens.scss +22 -0
  415. package/dist/styles/utils.scss +220 -0
  416. package/dist/theme/components/index.d.ts +14 -0
  417. package/dist/theme/components/index.d.ts.map +1 -0
  418. package/dist/theme/components/index.js +13 -0
  419. package/dist/theme/components/index.js.map +1 -0
  420. package/dist/theme/index.d.ts +26 -0
  421. package/dist/theme/index.d.ts.map +1 -0
  422. package/dist/theme/index.js +119 -0
  423. package/dist/theme/index.js.map +1 -0
  424. package/dist/tooltip/components/index.d.ts +17 -0
  425. package/dist/tooltip/components/index.d.ts.map +1 -0
  426. package/dist/tooltip/components/index.js +20 -0
  427. package/dist/tooltip/components/index.js.map +1 -0
  428. package/dist/tooltip/index.d.ts +10 -0
  429. package/dist/tooltip/index.d.ts.map +1 -0
  430. package/dist/tooltip/index.js +171 -0
  431. package/dist/tooltip/index.js.map +1 -0
  432. package/dist/tooltip/styles/index.scss +17 -0
  433. package/package.json +232 -0
package/README.md ADDED
@@ -0,0 +1,212 @@
1
+ # @trebired/frontend
2
+
3
+ Generic browser runtime systems for DOM binding, actions, overlays, theme state, live refresh, inputs, upload, and React rendering in the Trebired ecosystem.
4
+
5
+ `@trebired/frontend` owns reusable browser behavior. Callers own product routes, product copy, storage keys, icon systems, persistence, navigation, logging, and backend response contracts beyond the documented generic JSON shape.
6
+
7
+ ## Install
8
+
9
+ Runtime support: Bun 1+.
10
+
11
+ ```sh
12
+ bun i @trebired/frontend
13
+ ```
14
+
15
+ ## Quick Start
16
+
17
+ Bind the canonical runtime after your document shell is available:
18
+
19
+ ```ts
20
+ import { bindFrontendRuntime } from "@trebired/frontend";
21
+
22
+ bindFrontendRuntime(document, {
23
+ adapters: {
24
+ navigation: {
25
+ navigate(url) {
26
+ window.location.assign(url);
27
+ },
28
+ },
29
+ },
30
+ });
31
+ ```
32
+
33
+ Load only the SCSS systems your product uses:
34
+
35
+ ```scss
36
+ @use "@trebired/frontend/styles/tokens" as *;
37
+ @use "@trebired/frontend/styles/utils" as *;
38
+ @use "@trebired/frontend/actions/styles" as *;
39
+ @use "@trebired/frontend/flash/styles" as *;
40
+ @use "@trebired/frontend/progress/styles" as *;
41
+ @use "@trebired/frontend/layer/styles" as *;
42
+ @use "@trebired/frontend/tooltip/styles" as *;
43
+ @use "@trebired/frontend/popover/styles" as *;
44
+ @use "@trebired/frontend/modal/styles" as *;
45
+ @use "@trebired/frontend/inputs/styles" as *;
46
+ ```
47
+
48
+ Markup stays normal HTML:
49
+
50
+ ```html
51
+ <form method="post" action="/api/save" data-tbf-action>
52
+ <input name="title" />
53
+ <button type="submit" data-tbf-confetti="true">Save</button>
54
+ </form>
55
+
56
+ <button type="button" aria-controls="settings" data-tbf-modal-open>
57
+ Settings
58
+ </button>
59
+ <div id="settings" class="tbf-modal" data-tbf-modal aria-hidden="true">
60
+ <div class="tbf-modal__content" data-tbf-modal-content>
61
+ <button type="button" data-tbf-modal-close>Close</button>
62
+ </div>
63
+ </div>
64
+ ```
65
+
66
+ TSX components are available from system component subpaths when a product wants package-owned default markup:
67
+
68
+ ```tsx
69
+ import { UploadField } from "@trebired/frontend/inputs/components";
70
+
71
+ export function AvatarUpload() {
72
+ return (
73
+ <UploadField
74
+ name="avatar"
75
+ accept="image/png,image/jpeg"
76
+ crop={true}
77
+ preview={true}
78
+ drop={true}
79
+ emptyToggle={{ name: "avatar_empty", value: "1" }}
80
+ />
81
+ );
82
+ }
83
+ ```
84
+
85
+ ## Concepts
86
+
87
+ ### Runtime Ownership
88
+
89
+ The package exposes feature binders such as `bindActionForms(root)`, `bindTooltips(root)`, `bindModals(root)`, `bindUploads(root)`, and the root `bindFrontendRuntime(root, options)` binder. Binders are idempotent and accept `Document`, `HTMLElement`, or `DocumentFragment` roots.
90
+
91
+ ### Adapter Boundary
92
+
93
+ Options accept adapters for logger, i18n, navigation, reload, progress, flash, theme persistence, and live skip checks. Defaults stay browser-generic. Runtime logging uses `@trebired/logger-adapter` and emits under `trebired.frontend.*`.
94
+
95
+ ### Data Attributes
96
+
97
+ The package-owned selectors use `data-tbf-*` attributes. They never require custom elements.
98
+
99
+ ### Markup Components
100
+
101
+ Component subpaths render real HTML with `data-tbf-*` attributes and `tbf-*` classes. They are not exported from `@trebired/frontend`, so the root runtime stays browser-behavior only.
102
+
103
+ Upload markup includes hidden file and directory inputs, mixed file/folder buttons, multiple-file support, drag/drop slots, accepted-format metadata, preview slots, list output, clear-current-preview state, crop config, a crop hidden field, and an empty-toggle hidden field.
104
+
105
+ ## Configuration
106
+
107
+ ### Runtime Options
108
+
109
+ `bindFrontendRuntime(root, options)` accepts:
110
+
111
+ - `adapters.logger`
112
+ - `adapters.loggerAdapter`
113
+ - `adapters.defaultLogger`
114
+ - `adapters.i18n`
115
+ - `adapters.navigation`
116
+ - `adapters.reload`
117
+ - `adapters.progress`
118
+ - `adapters.flash`
119
+ - `adapters.themePersistence`
120
+ - `adapters.live`
121
+ - `theme`
122
+ - `live`
123
+ - `observe`
124
+ - `frontend_quiet`
125
+ - `quiet`
126
+
127
+ Set `frontend_quiet: true`, `quiet: true`, `globalThis.frontend_quiet = true`, or `<html data-tbf-frontend-quiet="true">` to disable package runtime logging.
128
+
129
+ ## Runtime
130
+
131
+ ### Binding Order
132
+
133
+ The canonical runtime binds theme, layer roots, progress, flash, inputs, uploads, tooltips, popovers, modals, actions, and live refresh in that order.
134
+
135
+ ### CSS
136
+
137
+ There is no aggregate CSS file. Each style-owning system exposes SCSS through package exports so `@trebired/bundler` can resolve package `sass` and `style` conditions from `node_modules`.
138
+
139
+ Default SCSS is intentionally plain: `tbf-*` classes, CSS variables, black/white fallback colors, and square radius fallbacks. Products own visual polish by overriding variables.
140
+
141
+ Base exports:
142
+
143
+ - `@trebired/frontend/styles/tokens`
144
+ - `@trebired/frontend/styles/utils`
145
+
146
+ System exports:
147
+
148
+ - `@trebired/frontend/actions/styles`
149
+ - `@trebired/frontend/flash/styles`
150
+ - `@trebired/frontend/progress/styles`
151
+ - `@trebired/frontend/layer/styles`
152
+ - `@trebired/frontend/tooltip/styles`
153
+ - `@trebired/frontend/popover/styles`
154
+ - `@trebired/frontend/modal/styles`
155
+ - `@trebired/frontend/inputs/styles`
156
+
157
+ ### Upload Crop
158
+
159
+ Upload crop uses `cropperjs` only through the upload crop path. The root runtime import and the normal `@trebired/frontend/inputs` import do not load cropper or TSX component modules until a crop session opens.
160
+
161
+ ## Public API
162
+
163
+ Entrypoints:
164
+
165
+ - `@trebired/frontend`
166
+ - `@trebired/frontend/dom`
167
+ - `@trebired/frontend/http`
168
+ - `@trebired/frontend/actions`
169
+ - `@trebired/frontend/actions/components`
170
+ - `@trebired/frontend/flash`
171
+ - `@trebired/frontend/flash/components`
172
+ - `@trebired/frontend/progress`
173
+ - `@trebired/frontend/progress/components`
174
+ - `@trebired/frontend/layer`
175
+ - `@trebired/frontend/layer/components`
176
+ - `@trebired/frontend/tooltip`
177
+ - `@trebired/frontend/tooltip/components`
178
+ - `@trebired/frontend/popover`
179
+ - `@trebired/frontend/popover/components`
180
+ - `@trebired/frontend/modal`
181
+ - `@trebired/frontend/modal/components`
182
+ - `@trebired/frontend/inputs`
183
+ - `@trebired/frontend/inputs/components`
184
+ - `@trebired/frontend/theme`
185
+ - `@trebired/frontend/theme/components`
186
+ - `@trebired/frontend/live`
187
+ - `@trebired/frontend/live/components`
188
+ - `@trebired/frontend/react`
189
+ - `@trebired/frontend/styles`
190
+ - `@trebired/frontend/styles/tokens`
191
+ - `@trebired/frontend/styles/utils`
192
+ - `@trebired/frontend/actions/styles`
193
+ - `@trebired/frontend/flash/styles`
194
+ - `@trebired/frontend/progress/styles`
195
+ - `@trebired/frontend/layer/styles`
196
+ - `@trebired/frontend/tooltip/styles`
197
+ - `@trebired/frontend/popover/styles`
198
+ - `@trebired/frontend/modal/styles`
199
+ - `@trebired/frontend/inputs/styles`
200
+
201
+ ## What It Does Not Do
202
+
203
+ This package does not:
204
+
205
+ - define custom elements
206
+ - render Markdown or MDX
207
+ - export markup components from the root entrypoint
208
+ - ship an aggregate `styles.css`
209
+ - own product routes, domains, copy, or storage keys
210
+ - require a specific icon system
211
+ - migrate an existing application to consume the package
212
+ - replace framework-specific component libraries
@@ -0,0 +1,8 @@
1
+ import { type BindRoot } from "../dom/index.d.ts";
2
+ import type { ActionJson, SubmitActionButtonOptions } from "./types.js";
3
+ declare const ACTION_BUTTON_SELECTOR = "[data-tbf-submit],[data-tbf-action-url]";
4
+ declare function submitActionButton(button: HTMLElement, event?: Event, options?: SubmitActionButtonOptions): Promise<ActionJson>;
5
+ declare function bindActionButton(button: HTMLElement | null, options?: SubmitActionButtonOptions): boolean;
6
+ declare function bindActionButtons(root?: BindRoot, options?: SubmitActionButtonOptions): void;
7
+ export { ACTION_BUTTON_SELECTOR, bindActionButton, bindActionButtons, submitActionButton, };
8
+ //# sourceMappingURL=buttons.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buttons.d.ts","sourceRoot":"","sources":["../../../src/actions/buttons.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,QAAQ,EACd,MAAM,eAAe,CAAC;AAKvB,OAAO,KAAK,EAAE,UAAU,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAExE,QAAA,MAAM,sBAAsB,4CACe,CAAC;AAqE5C,iBAAe,kBAAkB,CAC/B,MAAM,EAAE,WAAW,EACnB,KAAK,CAAC,EAAE,KAAK,EACb,OAAO,GAAE,yBAA8B,uBAmCxC;AAED,iBAAS,gBAAgB,CACvB,MAAM,EAAE,WAAW,GAAG,IAAI,EAC1B,OAAO,GAAE,yBAA8B,WASxC;AAED,iBAAS,iBAAiB,CAAC,IAAI,GAAE,QAAmB,EAAE,OAAO,GAAE,yBAA8B,QAI5F;AAED,OAAO,EACL,sBAAsB,EACtB,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,GACnB,CAAC"}
@@ -0,0 +1,116 @@
1
+ import { queryAll, readDataJson, setControlDisabled, } from "../dom/index.js";
2
+ import { flash as defaultFlash } from "../flash/index.js";
3
+ import { maybeFireActionSuccessConfetti } from "./confetti.js";
4
+ import { handleJson } from "./request.js";
5
+ import { actionResponseOk } from "./response.js";
6
+ const ACTION_BUTTON_SELECTOR = "[data-tbf-submit],[data-tbf-action-url]";
7
+ const boundButtons = new WeakMap();
8
+ function buttonUrl(button, options) {
9
+ return String(options.url || button.getAttribute("data-tbf-action-url") || "").trim();
10
+ }
11
+ function buttonMethod(button, options) {
12
+ return String(options.method || button.getAttribute("data-tbf-action-method") || "post").toUpperCase();
13
+ }
14
+ function readButtonBody(button, options) {
15
+ if (options.body !== undefined)
16
+ return options.body;
17
+ return readDataJson(button, "data-tbf-action-body", {});
18
+ }
19
+ function dispatchActionButtonEvent(button, name, detail, cancelable = false) {
20
+ const event = new CustomEvent(name, {
21
+ bubbles: true,
22
+ cancelable,
23
+ detail: { ...detail, button },
24
+ });
25
+ button.dispatchEvent(event);
26
+ return event;
27
+ }
28
+ async function confirmActionButton(button, options) {
29
+ const configured = options.confirm === true || button.hasAttribute("data-tbf-confirm");
30
+ if (!configured && !button.hasAttribute("data-tbf-confirm-title"))
31
+ return true;
32
+ const detail = { button, confirm: null };
33
+ const event = dispatchActionButtonEvent(button, "tbf:action-confirm", detail, true);
34
+ if (event.defaultPrevented)
35
+ return false;
36
+ if (detail.confirm !== null && detail.confirm !== undefined) {
37
+ const value = typeof detail.confirm === "function" ? detail.confirm() : detail.confirm;
38
+ return Boolean(await value);
39
+ }
40
+ const flashApi = options.adapters?.flash || defaultFlash;
41
+ return await flashApi.confirmElement?.(button, button);
42
+ }
43
+ async function resolveCustomActionButtonRequest(button, options) {
44
+ if (typeof options.request === "function") {
45
+ return { handled: true, json: await options.request() };
46
+ }
47
+ const detail = { button, handled: false, json: null, request: null };
48
+ const event = dispatchActionButtonEvent(button, "tbf:action-request", detail, true);
49
+ if (!event.defaultPrevented && !detail.handled && detail.request == null) {
50
+ return { handled: false, json: null };
51
+ }
52
+ if (typeof detail.request === "function") {
53
+ return { handled: true, json: await detail.request() };
54
+ }
55
+ if (detail.request && typeof detail.request.then === "function") {
56
+ return { handled: true, json: await detail.request };
57
+ }
58
+ return { handled: true, json: detail.json };
59
+ }
60
+ async function submitActionButton(button, event, options = {}) {
61
+ event?.preventDefault();
62
+ event?.stopImmediatePropagation();
63
+ if (!(await confirmActionButton(button, options)))
64
+ return null;
65
+ const wasDisabled = button.hasAttribute("disabled") || button.disabled === true;
66
+ let json = null;
67
+ setControlDisabled(button, true);
68
+ try {
69
+ dispatchActionButtonEvent(button, "tbf:action-submit", {});
70
+ const custom = await resolveCustomActionButtonRequest(button, options);
71
+ json = custom.handled
72
+ ? custom.json
73
+ : await handleJson(buttonUrl(button, options), {
74
+ adapters: options.adapters,
75
+ body: readButtonBody(button, options),
76
+ method: buttonMethod(button, options),
77
+ ui: options.ui,
78
+ });
79
+ const ok = actionResponseOk(json);
80
+ if (ok)
81
+ maybeFireActionSuccessConfetti(button, options.successConfetti === true);
82
+ dispatchActionButtonEvent(button, "tbf:action-complete", { json, ok });
83
+ return json;
84
+ }
85
+ catch (error) {
86
+ dispatchActionButtonEvent(button, "tbf:action-complete", {
87
+ error,
88
+ json: null,
89
+ ok: false,
90
+ });
91
+ throw error;
92
+ }
93
+ finally {
94
+ if (!wasDisabled && options.keepDisabled?.(json) !== true) {
95
+ setControlDisabled(button, false);
96
+ }
97
+ }
98
+ }
99
+ function bindActionButton(button, options = {}) {
100
+ if (!(button instanceof HTMLElement) || boundButtons.has(button))
101
+ return false;
102
+ const handler = (event) => {
103
+ if (!event.defaultPrevented)
104
+ void submitActionButton(button, event, options);
105
+ };
106
+ button.addEventListener("click", handler);
107
+ boundButtons.set(button, handler);
108
+ return true;
109
+ }
110
+ function bindActionButtons(root = document, options = {}) {
111
+ queryAll(root, ACTION_BUTTON_SELECTOR).forEach((button) => {
112
+ bindActionButton(button, options);
113
+ });
114
+ }
115
+ export { ACTION_BUTTON_SELECTOR, bindActionButton, bindActionButtons, submitActionButton, };
116
+ //# sourceMappingURL=buttons.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buttons.js","sourceRoot":"","sources":["../../../src/actions/buttons.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import type { ButtonHTMLAttributes, FormHTMLAttributes, HTMLAttributes, ReactNode } from "react";
2
+ type ActionFormProps = FormHTMLAttributes<HTMLFormElement> & {
3
+ actionConfig?: Record<string, unknown>;
4
+ children?: ReactNode;
5
+ confirm?: boolean;
6
+ jsonBody?: boolean;
7
+ silent?: boolean;
8
+ successConfetti?: boolean;
9
+ };
10
+ type ActionButtonProps = ButtonHTMLAttributes<HTMLButtonElement> & {
11
+ actionBody?: Record<string, unknown>;
12
+ actionMethod?: string;
13
+ actionUrl?: string;
14
+ confirm?: boolean;
15
+ successConfetti?: boolean;
16
+ };
17
+ type ActionTriggerProps = HTMLAttributes<HTMLButtonElement> & {
18
+ action: string;
19
+ href?: string;
20
+ };
21
+ declare function ActionForm(props: ActionFormProps): import("react").JSX.Element;
22
+ declare function ActionButton(props: ActionButtonProps): import("react").JSX.Element;
23
+ declare function ActionTrigger(props: ActionTriggerProps): import("react").JSX.Element;
24
+ export { ActionButton, ActionForm, ActionTrigger };
25
+ export type { ActionButtonProps, ActionFormProps, ActionTriggerProps };
26
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/actions/components/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,oBAAoB,EACpB,kBAAkB,EAClB,cAAc,EACd,SAAS,EACV,MAAM,OAAO,CAAC;AAGf,KAAK,eAAe,GAAG,kBAAkB,CAAC,eAAe,CAAC,GAAG;IAC3D,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B,CAAC;AAEF,KAAK,iBAAiB,GAAG,oBAAoB,CAAC,iBAAiB,CAAC,GAAG;IACjE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B,CAAC;AAEF,KAAK,kBAAkB,GAAG,cAAc,CAAC,iBAAiB,CAAC,GAAG;IAC5D,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAWF,iBAAS,UAAU,CAAC,KAAK,EAAE,eAAe,+BA8BzC;AAED,iBAAS,YAAY,CAAC,KAAK,EAAE,iBAAiB,+BA0B7C;AAED,iBAAS,aAAa,CAAC,KAAK,EAAE,kBAAkB,+BAe/C;AAED,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,CAAC;AACnD,YAAY,EAAE,iBAAiB,EAAE,eAAe,EAAE,kBAAkB,EAAE,CAAC"}
@@ -0,0 +1,25 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { classNames, dataBool, jsonScript } from "../../components/index.js";
3
+ function actionConfig(props) {
4
+ return {
5
+ ...(props.actionConfig || {}),
6
+ ...(props.jsonBody ? { body: "json" } : {}),
7
+ ...(props.silent ? { silent: true } : {}),
8
+ ...(props.successConfetti ? { successConfetti: true } : {}),
9
+ };
10
+ }
11
+ function ActionForm(props) {
12
+ const { actionConfig: _actionConfig, children, className, confirm, jsonBody: _jsonBody, silent: _silent, successConfetti: _successConfetti, ...rest } = props;
13
+ const config = actionConfig(props);
14
+ return (_jsxs("form", { ...rest, className: classNames("tbf-form", className), "data-tbf-action": "", "data-tbf-confirm": dataBool(confirm), children: [Object.keys(config).length ? (_jsx("script", { "data-tbf-action-config": "", hidden: true, type: "application/json", dangerouslySetInnerHTML: { __html: jsonScript(config) } })) : null, children] }));
15
+ }
16
+ function ActionButton(props) {
17
+ const { actionBody, actionMethod, actionUrl, children, className, confirm, successConfetti, type = "button", ...rest } = props;
18
+ return (_jsx("button", { ...rest, className: classNames("tbf-button", className), "data-tbf-action-body": actionBody ? jsonScript(actionBody) : undefined, "data-tbf-action-method": actionMethod, "data-tbf-action-url": actionUrl, "data-tbf-confetti": dataBool(successConfetti), "data-tbf-confirm": dataBool(confirm), type: type, children: children }));
19
+ }
20
+ function ActionTrigger(props) {
21
+ const { action, children, className, href, role, tabIndex, ...rest } = props;
22
+ return (_jsx("button", { ...rest, className: classNames("tbf-action-trigger", className), "data-tbf-action-trigger": action, "data-tbf-href": href, role: role, tabIndex: tabIndex, type: "button", children: children }));
23
+ }
24
+ export { ActionButton, ActionForm, ActionTrigger };
25
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/actions/components/index.tsx"],"names":[],"mappings":";AAMA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAwBjE,SAAS,YAAY,CAAC,KAAsB;IAC1C,OAAO;QACL,GAAG,CAAC,KAAK,CAAC,YAAY,IAAI,EAAE,CAAC;QAC7B,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3C,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzC,GAAG,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC5D,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,KAAsB;IACxC,MAAM,EACJ,YAAY,EAAE,aAAa,EAC3B,QAAQ,EACR,SAAS,EACT,OAAO,EACP,QAAQ,EAAE,SAAS,EACnB,MAAM,EAAE,OAAO,EACf,eAAe,EAAE,gBAAgB,EACjC,GAAG,IAAI,EACR,GAAG,KAAK,CAAC;IACV,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IACnC,OAAO,CACL,mBACM,IAAI,EACR,SAAS,EAAE,UAAU,CAAC,UAAU,EAAE,SAAS,CAAC,qBAC5B,EAAE,sBACA,QAAQ,CAAC,OAAO,CAAC,aAElC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAC5B,2CACyB,EAAE,EACzB,MAAM,QACN,IAAI,EAAC,kBAAkB,EACvB,uBAAuB,EAAE,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,CAAC,EAAE,GACvD,CACH,CAAC,CAAC,CAAC,IAAI,EACP,QAAQ,IACJ,CACR,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,KAAwB;IAC5C,MAAM,EACJ,UAAU,EACV,YAAY,EACZ,SAAS,EACT,QAAQ,EACR,SAAS,EACT,OAAO,EACP,eAAe,EACf,IAAI,GAAG,QAAQ,EACf,GAAG,IAAI,EACR,GAAG,KAAK,CAAC;IACV,OAAO,CACL,oBACM,IAAI,EACR,SAAS,EAAE,UAAU,CAAC,YAAY,EAAE,SAAS,CAAC,0BACxB,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,4BAC7C,YAAY,yBACf,SAAS,uBACX,QAAQ,CAAC,eAAe,CAAC,sBAC1B,QAAQ,CAAC,OAAO,CAAC,EACnC,IAAI,EAAE,IAAI,YAET,QAAQ,GACF,CACV,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,KAAyB;IAC9C,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,GAAG,KAAK,CAAC;IAC7E,OAAO,CACL,oBACM,IAAI,EACR,SAAS,EAAE,UAAU,CAAC,oBAAoB,EAAE,SAAS,CAAC,6BAC7B,MAAM,mBAChB,IAAI,EACnB,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAC,QAAQ,YAEZ,QAAQ,GACF,CACV,CAAC;AACJ,CAAC;AAED,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,CAAC"}
@@ -0,0 +1,12 @@
1
+ declare const CONFETTI_EVENT = "tbf:confetti";
2
+ declare const CONFETTI_SELECTOR = "[data-tbf-confetti=\"true\"],[data-tbf-confetti=\"1\"]";
3
+ type ConfettiOptions = {
4
+ durationMs?: number;
5
+ particles?: number;
6
+ };
7
+ declare function shouldFireActionSuccessConfetti(trigger: HTMLElement | null, configured?: boolean): boolean;
8
+ declare function fireSuccessConfetti(options?: ConfettiOptions): boolean;
9
+ declare function maybeFireActionSuccessConfetti(trigger: HTMLElement | null, configured?: boolean, options?: ConfettiOptions): boolean;
10
+ export { CONFETTI_EVENT, CONFETTI_SELECTOR, fireSuccessConfetti, maybeFireActionSuccessConfetti, shouldFireActionSuccessConfetti, };
11
+ export type { ConfettiOptions };
12
+ //# sourceMappingURL=confetti.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"confetti.d.ts","sourceRoot":"","sources":["../../../src/actions/confetti.ts"],"names":[],"mappings":"AAAA,QAAA,MAAM,cAAc,iBAAiB,CAAC;AACtC,QAAA,MAAM,iBAAiB,2DAAuD,CAAC;AAE/E,KAAK,eAAe,GAAG;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,iBAAS,+BAA+B,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,EAAE,UAAU,UAAQ,WAGvF;AAED,iBAAS,mBAAmB,CAAC,OAAO,GAAE,eAAoB,WAsBzD;AAED,iBAAS,8BAA8B,CACrC,OAAO,EAAE,WAAW,GAAG,IAAI,EAC3B,UAAU,UAAQ,EAClB,OAAO,GAAE,eAAoB,WAI9B;AAED,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,mBAAmB,EACnB,8BAA8B,EAC9B,+BAA+B,GAChC,CAAC;AACF,YAAY,EAAE,eAAe,EAAE,CAAC"}
@@ -0,0 +1,36 @@
1
+ const CONFETTI_EVENT = "tbf:confetti";
2
+ const CONFETTI_SELECTOR = '[data-tbf-confetti="true"],[data-tbf-confetti="1"]';
3
+ function shouldFireActionSuccessConfetti(trigger, configured = false) {
4
+ if (configured)
5
+ return true;
6
+ return Boolean(trigger && trigger.matches(CONFETTI_SELECTOR));
7
+ }
8
+ function fireSuccessConfetti(options = {}) {
9
+ if (typeof document === "undefined")
10
+ return false;
11
+ const particles = Math.max(8, Math.min(80, Number(options.particles) || 36));
12
+ const layer = document.createElement("div");
13
+ layer.className = "tbf-confetti";
14
+ layer.setAttribute("aria-hidden", "true");
15
+ for (let index = 0; index < particles; index += 1) {
16
+ const piece = document.createElement("i");
17
+ piece.style.setProperty("--x", `${Math.random() * 100}vw`);
18
+ piece.style.setProperty("--d", `${Math.random() * 0.7 + 0.4}s`);
19
+ piece.style.setProperty("--r", `${Math.random() * 360}deg`);
20
+ piece.style.setProperty("--tbf-confetti-hue", `${Math.floor(Math.random() * 360)}deg`);
21
+ layer.appendChild(piece);
22
+ }
23
+ document.body.appendChild(layer);
24
+ document.dispatchEvent(new CustomEvent(CONFETTI_EVENT, {
25
+ detail: { layer, options },
26
+ }));
27
+ window.setTimeout(() => layer.remove(), Number(options.durationMs) || 1400);
28
+ return true;
29
+ }
30
+ function maybeFireActionSuccessConfetti(trigger, configured = false, options = {}) {
31
+ if (!shouldFireActionSuccessConfetti(trigger, configured))
32
+ return false;
33
+ return fireSuccessConfetti(options);
34
+ }
35
+ export { CONFETTI_EVENT, CONFETTI_SELECTOR, fireSuccessConfetti, maybeFireActionSuccessConfetti, shouldFireActionSuccessConfetti, };
36
+ //# sourceMappingURL=confetti.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"confetti.js","sourceRoot":"","sources":["../../../src/actions/confetti.ts"],"names":[],"mappings":"AAAA,MAAM,cAAc,GAAG,cAAc,CAAC;AACtC,MAAM,iBAAiB,GAAG,oDAAoD,CAAC;AAO/E,SAAS,+BAA+B,CAAC,OAA2B,EAAE,UAAU,GAAG,KAAK;IACtF,IAAI,UAAU;QAAE,OAAO,IAAI,CAAC;IAC5B,OAAO,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC;AAChE,CAAC;AAED,SAAS,mBAAmB,CAAC,UAA2B,EAAE;IACxD,IAAI,OAAO,QAAQ,KAAK,WAAW;QAAE,OAAO,KAAK,CAAC;IAClD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAC7E,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAC5C,KAAK,CAAC,SAAS,GAAG,cAAc,CAAC;IACjC,KAAK,CAAC,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;IAC1C,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,SAAS,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QAClD,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;QAC1C,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,IAAI,CAAC,CAAC;QAC3D,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;QAChE,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,KAAK,CAAC,CAAC;QAC5D,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,oBAAoB,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;QACvF,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC;IACD,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IACjC,QAAQ,CAAC,aAAa,CACpB,IAAI,WAAW,CAAC,cAAc,EAAE;QAC9B,MAAM,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE;KAC3B,CAAC,CACH,CAAC;IACF,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,CAAC;IAC5E,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,8BAA8B,CACrC,OAA2B,EAC3B,UAAU,GAAG,KAAK,EAClB,UAA2B,EAAE;IAE7B,IAAI,CAAC,+BAA+B,CAAC,OAAO,EAAE,UAAU,CAAC;QAAE,OAAO,KAAK,CAAC;IACxE,OAAO,mBAAmB,CAAC,OAAO,CAAC,CAAC;AACtC,CAAC;AAED,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,mBAAmB,EACnB,8BAA8B,EAC9B,+BAA+B,GAChC,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { type BindRoot } from "../dom/index.d.ts";
2
+ import type { SubmitActionFormOptions } from "./types.js";
3
+ declare const ACTION_FORM_SELECTOR = "form[data-tbf-action]";
4
+ declare const ACTION_CONFIG_SELECTOR = "script[type=\"application/json\"][data-tbf-action-config]";
5
+ declare function readActionFormConfig(form: HTMLFormElement): {
6
+ [x: string]: unknown;
7
+ };
8
+ declare function submitActionForm(form: HTMLFormElement, event?: SubmitEvent, options?: SubmitActionFormOptions): Promise<any>;
9
+ declare function bindActionForm(form: HTMLFormElement | null, options?: SubmitActionFormOptions): boolean;
10
+ declare function bindActionForms(root?: BindRoot, options?: SubmitActionFormOptions): void;
11
+ export { ACTION_CONFIG_SELECTOR, ACTION_FORM_SELECTOR, bindActionForm, bindActionForms, readActionFormConfig, submitActionForm, };
12
+ //# sourceMappingURL=forms.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forms.d.ts","sourceRoot":"","sources":["../../../src/actions/forms.ts"],"names":[],"mappings":"AAAA,OAAO,EAOL,KAAK,QAAQ,EACd,MAAM,eAAe,CAAC;AAMvB,OAAO,KAAK,EAEV,uBAAuB,EACxB,MAAM,YAAY,CAAC;AAEpB,QAAA,MAAM,oBAAoB,0BAA0B,CAAC;AACrD,QAAA,MAAM,sBAAsB,8DAC+B,CAAC;AAW5D,iBAAS,oBAAoB,CAAC,IAAI,EAAE,eAAe;;EAKlD;AA8GD,iBAAe,gBAAgB,CAC7B,IAAI,EAAE,eAAe,EACrB,KAAK,CAAC,EAAE,WAAW,EACnB,OAAO,GAAE,uBAA4B,gBA+CtC;AAED,iBAAS,cAAc,CACrB,IAAI,EAAE,eAAe,GAAG,IAAI,EAC5B,OAAO,GAAE,uBAA4B,WAStC;AAED,iBAAS,eAAe,CAAC,IAAI,GAAE,QAAmB,EAAE,OAAO,GAAE,uBAA4B,QAIxF;AAED,OAAO,EACL,sBAAsB,EACtB,oBAAoB,EACpB,cAAc,EACd,eAAe,EACf,oBAAoB,EACpB,gBAAgB,GACjB,CAAC"}
@@ -0,0 +1,159 @@
1
+ import { formDataFlatRecord, formDataSearchParams, queryAll, readDataJson, readElementJson, setControlDisabled, } from "../dom/index.js";
2
+ import { ensureFormCsrfToken } from "../http/index.js";
3
+ import { flash as defaultFlash } from "../flash/index.js";
4
+ import { maybeFireActionSuccessConfetti } from "./confetti.js";
5
+ import { handleJson } from "./request.js";
6
+ import { actionResponseOk } from "./response.js";
7
+ const ACTION_FORM_SELECTOR = "form[data-tbf-action]";
8
+ const ACTION_CONFIG_SELECTOR = 'script[type="application/json"][data-tbf-action-config]';
9
+ const boundForms = new WeakMap();
10
+ function submitterFor(event) {
11
+ return event?.submitter instanceof HTMLElement ? event.submitter : null;
12
+ }
13
+ function submitterAttr(submitter, attr) {
14
+ return String(submitter?.getAttribute(attr) || "").trim();
15
+ }
16
+ function readActionFormConfig(form) {
17
+ return {
18
+ ...readElementJson(form, ACTION_CONFIG_SELECTOR, {}),
19
+ ...readDataJson(form, "data-tbf-action-config", {}),
20
+ };
21
+ }
22
+ function resolveSubmitAction(form, submitter) {
23
+ return submitterAttr(submitter, "formaction") || form.action;
24
+ }
25
+ function resolveSubmitMethod(form, submitter) {
26
+ return (submitterAttr(submitter, "formmethod") ||
27
+ String(form.getAttribute("method") || form.method || "post")).toUpperCase();
28
+ }
29
+ function resolveSubmitEnctype(form, submitter) {
30
+ return (submitterAttr(submitter, "formenctype") ||
31
+ String(form.getAttribute("enctype") || form.enctype || "")).toLowerCase();
32
+ }
33
+ function formDataFromSubmit(form, submitter) {
34
+ const data = new FormData(form);
35
+ if (submitter instanceof HTMLButtonElement &&
36
+ submitter.name &&
37
+ submitter.value &&
38
+ !data.has(submitter.name)) {
39
+ data.append(submitter.name, submitter.value);
40
+ }
41
+ return data;
42
+ }
43
+ function createSubmitBody(form, submitter, config) {
44
+ const data = formDataFromSubmit(form, submitter);
45
+ if (config.body === "json")
46
+ return formDataFlatRecord(data);
47
+ return resolveSubmitEnctype(form, submitter) === "multipart/form-data"
48
+ ? data
49
+ : formDataSearchParams(data);
50
+ }
51
+ function dispatchActionFormEvent(form, name, detail, cancelable = false) {
52
+ const event = new CustomEvent(name, {
53
+ bubbles: true,
54
+ cancelable,
55
+ detail: { ...detail, form },
56
+ });
57
+ form.dispatchEvent(event);
58
+ return event;
59
+ }
60
+ async function confirmActionForm(form, submitter, options) {
61
+ const configured = options.confirm === true || form.hasAttribute("data-tbf-confirm");
62
+ if (!configured && !form.hasAttribute("data-tbf-confirm-title"))
63
+ return true;
64
+ const detail = { confirm: null, form, submitter };
65
+ const event = dispatchActionFormEvent(form, "tbf:action-confirm", detail, true);
66
+ if (event.defaultPrevented)
67
+ return false;
68
+ if (detail.confirm !== null && detail.confirm !== undefined) {
69
+ const value = typeof detail.confirm === "function" ? detail.confirm() : detail.confirm;
70
+ return Boolean(await value);
71
+ }
72
+ const flashApi = options.adapters?.flash || defaultFlash;
73
+ return await flashApi.confirmElement?.(submitter, form);
74
+ }
75
+ async function resolveCustomActionFormRequest(form, submitter, options) {
76
+ if (typeof options.request === "function") {
77
+ return { handled: true, json: await options.request(form, submitter) };
78
+ }
79
+ const detail = { form, handled: false, json: null, request: null, submitter };
80
+ const event = dispatchActionFormEvent(form, "tbf:action-request", detail, true);
81
+ if (!event.defaultPrevented && !detail.handled && detail.request == null) {
82
+ return { handled: false, json: null };
83
+ }
84
+ if (typeof detail.request === "function") {
85
+ return { handled: true, json: await detail.request() };
86
+ }
87
+ if (detail.request && typeof detail.request.then === "function") {
88
+ return { handled: true, json: await detail.request };
89
+ }
90
+ return { handled: true, json: detail.json };
91
+ }
92
+ function formUi(options, config) {
93
+ return {
94
+ ...(options.ui || {}),
95
+ ignoreResponseAction: options.ui?.ignoreResponseAction === true ||
96
+ config.ignoreResponseAction === true,
97
+ silent: options.ui?.silent === true || config.silent === true,
98
+ };
99
+ }
100
+ async function submitActionForm(form, event, options = {}) {
101
+ event?.preventDefault();
102
+ event?.stopImmediatePropagation();
103
+ const submitter = submitterFor(event);
104
+ if (!(await confirmActionForm(form, submitter, options)))
105
+ return null;
106
+ const config = readActionFormConfig(form);
107
+ setControlDisabled(submitter, true);
108
+ try {
109
+ ensureFormCsrfToken(form);
110
+ options.beforeSubmit?.(form, submitter);
111
+ dispatchActionFormEvent(form, "tbf:action-submit", { submitter });
112
+ const custom = await resolveCustomActionFormRequest(form, submitter, options);
113
+ const json = custom.handled
114
+ ? custom.json
115
+ : await handleJson(resolveSubmitAction(form, submitter), {
116
+ adapters: options.adapters,
117
+ body: createSubmitBody(form, submitter, config),
118
+ method: resolveSubmitMethod(form, submitter),
119
+ ui: formUi(options, config),
120
+ }, formUi(options, config));
121
+ const ok = actionResponseOk(json);
122
+ if (ok) {
123
+ maybeFireActionSuccessConfetti(submitter || form, config.successConfetti === true);
124
+ }
125
+ options.onComplete?.(ok, json);
126
+ dispatchActionFormEvent(form, "tbf:action-complete", { json, ok, submitter });
127
+ return json;
128
+ }
129
+ catch (error) {
130
+ options.onComplete?.(false, { ok: false });
131
+ dispatchActionFormEvent(form, "tbf:action-complete", {
132
+ error,
133
+ json: null,
134
+ ok: false,
135
+ submitter,
136
+ });
137
+ throw error;
138
+ }
139
+ finally {
140
+ setControlDisabled(submitter, false);
141
+ }
142
+ }
143
+ function bindActionForm(form, options = {}) {
144
+ if (!(form instanceof HTMLFormElement) || boundForms.has(form))
145
+ return false;
146
+ const handler = ((event) => {
147
+ void submitActionForm(form, event, options);
148
+ });
149
+ form.addEventListener("submit", handler, true);
150
+ boundForms.set(form, handler);
151
+ return true;
152
+ }
153
+ function bindActionForms(root = document, options = {}) {
154
+ queryAll(root, ACTION_FORM_SELECTOR).forEach((form) => {
155
+ bindActionForm(form, options);
156
+ });
157
+ }
158
+ export { ACTION_CONFIG_SELECTOR, ACTION_FORM_SELECTOR, bindActionForm, bindActionForms, readActionFormConfig, submitActionForm, };
159
+ //# sourceMappingURL=forms.js.map