@feugene/granularity 0.5.0 → 0.6.2

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 (189) hide show
  1. package/dist/chunks/{adapter-K6zZTzBi.js.map → adapter-CRyH4YC8.js.map} +1 -1
  2. package/dist/chunks/{config-Cgk5ti-b.js.map → config-3SftO0uG.js.map} +1 -1
  3. package/dist/chunks/{config-BN-B2K4r.js.map → config-B44QVIge.js.map} +1 -1
  4. package/dist/chunks/{config-C-GVBa19.js.map → config-B8rC_K97.js.map} +1 -1
  5. package/dist/chunks/{config-DEv4m-ZP.js.map → config-BXffa3ta.js.map} +1 -1
  6. package/dist/chunks/{config-CUgvsjZx.js.map → config-BhvNm4Pp.js.map} +1 -1
  7. package/dist/chunks/{config-BNOf_qjD.js.map → config-C0b_3LJV.js.map} +1 -1
  8. package/dist/chunks/config-C0rHS1-l.js.map +1 -0
  9. package/dist/chunks/{config-fCcRwjIB.js.map → config-C4qAA0Sb.js.map} +1 -1
  10. package/dist/chunks/{config-XwI6t8cn.js.map → config-C5TN9J2Z.js.map} +1 -1
  11. package/dist/chunks/config-CVnluhKO.js.map +1 -0
  12. package/dist/chunks/{config-DUtUkSzc.js.map → config-CjEplP6D.js.map} +1 -1
  13. package/dist/chunks/{config-D19pyP4D.js.map → config-CtomKf-k.js.map} +1 -1
  14. package/dist/chunks/{config-BvuQUBtZ.js.map → config-CxCAfXZ1.js.map} +1 -1
  15. package/dist/chunks/{config-BDiLiqSk.js.map → config-D1DI3roo.js.map} +1 -1
  16. package/dist/chunks/{config-CgjOJ3aF.js.map → config-D27BL0H9.js.map} +1 -1
  17. package/dist/chunks/config-D32znLtV2.js.map +1 -0
  18. package/dist/chunks/{config-YSOeh6cy.js.map → config-D6Af6WZw.js.map} +1 -1
  19. package/dist/chunks/{config-BulF0Bf-.js.map → config-D98m8iyz.js.map} +1 -1
  20. package/dist/chunks/config-DDLoUczC.js.map +1 -0
  21. package/dist/chunks/{config-CFcv0hjb.js.map → config-DQOSlWvp.js.map} +1 -1
  22. package/dist/chunks/{config-ndXqsz5A.js.map → config-DbqFk-IW.js.map} +1 -1
  23. package/dist/chunks/{config-CdHY0Z7L.js.map → config-DnsISjD8.js.map} +1 -1
  24. package/dist/chunks/{config-BFZN9-vt.js.map → config-DudL02ag.js.map} +1 -1
  25. package/dist/chunks/{config-DgRJlF00.js.map → config-Dusr9jcE.js.map} +1 -1
  26. package/dist/chunks/{config-CWvHiaqr2.js.map → config-DxqMXzNV2.js.map} +1 -1
  27. package/dist/chunks/config-Mp9DJ9Mq2.js.map +1 -0
  28. package/dist/chunks/{config-R0jaXatX.js → config-XoANT5mU.js} +1 -1
  29. package/dist/chunks/{config-R0jaXatX.js.map → config-XoANT5mU.js.map} +1 -1
  30. package/dist/chunks/config-ZJVOVgqR.js +22 -0
  31. package/dist/chunks/config-ZJVOVgqR.js.map +1 -0
  32. package/dist/chunks/{config-CM7nbATU2.js.map → config-rxFL-6yF2.js.map} +1 -1
  33. package/dist/chunks/{config-bpQYM5O-.js.map → config-wo-ncgTH.js.map} +1 -1
  34. package/dist/chunks/{en-BeJa78lP.js.map → en-BMjJZttK.js.map} +1 -1
  35. package/dist/chunks/{es-BPqm7rLm.js → es-Cu_RlgIr.js} +3 -3
  36. package/dist/chunks/{es-BPqm7rLm.js.map → es-Cu_RlgIr.js.map} +1 -1
  37. package/dist/chunks/{es-axYOwwWD.js.map → es-EYCf8G_1.js.map} +1 -1
  38. package/dist/chunks/{grSelectStyles-daEeDlBn.js.map → grSelectStyles-DTAYNzxn.js.map} +1 -1
  39. package/dist/chunks/grStyle-5EMYYctb.js +19 -0
  40. package/dist/chunks/grStyle-5EMYYctb.js.map +1 -0
  41. package/dist/chunks/{granularityI18n-GCqUz_lo.js → granularityI18n-Dm4DuCS9.js} +1 -1
  42. package/dist/chunks/{granularityI18n-GCqUz_lo.js.map → granularityI18n-Dm4DuCS9.js.map} +1 -1
  43. package/dist/chunks/{ru-Dqh-2C00.js.map → ru-DKswMSdd.js.map} +1 -1
  44. package/dist/chunks/{shared-CyCPkimZ.js → shared-DO3Sr5FJ.js} +30 -30
  45. package/dist/chunks/{shared-CyCPkimZ.js.map → shared-DO3Sr5FJ.js.map} +1 -1
  46. package/dist/components/GrFileUpload/chunks/{GrFileUpload-u01j9S0t.js → GrFileUpload-DYRERhI2.js} +258 -37
  47. package/dist/components/GrFileUpload/chunks/GrFileUpload-DYRERhI2.js.map +1 -0
  48. package/dist/components/GrFileUpload/index.js +3 -3
  49. package/dist/components/GrFormField/chunks/{GrFormField-C6PfAs4u.js.map → GrFormField-C1oWTT_0.js.map} +1 -1
  50. package/dist/components/GrFormField/index.js +2 -2
  51. package/dist/components/GrFormFile/chunks/{GrFormFile-DdM8Bc2B.js.map → GrFormFile-deDPicM2.js.map} +1 -1
  52. package/dist/components/GrFormFile/index.js +2 -2
  53. package/dist/components/GrFormSection/chunks/{GrFormSection-5djEaQZQ.js.map → GrFormSection-CWBk2EUm.js.map} +1 -1
  54. package/dist/components/GrFormSection/index.js +2 -2
  55. package/dist/components/GrImageViewer/chunks/{GrImageViewer-CjSnohW7.js.map → GrImageViewer-Cpj5zyZQ.js.map} +1 -1
  56. package/dist/components/GrImageViewer/index.js +2 -2
  57. package/dist/components/GrInput/chunks/{GrInput-ghxaTf6d.js.map → GrInput-CfO2RsM-.js.map} +1 -1
  58. package/dist/components/GrInput/index.js +2 -2
  59. package/dist/components/GrInputTag/chunks/{GrInputTag-B0x4U0Yk.js → GrInputTag-G_VYJPF9.js} +1 -1
  60. package/dist/components/GrInputTag/chunks/{GrInputTag-B0x4U0Yk.js.map → GrInputTag-G_VYJPF9.js.map} +1 -1
  61. package/dist/components/GrInputTag/index.js +2 -2
  62. package/dist/components/GrLink/chunks/{GrLink-DvvNkP0M.js → GrLink-BLPigqij.js} +1 -1
  63. package/dist/components/GrLink/chunks/{GrLink-DvvNkP0M.js.map → GrLink-BLPigqij.js.map} +1 -1
  64. package/dist/components/GrLink/index.js +2 -2
  65. package/dist/components/GrList/chunks/{GrList--Ib4zLNw.js.map → GrList-BPjQf-72.js.map} +1 -1
  66. package/dist/components/GrList/index.js +2 -2
  67. package/dist/components/GrLoading/index.js +1 -1
  68. package/dist/components/GrModal/index.js +1 -1
  69. package/dist/components/GrNavbar/chunks/{GrNavbar-nIyuiVj1.js → GrNavbar-BDIKAYfN.js} +1 -1
  70. package/dist/components/GrNavbar/chunks/{GrNavbar-nIyuiVj1.js.map → GrNavbar-BDIKAYfN.js.map} +1 -1
  71. package/dist/components/GrNavbar/index.js +2 -2
  72. package/dist/components/GrNumberInput/chunks/{GrNumberInput-B0mPLjdv.js → GrNumberInput-ECtFCIKV.js} +1 -1
  73. package/dist/components/GrNumberInput/chunks/{GrNumberInput-B0mPLjdv.js.map → GrNumberInput-ECtFCIKV.js.map} +1 -1
  74. package/dist/components/GrNumberInput/index.js +2 -2
  75. package/dist/components/GrPagination/chunks/{GrPagination-C_rxGwfY.js → GrPagination-BZlH-uEd.js} +2 -2
  76. package/dist/components/GrPagination/chunks/{GrPagination-C_rxGwfY.js.map → GrPagination-BZlH-uEd.js.map} +1 -1
  77. package/dist/components/GrPagination/index.js +2 -2
  78. package/dist/components/GrProgressBar/chunks/{GrProgressBar-MvMnzsJl.js → GrProgressBar-hQQK8cYh.js} +1 -1
  79. package/dist/components/GrProgressBar/chunks/{GrProgressBar-MvMnzsJl.js.map → GrProgressBar-hQQK8cYh.js.map} +1 -1
  80. package/dist/components/GrProgressBar/index.js +2 -2
  81. package/dist/components/GrPromptDialog/chunks/{GrPromptDialog-DKhbN6ji.js → GrPromptDialog-CUMW6_58.js} +2 -2
  82. package/dist/components/GrPromptDialog/chunks/{GrPromptDialog-DKhbN6ji.js.map → GrPromptDialog-CUMW6_58.js.map} +1 -1
  83. package/dist/components/GrPromptDialog/index.js +2 -2
  84. package/dist/components/GrRadio/chunks/{GrRadio-BxBs3WHq.js → GrRadio-B_t_ZNVl.js} +1 -1
  85. package/dist/components/GrRadio/chunks/{GrRadio-BxBs3WHq.js.map → GrRadio-B_t_ZNVl.js.map} +1 -1
  86. package/dist/components/GrRadio/index.js +2 -2
  87. package/dist/components/GrRadioGroup/chunks/{GrRadioGroup-CEAfJQ6A.js → GrRadioGroup-CVlgpUBr.js} +1 -1
  88. package/dist/components/GrRadioGroup/chunks/{GrRadioGroup-CEAfJQ6A.js.map → GrRadioGroup-CVlgpUBr.js.map} +1 -1
  89. package/dist/components/GrRadioGroup/index.js +2 -2
  90. package/dist/components/GrSegmented/chunks/{GrSegmented-Bwn2qOY4.js → GrSegmented-BPl1koHc.js} +1 -1
  91. package/dist/components/GrSegmented/chunks/{GrSegmented-Bwn2qOY4.js.map → GrSegmented-BPl1koHc.js.map} +1 -1
  92. package/dist/components/GrSegmented/index.js +2 -2
  93. package/dist/components/GrSelect/chunks/{GrSelect-BMMT5MrT.js → GrSelect-C3NAfTqL.js} +2 -2
  94. package/dist/components/GrSelect/chunks/{GrSelect-BMMT5MrT.js.map → GrSelect-C3NAfTqL.js.map} +1 -1
  95. package/dist/components/GrSelect/index.js +2 -2
  96. package/dist/components/GrSidebar/chunks/{GrSidebar-CSZ3RpFB.js.map → GrSidebar-DVucgcfV.js.map} +1 -1
  97. package/dist/components/GrSidebar/index.js +2 -2
  98. package/dist/components/GrSkeleton/chunks/{GrSkeleton-DKXkqWDa.js.map → GrSkeleton-CDTvCSoH.js.map} +1 -1
  99. package/dist/components/GrSkeleton/index.js +2 -2
  100. package/dist/components/GrSwitch/chunks/{GrSwitch-CdBxwV3k.js → GrSwitch-Bnamgqb2.js} +1 -1
  101. package/dist/components/GrSwitch/chunks/{GrSwitch-CdBxwV3k.js.map → GrSwitch-Bnamgqb2.js.map} +1 -1
  102. package/dist/components/GrSwitch/index.js +2 -2
  103. package/dist/components/GrTable/index.js +1 -1
  104. package/dist/components/GrTabs/chunks/{GrTabs-BpF8AAUz.js.map → GrTabs-CiGmcmvm.js.map} +1 -1
  105. package/dist/components/GrTabs/index.js +2 -2
  106. package/dist/components/GrTextarea/chunks/{GrTextarea-DFS9ZkrA.js → GrTextarea-VBSc6A7D.js} +1 -1
  107. package/dist/components/GrTextarea/chunks/{GrTextarea-DFS9ZkrA.js.map → GrTextarea-VBSc6A7D.js.map} +1 -1
  108. package/dist/components/GrTextarea/index.js +2 -2
  109. package/dist/components/GrToaster/chunks/{GrToaster-3Mf0Moxt.js → GrToaster-I1e-zCpf.js} +1 -1
  110. package/dist/components/GrToaster/chunks/{GrToaster-3Mf0Moxt.js.map → GrToaster-I1e-zCpf.js.map} +1 -1
  111. package/dist/components/GrToaster/index.js +2 -2
  112. package/dist/components/GrTooltip/chunks/{GrTooltip-BvmsukLW.js.map → GrTooltip-CrV1gI_c.js.map} +1 -1
  113. package/dist/components/GrTooltip/index.js +2 -2
  114. package/dist/components/GrTree/chunks/{GrTree-C2kN-O4Q.js.map → GrTree-Dlev9oBd.js.map} +1 -1
  115. package/dist/components/GrTree/index.js +2 -2
  116. package/dist/components/GrTreeSelect/chunks/{GrTreeSelect-N-oPAOFj.js → GrTreeSelect-n0CZT4Ic.js} +4 -4
  117. package/dist/components/GrTreeSelect/chunks/{GrTreeSelect-N-oPAOFj.js.map → GrTreeSelect-n0CZT4Ic.js.map} +1 -1
  118. package/dist/components/GrTreeSelect/index.js +2 -2
  119. package/dist/directives/dropzone.js +17 -4
  120. package/dist/directives/dropzone.js.map +1 -1
  121. package/dist/directives/loading.js +15 -0
  122. package/dist/directives/loading.js.map +1 -1
  123. package/dist/granular-provider-node.js +2 -2
  124. package/dist/granular-provider.js +1 -1
  125. package/dist/i18n/all.js +1 -1
  126. package/dist/i18n/index.js +2 -2
  127. package/dist/index.js +59 -58
  128. package/dist/index.js.map +1 -1
  129. package/dist/types/src/components/GrFileUpload/GrFileUpload.vue.d.ts +58 -5
  130. package/dist/types/src/components/GrFileUpload/index.d.ts +4 -0
  131. package/dist/types/src/components/GrFileUpload/uploadState.d.ts +38 -0
  132. package/dist/types/src/components/GrFileUpload/uploadViaXhr.d.ts +33 -0
  133. package/dist/types/src/components/GrImageViewer/GrImageViewer.vue.d.ts +1 -1
  134. package/dist/types/src/components/GrInput/GrInput.vue.d.ts +1 -1
  135. package/dist/types/src/components/GrNumberInput/GrNumberInput.vue.d.ts +1 -1
  136. package/dist/types/src/components/GrTextarea/GrTextarea.vue.d.ts +1 -1
  137. package/package.json +1 -1
  138. package/dist/chunks/config-BGmiXpR82.js.map +0 -1
  139. package/dist/chunks/config-CA9XwYnZ2.js.map +0 -1
  140. package/dist/chunks/config-CsMIhZfM.js.map +0 -1
  141. package/dist/chunks/config-CwLoozAz2.js.map +0 -1
  142. package/dist/chunks/config-DCQO6H6h.js.map +0 -1
  143. package/dist/chunks/config-Da90XGsi.js +0 -38
  144. package/dist/chunks/config-Da90XGsi.js.map +0 -1
  145. package/dist/components/GrFileUpload/chunks/GrFileUpload-u01j9S0t.js.map +0 -1
  146. /package/dist/chunks/{adapter-K6zZTzBi.js → adapter-CRyH4YC8.js} +0 -0
  147. /package/dist/chunks/{config-Cgk5ti-b.js → config-3SftO0uG.js} +0 -0
  148. /package/dist/chunks/{config-BN-B2K4r.js → config-B44QVIge.js} +0 -0
  149. /package/dist/chunks/{config-C-GVBa19.js → config-B8rC_K97.js} +0 -0
  150. /package/dist/chunks/{config-DEv4m-ZP.js → config-BXffa3ta.js} +0 -0
  151. /package/dist/chunks/{config-CUgvsjZx.js → config-BhvNm4Pp.js} +0 -0
  152. /package/dist/chunks/{config-BNOf_qjD.js → config-C0b_3LJV.js} +0 -0
  153. /package/dist/chunks/{config-CA9XwYnZ2.js → config-C0rHS1-l.js} +0 -0
  154. /package/dist/chunks/{config-fCcRwjIB.js → config-C4qAA0Sb.js} +0 -0
  155. /package/dist/chunks/{config-XwI6t8cn.js → config-C5TN9J2Z.js} +0 -0
  156. /package/dist/chunks/{config-BGmiXpR82.js → config-CVnluhKO.js} +0 -0
  157. /package/dist/chunks/{config-DUtUkSzc.js → config-CjEplP6D.js} +0 -0
  158. /package/dist/chunks/{config-D19pyP4D.js → config-CtomKf-k.js} +0 -0
  159. /package/dist/chunks/{config-BvuQUBtZ.js → config-CxCAfXZ1.js} +0 -0
  160. /package/dist/chunks/{config-BDiLiqSk.js → config-D1DI3roo.js} +0 -0
  161. /package/dist/chunks/{config-CgjOJ3aF.js → config-D27BL0H9.js} +0 -0
  162. /package/dist/chunks/{config-DCQO6H6h.js → config-D32znLtV2.js} +0 -0
  163. /package/dist/chunks/{config-YSOeh6cy.js → config-D6Af6WZw.js} +0 -0
  164. /package/dist/chunks/{config-BulF0Bf-.js → config-D98m8iyz.js} +0 -0
  165. /package/dist/chunks/{config-CwLoozAz2.js → config-DDLoUczC.js} +0 -0
  166. /package/dist/chunks/{config-CFcv0hjb.js → config-DQOSlWvp.js} +0 -0
  167. /package/dist/chunks/{config-ndXqsz5A.js → config-DbqFk-IW.js} +0 -0
  168. /package/dist/chunks/{config-CdHY0Z7L.js → config-DnsISjD8.js} +0 -0
  169. /package/dist/chunks/{config-BFZN9-vt.js → config-DudL02ag.js} +0 -0
  170. /package/dist/chunks/{config-DgRJlF00.js → config-Dusr9jcE.js} +0 -0
  171. /package/dist/chunks/{config-CWvHiaqr2.js → config-DxqMXzNV2.js} +0 -0
  172. /package/dist/chunks/{config-CsMIhZfM.js → config-Mp9DJ9Mq2.js} +0 -0
  173. /package/dist/chunks/{config-CM7nbATU2.js → config-rxFL-6yF2.js} +0 -0
  174. /package/dist/chunks/{config-bpQYM5O-.js → config-wo-ncgTH.js} +0 -0
  175. /package/dist/chunks/{en-BeJa78lP.js → en-BMjJZttK.js} +0 -0
  176. /package/dist/chunks/{es-axYOwwWD.js → es-EYCf8G_1.js} +0 -0
  177. /package/dist/chunks/{grSelectStyles-daEeDlBn.js → grSelectStyles-DTAYNzxn.js} +0 -0
  178. /package/dist/chunks/{ru-Dqh-2C00.js → ru-DKswMSdd.js} +0 -0
  179. /package/dist/components/GrFormField/chunks/{GrFormField-C6PfAs4u.js → GrFormField-C1oWTT_0.js} +0 -0
  180. /package/dist/components/GrFormFile/chunks/{GrFormFile-DdM8Bc2B.js → GrFormFile-deDPicM2.js} +0 -0
  181. /package/dist/components/GrFormSection/chunks/{GrFormSection-5djEaQZQ.js → GrFormSection-CWBk2EUm.js} +0 -0
  182. /package/dist/components/GrImageViewer/chunks/{GrImageViewer-CjSnohW7.js → GrImageViewer-Cpj5zyZQ.js} +0 -0
  183. /package/dist/components/GrInput/chunks/{GrInput-ghxaTf6d.js → GrInput-CfO2RsM-.js} +0 -0
  184. /package/dist/components/GrList/chunks/{GrList--Ib4zLNw.js → GrList-BPjQf-72.js} +0 -0
  185. /package/dist/components/GrSidebar/chunks/{GrSidebar-CSZ3RpFB.js → GrSidebar-DVucgcfV.js} +0 -0
  186. /package/dist/components/GrSkeleton/chunks/{GrSkeleton-DKXkqWDa.js → GrSkeleton-CDTvCSoH.js} +0 -0
  187. /package/dist/components/GrTabs/chunks/{GrTabs-BpF8AAUz.js → GrTabs-CiGmcmvm.js} +0 -0
  188. /package/dist/components/GrTooltip/chunks/{GrTooltip-BvmsukLW.js → GrTooltip-CrV1gI_c.js} +0 -0
  189. /package/dist/components/GrTree/chunks/{GrTree-C2kN-O4Q.js → GrTree-Dlev9oBd.js} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"granularityI18n-GCqUz_lo.js","names":[],"sources":["../../src/internal/granularityI18n.ts"],"sourcesContent":["import { getCurrentInstance, inject, type AppContext } from 'vue'\n\nimport { GRANULARITY_I18N_KEY, type GranularityI18nAdapter } from '../i18n/adapter'\n\nexport type GranularityI18nLike = GranularityI18nAdapter\n\nfunction isGranularityI18nLike(value: unknown): value is GranularityI18nLike {\n return typeof (value as GranularityI18nLike | null)?.t === 'function'\n}\n\nexport function resolveGranularityI18n(context?: AppContext | GranularityI18nLike | null): GranularityI18nLike | null {\n if (isGranularityI18nLike(context)) {\n return context\n }\n\n const provides = context?.provides\n\n if (provides) {\n return provides[GRANULARITY_I18N_KEY as symbol] as GranularityI18nLike | null\n }\n\n return getCurrentInstance() ? inject(GRANULARITY_I18N_KEY, null) : null\n}\n\nexport function useGranularityTranslations(context?: AppContext | GranularityI18nLike | null) {\n const i18n = resolveGranularityI18n(context)\n\n const t = (key: string, fallback: string, params?: Record<string, any>): string => {\n if (!i18n) {\n return fallback\n }\n\n const result = i18n.t(key, params)\n return result === key ? fallback : result\n }\n\n return {\n i18n,\n t,\n }\n}"],"mappings":";;;AAMA,SAAS,sBAAsB,OAA8C;AAC3E,QAAO,OAAQ,OAAsC,MAAM;;AAG7D,SAAgB,uBAAuB,SAA+E;AACpH,KAAI,sBAAsB,QAAQ,CAChC,QAAO;CAGT,MAAM,WAAW,SAAS;AAE1B,KAAI,SACF,QAAO,SAAS;AAGlB,QAAO,oBAAoB,GAAG,OAAO,sBAAsB,KAAK,GAAG;;AAGrE,SAAgB,2BAA2B,SAAmD;CAC5F,MAAM,OAAO,uBAAuB,QAAQ;CAE5C,MAAM,KAAK,KAAa,UAAkB,WAAyC;AACjF,MAAI,CAAC,KACH,QAAO;EAGT,MAAM,SAAS,KAAK,EAAE,KAAK,OAAO;AAClC,SAAO,WAAW,MAAM,WAAW;;AAGrC,QAAO;EACL;EACA;EACD"}
