@feugene/granularity 0.11.0 → 0.12.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 (189) hide show
  1. package/dist/GrTree.css +1 -1
  2. package/dist/chunks/config-1uSYl98Y2.js.map +1 -0
  3. package/dist/chunks/config-BIRO0vDJ.js.map +1 -0
  4. package/dist/chunks/config-BWiPnygb.js +5 -0
  5. package/dist/chunks/config-BWiPnygb.js.map +1 -0
  6. package/dist/chunks/config-BXtAmU3s2.js.map +1 -0
  7. package/dist/chunks/config-CGHLoBlH.js.map +1 -0
  8. package/dist/chunks/config-CrG1XiE72.js.map +1 -0
  9. package/dist/chunks/config-DUcu1D682.js.map +1 -0
  10. package/dist/chunks/config-Dlm49Jp5.js +5 -0
  11. package/dist/chunks/config-Dlm49Jp5.js.map +1 -0
  12. package/dist/chunks/config-DnvPqu4g2.js.map +1 -0
  13. package/dist/chunks/config-DpqOnJiz.js.map +1 -0
  14. package/dist/chunks/config-JpHA4Xx02.js.map +1 -0
  15. package/dist/chunks/config-LGrZIdaZ.js.map +1 -0
  16. package/dist/chunks/config-eXB87DOi2.js +9 -0
  17. package/dist/chunks/config-eXB87DOi2.js.map +1 -0
  18. package/dist/chunks/context-DdNIxa1w.js +9 -0
  19. package/dist/chunks/context-DdNIxa1w.js.map +1 -0
  20. package/dist/chunks/{en-BdtiS2d3.js → en-CfkDa4GX.js} +8 -2
  21. package/dist/chunks/{en-BdtiS2d3.js.map → en-CfkDa4GX.js.map} +1 -1
  22. package/dist/chunks/{es-DBhctWg-.js → es-CgaLnFYx.js} +3 -3
  23. package/dist/chunks/{es-DBhctWg-.js.map → es-CgaLnFYx.js.map} +1 -1
  24. package/dist/chunks/{es-BGRMZbe9.js → es-FkgECuCm.js} +8 -2
  25. package/dist/chunks/{es-BGRMZbe9.js.map → es-FkgECuCm.js.map} +1 -1
  26. package/dist/chunks/grModalEscStack-BXk-9mv7.js +43 -0
  27. package/dist/chunks/grModalEscStack-BXk-9mv7.js.map +1 -0
  28. package/dist/chunks/{ru-BFCnOiML.js → ru-Bl8CxpEa.js} +8 -2
  29. package/dist/chunks/{ru-BFCnOiML.js.map → ru-Bl8CxpEa.js.map} +1 -1
  30. package/dist/chunks/{shared-ChvcQgDl.js → shared-B6Ay2081.js} +17 -11
  31. package/dist/chunks/shared-B6Ay2081.js.map +1 -0
  32. package/dist/chunks/{transition-TLFw4KBn.js → useScrollLock-K7kaP2Ud.js} +52 -1
  33. package/dist/chunks/useScrollLock-K7kaP2Ud.js.map +1 -0
  34. package/dist/components/GrConfirmDialog/chunks/{GrConfirmDialog-BWYKCsHd.js → GrConfirmDialog-D8CkOtqv.js} +1 -1
  35. package/dist/components/GrConfirmDialog/chunks/{GrConfirmDialog-BWYKCsHd.js.map → GrConfirmDialog-D8CkOtqv.js.map} +1 -1
  36. package/dist/components/GrConfirmDialog/index.js +2 -2
  37. package/dist/components/GrDataTable/chunks/{GrDataTable-ptbARmJ3.js → GrDataTable-Ds5OeGat.js} +42 -16
  38. package/dist/components/GrDataTable/chunks/GrDataTable-Ds5OeGat.js.map +1 -0
  39. package/dist/components/GrDataTable/index.js +1 -1
  40. package/dist/components/GrDialog/chunks/{GrDialog-5DAS-1Lb.js → GrDialog-Ctucxju9.js} +2 -2
  41. package/dist/components/GrDialog/chunks/{GrDialog-5DAS-1Lb.js.map → GrDialog-Ctucxju9.js.map} +1 -1
  42. package/dist/components/GrDialog/index.js +1 -1
  43. package/dist/components/GrDialogService/chunks/{GrDialogService-DY_fmaMu.js → GrDialogService-CU1Fbonc.js} +2 -2
  44. package/dist/components/GrDialogService/chunks/{GrDialogService-DY_fmaMu.js.map → GrDialogService-CU1Fbonc.js.map} +1 -1
  45. package/dist/components/GrDialogService/index.js +1 -1
  46. package/dist/components/GrDivider/chunks/GrDivider-5bcE-BB4.js +54 -0
  47. package/dist/components/GrDivider/chunks/GrDivider-5bcE-BB4.js.map +1 -0
  48. package/dist/components/GrDivider/index.js +3 -0
  49. package/dist/components/GrDrawer/chunks/{GrDrawer-D1kzsjXN.js → GrDrawer-SLGKCY2A.js} +37 -13
  50. package/dist/components/GrDrawer/chunks/GrDrawer-SLGKCY2A.js.map +1 -0
  51. package/dist/components/GrDrawer/index.js +2 -2
  52. package/dist/components/GrDropdown/chunks/{GrDropdown-BXb5Cxxf.js → GrDropdown-BnDMYP8v.js} +90 -4
  53. package/dist/components/GrDropdown/chunks/GrDropdown-BnDMYP8v.js.map +1 -0
  54. package/dist/components/GrDropdown/index.js +1 -1
  55. package/dist/components/GrDropdownMenu/chunks/{GrDropdownMenu-DFEJLPcV.js → GrDropdownMenu--g9Vofcq.js} +1 -1
  56. package/dist/components/GrDropdownMenu/chunks/{GrDropdownMenu-DFEJLPcV.js.map → GrDropdownMenu--g9Vofcq.js.map} +1 -1
  57. package/dist/components/GrDropdownMenu/index.js +1 -1
  58. package/dist/components/GrFormField/chunks/GrFormField-DnfMHx_U.js +73 -0
  59. package/dist/components/GrFormField/chunks/GrFormField-DnfMHx_U.js.map +1 -0
  60. package/dist/components/GrFormField/index.js +3 -2
  61. package/dist/components/GrImageViewer/chunks/{GrImageViewer-OCUIrNh2.js → GrImageViewer-Dla9IBkd.js} +311 -222
  62. package/dist/components/GrImageViewer/chunks/GrImageViewer-Dla9IBkd.js.map +1 -0
  63. package/dist/components/GrImageViewer/index.js +1 -1
  64. package/dist/components/GrInput/chunks/GrInput-B8dd3JaA.js +334 -0
  65. package/dist/components/GrInput/chunks/GrInput-B8dd3JaA.js.map +1 -0
  66. package/dist/components/GrInput/index.js +1 -1
  67. package/dist/components/GrKbd/chunks/GrKbd-BEoYxWhE.js +22 -0
  68. package/dist/components/GrKbd/chunks/GrKbd-BEoYxWhE.js.map +1 -0
  69. package/dist/components/GrKbd/index.js +3 -0
  70. package/dist/components/GrModal/chunks/{GrModal-BkjW9jZS.js → GrModal-C0GZrHN3.js} +3 -56
  71. package/dist/components/GrModal/chunks/GrModal-C0GZrHN3.js.map +1 -0
  72. package/dist/components/GrModal/index.js +1 -1
  73. package/dist/components/GrNumberInput/chunks/{GrNumberInput-CldPIWQx.js → GrNumberInput-DxCEvL7V.js} +93 -11
  74. package/dist/components/GrNumberInput/chunks/GrNumberInput-DxCEvL7V.js.map +1 -0
  75. package/dist/components/GrNumberInput/index.js +1 -1
  76. package/dist/components/GrPagination/chunks/{GrPagination-Bu9wv6it.js → GrPagination-mlyfLjQY.js} +1 -1
  77. package/dist/components/GrPagination/chunks/{GrPagination-Bu9wv6it.js.map → GrPagination-mlyfLjQY.js.map} +1 -1
  78. package/dist/components/GrPagination/index.js +2 -2
  79. package/dist/components/GrProgressBar/index.js +1 -1
  80. package/dist/components/GrPromptDialog/chunks/{GrPromptDialog-TmWXbpEP.js → GrPromptDialog-C-_BMNuY.js} +3 -3
  81. package/dist/components/GrPromptDialog/chunks/{GrPromptDialog-TmWXbpEP.js.map → GrPromptDialog-C-_BMNuY.js.map} +1 -1
  82. package/dist/components/GrPromptDialog/index.js +1 -1
  83. package/dist/components/GrRadio/chunks/{GrRadio-CPTixXaY.js → GrRadio-Dr-pvs_9.js} +1 -1
  84. package/dist/components/GrRadio/chunks/{GrRadio-CPTixXaY.js.map → GrRadio-Dr-pvs_9.js.map} +1 -1
  85. package/dist/components/GrRadio/index.js +2 -2
  86. package/dist/components/GrRadioGroup/chunks/{GrRadioGroup-vKZCbkCp.js → GrRadioGroup-nOdvfV_g.js} +1 -1
  87. package/dist/components/GrRadioGroup/chunks/{GrRadioGroup-vKZCbkCp.js.map → GrRadioGroup-nOdvfV_g.js.map} +1 -1
  88. package/dist/components/GrRadioGroup/index.js +1 -1
  89. package/dist/components/GrSelect/chunks/{GrSelect-RShK21lK.js → GrSelect-BVCmitqa.js} +147 -27
  90. package/dist/components/GrSelect/chunks/GrSelect-BVCmitqa.js.map +1 -0
  91. package/dist/components/GrSelect/index.js +1 -1
  92. package/dist/components/GrSidebar/index.js +1 -1
  93. package/dist/components/GrTabPanels/chunks/GrTabPanels-DbKybwe-.js +68 -0
  94. package/dist/components/GrTabPanels/chunks/GrTabPanels-DbKybwe-.js.map +1 -0
  95. package/dist/components/GrTabPanels/index.js +3 -0
  96. package/dist/components/GrTabs/chunks/{GrTabs-Z-FDJUr_.js → GrTabs-DsLwWoRz.js} +6 -1
  97. package/dist/components/GrTabs/chunks/GrTabs-DsLwWoRz.js.map +1 -0
  98. package/dist/components/GrTabs/index.js +1 -1
  99. package/dist/components/GrTextarea/chunks/{GrTextarea-D56YxhKq.js → GrTextarea-CKukGlNl.js} +15 -5
  100. package/dist/components/GrTextarea/chunks/GrTextarea-CKukGlNl.js.map +1 -0
  101. package/dist/components/GrTextarea/index.js +2 -2
  102. package/dist/components/GrToaster/chunks/{GrToaster-eI8YvnIo.js → GrToaster-L2cu6cSR.js} +1 -1
  103. package/dist/components/GrToaster/chunks/{GrToaster-eI8YvnIo.js.map → GrToaster-L2cu6cSR.js.map} +1 -1
  104. package/dist/components/GrToaster/index.js +2 -2
  105. package/dist/components/GrTree/chunks/{GrTree-D3ODe2dB.js → GrTree-B2_yW6g1.js} +107 -8
  106. package/dist/components/GrTree/chunks/GrTree-B2_yW6g1.js.map +1 -0
  107. package/dist/components/GrTree/index.js +2 -2
  108. package/dist/components/GrTreeSelect/chunks/{GrTreeSelect-B2xBKs5Q.js → GrTreeSelect-0aM62xyu.js} +3 -3
  109. package/dist/components/GrTreeSelect/chunks/{GrTreeSelect-B2xBKs5Q.js.map → GrTreeSelect-0aM62xyu.js.map} +1 -1
  110. package/dist/components/GrTreeSelect/index.js +2 -2
  111. package/dist/granular-provider-node.js +2 -2
  112. package/dist/granular-provider.js +1 -1
  113. package/dist/i18n/all.js +1 -1
  114. package/dist/i18n/index.js +1 -1
  115. package/dist/index.js +40 -33
  116. package/dist/index.js.map +1 -1
  117. package/dist/styles/base.css +30 -8
  118. package/dist/styles/preflight.css +5 -1
  119. package/dist/types/src/components/GrDataTable/GrDataTable.vue.d.ts +28 -4
  120. package/dist/types/src/components/GrDivider/GrDivider.vue.d.ts +58 -0
  121. package/dist/types/src/components/GrDivider/config.d.ts +1 -0
  122. package/dist/types/src/components/GrDivider/index.d.ts +4 -0
  123. package/dist/types/src/components/GrDrawer/GrDrawer.vue.d.ts +4 -4
  124. package/dist/types/src/components/GrDropdown/GrDropdown.vue.d.ts +7 -0
  125. package/dist/types/src/components/GrDropdownMenu/GrDropdownMenu.vue.d.ts +6 -0
  126. package/dist/types/src/components/GrFormField/GrFormField.vue.d.ts +15 -2
  127. package/dist/types/src/components/GrFormField/context.d.ts +20 -0
  128. package/dist/types/src/components/GrFormField/index.d.ts +1 -0
  129. package/dist/types/src/components/GrImageViewer/GrImageViewer.vue.d.ts +4 -0
  130. package/dist/types/src/components/GrImageViewer/composables/useViewerKeyboard.d.ts +20 -0
  131. package/dist/types/src/components/GrImageViewer/composables/useWheelGesture.d.ts +16 -0
  132. package/dist/types/src/components/GrImageViewer/composables/useZoomPan.d.ts +50 -0
  133. package/dist/types/src/components/GrInput/GrInput.vue.d.ts +41 -2
  134. package/dist/types/src/components/GrKbd/GrKbd.vue.d.ts +46 -0
  135. package/dist/types/src/components/GrKbd/config.d.ts +1 -0
  136. package/dist/types/src/components/GrKbd/index.d.ts +4 -0
  137. package/dist/types/src/components/GrNumberInput/GrNumberInput.vue.d.ts +16 -0
  138. package/dist/types/src/components/GrSelect/GrSelect.vue.d.ts +2 -2
  139. package/dist/types/src/components/GrTabPanels/GrTabPanel.vue.d.ts +46 -0
  140. package/dist/types/src/components/GrTabPanels/GrTabPanels.vue.d.ts +51 -0
  141. package/dist/types/src/components/GrTabPanels/config.d.ts +5 -0
  142. package/dist/types/src/components/GrTabPanels/context.d.ts +9 -0
  143. package/dist/types/src/components/GrTabPanels/index.d.ts +6 -0
  144. package/dist/types/src/components/GrTabs/GrTabs.vue.d.ts +6 -0
  145. package/dist/types/src/components/GrTree/grTreeInteractionContext.d.ts +2 -0
  146. package/dist/types/src/composables/internal/useScrollLock.d.ts +24 -0
  147. package/dist/types/src/granular-provider/shared.d.ts +3 -0
  148. package/dist/types/src/i18n/messages/en.d.ts +10 -0
  149. package/dist/types/src/i18n/messages/es.d.ts +10 -0
  150. package/dist/types/src/i18n/messages/ru.d.ts +10 -0
  151. package/dist/types/src/index.d.ts +3 -0
  152. package/dist/web-types.json +275 -26
  153. package/package.json +13 -1
  154. package/dist/chunks/config-1uSYl98Y.js.map +0 -1
  155. package/dist/chunks/config-BIRO0vDJ2.js.map +0 -1
  156. package/dist/chunks/config-BXtAmU3s.js.map +0 -1
  157. package/dist/chunks/config-CGHLoBlH2.js.map +0 -1
  158. package/dist/chunks/config-CrG1XiE7.js.map +0 -1
  159. package/dist/chunks/config-DUcu1D68.js.map +0 -1
  160. package/dist/chunks/config-DnvPqu4g.js.map +0 -1
  161. package/dist/chunks/config-DpqOnJiz2.js.map +0 -1
  162. package/dist/chunks/config-JpHA4Xx0.js.map +0 -1
  163. package/dist/chunks/config-LGrZIdaZ2.js.map +0 -1
  164. package/dist/chunks/shared-ChvcQgDl.js.map +0 -1
  165. package/dist/chunks/transition-TLFw4KBn.js.map +0 -1
  166. package/dist/components/GrDataTable/chunks/GrDataTable-ptbARmJ3.js.map +0 -1
  167. package/dist/components/GrDrawer/chunks/GrDrawer-D1kzsjXN.js.map +0 -1
  168. package/dist/components/GrDropdown/chunks/GrDropdown-BXb5Cxxf.js.map +0 -1
  169. package/dist/components/GrFormField/chunks/GrFormField-BujNQrw8.js +0 -35
  170. package/dist/components/GrFormField/chunks/GrFormField-BujNQrw8.js.map +0 -1
  171. package/dist/components/GrImageViewer/chunks/GrImageViewer-OCUIrNh2.js.map +0 -1
  172. package/dist/components/GrInput/chunks/GrInput-C8pOJgCi.js +0 -188
  173. package/dist/components/GrInput/chunks/GrInput-C8pOJgCi.js.map +0 -1
  174. package/dist/components/GrModal/chunks/GrModal-BkjW9jZS.js.map +0 -1
  175. package/dist/components/GrNumberInput/chunks/GrNumberInput-CldPIWQx.js.map +0 -1
  176. package/dist/components/GrSelect/chunks/GrSelect-RShK21lK.js.map +0 -1
  177. package/dist/components/GrTabs/chunks/GrTabs-Z-FDJUr_.js.map +0 -1
  178. package/dist/components/GrTextarea/chunks/GrTextarea-D56YxhKq.js.map +0 -1
  179. package/dist/components/GrTree/chunks/GrTree-D3ODe2dB.js.map +0 -1
  180. /package/dist/chunks/{config-1uSYl98Y.js → config-1uSYl98Y2.js} +0 -0
  181. /package/dist/chunks/{config-BIRO0vDJ2.js → config-BIRO0vDJ.js} +0 -0
  182. /package/dist/chunks/{config-BXtAmU3s.js → config-BXtAmU3s2.js} +0 -0
  183. /package/dist/chunks/{config-CGHLoBlH2.js → config-CGHLoBlH.js} +0 -0
  184. /package/dist/chunks/{config-CrG1XiE7.js → config-CrG1XiE72.js} +0 -0
  185. /package/dist/chunks/{config-DUcu1D68.js → config-DUcu1D682.js} +0 -0
  186. /package/dist/chunks/{config-DnvPqu4g.js → config-DnvPqu4g2.js} +0 -0
  187. /package/dist/chunks/{config-DpqOnJiz2.js → config-DpqOnJiz.js} +0 -0
  188. /package/dist/chunks/{config-JpHA4Xx0.js → config-JpHA4Xx02.js} +0 -0
  189. /package/dist/chunks/{config-LGrZIdaZ2.js → config-LGrZIdaZ.js} +0 -0
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://raw.githubusercontent.com/JetBrains/web-types/master/schema/web-types.json",
3
3
  "name": "@feugene/granularity",
