@feugene/granularity 0.41.0 → 0.43.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 (220) hide show
  1. package/LICENSE +13 -162
  2. package/README.md +5 -5
  3. package/dist/chunks/config-BXRmsn3t.js +172 -0
  4. package/dist/chunks/config-BXRmsn3t.js.map +1 -0
  5. package/dist/chunks/{config-BRESvs9g.js → config-Ca8qr8Q3.js} +1 -1
  6. package/dist/chunks/{config-BRESvs9g.js.map → config-Ca8qr8Q3.js.map} +1 -1
  7. package/dist/chunks/config-Dg0bSoGw.js +81 -0
  8. package/dist/chunks/config-Dg0bSoGw.js.map +1 -0
  9. package/dist/chunks/config-DmED6aJV.js +237 -0
  10. package/dist/chunks/config-DmED6aJV.js.map +1 -0
  11. package/dist/chunks/{config-DWL81-aM.js → config-hnoZvcIM.js} +2 -20
  12. package/dist/chunks/config-hnoZvcIM.js.map +1 -0
  13. package/dist/chunks/dragSortGeometry-CY-llfrQ.js +87 -0
  14. package/dist/chunks/dragSortGeometry-CY-llfrQ.js.map +1 -0
  15. package/dist/chunks/{en-CuuLfNHX.js → en-C_QkUTRL.js} +36 -1
  16. package/dist/chunks/en-C_QkUTRL.js.map +1 -0
  17. package/dist/chunks/{es-CsmvfESn.js → es-B4t_3Wnh.js} +3 -3
  18. package/dist/chunks/{es-CsmvfESn.js.map → es-B4t_3Wnh.js.map} +1 -1
  19. package/dist/chunks/{es-CSnmrcMw.js → es-DemSEhZE.js} +36 -1
  20. package/dist/chunks/es-DemSEhZE.js.map +1 -0
  21. package/dist/chunks/{generated-B95IBXs6.js → generated-VcxJTo_q.js} +210 -0
  22. package/dist/chunks/generated-VcxJTo_q.js.map +1 -0
  23. package/dist/chunks/{grKbdStyles-DENu8pUK.js → grKbdStyles-ByMsX-lQ.js} +17 -2
  24. package/dist/chunks/grKbdStyles-ByMsX-lQ.js.map +1 -0
  25. package/dist/chunks/{granular-provider-BshNi2la.js → granular-provider-BohXQcNt.js} +8 -2
  26. package/dist/chunks/granular-provider-BohXQcNt.js.map +1 -0
  27. package/dist/chunks/{ru-BKWafECI.js → ru-CLUErjhY.js} +36 -1
  28. package/dist/chunks/ru-CLUErjhY.js.map +1 -0
  29. package/dist/chunks/scrollOverflow-B_kEdcol.js +31 -0
  30. package/dist/chunks/scrollOverflow-B_kEdcol.js.map +1 -0
  31. package/dist/chunks/tones-CRJAaYyg.js +21 -0
  32. package/dist/chunks/tones-CRJAaYyg.js.map +1 -0
  33. package/dist/components/GrAffix/chunks/GrAffix-CWtC7yi8.js +272 -0
  34. package/dist/components/GrAffix/chunks/GrAffix-CWtC7yi8.js.map +1 -0
  35. package/dist/components/GrAffix/index.js +3 -0
  36. package/dist/components/GrBreadcrumbs/chunks/{GrBreadcrumbs-DOpwY2EF.js → GrBreadcrumbs-D0qPry_R.js} +4 -1
  37. package/dist/components/GrBreadcrumbs/chunks/GrBreadcrumbs-D0qPry_R.js.map +1 -0
  38. package/dist/components/GrBreadcrumbs/index.js +1 -1
  39. package/dist/components/GrCarousel/chunks/GrCarousel-ByuughtI.js +761 -0
  40. package/dist/components/GrCarousel/chunks/GrCarousel-ByuughtI.js.map +1 -0
  41. package/dist/components/GrCarousel/index.js +3 -0
  42. package/dist/components/GrCarousel/styles.css +1 -0
  43. package/dist/components/GrColorPicker/chunks/{GrColorPicker-BwzRLs-i.js → GrColorPicker-9mTR-YZ_.js} +1 -1
  44. package/dist/components/GrColorPicker/chunks/{GrColorPicker-BwzRLs-i.js.map → GrColorPicker-9mTR-YZ_.js.map} +1 -1
  45. package/dist/components/GrColorPicker/index.js +1 -1
  46. package/dist/components/GrCommandPalette/chunks/{GrCommandPalette-CnzPuoIM.js → GrCommandPalette-Ha4s3DMT.js} +1 -1
  47. package/dist/components/GrCommandPalette/chunks/{GrCommandPalette-CnzPuoIM.js.map → GrCommandPalette-Ha4s3DMT.js.map} +1 -1
  48. package/dist/components/GrCommandPalette/index.js +1 -1
  49. package/dist/components/GrDataTable/chunks/{GrDataTable-DpyipOFx.js → GrDataTable-xNSmO_I-.js} +9 -4
  50. package/dist/components/GrDataTable/chunks/GrDataTable-xNSmO_I-.js.map +1 -0
  51. package/dist/components/GrDataTable/index.js +1 -1
  52. package/dist/components/GrDelta/chunks/{GrDelta-BpfqebEV.js → GrDelta-CgTvfoIN.js} +0 -0
  53. package/dist/components/GrDelta/chunks/GrDelta-CgTvfoIN.js.map +1 -0
  54. package/dist/components/GrDelta/index.js +1 -1
  55. package/dist/components/GrDescriptionList/chunks/{GrDescriptionList-D8ANFpn_.js → GrDescriptionList-Dz2Jj1if.js} +26 -11
  56. package/dist/components/GrDescriptionList/chunks/GrDescriptionList-Dz2Jj1if.js.map +1 -0
  57. package/dist/components/GrDescriptionList/index.js +1 -1
  58. package/dist/components/GrFilePreview/chunks/{GrFilePreview-PabkLgYX.js → GrFilePreview-2kVOg1C7.js} +40 -5
  59. package/dist/components/GrFilePreview/chunks/GrFilePreview-2kVOg1C7.js.map +1 -0
  60. package/dist/components/GrFilePreview/index.js +1 -1
  61. package/dist/components/GrImageViewer/chunks/{GrImageViewer-Dd2gJ-j_.js.map → GrImageViewer-DK-iVHHC.js.map} +1 -1
  62. package/dist/components/GrImageViewer/index.js +1 -1
  63. package/dist/components/GrInputTag/chunks/{GrInputTag-3Au5HWZL.js → GrInputTag-Ci8AO1ze.js} +5 -2
  64. package/dist/components/GrInputTag/chunks/GrInputTag-Ci8AO1ze.js.map +1 -0
  65. package/dist/components/GrInputTag/index.js +1 -1
  66. package/dist/components/GrJsonViewer/chunks/{GrJsonViewer-CDGOX3C0.js → GrJsonViewer-CwCBMh4h.js} +34 -8
  67. package/dist/components/GrJsonViewer/chunks/GrJsonViewer-CwCBMh4h.js.map +1 -0
  68. package/dist/components/GrJsonViewer/index.js +1 -1
  69. package/dist/components/GrKbd/chunks/{GrKbd-D_a1mPLe.js → GrKbd-BNMeoaLV.js} +1 -1
  70. package/dist/components/GrKbd/chunks/{GrKbd-D_a1mPLe.js.map → GrKbd-BNMeoaLV.js.map} +1 -1
  71. package/dist/components/GrKbd/index.js +2 -2
  72. package/dist/components/GrNumberInput/chunks/{GrNumberInput-BqPydXpK.js → GrNumberInput-CL5QhOmx.js} +5 -2
  73. package/dist/components/GrNumberInput/chunks/GrNumberInput-CL5QhOmx.js.map +1 -0
  74. package/dist/components/GrNumberInput/index.js +1 -1
  75. package/dist/components/GrProgressBar/index.js +1 -1
  76. package/dist/components/GrSegmented/chunks/{GrSegmented-NKTi9bMG.js → GrSegmented-CuDaKA6S.js} +5 -1
  77. package/dist/components/GrSegmented/chunks/GrSegmented-CuDaKA6S.js.map +1 -0
  78. package/dist/components/GrSegmented/index.js +1 -1
  79. package/dist/components/GrSlider/chunks/{GrSlider-Db-jACXz.js.map → GrSlider-CO8N9SF6.js.map} +1 -1
  80. package/dist/components/GrSlider/index.js +1 -1
  81. package/dist/components/GrSortableList/chunks/{GrSortableList-CQCaWivn.js → GrSortableList-NKriuGm_.js} +6 -2
  82. package/dist/components/GrSortableList/chunks/GrSortableList-NKriuGm_.js.map +1 -0
  83. package/dist/components/GrSortableList/index.js +1 -1
  84. package/dist/components/GrSteps/chunks/{GrSteps-DXj7m-WO.js → GrSteps-Cng-Wrjk.js} +5 -1
  85. package/dist/components/GrSteps/chunks/GrSteps-Cng-Wrjk.js.map +1 -0
  86. package/dist/components/GrSteps/index.js +1 -1
  87. package/dist/components/GrTabs/chunks/{GrTabs-DHfv67cp.js → GrTabs-s9RzC1WX.js} +7 -32
  88. package/dist/components/GrTabs/chunks/GrTabs-s9RzC1WX.js.map +1 -0
  89. package/dist/components/GrTabs/index.js +1 -1
  90. package/dist/components/GrTransfer/chunks/GrTransfer-8FA78ny6.js +1368 -0
  91. package/dist/components/GrTransfer/chunks/GrTransfer-8FA78ny6.js.map +1 -0
  92. package/dist/components/GrTransfer/index.js +3 -0
  93. package/dist/components/GrTransfer/styles.css +1 -0
  94. package/dist/components/GrTree/chunks/{GrTree-BFWFc0Bm.js → GrTree-CkHzgYg1.js} +3 -3
  95. package/dist/components/GrTree/chunks/{GrTree-BFWFc0Bm.js.map → GrTree-CkHzgYg1.js.map} +1 -1
  96. package/dist/components/GrTree/index.js +1 -1
  97. package/dist/components/GrTreeSelect/chunks/{GrTreeSelect-DJa2lYGe.js → GrTreeSelect-DUsv3_mF.js} +1 -1
  98. package/dist/components/GrTreeSelect/chunks/{GrTreeSelect-DJa2lYGe.js.map → GrTreeSelect-DUsv3_mF.js.map} +1 -1
  99. package/dist/components/GrTreeSelect/index.js +1 -1
  100. package/dist/composables/useDragSort.js +179 -1
  101. package/dist/composables/useDragSort.js.map +1 -0
  102. package/dist/granular-provider-node.js +1 -1
  103. package/dist/granular-provider.js +1 -1
  104. package/dist/i18n/all.js +1 -1
  105. package/dist/i18n/index.js +1 -1
  106. package/dist/index.js +32 -28
  107. package/dist/theme.js +1 -1
  108. package/dist/tokens.js +1 -1
  109. package/dist/types/components/GrAffix/GrAffix.vue.d.ts +91 -0
  110. package/dist/types/components/GrAffix/affixState.d.ts +81 -0
  111. package/dist/types/components/GrAffix/config.d.ts +1 -0
  112. package/dist/types/components/GrAffix/grAffixStyles.d.ts +46 -0
  113. package/dist/types/components/GrAffix/index.d.ts +9 -0
  114. package/dist/types/components/GrAffix/safelist.d.ts +1 -0
  115. package/dist/types/components/GrAlert/GrAlert.vue.d.ts +1 -1
  116. package/dist/types/components/GrBadgeWrap/GrBadgeWrap.vue.d.ts +2 -2
  117. package/dist/types/components/GrButton/GrButton.vue.d.ts +2 -2
  118. package/dist/types/components/GrCard/GrCard.vue.d.ts +1 -1
  119. package/dist/types/components/GrCarousel/GrCarousel.vue.d.ts +151 -0
  120. package/dist/types/components/GrCarousel/GrCarouselSlide.vue.d.ts +53 -0
  121. package/dist/types/components/GrCarousel/carouselNavigation.d.ts +57 -0
  122. package/dist/types/components/GrCarousel/composables/useCarouselAutoplay.d.ts +33 -0
  123. package/dist/types/components/GrCarousel/composables/useCarouselSwipe.d.ts +20 -0
  124. package/dist/types/components/GrCarousel/config.d.ts +7 -0
  125. package/dist/types/components/GrCarousel/defaults.d.ts +13 -0
  126. package/dist/types/components/GrCarousel/grCarouselContext.d.ts +46 -0
  127. package/dist/types/components/GrCarousel/grCarouselStyles.d.ts +80 -0
  128. package/dist/types/components/GrCarousel/index.d.ts +12 -0
  129. package/dist/types/components/GrCarousel/safelist.d.ts +1 -0
  130. package/dist/types/components/GrCheckbox/GrCheckbox.vue.d.ts +3 -3
  131. package/dist/types/components/GrCheckboxGroup/GrCheckboxGroup.vue.d.ts +2 -2
  132. package/dist/types/components/GrChip/GrChip.vue.d.ts +2 -2
  133. package/dist/types/components/GrChipGroup/GrChipGroup.vue.d.ts +2 -2
  134. package/dist/types/components/GrCollapse/GrCollapse.vue.d.ts +1 -1
  135. package/dist/types/components/GrCollapse/GrCollapseItem.vue.d.ts +1 -1
  136. package/dist/types/components/GrColorPicker/GrColorPicker.vue.d.ts +3 -3
  137. package/dist/types/components/GrCommandPalette/GrCommandPalette.vue.d.ts +1 -1
  138. package/dist/types/components/GrConfirmDialog/GrConfirmDialog.vue.d.ts +1 -1
  139. package/dist/types/components/GrContextMenu/GrContextMenu.vue.d.ts +2 -2
  140. package/dist/types/components/GrDialog/GrDialog.vue.d.ts +1 -1
  141. package/dist/types/components/GrDivider/GrDivider.vue.d.ts +2 -2
  142. package/dist/types/components/GrDrawer/GrDrawer.vue.d.ts +1 -1
  143. package/dist/types/components/GrDropdown/GrDropdown.vue.d.ts +3 -3
  144. package/dist/types/components/GrDropdownMenu/GrDropdownMenu.vue.d.ts +3 -3
  145. package/dist/types/components/GrDropdownMenu/GrDropdownMenuItem.vue.d.ts +1 -1
  146. package/dist/types/components/GrEmptyState/GrEmptyState.vue.d.ts +1 -1
  147. package/dist/types/components/GrFilePreview/GrFilePreview.vue.d.ts +14 -0
  148. package/dist/types/components/GrFileUpload/GrFileUpload.vue.d.ts +1 -1
  149. package/dist/types/components/GrFormField/GrFormField.vue.d.ts +3 -3
  150. package/dist/types/components/GrFormFile/GrFormFile.vue.d.ts +2 -2
  151. package/dist/types/components/GrFormSection/GrFormSection.vue.d.ts +1 -1
  152. package/dist/types/components/GrIcon/GrIcon.vue.d.ts +1 -1
  153. package/dist/types/components/GrImageViewer/GrImageViewer.vue.d.ts +3 -3
  154. package/dist/types/components/GrInput/GrInput.vue.d.ts +4 -4
  155. package/dist/types/components/GrInputTag/GrInputTag.vue.d.ts +3 -3
  156. package/dist/types/components/GrKbd/GrKbd.vue.d.ts +1 -1
  157. package/dist/types/components/GrKbd/grKbdStyles.d.ts +17 -2
  158. package/dist/types/components/GrLink/GrLink.vue.d.ts +1 -1
  159. package/dist/types/components/GrList/GrListItem.vue.d.ts +2 -2
  160. package/dist/types/components/GrNavbar/GrNavbar.vue.d.ts +2 -2
  161. package/dist/types/components/GrNumberInput/GrNumberInput.vue.d.ts +3 -3
  162. package/dist/types/components/GrPagination/GrPagination.vue.d.ts +1 -1
  163. package/dist/types/components/GrPopover/GrPopover.vue.d.ts +3 -3
  164. package/dist/types/components/GrPromptDialog/GrPromptDialog.vue.d.ts +3 -3
  165. package/dist/types/components/GrRadio/GrRadio.vue.d.ts +2 -2
  166. package/dist/types/components/GrRadioGroup/GrRadioGroup.vue.d.ts +2 -2
  167. package/dist/types/components/GrRating/GrRating.vue.d.ts +2 -2
  168. package/dist/types/components/GrSegmented/GrSegmented.vue.d.ts +2 -2
  169. package/dist/types/components/GrSidebar/GrSidebarItem.vue.d.ts +1 -1
  170. package/dist/types/components/GrSkeleton/GrSkeleton.vue.d.ts +1 -1
  171. package/dist/types/components/GrSlider/GrSlider.vue.d.ts +3 -3
  172. package/dist/types/components/GrSplitter/GrSplitter.vue.d.ts +1 -1
  173. package/dist/types/components/GrStatistic/GrStatistic.vue.d.ts +2 -2
  174. package/dist/types/components/GrSwitch/GrSwitch.vue.d.ts +3 -3
  175. package/dist/types/components/GrTable/GrTable.vue.d.ts +1 -1
  176. package/dist/types/components/GrTabs/GrTabs.vue.d.ts +1 -1
  177. package/dist/types/components/GrTextarea/GrTextarea.vue.d.ts +2 -2
  178. package/dist/types/components/GrTimeline/GrTimelineItem.vue.d.ts +2 -2
  179. package/dist/types/components/GrToaster/GrToaster.vue.d.ts +1 -1
  180. package/dist/types/components/GrTooltip/GrTooltip.vue.d.ts +3 -3
  181. package/dist/types/components/GrTransfer/GrTransfer.vue.d.ts +103 -0
  182. package/dist/types/components/GrTransfer/config.d.ts +1 -0
  183. package/dist/types/components/GrTransfer/defaults.d.ts +15 -0
  184. package/dist/types/components/GrTransfer/grTransferStyles.d.ts +127 -0
  185. package/dist/types/components/GrTransfer/index.d.ts +11 -0
  186. package/dist/types/components/GrTransfer/safelist.d.ts +1 -0
  187. package/dist/types/components/GrTransfer/transferGeometry.d.ts +44 -0
  188. package/dist/types/components/GrTransfer/transferModel.d.ts +68 -0
  189. package/dist/types/components/GrTransfer/transferSelection.d.ts +36 -0
  190. package/dist/types/components/GrTransfer/useTransferDrag.d.ts +48 -0
  191. package/dist/types/granular-provider/shared.d.ts +3 -0
  192. package/dist/types/i18n/messages/en.d.ts +70 -0
  193. package/dist/types/i18n/messages/es.d.ts +70 -0
  194. package/dist/types/i18n/messages/ru.d.ts +70 -0
  195. package/dist/types/index.d.ts +3 -0
  196. package/dist/web-types.json +735 -287
  197. package/package.json +19 -3
  198. package/dist/chunks/config-DWL81-aM.js.map +0 -1
  199. package/dist/chunks/en-CuuLfNHX.js.map +0 -1
  200. package/dist/chunks/es-CSnmrcMw.js.map +0 -1
  201. package/dist/chunks/generated-B95IBXs6.js.map +0 -1
  202. package/dist/chunks/grKbdStyles-DENu8pUK.js.map +0 -1
  203. package/dist/chunks/granular-provider-BshNi2la.js.map +0 -1
  204. package/dist/chunks/ru-BKWafECI.js.map +0 -1
  205. package/dist/chunks/useDragSort-0l47h4yb.js +0 -265
  206. package/dist/chunks/useDragSort-0l47h4yb.js.map +0 -1
  207. package/dist/components/GrBreadcrumbs/chunks/GrBreadcrumbs-DOpwY2EF.js.map +0 -1
  208. package/dist/components/GrDataTable/chunks/GrDataTable-DpyipOFx.js.map +0 -1
  209. package/dist/components/GrDelta/chunks/GrDelta-BpfqebEV.js.map +0 -1
  210. package/dist/components/GrDescriptionList/chunks/GrDescriptionList-D8ANFpn_.js.map +0 -1
  211. package/dist/components/GrFilePreview/chunks/GrFilePreview-PabkLgYX.js.map +0 -1
  212. package/dist/components/GrInputTag/chunks/GrInputTag-3Au5HWZL.js.map +0 -1
  213. package/dist/components/GrJsonViewer/chunks/GrJsonViewer-CDGOX3C0.js.map +0 -1
  214. package/dist/components/GrNumberInput/chunks/GrNumberInput-BqPydXpK.js.map +0 -1
  215. package/dist/components/GrSegmented/chunks/GrSegmented-NKTi9bMG.js.map +0 -1
  216. package/dist/components/GrSortableList/chunks/GrSortableList-CQCaWivn.js.map +0 -1
  217. package/dist/components/GrSteps/chunks/GrSteps-DXj7m-WO.js.map +0 -1
  218. package/dist/components/GrTabs/chunks/GrTabs-DHfv67cp.js.map +0 -1
  219. package/dist/components/GrImageViewer/chunks/{GrImageViewer-Dd2gJ-j_.js → GrImageViewer-DK-iVHHC.js} +3 -3
  220. package/dist/components/GrSlider/chunks/{GrSlider-Db-jACXz.js → GrSlider-CO8N9SF6.js} +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grKbdStyles-ByMsX-lQ.js","names":[],"sources":["../../src/components/GrKbd/grKbdStyles.ts"],"sourcesContent":["import type { GrComponentSize } from '../shared/sizes'\n\n/**\n * Классы `GrKbd`.\n *\n * Шкала полная (`xs…lg`), а не «sm и всё остальное»: тип пропа обещает четыре\n * ступени, и `xs`/`lg` не должны молча рендериться как `md`.\n */\n\nexport const GR_KBD_VARIANTS = ['merged', 'split', 'sequence'] as const\n\n/**\n * `merged` — сочетание одной плашкой (`⌘K`), как его пишут сами системы;\n * `split` — по плашке на клавишу; `sequence` — аккорд «G затем I».\n */\nexport type GrKbdVariant = typeof GR_KBD_VARIANTS[number]\n\n/**\n * Шрифт задаётся явно, и это не косметика.\n *\n * Своей типографики у клавиши не было вовсе: `<kbd>` красит моноширинным\n * UA-стиль браузера (и ресеты вроде `tailwind-compat` поверх него), то есть вид\n * компонента решал хост. А в моноширинных символы модификаторов нарисованы\n * мелкими: замер в `JetBrains Mono` — `⌘` 73 % высоты буквы, `⇧` 76 %, `⌥` 66 %;\n * рядом с `K` это читается как значок другого кегля, и на `xs` особенно. В\n * `--gr-font-ui` те же глифы дают 103 %, 103 % и 100 % — вровень с буквой.\n */\nexport const keyBaseClass = 'inline-flex items-center justify-center rounded-[var(--gr-radius-control)] border border-[var(--gr-brd)] bg-[var(--gr-muted)] font-[var(--gr-font-ui)] font-medium leading-none text-[var(--gr-muted-fg)] shadow-[var(--gr-shadow-1)] tabular-nums'\n\n/**\n * Межстрочный здесь не парный: у клавиши он задан осознанно (`leading-none` в\n * `keyBaseClass`), и вторая декларация того же веса подралась бы с ним за\n * порядок в стилях. Правило — `docs/sizes.md`.\n */\nexport const keySizes: Record<GrComponentSize, string> = {\n xs: 'min-w-[1.25rem] h-5 px-1 text-[length:var(--gr-control-text-3xs)]',\n sm: 'min-w-[1.5rem] h-6 px-1.5 text-[length:var(--gr-control-text-xs)]',\n md: 'min-w-[1.75rem] h-7 px-2 text-[length:var(--gr-control-text-md)]',\n lg: 'min-w-[2rem] h-8 px-2.5 text-[length:var(--gr-control-text-lg)]',\n}\n\n/**\n * Клавиша внутри общей плашки: ни рамки, ни фона, ни собственной ширины —\n * иначе `⌘K` разъехалось бы зазорами внутри одного чипа.\n *\n * Семейство шрифта повторяется здесь, хотя внешняя плашка его уже задала:\n * внутренняя клавиша — тоже `<kbd>`, а ресет хоста красит их по имени тега, и\n * правило на элементе бьёт наследование от родителя. Без этой строки глифы\n * оставались бы моноширинными внутри плашки, набранной UI-шрифтом.\n */\nexport const mergedKeyClass = 'inline-flex items-center justify-center font-[var(--gr-font-ui)]'\n\n/** Обёртка `split`: сама рамки не имеет — её рисуют вложенные клавиши. */\nexport const comboBaseClass = 'inline-flex items-center align-middle'\n\nexport const comboGaps: Record<GrComponentSize, string> = {\n xs: 'gap-0.5',\n sm: 'gap-1',\n md: 'gap-1',\n lg: 'gap-1.5',\n}\n\n/** Зазор внутри общей плашки: между глифами он меньше, чем между плашками. */\nexport const mergedGaps: Record<GrComponentSize, string> = {\n xs: 'gap-0',\n sm: 'gap-0.5',\n md: 'gap-0.5',\n lg: 'gap-1',\n}\n\nexport const separatorClass = 'select-none text-[var(--gr-muted-fg)]'\n\n/** Слово-разделитель аккорда стоит между плашками и не липнет к ним. */\nexport const sequenceSeparatorClass = 'select-none px-1 text-[var(--gr-muted-fg)]'\n\nexport function grKbdKeyClass(size: GrComponentSize): string {\n return `${keyBaseClass} ${keySizes[size]}`\n}\n\nexport function grKbdComboClass(size: GrComponentSize, variant: GrKbdVariant): string {\n return variant === 'merged'\n ? `${keyBaseClass} ${keySizes[size]} ${mergedGaps[size]}`\n : `${comboBaseClass} ${comboGaps[size]}`\n}\n\n/** Класс клавиши внутри сочетания: в общей плашке она без собственной рамки. */\nexport function grKbdInnerKeyClass(size: GrComponentSize, variant: GrKbdVariant): string {\n return variant === 'merged' ? mergedKeyClass : grKbdKeyClass(size)\n}\n"],"mappings":";;;;;;;;;;;AA2BA,IAAa,eAAe;;;;;;AAO5B,IAAa,WAA4C;CACvD,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;;;;;;;;;;AAWA,IAAa,iBAAiB;;AAG9B,IAAa,iBAAiB;AAE9B,IAAa,YAA6C;CACxD,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;;AAGA,IAAa,aAA8C;CACzD,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;AACN;AAEA,IAAa,iBAAiB;;AAG9B,IAAa,yBAAyB;AAEtC,SAAgB,cAAc,MAA+B;CAC3D,OAAO,GAAG,aAAa,GAAG,SAAS;AACrC;AAEA,SAAgB,gBAAgB,MAAuB,SAA+B;CACpF,OAAO,YAAY,WACf,GAAG,aAAa,GAAG,SAAS,MAAM,GAAG,WAAW,UAChD,GAAG,eAAe,GAAG,UAAU;AACrC;;AAGA,SAAgB,mBAAmB,MAAuB,SAA+B;CACvF,OAAO,YAAY,WAAW,iBAAiB,cAAc,IAAI;AACnE"}