1
+ {"version":3,"file":"granularityI18n-Dm4DuCS9.js","names":[],"sources":["../../src/internal/granularityI18n.ts"],"sourcesContent":["import { getCurrentInstance, inject, type AppContext } from 'vue'\n\nimport { GRANULARITY_I18N_KEY, type GranularityI18nAdapter } from '../i18n/adapter'\n\nexport type GranularityI18nLike = GranularityI18nAdapter\n\nfunction isGranularityI18nLike(value: unknown): value is GranularityI18nLike {\n return typeof (value as GranularityI18nLike | null)?.t === 'function'\n}\n\nexport function resolveGranularityI18n(context?: AppContext | GranularityI18nLike | null): GranularityI18nLike | null {\n if (isGranularityI18nLike(context)) {\n return context\n }\n\n const provides = context?.provides\n\n if (provides) {\n return provides[GRANULARITY_I18N_KEY as symbol] as GranularityI18nLike | null\n }\n\n return getCurrentInstance() ? inject(GRANULARITY_I18N_KEY, null) : null\n}\n\nexport function useGranularityTranslations(context?: AppContext | GranularityI18nLike | null) {\n const i18n = resolveGranularityI18n(context)\n\n const t = (key: string, fallback: string, params?: Record<string, any>): string => {\n if (!i18n) {\n return fallback\n }\n\n const result = i18n.t(key, params)\n return result === key ? fallback : result\n }\n\n return {\n i18n,\n t,\n }\n}"],"mappings":";;;AAMA,SAAS,sBAAsB,OAA8C;AAC3E,QAAO,OAAQ,OAAsC,MAAM;;AAG7D,SAAgB,uBAAuB,SAA+E;AACpH,KAAI,sBAAsB,QAAQ,CAChC,QAAO;CAGT,MAAM,WAAW,SAAS;AAE1B,KAAI,SACF,QAAO,SAAS;AAGlB,QAAO,oBAAoB,GAAG,OAAO,sBAAsB,KAAK,GAAG;;AAGrE,SAAgB,2BAA2B,SAAmD;CAC5F,MAAM,OAAO,uBAAuB,QAAQ;CAE5C,MAAM,KAAK,KAAa,UAAkB,WAAyC;AACjF,MAAI,CAAC,KACH,QAAO;EAGT,MAAM,SAAS,KAAK,EAAE,KAAK,OAAO;AAClC,SAAO,WAAW,MAAM,WAAW;;AAGrC,QAAO;EACL;EACA;EACD"}
@@ -1 +1 @@
1
- {"version":3,"file":"ru-Dqh-2C00.js","names":[],"sources":["../../src/i18n/locales/ru.json"],"sourcesContent":["{\n \"common\": {\n \"confirm\": \"Подтвердить\",\n \"cancel\": \"Отмена\",\n \"add\": \"Добавить\",\n \"clear\": \"Очистить\",\n \"close\": \"Закрыть\"\n },\n \"loading\": {\n \"defaultText\": \"Загрузка...\"\n },\n \"treeSelect\": {\n \"filterPlaceholder\": \"Поиск…\",\n \"empty\": \"Нет данных\"\n },\n \"dialog\": {\n \"confirm\": {\n \"title\": \"Подтверждение\"\n },\n \"prompt\": {\n \"title\": \"Введите значение\",\n \"label\": \"Значение\",\n \"required\": \"Введите значение.\"\n }\n },\n \"pagination\": {\n \"pageSize\": \"Размер страницы\",\n \"prev\": \"Назад\",\n \"next\": \"Вперёд\"\n },\n \"navbar\": {\n \"openMenu\": \"Открыть меню\"\n },\n \"colors\": {\n \"neutral\": \"Нейтральный\",\n \"success\": \"Успех\",\n \"warning\": \"Предупреждение\",\n \"danger\": \"Опасность\",\n \"info\": \"Инфо\",\n \"primary\": \"Primary\",\n \"slate\": \"Сланцевый\",\n \"azure\": \"Лазурный\"\n }\n}\n"],"mappings":""}
1
+ {"version":3,"file":"ru-DKswMSdd.js","names":[],"sources":["../../src/i18n/locales/ru.json"],"sourcesContent":["{\n \"common\": {\n \"confirm\": \"Подтвердить\",\n \"cancel\": \"Отмена\",\n \"add\": \"Добавить\",\n \"clear\": \"Очистить\",\n \"close\": \"Закрыть\"\n },\n \"loading\": {\n \"defaultText\": \"Загрузка...\"\n },\n \"treeSelect\": {\n \"filterPlaceholder\": \"Поиск…\",\n \"empty\": \"Нет данных\"\n },\n \"dialog\": {\n \"confirm\": {\n \"title\": \"Подтверждение\"\n },\n \"prompt\": {\n \"title\": \"Введите значение\",\n \"label\": \"Значение\",\n \"required\": \"Введите значение.\"\n }\n },\n \"pagination\": {\n \"pageSize\": \"Размер страницы\",\n \"prev\": \"Назад\",\n \"next\": \"Вперёд\"\n },\n \"navbar\": {\n \"openMenu\": \"Открыть меню\"\n },\n \"colors\": {\n \"neutral\": \"Нейтральный\",\n \"success\": \"Успех\",\n \"warning\": \"Предупреждение\",\n \"danger\": \"Опасность\",\n \"info\": \"Инфо\",\n \"primary\": \"Primary\",\n \"slate\": \"Сланцевый\",\n \"azure\": \"Лазурный\"\n }\n}\n"],"mappings":""}
@@ -16,36 +16,36 @@ import { t as grDrawerConfig } from "./config-DxqpV-KM.js";
16
16
  import { t as grDropdownConfig } from "./config-C4AlNm912.js";