4
- "version": "0.11.0",
4
+ "version": "0.12.0",
5
5
  "framework": "vue",
6
6
  "js-types-syntax": "typescript",
7
7
  "description-markup": "markdown",
@@ -777,7 +777,7 @@
777
777
  },
778
778
  {
779
779
  "name": "initialSortKey",
780
- "description": "Ключ колонки для начальной сортировки.",
780
+ "description": "Ключ колонки для начальной сортировки (uncontrolled-режим).",
781
781
  "default": "undefined",
782
782
  "value": {
783
783
  "kind": "expression",
@@ -786,13 +786,40 @@
786
786
  },
787
787
  {
788
788
  "name": "initialSortDir",
789
- "description": "Направление начальной сортировки.",
789
+ "description": "Направление начальной сортировки (uncontrolled-режим).",
790
790
  "default": "\"asc\"",
791
791
  "value": {
792
792
  "kind": "expression",
793
793
  "type": "\"asc\" | \"desc\" | undefined"
794
794
  }
795
795
  },
796
+ {
797
+ "name": "sortKey",
798
+ "description": "Контролируемый ключ сортировки: `v-model:sortKey`. Задаёт controlled-режим.",
799
+ "default": "undefined",
800
+ "value": {
801
+ "kind": "expression",
802
+ "type": "string | undefined"
803
+ }
804
+ },
805
+ {
806
+ "name": "sortDir",
807
+ "description": "Контролируемое направление сортировки: `v-model:sortDir`.",
808
+ "default": "undefined",
809
+ "value": {
810
+ "kind": "expression",
811
+ "type": "\"asc\" | \"desc\" | undefined"
812
+ }
813
+ },
814
+ {
815
+ "name": "externalSort",
816
+ "description": "Внешняя сортировка (например серверная): компонент НЕ сортирует `rows` сам, а только сообщает о смене через `update:sortKey`/`update:sortDir`/ `sort-change`. `rows` при этом должны приходить уже отсортированными.",
817
+ "default": "false",
818
+ "value": {
819
+ "kind": "expression",
820
+ "type": "boolean | undefined"
821
+ }
822
+ },
796
823
  {
797
824
  "name": "density",
798
825
  "default": "\"regular\"",
@@ -844,7 +871,20 @@
844
871
  {
845
872
  "name": "foot"
846
873
  }
847
- ]
874
+ ],
875
+ "js": {
876
+ "events": [
877
+ {
878
+ "name": "update:sortKey"
879
+ },
880
+ {
881
+ "name": "update:sortDir"
882
+ },
883
+ {
884
+ "name": "sort-change"
885
+ }
886
+ ]
887
+ }
848
888
  },