@@ -1,3 +1,4 @@
1
+ import { t as grAffixConfig } from "./config-Dg0bSoGw.js";
1
2
  import { t as grAlertConfig } from "./config-BNu8lFQB.js";
2
3
  import { t as grAutocompleteConfig } from "./config-BHLMTJaR.js";
3
4
  import { t as grAvatarConfig } from "./config-B3J0alyY.js";
@@ -8,6 +9,7 @@ import { t as grBreadcrumbsConfig } from "./config-C0Eu8jpG.js";
8
9
  import { t as grButtonConfig } from "./config-87fszqnD.js";
9
10
  import { t as grButtonGroupConfig } from "./config-DBmdgoVf.js";
10
11
  import { t as grCardConfig } from "./config-DUbbGcfw.js";
12
+ import { t as grCarouselConfig } from "./config-BXRmsn3t.js";
11
13
  import { t as grCheckboxConfig } from "./config-DZCUPHPU.js";
12
14
  import { t as grCheckboxGroupConfig } from "./config-BuGlNPE9.js";
13
15
  import { t as grChipConfig } from "./config-2vrOFn2f.js";
@@ -40,7 +42,7 @@ import { t as grImageViewerConfig } from "./config-DjRhIB5g.js";
40
42
  import { t as grInputConfig } from "./config-CIkdsWUk.js";