17
17
  import { t as grDropdownMenuConfig } from "./config-DDEWvph-2.js";
18
18
  import { t as grEmptyStateConfig } from "./config-Db4BEG8Y.js";
19
- import { t as grFileUploadConfig } from "./config-BGmiXpR82.js";
20
- import { t as grFormFieldConfig } from "./config-Cgk5ti-b.js";
21
- import { t as grFormFileConfig } from "./config-ndXqsz5A.js";
22
- import { t as grFormSectionConfig } from "./config-YSOeh6cy.js";
23
- import { t as grImageViewerConfig } from "./config-BulF0Bf-.js";
24
- import { t as grInputConfig } from "./config-D19pyP4D.js";
25
- import { t as grInputTagConfig } from "./config-DgRJlF00.js";
26
- import { t as grLinkConfig } from "./config-DUtUkSzc.js";
27
- import { t as grListConfig } from "./config-fCcRwjIB.js";
28
- import { t as grLoadingConfig } from "./config-BN-B2K4r.js";
29
- import { t as grModalConfig } from "./config-XwI6t8cn.js";
30
- import { t as grNavbarConfig } from "./config-BDiLiqSk.js";
31
- import { t as grNumberInputConfig } from "./config-bpQYM5O-.js";
32
- import { t as grPaginationConfig } from "./config-BFZN9-vt.js";
33
- import { t as grProgressBarConfig } from "./config-Da90XGsi.js";
34
- import { t as grPromptDialogConfig } from "./config-C-GVBa19.js";
35
- import { t as grRadioConfig } from "./config-DEv4m-ZP.js";
36
- import { t as grRadioGroupConfig } from "./config-CgjOJ3aF.js";
37
- import { t as grSegmentedConfig } from "./config-CUgvsjZx.js";
38
- import { t as grSelectConfig } from "./config-R0jaXatX.js";
39
- import { t as grSidebarConfig } from "./config-CdHY0Z7L.js";
40
- import { t as grSkeletonConfig } from "./config-CsMIhZfM.js";
41
- import { t as grSwitchConfig } from "./config-CM7nbATU2.js";
42
- import { t as grTableConfig } from "./config-CFcv0hjb.js";
43
- import { t as grTabsConfig } from "./config-CwLoozAz2.js";
44
- import { t as grTextareaConfig } from "./config-CWvHiaqr2.js";
45
- import { t as grToasterConfig } from "./config-BvuQUBtZ.js";
46
- import { t as grTooltipConfig } from "./config-CA9XwYnZ2.js";
47
- import { t as grTreeConfig } from "./config-DCQO6H6h.js";
48
- import { t as grTreeSelectConfig } from "./config-BNOf_qjD.js";
19
+ import { t as grFileUploadConfig } from "./config-CVnluhKO.js";
20
+ import { t as grFormFieldConfig } from "./config-3SftO0uG.js";
21
+ import { t as grFormFileConfig } from "./config-DbqFk-IW.js";
22
+ import { t as grFormSectionConfig } from "./config-D6Af6WZw.js";
23
+ import { t as grImageViewerConfig } from "./config-D98m8iyz.js";
24
+ import { t as grInputConfig } from "./config-CtomKf-k.js";
25
+ import { t as grInputTagConfig } from "./config-Dusr9jcE.js";
26
+ import { t as grLinkConfig } from "./config-CjEplP6D.js";
27
+ import { t as grListConfig } from "./config-C4qAA0Sb.js";
28
+ import { t as grLoadingConfig } from "./config-B44QVIge.js";
29
+ import { t as grModalConfig } from "./config-C5TN9J2Z.js";
30
+ import { t as grNavbarConfig } from "./config-D1DI3roo.js";
31
+ import { t as grNumberInputConfig } from "./config-wo-ncgTH.js";
32
+ import { t as grPaginationConfig } from "./config-DudL02ag.js";
33
+ import { t as grProgressBarConfig } from "./config-ZJVOVgqR.js";
34
+ import { t as grPromptDialogConfig } from "./config-B8rC_K97.js";
35
+ import { t as grRadioConfig } from "./config-BXffa3ta.js";
36
+ import { t as grRadioGroupConfig } from "./config-D27BL0H9.js";
37
+ import { t as grSegmentedConfig } from "./config-BhvNm4Pp.js";
38
+ import { t as grSelectConfig } from "./config-XoANT5mU.js";
39
+ import { t as grSidebarConfig } from "./config-DnsISjD8.js";
40
+ import { t as grSkeletonConfig } from "./config-Mp9DJ9Mq2.js";
41
+ import { t as grSwitchConfig } from "./config-rxFL-6yF2.js";
42
+ import { t as grTableConfig } from "./config-DQOSlWvp.js";
43
+ import { t as grTabsConfig } from "./config-DDLoUczC.js";
44
+ import { t as grTextareaConfig } from "./config-DxqMXzNV2.js";
45
+ import { t as grToasterConfig } from "./config-CxCAfXZ1.js";
46
+ import { t as grTooltipConfig } from "./config-C0rHS1-l.js";
47
+ import { t as grTreeConfig } from "./config-D32znLtV2.js";
48
+ import { t as grTreeSelectConfig } from "./config-C0b_3LJV.js";
49
49
  import { defineGranularComponent, defineGranularProvider } from "@feugene/unocss-preset-granular/contract";