849
889
  {
850
890
  "name": "GrDialog",
@@ -962,6 +1002,44 @@
962
1002
  ]
963
1003
  }
964
1004
  },
1005
+ {
1006
+ "name": "GrDivider",
1007
+ "source": {
1008
+ "module": "@feugene/granularity/components/GrDivider",
1009
+ "symbol": "GrDivider"
1010
+ },
1011
+ "props": [
1012
+ {
1013
+ "name": "orientation",
1014
+ "default": "\"horizontal\"",
1015
+ "value": {
1016
+ "kind": "expression",
1017
+ "type": "GrDividerOrientation | undefined"
1018
+ }
1019
+ },
1020
+ {
1021
+ "name": "label",
1022
+ "default": "undefined",
1023
+ "value": {
1024
+ "kind": "expression",
1025
+ "type": "string | undefined"
1026
+ }
1027
+ },
1028
+ {
1029
+ "name": "align",
1030
+ "default": "\"center\"",
1031
+ "value": {
1032
+ "kind": "expression",
1033
+ "type": "GrDividerAlign | undefined"
1034
+ }
1035
+ }
1036
+ ],
1037
+ "slots": [
1038
+ {
1039
+ "name": "default"
1040
+ }
1041
+ ]
1042
+ },
965
1043
  {
966
1044
  "name": "GrDrawer",
967
1045
  "source": {
@@ -1434,6 +1512,15 @@
1434
1512
  "symbol": "GrFormField"
1435
1513
  },
1436
1514
  "props": [
1515
+ {
1516
+ "name": "required",
1517
+ "description": "Помечает поле обязательным (маркер `*` + `aria-required` у контрола).",
1518
+ "default": "false",
1519
+ "value": {
1520
+ "kind": "expression",
1521
+ "type": "boolean | undefined"
1522
+ }
1523
+ },
1437
1524
  {
1438
1525
  "name": "error",
1439
1526
  "default": "undefined",
@@ -1452,6 +1539,16 @@
1452
1539
  },
1453
1540
  {
1454
1541
  "name": "forId",
1542
+ "description": "Явный id контрола. Если не задан — генерируется автоматически.",
1543
+ "default": "undefined",
1544
+ "value": {
1545
+ "kind": "expression",
1546
+ "type": "string | undefined"
1547
+ }
1548
+ },
1549
+ {
1550
+ "name": "hint",
1551
+ "description": "Подсказка под лейблом/над контролом (можно также через слот `#hint`).",
1455
1552
  "default": "undefined",
1456
1553
  "value": {
1457
1554
  "kind": "expression",
@@ -1468,6 +1565,9 @@
1468
1565
  }
1469
1566
  ],
1470
1567
  "slots": [
1568
+ {
1569
+ "name": "hint"
1570
+ },
1471
1571
  {
1472
1572
  "name": "default"
1473
1573
  }
@@ -1946,6 +2046,15 @@
1946
2046
  "type": "\"search\" | \"none\" | \"text\" | \"email\" | \"tel\" | \"url\" | \"numeric\" | \"decimal\" | undefined"
1947
2047
  }
1948
2048
  },
2049
+ {
2050
+ "name": "readonly",
2051
+ "description": "Только для чтения: значение видно и выделяемо, но не редактируется.",
2052
+ "default": "false",
2053
+ "value": {
2054
+ "kind": "expression",
2055
+ "type": "boolean | undefined"
2056
+ }
2057
+ },
1949
2058
  {
1950
2059
  "name": "invalid",
1951
2060
  "default": "false",
@@ -1954,6 +2063,68 @@
1954
2063
  "type": "boolean | undefined"
1955
2064
  }
1956
2065
  },