41
43
  import { t as grInputTagConfig } from "./config-BqT6PMzO.js";
42
44
  import { t as grJsonViewerConfig } from "./config-DpAYidyY.js";
43
- import { t as grKbdConfig } from "./config-BRESvs9g.js";
45
+ import { t as grKbdConfig } from "./config-Ca8qr8Q3.js";
44
46
  import { t as grLinkConfig } from "./config-CQLNjc9X.js";
45
47
  import { t as grListConfig } from "./config-D0W8mGFD.js";
46
48
  import { t as grLoadingConfig } from "./config-Bjn30smH.js";
@@ -49,7 +51,7 @@ import { t as grNavbarConfig } from "./config-2ZHRsdOc.js";
49
51
  import { t as grNumberInputConfig } from "./config-MmPym-Z7.js";
50
52
  import { t as grPaginationConfig } from "./config-CjKpUcmy.js";
51
53
  import { t as grPopoverConfig } from "./config-tNqtapcT.js";
52
- import { t as grProgressBarConfig } from "./config-DWL81-aM.js";
54
+ import { t as grProgressBarConfig } from "./config-hnoZvcIM.js";
53
55
  import { t as grProgressCircleConfig } from "./config-CJzmDHfI.js";
54
56
  import { t as grPromptDialogConfig } from "./config-C0Ea9ePP.js";
55
57
  import { t as grRadioConfig } from "./config-BUNxHnEz.js";
@@ -72,6 +74,7 @@ import { t as grTextareaConfig } from "./config-BhfNgyWL.js";
72
74
  import { t as grTimelineConfig } from "./config-Bd7QfiGj.js";
73
75
  import { t as grToasterConfig } from "./config-B5SBUa6u.js";
74
76
  import { t as grTooltipConfig } from "./config-iemgzS4x.js";
77
+ import { t as grTransferConfig } from "./config-DmED6aJV.js";
75
78
  import { t as grTreeConfig } from "./config-CDat1wXf.js";
76
79
  import { t as grTreeSelectConfig } from "./config-BGCyyXiD.js";
77
80
  import { defineGranularComponent, defineGranularProvider, resolvePackageBaseUrl } from "@feugene/unocss-preset-granular/contract";