50
50
  //#region src/components/GrDialog/config.ts
51
51
  var grDialogConfig = defineGranularComponent(import.meta.url, {
@@ -1 +1 @@
1
- {"version":3,"file":"shared-CyCPkimZ.js","names":[],"sources":["../../src/components/GrDialog/config.ts","../../src/granular-provider/shared.ts"],"sourcesContent":["import {defineGranularComponent} from '@feugene/unocss-preset-granular/contract'\n\nimport { grDialogSafelist } from './safelist'\n\nexport const grDialogConfig = defineGranularComponent(import.meta.url, {\n name: 'GrDialog',\n dependencies: ['GrButton', 'GrModal'],\n safelist: grDialogSafelist,\n})\n","// Общий код browser- и node-entry granular-provider'а.\n//\n// Оба entry (`./index.ts`, `./node.ts`) отличаются только списком\n// компонентов, у которых есть node-only вариант конфига (например,\n// `GrButton`, чей `config.node.ts` использует `tokenDefinitionsFromCssSync`\n// и тянет `node:fs`). Browser-вариант таких компонентов берёт облегчённый\n// `./config.ts`, node-вариант — `./config.node.ts`. Всё остальное — `id`,\n// `theme.*`, `packageBaseUrl` и полный список browser-safe компонентов —\n// живёт здесь.\n//\n// ВАЖНО: все `new URL('../styles/...', import.meta.url)` намеренно находятся\n// здесь — `shared.ts` лежит в той же директории, что и `index.ts` / `node.ts`,\n// поэтому относительные пути идентичны. Это ОК для браузера: бандлеры\n// транслируют такие конструкции в статические asset-URL и `node:*` в бандл\n// не утаскивают.\n//\n// Ключи записи `<Name>: ds<Name>Config` в `granularityComponentConfigs`\n// критичны для regex‑парсинга в `apps/showcase/scripts/generate-component-api.mjs`,\n// не ломайте формат.\nimport {\n defineGranularProvider,\n type GranularComponentDescriptor,\n type GranularProvider,\n} from '@feugene/unocss-preset-granular/contract'\nimport { grAlertConfig } from '../components/GrAlert/config'\nimport { grAvatarConfig } from '../components/GrAvatar/config'\nimport { grBadgeConfig } from '../components/GrBadge/config'\nimport { grBadgeWrapConfig } from '../components/GrBadgeWrap/config'\nimport { grBottomNavConfig } from '../components/GrBottomNav/config'\nimport { grButtonConfig } from '../components/GrButton/config'\nimport { grButtonGroupConfig } from '../components/GrButtonGroup/config'\nimport { grCardConfig } from '../components/GrCard/config'\nimport { grCheckboxConfig } from '../components/GrCheckbox/config'\nimport { grCollapseConfig } from '../components/GrCollapse/config'\nimport { grConfirmDialogConfig } from '../components/GrConfirmDialog/config'\nimport { grDataTableConfig } from '../components/GrDataTable/config'\nimport { grDialogConfig } from '../components/GrDialog/config'\nimport { grDrawerConfig } from '../components/GrDrawer/config'\nimport { grDropdownConfig } from '../components/GrDropdown/config'\nimport { grDropdownMenuConfig } from '../components/GrDropdownMenu/config'\nimport { grEmptyStateConfig } from '../components/GrEmptyState/config'\nimport { grFileUploadConfig } from '../components/GrFileUpload/config'\nimport { grFormFieldConfig } from '../components/GrFormField/config'\nimport { grFormFileConfig } from '../components/GrFormFile/config'\nimport { grFormSectionConfig } from '../components/GrFormSection/config'\nimport { grIconConfig } from '../components/GrIcon/config'\nimport { grImageViewerConfig } from '../components/GrImageViewer/config'\nimport { grInputConfig } from '../components/GrInput/config'\nimport { grInputTagConfig } from '../components/GrInputTag/config'\nimport { grLinkConfig } from '../components/GrLink/config'\nimport { grListConfig } from '../components/GrList/config'\nimport { grLoadingConfig } from '../components/GrLoading/config'\nimport { grModalConfig } from '../components/GrModal/config'\nimport { grNavbarConfig } from '../components/GrNavbar/config'\nimport { grNumberInputConfig } from '../components/GrNumberInput/config'\nimport { grPaginationConfig } from '../components/GrPagination/config'\nimport { grProgressBarConfig } from '../components/GrProgressBar/config'\nimport { grPromptDialogConfig } from '../components/GrPromptDialog/config'\nimport { grRadioConfig } from '../components/GrRadio/config'\nimport { grRadioGroupConfig } from '../components/GrRadioGroup/config'\nimport { grSegmentedConfig } from '../components/GrSegmented/config'\nimport { grSelectConfig } from '../components/GrSelect/config'\nimport { grSidebarConfig } from '../components/GrSidebar/config'\nimport { grSkeletonConfig } from '../components/GrSkeleton/config'\nimport { grSwitchConfig } from '../components/GrSwitch/config'\nimport { grTableConfig } from '../components/GrTable/config'\nimport { grTabsConfig } from '../components/GrTabs/config'\nimport { grTextareaConfig } from '../components/GrTextarea/config'\nimport { grToasterConfig } from '../components/GrToaster/config'\nimport { grTooltipConfig } from '../components/GrTooltip/config'\nimport { grTreeConfig } from '../components/GrTree/config'\nimport { grTreeSelectConfig } from '../components/GrTreeSelect/config'\n\n/** Идентификатор провайдера — совпадает с именем пакета. */\nexport const GRANULARITY_PROVIDER_ID = '@feugene/granularity'\n\n// runtime-concat: литерал `new URL('..', import.meta.url)` rolldown заменяет\n// на `data:`-URL, поэтому собираем корень пакета из `import.meta.url` вручную\n// (отрезая два последних сегмента: имя файла и каталог `granular-provider/`).\nconst packageBaseUrl = `${import.meta.url.slice(\n 0,\n import.meta.url.lastIndexOf('/', import.meta.url.lastIndexOf('/') - 1) + 1,\n)}`\n\n/** Встроенные темы пакета. Единственный источник правды о списке тем. */\nexport const granularityThemeNames = ['light', 'dark'] as const\nexport type GranularityThemeName = (typeof granularityThemeNames)[number]\n\n/** Темы, активные по умолчанию, если окружение не переопределяет выбор. */\nexport const granularityDefaultThemes: readonly GranularityThemeName[] = ['light']\n\nconst theme = {\n baseCssUrl: new URL('../styles/base.css', import.meta.url).href,\n tokensCssUrl: new URL('../styles/tokens.css', import.meta.url).href,\n themes: {\n light: new URL('../styles/themes/light.css', import.meta.url).href,\n dark: new URL('../styles/themes/dark.css', import.meta.url).href,\n },\n defaultThemes: granularityDefaultThemes,\n} as const\n\n/**\n * Полный реестр публичных компонентов пакета `@feugene/granularity`.\n *\n * Ключи — имена компонентов (совпадают с публичным subpath‑экспортом\n * `@feugene/granularity/components/<Name>`). Значения — browser‑safe\n * `ds<Name>Config` из `./config.ts` рядом с SFC.\n *\n * Для компонентов, у которых есть node-only вариант конфига\n * (например, `GrButton` с `tokenDefinitionsFromCssSync`), browser‑конфиг\n * остаётся здесь, а node‑вариант подставляется снаружи через\n * `createGranularityProvider(overrides)` — см. `./index.ts` (browser)\n * и `./node.ts` (node).\n *\n * Формат записи `<Name>: ds<Name>Config` критичен для regex‑парсинга\n * в `apps/showcase/scripts/generate-component-api.mjs`, не ломайте его.\n */\nexport const granularityComponentConfigs = {\n GrAlert: grAlertConfig,\n GrAvatar: grAvatarConfig,\n GrBadge: grBadgeConfig,\n GrBadgeWrap: grBadgeWrapConfig,\n GrBottomNav: grBottomNavConfig,\n GrButton: grButtonConfig,\n GrButtonGroup: grButtonGroupConfig,\n GrCard: grCardConfig,\n GrCheckbox: grCheckboxConfig,\n GrCollapse: grCollapseConfig,\n GrConfirmDialog: grConfirmDialogConfig,\n GrDataTable: grDataTableConfig,\n GrDialog: grDialogConfig,\n GrDrawer: grDrawerConfig,\n GrDropdown: grDropdownConfig,\n GrDropdownMenu: grDropdownMenuConfig,\n GrEmptyState: grEmptyStateConfig,\n GrFileUpload: grFileUploadConfig,\n GrFormField: grFormFieldConfig,\n GrFormFile: grFormFileConfig,\n GrFormSection: grFormSectionConfig,\n GrIcon: grIconConfig,\n GrImageViewer: grImageViewerConfig,\n GrInput: grInputConfig,\n GrInputTag: grInputTagConfig,\n GrLink: grLinkConfig,\n GrList: grListConfig,\n GrLoading: grLoadingConfig,\n GrModal: grModalConfig,\n GrNavbar: grNavbarConfig,\n GrNumberInput: grNumberInputConfig,\n GrPagination: grPaginationConfig,\n GrProgressBar: grProgressBarConfig,\n GrPromptDialog: grPromptDialogConfig,\n GrRadio: grRadioConfig,\n GrRadioGroup: grRadioGroupConfig,\n GrSegmented: grSegmentedConfig,\n GrSelect: grSelectConfig,\n GrSidebar: grSidebarConfig,\n GrSkeleton: grSkeletonConfig,\n GrSwitch: grSwitchConfig,\n GrTable: grTableConfig,\n GrTabs: grTabsConfig,\n GrTextarea: grTextareaConfig,\n GrToaster: grToasterConfig,\n GrTooltip: grTooltipConfig,\n GrTree: grTreeConfig,\n GrTreeSelect: grTreeSelectConfig,\n}\n\nexport type GranularityComponentName = keyof typeof granularityComponentConfigs\n\n/** Базовый (browser-safe) набор компонентов в порядке реестра. */\nconst baseComponents: readonly GranularComponentDescriptor[] = Object.values(\n granularityComponentConfigs,\n)\n\n/**\n * Собирает granular-provider пакета `@feugene/granularity`.\n *\n * Принимает массив `GranularComponentDescriptor`'ов — это компоненты,\n * у которых есть node-only вариант конфига (например, `GrButton` с\n * `tokenDefinitionsFromCssSync`). Дескрипторы с именем, которое уже\n * присутствует в базовом наборе, переопределяют его (побеждает\n * переданный снаружи), остальные — добавляются в конец списка.\n */\nexport function createGranularityProvider(\n overrides: readonly GranularComponentDescriptor[] = [],\n): GranularProvider {\n const overrideByName = new Map(\n overrides.map(component => [component.name, component]),\n )\n const components: GranularComponentDescriptor[] = [\n ...baseComponents.map(component => overrideByName.get(component.name) ?? component),\n ...overrides.filter(component => !baseComponents.some(base => base.name === component.name)),\n ]\n\n return defineGranularProvider({\n id: GRANULARITY_PROVIDER_ID,\n contractVersion: 1,\n packageBaseUrl,\n components,\n theme,\n })\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIA,IAAa,iBAAiB,wBAAwB,OAAO,KAAK,KAAK;CACrE,MAAM;CACN,cAAc,CAAC,YAAY,UAAU;CACrC,UAAU;CACX,CAAC;;;;ACkEF,IAAa,0BAA0B;AAKvC,IAAM,iBAAiB,GAAG,OAAO,KAAK,IAAI,MACxC,GACA,OAAO,KAAK,IAAI,YAAY,KAAK,OAAO,KAAK,IAAI,YAAY,IAAI,GAAG,EAAE,GAAG,EAC1E;;AAGD,IAAa,wBAAwB,CAAC,SAAS,OAAO;;AAItD,IAAa,2BAA4D,CAAC,QAAQ;AAElF,IAAM,QAAQ;CACZ,YAAY,IAAA,IAAA,i2BAAA,KAAA,OAAA,KAAA,IAA8C,CAAC;CAC3D,cAAc,IAAA,IAAA,iuKAAA,KAAA,OAAA,KAAA,IAAgD,CAAC;CAC/D,QAAQ;EACN,OAAO,IAAA,IAAA,qrGAAA,KAAA,OAAA,KAAA,IAAsD,CAAC;EAC9D,MAAM,IAAA,IAAA,qxGAAA,KAAA,OAAA,KAAA,IAAqD,CAAC;EAC7D;CACD,eAAe;CAChB;;;;;;;;;;;;;;;;;AAkBD,IAAa,8BAA8B;CACzC,SAAS;CACT,UAAU;CACV,SAAS;CACT,aAAa;CACb,aAAa;CACb,UAAU;CACV,eAAe;CACf,QAAQ;CACR,YAAY;CACZ,YAAY;CACZ,iBAAiB;CACjB,aAAa;CACb,UAAU;CACV,UAAU;CACV,YAAY;CACZ,gBAAgB;CAChB,cAAc;CACd,cAAc;CACd,aAAa;CACb,YAAY;CACZ,eAAe;CACf,QAAQ;CACR,eAAe;CACf,SAAS;CACT,YAAY;CACZ,QAAQ;CACR,QAAQ;CACR,WAAW;CACX,SAAS;CACT,UAAU;CACV,eAAe;CACf,cAAc;CACd,eAAe;CACf,gBAAgB;CAChB,SAAS;CACT,cAAc;CACd,aAAa;CACb,UAAU;CACV,WAAW;CACX,YAAY;CACZ,UAAU;CACV,SAAS;CACT,QAAQ;CACR,YAAY;CACZ,WAAW;CACX,WAAW;CACX,QAAQ;CACR,cAAc;CACf;;AAKD,IAAM,iBAAyD,OAAO,OACpE,4BACD;;;;;;;;;;AAWD,SAAgB,0BACd,YAAoD,EAAE,EACpC;CAClB,MAAM,iBAAiB,IAAI,IACzB,UAAU,KAAI,cAAa,CAAC,UAAU,MAAM,UAAU,CAAC,CACxD;AAMD,QAAO,uBAAuB;EAC5B,IAAI;EACJ,iBAAiB;EACjB;EACA,YATgD,CAChD,GAAG,eAAe,KAAI,cAAa,eAAe,IAAI,UAAU,KAAK,IAAI,UAAU,EACnF,GAAG,UAAU,QAAO,cAAa,CAAC,eAAe,MAAK,SAAQ,KAAK,SAAS,UAAU,KAAK,CAAC,CAC7F;EAOC;EACD,CAAC"}
1
+ {"version":3,"file":"shared-DO3Sr5FJ.js","names":[],"sources":["../../src/components/GrDialog/config.ts","../../src/granular-provider/shared.ts"],"sourcesContent":["import {defineGranularComponent} from '@feugene/unocss-preset-granular/contract'\n\nimport { grDialogSafelist } from './safelist'\n\nexport const grDialogConfig = defineGranularComponent(import.meta.url, {\n name: 'GrDialog',\n dependencies: ['GrButton', 'GrModal'],\n safelist: grDialogSafelist,\n})\n","// Общий код browser- и node-entry granular-provider'а.\n//\n// Оба entry (`./index.ts`, `./node.ts`) отличаются только списком\n// компонентов, у которых есть node-only вариант конфига (например,\n// `GrButton`, чей `config.node.ts` использует `tokenDefinitionsFromCssSync`\n// и тянет `node:fs`). Browser-вариант таких компонентов берёт облегчённый\n// `./config.ts`, node-вариант — `./config.node.ts`. Всё остальное — `id`,\n// `theme.*`, `packageBaseUrl` и полный список browser-safe компонентов —\n// живёт здесь.\n//\n// ВАЖНО: все `new URL('../styles/...', import.meta.url)` намеренно находятся\n// здесь — `shared.ts` лежит в той же директории, что и `index.ts` / `node.ts`,\n// поэтому относительные пути идентичны. Это ОК для браузера: бандлеры\n// транслируют такие конструкции в статические asset-URL и `node:*` в бандл\n// не утаскивают.\n//\n// Ключи записи `<Name>: ds<Name>Config` в `granularityComponentConfigs`\n// критичны для regex‑парсинга в `apps/showcase/scripts/generate-component-api.mjs`,\n// не ломайте формат.\nimport {\n defineGranularProvider,\n type GranularComponentDescriptor,\n type GranularProvider,\n} from '@feugene/unocss-preset-granular/contract'\nimport { grAlertConfig } from '../components/GrAlert/config'\nimport { grAvatarConfig } from '../components/GrAvatar/config'\nimport { grBadgeConfig } from '../components/GrBadge/config'\nimport { grBadgeWrapConfig } from '../components/GrBadgeWrap/config'\nimport { grBottomNavConfig } from '../components/GrBottomNav/config'\nimport { grButtonConfig } from '../components/GrButton/config'\nimport { grButtonGroupConfig } from '../components/GrButtonGroup/config'\nimport { grCardConfig } from '../components/GrCard/config'\nimport { grCheckboxConfig } from '../components/GrCheckbox/config'\nimport { grCollapseConfig } from '../components/GrCollapse/config'\nimport { grConfirmDialogConfig } from '../components/GrConfirmDialog/config'\nimport { grDataTableConfig } from '../components/GrDataTable/config'\nimport { grDialogConfig } from '../components/GrDialog/config'\nimport { grDrawerConfig } from '../components/GrDrawer/config'\nimport { grDropdownConfig } from '../components/GrDropdown/config'\nimport { grDropdownMenuConfig } from '../components/GrDropdownMenu/config'\nimport { grEmptyStateConfig } from '../components/GrEmptyState/config'\nimport { grFileUploadConfig } from '../components/GrFileUpload/config'\nimport { grFormFieldConfig } from '../components/GrFormField/config'\nimport { grFormFileConfig } from '../components/GrFormFile/config'\nimport { grFormSectionConfig } from '../components/GrFormSection/config'\nimport { grIconConfig } from '../components/GrIcon/config'\nimport { grImageViewerConfig } from '../components/GrImageViewer/config'\nimport { grInputConfig } from '../components/GrInput/config'\nimport { grInputTagConfig } from '../components/GrInputTag/config'\nimport { grLinkConfig } from '../components/GrLink/config'\nimport { grListConfig } from '../components/GrList/config'\nimport { grLoadingConfig } from '../components/GrLoading/config'\nimport { grModalConfig } from '../components/GrModal/config'\nimport { grNavbarConfig } from '../components/GrNavbar/config'\nimport { grNumberInputConfig } from '../components/GrNumberInput/config'\nimport { grPaginationConfig } from '../components/GrPagination/config'\nimport { grProgressBarConfig } from '../components/GrProgressBar/config'\nimport { grPromptDialogConfig } from '../components/GrPromptDialog/config'\nimport { grRadioConfig } from '../components/GrRadio/config'\nimport { grRadioGroupConfig } from '../components/GrRadioGroup/config'\nimport { grSegmentedConfig } from '../components/GrSegmented/config'\nimport { grSelectConfig } from '../components/GrSelect/config'\nimport { grSidebarConfig } from '../components/GrSidebar/config'\nimport { grSkeletonConfig } from '../components/GrSkeleton/config'\nimport { grSwitchConfig } from '../components/GrSwitch/config'\nimport { grTableConfig } from '../components/GrTable/config'\nimport { grTabsConfig } from '../components/GrTabs/config'\nimport { grTextareaConfig } from '../components/GrTextarea/config'\nimport { grToasterConfig } from '../components/GrToaster/config'\nimport { grTooltipConfig } from '../components/GrTooltip/config'\nimport { grTreeConfig } from '../components/GrTree/config'\nimport { grTreeSelectConfig } from '../components/GrTreeSelect/config'\n\n/** Идентификатор провайдера — совпадает с именем пакета. */\nexport const GRANULARITY_PROVIDER_ID = '@feugene/granularity'\n\n// runtime-concat: литерал `new URL('..', import.meta.url)` rolldown заменяет\n// на `data:`-URL, поэтому собираем корень пакета из `import.meta.url` вручную\n// (отрезая два последних сегмента: имя файла и каталог `granular-provider/`).\nconst packageBaseUrl = `${import.meta.url.slice(\n 0,\n import.meta.url.lastIndexOf('/', import.meta.url.lastIndexOf('/') - 1) + 1,\n)}`\n\n/** Встроенные темы пакета. Единственный источник правды о списке тем. */\nexport const granularityThemeNames = ['light', 'dark'] as const\nexport type GranularityThemeName = (typeof granularityThemeNames)[number]\n\n/** Темы, активные по умолчанию, если окружение не переопределяет выбор. */\nexport const granularityDefaultThemes: readonly GranularityThemeName[] = ['light']\n\nconst theme = {\n baseCssUrl: new URL('../styles/base.css', import.meta.url).href,\n tokensCssUrl: new URL('../styles/tokens.css', import.meta.url).href,\n themes: {\n light: new URL('../styles/themes/light.css', import.meta.url).href,\n dark: new URL('../styles/themes/dark.css', import.meta.url).href,\n },\n defaultThemes: granularityDefaultThemes,\n} as const\n\n/**\n * Полный реестр публичных компонентов пакета `@feugene/granularity`.\n *\n * Ключи — имена компонентов (совпадают с публичным subpath‑экспортом\n * `@feugene/granularity/components/<Name>`). Значения — browser‑safe\n * `ds<Name>Config` из `./config.ts` рядом с SFC.\n *\n * Для компонентов, у которых есть node-only вариант конфига\n * (например, `GrButton` с `tokenDefinitionsFromCssSync`), browser‑конфиг\n * остаётся здесь, а node‑вариант подставляется снаружи через\n * `createGranularityProvider(overrides)` — см. `./index.ts` (browser)\n * и `./node.ts` (node).\n *\n * Формат записи `<Name>: ds<Name>Config` критичен для regex‑парсинга\n * в `apps/showcase/scripts/generate-component-api.mjs`, не ломайте его.\n */\nexport const granularityComponentConfigs = {\n GrAlert: grAlertConfig,\n GrAvatar: grAvatarConfig,\n GrBadge: grBadgeConfig,\n GrBadgeWrap: grBadgeWrapConfig,\n GrBottomNav: grBottomNavConfig,\n GrButton: grButtonConfig,\n GrButtonGroup: grButtonGroupConfig,\n GrCard: grCardConfig,\n GrCheckbox: grCheckboxConfig,\n GrCollapse: grCollapseConfig,\n GrConfirmDialog: grConfirmDialogConfig,\n GrDataTable: grDataTableConfig,\n GrDialog: grDialogConfig,\n GrDrawer: grDrawerConfig,\n GrDropdown: grDropdownConfig,\n GrDropdownMenu: grDropdownMenuConfig,\n GrEmptyState: grEmptyStateConfig,\n GrFileUpload: grFileUploadConfig,\n GrFormField: grFormFieldConfig,\n GrFormFile: grFormFileConfig,\n GrFormSection: grFormSectionConfig,\n GrIcon: grIconConfig,\n GrImageViewer: grImageViewerConfig,\n GrInput: grInputConfig,\n GrInputTag: grInputTagConfig,\n GrLink: grLinkConfig,\n GrList: grListConfig,\n GrLoading: grLoadingConfig,\n GrModal: grModalConfig,\n GrNavbar: grNavbarConfig,\n GrNumberInput: grNumberInputConfig,\n GrPagination: grPaginationConfig,\n GrProgressBar: grProgressBarConfig,\n GrPromptDialog: grPromptDialogConfig,\n GrRadio: grRadioConfig,\n GrRadioGroup: grRadioGroupConfig,\n GrSegmented: grSegmentedConfig,\n GrSelect: grSelectConfig,\n GrSidebar: grSidebarConfig,\n GrSkeleton: grSkeletonConfig,\n GrSwitch: grSwitchConfig,\n GrTable: grTableConfig,\n GrTabs: grTabsConfig,\n GrTextarea: grTextareaConfig,\n GrToaster: grToasterConfig,\n GrTooltip: grTooltipConfig,\n GrTree: grTreeConfig,\n GrTreeSelect: grTreeSelectConfig,\n}\n\nexport type GranularityComponentName = keyof typeof granularityComponentConfigs\n\n/** Базовый (browser-safe) набор компонентов в порядке реестра. */\nconst baseComponents: readonly GranularComponentDescriptor[] = Object.values(\n granularityComponentConfigs,\n)\n\n/**\n * Собирает granular-provider пакета `@feugene/granularity`.\n *\n * Принимает массив `GranularComponentDescriptor`'ов — это компоненты,\n * у которых есть node-only вариант конфига (например, `GrButton` с\n * `tokenDefinitionsFromCssSync`). Дескрипторы с именем, которое уже\n * присутствует в базовом наборе, переопределяют его (побеждает\n * переданный снаружи), остальные — добавляются в конец списка.\n */\nexport function createGranularityProvider(\n overrides: readonly GranularComponentDescriptor[] = [],\n): GranularProvider {\n const overrideByName = new Map(\n overrides.map(component => [component.name, component]),\n )\n const components: GranularComponentDescriptor[] = [\n ...baseComponents.map(component => overrideByName.get(component.name) ?? component),\n ...overrides.filter(component => !baseComponents.some(base => base.name === component.name)),\n ]\n\n return defineGranularProvider({\n id: GRANULARITY_PROVIDER_ID,\n contractVersion: 1,\n packageBaseUrl,\n components,\n theme,\n })\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIA,IAAa,iBAAiB,wBAAwB,OAAO,KAAK,KAAK;CACrE,MAAM;CACN,cAAc,CAAC,YAAY,UAAU;CACrC,UAAU;CACX,CAAC;;;;ACkEF,IAAa,0BAA0B;AAKvC,IAAM,iBAAiB,GAAG,OAAO,KAAK,IAAI,MACxC,GACA,OAAO,KAAK,IAAI,YAAY,KAAK,OAAO,KAAK,IAAI,YAAY,IAAI,GAAG,EAAE,GAAG,EAC1E;;AAGD,IAAa,wBAAwB,CAAC,SAAS,OAAO;;AAItD,IAAa,2BAA4D,CAAC,QAAQ;AAElF,IAAM,QAAQ;CACZ,YAAY,IAAA,IAAA,i2BAAA,KAAA,OAAA,KAAA,IAA8C,CAAC;CAC3D,cAAc,IAAA,IAAA,iuKAAA,KAAA,OAAA,KAAA,IAAgD,CAAC;CAC/D,QAAQ;EACN,OAAO,IAAA,IAAA,qrGAAA,KAAA,OAAA,KAAA,IAAsD,CAAC;EAC9D,MAAM,IAAA,IAAA,qxGAAA,KAAA,OAAA,KAAA,IAAqD,CAAC;EAC7D;CACD,eAAe;CAChB;;;;;;;;;;;;;;;;;AAkBD,IAAa,8BAA8B;CACzC,SAAS;CACT,UAAU;CACV,SAAS;CACT,aAAa;CACb,aAAa;CACb,UAAU;CACV,eAAe;CACf,QAAQ;CACR,YAAY;CACZ,YAAY;CACZ,iBAAiB;CACjB,aAAa;CACb,UAAU;CACV,UAAU;CACV,YAAY;CACZ,gBAAgB;CAChB,cAAc;CACd,cAAc;CACd,aAAa;CACb,YAAY;CACZ,eAAe;CACf,QAAQ;CACR,eAAe;CACf,SAAS;CACT,YAAY;CACZ,QAAQ;CACR,QAAQ;CACR,WAAW;CACX,SAAS;CACT,UAAU;CACV,eAAe;CACf,cAAc;CACd,eAAe;CACf,gBAAgB;CAChB,SAAS;CACT,cAAc;CACd,aAAa;CACb,UAAU;CACV,WAAW;CACX,YAAY;CACZ,UAAU;CACV,SAAS;CACT,QAAQ;CACR,YAAY;CACZ,WAAW;CACX,WAAW;CACX,QAAQ;CACR,cAAc;CACf;;AAKD,IAAM,iBAAyD,OAAO,OACpE,4BACD;;;;;;;;;;AAWD,SAAgB,0BACd,YAAoD,EAAE,EACpC;CAClB,MAAM,iBAAiB,IAAI,IACzB,UAAU,KAAI,cAAa,CAAC,UAAU,MAAM,UAAU,CAAC,CACxD;AAMD,QAAO,uBAAuB;EAC5B,IAAI;EACJ,iBAAiB;EACjB;EACA,YATgD,CAChD,GAAG,eAAe,KAAI,cAAa,eAAe,IAAI,UAAU,KAAK,IAAI,UAAU,EACnF,GAAG,UAAU,QAAO,cAAa,CAAC,eAAe,MAAK,SAAQ,KAAK,SAAS,UAAU,KAAK,CAAC,CAC7F;EAOC;EACD,CAAC"}
@@ -1,7 +1,116 @@
1
1
  import { t as GrIcon_default } from "../../GrIcon/chunks/GrIcon-BV7RBU_0.js";
2
2
  import { t as arrow_up_default } from "../../../chunks/arrow-up-DNXrMoAI.js";
3
3
  import { l as runFileValidators, u as FileValidationError } from "../../../chunks/fileValidation-CwJA8Vmn.js";
4
- import { Comment, Fragment, Text, computed, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, nextTick, normalizeClass, openBlock, ref, renderList, renderSlot, toDisplayString, unref, useSlots, withCtx } from "vue";
4
+ import { t as GrProgressBar_default } from "../../GrProgressBar/chunks/GrProgressBar-hQQK8cYh.js";
5
+ import { Comment, Fragment, Text, computed, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, nextTick, normalizeClass, openBlock, reactive, ref, renderList, renderSlot, toDisplayString, unref, useSlots, withCtx } from "vue";
6
+ //#region src/components/GrFileUpload/uploadViaXhr.ts
7
+ var GrUploadAbortError = class extends Error {
8
+ constructor(message = "Upload aborted") {
9
+ super(message);
10
+ this.name = "GrUploadAbortError";
11
+ }
12
+ };
13
+ var GrUploadHttpError = class extends Error {
14
+ status;
15
+ payload;
16
+ constructor(status, payload) {
17
+ super(`Upload failed with status ${status}`);
18
+ this.name = "GrUploadHttpError";
19
+ this.status = status;
20
+ this.payload = payload;
21
+ }
22
+ };
23
+ function appendExtraFormData(body, extraData) {
24
+ if (!extraData) return;
25
+ for (const [key, value] of Object.entries(extraData)) {
26
+ if (Array.isArray(value)) {
27
+ for (const entry of value) body.append(key, entry);
28
+ continue;
29
+ }
30
+ body.append(key, value);
31
+ }
32
+ }
33
+ function parseResponse(xhr) {
34
+ const contentType = xhr.getResponseHeader("content-type") ?? "";
35
+ const raw = xhr.responseText;
36
+ if (contentType.includes("application/json")) try {
37
+ return JSON.parse(raw);
38
+ } catch {
39
+ return raw;
40
+ }
41
+ return raw;
42
+ }
43
+ function uploadViaXhr(options) {
44
+ const { url, files, name, headers, withCredentials, extraData, signal, onProgress } = options;
45
+ return new Promise((resolve, reject) => {
46
+ if (signal.aborted) {
47
+ reject(new GrUploadAbortError());
48
+ return;
49
+ }
50
+ const body = new FormData();
51
+ for (const file of files) body.append(name, file);
52
+ appendExtraFormData(body, extraData);
53
+ const xhr = new XMLHttpRequest();
54
+ xhr.open("POST", url, true);
55
+ xhr.withCredentials = !!withCredentials;
56
+ if (headers) for (const [key, value] of Object.entries(headers)) xhr.setRequestHeader(key, value);
57
+ const onAbort = () => {
58
+ try {
59
+ xhr.abort();
60
+ } catch {}
61
+ };
62
+ signal.addEventListener("abort", onAbort);
63
+ const cleanup = () => {
64
+ signal.removeEventListener("abort", onAbort);
65
+ };
66
+ if (onProgress) xhr.upload.addEventListener("progress", (event) => {
67
+ const indeterminate = !event.lengthComputable;
68
+ const total = indeterminate ? 0 : event.total;
69
+ const loaded = indeterminate ? 0 : event.loaded;
70
+ onProgress({
71
+ percent: indeterminate || total === 0 ? 0 : Math.min(100, loaded / total * 100),
72
+ loaded,
73
+ total,
74
+ indeterminate
75
+ });
76
+ });
77
+ xhr.addEventListener("load", () => {
78
+ cleanup();
79
+ const payload = parseResponse(xhr);
80
+ const status = xhr.status;
81
+ if (status >= 200 && status < 300) {
82
+ if (onProgress) onProgress({
83
+ percent: 100,
84
+ loaded: 1,
85
+ total: 1,
86
+ indeterminate: false
87
+ });
88
+ resolve(payload);
89
+ return;
90
+ }
91
+ reject(new GrUploadHttpError(status, payload));
92
+ });
93
+ xhr.addEventListener("error", () => {
94
+ cleanup();
95
+ reject(/* @__PURE__ */ new Error("Network error during upload"));
96
+ });
97
+ xhr.addEventListener("abort", () => {
98
+ cleanup();
99
+ reject(new GrUploadAbortError());
100
+ });
101
+ xhr.send(body);
102
+ });
103
+ }
104
+ //#endregion
105
+ //#region src/components/GrFileUpload/uploadState.ts
106
+ var GR_UPLOAD_STATE_IDLE = Object.freeze({
107
+ phase: "idle",
108
+ percent: 0,
109
+ indeterminate: false,
110
+ loaded: 0,
111
+ total: 0
112
+ });
113
+ //#endregion
5
114
  //#region src/components/GrFileUpload/GrFileUpload.vue?vue&type=script&setup=true&lang.ts
6
115
  var _hoisted_1 = [
7
116
  "role",
@@ -43,6 +152,12 @@ var _hoisted_9 = {
43
152
  };
44
153
  var _hoisted_10 = { class: "font-600" };
45
154
  var _hoisted_11 = { class: "text-[var(--muted-fg)]" };
155
+ var _hoisted_12 = ["aria-hidden"];
156
+ var _hoisted_13 = { class: "flex items-center gap-2" };
157
+ var _hoisted_14 = {
158
+ "data-ds-file-upload-progress-text": "",
159
+ class: "text-[12px] text-[var(--muted-fg)] tabular-nums min-w-[3ch] text-right"
160
+ };
46
161
  //#endregion
47
162
  //#region src/components/GrFileUpload/GrFileUpload.vue
48
163
  var GrFileUpload_default = /* @__PURE__ */ defineComponent({
@@ -85,13 +200,21 @@ var GrFileUpload_default = /* @__PURE__ */ defineComponent({
85
200
  type: Function,
86
201
  default: void 0
87
202
  },
88
- placeholder: { default: "Drag files here or click to select" }
203
+ placeholder: { default: "Drag files here or click to select" },
204
+ showProgress: {
205
+ type: Boolean,
206
+ default: true
207
+ },
208
+ progressTone: { default: "primary" },
209
+ progressLabel: { default: "Upload progress" },
210
+ hideProgressOnSuccess: { default: 800 }
89
211
  },
90
212
  emits: [
91
213
  "success",
92
214
  "error",
93
215
  "progress",
94
- "change"
216
+ "change",
217
+ "state-change"
95
218
  ],
96
219
  setup(__props, { expose: __expose, emit: __emit }) {
97
220
  const props = __props;
@@ -128,7 +251,63 @@ var GrFileUpload_default = /* @__PURE__ */ defineComponent({
128
251
  const isOver = ref(false);
129
252
  let overCounter = 0;
130
253
  const lastFiles = ref([]);
254
+ const state = reactive({ ...GR_UPLOAD_STATE_IDLE });
131
255
  let activeController = null;
256
+ let hideSuccessTimer = null;
257
+ function clearHideSuccessTimer() {
258
+ if (hideSuccessTimer !== null) {
259
+ clearTimeout(hideSuccessTimer);
260
+ hideSuccessTimer = null;
261
+ }
262
+ }
263
+ function assignState(next) {
264
+ for (const key of Object.keys(state)) delete state[key];
265
+ Object.assign(state, next);
266
+ emit("state-change", state);
267
+ }
268
+ function setStateIdle() {
269
+ assignState({ ...GR_UPLOAD_STATE_IDLE });
270
+ }
271
+ function setStateUploading(info) {
272
+ assignState({
273
+ phase: "uploading",
274
+ percent: info?.percent ?? 0,
275
+ indeterminate: info?.indeterminate ?? true,
276
+ loaded: info?.loaded ?? 0,
277
+ total: info?.total ?? 0
278
+ });
279
+ }
280
+ function setStateSuccess(info) {
281
+ assignState({
282
+ phase: "success",
283
+ percent: 100,
284
+ indeterminate: false,
285
+ loaded: info.loaded,
286
+ total: info.total
287
+ });
288
+ }
289
+ function setStateError(error) {
290
+ const prev = state;
291
+ assignState({
292
+ phase: "error",
293
+ percent: prev.phase === "uploading" ? prev.percent : 0,
294
+ indeterminate: false,
295
+ loaded: prev.phase === "uploading" ? prev.loaded : 0,
296
+ total: prev.phase === "uploading" ? prev.total : 0,
297
+ error
298
+ });
299
+ }
300
+ function handleProgress(info) {
301
+ if (state.phase !== "uploading") return;
302
+ assignState({
303
+ phase: "uploading",
304
+ percent: info.percent,
305
+ indeterminate: info.indeterminate,
306
+ loaded: info.loaded,
307
+ total: info.total
308
+ });
309
+ emit("progress", info.percent, info);
310
+ }
132
311
  const tabIndex = computed(() => props.disabled ? -1 : 0);
133
312
  const hiddenInputStyle = {
134
313
  position: "fixed",
@@ -158,36 +337,18 @@ var GrFileUpload_default = /* @__PURE__ */ defineComponent({
158
337
  if (limit <= 0) return void 0;
159
338
  return Math.floor(limit);
160
339
  }
161
- function appendExtraFormData(body, extraData) {
162
- if (!extraData) return;
163
- for (const [key, value] of Object.entries(extraData)) {
164
- if (Array.isArray(value)) {
165
- for (const entry of value) body.append(key, entry);
166
- continue;
167
- }
168
- body.append(key, value);
169
- }
170
- }
171
340
  async function uploadViaAction(files, signal, extraData) {
172
341
  if (!props.action) throw new Error("GrFileUpload: either `action` or `request` must be provided");
173
- const body = new FormData();
174
- for (const file of files) body.append(props.name, file);
175
- appendExtraFormData(body, extraData);
176
- const response = await fetch(props.action, {
177
- method: "POST",
342
+ return uploadViaXhr({
343
+ url: props.action,
344
+ files,
345
+ name: props.name,
178
346
  headers: props.headers,
179
- body,
347
+ withCredentials: props.withCredentials,
348
+ extraData,
180
349
  signal,
181
- credentials: props.withCredentials ? "include" : "same-origin"
350
+ onProgress: handleProgress
182
351
  });
183
- const payload = response.headers.get("content-type")?.includes("application/json") ? await response.json() : await response.text();
184
- if (!response.ok) {
185
- const error = /* @__PURE__ */ new Error(`Upload failed with status ${response.status}`);
186
- error.payload = payload;
187
- error.status = response.status;
188
- throw error;
189
- }
190
- return payload;
191
352
  }
192
353
  async function runBeforeUpload(files) {
193
354
  if (!props.beforeUpload) return "ok";
@@ -238,17 +399,42 @@ var GrFileUpload_default = /* @__PURE__ */ defineComponent({
238
399
  return;
239
400
  }
240
401
  abort();
402
+ clearHideSuccessTimer();
241
403
  const controller = new AbortController();
242
404
  activeController = controller;
243
- emit("progress", 0);
405
+ setStateUploading();
406
+ emit("progress", 0, {
407
+ percent: 0,
408
+ loaded: 0,
409
+ total: 0,
410
+ indeterminate: true
411
+ });
244
412
  try {
245
- emit("success", props.request ? await props.request(valid, {
413
+ const payload = props.request ? await props.request(valid, {
246
414
  signal: controller.signal,
247
- extraData
248
- }) : await uploadViaAction(valid, controller.signal, extraData));
415
+ extraData,
416
+ onProgress: handleProgress
417
+ }) : await uploadViaAction(valid, controller.signal, extraData);
418
+ const finalLoaded = state.phase === "uploading" ? state.total || state.loaded : 0;
419
+ setStateSuccess({
420
+ loaded: finalLoaded,
421
+ total: finalLoaded
422
+ });
423
+ emit("success", payload);
249
424
  emit("change", valid);
250
- emit("progress", 100);
425
+ emit("progress", 100, {
426
+ percent: 100,
427
+ loaded: finalLoaded,
428
+ total: finalLoaded,
429
+ indeterminate: false
430
+ });
431
+ if (props.hideProgressOnSuccess && props.hideProgressOnSuccess > 0) hideSuccessTimer = setTimeout(() => {
432
+ if (state.phase === "success") setStateIdle();
433
+ hideSuccessTimer = null;
434
+ }, props.hideProgressOnSuccess);
251
435
  } catch (error) {
436
+ if (error instanceof GrUploadAbortError) setStateIdle();
437
+ else setStateError(error);
252
438
  emit("error", error);
253
439
  } finally {
254
440
  if (activeController === controller) activeController = null;
@@ -306,10 +492,22 @@ var GrFileUpload_default = /* @__PURE__ */ defineComponent({
306
492
  if (hasCustomUi.value) return;
307
493
  onKeydown(event);
308
494
  }
495
+ const effectiveProgressTone = computed(() => {
496
+ if (state.phase === "error") return "danger";
497
+ if (state.phase === "success") return "success";
498
+ return props.progressTone;
499
+ });
500
+ const progressVisible = computed(() => state.phase !== "idle");
501
+ const progressPercent = computed(() => state.phase === "uploading" && state.indeterminate ? 0 : state.percent);
502
+ const progressText = computed(() => {
503
+ if (state.phase === "uploading" && state.indeterminate) return "";
504
+ return `${Math.round(progressPercent.value)}%`;
505
+ });
309
506
  __expose({
310
507
  uploadFiles: handleFiles,
311
508
  abort,
312
- openDialog
509
+ openDialog,
510
+ state
313
511
  });
314
512
  return (_ctx, _cache) => {
315
513
  return openBlock(), createElementBlock("div", {
@@ -346,7 +544,8 @@ var GrFileUpload_default = /* @__PURE__ */ defineComponent({
346
544
  abort,
347
545
  disabled: __props.disabled,
348
546
  files: lastFiles.value,
349
- isOver: isOver.value
547
+ isOver: isOver.value,
548
+ state
350
549
  }) : (openBlock(), createElementBlock("div", _hoisted_3, [createElementVNode("div", _hoisted_4, [createVNode(GrIcon_default, { class: "h-6 w-6 text-[var(--muted-fg)]" }, {
351
550
  default: withCtx(() => [createVNode(unref(arrow_up_default))]),
352
551
  _: 1
@@ -359,10 +558,32 @@ var GrFileUpload_default = /* @__PURE__ */ defineComponent({
359
558
  "data-ds-file-upload-item": "",
360
559
  class: "text-[13px]"
361
560
  }, [createElementVNode("span", _hoisted_10, toDisplayString(file.name), 1), createElementVNode("span", _hoisted_11, " · " + toDisplayString(Math.ceil(file.size / 1024)) + " KB", 1)]);
362
- }), 128))])) : createCommentVNode("", true)
561
+ }), 128))])) : createCommentVNode("", true),
562
+ __props.showProgress || _ctx.$slots.progress ? renderSlot(_ctx.$slots, "progress", {
563
+ key: 3,
564
+ state,
565
+ percent: state.percent,
566
+ indeterminate: state.phase === "uploading" && state.indeterminate,
567
+ phase: state.phase,
568
+ files: lastFiles.value,
569
+ abort
570
+ }, () => [__props.showProgress ? (openBlock(), createElementBlock("div", {
571
+ key: 0,
572
+ "data-ds-file-upload-progress": "",
573
+ class: normalizeClass(["mt-3 transition-opacity duration-150", progressVisible.value ? "opacity-100" : "opacity-0 pointer-events-none"]),
574
+ "aria-hidden": !progressVisible.value
575
+ }, [createElementVNode("div", _hoisted_13, [createVNode(GrProgressBar_default, {
576
+ value: progressPercent.value,
577
+ tone: effectiveProgressTone.value,
578
+ "aria-label": __props.progressLabel
579
+ }, null, 8, [
580
+ "value",
581
+ "tone",
582
+ "aria-label"
583
+ ]), createElementVNode("span", _hoisted_14, toDisplayString(progressText.value), 1)])], 10, _hoisted_12)) : createCommentVNode("", true)]) : createCommentVNode("", true)
363
584
  ])]))], 42, _hoisted_1);
364
585
  };
365
586
  }
366
587
  });
367
588
  //#endregion
368
- export { GrFileUpload_default as t };
589
+ export { GrUploadHttpError as i, GR_UPLOAD_STATE_IDLE as n, GrUploadAbortError as r, GrFileUpload_default as t };