2066
+ {
2067
+ "name": "clearable",
2068
+ "description": "Показывать кнопку очистки, когда есть значение (и не disabled/readonly).",
2069
+ "default": "false",
2070
+ "value": {
2071
+ "kind": "expression",
2072
+ "type": "boolean | undefined"
2073
+ }
2074
+ },
2075
+ {
2076
+ "name": "clearLabel",
2077
+ "description": "i18n aria-label кнопки очистки.",
2078
+ "default": "undefined",
2079
+ "value": {
2080
+ "kind": "expression",
2081
+ "type": "string | undefined"
2082
+ }
2083
+ },
2084
+ {
2085
+ "name": "maxlength",
2086
+ "description": "Ограничение длины + основа для счётчика символов.",
2087
+ "default": "undefined",
2088
+ "value": {
2089
+ "kind": "expression",
2090
+ "type": "number | undefined"
2091
+ }
2092
+ },
2093
+ {
2094
+ "name": "showCount",
2095
+ "description": "Показывать счётчик символов (`len` или `len/maxlength`).",
2096
+ "default": "false",
2097
+ "value": {
2098
+ "kind": "expression",
2099
+ "type": "boolean | undefined"
2100
+ }
2101
+ },
2102
+ {
2103
+ "name": "passwordToggle",
2104
+ "description": "Кнопка показать/скрыть пароль (только при `type=\"password\"`).",
2105
+ "default": "false",
2106
+ "value": {
2107
+ "kind": "expression",
2108
+ "type": "boolean | undefined"
2109
+ }
2110
+ },
2111
+ {
2112
+ "name": "passwordShowLabel",
2113
+ "description": "i18n aria-label кнопки показать/скрыть пароль.",
2114
+ "default": "undefined",
2115
+ "value": {
2116
+ "kind": "expression",
2117
+ "type": "string | undefined"
2118
+ }
2119
+ },
2120
+ {
2121
+ "name": "passwordHideLabel",
2122
+ "default": "undefined",
2123
+ "value": {
2124
+ "kind": "expression",
2125
+ "type": "string | undefined"
2126
+ }
2127
+ },
1957
2128
  {
1958
2129
  "name": "textAlign",
1959
2130
  "default": "\"left\"",
@@ -2084,7 +2255,7 @@
2084
2255
  }
2085
2256
  },
2086
2257
  {
2087
- "name": "invalid",
2258
+ "name": "readonly",
2088
2259
  "default": "false",
2089
2260
  "value": {
2090
2261
  "kind": "expression",
@@ -2092,7 +2263,7 @@
2092
2263
  }
2093
2264
  },
2094
2265
  {
2095
- "name": "readonly",
2266
+ "name": "invalid",
2096
2267
  "default": "false",
2097
2268
  "value": {
2098
2269
  "kind": "expression",
@@ -2216,6 +2387,28 @@
2216
2387
  ]
2217
2388
  }
2218
2389
  },
2390
+ {
2391
+ "name": "GrKbd",
2392
+ "source": {
2393
+ "module": "@feugene/granularity/components/GrKbd",
2394
+ "symbol": "GrKbd"
2395
+ },
2396
+ "props": [
2397
+ {
2398
+ "name": "size",
2399
+ "default": "\"md\"",
2400
+ "value": {
2401
+ "kind": "expression",
2402
+ "type": "GrKbdSize | undefined"
2403
+ }
2404
+ }
2405
+ ],
2406
+ "slots": [
2407
+ {
2408
+ "name": "default"
2409
+ }
2410
+ ]
2411
+ },
2219
2412
  {
2220
2413
  "name": "GrLink",
2221
2414
  "source": {
@@ -2710,6 +2903,24 @@
2710
2903
  "type": "number | undefined"
2711
2904
  }
2712
2905
  },
2906
+ {
2907
+ "name": "locale",
2908
+ "description": "BCP-47 локаль для отображения значения (группировка разрядов и разделители через `Intl.NumberFormat`). Работает вместе с `useGrouping`.",
2909
+ "default": "undefined",
2910
+ "value": {
2911
+ "kind": "expression",
2912
+ "type": "string | undefined"
2913
+ }
2914
+ },
2915
+ {
2916
+ "name": "useGrouping",
2917
+ "description": "Группировать разряды при отображении (когда поле не в фокусе). При фокусе показывается «сырое» значение для редактирования. По умолчанию выключено.",
2918
+ "default": "false",
2919
+ "value": {
2920
+ "kind": "expression",
2921
+ "type": "boolean | undefined"
2922
+ }
2923
+ },
2713
2924
  {
2714
2925
  "name": "controls",
2715
2926
  "description": "Показывать кнопки +/-.",
@@ -3057,7 +3268,7 @@
3057
3268
  }
3058
3269
  },
3059
3270
  {
3060
- "name": "placeholder",
3271
+ "name": "label",
3061
3272
  "default": "undefined",
3062
3273
  "value": {
3063
3274
  "kind": "expression",
@@ -3065,7 +3276,7 @@
3065
3276
  }
3066
3277
  },
3067
3278
  {
3068
- "name": "label",
3279
+ "name": "placeholder",
3069
3280
  "default": "undefined",
3070
3281
  "value": {
3071
3282
  "kind": "expression",
@@ -3638,6 +3849,24 @@
3638
3849
  "type": "string | undefined"
3639
3850
  }
3640
3851
  },
3852
+ {
3853
+ "name": "clearable",
3854
+ "description": "Разрешает очистку выбранного значения.",
3855
+ "default": "false",
3856
+ "value": {
3857
+ "kind": "expression",
3858
+ "type": "boolean | undefined"
3859
+ }
3860
+ },
3861
+ {
3862
+ "name": "clearLabel",
3863
+ "description": "i18n-label для кнопки очистки (`aria-label`).",
3864
+ "default": "undefined",
3865
+ "value": {
3866
+ "kind": "expression",
3867
+ "type": "string | undefined"
3868
+ }
3869
+ },
3641
3870
  {
3642
3871
  "name": "underline",
3643
3872
  "description": "Подчёркивание для `view=\"link\"` (аналогично `GrLink`). В `view=\"default\"` не используется.",
@@ -3709,24 +3938,6 @@
3709
3938
  "type": "boolean | undefined"
3710
3939
  }
3711
3940
  },