@@ -110,6 +113,7 @@ var theme = {
110
113
  * `@feugene/granularity/components/<Name>`.
111
114
  */
112
115
  var granularityComponentConfigs = {
116
+ GrAffix: grAffixConfig,
113
117
  GrAlert: grAlertConfig,
114
118
  GrAutocomplete: grAutocompleteConfig,
115
119
  GrAvatar: grAvatarConfig,
@@ -120,6 +124,7 @@ var granularityComponentConfigs = {
120
124
  GrButton: grButtonConfig,
121
125
  GrButtonGroup: grButtonGroupConfig,
122
126
  GrCard: grCardConfig,
127
+ GrCarousel: grCarouselConfig,
123
128
  GrCheckbox: grCheckboxConfig,
124
129
  GrCheckboxGroup: grCheckboxGroupConfig,
125
130
  GrChip: grChipConfig,
@@ -184,6 +189,7 @@ var granularityComponentConfigs = {
184
189
  GrTimeline: grTimelineConfig,
185
190
  GrToaster: grToasterConfig,
186
191
  GrTooltip: grTooltipConfig,
192
+ GrTransfer: grTransferConfig,
187
193
  GrTree: grTreeConfig,
188
194
  GrTreeSelect: grTreeSelectConfig,
189
195
  GrValue: grValueConfig
@@ -0,0 +1 @@
1
+ {"version":3,"file":"granular-provider-BohXQcNt.js","names":[],"sources":["../../src/components/GrDialog/config.ts","../../src/components/GrResponseErrorBanner/config.ts","../../src/granular-provider/shared.ts","../../src/granular-provider/index.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","// `id`, `theme.*`, `packageBaseUrl` и реестр компонентов провайдера.\n//\n// Все `new URL('../styles/...', import.meta.url)` обязаны лежать именно здесь:\n// `shared.ts` в одной директории с `index.ts` / `node.ts`, поэтому\n// относительные пути совпадают. Для браузера безопасно — бандлеры\n// транслируют такие литералы в статические asset-URL.\n//\n// `apps/showcase/scripts/generate-component-api.mjs` читает список компонентов\n// из `Object.keys(granularityComponentConfigs)` через vite SSR.\nimport {\n defineGranularProvider,\n type GranularComponentDescriptor,\n type GranularProvider,\n resolvePackageBaseUrl,\n} from '@feugene/unocss-preset-granular/contract'\n// <granularity:components:imports> — блок генерируется `yarn generate:registry`\nimport { grAffixConfig } from '../components/GrAffix/config'\nimport { grAlertConfig } from '../components/GrAlert/config'\nimport { grAutocompleteConfig } from '../components/GrAutocomplete/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 { grBreadcrumbsConfig } from '../components/GrBreadcrumbs/config'\nimport { grButtonConfig } from '../components/GrButton/config'\nimport { grButtonGroupConfig } from '../components/GrButtonGroup/config'\nimport { grCardConfig } from '../components/GrCard/config'\nimport { grCarouselConfig } from '../components/GrCarousel/config'\nimport { grCheckboxConfig } from '../components/GrCheckbox/config'\nimport { grCheckboxGroupConfig } from '../components/GrCheckboxGroup/config'\nimport { grChipConfig } from '../components/GrChip/config'\nimport { grChipGroupConfig } from '../components/GrChipGroup/config'\nimport { grCollapseConfig } from '../components/GrCollapse/config'\nimport { grColorPickerConfig } from '../components/GrColorPicker/config'\nimport { grCommandPaletteConfig } from '../components/GrCommandPalette/config'\nimport { grConfigProviderConfig } from '../components/GrConfigProvider/config'\nimport { grConfirmDialogConfig } from '../components/GrConfirmDialog/config'\nimport { grContextMenuConfig } from '../components/GrContextMenu/config'\nimport { grDataTableConfig } from '../components/GrDataTable/config'\nimport { grDeltaConfig } from '../components/GrDelta/config'\nimport { grDescriptionListConfig } from '../components/GrDescriptionList/config'\nimport { grDialogConfig } from '../components/GrDialog/config'\nimport { grDialogServiceConfig } from '../components/GrDialogService/config'\nimport { grDividerConfig } from '../components/GrDivider/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 { grFilePreviewConfig } from '../components/GrFilePreview/config'\nimport { grFileUploadConfig } from '../components/GrFileUpload/config'\nimport { grFormConfig } from '../components/GrForm/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 { grJsonViewerConfig } from '../components/GrJsonViewer/config'\nimport { grKbdConfig } from '../components/GrKbd/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 { grPopoverConfig } from '../components/GrPopover/config'\nimport { grProgressBarConfig } from '../components/GrProgressBar/config'\nimport { grProgressCircleConfig } from '../components/GrProgressCircle/config'\nimport { grPromptDialogConfig } from '../components/GrPromptDialog/config'\nimport { grRadioConfig } from '../components/GrRadio/config'\nimport { grRadioGroupConfig } from '../components/GrRadioGroup/config'\nimport { grRatingConfig } from '../components/GrRating/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 { grSliderConfig } from '../components/GrSlider/config'\nimport { grSortableListConfig } from '../components/GrSortableList/config'\nimport { grSplitterConfig } from '../components/GrSplitter/config'\nimport { grStatisticConfig } from '../components/GrStatistic/config'\nimport { grStepsConfig } from '../components/GrSteps/config'\nimport { grSwitchConfig } from '../components/GrSwitch/config'\nimport { grTableConfig } from '../components/GrTable/config'\nimport { grTabPanelsConfig } from '../components/GrTabPanels/config'\nimport { grTabsConfig } from '../components/GrTabs/config'\nimport { grTextareaConfig } from '../components/GrTextarea/config'\nimport { grTimelineConfig } from '../components/GrTimeline/config'\nimport { grToasterConfig } from '../components/GrToaster/config'\nimport { grTooltipConfig } from '../components/GrTooltip/config'\nimport { grTransferConfig } from '../components/GrTransfer/config'\nimport { grTreeConfig } from '../components/GrTree/config'\nimport { grTreeSelectConfig } from '../components/GrTreeSelect/config'\nimport { grValueConfig } from '../components/GrValue/config'\n// </granularity:components:imports>\n\n/** Идентификатор провайдера — совпадает с именем пакета. */\nexport const GRANULARITY_PROVIDER_ID = '@feugene/granularity'\n\n// Не заменять на `new URL('..', import.meta.url)`: Vite и rolldown распознают\n// этот литерал и подставляют `data:`-URL, после чего scan-директории пустеют.\nconst packageBaseUrl = resolvePackageBaseUrl(import.meta.url)\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 * Реестр публичных компонентов. Ключи совпадают с subpath-экспортом\n * `@feugene/granularity/components/<Name>`.\n */\nexport const granularityComponentConfigs = {\n // <granularity:components:registry> — блок генерируется `yarn generate:registry`\n GrAffix: grAffixConfig,\n GrAlert: grAlertConfig,\n GrAutocomplete: grAutocompleteConfig,\n GrAvatar: grAvatarConfig,\n GrBadge: grBadgeConfig,\n GrBadgeWrap: grBadgeWrapConfig,\n GrBottomNav: grBottomNavConfig,\n GrBreadcrumbs: grBreadcrumbsConfig,\n GrButton: grButtonConfig,\n GrButtonGroup: grButtonGroupConfig,\n GrCard: grCardConfig,\n GrCarousel: grCarouselConfig,\n GrCheckbox: grCheckboxConfig,\n GrCheckboxGroup: grCheckboxGroupConfig,\n GrChip: grChipConfig,\n GrChipGroup: grChipGroupConfig,\n GrCollapse: grCollapseConfig,\n GrColorPicker: grColorPickerConfig,\n GrCommandPalette: grCommandPaletteConfig,\n GrConfigProvider: grConfigProviderConfig,\n GrConfirmDialog: grConfirmDialogConfig,\n GrContextMenu: grContextMenuConfig,\n GrDataTable: grDataTableConfig,\n GrDelta: grDeltaConfig,\n GrDescriptionList: grDescriptionListConfig,\n GrDialog: grDialogConfig,\n GrDialogService: grDialogServiceConfig,\n GrDivider: grDividerConfig,\n GrDrawer: grDrawerConfig,\n GrDropdown: grDropdownConfig,\n GrDropdownMenu: grDropdownMenuConfig,\n GrEmptyState: grEmptyStateConfig,\n GrFilePreview: grFilePreviewConfig,\n GrFileUpload: grFileUploadConfig,\n GrForm: grFormConfig,\n GrFormField: grFormFieldConfig,\n GrFormFile: grFormFileConfig,\n GrFormSection: grFormSectionConfig,\n GrIcon: grIconConfig,\n GrImageViewer: grImageViewerConfig,\n GrInput: grInputConfig,\n GrInputTag: grInputTagConfig,\n GrJsonViewer: grJsonViewerConfig,\n GrKbd: grKbdConfig,\n GrLink: grLinkConfig,\n GrList: grListConfig,\n GrLoading: grLoadingConfig,\n GrModal: grModalConfig,\n GrNavbar: grNavbarConfig,\n GrNumberInput: grNumberInputConfig,\n GrPagination: grPaginationConfig,\n GrPopover: grPopoverConfig,\n GrProgressBar: grProgressBarConfig,\n GrProgressCircle: grProgressCircleConfig,\n GrPromptDialog: grPromptDialogConfig,\n GrRadio: grRadioConfig,\n GrRadioGroup: grRadioGroupConfig,\n GrRating: grRatingConfig,\n GrResponseErrorBanner: grResponseErrorBannerConfig,\n GrSegmented: grSegmentedConfig,\n GrSelect: grSelectConfig,\n GrSidebar: grSidebarConfig,\n GrSkeleton: grSkeletonConfig,\n GrSlider: grSliderConfig,\n GrSortableList: grSortableListConfig,\n GrSplitter: grSplitterConfig,\n GrStatistic: grStatisticConfig,\n GrSteps: grStepsConfig,\n GrSwitch: grSwitchConfig,\n GrTable: grTableConfig,\n GrTabPanels: grTabPanelsConfig,\n GrTabs: grTabsConfig,\n GrTextarea: grTextareaConfig,\n GrTimeline: grTimelineConfig,\n GrToaster: grToasterConfig,\n GrTooltip: grTooltipConfig,\n GrTransfer: grTransferConfig,\n GrTree: grTreeConfig,\n GrTreeSelect: grTreeSelectConfig,\n GrValue: grValueConfig,\n // </granularity:components:registry>\n}\n\nexport type GranularityComponentName = keyof typeof granularityComponentConfigs\n\n/** Базовый набор компонентов в порядке реестра. */\nconst baseComponents: readonly GranularComponentDescriptor[] = Object.values(\n granularityComponentConfigs,\n)\n\n/**\n * Собирает granular-provider пакета.\n *\n * `overrides` — точка расширения для потребителя: дескриптор с именем из\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","import { createGranularityProvider } from './shared'\n\nexport * from './shared'\n\nexport const granularityProvider = createGranularityProvider()\n\nexport default granularityProvider\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIA,IAAa,iBAAiB,wBAAwB,YAAY,KAAK;CACrE,MAAM;CACN,cAAc,CAAC,YAAY,SAAS;CACpC,UAAU;AACZ,CAAC;;;ACND,IAAa,8BAA8B,wBAAwB,YAAY,KAAK;CAClF,MAAM;CACN,cAAc,CAAC,WAAW,UAAU;AACtC,CAAC;;;;AC8FD,IAAa,0BAA0B;AAIvC,IAAM,iBAAiB,sBAAsB,YAAY,GAAG;;AAG5D,IAAa,wBAAwB,CAAC,SAAS,MAAM;;AAIrD,IAAa,2BAA4D,CAAC,OAAO;AAEjF,IAAM,QAAQ;CACZ,YAAY,IAAA,IAAA,q5KAAA,KAAA,YAAA,GAAA,CAA8C,CAAC;CAC3D,cAAc,IAAA,IAAA,65YAAA,KAAA,YAAA,GAAA,CAAgD,CAAC;CAC/D,QAAQ;EACN,OAAO,IAAA,IAAA,iyYAAA,KAAA,YAAA,GAAA,CAAsD,CAAC;EAC9D,MAAM,IAAA,IAAA,y/SAAA,KAAA,YAAA,GAAA,CAAqD,CAAC;CAC9D;CACA,eAAe;AACjB;;;;;AAMA,IAAa,8BAA8B;CAEzC,SAAS;CACT,SAAS;CACT,gBAAgB;CAChB,UAAU;CACV,SAAS;CACT,aAAa;CACb,aAAa;CACb,eAAe;CACf,UAAU;CACV,eAAe;CACf,QAAQ;CACR,YAAY;CACZ,YAAY;CACZ,iBAAiB;CACjB,QAAQ;CACR,aAAa;CACb,YAAY;CACZ,eAAe;CACf,kBAAkB;CAClB,kBAAkB;CAClB,iBAAiB;CACjB,eAAe;CACf,aAAa;CACb,SAAS;CACT,mBAAmB;CACnB,UAAU;CACV,iBAAiB;CACjB,WAAW;CACX,UAAU;CACV,YAAY;CACZ,gBAAgB;CAChB,cAAc;CACd,eAAe;CACf,cAAc;CACd,QAAQ;CACR,aAAa;CACb,YAAY;CACZ,eAAe;CACf,QAAQ;CACR,eAAe;CACf,SAAS;CACT,YAAY;CACZ,cAAc;CACd,OAAO;CACP,QAAQ;CACR,QAAQ;CACR,WAAW;CACX,SAAS;CACT,UAAU;CACV,eAAe;CACf,cAAc;CACd,WAAW;CACX,eAAe;CACf,kBAAkB;CAClB,gBAAgB;CAChB,SAAS;CACT,cAAc;CACd,UAAU;CACV,uBAAuB;CACvB,aAAa;CACb,UAAU;CACV,WAAW;CACX,YAAY;CACZ,UAAU;CACV,gBAAgB;CAChB,YAAY;CACZ,aAAa;CACb,SAAS;CACT,UAAU;CACV,SAAS;CACT,aAAa;CACb,QAAQ;CACR,YAAY;CACZ,YAAY;CACZ,WAAW;CACX,WAAW;CACX,YAAY;CACZ,QAAQ;CACR,cAAc;CACd,SAAS;AAEX;;AAKA,IAAM,iBAAyD,OAAO,OACpE,2BACF;;;;;;;AAQA,SAAgB,0BACd,YAAoD,CAAC,GACnC;CAClB,MAAM,iBAAiB,IAAI,IACzB,UAAU,KAAI,cAAa,CAAC,UAAU,MAAM,SAAS,CAAC,CACxD;CACA,MAAM,aAA4C,CAChD,GAAG,eAAe,KAAI,cAAa,eAAe,IAAI,UAAU,IAAI,KAAK,SAAS,GAClF,GAAG,UAAU,QAAO,cAAa,CAAC,eAAe,MAAK,SAAQ,KAAK,SAAS,UAAU,IAAI,CAAC,CAC7F;CAEA,OAAO,uBAAuB;EAC5B,IAAI;EACJ,iBAAiB;EACjB;EACA;EACA;CACF,CAAC;AACH;;;AC9OA,IAAa,sBAAsB,0BAA0B"}
@@ -1,4 +1,33 @@
1
1
  //#region src/i18n/locales/ru.json
2
+ var transfer = {
3
+ "sourceTitle": "Доступны",
4
+ "targetTitle": "Выбраны",
5
+ "search": "Поиск",
6
+ "toTarget": "Перенести к выбранным",
7
+ "toSource": "Вернуть к доступным",
8
+ "selectAll": "Выбрать всё показанное",
9
+ "moveUp": "Раньше",
10
+ "moveDown": "Позже",
11
+ "selected": "{count} из {total}",
12
+ "shown": "Показано {shown} из {total}",
13
+ "empty": "Здесь пока пусто",
14
+ "emptyFiltered": "Ничего не найдено",
15
+ "moved": "{count} перенесено в «{list}»",
16
+ "reordered": "Позиция {position} из {count}",
17
+ "reorderFiltered": "Пока включён поиск, порядок не меняется",
18
+ "cancelled": "Перенос отменён"
19
+ };
20
+ var carousel = {
21
+ "roledescription": "карусель",
22
+ "slideRoledescription": "слайд",
23
+ "slidePosition": "{index} из {total}",
24
+ "previous": "Предыдущий слайд",
25
+ "next": "Следующий слайд",
26
+ "play": "Запустить автопоказ",
27
+ "pause": "Остановить автопоказ",
28
+ "indicators": "Слайды",
29
+ "autoplayStopped": "Автопоказ остановлен"
30
+ };
2
31
  var chip = {
3
32
  "remove": "Убрать",
4
33
  "removeNamed": "Убрать {label}"
@@ -251,6 +280,8 @@ var commandPalette = {
251
280
  "recent": "Недавние",
252
281
  "loading": "Загрузка…"
253
282
  };
283
+ var delta = { "increase": "рост" };
284
+ var filePreview = { "label": "Файл" };
254
285
  var fileValidation = {
255
286
  "accept": "Файл «{fileName}» не подходит под accept=\"{accept}\"",
256
287
  "extension": "У файла «{fileName}» недопустимое расширение «.{extension}»",
@@ -323,6 +354,8 @@ var jsonViewer = {
323
354
  };
324
355
  var contextMenu = { "label": "Контекстное меню" };
325
356
  var ru_default = {
357
+ transfer,
358
+ carousel,
326
359
  chip,
327
360
  common,
328
361
  loading,
@@ -360,6 +393,8 @@ var ru_default = {
360
393
  textarea,
361
394
  rating,
362
395
  commandPalette,
396
+ delta,
397
+ filePreview,
363
398
  fileValidation,
364
399
  kbd,
365
400
  link,
@@ -377,4 +412,4 @@ var ru_default = {
377
412
  contextMenu
378
413
  };
379
414
  //#endregion
380
- export { autocomplete, avatar, badgeWrap, bottomNav, breadcrumbs, button, chip, collapse, colorPicker, colors, commandPalette, common, contextMenu, dataTable, ru_default as default, dialog, drawer, emptyState, fileUpload, fileValidation, form, formErrorBanner, formFile, imageViewer, input, inputTag, jsonViewer, kbd, link, list, loading, modal, navbar, numberInput, pagination, rating, responseError, select, sidebar, slider, sortable, splitter, statistic, steps, table, tabs, textarea, timeline, toaster, tree, treeSelect, uploadErrorBanner };
415
+ export { autocomplete, avatar, badgeWrap, bottomNav, breadcrumbs, button, carousel, chip, collapse, colorPicker, colors, commandPalette, common, contextMenu, dataTable, ru_default as default, delta, dialog, drawer, emptyState, filePreview, fileUpload, fileValidation, form, formErrorBanner, formFile, imageViewer, input, inputTag, jsonViewer, kbd, link, list, loading, modal, navbar, numberInput, pagination, rating, responseError, select, sidebar, slider, sortable, splitter, statistic, steps, table, tabs, textarea, timeline, toaster, transfer, tree, treeSelect, uploadErrorBanner };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ru-CLUErjhY.js","names":[],"sources":["../../src/i18n/locales/ru.json"],"sourcesContent":["{\n \"transfer\": {\n \"sourceTitle\": \"Доступны\",\n \"targetTitle\": \"Выбраны\",\n \"search\": \"Поиск\",\n \"toTarget\": \"Перенести к выбранным\",\n \"toSource\": \"Вернуть к доступным\",\n \"selectAll\": \"Выбрать всё показанное\",\n \"moveUp\": \"Раньше\",\n \"moveDown\": \"Позже\",\n \"selected\": \"{count} из {total}\",\n \"shown\": \"Показано {shown} из {total}\",\n \"empty\": \"Здесь пока пусто\",\n \"emptyFiltered\": \"Ничего не найдено\",\n \"moved\": \"{count} перенесено в «{list}»\",\n \"reordered\": \"Позиция {position} из {count}\",\n \"reorderFiltered\": \"Пока включён поиск, порядок не меняется\",\n \"cancelled\": \"Перенос отменён\"\n },\n \"carousel\": {\n \"roledescription\": \"карусель\",\n \"slideRoledescription\": \"слайд\",\n \"slidePosition\": \"{index} из {total}\",\n \"previous\": \"Предыдущий слайд\",\n \"next\": \"Следующий слайд\",\n \"play\": \"Запустить автопоказ\",\n \"pause\": \"Остановить автопоказ\",\n \"indicators\": \"Слайды\",\n \"autoplayStopped\": \"Автопоказ остановлен\"\n },\n \"chip\": {\n \"remove\": \"Убрать\",\n \"removeNamed\": \"Убрать {label}\"\n },\n \"common\": {\n \"confirm\": \"Подтвердить\",\n \"cancel\": \"Отмена\",\n \"add\": \"Добавить\",\n \"clear\": \"Очистить\",\n \"close\": \"Закрыть\"\n },\n \"loading\": {\n \"defaultText\": \"Загрузка...\"\n },\n \"steps\": {\n \"label\": \"Ход выполнения\",\n \"status\": \"Шаг {step} из {count}\",\n \"completed\": \"выполнен\",\n \"error\": \"есть ошибки\"\n },\n \"treeSelect\": {\n \"filterPlaceholder\": \"Поиск…\",\n \"empty\": \"Нет данных\",\n \"loading\": \"Загрузка…\"\n },\n \"badgeWrap\": {\n \"count\": \"{count} новых\"\n },\n \"avatar\": {\n \"group\": \"Участники\",\n \"groupOverflow\": \"и ещё {count}\",\n \"status\": {\n \"online\": \"в сети\",\n \"offline\": \"не в сети\",\n \"busy\": \"занят\",\n \"away\": \"отошёл\"\n }\n },\n \"tree\": {\n \"drag\": \"Перетащить\",\n \"expand\": \"Развернуть\",\n \"collapse\": \"Свернуть\",\n \"moved\": \"{label} перемещён\"\n },\n \"select\": {\n \"customValuePlaceholder\": \"Добавить значение…\",\n \"addOption\": \"Добавить «{value}»\",\n \"clearOption\": \"Не выбрано\",\n \"searchPlaceholder\": \"Поиск…\",\n \"loading\": \"Загрузка…\",\n \"noResults\": \"Ничего не найдено\",\n \"removeTag\": \"Удалить {label}\"\n },\n \"dataTable\": {\n \"loading\": \"Загрузка…\",\n \"empty\": \"Нет данных\",\n \"selectAll\": \"Выбрать все строки\",\n \"selectRow\": \"Выбрать строку\",\n \"sortAsc\": \"Нажмите для сортировки по возрастанию\",\n \"sortDesc\": \"Нажмите для сортировки по убыванию\",\n \"sortNone\": \"Нажмите, чтобы снять сортировку\",\n \"moveColumn\": \"Переставить колонку {label}\",\n \"columnMoved\": \"Колонка {label} перемещена на позицию {position} из {count}\",\n \"resizeColumn\": \"Ширина колонки {label}\",\n \"columnResized\": \"Ширина колонки {label} — {width} пикселей\"\n },\n \"breadcrumbs\": {\n \"label\": \"Навигационная цепочка\",\n \"expand\": \"Показать скрытые уровни\"\n },\n \"autocomplete\": {\n \"loading\": \"Загрузка…\",\n \"noResults\": \"Ничего не найдено\",\n \"addOption\": \"Добавить «{value}»\",\n \"removeValue\": \"Убрать {label}\",\n \"typeMore\": {\n \"one\": \"Введите минимум {n} символ\",\n \"few\": \"Введите минимум {n} символа\",\n \"many\": \"Введите минимум {n} символов\",\n \"other\": \"Введите минимум {n} символа\"\n }\n },\n \"form\": {\n \"required\": \"Обязательное поле\",\n \"min\": \"Минимум {min}\",\n \"max\": \"Максимум {max}\",\n \"len\": \"Длина должна быть {len}\",\n \"pattern\": \"Неверный формат\",\n \"email\": \"Введите корректный e-mail\",\n \"url\": \"Введите корректный URL\",\n \"file\": \"Некорректный файл\",\n \"invalid\": \"Некорректное значение\",\n \"readonly\": \"Только для чтения\",\n \"validating\": \"Проверяем…\"\n },\n \"dialog\": {\n \"confirm\": {\n \"title\": \"Подтверждение\"\n },\n \"prompt\": {\n \"title\": \"Введите значение\",\n \"label\": \"Значение\",\n \"required\": \"Введите значение.\"\n },\n \"ok\": \"ОК\"\n },\n \"switch\": {\n \"loading\": \"Сохраняем…\"\n },\n \"slider\": {\n \"min\": \"минимум\",\n \"max\": \"максимум\"\n },\n \"sidebar\": {\n \"expand\": \"Развернуть панель\",\n \"collapse\": \"Свернуть панель\"\n },\n \"splitter\": {\n \"label\": \"Изменить размер панелей\"\n },\n \"statistic\": {\n \"trendUp\": \"Рост\",\n \"trendDown\": \"Падение\",\n \"trendFlat\": \"Без изменений\"\n },\n \"pagination\": {\n \"label\": \"Пагинация\",\n \"pageSize\": \"Размер страницы\",\n \"prev\": \"Назад\",\n \"next\": \"Вперёд\",\n \"page\": \"Страница {n}\",\n \"first\": \"Первая страница\",\n \"last\": \"Последняя страница\",\n \"jumpTo\": \"Перейти к\",\n \"total\": \"{from}–{to} из {total}\",\n \"status\": \"Страница {page} из {count}\"\n },\n \"navbar\": {\n \"openMenu\": \"Открыть меню\"\n },\n \"responseError\": {\n \"networkTitle\": \"Нет связи с сервером\",\n \"networkMessage\": \"Проверьте подключение к интернету и попробуйте ещё раз.\",\n \"abortedTitle\": \"Запрос отменён\",\n \"abortedMessage\": \"Запрос был отменён.\",\n \"validationTitle\": \"Проверьте данные\",\n \"validationMessage\": \"Сервер вернул ошибку валидации. Исправьте поля и попробуйте снова.\",\n \"clientTitle\": \"Ошибка запроса\",\n \"clientMessage\": \"Сервер отклонил запрос.\",\n \"serverTitle\": \"Ошибка сервера\",\n \"serverMessage\": \"Произошла ошибка на сервере. Попробуйте ещё раз.\",\n \"unknownTitle\": \"Что-то пошло не так\",\n \"unknownMessage\": \"Не удалось выполнить операцию. Попробуйте ещё раз.\",\n \"statusLabel\": \"HTTP {status}\",\n \"retryLabel\": \"Повторить\",\n \"dismissLabel\": \"Скрыть\"\n },\n \"colors\": {\n \"neutral\": \"Нейтральный\",\n \"success\": \"Успех\",\n \"warning\": \"Предупреждение\",\n \"danger\": \"Опасность\",\n \"info\": \"Инфо\",\n \"primary\": \"Primary\",\n \"slate\": \"Сланцевый\",\n \"azure\": \"Лазурный\"\n },\n \"drawer\": {\n \"title\": \"Панель\"\n },\n \"modal\": {\n \"title\": \"Диалог\"\n },\n \"numberInput\": {\n \"increase\": \"Увеличить\",\n \"decrease\": \"Уменьшить\"\n },\n \"toaster\": {\n \"dismiss\": \"Закрыть\",\n \"region\": \"Уведомления\"\n },\n \"inputTag\": {\n \"removeTag\": \"Удалить тег\",\n \"removeTagNamed\": \"Удалить тег {tag}\",\n \"clearAll\": \"Удалить все теги\",\n \"added\": \"Добавлен тег: {tag}\",\n \"addedMany\": \"Добавлено тегов: {count}\",\n \"removed\": \"Удалён тег: {tag}\",\n \"cleared\": \"Все теги удалены\",\n \"limitReached\": \"Достигнут предел тегов\"\n },\n \"fileUpload\": {\n \"placeholder\": \"Перетащите файлы сюда или нажмите для выбора\",\n \"progress\": \"Прогресс загрузки\",\n \"uploading\": \"Загрузка…\",\n \"success\": \"Загрузка завершена\",\n \"error\": \"Не удалось загрузить\",\n \"remove\": \"Убрать {fileName}\",\n \"retry\": \"Повторить загрузку\",\n \"retryFile\": \"Повторить {fileName}\",\n \"abortFile\": \"Отменить загрузку {fileName}\",\n \"statusPending\": \"В очереди\",\n \"statusUploading\": \"Загружается\",\n \"statusSuccess\": \"Загружен\",\n \"statusError\": \"Ошибка\"\n },\n \"formFile\": {\n \"upload\": \"Загрузить файл\",\n \"change\": \"Заменить файл\",\n \"remove\": \"Удалить\",\n \"clearAll\": \"Очистить всё\",\n \"placeholder\": \"Файлы не выбраны\",\n \"validateError\": \"Не удалось проверить перетащенные файлы\",\n \"removeFile\": \"Убрать {fileName}\"\n },\n \"imageViewer\": {\n \"close\": \"Закрыть просмотрщик\",\n \"prev\": \"Предыдущее изображение\",\n \"next\": \"Следующее изображение\",\n \"zoomIn\": \"Увеличить\",\n \"zoomOut\": \"Уменьшить\",\n \"resetZoom\": \"Сбросить масштаб\",\n \"zoomToNatural\": \"Натуральный размер (1:1)\",\n \"rotateLeft\": \"Повернуть влево\",\n \"rotateRight\": \"Повернуть вправо\",\n \"download\": \"Скачать изображение\",\n \"empty\": \"Нет изображения\",\n \"label\": \"Просмотр изображений\",\n \"position\": \"Изображение {index} из {total}\"\n },\n \"formErrorBanner\": {\n \"validationTitle\": \"Проверьте поля формы\",\n \"validationMessage\": \"Сервер отклонил данные. Исправьте выделенные поля и попробуйте снова.\",\n \"clientTitle\": \"Не удалось сохранить\",\n \"serverTitle\": \"Ошибка сохранения\",\n \"serverMessage\": \"Не удалось сохранить данные. Попробуйте позже.\"\n },\n \"uploadErrorBanner\": {\n \"networkTitle\": \"Не удалось загрузить файлы\",\n \"networkMessage\": \"Проверьте подключение и попробуйте снова.\",\n \"validationTitle\": \"Файлы не прошли проверку\",\n \"validationMessage\": \"Некоторые файлы не соответствуют требованиям.\",\n \"serverTitle\": \"Ошибка загрузки на сервере\",\n \"serverMessage\": \"Сервер не смог обработать загрузку. Попробуйте снова.\"\n },\n \"input\": {\n \"clear\": \"Очистить\",\n \"showPassword\": \"Показать пароль\",\n \"hidePassword\": \"Скрыть пароль\",\n \"limitReached\": \"Достигнут предел символов\"\n },\n \"textarea\": {\n \"lines\": {\n \"one\": \"{n} строка\",\n \"few\": \"{n} строки\",\n \"many\": \"{n} строк\",\n \"other\": \"{n} строки\"\n }\n },\n \"rating\": {\n \"label\": \"Оценка\",\n \"valueText\": \"{value} из {max}\",\n \"valueTextWithLabel\": \"{value} из {max}, {label}\"\n },\n \"commandPalette\": {\n \"label\": \"Палитра команд\",\n \"placeholder\": \"Введите команду или запрос…\",\n \"empty\": \"Ничего не найдено\",\n \"recent\": \"Недавние\",\n \"loading\": \"Загрузка…\"\n },\n \"delta\": {\n \"increase\": \"рост\"\n },\n \"filePreview\": {\n \"label\": \"Файл\"\n },\n \"fileValidation\": {\n \"accept\": \"Файл «{fileName}» не подходит под accept=\\\"{accept}\\\"\",\n \"extension\": \"У файла «{fileName}» недопустимое расширение «.{extension}»\",\n \"mimeType\": \"У файла «{fileName}» недопустимый тип «{mimeType}»\",\n \"mimeTypeFallback\": \"У файла «{fileName}» неопределённый тип «{mimeType}»\",\n \"maxFileSize\": \"Файл «{fileName}» слишком большой ({size} байт), максимум {maxBytes}\",\n \"maxCount\": \"Выбрано слишком много файлов ({count}), максимум — {maxCount}\",\n \"maxTotalSize\": \"Суммарный размер файлов слишком большой ({total} байт), максимум {maxBytes}\"\n },\n \"kbd\": {\n \"command\": \"Command\",\n \"option\": \"Option\",\n \"shift\": \"Shift\",\n \"control\": \"Control\",\n \"enter\": \"Enter\",\n \"escape\": \"Escape\",\n \"tab\": \"Tab\",\n \"backspace\": \"Backspace\",\n \"delete\": \"Delete\",\n \"pageUp\": \"Page Up\",\n \"pageDown\": \"Page Down\",\n \"arrowUp\": \"стрелка вверх\",\n \"arrowDown\": \"стрелка вниз\",\n \"arrowLeft\": \"стрелка влево\",\n \"arrowRight\": \"стрелка вправо\",\n \"then\": \"затем\"\n },\n \"link\": {\n \"opensInNewTab\": \"откроется в новой вкладке\"\n },\n \"colorPicker\": {\n \"panelLabel\": \"Выбор цвета\",\n \"hue\": \"Оттенок\",\n \"saturation\": \"Насыщенность\",\n \"lightness\": \"Светлота\",\n \"opacity\": \"Непрозрачность\",\n \"hexLabel\": \"Значение hex\",\n \"presetsLabel\": \"Палитра\",\n \"swatchLabel\": \"Цвет {color}\"\n },\n \"collapse\": {\n \"empty\": \"Пока пусто\"\n },\n \"list\": {\n \"empty\": \"Пока пусто\"\n },\n \"button\": {\n \"loading\": \"Загрузка…\"\n },\n \"table\": {\n \"empty\": \"Пока пусто\"\n },\n \"timeline\": {\n \"empty\": \"Пока пусто\"\n },\n \"tabs\": {\n \"empty\": \"Пока пусто\",\n \"close\": \"Закрыть вкладку\"\n },\n \"bottomNav\": {\n \"label\": \"Нижняя навигация\",\n \"badge\": \"{count} новых\"\n },\n \"emptyState\": {\n \"title\": \"Пока пусто\"\n },\n \"sortable\": {\n \"label\": \"Сортируемый список\",\n \"handle\": \"Переставить\",\n \"empty\": \"Пока нечего сортировать\",\n \"grabbed\": \"Взято. Позиция {position} из {count}\",\n \"moved\": \"Позиция {position} из {count}\",\n \"dropped\": \"Отпущено на позиции {position} из {count}\",\n \"cancelled\": \"Перенос отменён\"\n },\n \"jsonViewer\": {\n \"search\": \"Поиск по ключу или значению\",\n \"expandAll\": \"Раскрыть всё\",\n \"collapseAll\": \"Свернуть всё\",\n \"copy\": \"Скопировать значение\",\n \"copied\": \"Значение скопировано\",\n \"copyFailed\": \"Не удалось скопировать значение\",\n \"moreItems\": \"ещё\"\n },\n \"contextMenu\": {\n \"label\": \"Контекстное меню\"\n }\n}\n"],"mappings":""}
@@ -0,0 +1,31 @@
1
+ //#region src/components/shared/scrollOverflow.ts
2
+ /**
3
+ * Состояние переполнения скроллера — по трём числам, без DOM.
4
+ *
5
+ * Отдельным модулем, потому что в jsdom раскладки нет: `scrollWidth` и
6
+ * `clientWidth` там нули, и через смонтированный компонент ни одна ветка не
7
+ * проверяется. Здесь она проверяется вся.
8
+ *
9
+ * `scrollStart` — расстояние от начала ряда, а не `scrollLeft`. Это не
10
+ * педантизм: в RTL современные браузеры отсчитывают `scrollLeft` от правого
11
+ * края и уводят его в минус, поэтому физическое «слева» и логическое «в начале»
12
+ * там не совпадают. Модуль знает только про начало и конец, а какой это край
13
+ * экрана — дело CSS.
14
+ *
15
+ * Запас в пиксель — как в {@link titleWhenTruncated}: браузеры округляют
16
+ * размеры вверх, и у ряда, влезающего целиком, разница бывает единичной.
17
+ * Без запаса затухание висело бы на ровном месте.
18
+ */
19
+ function resolveScrollOverflow(scrollStart, scrollSize, clientSize) {
20
+ const hidden = scrollSize - clientSize;
21
+ if (hidden <= 1) return "none";
22
+ const start = Math.abs(scrollStart);
23
+ const atStart = start <= 1;
24
+ const atEnd = hidden - start <= 1;
25
+ if (atStart && atEnd) return "none";
26
+ if (atStart) return "end";
27
+ if (atEnd) return "start";
28
+ return "both";
29
+ }
30
+ //#endregion
31
+ export { resolveScrollOverflow as t };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scrollOverflow-B_kEdcol.js","names":[],"sources":["../../src/components/shared/scrollOverflow.ts"],"sourcesContent":["/** С какой стороны у скроллера осталось невидимое содержимое. */\nexport type GrScrollOverflow = 'none' | 'start' | 'end' | 'both'\n\n/**\n * Состояние переполнения скроллера — по трём числам, без DOM.\n *\n * Отдельным модулем, потому что в jsdom раскладки нет: `scrollWidth` и\n * `clientWidth` там нули, и через смонтированный компонент ни одна ветка не\n * проверяется. Здесь она проверяется вся.\n *\n * `scrollStart` — расстояние от начала ряда, а не `scrollLeft`. Это не\n * педантизм: в RTL современные браузеры отсчитывают `scrollLeft` от правого\n * края и уводят его в минус, поэтому физическое «слева» и логическое «в начале»\n * там не совпадают. Модуль знает только про начало и конец, а какой это край\n * экрана — дело CSS.\n *\n * Запас в пиксель — как в {@link titleWhenTruncated}: браузеры округляют\n * размеры вверх, и у ряда, влезающего целиком, разница бывает единичной.\n * Без запаса затухание висело бы на ровном месте.\n */\nexport function resolveScrollOverflow(\n scrollStart: number,\n scrollSize: number,\n clientSize: number,\n): GrScrollOverflow {\n const hidden = scrollSize - clientSize\n\n if (hidden <= 1)\n return 'none'\n\n const start = Math.abs(scrollStart)\n const atStart = start <= 1\n const atEnd = hidden - start <= 1\n\n if (atStart && atEnd)\n return 'none'\n\n if (atStart)\n return 'end'\n\n if (atEnd)\n return 'start'\n\n return 'both'\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAoBA,SAAgB,sBACd,aACA,YACA,YACkB;CAClB,MAAM,SAAS,aAAa;CAE5B,IAAI,UAAU,GACZ,OAAO;CAET,MAAM,QAAQ,KAAK,IAAI,WAAW;CAClC,MAAM,UAAU,SAAS;CACzB,MAAM,QAAQ,SAAS,SAAS;CAEhC,IAAI,WAAW,OACb,OAAO;CAET,IAAI,SACF,OAAO;CAET,IAAI,OACF,OAAO;CAET,OAAO;AACT"}
@@ -0,0 +1,21 @@
1
+ //#region src/components/shared/tones.ts
2
+ /**
3
+ * Единый перечень дизайн-тонов для всех компонентов библиотеки.
4
+ *
5
+ * Источник истины: список объявлен как `as const`-кортеж, из которого
6
+ * автоматически выводится тип `GrTone`. Это позволяет использовать
7
+ * `GR_TONES` в рантайме (валидация, итерация, safelist) и `GrTone`
8
+ * в типах одновременно, без расхождений.
9
+ */
10
+ var GR_TONES = [
11
+ "primary",
12
+ "neutral",
13
+ "success",
14
+ "warning",
15
+ "danger",
16
+ "info",
17
+ "slate",
18
+ "azure"
19
+ ];
20
+ //#endregion
21
+ export { GR_TONES as t };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tones-CRJAaYyg.js","names":[],"sources":["../../src/components/shared/tones.ts"],"sourcesContent":["/**\n * Единый перечень дизайн-тонов для всех компонентов библиотеки.\n *\n * Источник истины: список объявлен как `as const`-кортеж, из которого\n * автоматически выводится тип `GrTone`. Это позволяет использовать\n * `GR_TONES` в рантайме (валидация, итерация, safelist) и `GrTone`\n * в типах одновременно, без расхождений.\n */\nexport const GR_TONES = [\n 'primary',\n 'neutral',\n 'success',\n 'warning',\n 'danger',\n 'info',\n 'slate',\n 'azure',\n] as const\n\nexport type GrTone = typeof GR_TONES[number]\n"],"mappings":";;;;;;;;;AAQA,IAAa,WAAW;CACtB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF"}
@@ -0,0 +1,272 @@
1
+ import { i as grAffixRootClass, r as affixSentinelClass } from "../../../chunks/config-Dg0bSoGw.js";
2
+ import { Fragment, computed, createCommentVNode, createElementBlock, createElementVNode, defineComponent, mergeProps, normalizeClass, onBeforeUnmount, onMounted, openBlock, ref, renderSlot, unref, watch } from "vue";
3
+ //#region src/components/GrAffix/affixState.ts
4
+ /** Предок делает из себя скроллпорт и прокручивается: `sticky` внутри работает. */
5
+ var SCROLLABLE = /* @__PURE__ */ new Set([
6
+ "auto",
7
+ "scroll",
8
+ "overlay"
9
+ ]);
10
+ /** Предок делает из себя скроллпорт, но прокручивать его нечем: `sticky` внутри мёртв. */
11
+ var CLIPPING = /* @__PURE__ */ new Set(["hidden", "clip"]);
12
+ /**
13
+ * Значение пропа `offset` в CSS-длину для инлайновой переменной.
14
+ *
15
+ * Строка уходит как есть и намеренно не валидируется: `4rem`,
16
+ * `var(--gr-navbar-height)`, `calc(var(--gr-navbar-height) + 8px)` обязаны работать — иначе проп
17
+ * проигрывает голому `style`. Отрицательное число зажимается в ноль: отрицательный
18
+ * порог у `sticky` прячет панель за край, и это всегда ошибка, а не приём.
19
+ *
20
+ * `undefined` означает «не писать переменную вовсе» — тогда класс падает на
21
+ * `var(--gr-affix-offset, 0px)`, то есть на каскад.
22
+ */
23
+ function affixOffsetLength(value) {
24
+ if (value == null) return void 0;
25
+ if (typeof value === "number") {
26
+ if (!Number.isFinite(value)) return void 0;
27
+ return `${Math.max(0, value)}px`;
28
+ }
29
+ const trimmed = value.trim();
30
+ return trimmed === "" ? void 0 : trimmed;
31
+ }
32
+ /**
33
+ * `rootMargin` наблюдателя: поджимает ровно тот край, к которому прилипаем, ровно
34
+ * на отступ. Тогда `rootBounds` записи — это и есть линия прилипания, и состояние
35
+ * читается сравнением двух чисел.
36
+ *
37
+ * Единицы только `px`: `rootMargin` процентов не по осям и произвольных длин не
38
+ * принимает, поэтому отступ приходит сюда уже замеренным.
39
+ */
40
+ function affixRootMargin(placement, offsetPx) {
41
+ const inset = `${-(Number.isFinite(offsetPx) ? Math.max(0, Math.round(offsetPx)) : 0)}px`;
42
+ const zero = "0px";
43
+ return placement === "top" ? [
44
+ inset,
45
+ zero,
46
+ zero,
47
+ zero
48
+ ].join(" ") : [
49
+ zero,
50
+ zero,
51
+ inset,
52
+ zero
53
+ ].join(" ");
54
+ }
55
+ /**
56
+ * Прилипло ли — по одной записи наблюдателя.
57
+ *
58
+ * Считаем по прямоугольникам, а не по `isIntersecting`: тот означает сразу две
59
+ * разные вещи — «сентинел ещё не доехал до линии» и «уже уехал за неё», — и
60
+ * различает их только геометрия, которую запись и так несёт.
61
+ *
62
+ * `rootBounds` уже поджат `rootMargin`'ом (так определено спецификацией), поэтому
63
+ * его край и есть линия прилипания.
64
+ */
65
+ function isAffixStuck(entry, placement, previous) {
66
+ const bounds = entry.rootBounds;
67
+ if (!bounds) return previous;
68
+ return placement === "top" ? entry.boundingClientRect.top < bounds.top : entry.boundingClientRect.bottom > bounds.bottom;
69
+ }
70
+ /**
71
+ * Один проход по цепочке предков, два ответа: root наблюдателя и повод для
72
+ * dev-предупреждения.
73
+ *
74
+ * Читается вычисленный `overflow-y`, а не объявленный и не классы, и это не
75
+ * придирка: при `overflow-x: hidden; overflow-y: visible` спецификация превращает
76
+ * вычисленный `overflow-y` в `auto` — предок действительно становится рабочим
77
+ * скроллпортом. Проверка по классу `overflow-x-hidden` дала бы здесь ложную
78
+ * тревогу на совершенно исправной вёрстке.
79
+ *
80
+ * Обход останавливается на первом скроллере: всё выше него к прилипанию отношения
81
+ * не имеет, поэтому и клипер над скроллером виновным не считается. Ровно такая
82
+ * пара есть в витрине — внешняя панель `overflow-hidden`, внутри `overflow-y-auto`.
83
+ */
84
+ function scanAffixAncestors(ancestors) {
85
+ let clipperLabel = null;
86
+ for (let index = 0; index < ancestors.length; index += 1) {
87
+ const { overflowY, label } = ancestors[index];
88
+ if (SCROLLABLE.has(overflowY)) return {
89
+ scrollerIndex: index,
90
+ clipperLabel
91
+ };
92
+ if (clipperLabel === null && CLIPPING.has(overflowY)) clipperLabel = label;
93
+ }
94
+ return {
95
+ scrollerIndex: -1,
96
+ clipperLabel
97
+ };
98
+ }
99
+ //#endregion
100
+ //#region src/components/GrAffix/GrAffix.vue?vue&type=script&setup=true&lang.ts
101
+ var _hoisted_1 = ["data-placement", "data-stuck"];
102
+ //#endregion
103
+ //#region src/components/GrAffix/GrAffix.vue
104
+ var GrAffix_default = /* @__PURE__ */ defineComponent({
105
+ inheritAttrs: false,
106
+ __name: "GrAffix",
107
+ props: {
108
+ placement: { default: "top" },
109
+ offset: { default: void 0 },
110
+ disabled: {
111
+ type: Boolean,
112
+ default: false
113
+ }
114
+ },
115
+ emits: ["stickyChange"],
116
+ setup(__props, { expose: __expose, emit: __emit }) {
117
+ const props = __props;
118
+ const emit = __emit;
119
+ const boxEl = ref(null);
120
+ const sentinelTopEl = ref(null);
121
+ const sentinelBottomEl = ref(null);
122
+ const sentinelEl = computed(() => props.placement === "top" ? sentinelTopEl.value : sentinelBottomEl.value);
123
+ const stuck = ref(false);
124
+ /**
125
+ * Наблюдателя в этой среде нет вовсе (сервер, jsdom, старый движок). Тогда
126
+ * `sticky` продолжает работать — его делает CSS, — но знание о состоянии
127
+ * пропадает, и поверхность включается всегда. Прилипшая прозрачная панель
128
+ * пропускает сквозь себя строки; всегда непрозрачная просто чуть более
129
+ * декоративна, чем нужно. Из двух деградаций выбрана вторая.
130
+ */
131
+ const observerMissing = ref(false);
132
+ const surfaceOn = computed(() => !props.disabled && (stuck.value || observerMissing.value));
133
+ const rootClass = computed(() => grAffixRootClass(props.placement, !props.disabled, surfaceOn.value));
134
+ const rootStyle = computed(() => {
135
+ const length = affixOffsetLength(props.offset);
136
+ return length === void 0 ? void 0 : { "--gr-affix-offset": length };
137
+ });
138
+ let observer = null;
139
+ let appliedOffsetPx = 0;
140
+ let warned = false;
141
+ /**
142
+ * Отступ берётся из вычисленного стиля, а не из пропа, по трём причинам:
143
+ * браузер уже разрешил `4rem`/`var()`/`calc()` в used value, и свой парсер CSS
144
+ * не нужен; отступ может прийти не из пропа вовсе, а из каскада; у `sticky`
145
+ * `getComputedStyle().top` возвращает заданный порог прилипания, а не смещённую
146
+ * позицию, то есть ровно нужное число.
147
+ */
148
+ function measureOffsetPx() {
149
+ const box = boxEl.value;
150
+ if (!box || typeof getComputedStyle !== "function") return 0;
151
+ const parsed = Number.parseFloat(getComputedStyle(box)[props.placement]);
152
+ return Number.isFinite(parsed) ? Math.max(0, parsed) : 0;
153
+ }
154
+ function describeElement(el) {
155
+ const tag = el.tagName.toLowerCase();
156
+ const classes = el.getAttribute("class")?.trim().split(/\s+/).slice(0, 2) ?? [];
157
+ return classes.length > 0 ? `<${tag} class="${classes.join(" ")}…">` : `<${tag}>`;
158
+ }
159
+ /**
160
+ * Цепочка предков до `<body>`, не включая его.
161
+ *
162
+ * Верхняя граница выбрана не по вкусу: `useScrollLock` вешает
163
+ * `overflow: hidden` на `body` на всё время открытой модалки, и дойди обход
164
+ * туда — каждый аффикс внутри `GrModal` объявлялся бы сломанным, причём только
165
+ * в этом состоянии, то есть через раз.
166
+ */
167
+ function collectAncestors(box) {
168
+ const chain = [];
169
+ if (typeof getComputedStyle !== "function") return chain;
170
+ let current = box.parentElement;
171
+ while (current && current !== document.body) {
172
+ chain.push({
173
+ el: current,
174
+ info: {
175
+ overflowY: getComputedStyle(current).overflowY,
176
+ label: describeElement(current)
177
+ }
178
+ });
179
+ current = current.parentElement;
180
+ }
181
+ return chain;
182
+ }
183
+ function detach() {
184
+ observer?.disconnect();
185
+ observer = null;
186
+ }
187
+ function attach() {
188
+ detach();
189
+ if (props.disabled) {
190
+ stuck.value = false;
191
+ return;
192
+ }
193
+ if (typeof IntersectionObserver === "undefined") {
194
+ observerMissing.value = true;
195
+ return;
196
+ }
197
+ const box = boxEl.value;
198
+ const sentinel = sentinelEl.value;
199
+ if (!box || !sentinel) return;
200
+ const chain = collectAncestors(box);
201
+ const scan = scanAffixAncestors(chain.map((item) => item.info));
202
+ const root = scan.scrollerIndex >= 0 ? chain[scan.scrollerIndex].el : null;
203
+ appliedOffsetPx = measureOffsetPx();
204
+ observer = new IntersectionObserver(handle, {
205
+ root,
206
+ rootMargin: affixRootMargin(props.placement, appliedOffsetPx),
207
+ threshold: 0
208
+ });
209
+ observer.observe(sentinel);
210
+ if (process.env.NODE_ENV !== "production" && !warned && scan.clipperLabel) {
211
+ warned = true;
212
+ console.warn(`[granularity] GrAffix: предок ${scan.clipperLabel} задаёт \`overflow\`, отличный от \`visible\`, и прокручивать его нечем — он становится скроллпортом, внутри которого \`position: sticky\` не двигается. Снимите \`overflow\` с этого предка либо сделайте его настоящим скроллером (\`overflow-y: auto\` плюс ограничение высоты).`);
213
+ }
214
+ }
215
+ function handle(entries) {
216
+ const entry = entries[entries.length - 1];
217
+ if (!entry) return;
218
+ const next = isAffixStuck(entry, props.placement, stuck.value);
219
+ if (next !== stuck.value) {
220
+ stuck.value = next;
221
+ emit("stickyChange", next);
222
+ }
223
+ if (measureOffsetPx() !== appliedOffsetPx) attach();
224
+ }
225
+ /** Перечитать отступ и пересобрать наблюдателя: `vh` после ресайза, смена высоты шапки. */
226
+ function remeasure() {
227
+ attach();
228
+ }
229
+ onMounted(attach);
230
+ onBeforeUnmount(detach);
231
+ watch(() => [
232
+ props.placement,
233
+ props.offset,
234
+ props.disabled
235
+ ], attach, { flush: "post" });
236
+ __expose({
237
+ stuck,
238
+ remeasure
239
+ });
240
+ return (_ctx, _cache) => {
241
+ return openBlock(), createElementBlock(Fragment, null, [
242
+ !__props.disabled && __props.placement === "top" ? (openBlock(), createElementBlock("div", {
243
+ key: 0,
244
+ ref_key: "sentinelTopEl",
245
+ ref: sentinelTopEl,
246
+ "data-gr-affix-sentinel": "",
247
+ "aria-hidden": "true",
248
+ class: normalizeClass(unref(affixSentinelClass).top)
249
+ }, null, 2)) : createCommentVNode("", true),
250
+ createElementVNode("div", mergeProps({
251
+ ref_key: "boxEl",
252
+ ref: boxEl,
253
+ "data-gr-affix": "",
254
+ "data-placement": __props.placement,
255
+ "data-stuck": stuck.value ? "true" : void 0,
256
+ class: rootClass.value,
257
+ style: rootStyle.value
258
+ }, _ctx.$attrs), [renderSlot(_ctx.$slots, "default", { stuck: stuck.value })], 16, _hoisted_1),
259
+ !__props.disabled && __props.placement === "bottom" ? (openBlock(), createElementBlock("div", {
260
+ key: 1,
261
+ ref_key: "sentinelBottomEl",
262
+ ref: sentinelBottomEl,
263
+ "data-gr-affix-sentinel": "",
264
+ "aria-hidden": "true",
265
+ class: normalizeClass(unref(affixSentinelClass).bottom)
266
+ }, null, 2)) : createCommentVNode("", true)
267
+ ], 64);
268
+ };
269
+ }
270
+ });
271
+ //#endregion
272
+ export { GrAffix_default as t };