3712
- {
3713
- "name": "clearable",
3714
- "description": "Разрешает очистку выбранного значения.",
3715
- "default": "false",
3716
- "value": {
3717
- "kind": "expression",
3718
- "type": "boolean | undefined"
3719
- }
3720
- },
3721
- {
3722
- "name": "clearLabel",
3723
- "description": "i18n-label для кнопки очистки (`aria-label`).",
3724
- "default": "undefined",
3725
- "value": {
3726
- "kind": "expression",
3727
- "type": "string | undefined"
3728
- }
3729
- },
3730
3941
  {
3731
3942
  "name": "modelValue",
3732
3943
  "required": true,
@@ -3947,6 +4158,36 @@
3947
4158
  ]
3948
4159
  }
3949
4160
  },
4161
+ {
4162
+ "name": "GrTabPanels",
4163
+ "source": {
4164
+ "module": "@feugene/granularity/components/GrTabPanels",
4165
+ "symbol": "GrTabPanels"
4166
+ },
4167
+ "props": [
4168
+ {
4169
+ "name": "idBase",
4170
+ "default": "undefined",
4171
+ "value": {
4172
+ "kind": "expression",
4173
+ "type": "string | undefined"
4174
+ }
4175
+ },
4176
+ {
4177
+ "name": "modelValue",
4178
+ "required": true,
4179
+ "value": {
4180
+ "kind": "expression",
4181
+ "type": "string"
4182
+ }
4183
+ }
4184
+ ],
4185
+ "slots": [
4186
+ {
4187
+ "name": "default"
4188
+ }
4189
+ ]
4190
+ },
3950
4191
  {
3951
4192
  "name": "GrTable",
3952
4193
  "source": {
@@ -4030,6 +4271,14 @@
4030
4271
  "type": "string"
4031
4272
  }
4032
4273
  },
4274
+ {
4275
+ "name": "idBase",
4276
+ "description": "База id для ARIA-связки с `GrTabPanels`. Если задана, каждая вкладка получает `id=\"<idBase>-tab-<value>\"` и `aria-controls=\"<idBase>-panel-<value>\"`. Передайте тот же `idBase` в `GrTabPanels`, чтобы связать `tab`↔`tabpanel`.",
4277
+ "value": {
4278
+ "kind": "expression",
4279
+ "type": "string | undefined"
4280
+ }
4281
+ },
4033
4282
  {
4034
4283
  "name": "tabs",
4035
4284
  "required": true,
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@feugene/granularity",
3
3
  "description": "Granularity design system package with Vue 3 components, consumed via the `@feugene/unocss-preset-granular` preset.",
4
- "version": "0.11.0",
4
+ "version": "0.12.0",
5
5
  "license": "SEE LICENSE IN LICENSE",
6
6
  "author": {
7
7
  "name": "Evgeniy Fureev",
@@ -107,6 +107,10 @@
107
107
  "types": "./dist/types/src/components/GrDialogService/index.d.ts",
108
108
  "import": "./dist/components/GrDialogService/index.js"
109
109
  },
110
+ "./components/GrDivider": {
111
+ "types": "./dist/types/src/components/GrDivider/index.d.ts",
112
+ "import": "./dist/components/GrDivider/index.js"
113
+ },
110
114
  "./components/GrDrawer": {
111
115
  "types": "./dist/types/src/components/GrDrawer/index.d.ts",
112
116
  "import": "./dist/components/GrDrawer/index.js"
@@ -155,6 +159,10 @@
155
159
  "types": "./dist/types/src/components/GrInputTag/index.d.ts",
156
160
  "import": "./dist/components/GrInputTag/index.js"
157
161
  },
162
+ "./components/GrKbd": {
163
+ "types": "./dist/types/src/components/GrKbd/index.d.ts",
164
+ "import": "./dist/components/GrKbd/index.js"
165
+ },
158
166
  "./components/GrLink": {
159
167
  "types": "./dist/types/src/components/GrLink/index.d.ts",
160
168
  "import": "./dist/components/GrLink/index.js"
@@ -231,6 +239,10 @@
231
239
  "types": "./dist/types/src/components/GrTabs/index.d.ts",
232
240
  "import": "./dist/components/GrTabs/index.js"
233
241
  },
242
+ "./components/GrTabPanels": {
243
+ "types": "./dist/types/src/components/GrTabPanels/index.d.ts",
244
+ "import": "./dist/components/GrTabPanels/index.js"
245
+ },
234
246
  "./components/GrTextarea": {
235
247
  "types": "./dist/types/src/components/GrTextarea/index.d.ts",
236
248
  "import": "./dist/components/GrTextarea/index.js"
@@ -1 +0,0 @@
1
- {"version":3,"file":"config-1uSYl98Y.js","names":[],"sources":["../../src/components/GrTextarea/grTextareaStyles.ts","../../src/components/GrTextarea/safelist.ts","../../src/components/GrTextarea/config.ts"],"sourcesContent":["export type GrTextareaState = 'default' | 'success' | 'warning' | 'danger'\n\nexport const borderClassByState: Record<GrTextareaState, string> = {\n default: 'border-[var(--brd)]',\n success: 'border-[var(--gr-success)] focus-visible:ring-[var(--gr-success)]',\n warning: 'border-[var(--gr-warning)] focus-visible:ring-[var(--gr-warning)]',\n danger: 'border-[var(--gr-danger)] focus-visible:ring-[var(--gr-danger)]',\n}\n\nexport function grTextareaClass(options: { state: GrTextareaState, invalid: boolean }): string {\n return options.invalid ? borderClassByState.danger : borderClassByState[options.state]\n}\n","import { splitClassTokens } from '../shared/classTokens'\nimport { borderClassByState } from './grTextareaStyles'\n\nexport const grTextareaSafelist = [...new Set([\n ...Object.values(borderClassByState).flatMap(splitClassTokens),\n])]\n","import {defineGranularComponent} from '@feugene/unocss-preset-granular/contract'\n\nimport { grTextareaSafelist } from './safelist'\n\nexport const grTextareaConfig = defineGranularComponent(import.meta.url, {\n name: 'GrTextarea',\n safelist: grTextareaSafelist,\n})"],"mappings":";;;AAEA,IAAa,qBAAsD;CACjE,SAAS;CACT,SAAS;CACT,SAAS;CACT,QAAQ;AACV;AAEA,SAAgB,gBAAgB,SAA+D;CAC7F,OAAO,QAAQ,UAAU,mBAAmB,SAAS,mBAAmB,QAAQ;AAClF;;;ACRA,IAAa,qBAAqB,CAAC,mBAAG,IAAI,IAAI,CAC5C,GAAG,OAAO,OAAO,kBAAkB,CAAC,CAAC,QAAQ,gBAAgB,CAC/D,CAAC,CAAC;;;ACDF,IAAa,mBAAmB,wBAAwB,OAAO,KAAK,KAAK;CACvE,MAAM;CACN,UAAU;AACZ,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"config-BIRO0vDJ2.js","names":[],"sources":["../../src/components/GrTreeSelect/grTreeSelectStyles.ts","../../src/components/GrTreeSelect/safelist.ts","../../src/components/GrTreeSelect/config.ts"],"sourcesContent":["import type { GrInputSize } from '../GrInput'\n\nexport type GrTreeSelectState = 'default' | 'success' | 'warning' | 'danger'\n\nexport const sizeClassBySize: Record<GrInputSize, string> = {\n xs: 'h-7 px-2.5 text-[12px]',\n sm: 'h-8 px-3 text-[13px]',\n md: 'h-10 px-3 text-[14px]',\n lg: 'h-11 px-4 text-[16px]',\n}\n\nexport const borderClassByState: Record<GrTreeSelectState, string> = {\n default: 'border-[var(--brd)]',\n success: 'border-[var(--gr-success)] focus-visible:ring-[var(--gr-success)]',\n warning: 'border-[var(--gr-warning)] focus-visible:ring-[var(--gr-warning)]',\n danger: 'border-[var(--gr-danger)] focus-visible:ring-[var(--gr-danger)]',\n}\n\nexport function grTreeSelectClass(options: { size: GrInputSize, state: GrTreeSelectState, invalid: boolean }): string {\n return [\n sizeClassBySize[options.size],\n 'pr-9',\n options.invalid ? borderClassByState.danger : borderClassByState[options.state],\n ].join(' ')\n}\n\nexport const grTreeSelectPanelClass = 'rounded-[var(--gr-radius-xl)] border border-[var(--brd)] bg-[var(--card)] text-[var(--card-fg)] shadow-[var(--gr-shadow-2)] overflow-hidden'\n","import { splitClassTokens } from '../shared/classTokens'\nimport { borderClassByState, grTreeSelectPanelClass, sizeClassBySize } from './grTreeSelectStyles'\n\nexport const grTreeSelectSafelist = [...new Set([\n ...Object.values(sizeClassBySize).flatMap(splitClassTokens),\n ...Object.values(borderClassByState).flatMap(splitClassTokens),\n 'pr-9',\n ...splitClassTokens(grTreeSelectPanelClass),\n])]\n","import {defineGranularComponent} from '@feugene/unocss-preset-granular/contract'\n\nimport { grTreeSelectSafelist } from './safelist'\n\nexport const grTreeSelectConfig = defineGranularComponent(import.meta.url, {\n name: 'GrTreeSelect',\n safelist: grTreeSelectSafelist,\n dependencies: ['GrInput', 'GrTree'],\n})"],"mappings":";;;AAIA,IAAa,kBAA+C;CAC1D,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;AAEA,IAAa,qBAAwD;CACnE,SAAS;CACT,SAAS;CACT,SAAS;CACT,QAAQ;AACV;AAEA,SAAgB,kBAAkB,SAAoF;CACpH,OAAO;EACL,gBAAgB,QAAQ;EACxB;EACA,QAAQ,UAAU,mBAAmB,SAAS,mBAAmB,QAAQ;CAC3E,CAAC,CAAC,KAAK,GAAG;AACZ;AAEA,IAAa,yBAAyB;;;ACvBtC,IAAa,uBAAuB,CAAC,mBAAG,IAAI,IAAI;CAC9C,GAAG,OAAO,OAAO,eAAe,CAAC,CAAC,QAAQ,gBAAgB;CAC1D,GAAG,OAAO,OAAO,kBAAkB,CAAC,CAAC,QAAQ,gBAAgB;CAC7D;CACA,GAAG,iBAAiB,sBAAsB;AAC5C,CAAC,CAAC;;;ACJF,IAAa,qBAAqB,wBAAwB,OAAO,KAAK,KAAK;CACzE,MAAM;CACN,UAAU;CACV,cAAc,CAAC,WAAW,QAAQ;AACpC,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"config-BXtAmU3s.js","names":[],"sources":["../../src/components/GrConfirmDialog/config.ts"],"sourcesContent":["import {defineGranularComponent} from '@feugene/unocss-preset-granular/contract'\n\nexport const grConfirmDialogConfig = defineGranularComponent(import.meta.url, {\n name: 'GrConfirmDialog',\n dependencies: ['GrButton', 'GrDialog'],\n})"],"mappings":";;AAEA,IAAa,wBAAwB,wBAAwB,OAAO,KAAK,KAAK;CAC1E,MAAM;CACN,cAAc,CAAC,YAAY,UAAU;AACzC,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"config-CGHLoBlH2.js","names":[],"sources":["../../src/components/GrSidebar/config.ts"],"sourcesContent":["import { defineGranularComponent } from '@feugene/unocss-preset-granular/contract'\n\nexport const grSidebarConfig = defineGranularComponent(import.meta.url, {\n name: 'GrSidebar',\n})\n"],"mappings":";;AAEA,IAAa,kBAAkB,wBAAwB,OAAO,KAAK,KAAK,EACtE,MAAM,YACR,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"config-CrG1XiE7.js","names":[],"sources":["../../src/components/GrRadio/grRadioStyles.ts","../../src/components/GrRadio/safelist.ts","../../src/components/GrRadio/config.ts"],"sourcesContent":["import {\n grButtonBaseClass,\n grButtonClass,\n type GrButtonSize,\n type GrButtonTone,\n type GrButtonVariant,\n} from '../GrButton/grButtonStyles'\n\nexport type GrRadioVariant = 'radiobox' | 'button'\n\nexport const grRadioDisabledClass = 'opacity-50 cursor-not-allowed'\nexport const grRadioEnabledClass = 'cursor-pointer'\nexport const grRadioRootDisabledClass = 'cursor-not-allowed opacity-70'\nexport const grRadioRootEnabledClass = 'cursor-pointer'\nexport const grRadioControlCheckedClass = 'border-[var(--primary)] bg-[color-mix(in_srgb,var(--primary)_10%,var(--bg))]'\nexport const grRadioControlUncheckedClass = 'border-[var(--brd)] bg-[var(--bg)]'\nexport const grRadioDotCheckedClass = 'bg-[var(--primary)] opacity-100 scale-100'\nexport const grRadioDotUncheckedClass = 'bg-transparent opacity-0 scale-75'\n// Базовые классы «точки» внутри radiobox — нестандартные (`h-[6px]`, `w-[6px]`, произвольный transition).\n// Вынесены сюда, чтобы `safelist` мог гарантировать их присутствие в сборке даже при tree-shaking шаблона.\nexport const grRadioDotBaseClass = 'h-[6px] w-[6px] rounded-full transition-[transform,opacity,background-color] duration-150'\n\nexport function grRadioButtonClass(options: {\n checked: boolean\n disabled: boolean\n size: GrButtonSize\n buttonVariant: GrButtonVariant\n buttonTone: GrButtonTone\n selectedButtonVariant: GrButtonVariant\n selectedButtonTone: GrButtonTone\n}): string {\n const variant = options.checked ? options.selectedButtonVariant : options.buttonVariant\n const tone = options.checked ? options.selectedButtonTone : options.buttonTone\n\n return [\n grButtonBaseClass,\n grButtonClass({\n variant,\n tone,\n size: options.size,\n square: false,\n }),\n options.disabled ? grRadioDisabledClass : grRadioEnabledClass,\n ].join(' ')\n}\n\nexport function grRadioRootClass(disabled: boolean): string {\n return disabled ? grRadioRootDisabledClass : grRadioRootEnabledClass\n}\n\nexport function grRadioControlClass(checked: boolean): string {\n return checked ? grRadioControlCheckedClass : grRadioControlUncheckedClass\n}\n\nexport function grRadioDotClass(checked: boolean): string {\n return checked ? grRadioDotCheckedClass : grRadioDotUncheckedClass\n}\n","import {splitClassTokens} from '../shared/classTokens'\nimport {grButtonSafelist} from '../GrButton/safelist'\nimport {\n grRadioControlCheckedClass,\n grRadioControlUncheckedClass,\n grRadioDisabledClass,\n grRadioDotBaseClass,\n grRadioDotCheckedClass,\n grRadioDotUncheckedClass,\n grRadioEnabledClass,\n grRadioRootDisabledClass,\n grRadioRootEnabledClass,\n} from './grRadioStyles'\nexport const grRadioSafelist = [...new Set([\n ...grButtonSafelist,\n ...splitClassTokens(grRadioDisabledClass),\n ...splitClassTokens(grRadioEnabledClass),\n ...splitClassTokens(grRadioRootDisabledClass),\n ...splitClassTokens(grRadioRootEnabledClass),\n ...splitClassTokens(grRadioControlCheckedClass),\n ...splitClassTokens(grRadioControlUncheckedClass),\n ...splitClassTokens(grRadioDotCheckedClass),\n ...splitClassTokens(grRadioDotUncheckedClass),\n ...splitClassTokens(grRadioDotBaseClass),\n])]\n","import { defineGranularComponent } from '@feugene/unocss-preset-granular/contract'\n\nimport { grRadioSafelist } from './safelist'\n\nexport const grRadioConfig = defineGranularComponent(import.meta.url, {\n name: 'GrRadio',\n dependencies: ['GrButton'],\n safelist: grRadioSafelist,\n})"],"mappings":";;;;;AAUA,IAAa,uBAAuB;AACpC,IAAa,sBAAsB;AACnC,IAAa,2BAA2B;AACxC,IAAa,0BAA0B;AACvC,IAAa,6BAA6B;AAC1C,IAAa,+BAA+B;AAC5C,IAAa,yBAAyB;AACtC,IAAa,2BAA2B;AAGxC,IAAa,sBAAsB;AAEnC,SAAgB,mBAAmB,SAQxB;CAIP,OAAO;EACH;EACA,cAAc;GACV,SANQ,QAAQ,UAAU,QAAQ,wBAAwB,QAAQ;GAOlE,MANK,QAAQ,UAAU,QAAQ,qBAAqB,QAAQ;GAO5D,MAAM,QAAQ;GACd,QAAQ;EACZ,CAAC;EACD,QAAQ,WAAW,uBAAuB;CAC9C,CAAC,CAAC,KAAK,GAAG;AACd;AAEA,SAAgB,iBAAiB,UAA2B;CACxD,OAAO,WAAW,2BAA2B;AACjD;AAEA,SAAgB,oBAAoB,SAA0B;CAC1D,OAAO,UAAU,6BAA6B;AAClD;AAEA,SAAgB,gBAAgB,SAA0B;CACtD,OAAO,UAAU,yBAAyB;AAC9C;;;AC3CA,IAAa,kBAAkB,CAAC,mBAAG,IAAI,IAAI;CACvC,GAAG;CACH,GAAG,iBAAiB,oBAAoB;CACxC,GAAG,iBAAiB,mBAAmB;CACvC,GAAG,iBAAiB,wBAAwB;CAC5C,GAAG,iBAAiB,uBAAuB;CAC3C,GAAG,iBAAiB,0BAA0B;CAC9C,GAAG,iBAAiB,4BAA4B;CAChD,GAAG,iBAAiB,sBAAsB;CAC1C,GAAG,iBAAiB,wBAAwB;CAC5C,GAAG,iBAAiB,mBAAmB;AAC3C,CAAC,CAAC;;;ACpBF,IAAa,gBAAgB,wBAAwB,OAAO,KAAK,KAAK;CACpE,MAAM;CACN,cAAc,CAAC,UAAU;CACzB,UAAU;AACZ,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"config-DUcu1D68.js","names":[],"sources":["../../src/components/GrDrawer/grDrawerStyles.ts","../../src/components/GrDrawer/safelist.ts","../../src/components/GrDrawer/config.ts"],"sourcesContent":["export type GrDrawerSide = 'left' | 'right'\nexport type GrDrawerSize = 'sm' | 'md' | 'lg' | 'full'\n\nexport const panelWidthBySize: Record<GrDrawerSize, string> = {\n sm: 'w-[360px] max-w-[90vw]',\n md: 'w-[420px] max-w-[92vw]',\n lg: 'w-[560px] max-w-[94vw]',\n full: 'w-[100vw]',\n}\n\nexport const panelSideClass: Record<GrDrawerSide, string> = {\n left: 'left-0 border-r',\n right: 'right-0 border-l',\n}\n\nexport const panelTransitionClass: Record<GrDrawerSide, string> = {\n left: '-translate-x-full',\n right: 'translate-x-full',\n}\n\nexport function grDrawerPanelClass(options: { side: GrDrawerSide, size: GrDrawerSize }): string {\n return [\n panelSideClass[options.side],\n panelWidthBySize[options.size],\n 'border-[var(--brd)]',\n 'bg-[var(--card)] text-[var(--card-fg)]',\n 'shadow-[var(--gr-shadow-2)] outline-none',\n ].join(' ')\n}\n\nexport function grDrawerPanelEnterFrom(side: GrDrawerSide): string {\n return panelTransitionClass[side]\n}\n","import { splitClassTokens } from '../shared/classTokens'\nimport {\n panelSideClass,\n panelTransitionClass,\n panelWidthBySize,\n} from './grDrawerStyles'\n\n// Safelist содержит только динамические токены, выбираемые в рантайме через\n// ключи (`side`/`size`). Литералы, прописанные статически в шаблоне и в функции\n// `grDrawerPanelClass`, UnoCSS находит сканом и здесь не дублируются.\nexport const grDrawerSafelist = [...new Set([\n ...Object.values(panelSideClass).flatMap(splitClassTokens),\n ...Object.values(panelWidthBySize).flatMap(splitClassTokens),\n ...Object.values(panelTransitionClass).flatMap(splitClassTokens),\n])]\n","import { defineGranularComponent } from '@feugene/unocss-preset-granular/contract'\nimport { grDrawerSafelist } from './safelist'\n\nexport const grDrawerConfig = defineGranularComponent(import.meta.url, {\n name: 'GrDrawer',\n dependencies: ['GrButton', 'GrIcon'],\n safelist: grDrawerSafelist,\n})\n"],"mappings":";;;AAGA,IAAa,mBAAiD;CAC5D,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,MAAM;AACR;AAEA,IAAa,iBAA+C;CAC1D,MAAM;CACN,OAAO;AACT;AAEA,IAAa,uBAAqD;CAChE,MAAM;CACN,OAAO;AACT;AAEA,SAAgB,mBAAmB,SAA6D;CAC9F,OAAO;EACL,eAAe,QAAQ;EACvB,iBAAiB,QAAQ;EACzB;EACA;EACA;CACF,CAAC,CAAC,KAAK,GAAG;AACZ;AAEA,SAAgB,uBAAuB,MAA4B;CACjE,OAAO,qBAAqB;AAC9B;;;ACtBA,IAAa,mBAAmB,CAAC,mBAAG,IAAI,IAAI;CAC1C,GAAG,OAAO,OAAO,cAAc,CAAC,CAAC,QAAQ,gBAAgB;CACzD,GAAG,OAAO,OAAO,gBAAgB,CAAC,CAAC,QAAQ,gBAAgB;CAC3D,GAAG,OAAO,OAAO,oBAAoB,CAAC,CAAC,QAAQ,gBAAgB;AACjE,CAAC,CAAC;;;ACXF,IAAa,iBAAiB,wBAAwB,OAAO,KAAK,KAAK;CACrE,MAAM;CACN,cAAc,CAAC,YAAY,QAAQ;CACnC,UAAU;AACZ,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"config-DnvPqu4g.js","names":[],"sources":["../../src/components/GrProgressBar/safelist.ts","../../src/components/GrProgressBar/config.ts"],"sourcesContent":["import { splitClassTokens } from '../shared/classTokens'\nimport { grProgressBarFillClass, type GrProgressBarTone } from './grStyle'\n\nconst TONES: GrProgressBarTone[] = ['primary', 'neutral', 'success', 'warning', 'danger', 'info', 'slate', 'azure']\n\nconst fillTokens = TONES.flatMap(tone => splitClassTokens(grProgressBarFillClass(tone)))\n\nexport const grProgressBarClassTokens = {\n fill: fillTokens,\n} as const\n\nexport const grProgressBarSafelist = [...new Set([\n ...grProgressBarClassTokens.fill,\n])] as const\n","import {defineGranularComponent} from '@feugene/unocss-preset-granular/contract'\n\nimport { grProgressBarSafelist } from './safelist'\n\nexport const grProgressBarConfig = defineGranularComponent(import.meta.url, {\n name: 'GrProgressBar',\n safelist: grProgressBarSafelist,\n})"],"mappings":";;;AAOA,IAAa,2BAA2B,EACtC,MAHiB;CAFiB;CAAW;CAAW;CAAW;CAAW;CAAU;CAAQ;CAAS;AAExF,CAAA,CAAM,SAAQ,SAAQ,iBAAiB,uBAAuB,IAAI,CAAC,CAG9E,EACR;AAEA,IAAa,wBAAwB,CAAC,mBAAG,IAAI,IAAI,CAC/C,GAAG,yBAAyB,IAC9B,CAAC,CAAC;;;ACTF,IAAa,sBAAsB,wBAAwB,OAAO,KAAK,KAAK;CAC1E,MAAM;CACN,UAAU;AACZ,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"config-DpqOnJiz2.js","names":[],"sources":["../../src/components/GrTree/safelist.ts","../../src/components/GrTree/config.ts"],"sourcesContent":["// Только динамические значения иконок-пропов (`expandIcon`/`collapseIcon`/`dragHandleIcon`).\n// Литералы шаблона (`py-2`, `px-2`, `ml-6`, ...) не дублируем — UnoCSS находит их сканом.\nexport const grTreeSafelist = [\n 'i-lucide-chevron-right',\n 'i-lucide-grip-vertical',\n] as const","import {defineGranularComponent} from '@feugene/unocss-preset-granular/contract'\n\nimport { grTreeSafelist } from './safelist'\n\nexport const grTreeConfig = defineGranularComponent(import.meta.url, {\n name: 'GrTree',\n safelist: grTreeSafelist,\n})"],"mappings":";;AAEA,IAAa,iBAAiB,CAC5B,0BACA,wBACF;;;ACDA,IAAa,eAAe,wBAAwB,OAAO,KAAK,KAAK;CACnE,MAAM;CACN,UAAU;AACZ,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"config-JpHA4Xx0.js","names":[],"sources":["../../src/components/GrPagination/config.ts"],"sourcesContent":["import { defineGranularComponent } from '@feugene/unocss-preset-granular/contract'\n\nexport const grPaginationConfig = defineGranularComponent(import.meta.url, {\n name: 'GrPagination',\n dependencies: ['GrButton', 'GrSelect'],\n})\n"],"mappings":";;AAEA,IAAa,qBAAqB,wBAAwB,OAAO,KAAK,KAAK;CACzE,MAAM;CACN,cAAc,CAAC,YAAY,UAAU;AACvC,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"config-LGrZIdaZ2.js","names":[],"sources":["../../src/components/GrToaster/grToasterStyles.ts","../../src/components/GrToaster/safelist.ts","../../src/components/GrToaster/config.ts"],"sourcesContent":["export type GrToasterPlacement = 'top-right' | 'top-left' | 'bottom-right' | 'bottom-left'\n\n// Классы позиционирования контейнера по углам экрана.\n// Вынесены в отдельный модуль, чтобы быть единственным источником истины\n// для шаблона `GrToaster.vue` и для safelist.\nexport const PLACEMENT_CLASS: Record<GrToasterPlacement, string> = {\n 'top-right': 'right-4 top-4',\n 'top-left': 'left-4 top-4',\n 'bottom-right': 'right-4 bottom-4',\n 'bottom-left': 'left-4 bottom-4',\n}\n","import { splitClassTokens } from '../shared/classTokens'\nimport { PLACEMENT_CLASS } from './grToasterStyles'\n\n// В safelist попадают только те классы, которые приходят в шаблон динамически\n// (через `:class`/`PLACEMENT_CLASS`). Литералы из шаблона (`class=\"...\"`)\n// UnoCSS находит статическим сканом и дублировать их здесь не нужно.\nexport const grToasterSafelist = [...new Set(\n Object.values(PLACEMENT_CLASS).flatMap(splitClassTokens),\n)]\n","import { defineGranularComponent } from '@feugene/unocss-preset-granular/contract'\n\nimport { grToasterSafelist } from './safelist'\n\nexport const grToasterConfig = defineGranularComponent(import.meta.url, {\n name: 'GrToaster',\n dependencies: ['GrButton', 'GrIcon'],\n safelist: grToasterSafelist,\n})\n"],"mappings":";;;AAKA,IAAa,kBAAsD;CACjE,aAAa;CACb,YAAY;CACZ,gBAAgB;CAChB,eAAe;AACjB;;;ACJA,IAAa,oBAAoB,CAAC,GAAG,IAAI,IACvC,OAAO,OAAO,eAAe,CAAC,CAAC,QAAQ,gBAAgB,CACzD,CAAC;;;ACJD,IAAa,kBAAkB,wBAAwB,OAAO,KAAK,KAAK;CACtE,MAAM;CACN,cAAc,CAAC,YAAY,QAAQ;CACnC,UAAU;AACZ,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"shared-ChvcQgDl.js","names":[],"sources":["../../src/components/GrDialog/config.ts","../../src/components/GrResponseErrorBanner/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","import { defineGranularComponent } from '@feugene/unocss-preset-granular/contract'\n\nexport const grResponseErrorBannerConfig = defineGranularComponent(import.meta.url, {\n name: 'GrResponseErrorBanner',\n dependencies: ['GrAlert', 'GrButton'],\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// `apps/showcase/scripts/generate-component-api.mjs` берёт список компонентов из\n// `Object.keys(granularityComponentConfigs)` (импорт модуля через vite SSR),\n// поэтому спецформат строк реестра больше не является API — можно свободно рефакторить.\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 { grDialogServiceConfig } from '../components/GrDialogService/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 { grResponseErrorBannerConfig } from '../components/GrResponseErrorBanner/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 */\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 GrDialogService: grDialogServiceConfig,\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 GrResponseErrorBanner: grResponseErrorBannerConfig,\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,SAAS;CACpC,UAAU;AACZ,CAAC;;;ACND,IAAa,8BAA8B,wBAAwB,OAAO,KAAK,KAAK;CAClF,MAAM;CACN,cAAc,CAAC,WAAW,UAAU;AACtC,CAAC;;;;ACuED,IAAa,0BAA0B;AAKvC,IAAM,iBAAiB,GAAG,OAAO,KAAK,IAAI,MACxC,GACA,OAAO,KAAK,IAAI,YAAY,KAAK,OAAO,KAAK,IAAI,YAAY,GAAG,IAAI,CAAC,IAAI,CAC3E;;AAGA,IAAa,wBAAwB,CAAC,SAAS,MAAM;;AAIrD,IAAa,2BAA4D,CAAC,OAAO;AAEjF,IAAM,QAAQ;CACZ,YAAY,IAAA,IAAA,61DAAA,KAAA,OAAA,KAAA,GAAA,CAA8C,CAAC;CAC3D,cAAc,IAAA,IAAA,y2NAAA,KAAA,OAAA,KAAA,GAAA,CAAgD,CAAC;CAC/D,QAAQ;EACN,OAAO,IAAA,IAAA,qrGAAA,KAAA,OAAA,KAAA,GAAA,CAAsD,CAAC;EAC9D,MAAM,IAAA,IAAA,6tHAAA,KAAA,OAAA,KAAA,GAAA,CAAqD,CAAC;CAC9D;CACA,eAAe;AACjB;;;;;;;;;;;;;;AAeA,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,iBAAiB;CACjB,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,uBAAuB;CACvB,aAAa;CACb,UAAU;CACV,WAAW;CACX,YAAY;CACZ,UAAU;CACV,SAAS;CACT,QAAQ;CACR,YAAY;CACZ,WAAW;CACX,WAAW;CACX,QAAQ;CACR,cAAc;AAChB;;AAKA,IAAM,iBAAyD,OAAO,OACpE,2BACF;;;;;;;;;;AAWA,SAAgB,0BACd,YAAoD,CAAC,GACnC;CAClB,MAAM,iBAAiB,IAAI,IACzB,UAAU,KAAI,cAAa,CAAC,UAAU,MAAM,SAAS,CAAC,CACxD;CAMA,OAAO,uBAAuB;EAC5B,IAAI;EACJ,iBAAiB;EACjB;EACA,aARA,GAAG,eAAe,KAAI,cAAa,eAAe,IAAI,UAAU,IAAI,KAAK,SAAS,GAClF,GAAG,UAAU,QAAO,cAAa,CAAC,eAAe,MAAK,SAAQ,KAAK,SAAS,UAAU,IAAI,CAAC,CAO3F;EACA;CACF,CAAC;AACH"}