@feugene/granularity 0.23.0 → 0.24.1

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 (100) hide show
  1. package/dist/chunks/config-BFJIxE8b.js +62 -0
  2. package/dist/chunks/config-BFJIxE8b.js.map +1 -0
  3. package/dist/chunks/{config-DBQQT-WP.js → config-BIa3ilQm.js} +18 -3
  4. package/dist/chunks/config-BIa3ilQm.js.map +1 -0
  5. package/dist/chunks/config-BSyiFlbi2.js.map +1 -0
  6. package/dist/chunks/config-BViooYNv2.js.map +1 -0
  7. package/dist/chunks/config-BoNR7_PD.js.map +1 -0
  8. package/dist/chunks/{config-Be9k9bOf.js → config-C8tVRv8i.js} +16 -2
  9. package/dist/chunks/config-C8tVRv8i.js.map +1 -0
  10. package/dist/chunks/{config-Bm_Sovla.js → config-DYgfMrIF.js} +14 -2
  11. package/dist/chunks/config-DYgfMrIF.js.map +1 -0
  12. package/dist/chunks/{config-DCwQBMmJ.js → config-rkcKArZQ2.js} +27 -8
  13. package/dist/chunks/config-rkcKArZQ2.js.map +1 -0
  14. package/dist/chunks/config-vSji8w902.js.map +1 -0
  15. package/dist/chunks/{generated-CiCrGDQO.js → generated-1WEi10KK.js} +89 -6
  16. package/dist/chunks/{generated-CiCrGDQO.js.map → generated-1WEi10KK.js.map} +1 -1
  17. package/dist/chunks/{granular-provider-CQKhl5C_.js → granular-provider-Dr2PKgl1.js} +13 -11
  18. package/dist/chunks/granular-provider-Dr2PKgl1.js.map +1 -0
  19. package/dist/components/GrCard/chunks/{GrCard-Bc7nRfbe.js → GrCard-gI2wA8ZZ.js} +8 -2
  20. package/dist/components/GrCard/chunks/GrCard-gI2wA8ZZ.js.map +1 -0
  21. package/dist/components/GrCard/index.js +2 -2
  22. package/dist/components/GrCollapse/chunks/{GrCollapse-C1rCfbc0.js → GrCollapse-DIHEiTju.js} +1 -1
  23. package/dist/components/GrCollapse/chunks/{GrCollapse-C1rCfbc0.js.map → GrCollapse-DIHEiTju.js.map} +1 -1
  24. package/dist/components/GrCollapse/index.js +1 -1
  25. package/dist/components/GrDelta/chunks/{GrDelta-DFvxNpmN.js → GrDelta-NE5HhXoo.js} +0 -0
  26. package/dist/components/GrDelta/chunks/GrDelta-NE5HhXoo.js.map +1 -0
  27. package/dist/components/GrDelta/index.js +2 -2
  28. package/dist/components/GrDescriptionList/chunks/{GrDescriptionList-2zFXzX83.js → GrDescriptionList-C6Pxjjbh.js} +8 -4
  29. package/dist/components/GrDescriptionList/chunks/GrDescriptionList-C6Pxjjbh.js.map +1 -0
  30. package/dist/components/GrDescriptionList/index.js +2 -2
  31. package/dist/components/GrDropdown/index.js +1 -1
  32. package/dist/components/GrEmptyState/chunks/{GrEmptyState-CS9do8eM.js → GrEmptyState-BGUX8O0U.js} +1 -1
  33. package/dist/components/GrEmptyState/chunks/{GrEmptyState-CS9do8eM.js.map → GrEmptyState-BGUX8O0U.js.map} +1 -1
  34. package/dist/components/GrEmptyState/index.js +2 -2
  35. package/dist/components/GrList/chunks/{GrList-BRYhpqIe.js → GrList-DAtzVIHh.js} +1 -1
  36. package/dist/components/GrList/chunks/{GrList-BRYhpqIe.js.map → GrList-DAtzVIHh.js.map} +1 -1
  37. package/dist/components/GrList/index.js +1 -1
  38. package/dist/components/GrLoading/chunks/{GrLoading-C3DZSSuh.js → GrLoading-DeBFTvFX.js} +1 -1
  39. package/dist/components/GrLoading/chunks/GrLoading-DeBFTvFX.js.map +1 -0
  40. package/dist/components/GrLoading/index.js +1 -1
  41. package/dist/components/GrPopover/index.js +1 -1
  42. package/dist/components/GrSegmented/chunks/{GrSegmented-D1mjxF_O.js → GrSegmented-DKpo3cnC.js} +30 -5
  43. package/dist/components/GrSegmented/chunks/GrSegmented-DKpo3cnC.js.map +1 -0
  44. package/dist/components/GrSegmented/index.js +1 -1
  45. package/dist/components/GrSortableList/chunks/{GrSortableList-DPjxilmN.js → GrSortableList-BmcUVAMb.js} +1 -1
  46. package/dist/components/GrSortableList/chunks/{GrSortableList-DPjxilmN.js.map → GrSortableList-BmcUVAMb.js.map} +1 -1
  47. package/dist/components/GrSortableList/index.js +1 -1
  48. package/dist/components/GrStatistic/chunks/{GrStatistic-C7wQECeS.js → GrStatistic-BJQv5aOS.js} +41 -26
  49. package/dist/components/GrStatistic/chunks/GrStatistic-BJQv5aOS.js.map +1 -0
  50. package/dist/components/GrStatistic/index.js +2 -2
  51. package/dist/components/GrSwitch/chunks/{GrSwitch-x_vQQ6ao.js → GrSwitch-CHiIj9GT.js} +1 -1
  52. package/dist/components/GrSwitch/chunks/{GrSwitch-x_vQQ6ao.js.map → GrSwitch-CHiIj9GT.js.map} +1 -1
  53. package/dist/components/GrSwitch/index.js +2 -2
  54. package/dist/components/GrValue/chunks/GrValue-CZsuZ4x-.js +38 -0
  55. package/dist/components/GrValue/chunks/GrValue-CZsuZ4x-.js.map +1 -0
  56. package/dist/components/GrValue/index.js +3 -0
  57. package/dist/directives/loading.js +1 -1
  58. package/dist/granular-provider-node.js +1 -1
  59. package/dist/granular-provider.js +1 -1
  60. package/dist/index.js +22 -20
  61. package/dist/styles/themes/dark.css +11 -6
  62. package/dist/styles/themes/light.css +5 -0
  63. package/dist/theme.js +1 -1
  64. package/dist/tokens.js +1 -1
  65. package/dist/types/components/GrCard/grCardStyles.d.ts +11 -0
  66. package/dist/types/components/GrDelta/grDeltaStyles.d.ts +13 -1
  67. package/dist/types/components/GrDescriptionList/grDescriptionListStyles.d.ts +29 -1
  68. package/dist/types/components/GrStatistic/GrStatistic.vue.d.ts +5 -5
  69. package/dist/types/components/GrStatistic/grStatisticStyles.d.ts +9 -0
  70. package/dist/types/components/GrValue/GrValue.vue.d.ts +51 -0
  71. package/dist/types/components/GrValue/config.d.ts +1 -0
  72. package/dist/types/components/GrValue/grValueStyles.d.ts +34 -0
  73. package/dist/types/components/GrValue/index.d.ts +5 -0
  74. package/dist/types/components/GrValue/safelist.d.ts +1 -0
  75. package/dist/types/components/shared/truncationTitle.d.ts +16 -0
  76. package/dist/types/granular-provider/shared.d.ts +1 -0
  77. package/dist/types/index.d.ts +2 -0
  78. package/dist/web-types.json +56 -1
  79. package/package.json +5 -1
  80. package/tokens/themes/dark.json +26 -6
  81. package/tokens/themes/light.json +20 -0
  82. package/dist/chunks/config-BSyiFlbi.js.map +0 -1
  83. package/dist/chunks/config-BViooYNv.js.map +0 -1
  84. package/dist/chunks/config-Be9k9bOf.js.map +0 -1
  85. package/dist/chunks/config-Bm_Sovla.js.map +0 -1
  86. package/dist/chunks/config-BoNR7_PD2.js.map +0 -1
  87. package/dist/chunks/config-DBQQT-WP.js.map +0 -1
  88. package/dist/chunks/config-DCwQBMmJ.js.map +0 -1
  89. package/dist/chunks/config-vSji8w90.js.map +0 -1
  90. package/dist/chunks/granular-provider-CQKhl5C_.js.map +0 -1
  91. package/dist/components/GrCard/chunks/GrCard-Bc7nRfbe.js.map +0 -1
  92. package/dist/components/GrDelta/chunks/GrDelta-DFvxNpmN.js.map +0 -1
  93. package/dist/components/GrDescriptionList/chunks/GrDescriptionList-2zFXzX83.js.map +0 -1
  94. package/dist/components/GrLoading/chunks/GrLoading-C3DZSSuh.js.map +0 -1
  95. package/dist/components/GrSegmented/chunks/GrSegmented-D1mjxF_O.js.map +0 -1
  96. package/dist/components/GrStatistic/chunks/GrStatistic-C7wQECeS.js.map +0 -1
  97. /package/dist/chunks/{config-BSyiFlbi.js → config-BSyiFlbi2.js} +0 -0
  98. /package/dist/chunks/{config-BViooYNv.js → config-BViooYNv2.js} +0 -0
  99. /package/dist/chunks/{config-BoNR7_PD2.js → config-BoNR7_PD.js} +0 -0
  100. /package/dist/chunks/{config-vSji8w90.js → config-vSji8w902.js} +0 -0
@@ -7,7 +7,7 @@ import { t as grBottomNavConfig } from "./config-Dguto_6o.js";
7
7
  import { t as grBreadcrumbsConfig } from "./config-DKdlqXiY.js";
8
8
  import { t as grButtonConfig } from "./config-B84z1aos.js";
9
9
  import { t as grButtonGroupConfig } from "./config-DBmdgoVf.js";
10
- import { t as grCardConfig } from "./config-Bm_Sovla.js";
10
+ import { t as grCardConfig } from "./config-DYgfMrIF.js";
11
11
  import { t as grCheckboxConfig } from "./config-esdviAPL.js";
12
12
  import { t as grCheckboxGroupConfig } from "./config-BuGlNPE9.js";
13
13
  import { t as grCodeBlockConfig } from "./config-B_qi4Fma.js";
@@ -18,15 +18,16 @@ import { t as grCommandPaletteConfig } from "./config-9PYRZlKE.js";
18
18
  import { t as grConfigProviderConfig } from "./config-B7W9VlZ7.js";
19
19
  import { t as grConfirmDialogConfig } from "./config-A-bBiotF.js";
20
20
  import { t as grDataTableConfig } from "./config-BC8d_smz.js";
21
- import { t as grDeltaConfig } from "./config-DBQQT-WP.js";
22
- import { t as grDescriptionListConfig } from "./config-DCwQBMmJ.js";
21
+ import { t as grValueConfig } from "./config-BFJIxE8b.js";
22
+ import { t as grDeltaConfig } from "./config-BIa3ilQm.js";
23
+ import { t as grDescriptionListConfig } from "./config-rkcKArZQ2.js";
23
24
  import { t as grDialogSafelist } from "./safelist-CkF4v7DC.js";
24
25
  import { t as grDialogServiceConfig } from "./config-CjXjhphs.js";
25
26
  import { t as grDividerConfig } from "./config-CY0_6cMi.js";
26
27
  import { t as grDrawerConfig } from "./config-D94Z9po5.js";
27
- import { t as grDropdownConfig } from "./config-BViooYNv.js";
28
+ import { t as grDropdownConfig } from "./config-BViooYNv2.js";
28
29
  import { t as grDropdownMenuConfig } from "./config-C5mO5DYZ.js";
29
- import { t as grEmptyStateConfig } from "./config-vSji8w90.js";
30
+ import { t as grEmptyStateConfig } from "./config-vSji8w902.js";
30
31
  import { t as grFilePreviewConfig } from "./config-QJ54_fcM.js";
31
32
  import { t as grFileUploadConfig } from "./config-CN970ZcJ.js";
32
33
  import { t as grFormConfig } from "./config-Droqn55j.js";
@@ -45,7 +46,7 @@ import { t as grModalConfig } from "./config-BtXRpAtq.js";
45
46
  import { t as grNavbarConfig } from "./config-Bpt9Xbxm.js";
46
47
  import { t as grNumberInputConfig } from "./config-zjeAJ4ho.js";
47
48
  import { t as grPaginationConfig } from "./config-DSJY6aEl.js";
48
- import { t as grPopoverConfig } from "./config-BSyiFlbi.js";
49
+ import { t as grPopoverConfig } from "./config-BSyiFlbi2.js";
49
50
  import { t as grProgressBarConfig } from "./config-CQzGyi1C.js";
50
51
  import { t as grProgressCircleConfig } from "./config-MRvhUl-O.js";
51
52
  import { t as grPromptDialogConfig } from "./config-C0Ea9ePP.js";
@@ -59,8 +60,8 @@ import { t as grSkeletonConfig } from "./config-8Pcutu1j.js";
59
60
  import { t as grSliderConfig } from "./config-T3qdQBgU2.js";
60
61
  import { t as grSortableListConfig } from "./config-DAX8Deh12.js";
61
62
  import { t as grSplitterConfig } from "./config-BE6n20np.js";
62
- import { t as grStatisticConfig } from "./config-Be9k9bOf.js";
63
- import { t as grSwitchConfig } from "./config-BoNR7_PD2.js";
63
+ import { t as grStatisticConfig } from "./config-C8tVRv8i.js";
64
+ import { t as grSwitchConfig } from "./config-BoNR7_PD.js";
64
65
  import { t as grTableConfig } from "./config-WTNhdh6T.js";
65
66
  import { t as grTabPanelsConfig } from "./config-eXB87DOi.js";
66
67
  import { t as grTabsConfig } from "./config-DWN4x6_e.js";
@@ -96,8 +97,8 @@ var theme = {
96
97
  baseCssUrl: new URL("data:text/css;base64,LyoKICogR1It0LHQsNC30L7QstGL0Lkg0YHQu9C+0LkuCiAqCiAqINCT0LvQvtCx0LDQu9GM0L3Ri9C5INGB0LHRgNC+0YEg0YHRgtGA0LDQvdC40YbRiyAoYGJvZHlgLCBgYm94LXNpemluZ2ApINC/0YDQvtC00YPQsdC70LjRgNC+0LLQsNC9INC40LcKICogYHByZWZsaWdodC5jc3NgINCd0JDQn9Cg0K/QnNCj0K4gKNCwINC90LUg0YfQtdGA0LXQtyBgQGltcG9ydGApLiDQn9GA0LjRh9C40L3QsDogZ3JhbnVsYXItcHJvdmlkZXIKICog0LLRgdGC0YDQsNC40LLQsNC10YIg0YHQvtC00LXRgNC20LjQvNC+0LUgYGJhc2UuY3NzYCDQutCw0LogYmFzZTY0IGBkYXRhOmAtVVJMINC90LAg0Y3RgtCw0L/QtSDRgdCx0L7RgNC60Lgg0L/QsNC60LXRgtCwCiAqINC4INC+0YLQtNCw0ZHRgiDQtdCz0L4g0LIgVW5vQ1NTINC60LDQuiBwcmVmbGlnaHQt0YHRgtGA0L7QutGDLiDQktC70L7QttC10L3QvdGL0LkgYEBpbXBvcnRgINCyINGC0LDQutC+0Lkg0YHRgtGA0L7QutC1CiAqICjQsCkg0L3QtSDRgNC10LfQvtC70LLQuNGC0YHRjyAo0L7RgtC90L7RgdC40YLQtdC70YzQvdGL0Lkg0L/Rg9GC0Ywg0LLQvdGD0YLRgNC4IGRhdGEtVVJMKSDQuCAo0LEpINC+0LrQsNC30YvQstCw0LXRgtGB0Y8g0J3QlSDQsgogKiDQvdCw0YfQsNC70LUg0YTQuNC90LDQu9GM0L3QvtCz0L4gQ1NTIOKGkiBQb3N0Q1NTINC/0LDQtNCw0LXRgjogwqtAaW1wb3J0IG11c3QgcHJlY2VkZSBhbGwgb3RoZXIKICogc3RhdGVtZW50c8K7LiDQn9C+0Y3RgtC+0LzRgyByZXNldCDQuNC90LvQsNC50L3QuNGC0YHRjyDRgdGO0LTQsC4gYHByZWZsaWdodC5jc3NgINC+0YHRgtCw0ZHRgtGB0Y8g0L7RgtC00LXQu9GM0L3Ri9C8CiAqINC/0YPQsdC70LjRh9C90YvQvCDRhNCw0LnQu9C+0LwgKGAuL3N0eWxlcy9wcmVmbGlnaHQuY3NzYCkg0LTQu9GPIHN0YW5kYWxvbmUt0L/QvtGC0YDQtdCx0LjRgtC10LvQtdC5IOKAlAogKiDQtNC10YDQttC40YLQtSDQvtCx0LAg0LHQu9C+0LrQsCDRgdC40L3RhdGA0L7QvdC90YvQvNC4LgogKgogKiDQn9C+0YLRgNC10LHQuNGC0LXQu9GMLCDQutC+0YLQvtGA0L7QvNGDINCz0LvQvtCx0LDQu9GM0L3Ri9C1INGB0LDQudC0LdGN0YTRhNC10LrRgtGLINC90LUg0L3Rg9C20L3Riywg0LzQvtC20LXRgiDQv9C+0LTQutC70Y7Rh9C40YLRjAogKiBgdG9rZW5zLmNzc2AgKyDRgtC10LzRgyDQuCDQv9GA0L7Qv9GD0YHRgtC40YLRjCBgYmFzZS5jc3NgL2BwcmVmbGlnaHQuY3NzYC4KICoKICog0J3QuNC20LUsINC/0L7QvNC40LzQviByZXNldCwg4oCUINC90LjQt9C60L7RgdC/0LXRhtC40YTQuNGH0L3Ri9C1IChgOndoZXJlKClgKSDQtNC10YTQvtC70YLRiyDRgdCw0LzQvtC5IEdSLCDQutC+0YLQvtGA0YvQtQogKiDQsdC10LfQvtC/0LDRgdC90L4g0L3QsNC60LvQsNC00YvQstCw0Y7RgtGB0Y8g0L3QsCDQv9GA0LjQu9C+0LbQtdC90LjQtSDQuCDQu9C10LPQutC+INC/0LXRgNC10L7Qv9GA0LXQtNC10LvRj9GO0YLRgdGPLgogKi8KCi8qIC0tLSByZXNldCAo0YHQuNC90YXRgNC+0L3QuNC30LjRgNC+0LLQsNC90L4g0YEgcHJlZmxpZ2h0LmNzcykgLS0tICovCmh0bWwsCmJvZHkgewogICAgaGVpZ2h0OiAxMDAlOwp9Cgpib2R5IHsKICAgIG1hcmdpbjogMDsKICAgIGZvbnQtZmFtaWx5OiB2YXIoLS1nci1mb250LXVpKTsKICAgIGJhY2tncm91bmQ6IHZhcigtLWdyLWJnKTsKICAgIGNvbG9yOiB2YXIoLS1nci1mZyk7Cn0KCiogewogICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKfQoKLyoKICog0KPQstCw0LbQtdC90LjQtSDQuiBgcHJlZmVycy1yZWR1Y2VkLW1vdGlvbmAg4oCUINC10LTQuNC90YHRgtCy0LXQvdC90YvQuSDRgNCw0LHQvtGC0LDRjtGJ0LjQuSDQutCw0L3QsNC7INC90LAg0LLQtdGB0Ywg0L/QsNC60LXRgi4KICoKICog0JLQsNGA0LjQsNC90YIgYG1vdGlvbi1zYWZlOmAvYG1vdGlvbi1yZWR1Y2U6YCDQv9C+0LQgcHJlc2V0TWluaSDQndCVINCz0LXQvdC10YDQuNGA0YPQtdGCIENTUyDQstC+0LLRgdC1CiAqICjQv9GA0L7QstC10YDQtdC90L4g0LPQtdC90LXRgNCw0YLQvtGA0L7QvCksINC/0L7RjdGC0L7QvNGDINGA0LDRgdGB0YLQsNCy0LvRj9GC0Ywg0LXQs9C+INC/0L4gNzggYHRyYW5zaXRpb24tKmAg0LggNwogKiBgYW5pbWF0ZS1zcGluYCDQvdC10LvRjNC30Y8g4oCUINC60LvQsNGB0YHRiyDRg9C80YDRg9GCINC80L7Qu9GH0LAsINCwINCw0L3QuNC80LDRhtC40Y8g0L7RgdGC0LDQvdC10YLRgdGPLiDQntGC0YHRjtC00LAKICog0LPQu9C+0LHQsNC70YzQvdGL0Lkg0LHQu9C+0Lo6INC+0L0g0L/QvtC60YDRi9Cy0LDQtdGCINC4INGD0YLQuNC70LjRgtGLLCDQuCBgPHRyYW5zaXRpb24+YCBWdWUsINC4INC/0L7QutC+0LzQv9C+0L3QtdC90YLQvdGL0LUKICogYEBrZXlmcmFtZXNgLCDQuCDQutC+0LQsINC60L7RgtC+0YDQvtCz0L4g0LXRidGRINC90LXRgi4KICoKICog0JTQu9C40YLQtdC70YzQvdC+0YHRgtGMINCz0LDRgdC40YLRgdGPINC00L4gYDAuMDFtc2AsINCwINC90LUg0LTQviBgbm9uZWA6INGB0L7QsdGL0YLQuNC1IGB0cmFuc2l0aW9uZW5kYCAvCiAqIGBhbmltYXRpb25lbmRgINC+0LHRj9C30LDQvdC+INGB0L7RgdGC0L7Rj9GC0YzRgdGPLCDQuNC90LDRh9C1INGB0LvRg9GI0LDRgtC10LvRjCDQvdCwINGB0YLQvtGA0L7QvdC1INC/0L7RgtGA0LXQsdC40YLQtdC70Y8KICog0L3QuNC60L7Qs9C00LAg0L3QtSDQtNC+0LbQtNGR0YLRgdGPINC10LPQviDQuCDQvtGB0YLQsNCy0LjRgiDQuNC90YLQtdGA0YTQtdC50YEg0LIg0L/RgNC+0LzQtdC20YPRgtC+0YfQvdC+0Lwg0YHQvtGB0YLQvtGP0L3QuNC4LgogKgogKiDQl9Cw0LTQtdGA0LbQutC4INC+0LHQvdGD0LvRj9GO0YLRgdGPINCy0LzQtdGB0YLQtSDRgSDQtNC70LjRgtC10LvRjNC90L7RgdGC0Y/QvNC4IOKAlCDQuNC90LDRh9C1IGBkZWxheWAg0LIg0L/QsNGA0YMg0YHQtdC60YPQvdC0CiAqINCy0LXRgNC90YPQuyDQsdGLINC+0LbQuNC00LDQvdC40LUsINGA0LDQtNC4INGD0YHRgtGA0LDQvdC10L3QuNGPINC60L7RgtC+0YDQvtCz0L4g0LLRgdGRINC4INC00LXQu9Cw0LXRgtGB0Y8uCiAqCiAqIGAhaW1wb3J0YW50YCDQt9C00LXRgdGMINC+0LHRj9C30LDRgtC10LvQtdC9OiDRgdC10LvQtdC60YLQvtGAIGAqYCDQuNC80LXQtdGCINC90YPQu9C10LLRg9GOINGB0L/QtdGG0LjRhNC40YfQvdC+0YHRgtGMINC4INCx0LXQtwogKiDQvdC10LPQviDQv9GA0L7QuNCz0YDQsNC10YIg0LvRjtCx0L7QvNGDINC60LvQsNGB0YHRgy3Rg9GC0LjQu9C40YLQtSDQuCDQuNC90LvQsNC50L3QvtCy0L7QvNGDINGB0YLQuNC70Y4uCiAqLwpAbWVkaWEgKHByZWZlcnMtcmVkdWNlZC1tb3Rpb246IHJlZHVjZSkgewogICAgKiwKICAgICo6OmJlZm9yZSwKICAgICo6OmFmdGVyIHsKICAgICAgICBhbmltYXRpb24tZGVsYXk6IDBtcyAhaW1wb3J0YW50OwogICAgICAgIGFuaW1hdGlvbi1kdXJhdGlvbjogMC4wMW1zICFpbXBvcnRhbnQ7CiAgICAgICAgYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogMSAhaW1wb3J0YW50OwogICAgICAgIHRyYW5zaXRpb24tZGVsYXk6IDBtcyAhaW1wb3J0YW50OwogICAgICAgIHRyYW5zaXRpb24tZHVyYXRpb246IDAuMDFtcyAhaW1wb3J0YW50OwogICAgICAgIHNjcm9sbC1iZWhhdmlvcjogYXV0byAhaW1wb3J0YW50OwogICAgfQp9CgovKgogKiBVbm9DU1MgdGFpbHdpbmQtY29tcGF0IHJlc2V0IGludGVudGlvbmFsbHkgZG9lcyBub3QgZm9yY2UgYGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50YCBmb3IgYnV0dG9ucwogKiAodG8gYXZvaWQgYnJlYWtpbmcgY29tcG9uZW50IGxpYnJhcmllcykuIEluIG91ciBHUiB3ZSB3YW50IHBsYWluIGJ1dHRvbnMvbGlua3MgdG8gYmUgdHJhbnNwYXJlbnQgYnkgZGVmYXVsdC4KICovCjp3aGVyZShhLCBidXR0b24pIHsKICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50Owp9Cgo6d2hlcmUoaW5wdXRbdHlwZT0nYnV0dG9uJ10sIGlucHV0W3R5cGU9J3N1Ym1pdCddLCBpbnB1dFt0eXBlPSdyZXNldCddKSB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDsKfQoKY29kZSwKcHJlLAprYmQgewogICAgZm9udC1mYW1pbHk6IHZhcigtLWdyLWZvbnQtbW9ubyk7Cn0K", "" + import.meta.url).href,
97
98
  tokensCssUrl: new URL("data:text/css;base64,LyoKICog0KHQk9CV0J3QldCg0JjQoNCe0JLQkNCd0J4gYHlhcm4gZ2VuZXJhdGU6dG9rZW5zYCDQuNC3IGB0b2tlbnMvKi5qc29uYCDigJQg0L/RgNCw0LLQutC4INC30LTQtdGB0Ywg0L/QvtGC0LXRgNGP0Y7RgtGB0Y8uCiAqINCc0LXQvdGP0YLRjCDQt9C90LDRh9C10L3QuNGPINC4INC60L7QvNC80LXQvdGC0LDRgNC40Lgg0L3Rg9C20L3QviDQsiBKU09OLCDQt9Cw0YLQtdC8INC/0LXRgNC10LPQtdC90LXRgNC40YDQvtCy0LDRgtGMLgogKi8KOnJvb3QgewogIC8qIEZvdW5kYXRpb25zOiBuZXV0cmFsIHBhbGV0dGUgKi8KICAtLWdyLXNsYXRlLTA6ICNmZmZmZmY7CiAgLS1nci1zbGF0ZS01MDogI2Y4ZmFmYzsKICAtLWdyLXNsYXRlLTEwMDogI2YxZjVmOTsKICAtLWdyLXNsYXRlLTIwMDogI2UyZThmMDsKICAtLWdyLXNsYXRlLTMwMDogI2NiZDVlMTsKICAtLWdyLXNsYXRlLTQwMDogIzk0YTNiODsKICAtLWdyLXNsYXRlLTUwMDogIzY0NzQ4YjsKICAtLWdyLXNsYXRlLTYwMDogIzQ3NTU2OTsKICAtLWdyLXNsYXRlLTcwMDogIzMzNDE1NTsKICAtLWdyLXNsYXRlLTgwMDogIzFlMjkzYjsKICAtLWdyLXNsYXRlLTkwMDogIzBmMTcyYTsKCiAgLyogVHlwb2dyYXBoeTogZm9udCBmYW1pbGllcyAqLwogIC0tZ3ItZm9udC11aTogSW50ZXIsIFJvYm90bywgc3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBTZWdvZSBVSSwgQXJpYWwsIHNhbnMtc2VyaWY7CiAgLS1nci1mb250LW1vbm86ICdKZXRCcmFpbnMgTW9ubycsIHVpLW1vbm9zcGFjZSwgU0ZNb25vLVJlZ3VsYXIsIE1lbmxvLCBNb25hY28sIENvbnNvbGFzLCAnTGliZXJhdGlvbiBNb25vJywgbW9ub3NwYWNlOwoKICAvKiBUeXBvZ3JhcGh5OiBmb250IHNpemVzICovCiAgLS1nci10ZXh0LTJ4czogMTBweDsKICAtLWdyLXRleHQteHM6IDEycHg7CiAgLS1nci10ZXh0LXNtOiAxNHB4OwogIC0tZ3ItdGV4dC1iYXNlOiAxNnB4OwogIC0tZ3ItdGV4dC1sZzogMThweDsKICAtLWdyLXRleHQteGw6IDIwcHg7CiAgLS1nci10ZXh0LTJ4bDogMjRweDsKICAtLWdyLXRleHQtM3hsOiAzMHB4OwogIC0tZ3ItdGV4dC00eGw6IDM2cHg7CgogIC8qCiAgICogVHlwb2dyYXBoeTogY29udHJvbCBzY2FsZQogICAqCiAgICog0KjQutCw0LvQsCDQutC10LPQu9C10Lkg0LrQvtC80L/QvtC90LXQvdGC0L7Qsiwg0LbQuNCy0YPRidC40YUg0L3QsCBgR3JDb21wb25lbnRTaXplYCDigJQg0LrQvtC90YLRgNC+0LvQvtCyINC4INCy0YHQtdCz0L4sCiAgICog0YfRgtC+INGB0YLQvtC40YIg0YEg0L3QuNC80Lgg0LIg0L7QtNC40L0g0YDRj9C0LiDQntGC0LTQtdC70YzQvdCw0Y8g0L7RgiDQutC+0L3RgtC10L3RgtC90L7QuSDRgtC40L/QvtCz0YDQsNGE0LjQutC4INC/0L4g0LTQstGD0LwKICAgKiDQv9GA0LjRh9C40L3QsNC8LiDQn9C10YDQstCw0Y86INGB0YLRg9C/0LXQvdC10LkgMTNweCDQuCAxMXB4INGC0LDQvCDQvdC10YIg0Lgg0LHRi9GC0Ywg0L3QtSDQtNC+0LvQttC90L4g4oCUINGN0YLQvgogICAqINC60L7QvNC/0YDQvtC80LjRgdGB0Ysg0L/Qu9C+0YLQvdC+0YHRgtC4INC60L7QvdGC0YDQvtC70LAsINCwINC90LUg0YHRgtGD0L/QtdC90Lgg0YLQtdC60YHRgtCwLiDQktGC0L7RgNCw0Y86INGI0LrQsNC70LAg0L3QsNC80LXRgNC10L3QvdC+CiAgICog0L/Qu9C+0YLQvdC10LUg0YfQtdGC0YvRgNGR0YUg0YHRgtGD0L/QtdC90LXQuSDRgNCw0LfQvNC10YDQsCDigJQg0LrQsNC20LTRi9C5INC60L7QvNC/0L7QvdC10L3RgiDQstGL0LHQuNGA0LDQtdGCINC40Lcg0L3QtdGRINGB0LLQvtC4CiAgICog0YfQtdGC0YvRgNC1LiDQntGB0L3QvtCy0L3QsNGPINC70LXRgdGC0L3QuNGG0LAgYHhz4oCmbGdgICgxMi8xMy8xNC8xNikg4oCUINGDIGBHcklucHV0YCwgYEdyU2VsZWN0YCwKICAgKiBgR3JUZXh0YXJlYWAsIGBHclRyZWVTZWxlY3RgLCBgR3JBdXRvY29tcGxldGVgLCBgR3JOdW1iZXJJbnB1dGAsIGBHcklucHV0VGFnYCwKICAgKiBgR3JUYWJsZWAsIGBHckxpbmtgLCBgR3JQb3BvdmVyYDsg0L3QsCDRgdGC0YPQv9C10L3RjCDQvNC10LvRjNGH0LUgKGAzeHPigKZtZGAsIDEwLzExLzEyLzE0KQogICAqINGA0LDQsdC+0YLQsNGO0YIgYEdyVG9vbHRpcGAsIGBHckRhdGFUYWJsZWAsIGBHckJhZGdlYCwgYEdyUmF0aW5nYCwgYEdyRm9ybUZpbGVgLgogICAqINCh0L7QstC/0LDQtNC10L3QuNC1INC30L3QsNGH0LXQvdC40Lkg0YEgYC0tZ3ItdGV4dC0qYCDQvdC1INC00LXQu9Cw0LXRgiDRiNC60LDQu9GLINC+0LTQvdC+0Lk6INC/0LvQvtGC0L3QvtGB0YLRjCDQutC+0L3RgtGA0L7Qu9C+0LIKICAgKiDQvNC10L3Rj9C10YLRgdGPINC+0YLQtNC10LvRjNC90L4g0L7RgiDQutC10LPQu9GPINC60L7QvdGC0LXQvdGC0L3QvtCz0L4g0YLQtdC60YHRgtCwLgogICAqLwogIC0tZ3ItY29udHJvbC10ZXh0LTN4czogMTBweDsKICAtLWdyLWNvbnRyb2wtdGV4dC0yeHM6IDExcHg7CiAgLS1nci1jb250cm9sLXRleHQteHM6IDEycHg7CiAgLS1nci1jb250cm9sLXRleHQtc206IDEzcHg7CiAgLS1nci1jb250cm9sLXRleHQtbWQ6IDE0cHg7CiAgLS1nci1jb250cm9sLXRleHQtbGc6IDE2cHg7CgogIC8qCiAgICogVHlwb2dyYXBoeTogbGluZSBoZWlnaHRzCiAgICoKICAgKiDQlNCy0LUg0YDQsNC30L3Ri9C1INCy0LXRidC4INC/0L7QtCDQvtC00L3QuNC8INC/0YDQtdGE0LjQutGB0L7QvCwg0Lgg0YDQsNC30LvQuNGH0LDQtdGCINC40YUg0YHRg9GE0YTQuNC60YEuCiAgICog0KHRgtGD0L/QtdC90LggKGB4c2AvYHNtYC9gYmFzZWApIOKAlCDQsNCx0YHQvtC70Y7RgtC90YvQtSDQt9C90LDRh9C10L3QuNGPLCDQv9Cw0YDQvdGL0LUg0L7QtNC90L7QuNC80ZHQvdC90YvQvCDRgdGC0YPQv9C10L3Rj9C8CiAgICogYC0tZ3ItdGV4dC0qYDog0YPRgtC40LvQuNGC0LAgYHRleHQtc21gINCyIHVubyDQt9Cw0LTQsNCy0LDQu9CwINC60LXQs9C70Ywg0Lgg0LzQtdC20YHRgtGA0L7Rh9C90YvQuSDRgNCw0LfQvtC8LCDQuAogICAqINC60LXQs9C70YwsINC/0LXRgNC10LLQtdC00ZHQvdC90YvQuSDQvdCwINGC0L7QutC10L0g0LIg0L7QtNC40L3QvtGH0LrRgywg0L7RgtC00LDQuyDQsdGLINC40L3RgtC10YDQstCw0Lsg0L3QsCDQvtGC0LrRg9C/IGBib2R5YAogICAqINC/0YDQuNC70L7QttC10L3QuNGPLiDQmtC+0Y3RhNGE0LjRhtC40LXQvdGC0YsgKGB0aWdodGAvYG5vcm1hbGAvYHJlbGF4ZWRgKSDigJQg0LHQtdC30YDQsNC30LzQtdGA0L3Ri9C1LCDQtNC70Y8KICAgKiDRgtC10LrRgdGC0L7QstGL0YUg0LHQu9C+0LrQvtCyLCDQs9C00LUg0LjQvdGC0LXRgNCy0LDQuyDQt9Cw0LTQsNGR0YLRgdGPINC+0YLQvdC+0YjQtdC90LjQtdC8INC6INC60LXQs9C70Y4sINCwINC90LUg0YfQuNGB0LvQvtC8LgogICAqINCh0YLRg9C/0LXQvdC4INC30LDQstC+0LTRj9GC0YHRjyDQv9C+INC80LXRgNC1INGD0L/QvtGC0YDQtdCx0LvQtdC90LjRjzog0YjQutCw0LvQsCDQsdC10Lcg0YPQv9C+0YLRgNC10LHQu9C10L3QuNGPIOKAlCDQvNGR0YDRgtCy0YvQuSDQs9GA0YPQty4KICAgKi8KICAtLWdyLWxlYWRpbmcteHM6IDFyZW07CiAgLS1nci1sZWFkaW5nLXNtOiAxLjI1cmVtOwogIC0tZ3ItbGVhZGluZy1iYXNlOiAxLjVyZW07CiAgLS1nci1sZWFkaW5nLXhsOiAxLjc1cmVtOwogIC0tZ3ItbGVhZGluZy0zeGw6IDIuMjVyZW07CiAgLS1nci1sZWFkaW5nLXRpZ2h0OiAxLjI1OwogIC0tZ3ItbGVhZGluZy1ub3JtYWw6IDEuNTsKICAtLWdyLWxlYWRpbmctcmVsYXhlZDogMS42MjU7CgogIC8qIFR5cG9ncmFwaHk6IGZvbnQgd2VpZ2h0cyAqLwogIC0tZ3ItZm9udC1yZWd1bGFyOiA0MDA7CiAgLS1nci1mb250LW1lZGl1bTogNTAwOwogIC0tZ3ItZm9udC1zZW1pYm9sZDogNjAwOwogIC0tZ3ItZm9udC1ib2xkOiA3MDA7CgogIC8qIExheW91dDogc3BhY2luZyBzY2FsZSAqLwogIC0tZ3Itc3BhY2UtMDogMHB4OwogIC0tZ3Itc3BhY2UtMTogNHB4OwogIC0tZ3Itc3BhY2UtMjogOHB4OwogIC0tZ3Itc3BhY2UtMzogMTJweDsKICAtLWdyLXNwYWNlLTQ6IDE2cHg7CiAgLS1nci1zcGFjZS01OiAyMHB4OwogIC0tZ3Itc3BhY2UtNjogMjRweDsKICAtLWdyLXNwYWNlLTg6IDMycHg7CiAgLS1nci1zcGFjZS0xMDogNDBweDsKICAtLWdyLXNwYWNlLTEyOiA0OHB4OwogIC0tZ3Itc3BhY2UtMTY6IDY0cHg7CiAgLS1nci1zcGFjZS0yMDogODBweDsKICAtLWdyLXNwYWNlLTI0OiA5NnB4OwogIC0tZ3Itc3BhY2UtMzI6IDEyOHB4OwogIC0tZ3Itc3BhY2UtNDA6IDE2MHB4OwogIC0tZ3Itc3BhY2UtNDg6IDE5MnB4OwogIC0tZ3Itc3BhY2UtNjQ6IDI1NnB4OwoKICAvKiBMYXlvdXQ6IGNvbnRhaW5lcnMgKi8KICAtLWdyLWNvbnRhaW5lci1tYXg6IDEyODBweDsKICAtLWdyLWNvbnRhaW5lci1tYXgtMnhsOiAxNDQwcHg7CiAgLS1nci1jb250YWluZXItcGFkZGluZy1tb2JpbGU6IDE2cHg7CiAgLS1nci1jb250YWluZXItcGFkZGluZy10YWJsZXQ6IDI0cHg7CiAgLS1nci1jb250YWluZXItcGFkZGluZy1kZXNrdG9wOiAzMnB4OwoKICAvKiBMYXlvdXQ6IGJyZWFrcG9pbnRzICovCiAgLS1nci1icC1zbTogNjQwcHg7CiAgLS1nci1icC1tZDogNzY4cHg7CiAgLS1nci1icC1sZzogMTAyNHB4OwogIC0tZ3ItYnAteGw6IDEyODBweDsKICAtLWdyLWJwLTJ4bDogMTUzNnB4OwoKICAvKgogICAqIEljb25vZ3JhcGh5OiBpY29uIHNpemVzCiAgICoKICAgKiDQqNC60LDQu9CwINGA0LDQt9C80LXRgNC+0LIg0LjQutC+0L3QutC4IChgR3JJY29uYCkuINCX0L3QsNGH0LXQvdC40Y8g0YHQvtCy0L/QsNC00LDRjtGCINGB0L4g0YjQutCw0LvQvtC5INC60L7QvdGC0YDQvtC70L7QsgogICAqIChgeHPigKZsZ2ApINC4INC20LjQstGD0YIg0YLQvtC60LXQvdCw0LzQuCwg0LAg0L3QtSDQu9C40YLQtdGA0LDQu9Cw0LzQuCDQsiDQutC+0LzQv9C+0L3QtdC90YLQtTog0LjQutC+0L3QutCwINC+0LHRj9C30LDQvdCwCiAgICog0LzQsNGB0YjRgtCw0LHQuNGA0L7QstCw0YLRjNGB0Y8g0LLQvNC10YHRgtC1INGBINGC0LXQvNC+0LksINCwINC90LUg0LLQvNC10YHRgtC1INGBINC/0LXRgNC10YHQsdC+0YDQutC+0Lkg0L/QsNC60LXRgtCwLgogICAqINCf0YDQvtC40LfQstC+0LvRjNC90YvQuSDRgNCw0LfQvNC10YAg0LfQsNC00LDRkdGC0YHRjyDRh9C40YHQu9C+0Lwg0L/RgNGP0LzQviDQvdCwINC60L7QvNC/0L7QvdC10L3RgtC1IOKAlCDRjdGC0L4gZXNjYXBlLWhhdGNoLAogICAqINCwINC90LUg0YfQsNGB0YLRjCDRiNC60LDQu9GLLgogICAqLwogIC0tZ3ItaWNvbi1zaXplLXhzOiAxNHB4OwogIC0tZ3ItaWNvbi1zaXplLXNtOiAxNnB4OwogIC0tZ3ItaWNvbi1zaXplLW1kOiAxOHB4OwogIC0tZ3ItaWNvbi1zaXplLWxnOiAyMHB4OwoKICAvKiBTaGFwZXM6IHJhZGlpIGFuZCBjb21wYXRpYmlsaXR5IGFsaWFzZXMgKi8KICAtLXJhZGl1czogMC41cmVtOwogIC0tZ3ItcmFkaXVzLW5vbmU6IDBweDsKICAtLWdyLXJhZGl1cy14czogM3B4OwogIC0tZ3ItcmFkaXVzLXNtOiA0cHg7CiAgLS1nci1yYWRpdXMtY29udHJvbDogNnB4OwogIC0tZ3ItcmFkaXVzLW1kOiA4cHg7CiAgLS1nci1yYWRpdXMtbGc6IDEycHg7CiAgLS1nci1yYWRpdXMteGw6IDE2cHg7CiAgLS1nci1yYWRpdXMtZnVsbDogOTk5OXB4OwoKICAvKiBFbGV2YXRpb24gKi8KICAtLWdyLXNoYWRvdy0wOiBub25lOwogIC0tZ3Itc2hhZG93LTE6IDAgMXB4IDJweCByZ2JhKDE1LCAyMywgNDIsIDAuMDgpOwogIC0tZ3Itc2hhZG93LTI6IDAgOHB4IDI0cHggcmdiYSgxNSwgMjMsIDQyLCAwLjE0KTsKICAtLWdyLXNoYWRvdy0zOiAwIDE2cHggNDhweCByZ2JhKDE1LCAyMywgNDIsIDAuMjApOwoKICAvKiBNb3Rpb24gKi8KICAtLWdyLWR1cmF0aW9uLWZhc3Q6IDE1MG1zOwogIC0tZ3ItZHVyYXRpb24tYmFzZTogMjAwbXM7CiAgLS1nci1kdXJhdGlvbi1zbG93OiAzMDBtczsKICAtLWdyLWVhc2Utb3V0OiBjdWJpYy1iZXppZXIoMC4xNiwgMSwgMC4zLCAxKTsKICAtLWdyLWVhc2UtaW46IGN1YmljLWJlemllcigwLjcsIDAsIDAuODQsIDApOwoKICAvKgogICAqIExheWVyaW5nOiB6LWluZGV4IHNjYWxlCiAgICoKICAgKiDQldC00LjQvdGL0Lkg0LjRgdGC0L7Rh9C90LjQuiDQuNGB0YLQuNC90Ysg0LTQu9GPINGB0LvQvtGR0LIg0LLRgdC10YUg0LrQvtC80L/QvtC90LXQvdGC0L7Qsiwg0LjRgdC/0L7Qu9GM0LfRg9GO0YnQuNGFIGBwb3NpdGlvbjogZml4ZWRgCiAgICog0L/QvtCy0LXRgNGFINC+0YHRgtCw0LvRjNC90L7Qs9C+INC60L7QvdGC0LXQvdGC0LAuINCf0YDQsNCy0LjQu9C+OiDRh9C10Lwg0LLRi9GI0LUg0LIgVUkt0YHRgtC10LrQtSDRgdC70L7QuSDQvtCx0Y/Qt9Cw0L0g0L7QutCw0LfQsNGC0YzRgdGPLAogICAqINGC0LXQvCDQsdC+0LvRjNGI0LUg0LfQvdCw0YfQtdC90LjQtS4gRmxvYXRpbmct0L/QsNC90LXQu9C4IChkcm9wZG93bi9zZWxlY3QvdHJlZS1zZWxlY3QvdG9vbHRpcCkg0YHRgtC+0Y/RggogICAqINC90LjQttC1INC80L7QtNCw0LvQvtC6LCDRh9GC0L7QsdGLINC/0L7Qv9C+0LLQtdGALCDQvtGC0LrRgNGL0YLRi9C5INCS0J3Qo9Ci0KDQmCDQvNC+0LTQsNC70LrQuCwg0L3QtSDQv9C+0YLQtdGA0Y/Qu9GB0Y8g0L/QvtC0INC90LXQuSwg0L3QvgogICAqINGB0LDQvCDRjdGC0L7RgiDQv9C+0L/QvtCy0LXRgCDQvdC1INC+0LHRj9C30LDQvSDQv9C10YDQtdC60YDRi9Cy0LDRgtGMINC80L7QtNCw0LvQutGDINGB0L3QsNGA0YPQttC4IOKAlCDQt9CwINC/0YDQtdC00LXQu9GLINGB0LLQvtC10LPQviDQtNC10YDQtdCy0LAKICAgKiBmbG9hdGluZy3QutC+0LzQv9C+0L3QtdC90YLRiyDQvdC1INCy0YvRhdC+0LTRj9GCINC/0L4g0L/QvtGB0YLRgNC+0LXQvdC40Y4gKHYtY2xpY2stb3V0c2lkZS9wb3J0YWwg0YDRj9C00L7QvCDRgSDRgtGA0LjQs9Cz0LXRgNC+0LwpLgogICAqINCi0L7RgdGC0Ysg4oCUINC10LTQuNC90YHRgtCy0LXQvdC90YvQuSDRgdC70L7QuSwg0LrQvtGC0L7RgNGL0Lkg0L7QsdGP0LfQsNC9INCx0YvRgtGMINCy0LjQtNC10L0g0L/QvtCy0LXRgNGFINCw0LHRgdC+0LvRjtGC0L3QviDQstGB0LXQs9C+LAogICAqINCy0LrQu9GO0YfQsNGPINC+0YLQutGA0YvRgtGL0LUg0LzQvtC00LDQu9C60LggKNGN0YLQviDRg9Cy0LXQtNC+0LzQu9C10L3QuNC1INGD0YDQvtCy0L3RjyDQv9GA0LjQu9C+0LbQtdC90LjRjykuCiAgICovCiAgLS1nci16LWJvdHRvbS1uYXY6IDg1MDsKICAtLWdyLXotbmF2YmFyOiA5MDA7CiAgLS1nci16LWRyb3Bkb3duOiAxMDAwOwogIC0tZ3Itei10b29sdGlwOiAxMDUwOwogIC0tZ3Itei1tb2RhbDogMTEwMDsKICAtLWdyLXotbG9hZGluZzogMTE1MDsKICAtLWdyLXotdG9hc3Q6IDEyMDA7CgogIC8qIERlcml2ZWQgaW50ZXJhY3Rpb24gZm9ybXVsYXM6IGFjdGlvbiByb2xlcyAqLwogIC0tZ3ItcHJpbWFyeS1ob3ZlcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWdyLXByaW1hcnkpIDkyJSwgdmFyKC0tZ3ItZmcpKTsKICAtLWdyLXByaW1hcnktYWN0aXZlOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tZ3ItcHJpbWFyeSkgODQlLCB2YXIoLS1nci1mZykpOwogIC0tZ3Itc2Vjb25kYXJ5LWhvdmVyOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tZ3Itc2Vjb25kYXJ5KSA5MiUsIHZhcigtLWdyLWZnKSk7CiAgLS1nci1zZWNvbmRhcnktYWN0aXZlOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tZ3Itc2Vjb25kYXJ5KSA4NCUsIHZhcigtLWdyLWZnKSk7CiAgLS1nci1icmQtaG92ZXI6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1nci1icmQpIDcwJSwgdmFyKC0tZ3ItZmcpKTsKICAtLWdyLWJyZC1hY3RpdmU6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1nci1icmQpIDU1JSwgdmFyKC0tZ3ItZmcpKTsKCiAgLyogRGVyaXZlZCBpbnRlcmFjdGlvbiBmb3JtdWxhczogc3RhdHVzIHJvbGVzICovCiAgLS1nci1zdWNjZXNzLWhvdmVyOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tZ3Itc3VjY2VzcykgOTIlLCB2YXIoLS1nci1mZykpOwogIC0tZ3Itc3VjY2Vzcy1hY3RpdmU6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1nci1zdWNjZXNzKSA4NCUsIHZhcigtLWdyLWZnKSk7CiAgLS1nci13YXJuaW5nLWhvdmVyOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tZ3Itd2FybmluZykgOTIlLCB2YXIoLS1nci1mZykpOwogIC0tZ3Itd2FybmluZy1hY3RpdmU6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1nci13YXJuaW5nKSA4NCUsIHZhcigtLWdyLWZnKSk7CiAgLS1nci1kYW5nZXItaG92ZXI6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1nci1kYW5nZXIpIDkyJSwgdmFyKC0tZ3ItZmcpKTsKICAtLWdyLWRhbmdlci1hY3RpdmU6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1nci1kYW5nZXIpIDg0JSwgdmFyKC0tZ3ItZmcpKTsKICAtLWdyLWluZm8taG92ZXI6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1nci1pbmZvKSA5MiUsIHZhcigtLWdyLWZnKSk7CiAgLS1nci1pbmZvLWFjdGl2ZTogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWdyLWluZm8pIDg0JSwgdmFyKC0tZ3ItZmcpKTsKICAtLWdyLXNsYXRlLWhvdmVyOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tZ3Itc2xhdGUpIDkyJSwgdmFyKC0tZ3ItZmcpKTsKICAtLWdyLXNsYXRlLWFjdGl2ZTogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWdyLXNsYXRlKSA4NCUsIHZhcigtLWdyLWZnKSk7CiAgLS1nci1henVyZS1ob3ZlcjogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWdyLWF6dXJlKSA5MiUsIHZhcigtLWdyLWZnKSk7CiAgLS1nci1henVyZS1hY3RpdmU6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1nci1henVyZSkgODQlLCB2YXIoLS1nci1mZykpOwp9Cg==", "" + import.meta.url).href,
98
99
  themes: {
99
- light: new URL("data:text/css;base64,LyoKICog0KHQk9CV0J3QldCg0JjQoNCe0JLQkNCd0J4gYHlhcm4gZ2VuZXJhdGU6dG9rZW5zYCDQuNC3IGB0b2tlbnMvKi5qc29uYCDigJQg0L/RgNCw0LLQutC4INC30LTQtdGB0Ywg0L/QvtGC0LXRgNGP0Y7RgtGB0Y8uCiAqINCc0LXQvdGP0YLRjCDQt9C90LDRh9C10L3QuNGPINC4INC60L7QvNC80LXQvdGC0LDRgNC40Lgg0L3Rg9C20L3QviDQsiBKU09OLCDQt9Cw0YLQtdC8INC/0LXRgNC10LPQtdC90LXRgNC40YDQvtCy0LDRgtGMLgogKi8KOnJvb3QgewogIC8qIFN1cmZhY2Ugcm9sZXMgKi8KICAtLWdyLWJnOiAjZjhmYWZjOwogIC0tZ3ItZmc6ICMwZjE3MmE7CiAgLS1nci1jYXJkOiAjZmZmZmZmOwogIC0tZ3ItY2FyZC1mZzogIzBmMTcyYTsKICAtLWdyLXBvcG92ZXI6ICNmZmZmZmY7CiAgLS1nci1wb3BvdmVyLWZnOiAjMGYxNzJhOwogIC0tZ3ItbXV0ZWQ6ICNmMWY1Zjk7CiAgLyoKICAgKiDQktGC0L7RgNC40YfQvdGL0Lkg0YLQtdC60YHRgiDQvtCx0Y/Qt9Cw0L0g0L/RgNC+0YXQvtC00LjRgtGMIEFBINC90LAg0KHQkNCc0J7QnCDQotCB0JzQndCe0Jwg0LjQtyDRhNC+0L3QvtCyLCDQvdCwINC60L7RgtC+0YDRi9GFCiAgICog0L7QvSDQv9C+0Y/QstC70Y/QtdGC0YHRjywg0LAg0Y3RgtC+INC90LUg0YHRgtGA0LDQvdC40YbQsCwg0LAgYC0tZ3Itc2Vjb25kYXJ5YCAoI2UyZThmMCkuINCf0YDQtdC20L3QuNC5CiAgICogIzY0NzQ4YiDQtNC10YDQttCw0LvRgdGPINGC0L7Qu9GM0LrQviDQvdCwIGAtLWdyLWJnYCAoNC41NSkg0LggYC0tZ3ItY2FyZGAgKDQuNzYpLCDQvdC+CiAgICog0L/RgNC+0LLQsNC70LjQstCw0LvRgdGPINC90LAgYC0tZ3ItbXV0ZWRgICg0LjM0KSDQuCBgLS1nci1zZWNvbmRhcnlgICgzLjg2KSDigJQg0YLQviDQtdGB0YLRjAogICAqINGA0L7QstC90L4g0YLQsNC8LCDQs9C00LUg0LLRgtC+0YDQuNGH0L3Ri9C5INGC0LXQutGB0YIg0Lgg0LbQuNCy0ZHRgjog0YfQuNC/0YssINGC0LDQsdC70LjRhtGLLCDQv9C+0LTQv9C40YHQuCDQsiDQv9Cw0L3QtdC70Y/RhS4KICAgKiAjNTU2Mjc1INC00LDRkdGCINC80LjQvdC40LzRg9C8IDUuMDIg0L/QviDQstGB0LXQvCDRh9C10YLRi9GA0ZHQvCDRhNC+0L3QsNC8LgogICAqLwogIC0tZ3ItbXV0ZWQtZmc6ICM1NTYyNzU7CiAgLS1nci1zZWNvbmRhcnk6ICNlMmU4ZjA7CiAgLS1nci1zZWNvbmRhcnktZmc6ICMxZTI5M2I7CiAgLS1nci1vdmVybGF5LWJnOiByZ2IoMTUgMjMgNDIgLyAwLjQ1KTsKICAtLWdyLWJyZDogI2UyZThmMDsKICAtLWdyLWlucHV0OiAjZTJlOGYwOwogIC0tZ3ItcmluZzogIzYzNjZmMTsKCiAgLyogU3RhdGUgcm9sZXMgKi8KICAtLWdyLWRpc2FibGVkLWJnOiAjZjFmNWY5OwogIC0tZ3ItZGlzYWJsZWQtZmc6ICM5NGEzYjg7CiAgLS1nci1kaXNhYmxlZC1icmQ6ICNlMmU4ZjA7CiAgLyoKICAgKiDQntGI0LjQsdC60LAg0LLQsNC70LjQtNCw0YbQuNC4INC4INC00LXQutC+0YDQsNGC0LjQstC90YvQuSDRgtC+0L0gYHN0YXRlPSJkYW5nZXIiYCDigJQg0YDQsNC30L3Ri9C1INCy0LXRidC4LCDRhdC+0YLRjwogICAqINCy0YvQs9C70Y/QtNGP0YIg0L7QtNC40L3QsNC60L7QstC+INC/0L4g0YPQvNC+0LvRh9Cw0L3QuNGOLiDQodGB0YvQu9C60LAsINCwINC90LUg0LrQvtC/0LjRjyBoZXg6INGC0LXQvNCwLCDQv9C+0LzQtdC90Y/QstGI0LDRjwogICAqINGC0L7Qu9GM0LrQviBgLS1nci1kYW5nZXJgLCDQvdC1INC+0LHRj9C30LDQvdCwINC/0L7QvNC90LjRgtGMINC/0YDQviDQstGC0L7RgNC+0Lkg0L3QsNCx0L7RgCwg0LAg0YLQtdC80LAsINC60L7RgtC+0YDQvtC5CiAgICog0L3Rg9C20LXQvSDQvtGC0LTQtdC70YzQvdGL0Lkg0YbQstC10YIg0L7RiNC40LHQutC4LCDQv9C10YDQtdC60YDQsNGI0LjQstCw0LXRgiDRgtGA0Lgg0YDQvtC70Lgg0Lgg0L3QtSDRgtGA0L7Qs9Cw0LXRgiBkYW5nZXIt0YLQvtC9LgogICAqLwogIC0tZ3ItaW52YWxpZC1icmQ6IHZhcigtLWdyLWRhbmdlcik7CiAgLS1nci1pbnZhbGlkLXJpbmc6IHZhcigtLWdyLWRhbmdlcik7CiAgLS1nci1pbnZhbGlkLXRleHQ6IHZhcigtLWdyLWRhbmdlci10ZXh0KTsKCiAgLyogQWN0aW9uIHJvbGVzICovCiAgLS1nci1wcmltYXJ5OiAjNGY0NmU1OwogIC0tZ3ItcHJpbWFyeS1mZzogI2ZmZmZmZjsKICAtLWdyLWFjY2VudDogI2VlZjJmZjsKICAtLWdyLWFjY2VudC1mZzogIzM3MzBhMzsKCiAgLyogU3RhdHVzIHJvbGVzICovCiAgLyoKICAgKiBgLWZnYCDigJQg0YbQstC10YIg0YLQtdC60YHRgtCwINCd0JAg0YHQv9C70L7RiNC90L7QuSDQt9Cw0LvQuNCy0LrQtSDRgtC+0L3QvtC8LiDQoyDRgdCy0LXRgtC70YvRhSDQt9Cw0LvQuNCy0L7QuiDQvtC9INC+0LHRj9C30LDQvQogICAqINCx0YvRgtGMINGC0ZHQvNC90YvQvDog0LHQtdC70YvQuSDQvdCwIGAtLWdyLXN1Y2Nlc3NgINC00LDRkdGCIDIuNTQ6MSwg0L3QsCBgLS1nci13YXJuaW5nYCAyLjgwOjEKICAgKiDQv9GA0Lgg0L/QvtGA0L7Qs9C1IEFBIDQuNSDigJQg0LAg0Y3RgtC+IHNvbGlkLdC60L3QvtC/0LrQuCDQuCDQsdC10LnQtNC20LggKGBnckJ1dHRvblN0eWxlcy50c2AsCiAgICogYGdyQmFkZ2VTdHlsZXMudHNgKS4g0KEgYC0tZ3ItZmdgINC/0L7Qu9GD0YfQsNC10LwgNy4wNCDQuCA2LjM3LCDQuCBob3Zlci9hY3RpdmUsCiAgICog0LrQvtGC0L7RgNGL0LUg0YPQstC+0LTRj9GCINC30LDQu9C40LLQutGDINCyINGC0ZHQvNC90YPRjiDRgdGC0L7RgNC+0L3Rgywg0L7RgdGC0LDRjtGC0YHRjyDQstGL0YjQtSDQv9C+0YDQvtCz0LAgKDUuMzAgLyA0Ljc5KS4KICAgKiDQkiDRgtGR0LzQvdC+0Lkg0YLQtdC80LUg0Y3RgtC4INGC0L7QutC10L3RiyDRg9C20LUg0YLRkdC80L3Ri9C1IOKAlCDRgtCw0Lwg0LfQsNC70LjQstC60Lgg0YHQstC10YLQu9C10LUg0YTQvtC90LAuCiAgICovCiAgLS1nci1zdWNjZXNzOiAjMTBiOTgxOwogIC0tZ3Itc3VjY2Vzcy1saWdodDogI2QxZmFlNTsKICAtLWdyLXN1Y2Nlc3MtZmc6ICMwZjE3MmE7CiAgLS1nci1wcmltYXJ5LXRleHQ6ICMzNzMwYTM7CiAgLS1nci1zdWNjZXNzLXRleHQ6ICMwNjVmNDY7CiAgLS1nci13YXJuaW5nOiAjZjk3MzE2OwogIC0tZ3Itd2FybmluZy1saWdodDogI2ZmZWRkNTsKICAtLWdyLXdhcm5pbmctZmc6ICMwZjE3MmE7CiAgLS1nci13YXJuaW5nLXRleHQ6ICM3YzJkMTI7CiAgLS1nci1kYW5nZXI6ICNkYzI2MjY7CiAgLS1nci1kYW5nZXItbGlnaHQ6ICNmZWUyZTI7CiAgLS1nci1kYW5nZXItZmc6ICNmZmZmZmY7CiAgLS1nci1kYW5nZXItdGV4dDogIzk5MWIxYjsKICAvKgogICAqINCh0LjQvdC40LksINCwINC90LUg0LjQvdC00LjQs9C+LiDQn9GA0LXQttC90LjQuSBgIzU4NTBlY2Ag0L7RgtC70LjRh9Cw0LvRgdGPINC+0YIgYC0tZ3ItcHJpbWFyeWAg0L3QsCDOlEUgNC4zCiAgICog0L/RgNC4INC/0L7RgNC+0LPQtSDQt9Cw0LzQtdGC0L3QvtGB0YLQuCDQvtC60L7Qu9C+IDIuMywg0LAg0YLQtdC60YHRgtC+0LLRi9C1INGA0L7Qu9C4INC+0LHQvtC40YUg0YLQvtC90L7QsiDRgdC+0LLQv9Cw0LTQsNC70LgKICAgKiDQt9C90LDRh9C10L3QuNC10Lwg0L/QvtC70L3QvtGB0YLRjNGOIOKAlCDRgdGB0YvQu9C60LAgYHRvbmU9ImluZm8iYCDQuCDRgdGB0YvQu9C60LAgYHRvbmU9InByaW1hcnkiYAogICAqINC60YDQsNGB0LjQu9C40YHRjCDQvtC00LjQvdCw0LrQvtCy0L4uINCi0L7QvSDQt9Cw0L3Rj9C7INGB0L7QsdGB0YLQstC10L3QvdGL0Lkg0YPRh9Cw0YHRgtC+0Log0L/QsNC70LjRgtGA0Ys6INC+0L0g0L7RgtC70LjRh9C40Lwg0Lgg0L7RggogICAqIGBwcmltYXJ5YCAozpRFIDIxINCyINGB0LLQtdGC0LvQvtC5INGC0LXQvNC1LCAyOSDQsiDRgtGR0LzQvdC+0LkpLCDQuCDQvtGCIGBhenVyZWAgKDQ4INC4IDIyKS4KICAgKiDQl9Cw0LzRi9GB0LXQuyDQsdGL0Lsg0YLQsNC60L7QuSDQuCDRgNCw0L3RjNGI0LUg4oCUINGC0ZHQvNC90LDRjyDRgtC10LzQsCDRg9C20LUg0L7RgtC60LDQt9GL0LLQsNC70LDRgdGMINCx0YDQsNGC0YwgaW5kaWdvLTQwMAogICAqINC40LzQtdC90L3QviDQv9C+0YLQvtC80YMsINGH0YLQviBzb2xpZC3QsdC10LnQtNC20LggcHJpbWFyeSDQuCBpbmZvINGB0YLQsNC70Lgg0LHRiyDQvdC10L7RgtC70LjRh9C40LzRiy4KICAgKi8KICAtLWdyLWluZm86ICMyNTYzZWI7CiAgLS1nci1pbmZvLWxpZ2h0OiAjZGJlYWZlOwogIC0tZ3ItaW5mby1mZzogI2ZmZmZmZjsKICAtLWdyLWluZm8tdGV4dDogIzFlNDBhZjsKICAtLWdyLXNsYXRlOiAjNDc1NTY5OwogIC0tZ3Itc2xhdGUtbGlnaHQ6ICNlMmU4ZjA7CiAgLS1nci1zbGF0ZS1mZzogI2ZmZmZmZjsKICAtLWdyLXNsYXRlLXRleHQ6ICMzMzQxNTU7CiAgLyoKICAgKiBBenVyZSDigJQg0LXQtNC40L3RgdGC0LLQtdC90L3Ri9C5INGC0L7QvSwg0LrQvtGC0L7RgNGL0Lkg0L3QtSDRh9C40L3QuNGC0YHRjyDRgdC80LXQvdC+0LkgYC1mZ2AuINCi0ZHQvNC90YvQuSDRgtC10LrRgdGCCiAgICog0L/RgNC+0YXQvtC00LjRgiDQvdCwINCx0LDQt9C1ICg2LjQ0KSwg0L3QviBob3Zlci9hY3RpdmUg0YPQstC+0LTRj9GCINC30LDQu9C40LLQutGDINCy0L3QuNC3INC4INC70L7QvNCw0Y7RgiDQtdCz0L4KICAgKiAoNC4zNiAvIDMuMDEpOyDQsdC10LvRi9C5INC20LUg0L3QtSDQv9GA0L7RhdC+0LTQuNGCINC90LAg0LHQsNC30LUgKDIuNzcpLiDQktGL0YXQvtC0INC+0LTQuNC9IOKAlCDRgdCw0LzQsAogICAqINC30LDQu9C40LLQutCwOiBza3ktNTAwIGAjMGVhNWU5YCDRgdC70LjRiNC60L7QvCDRgdCy0LXRgtC70LDRjyDQtNC70Y8g0LHQtdC70L7Qs9C+INGC0LXQutGB0YLQsC4gYCMwMDc3YjZgIOKAlAogICAqINGB0LDQvNC+0LUg0YHQstC10YLQu9C+0LUg0LfQvdCw0YfQtdC90LjQtSwg0LTQsNGO0YnQtdC1INC30LDQv9Cw0YEg0L/QviDQstGB0LXQvCDRgtGA0ZHQvCDRgdC+0YHRgtC+0Y/QvdC40Y/QvAogICAqICg0Ljg3IC8gNS40NCAvIDYuMDIpINC4INC30LDQvtC00L3QviDQv9C+0LTQvdC40LzQsNGO0YnQtdC1IGF6dXJlLdC40LrQvtC90LrRgyDQvdCwIGAtbGlnaHRgCiAgICog0L/QvtC00LvQvtC20LrQtSDRgSAyLjQyINC00L4gNC4yNC4g0J7RgtGC0LXQvdC+0Log0L7RgdGC0LDRkdGC0YHRjyDQvtGC0LvQuNGH0LjQvNGL0Lwg0L7RgiBgLS1nci1pbmZvYC4KICAgKi8KICAtLWdyLWF6dXJlOiAjMDA3N2I2OwogIC0tZ3ItYXp1cmUtbGlnaHQ6ICNlMGYyZmU7CiAgLS1nci1henVyZS1mZzogI2ZmZmZmZjsKICAtLWdyLWF6dXJlLXRleHQ6ICMwNzU5ODU7CgogIC8qCiAgICogU29saWQgZmlsbCByb2xlcwogICAqCiAgICog0KHQv9C70L7RiNC90LDRjyDQt9Cw0LvQuNCy0LrQsCDQutC90L7Qv9C+0YfQvdC+0LPQviDQstC10YHQsCDQuCDQtdGRINGC0LXQutGB0YIuCiAgICoKICAgKiDQntGCINGA0L7Qu9C4INCx0LXQtyDRgdGD0YTRhNC40LrRgdCwINC+0YLQu9C40YfQsNC10YLRgdGPINC/0L7RgNC+0LPQvtC8LiBgLS1nci17dG9uZX1gINGA0LDRgdGB0YfQuNGC0LDQvSDQvdCwIDM6MSDQugogICAqINGE0L7QvdGDINGB0YLRgNCw0L3QuNGG0Ysg4oCUINGN0YLQviDQuNC90LTQuNC60LDRgtC+0YAsINCz0YDQsNC90LjRhtCwLCDQsdC10LnQtNC2LCDigJQg0Lgg0YLQtdC60YHRgiDQvdCwINC90ZHQvCDQsdC10YDRkdGC0YHRjyDQuNC3CiAgICogYC1mZ2AsINGDINGB0LLQtdGC0LvRi9GFINC30LDQu9C40LLQvtC6INGC0ZHQvNC90YvQuS4gYC1zb2xpZGAg0YDQsNGB0YHRh9C40YLQsNC9INC90LAgNC41OjEg0L/QvtC0INCh0JLQldCi0JvQq9CZCiAgICog0YLQtdC60YHRgjogc29saWQt0LrQvdC+0L/QutC4INCy0YHQtdGFINGC0L7QvdC+0LIg0L7QsdGP0LfQsNC90Ysg0LLRi9Cz0LvRj9C00LXRgtGMINC+0LTQvdC+0Lkg0YHQtdC80YzRkdC5LCDQsCDQsdC70LXQtNC90L4tCiAgICog0LfQtdC70ZHQvdCw0Y8g0LrQvdC+0L/QutCwINGA0Y/QtNC+0Lwg0YEg0YLRkdC80L3Qvi3QutGA0LDRgdC90L7QuSDRh9C40YLQsNC10YLRgdGPINC60LDQuiDQvtGI0LjQsdC60LAg0LLRkdGA0YHRgtC60LguCiAgICoKICAgKiDQotCw0LwsINCz0LTQtSDQs9C70L7QsdCw0LvRjNC90YvQuSDRgtC+0L0g0YPQttC1INC00L7RgdGC0LDRgtC+0YfQvdC+INGC0ZHQvNC10L0sIGAtc29saWRgIOKAlCDRgdGB0YvQu9C60LAg0L3QsCDQvdC10LPQvi4KICAgKiDQodC+0LHRgdGC0LLQtdC90L3Ri9C1INC30L3QsNGH0LXQvdC40Y8g0L3Rg9C20L3RiyDRgtGA0ZHQvCDRgtC+0L3QsNC8OiDQsdC10LvRi9C5INGC0LXQutGB0YIg0LTQsNGR0YIgNS40OCAvIDYuNDUgLyA3LjcxCiAgICog0L3QsCDQt9Cw0YLQtdC80L3RkdC90L3QvtC8IHN1Y2Nlc3Mg0LggNS4xOCDQvdCwINC30LDRgtC10LzQvdGR0L3QvdC+0Lwgd2FybmluZywg0YLQvtCz0LTQsCDQutCw0Log0LPQu9C+0LHQsNC70YzQvdGL0LkKICAgKiBgLWZnYCDRgtCw0Lwg0YLRkdC80L3Ri9C5INC4INC90LAg0YLQvtC5INC20LUg0LfQsNC70LjQstC60LUg0LTQsNC7INCx0YsgMy4yNiDQuCAzLjQ1LiBBenVyZSDQvdC1INGH0LjQvdC40YLRgdGPCiAgICog0YHQvNC10L3QvtC5IGAtZmdgINCy0L7QstGB0LUgKNGB0LwuINC/0YDQuNC80LXRh9Cw0L3QuNC1INC6IGAtLWdyLWF6dXJlYCkuCiAgICoKICAgKiBob3ZlciDQuCBhY3RpdmUg0LfQsNC00LDQvdGLINC30L3QsNGH0LXQvdC40Y/QvNC4LCDQsCDQvdC1INC+0LHRidC10Lkg0YTQvtGA0LzRg9C70L7QuSDQv9C+0LTQvNC10YHQsDog0L7QvdC4INCy0YvQsdGA0LDQvdGLCiAgICog0YHRgtGD0L/QtdC90Y/QvNC4INC/0LDQu9C40YLRgNGLLCDQuCDRhNC+0YDQvNGD0LvQsCDRgdC00LLQuNC90YPQu9CwINCx0YsgYXp1cmUtYWN0aXZlINC90LAgMzIg0LXQtNC40L3QuNGG0Ysg0LrQsNC90LDQu9CwLgogICAqLwogIC0tZ3ItcHJpbWFyeS1zb2xpZDogdmFyKC0tZ3ItcHJpbWFyeSk7CiAgLS1nci1wcmltYXJ5LXNvbGlkLWhvdmVyOiB2YXIoLS1nci1wcmltYXJ5LWhvdmVyKTsKICAtLWdyLXByaW1hcnktc29saWQtYWN0aXZlOiB2YXIoLS1nci1wcmltYXJ5LWFjdGl2ZSk7CiAgLS1nci1wcmltYXJ5LXNvbGlkLWZnOiB2YXIoLS1nci1wcmltYXJ5LWZnKTsKICAtLWdyLXN1Y2Nlc3Mtc29saWQ6ICMwNDc4NTc7CiAgLS1nci1zdWNjZXNzLXNvbGlkLWhvdmVyOiAjMDM2YzRkOwogIC0tZ3Itc3VjY2Vzcy1zb2xpZC1hY3RpdmU6ICMwMjVmNDQ7CiAgLS1nci1zdWNjZXNzLXNvbGlkLWZnOiB2YXIoLS1nci1zbGF0ZS0wKTsKICAtLWdyLXdhcm5pbmctc29saWQ6ICNjMjQxMGM7CiAgLS1nci13YXJuaW5nLXNvbGlkLWhvdmVyOiAjYjUzYjBhOwogIC0tZ3Itd2FybmluZy1zb2xpZC1hY3RpdmU6ICM5ZjMzMDc7CiAgLS1nci13YXJuaW5nLXNvbGlkLWZnOiB2YXIoLS1nci1zbGF0ZS0wKTsKICAtLWdyLWRhbmdlci1zb2xpZDogdmFyKC0tZ3ItZGFuZ2VyKTsKICAtLWdyLWRhbmdlci1zb2xpZC1ob3ZlcjogdmFyKC0tZ3ItZGFuZ2VyLWhvdmVyKTsKICAtLWdyLWRhbmdlci1zb2xpZC1hY3RpdmU6IHZhcigtLWdyLWRhbmdlci1hY3RpdmUpOwogIC0tZ3ItZGFuZ2VyLXNvbGlkLWZnOiB2YXIoLS1nci1kYW5nZXItZmcpOwogIC0tZ3ItaW5mby1zb2xpZDogdmFyKC0tZ3ItaW5mbyk7CiAgLS1nci1pbmZvLXNvbGlkLWhvdmVyOiB2YXIoLS1nci1pbmZvLWhvdmVyKTsKICAtLWdyLWluZm8tc29saWQtYWN0aXZlOiB2YXIoLS1nci1pbmZvLWFjdGl2ZSk7CiAgLS1nci1pbmZvLXNvbGlkLWZnOiB2YXIoLS1nci1pbmZvLWZnKTsKICAtLWdyLXNsYXRlLXNvbGlkOiB2YXIoLS1nci1zbGF0ZSk7CiAgLS1nci1zbGF0ZS1zb2xpZC1ob3ZlcjogdmFyKC0tZ3Itc2xhdGUtaG92ZXIpOwogIC0tZ3Itc2xhdGUtc29saWQtYWN0aXZlOiB2YXIoLS1nci1zbGF0ZS1hY3RpdmUpOwogIC0tZ3Itc2xhdGUtc29saWQtZmc6IHZhcigtLWdyLXNsYXRlLWZnKTsKICAtLWdyLWF6dXJlLXNvbGlkOiAjMDM2OWExOwogIC0tZ3ItYXp1cmUtc29saWQtaG92ZXI6ICMwNzU5ODU7CiAgLS1nci1henVyZS1zb2xpZC1hY3RpdmU6ICMwYzRhNmU7CiAgLS1nci1henVyZS1zb2xpZC1mZzogdmFyKC0tZ3Itc2xhdGUtMCk7CgogIC8qIERhdGEgdmlzdWFsaXphdGlvbiByb2xlcyAqLwogIC0tZ3ItY2hhcnQtMTogIzRmNDZlNTsKICAtLWdyLWNoYXJ0LTI6ICMxMGI5ODE7CiAgLS1nci1jaGFydC0zOiAjZjk3MzE2OwogIC0tZ3ItY2hhcnQtNDogIzYzNjZmMTsKICAtLWdyLWNoYXJ0LTU6ICM4YjVjZjY7CgogIC8qIE5hdmlnYXRpb24gcm9sZXMgKi8KICAtLWdyLXNpZGViYXI6ICNmZmZmZmY7CiAgLS1nci1zaWRlYmFyLWZnOiAjMGYxNzJhOwogIC0tZ3Itc2lkZWJhci1wcmltYXJ5OiAjNGY0NmU1OwogIC0tZ3Itc2lkZWJhci1wcmltYXJ5LWZnOiAjZmZmZmZmOwogIC0tZ3Itc2lkZWJhci1hY2NlbnQ6ICNmMWY1Zjk7CiAgLS1nci1zaWRlYmFyLWFjY2VudC1mZzogIzFlMjkzYjsKICAtLWdyLXNpZGViYXItYnJkOiAjZTJlOGYwOwogIC0tZ3Itc2lkZWJhci1yaW5nOiAjNjM2NmYxOwp9CgpAc3VwcG9ydHMgbm90IChjb2xvcjogY29sb3ItbWl4KGluIHNyZ2IsICMwMDAgNTAlLCAjZmZmKSkgewogIDpyb290IHsKICAgIC8qIEFjdGlvbiByb2xlIGZhbGxiYWNrcyAqLwogICAgLS1nci1wcmltYXJ5LWhvdmVyOiAjNGE0MmQ2OwogICAgLS1nci1wcmltYXJ5LWFjdGl2ZTogIzQ1M2VjNzsKICAgIC0tZ3Itc2Vjb25kYXJ5LWhvdmVyOiAjZDFkN2UwOwogICAgLS1nci1zZWNvbmRhcnktYWN0aXZlOiAjYzBjN2QwOwogICAgLS1nci1icmQtaG92ZXI6ICNhM2E5YjU7CiAgICAtLWdyLWJyZC1hY3RpdmU6ICM4MzhhOTc7CgogICAgLyogU3RhdHVzIHJvbGUgZmFsbGJhY2tzICovCiAgICAtLWdyLXN1Y2Nlc3MtaG92ZXI6ICMxMGFjN2E7CiAgICAtLWdyLXN1Y2Nlc3MtYWN0aXZlOiAjMTA5ZjczOwogICAgLS1nci13YXJuaW5nLWhvdmVyOiAjZTY2YzE4OwogICAgLS1nci13YXJuaW5nLWFjdGl2ZTogI2Q0NjQxOTsKICAgIC0tZ3ItZGFuZ2VyLWhvdmVyOiAjY2MyNTI2OwogICAgLS1nci1kYW5nZXItYWN0aXZlOiAjYmIyNDI3OwogICAgLS1nci1pbmZvLWhvdmVyOiAjMjM1ZGRjOwogICAgLS1nci1pbmZvLWFjdGl2ZTogIzIxNTdjYzsKICAgIC0tZ3Itc2xhdGUtaG92ZXI6ICM0MzUwNjQ7CiAgICAtLWdyLXNsYXRlLWFjdGl2ZTogIzNlNGI1ZjsKICAgIC0tZ3ItYXp1cmUtaG92ZXI6ICMwMTZmYWI7CiAgICAtLWdyLWF6dXJlLWFjdGl2ZTogIzAyNjhhMDsKICB9Cn0K", "" + import.meta.url).href,
100
- dark: new URL("data:text/css;base64,LyoKICog0KHQk9CV0J3QldCg0JjQoNCe0JLQkNCd0J4gYHlhcm4gZ2VuZXJhdGU6dG9rZW5zYCDQuNC3IGB0b2tlbnMvKi5qc29uYCDigJQg0L/RgNCw0LLQutC4INC30LTQtdGB0Ywg0L/QvtGC0LXRgNGP0Y7RgtGB0Y8uCiAqINCc0LXQvdGP0YLRjCDQt9C90LDRh9C10L3QuNGPINC4INC60L7QvNC80LXQvdGC0LDRgNC40Lgg0L3Rg9C20L3QviDQsiBKU09OLCDQt9Cw0YLQtdC8INC/0LXRgNC10LPQtdC90LXRgNC40YDQvtCy0LDRgtGMLgogKi8KLyoKICog0KLRkdC80L3QsNGPINGC0LXQvNCwLiDQmtCw0L3QvtC9IOKAlCDQsNGC0YDQuNCx0YPRgiBgW2RhdGEtdGhlbWU9J2RhcmsnXWAg0L3QsCBgPGh0bWw+YCAo0LXQs9C+INGB0YLQsNCy0LjRggogKiBgdXNlVGhlbWVgL2Bpbml0VGhlbWVFYXJseWApLiDQodC10LvQtdC60YLQvtGAIGAuZGFya2Ag0L7RgdGC0LDQstC70LXQvSDQtNC70Y8g0LjQvdGC0LXRgNC+0L/QsCDRgQogKiBjbGFzcy3RgdGC0YDQsNGC0LXQs9C40LXQuSBUYWlsd2luZC9Vbm9DU1M6INC/0YDQuNC70L7QttC10L3QuNC1INC80L7QttC10YIg0YPQttC1INC/0LXRgNC10LrQu9GO0YfQsNGC0Ywg0YLQtdC80YMg0LjQvC4KICovCltkYXRhLXRoZW1lPSdkYXJrJ10sCi5kYXJrIHsKICAvKiBTdXJmYWNlIHJvbGVzICovCiAgLS1nci1iZzogIzBmMTcyYTsKICAtLWdyLWZnOiAjZjhmYWZjOwogIC0tZ3ItY2FyZDogIzFlMjkzYjsKICAtLWdyLWNhcmQtZmc6ICNmOGZhZmM7CiAgLS1nci1wb3BvdmVyOiAjMWUyOTNiOwogIC0tZ3ItcG9wb3Zlci1mZzogI2Y4ZmFmYzsKICAtLWdyLW11dGVkOiAjMzM0MTU1OwogIC8qCiAgICog0KHQuNC80LzQtdGC0YDQuNGH0L3QviBsaWdodDog0LzQuNC90LjQvNGD0Lwg0L/QviDRhNC+0L3RgyBgLS1nci1tdXRlZGAvYC0tZ3Itc2Vjb25kYXJ5YCAoIzMzNDE1NSkuCiAgICog0J/RgNC10LbQvdC40LkgIzk0YTNiOCDQtNCw0LLQsNC7INGC0LDQvCA0LjA0LCAjYWFiNmM3INC00LDRkdGCIDUuMDQuCiAgICovCiAgLS1nci1tdXRlZC1mZzogI2FhYjZjNzsKICAtLWdyLXNlY29uZGFyeTogIzMzNDE1NTsKICAtLWdyLXNlY29uZGFyeS1mZzogI2YxZjVmOTsKICAtLWdyLW92ZXJsYXktYmc6IHJnYigyIDYgMjMgLyAwLjY1KTsKICAtLWdyLWJyZDogIzMzNDE1NTsKICAtLWdyLWlucHV0OiAjMzM0MTU1OwogIC0tZ3ItcmluZzogIzgxOGNmODsKCiAgLyogU3RhdGUgcm9sZXMgKi8KICAtLWdyLWRpc2FibGVkLWJnOiAjMjczNTQ4OwogIC0tZ3ItZGlzYWJsZWQtZmc6ICM2NDc0OGI7CiAgLS1nci1kaXNhYmxlZC1icmQ6ICMzMzQxNTU7CiAgLyoKICAgKiDQntGI0LjQsdC60LAg0LLQsNC70LjQtNCw0YbQuNC4INC4INC00LXQutC+0YDQsNGC0LjQstC90YvQuSDRgtC+0L0gYHN0YXRlPSJkYW5nZXIiYCDigJQg0YDQsNC30L3Ri9C1INCy0LXRidC4LCDRhdC+0YLRjwogICAqINCy0YvQs9C70Y/QtNGP0YIg0L7QtNC40L3QsNC60L7QstC+INC/0L4g0YPQvNC+0LvRh9Cw0L3QuNGOLiDQodGB0YvQu9C60LAsINCwINC90LUg0LrQvtC/0LjRjyBoZXg6INGC0LXQvNCwLCDQv9C+0LzQtdC90Y/QstGI0LDRjwogICAqINGC0L7Qu9GM0LrQviBgLS1nci1kYW5nZXJgLCDQvdC1INC+0LHRj9C30LDQvdCwINC/0L7QvNC90LjRgtGMINC/0YDQviDQstGC0L7RgNC+0Lkg0L3QsNCx0L7RgCwg0LAg0YLQtdC80LAsINC60L7RgtC+0YDQvtC5CiAgICog0L3Rg9C20LXQvSDQvtGC0LTQtdC70YzQvdGL0Lkg0YbQstC10YIg0L7RiNC40LHQutC4LCDQv9C10YDQtdC60YDQsNGI0LjQstCw0LXRgiDRgtGA0Lgg0YDQvtC70Lgg0Lgg0L3QtSDRgtGA0L7Qs9Cw0LXRgiBkYW5nZXIt0YLQvtC9LgogICAqLwogIC0tZ3ItaW52YWxpZC1icmQ6IHZhcigtLWdyLWRhbmdlcik7CiAgLS1nci1pbnZhbGlkLXJpbmc6IHZhcigtLWdyLWRhbmdlcik7CiAgLS1nci1pbnZhbGlkLXRleHQ6IHZhcigtLWdyLWRhbmdlci10ZXh0KTsKCiAgLyogQWN0aW9uIHJvbGVzICovCiAgLyoKICAgKiBQcmltYXJ5INCx0YvQuyDQtdC00LjQvdGB0YLQstC10L3QvdGL0Lwg0YLQvtC90L7QvCwg0LLRi9C/0LDQtNCw0LLRiNC40Lwg0LjQtyDQutC+0L3QstC10L3RhtC40Lgg0YLRkdC80L3QvtC5INGC0LXQvNGLCiAgICogKNGB0LLQtdGC0LvQsNGPINC30LDQu9C40LLQutCwICsg0YLRkdC80L3Ri9C5INGC0LXQutGB0YIsINC60LDQuiDRgyBzdWNjZXNzL3dhcm5pbmcvZGFuZ2VyL2luZm8vYXp1cmUpOgogICAqINC+0YHRgtCw0LLQsNC70YHRjyDRgdCy0LXRgtC70L4t0YLRkdC80L3Ri9C8INC40L3QtNC40LPQviAjNjM2NmYxINGBINCx0LXQu9GL0Lwg0YLQtdC60YHRgtC+0Lwg0Lgg0L/RgNC+0LLQsNC70LjQstCw0Lsg0YHRgNCw0LfRgwogICAqINCy0YHQtSDRgtGA0Lgg0YDQvtC70Lgg4oCUINGC0LXQutGB0YIg0L3QsCDRhNC+0L3QtSA0LjAwLCDRgtC10LrRgdGCINC90LAg0LrQsNGA0YLQvtGH0LrQtSAzLjI3LCDQsdC10LvRi9C5INC90LAKICAgKiDQt9Cw0LvQuNCy0LrQtSA0LjQ3LiDQodCy0LXRgtC70YvQuSDQuNC90LTQuNCz0L4g0YEg0YLRkdC80L3Ri9C8IGAtZmdgINC00LDRkdGCIDYuMzggLyA1LjIzIC8gNi4zOC4KICAgKiDQndC1IGluZGlnby00MDAgKCM4MThjZjgpOiDQsiDRgtGDINGB0YLQvtGA0L7QvdGDINC70LXQttC40YIgYC0tZ3ItaW5mb2AsINC4INGD0LLQtdGB0YLQuCBwcmltYXJ5CiAgICog0YLRg9C00LAg0LfQvdCw0YfQuNC70L4g0LHRiyDQstC10YDQvdGD0YLRjCDRgdC70LjRj9C90LjQtSDQtNCy0YPRhSDRgtC+0L3QvtCyLCDRgNCw0LTQuCDRgNCw0LfQstC10LTQtdC90LjRjyDQutC+0YLQvtGA0L7Qs9C+IGluZm8KICAgKiDQuCDQv9C10YDQtdC60YDQsNGI0LXQvSDQsiDRgdC40L3QuNC5LgogICAqINCa0L3QvtC/0L7QuiDQvdC1INC60LDRgdCw0LXRgtGB0Y86IEdyQnV0dG9uINC30LDQtNCw0ZHRgiDRgdCy0L7QuSBgLS1nci1idXR0b24tcHJpbWFyeS1iZ2AuCiAgICovCiAgLS1nci1wcmltYXJ5OiAjOWQ4YmZhOwogIC0tZ3ItcHJpbWFyeS1mZzogIzBmMTcyYTsKICAtLWdyLWFjY2VudDogIzFlMWI0YjsKICAtLWdyLWFjY2VudC1mZzogI2M3ZDJmZTsKCiAgLyogU3RhdHVzIHJvbGVzICovCiAgLS1nci1zdWNjZXNzOiAjMzRkMzk5OwogIC0tZ3Itc3VjY2Vzcy1saWdodDogIzA2NGUzYjsKICAtLWdyLXN1Y2Nlc3MtZmc6ICMwZjE3MmE7CiAgLS1nci1wcmltYXJ5LXRleHQ6ICNjN2QyZmU7CiAgLS1nci1zdWNjZXNzLXRleHQ6ICM2ZWU3Yjc7CiAgLS1nci13YXJuaW5nOiAjZmI5MjNjOwogIC0tZ3Itd2FybmluZy1saWdodDogIzdjMmQxMjsKICAtLWdyLXdhcm5pbmctZmc6ICMwZjE3MmE7CiAgLS1nci13YXJuaW5nLXRleHQ6ICNmZGJhNzQ7CiAgLS1nci1kYW5nZXI6ICNmODcxNzE7CiAgLS1nci1kYW5nZXItbGlnaHQ6ICM3ZjFkMWQ7CiAgLS1nci1kYW5nZXItZmc6ICMwZjE3MmE7CiAgLS1nci1kYW5nZXItdGV4dDogI2ZjYTVhNTsKICAtLWdyLWluZm86ICM2MGE1ZmE7CiAgLS1nci1pbmZvLWxpZ2h0OiAjMWUzYThhOwogIC0tZ3ItaW5mby1mZzogIzBmMTcyYTsKICAtLWdyLWluZm8tdGV4dDogI2JmZGJmZTsKICAtLWdyLXNsYXRlOiAjOTRhM2I4OwogIC0tZ3Itc2xhdGUtbGlnaHQ6ICMzMzQxNTU7CiAgLS1nci1zbGF0ZS1mZzogIzBmMTcyYTsKICAtLWdyLXNsYXRlLXRleHQ6ICNjYmQ1ZTE7CiAgLS1nci1henVyZTogIzM4YmRmODsKICAtLWdyLWF6dXJlLWxpZ2h0OiAjMGM0YTZlOwogIC0tZ3ItYXp1cmUtZmc6ICMwZjE3MmE7CiAgLS1nci1henVyZS10ZXh0OiAjYmFlNmZkOwoKICAvKgogICAqIFNvbGlkIGZpbGwgcm9sZXMKICAgKgogICAqINCh0L/Qu9C+0YjQvdCw0Y8g0LfQsNC70LjQstC60LAg0LrQvdC+0L/QvtGH0L3QvtCz0L4g0LLQtdGB0LAg0Lgg0LXRkSDRgtC10LrRgdGCLgogICAqCiAgICog0JIg0YLRkdC80L3QvtC5INGC0LXQvNC1INGB0L7QsdGB0YLQstC10L3QvdGL0LUg0LfQvdCw0YfQtdC90LjRjyDQvdGD0LbQvdGLINCy0YHQtdC8INGB0LXQvNC4INGC0L7QvdCw0Lw6INCz0LvQvtCx0LDQu9GM0L3Ri9C1CiAgICogYC0tZ3Ite3RvbmV9YCDQt9C00LXRgdGMIOKAlCDQv9Cw0YHRgtC10LvRjNC90YvQtSDQt9Cw0LvQuNCy0LrQuCDQv9C+0LQg0KLQgdCc0J3Qq9CZINGC0LXQutGB0YIsINCwINC60L3QvtC/0LrQsCDQvtCx0Y/Qt9Cw0L3QsAogICAqINC+0YHRgtCw0YLRjNGB0Y8g0L3QsNGB0YvRidC10L3QvdC+0Lkg0YHQviDRgdCy0LXRgtC70L7QuSDQv9C+0LTQv9C40YHRjNGOLgogICAqCiAgICogaG92ZXIg0LggYWN0aXZlINGD0LLQvtC00Y/RgiDQt9Cw0LvQuNCy0LrRgyDRgtC10LzQvdC10LUsINCwINC90LUg0YHQstC10YLQu9C10LU6INC+0LHRidCw0Y8g0YTQvtGA0LzRg9C70LAg0L/QvtC00LzQtdGB0LAg0LoKICAgKiBgLS1nci1mZ2Ag0LIg0YLRkdC80L3QvtC5INGC0LXQvNC1INC+0YHQstC10YLQu9GP0LvQsCDQsdGLINC60L3QvtC/0LrRgyDQv9C+0LQg0LrRg9GA0YHQvtGA0L7QvC4KICAgKi8KICAtLWdyLXByaW1hcnktc29saWQ6ICM1OTVjZTY7CiAgLS1nci1wcmltYXJ5LXNvbGlkLWhvdmVyOiAjNTA1M2RkOwogIC0tZ3ItcHJpbWFyeS1zb2xpZC1hY3RpdmU6ICM0NzRhY2Y7CiAgLS1nci1wcmltYXJ5LXNvbGlkLWZnOiB2YXIoLS1nci1zbGF0ZS0wKTsKICAtLWdyLXN1Y2Nlc3Mtc29saWQ6ICMwNDc4NTc7CiAgLS1nci1zdWNjZXNzLXNvbGlkLWhvdmVyOiAjMDM2YzRkOwogIC0tZ3Itc3VjY2Vzcy1zb2xpZC1hY3RpdmU6ICMwMjVmNDQ7CiAgLS1nci1zdWNjZXNzLXNvbGlkLWZnOiB2YXIoLS1nci1zbGF0ZS01MCk7CiAgLS1nci13YXJuaW5nLXNvbGlkOiAjYzI0MTBjOwogIC0tZ3Itd2FybmluZy1zb2xpZC1ob3ZlcjogI2I1M2IwYTsKICAtLWdyLXdhcm5pbmctc29saWQtYWN0aXZlOiAjOWYzMzA3OwogIC0tZ3Itd2FybmluZy1zb2xpZC1mZzogdmFyKC0tZ3Itc2xhdGUtNTApOwogIC0tZ3ItZGFuZ2VyLXNvbGlkOiAjYjkxYzFjOwogIC0tZ3ItZGFuZ2VyLXNvbGlkLWhvdmVyOiAjYTkxOTE5OwogIC0tZ3ItZGFuZ2VyLXNvbGlkLWFjdGl2ZTogIzkzMTUxNTsKICAtLWdyLWRhbmdlci1zb2xpZC1mZzogdmFyKC0tZ3Itc2xhdGUtNTApOwogIC0tZ3ItaW5mby1zb2xpZDogIzFkNGVkODsKICAtLWdyLWluZm8tc29saWQtaG92ZXI6ICMxZTQwYWY7CiAgLS1nci1pbmZvLXNvbGlkLWFjdGl2ZTogIzFlM2E4YTsKICAtLWdyLWluZm8tc29saWQtZmc6IHZhcigtLWdyLXNsYXRlLTUwKTsKICAtLWdyLXNsYXRlLXNvbGlkOiB2YXIoLS1nci1zbGF0ZS02MDApOwogIC0tZ3Itc2xhdGUtc29saWQtaG92ZXI6IHZhcigtLWdyLXNsYXRlLTcwMCk7CiAgLS1nci1zbGF0ZS1zb2xpZC1hY3RpdmU6IHZhcigtLWdyLXNsYXRlLTgwMCk7CiAgLS1nci1zbGF0ZS1zb2xpZC1mZzogdmFyKC0tZ3Itc2xhdGUtNTApOwogIC0tZ3ItYXp1cmUtc29saWQ6ICMwMzY5YTE7CiAgLS1nci1henVyZS1zb2xpZC1ob3ZlcjogIzA3NTk4NTsKICAtLWdyLWF6dXJlLXNvbGlkLWFjdGl2ZTogIzBjNGE2ZTsKICAtLWdyLWF6dXJlLXNvbGlkLWZnOiB2YXIoLS1nci1zbGF0ZS01MCk7CgogIC8qIERhdGEgdmlzdWFsaXphdGlvbiByb2xlcyAqLwogIC0tZ3ItY2hhcnQtMTogIzYzNjZmMTsKICAtLWdyLWNoYXJ0LTI6ICMzNGQzOTk7CiAgLS1nci1jaGFydC0zOiAjZmI5MjNjOwogIC0tZ3ItY2hhcnQtNDogIzgxOGNmODsKICAtLWdyLWNoYXJ0LTU6ICNhNzhiZmE7CgogIC8qIE5hdmlnYXRpb24gcm9sZXMgKi8KICAtLWdyLXNpZGViYXI6ICMxZTI5M2I7CiAgLS1nci1zaWRlYmFyLWZnOiAjZjhmYWZjOwogIC8qCiAgICog0JHQtdC70YvQuSDRgtC10LrRgdGCINC90LAgIzYzNjZmMSDQtNCw0ZHRgiA0LjQ3OjEg4oCUINGC0L7RgiDQttC1INC90LXQtNC+0LvRkdGCIEFBLCDQuNC3LdC30LAg0LrQvtGC0L7RgNC+0LPQvgogICAqINC/0LXRgNC10LrRgNCw0YjQtdC9IGAtLWdyLXByaW1hcnlgICjQt9Cw0LzQtdGC0LrQsCDQstGL0YjQtSkuINCX0LTQtdGB0Ywg0LLQt9GP0YIg0LzQuNC90LjQvNCw0LvRjNC90YvQuSDRiNCw0LMsINGB0L3QuNC80LDRjtGJ0LjQuQogICAqINC90LXQtNC+0LvRkdGCINCx0LXQtyDRgdC80LXQvdGLINCy0LjQtNCwOiA0LjUyOjEg0L/RgNC4IM6URSAwLjQyINC6INC/0YDQtdC20L3QtdC80YMg0YbQstC10YLRgy4KICAgKi8KICAtLWdyLXNpZGViYXItcHJpbWFyeTogIzYzNjVmMDsKICAtLWdyLXNpZGViYXItcHJpbWFyeS1mZzogI2ZmZmZmZjsKICAtLWdyLXNpZGViYXItYWNjZW50OiAjMzM0MTU1OwogIC0tZ3Itc2lkZWJhci1hY2NlbnQtZmc6ICNmMWY1Zjk7CiAgLS1nci1zaWRlYmFyLWJyZDogIzMzNDE1NTsKICAtLWdyLXNpZGViYXItcmluZzogIzgxOGNmODsKfQoKQHN1cHBvcnRzIG5vdCAoY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCAjMDAwIDUwJSwgI2ZmZikpIHsKICBbZGF0YS10aGVtZT0nZGFyayddLAogIC5kYXJrIHsKICAgIC8qIEFjdGlvbiByb2xlIGZhbGxiYWNrcyAqLwogICAgLS1nci1wcmltYXJ5LWhvdmVyOiAjYTQ5NGZhOwogICAgLS1nci1wcmltYXJ5LWFjdGl2ZTogI2FjOWRmYTsKICAgIC0tZ3Itc2Vjb25kYXJ5LWhvdmVyOiAjNDM1MDYyOwogICAgLS1nci1zZWNvbmRhcnktYWN0aXZlOiAjNTM1ZjcwOwogICAgLS1nci1icmQtaG92ZXI6ICM2ZTc5ODc7CiAgICAtLWdyLWJyZC1hY3RpdmU6ICM4Yzk0YTA7CgogICAgLyogU3RhdHVzIHJvbGUgZmFsbGJhY2tzICovCiAgICAtLWdyLXN1Y2Nlc3MtaG92ZXI6ICM0NGQ2YTE7CiAgICAtLWdyLXN1Y2Nlc3MtYWN0aXZlOiAjNTNkOWE5OwogICAgLS1nci13YXJuaW5nLWhvdmVyOiAjZmI5YTRiOwogICAgLS1nci13YXJuaW5nLWFjdGl2ZTogI2ZiYTM1YjsKICAgIC0tZ3ItZGFuZ2VyLWhvdmVyOiAjZjg3YzdjOwogICAgLS1nci1kYW5nZXItYWN0aXZlOiAjZjg4Nzg3OwogICAgLS1nci1pbmZvLWhvdmVyOiAjNmNhY2ZhOwogICAgLS1nci1pbmZvLWFjdGl2ZTogIzc4YjNmYTsKICAgIC0tZ3Itc2xhdGUtaG92ZXI6ICM5Y2FhYmQ7CiAgICAtLWdyLXNsYXRlLWFjdGl2ZTogI2E0YjFjMzsKICAgIC0tZ3ItYXp1cmUtaG92ZXI6ICM0N2MyZjg7CiAgICAtLWdyLWF6dXJlLWFjdGl2ZTogIzU3YzdmOTsKICB9Cn0K", "" + import.meta.url).href
100
+ light: new URL("data:text/css;base64,LyoKICog0KHQk9CV0J3QldCg0JjQoNCe0JLQkNCd0J4gYHlhcm4gZ2VuZXJhdGU6dG9rZW5zYCDQuNC3IGB0b2tlbnMvKi5qc29uYCDigJQg0L/RgNCw0LLQutC4INC30LTQtdGB0Ywg0L/QvtGC0LXRgNGP0Y7RgtGB0Y8uCiAqINCc0LXQvdGP0YLRjCDQt9C90LDRh9C10L3QuNGPINC4INC60L7QvNC80LXQvdGC0LDRgNC40Lgg0L3Rg9C20L3QviDQsiBKU09OLCDQt9Cw0YLQtdC8INC/0LXRgNC10LPQtdC90LXRgNC40YDQvtCy0LDRgtGMLgogKi8KOnJvb3QgewogIC8qIFN1cmZhY2Ugcm9sZXMgKi8KICAtLWdyLWJnOiAjZjhmYWZjOwogIC0tZ3ItZmc6ICMwZjE3MmE7CiAgLS1nci1jYXJkOiAjZmZmZmZmOwogIC0tZ3ItY2FyZC1mZzogIzBmMTcyYTsKICAtLWdyLXBvcG92ZXI6ICNmZmZmZmY7CiAgLS1nci1wb3BvdmVyLWZnOiAjMGYxNzJhOwogIC0tZ3ItbXV0ZWQ6ICNmMWY1Zjk7CiAgLyoKICAgKiDQktGC0L7RgNC40YfQvdGL0Lkg0YLQtdC60YHRgiDQvtCx0Y/Qt9Cw0L0g0L/RgNC+0YXQvtC00LjRgtGMIEFBINC90LAg0KHQkNCc0J7QnCDQotCB0JzQndCe0Jwg0LjQtyDRhNC+0L3QvtCyLCDQvdCwINC60L7RgtC+0YDRi9GFCiAgICog0L7QvSDQv9C+0Y/QstC70Y/QtdGC0YHRjywg0LAg0Y3RgtC+INC90LUg0YHRgtGA0LDQvdC40YbQsCwg0LAgYC0tZ3Itc2Vjb25kYXJ5YCAoI2UyZThmMCkuINCf0YDQtdC20L3QuNC5CiAgICogIzY0NzQ4YiDQtNC10YDQttCw0LvRgdGPINGC0L7Qu9GM0LrQviDQvdCwIGAtLWdyLWJnYCAoNC41NSkg0LggYC0tZ3ItY2FyZGAgKDQuNzYpLCDQvdC+CiAgICog0L/RgNC+0LLQsNC70LjQstCw0LvRgdGPINC90LAgYC0tZ3ItbXV0ZWRgICg0LjM0KSDQuCBgLS1nci1zZWNvbmRhcnlgICgzLjg2KSDigJQg0YLQviDQtdGB0YLRjAogICAqINGA0L7QstC90L4g0YLQsNC8LCDQs9C00LUg0LLRgtC+0YDQuNGH0L3Ri9C5INGC0LXQutGB0YIg0Lgg0LbQuNCy0ZHRgjog0YfQuNC/0YssINGC0LDQsdC70LjRhtGLLCDQv9C+0LTQv9C40YHQuCDQsiDQv9Cw0L3QtdC70Y/RhS4KICAgKiAjNTU2Mjc1INC00LDRkdGCINC80LjQvdC40LzRg9C8IDUuMDIg0L/QviDQstGB0LXQvCDRh9C10YLRi9GA0ZHQvCDRhNC+0L3QsNC8LgogICAqLwogIC0tZ3ItbXV0ZWQtZmc6ICM1NTYyNzU7CiAgLS1nci1zZWNvbmRhcnk6ICNlMmU4ZjA7CiAgLS1nci1zZWNvbmRhcnktZmc6ICMxZTI5M2I7CiAgLS1nci1vdmVybGF5LWJnOiByZ2IoMTUgMjMgNDIgLyAwLjQ1KTsKICAtLWdyLWJyZDogI2UyZThmMDsKICAtLWdyLWlucHV0OiAjZTJlOGYwOwogIC0tZ3ItcmluZzogIzYzNjZmMTsKCiAgLyogU3RhdGUgcm9sZXMgKi8KICAtLWdyLWRpc2FibGVkLWJnOiAjZjFmNWY5OwogIC0tZ3ItZGlzYWJsZWQtZmc6ICM5NGEzYjg7CiAgLS1nci1kaXNhYmxlZC1icmQ6ICNlMmU4ZjA7CiAgLyoKICAgKiDQntGI0LjQsdC60LAg0LLQsNC70LjQtNCw0YbQuNC4INC4INC00LXQutC+0YDQsNGC0LjQstC90YvQuSDRgtC+0L0gYHN0YXRlPSJkYW5nZXIiYCDigJQg0YDQsNC30L3Ri9C1INCy0LXRidC4LCDRhdC+0YLRjwogICAqINCy0YvQs9C70Y/QtNGP0YIg0L7QtNC40L3QsNC60L7QstC+INC/0L4g0YPQvNC+0LvRh9Cw0L3QuNGOLiDQodGB0YvQu9C60LAsINCwINC90LUg0LrQvtC/0LjRjyBoZXg6INGC0LXQvNCwLCDQv9C+0LzQtdC90Y/QstGI0LDRjwogICAqINGC0L7Qu9GM0LrQviBgLS1nci1kYW5nZXJgLCDQvdC1INC+0LHRj9C30LDQvdCwINC/0L7QvNC90LjRgtGMINC/0YDQviDQstGC0L7RgNC+0Lkg0L3QsNCx0L7RgCwg0LAg0YLQtdC80LAsINC60L7RgtC+0YDQvtC5CiAgICog0L3Rg9C20LXQvSDQvtGC0LTQtdC70YzQvdGL0Lkg0YbQstC10YIg0L7RiNC40LHQutC4LCDQv9C10YDQtdC60YDQsNGI0LjQstCw0LXRgiDRgtGA0Lgg0YDQvtC70Lgg0Lgg0L3QtSDRgtGA0L7Qs9Cw0LXRgiBkYW5nZXIt0YLQvtC9LgogICAqLwogIC0tZ3ItaW52YWxpZC1icmQ6IHZhcigtLWdyLWRhbmdlcik7CiAgLS1nci1pbnZhbGlkLXJpbmc6IHZhcigtLWdyLWRhbmdlcik7CiAgLS1nci1pbnZhbGlkLXRleHQ6IHZhcigtLWdyLWRhbmdlci10ZXh0KTsKCiAgLyogQWN0aW9uIHJvbGVzICovCiAgLS1nci1wcmltYXJ5OiAjNGY0NmU1OwogIC0tZ3ItcHJpbWFyeS1mZzogI2ZmZmZmZjsKICAtLWdyLWFjY2VudDogI2VlZjJmZjsKICAtLWdyLWFjY2VudC1mZzogIzM3MzBhMzsKCiAgLyogU3RhdHVzIHJvbGVzICovCiAgLyoKICAgKiBgLWZnYCDigJQg0YbQstC10YIg0YLQtdC60YHRgtCwINCd0JAg0YHQv9C70L7RiNC90L7QuSDQt9Cw0LvQuNCy0LrQtSDRgtC+0L3QvtC8LiDQoyDRgdCy0LXRgtC70YvRhSDQt9Cw0LvQuNCy0L7QuiDQvtC9INC+0LHRj9C30LDQvQogICAqINCx0YvRgtGMINGC0ZHQvNC90YvQvDog0LHQtdC70YvQuSDQvdCwIGAtLWdyLXN1Y2Nlc3NgINC00LDRkdGCIDIuNTQ6MSwg0L3QsCBgLS1nci13YXJuaW5nYCAyLjgwOjEKICAgKiDQv9GA0Lgg0L/QvtGA0L7Qs9C1IEFBIDQuNSDigJQg0LAg0Y3RgtC+IHNvbGlkLdC60L3QvtC/0LrQuCDQuCDQsdC10LnQtNC20LggKGBnckJ1dHRvblN0eWxlcy50c2AsCiAgICogYGdyQmFkZ2VTdHlsZXMudHNgKS4g0KEgYC0tZ3ItZmdgINC/0L7Qu9GD0YfQsNC10LwgNy4wNCDQuCA2LjM3LCDQuCBob3Zlci9hY3RpdmUsCiAgICog0LrQvtGC0L7RgNGL0LUg0YPQstC+0LTRj9GCINC30LDQu9C40LLQutGDINCyINGC0ZHQvNC90YPRjiDRgdGC0L7RgNC+0L3Rgywg0L7RgdGC0LDRjtGC0YHRjyDQstGL0YjQtSDQv9C+0YDQvtCz0LAgKDUuMzAgLyA0Ljc5KS4KICAgKiDQkiDRgtGR0LzQvdC+0Lkg0YLQtdC80LUg0Y3RgtC4INGC0L7QutC10L3RiyDRg9C20LUg0YLRkdC80L3Ri9C1IOKAlCDRgtCw0Lwg0LfQsNC70LjQstC60Lgg0YHQstC10YLQu9C10LUg0YTQvtC90LAuCiAgICovCiAgLS1nci1zdWNjZXNzOiAjMTBiOTgxOwogIC0tZ3Itc3VjY2Vzcy1saWdodDogI2QxZmFlNTsKICAtLWdyLXN1Y2Nlc3MtZmc6ICMwZjE3MmE7CiAgLS1nci1wcmltYXJ5LXRleHQ6ICMzNzMwYTM7CiAgLS1nci1zdWNjZXNzLXRleHQ6ICMwNjVmNDY7CiAgLS1nci13YXJuaW5nOiAjZjk3MzE2OwogIC0tZ3Itd2FybmluZy1saWdodDogI2ZmZWRkNTsKICAtLWdyLXdhcm5pbmctZmc6ICMwZjE3MmE7CiAgLS1nci13YXJuaW5nLXRleHQ6ICM3YzJkMTI7CiAgLS1nci1kYW5nZXI6ICNkYzI2MjY7CiAgLS1nci1kYW5nZXItbGlnaHQ6ICNmZWUyZTI7CiAgLS1nci1kYW5nZXItZmc6ICNmZmZmZmY7CiAgLS1nci1kYW5nZXItdGV4dDogIzk5MWIxYjsKICAvKgogICAqINCh0LjQvdC40LksINCwINC90LUg0LjQvdC00LjQs9C+LiDQn9GA0LXQttC90LjQuSBgIzU4NTBlY2Ag0L7RgtC70LjRh9Cw0LvRgdGPINC+0YIgYC0tZ3ItcHJpbWFyeWAg0L3QsCDOlEUgNC4zCiAgICog0L/RgNC4INC/0L7RgNC+0LPQtSDQt9Cw0LzQtdGC0L3QvtGB0YLQuCDQvtC60L7Qu9C+IDIuMywg0LAg0YLQtdC60YHRgtC+0LLRi9C1INGA0L7Qu9C4INC+0LHQvtC40YUg0YLQvtC90L7QsiDRgdC+0LLQv9Cw0LTQsNC70LgKICAgKiDQt9C90LDRh9C10L3QuNC10Lwg0L/QvtC70L3QvtGB0YLRjNGOIOKAlCDRgdGB0YvQu9C60LAgYHRvbmU9ImluZm8iYCDQuCDRgdGB0YvQu9C60LAgYHRvbmU9InByaW1hcnkiYAogICAqINC60YDQsNGB0LjQu9C40YHRjCDQvtC00LjQvdCw0LrQvtCy0L4uINCi0L7QvSDQt9Cw0L3Rj9C7INGB0L7QsdGB0YLQstC10L3QvdGL0Lkg0YPRh9Cw0YHRgtC+0Log0L/QsNC70LjRgtGA0Ys6INC+0L0g0L7RgtC70LjRh9C40Lwg0Lgg0L7RggogICAqIGBwcmltYXJ5YCAozpRFIDIxINCyINGB0LLQtdGC0LvQvtC5INGC0LXQvNC1LCAyOSDQsiDRgtGR0LzQvdC+0LkpLCDQuCDQvtGCIGBhenVyZWAgKDQ4INC4IDIyKS4KICAgKiDQl9Cw0LzRi9GB0LXQuyDQsdGL0Lsg0YLQsNC60L7QuSDQuCDRgNCw0L3RjNGI0LUg4oCUINGC0ZHQvNC90LDRjyDRgtC10LzQsCDRg9C20LUg0L7RgtC60LDQt9GL0LLQsNC70LDRgdGMINCx0YDQsNGC0YwgaW5kaWdvLTQwMAogICAqINC40LzQtdC90L3QviDQv9C+0YLQvtC80YMsINGH0YLQviBzb2xpZC3QsdC10LnQtNC20LggcHJpbWFyeSDQuCBpbmZvINGB0YLQsNC70Lgg0LHRiyDQvdC10L7RgtC70LjRh9C40LzRiy4KICAgKi8KICAtLWdyLWluZm86ICMyNTYzZWI7CiAgLS1nci1pbmZvLWxpZ2h0OiAjZGJlYWZlOwogIC0tZ3ItaW5mby1mZzogI2ZmZmZmZjsKICAtLWdyLWluZm8tdGV4dDogIzFlNDBhZjsKICAtLWdyLXNsYXRlOiAjNDc1NTY5OwogIC0tZ3Itc2xhdGUtbGlnaHQ6ICNlMmU4ZjA7CiAgLS1nci1zbGF0ZS1mZzogI2ZmZmZmZjsKICAtLWdyLXNsYXRlLXRleHQ6ICMzMzQxNTU7CiAgLyoKICAgKiBBenVyZSDigJQg0LXQtNC40L3RgdGC0LLQtdC90L3Ri9C5INGC0L7QvSwg0LrQvtGC0L7RgNGL0Lkg0L3QtSDRh9C40L3QuNGC0YHRjyDRgdC80LXQvdC+0LkgYC1mZ2AuINCi0ZHQvNC90YvQuSDRgtC10LrRgdGCCiAgICog0L/RgNC+0YXQvtC00LjRgiDQvdCwINCx0LDQt9C1ICg2LjQ0KSwg0L3QviBob3Zlci9hY3RpdmUg0YPQstC+0LTRj9GCINC30LDQu9C40LLQutGDINCy0L3QuNC3INC4INC70L7QvNCw0Y7RgiDQtdCz0L4KICAgKiAoNC4zNiAvIDMuMDEpOyDQsdC10LvRi9C5INC20LUg0L3QtSDQv9GA0L7RhdC+0LTQuNGCINC90LAg0LHQsNC30LUgKDIuNzcpLiDQktGL0YXQvtC0INC+0LTQuNC9IOKAlCDRgdCw0LzQsAogICAqINC30LDQu9C40LLQutCwOiBza3ktNTAwIGAjMGVhNWU5YCDRgdC70LjRiNC60L7QvCDRgdCy0LXRgtC70LDRjyDQtNC70Y8g0LHQtdC70L7Qs9C+INGC0LXQutGB0YLQsC4gYCMwMDc3YjZgIOKAlAogICAqINGB0LDQvNC+0LUg0YHQstC10YLQu9C+0LUg0LfQvdCw0YfQtdC90LjQtSwg0LTQsNGO0YnQtdC1INC30LDQv9Cw0YEg0L/QviDQstGB0LXQvCDRgtGA0ZHQvCDRgdC+0YHRgtC+0Y/QvdC40Y/QvAogICAqICg0Ljg3IC8gNS40NCAvIDYuMDIpINC4INC30LDQvtC00L3QviDQv9C+0LTQvdC40LzQsNGO0YnQtdC1IGF6dXJlLdC40LrQvtC90LrRgyDQvdCwIGAtbGlnaHRgCiAgICog0L/QvtC00LvQvtC20LrQtSDRgSAyLjQyINC00L4gNC4yNC4g0J7RgtGC0LXQvdC+0Log0L7RgdGC0LDRkdGC0YHRjyDQvtGC0LvQuNGH0LjQvNGL0Lwg0L7RgiBgLS1nci1pbmZvYC4KICAgKi8KICAtLWdyLWF6dXJlOiAjMDA3N2I2OwogIC0tZ3ItYXp1cmUtbGlnaHQ6ICNlMGYyZmU7CiAgLS1nci1henVyZS1mZzogI2ZmZmZmZjsKICAtLWdyLWF6dXJlLXRleHQ6ICMwNzU5ODU7CgogIC8qCiAgICogU29saWQgZmlsbCByb2xlcwogICAqCiAgICog0KHQv9C70L7RiNC90LDRjyDQt9Cw0LvQuNCy0LrQsCDQutC90L7Qv9C+0YfQvdC+0LPQviDQstC10YHQsCDQuCDQtdGRINGC0LXQutGB0YIuCiAgICoKICAgKiDQntGCINGA0L7Qu9C4INCx0LXQtyDRgdGD0YTRhNC40LrRgdCwINC+0YLQu9C40YfQsNC10YLRgdGPINC/0L7RgNC+0LPQvtC8LiBgLS1nci17dG9uZX1gINGA0LDRgdGB0YfQuNGC0LDQvSDQvdCwIDM6MSDQugogICAqINGE0L7QvdGDINGB0YLRgNCw0L3QuNGG0Ysg4oCUINGN0YLQviDQuNC90LTQuNC60LDRgtC+0YAsINCz0YDQsNC90LjRhtCwLCDQsdC10LnQtNC2LCDigJQg0Lgg0YLQtdC60YHRgiDQvdCwINC90ZHQvCDQsdC10YDRkdGC0YHRjyDQuNC3CiAgICogYC1mZ2AsINGDINGB0LLQtdGC0LvRi9GFINC30LDQu9C40LLQvtC6INGC0ZHQvNC90YvQuS4gYC1zb2xpZGAg0YDQsNGB0YHRh9C40YLQsNC9INC90LAgNC41OjEg0L/QvtC0INCh0JLQldCi0JvQq9CZCiAgICog0YLQtdC60YHRgjogc29saWQt0LrQvdC+0L/QutC4INCy0YHQtdGFINGC0L7QvdC+0LIg0L7QsdGP0LfQsNC90Ysg0LLRi9Cz0LvRj9C00LXRgtGMINC+0LTQvdC+0Lkg0YHQtdC80YzRkdC5LCDQsCDQsdC70LXQtNC90L4tCiAgICog0LfQtdC70ZHQvdCw0Y8g0LrQvdC+0L/QutCwINGA0Y/QtNC+0Lwg0YEg0YLRkdC80L3Qvi3QutGA0LDRgdC90L7QuSDRh9C40YLQsNC10YLRgdGPINC60LDQuiDQvtGI0LjQsdC60LAg0LLRkdGA0YHRgtC60LguCiAgICoKICAgKiDQotCw0LwsINCz0LTQtSDQs9C70L7QsdCw0LvRjNC90YvQuSDRgtC+0L0g0YPQttC1INC00L7RgdGC0LDRgtC+0YfQvdC+INGC0ZHQvNC10L0sIGAtc29saWRgIOKAlCDRgdGB0YvQu9C60LAg0L3QsCDQvdC10LPQvi4KICAgKiDQodC+0LHRgdGC0LLQtdC90L3Ri9C1INC30L3QsNGH0LXQvdC40Y8g0L3Rg9C20L3RiyDRgtGA0ZHQvCDRgtC+0L3QsNC8OiDQsdC10LvRi9C5INGC0LXQutGB0YIg0LTQsNGR0YIgNS40OCAvIDYuNDUgLyA3LjcxCiAgICog0L3QsCDQt9Cw0YLQtdC80L3RkdC90L3QvtC8IHN1Y2Nlc3Mg0LggNS4xOCDQvdCwINC30LDRgtC10LzQvdGR0L3QvdC+0Lwgd2FybmluZywg0YLQvtCz0LTQsCDQutCw0Log0LPQu9C+0LHQsNC70YzQvdGL0LkKICAgKiBgLWZnYCDRgtCw0Lwg0YLRkdC80L3Ri9C5INC4INC90LAg0YLQvtC5INC20LUg0LfQsNC70LjQstC60LUg0LTQsNC7INCx0YsgMy4yNiDQuCAzLjQ1LiBBenVyZSDQvdC1INGH0LjQvdC40YLRgdGPCiAgICog0YHQvNC10L3QvtC5IGAtZmdgINCy0L7QstGB0LUgKNGB0LwuINC/0YDQuNC80LXRh9Cw0L3QuNC1INC6IGAtLWdyLWF6dXJlYCkuCiAgICoKICAgKiBob3ZlciDQuCBhY3RpdmUg0LfQsNC00LDQvdGLINC30L3QsNGH0LXQvdC40Y/QvNC4LCDQsCDQvdC1INC+0LHRidC10Lkg0YTQvtGA0LzRg9C70L7QuSDQv9C+0LTQvNC10YHQsDog0L7QvdC4INCy0YvQsdGA0LDQvdGLCiAgICog0YHRgtGD0L/QtdC90Y/QvNC4INC/0LDQu9C40YLRgNGLLCDQuCDRhNC+0YDQvNGD0LvQsCDRgdC00LLQuNC90YPQu9CwINCx0YsgYXp1cmUtYWN0aXZlINC90LAgMzIg0LXQtNC40L3QuNGG0Ysg0LrQsNC90LDQu9CwLgogICAqLwogIC0tZ3ItcHJpbWFyeS1zb2xpZDogdmFyKC0tZ3ItcHJpbWFyeSk7CiAgLS1nci1wcmltYXJ5LXNvbGlkLWhvdmVyOiB2YXIoLS1nci1wcmltYXJ5LWhvdmVyKTsKICAtLWdyLXByaW1hcnktc29saWQtYWN0aXZlOiB2YXIoLS1nci1wcmltYXJ5LWFjdGl2ZSk7CiAgLS1nci1wcmltYXJ5LXNvbGlkLWZnOiB2YXIoLS1nci1wcmltYXJ5LWZnKTsKICAtLWdyLXN1Y2Nlc3Mtc29saWQ6ICMwNDc4NTc7CiAgLS1nci1zdWNjZXNzLXNvbGlkLWhvdmVyOiAjMDM2YzRkOwogIC0tZ3Itc3VjY2Vzcy1zb2xpZC1hY3RpdmU6ICMwMjVmNDQ7CiAgLS1nci1zdWNjZXNzLXNvbGlkLWZnOiB2YXIoLS1nci1zbGF0ZS0wKTsKICAtLWdyLXdhcm5pbmctc29saWQ6ICNjMjQxMGM7CiAgLS1nci13YXJuaW5nLXNvbGlkLWhvdmVyOiAjYjUzYjBhOwogIC0tZ3Itd2FybmluZy1zb2xpZC1hY3RpdmU6ICM5ZjMzMDc7CiAgLS1nci13YXJuaW5nLXNvbGlkLWZnOiB2YXIoLS1nci1zbGF0ZS0wKTsKICAtLWdyLWRhbmdlci1zb2xpZDogdmFyKC0tZ3ItZGFuZ2VyKTsKICAtLWdyLWRhbmdlci1zb2xpZC1ob3ZlcjogdmFyKC0tZ3ItZGFuZ2VyLWhvdmVyKTsKICAtLWdyLWRhbmdlci1zb2xpZC1hY3RpdmU6IHZhcigtLWdyLWRhbmdlci1hY3RpdmUpOwogIC0tZ3ItZGFuZ2VyLXNvbGlkLWZnOiB2YXIoLS1nci1kYW5nZXItZmcpOwogIC0tZ3ItaW5mby1zb2xpZDogdmFyKC0tZ3ItaW5mbyk7CiAgLS1nci1pbmZvLXNvbGlkLWhvdmVyOiB2YXIoLS1nci1pbmZvLWhvdmVyKTsKICAtLWdyLWluZm8tc29saWQtYWN0aXZlOiB2YXIoLS1nci1pbmZvLWFjdGl2ZSk7CiAgLS1nci1pbmZvLXNvbGlkLWZnOiB2YXIoLS1nci1pbmZvLWZnKTsKICAtLWdyLXNsYXRlLXNvbGlkOiB2YXIoLS1nci1zbGF0ZSk7CiAgLS1nci1zbGF0ZS1zb2xpZC1ob3ZlcjogdmFyKC0tZ3Itc2xhdGUtaG92ZXIpOwogIC0tZ3Itc2xhdGUtc29saWQtYWN0aXZlOiB2YXIoLS1nci1zbGF0ZS1hY3RpdmUpOwogIC0tZ3Itc2xhdGUtc29saWQtZmc6IHZhcigtLWdyLXNsYXRlLWZnKTsKICAtLWdyLWF6dXJlLXNvbGlkOiAjMDM2OWExOwogIC0tZ3ItYXp1cmUtc29saWQtaG92ZXI6ICMwNzU5ODU7CiAgLS1nci1henVyZS1zb2xpZC1hY3RpdmU6ICMwYzRhNmU7CiAgLS1nci1henVyZS1zb2xpZC1mZzogdmFyKC0tZ3Itc2xhdGUtMCk7CgogIC8qIERhdGEgdmlzdWFsaXphdGlvbiByb2xlcyAqLwogIC0tZ3ItY2hhcnQtMTogIzRmNDZlNTsKICAtLWdyLWNoYXJ0LTI6ICMxMGI5ODE7CiAgLS1nci1jaGFydC0zOiAjZjk3MzE2OwogIC0tZ3ItY2hhcnQtNDogIzYzNjZmMTsKICAtLWdyLWNoYXJ0LTU6ICM4YjVjZjY7CgogIC8qIE5hdmlnYXRpb24gcm9sZXMgKi8KICAtLWdyLXNpZGViYXI6ICNmZmZmZmY7CiAgLS1nci1zaWRlYmFyLWZnOiAjMGYxNzJhOwogIC0tZ3Itc2lkZWJhci1wcmltYXJ5OiAjNGY0NmU1OwogIC0tZ3Itc2lkZWJhci1wcmltYXJ5LWZnOiAjZmZmZmZmOwogIC0tZ3Itc2lkZWJhci1hY2NlbnQ6ICNmMWY1Zjk7CiAgLS1nci1zaWRlYmFyLWFjY2VudC1mZzogIzFlMjkzYjsKICAtLWdyLXNpZGViYXItYnJkOiAjZTJlOGYwOwogIC0tZ3Itc2lkZWJhci1yaW5nOiAjNjM2NmYxOwoKICAvKiBFbGV2YXRpb24gKi8KICAtLWdyLXNoYWRvdy0xOiAwIDFweCAycHggcmdiYSgxNSwgMjMsIDQyLCAwLjA4KTsKICAtLWdyLXNoYWRvdy0yOiAwIDhweCAyNHB4IHJnYmEoMTUsIDIzLCA0MiwgMC4xNCk7CiAgLS1nci1zaGFkb3ctMzogMCAxNnB4IDQ4cHggcmdiYSgxNSwgMjMsIDQyLCAwLjIwKTsKfQoKQHN1cHBvcnRzIG5vdCAoY29sb3I6IGNvbG9yLW1peChpbiBzcmdiLCAjMDAwIDUwJSwgI2ZmZikpIHsKICA6cm9vdCB7CiAgICAvKiBBY3Rpb24gcm9sZSBmYWxsYmFja3MgKi8KICAgIC0tZ3ItcHJpbWFyeS1ob3ZlcjogIzRhNDJkNjsKICAgIC0tZ3ItcHJpbWFyeS1hY3RpdmU6ICM0NTNlYzc7CiAgICAtLWdyLXNlY29uZGFyeS1ob3ZlcjogI2QxZDdlMDsKICAgIC0tZ3Itc2Vjb25kYXJ5LWFjdGl2ZTogI2MwYzdkMDsKICAgIC0tZ3ItYnJkLWhvdmVyOiAjYTNhOWI1OwogICAgLS1nci1icmQtYWN0aXZlOiAjODM4YTk3OwoKICAgIC8qIFN0YXR1cyByb2xlIGZhbGxiYWNrcyAqLwogICAgLS1nci1zdWNjZXNzLWhvdmVyOiAjMTBhYzdhOwogICAgLS1nci1zdWNjZXNzLWFjdGl2ZTogIzEwOWY3MzsKICAgIC0tZ3Itd2FybmluZy1ob3ZlcjogI2U2NmMxODsKICAgIC0tZ3Itd2FybmluZy1hY3RpdmU6ICNkNDY0MTk7CiAgICAtLWdyLWRhbmdlci1ob3ZlcjogI2NjMjUyNjsKICAgIC0tZ3ItZGFuZ2VyLWFjdGl2ZTogI2JiMjQyNzsKICAgIC0tZ3ItaW5mby1ob3ZlcjogIzIzNWRkYzsKICAgIC0tZ3ItaW5mby1hY3RpdmU6ICMyMTU3Y2M7CiAgICAtLWdyLXNsYXRlLWhvdmVyOiAjNDM1MDY0OwogICAgLS1nci1zbGF0ZS1hY3RpdmU6ICMzZTRiNWY7CiAgICAtLWdyLWF6dXJlLWhvdmVyOiAjMDE2ZmFiOwogICAgLS1nci1henVyZS1hY3RpdmU6ICMwMjY4YTA7CiAgfQp9Cg==", "" + import.meta.url).href,
101
+ dark: new URL("data:text/css;base64,LyoKICog0KHQk9CV0J3QldCg0JjQoNCe0JLQkNCd0J4gYHlhcm4gZ2VuZXJhdGU6dG9rZW5zYCDQuNC3IGB0b2tlbnMvKi5qc29uYCDigJQg0L/RgNCw0LLQutC4INC30LTQtdGB0Ywg0L/QvtGC0LXRgNGP0Y7RgtGB0Y8uCiAqINCc0LXQvdGP0YLRjCDQt9C90LDRh9C10L3QuNGPINC4INC60L7QvNC80LXQvdGC0LDRgNC40Lgg0L3Rg9C20L3QviDQsiBKU09OLCDQt9Cw0YLQtdC8INC/0LXRgNC10LPQtdC90LXRgNC40YDQvtCy0LDRgtGMLgogKi8KLyoKICog0KLRkdC80L3QsNGPINGC0LXQvNCwLiDQmtCw0L3QvtC9IOKAlCDQsNGC0YDQuNCx0YPRgiBgW2RhdGEtdGhlbWU9J2RhcmsnXWAg0L3QsCBgPGh0bWw+YCAo0LXQs9C+INGB0YLQsNCy0LjRggogKiBgdXNlVGhlbWVgL2Bpbml0VGhlbWVFYXJseWApLiDQodC10LvQtdC60YLQvtGAIGAuZGFya2Ag0L7RgdGC0LDQstC70LXQvSDQtNC70Y8g0LjQvdGC0LXRgNC+0L/QsCDRgQogKiBjbGFzcy3RgdGC0YDQsNGC0LXQs9C40LXQuSBUYWlsd2luZC9Vbm9DU1M6INC/0YDQuNC70L7QttC10L3QuNC1INC80L7QttC10YIg0YPQttC1INC/0LXRgNC10LrQu9GO0YfQsNGC0Ywg0YLQtdC80YMg0LjQvC4KICovCltkYXRhLXRoZW1lPSdkYXJrJ10sCi5kYXJrIHsKICAvKiBTdXJmYWNlIHJvbGVzICovCiAgLS1nci1iZzogIzBmMTcyYTsKICAtLWdyLWZnOiAjZjhmYWZjOwogIC0tZ3ItY2FyZDogIzFlMjkzYjsKICAtLWdyLWNhcmQtZmc6ICNmOGZhZmM7CiAgLS1nci1wb3BvdmVyOiAjMWUyOTNiOwogIC0tZ3ItcG9wb3Zlci1mZzogI2Y4ZmFmYzsKICAtLWdyLW11dGVkOiAjMzM0MTU1OwogIC8qCiAgICog0KHQuNC80LzQtdGC0YDQuNGH0L3QviBsaWdodDog0LzQuNC90LjQvNGD0Lwg0L/QviDRhNC+0L3RgyBgLS1nci1tdXRlZGAvYC0tZ3Itc2Vjb25kYXJ5YCAoIzMzNDE1NSkuCiAgICog0J/RgNC10LbQvdC40LkgIzk0YTNiOCDQtNCw0LLQsNC7INGC0LDQvCA0LjA0LCAjYWFiNmM3INC00LDRkdGCIDUuMDQuCiAgICovCiAgLS1nci1tdXRlZC1mZzogI2FhYjZjNzsKICAtLWdyLXNlY29uZGFyeTogIzMzNDE1NTsKICAtLWdyLXNlY29uZGFyeS1mZzogI2YxZjVmOTsKICAtLWdyLW92ZXJsYXktYmc6IHJnYigyIDYgMjMgLyAwLjY1KTsKICAtLWdyLWJyZDogIzMzNDE1NTsKICAtLWdyLWlucHV0OiAjMzM0MTU1OwogIC0tZ3ItcmluZzogIzgxOGNmODsKCiAgLyogU3RhdGUgcm9sZXMgKi8KICAtLWdyLWRpc2FibGVkLWJnOiAjMjczNTQ4OwogIC0tZ3ItZGlzYWJsZWQtZmc6ICM2NDc0OGI7CiAgLS1nci1kaXNhYmxlZC1icmQ6ICMzMzQxNTU7CiAgLyoKICAgKiDQntGI0LjQsdC60LAg0LLQsNC70LjQtNCw0YbQuNC4INC4INC00LXQutC+0YDQsNGC0LjQstC90YvQuSDRgtC+0L0gYHN0YXRlPSJkYW5nZXIiYCDigJQg0YDQsNC30L3Ri9C1INCy0LXRidC4LCDRhdC+0YLRjwogICAqINCy0YvQs9C70Y/QtNGP0YIg0L7QtNC40L3QsNC60L7QstC+INC/0L4g0YPQvNC+0LvRh9Cw0L3QuNGOLiDQodGB0YvQu9C60LAsINCwINC90LUg0LrQvtC/0LjRjyBoZXg6INGC0LXQvNCwLCDQv9C+0LzQtdC90Y/QstGI0LDRjwogICAqINGC0L7Qu9GM0LrQviBgLS1nci1kYW5nZXJgLCDQvdC1INC+0LHRj9C30LDQvdCwINC/0L7QvNC90LjRgtGMINC/0YDQviDQstGC0L7RgNC+0Lkg0L3QsNCx0L7RgCwg0LAg0YLQtdC80LAsINC60L7RgtC+0YDQvtC5CiAgICog0L3Rg9C20LXQvSDQvtGC0LTQtdC70YzQvdGL0Lkg0YbQstC10YIg0L7RiNC40LHQutC4LCDQv9C10YDQtdC60YDQsNGI0LjQstCw0LXRgiDRgtGA0Lgg0YDQvtC70Lgg0Lgg0L3QtSDRgtGA0L7Qs9Cw0LXRgiBkYW5nZXIt0YLQvtC9LgogICAqLwogIC0tZ3ItaW52YWxpZC1icmQ6IHZhcigtLWdyLWRhbmdlcik7CiAgLS1nci1pbnZhbGlkLXJpbmc6IHZhcigtLWdyLWRhbmdlcik7CiAgLS1nci1pbnZhbGlkLXRleHQ6IHZhcigtLWdyLWRhbmdlci10ZXh0KTsKCiAgLyogQWN0aW9uIHJvbGVzICovCiAgLyoKICAgKiBQcmltYXJ5INCx0YvQuyDQtdC00LjQvdGB0YLQstC10L3QvdGL0Lwg0YLQvtC90L7QvCwg0LLRi9C/0LDQtNCw0LLRiNC40Lwg0LjQtyDQutC+0L3QstC10L3RhtC40Lgg0YLRkdC80L3QvtC5INGC0LXQvNGLCiAgICogKNGB0LLQtdGC0LvQsNGPINC30LDQu9C40LLQutCwICsg0YLRkdC80L3Ri9C5INGC0LXQutGB0YIsINC60LDQuiDRgyBzdWNjZXNzL3dhcm5pbmcvZGFuZ2VyL2luZm8vYXp1cmUpOgogICAqINC+0YHRgtCw0LLQsNC70YHRjyDRgdCy0LXRgtC70L4t0YLRkdC80L3Ri9C8INC40L3QtNC40LPQviAjNjM2NmYxINGBINCx0LXQu9GL0Lwg0YLQtdC60YHRgtC+0Lwg0Lgg0L/RgNC+0LLQsNC70LjQstCw0Lsg0YHRgNCw0LfRgwogICAqINCy0YHQtSDRgtGA0Lgg0YDQvtC70Lgg4oCUINGC0LXQutGB0YIg0L3QsCDRhNC+0L3QtSA0LjAwLCDRgtC10LrRgdGCINC90LAg0LrQsNGA0YLQvtGH0LrQtSAzLjI3LCDQsdC10LvRi9C5INC90LAKICAgKiDQt9Cw0LvQuNCy0LrQtSA0LjQ3LiDQodCy0LXRgtC70YvQuSDQuNC90LTQuNCz0L4g0YEg0YLRkdC80L3Ri9C8IGAtZmdgINC00LDRkdGCIDYuMzggLyA1LjIzIC8gNi4zOC4KICAgKiDQndC1IGluZGlnby00MDAgKCM4MThjZjgpOiDQsiDRgtGDINGB0YLQvtGA0L7QvdGDINC70LXQttC40YIgYC0tZ3ItaW5mb2AsINC4INGD0LLQtdGB0YLQuCBwcmltYXJ5CiAgICog0YLRg9C00LAg0LfQvdCw0YfQuNC70L4g0LHRiyDQstC10YDQvdGD0YLRjCDRgdC70LjRj9C90LjQtSDQtNCy0YPRhSDRgtC+0L3QvtCyLCDRgNCw0LTQuCDRgNCw0LfQstC10LTQtdC90LjRjyDQutC+0YLQvtGA0L7Qs9C+IGluZm8KICAgKiDQuCDQv9C10YDQtdC60YDQsNGI0LXQvSDQsiDRgdC40L3QuNC5LgogICAqINCa0L3QvtC/0L7QuiDQvdC1INC60LDRgdCw0LXRgtGB0Y86IEdyQnV0dG9uINC30LDQtNCw0ZHRgiDRgdCy0L7QuSBgLS1nci1idXR0b24tcHJpbWFyeS1iZ2AuCiAgICovCiAgLS1nci1wcmltYXJ5OiAjOWQ4YmZhOwogIC0tZ3ItcHJpbWFyeS1mZzogIzBmMTcyYTsKICAtLWdyLWFjY2VudDogIzFlMWI0YjsKICAtLWdyLWFjY2VudC1mZzogI2M3ZDJmZTsKCiAgLyogU3RhdHVzIHJvbGVzICovCiAgLS1nci1zdWNjZXNzOiAjMzRkMzk5OwogIC0tZ3Itc3VjY2Vzcy1saWdodDogIzE5NDUzNjsKICAtLWdyLXN1Y2Nlc3MtZmc6ICMwZjE3MmE7CiAgLS1nci1wcmltYXJ5LXRleHQ6ICNjN2QyZmU7CiAgLS1nci1zdWNjZXNzLXRleHQ6ICM2ZWU3Yjc7CiAgLS1nci13YXJuaW5nOiAjZmI5MjNjOwogIC0tZ3Itd2FybmluZy1saWdodDogIzY3MmUxYzsKICAtLWdyLXdhcm5pbmctZmc6ICMwZjE3MmE7CiAgLS1nci13YXJuaW5nLXRleHQ6ICNmZGJhNzQ7CiAgLS1nci1kYW5nZXI6ICNmODcxNzE7CiAgLS1nci1kYW5nZXItbGlnaHQ6ICM2YTI1MjI7CiAgLS1nci1kYW5nZXItZmc6ICMwZjE3MmE7CiAgLS1nci1kYW5nZXItdGV4dDogI2ZjYTVhNTsKICAtLWdyLWluZm86ICM2MGE1ZmE7CiAgLS1nci1pbmZvLWxpZ2h0OiAjMjEzNzcxOwogIC0tZ3ItaW5mby1mZzogIzBmMTcyYTsKICAtLWdyLWluZm8tdGV4dDogI2JmZGJmZTsKICAtLWdyLXNsYXRlOiAjOTRhM2I4OwogIC0tZ3Itc2xhdGUtbGlnaHQ6ICMzMTNiNGE7CiAgLS1nci1zbGF0ZS1mZzogIzBmMTcyYTsKICAtLWdyLXNsYXRlLXRleHQ6ICNjYmQ1ZTE7CiAgLS1nci1henVyZTogIzM4YmRmODsKICAtLWdyLWF6dXJlLWxpZ2h0OiAjMWI0MjVjOwogIC0tZ3ItYXp1cmUtZmc6ICMwZjE3MmE7CiAgLS1nci1henVyZS10ZXh0OiAjYmFlNmZkOwoKICAvKgogICAqIFNvbGlkIGZpbGwgcm9sZXMKICAgKgogICAqINCh0L/Qu9C+0YjQvdCw0Y8g0LfQsNC70LjQstC60LAg0LrQvdC+0L/QvtGH0L3QvtCz0L4g0LLQtdGB0LAg0Lgg0LXRkSDRgtC10LrRgdGCLgogICAqCiAgICog0JIg0YLRkdC80L3QvtC5INGC0LXQvNC1INGB0L7QsdGB0YLQstC10L3QvdGL0LUg0LfQvdCw0YfQtdC90LjRjyDQvdGD0LbQvdGLINCy0YHQtdC8INGB0LXQvNC4INGC0L7QvdCw0Lw6INCz0LvQvtCx0LDQu9GM0L3Ri9C1CiAgICogYC0tZ3Ite3RvbmV9YCDQt9C00LXRgdGMIOKAlCDQv9Cw0YHRgtC10LvRjNC90YvQtSDQt9Cw0LvQuNCy0LrQuCDQv9C+0LQg0KLQgdCc0J3Qq9CZINGC0LXQutGB0YIsINCwINC60L3QvtC/0LrQsCDQvtCx0Y/Qt9Cw0L3QsAogICAqINC+0YHRgtCw0YLRjNGB0Y8g0L3QsNGB0YvRidC10L3QvdC+0Lkg0YHQviDRgdCy0LXRgtC70L7QuSDQv9C+0LTQv9C40YHRjNGOLgogICAqCiAgICogaG92ZXIg0LggYWN0aXZlINGD0LLQvtC00Y/RgiDQt9Cw0LvQuNCy0LrRgyDRgtC10LzQvdC10LUsINCwINC90LUg0YHQstC10YLQu9C10LU6INC+0LHRidCw0Y8g0YTQvtGA0LzRg9C70LAg0L/QvtC00LzQtdGB0LAg0LoKICAgKiBgLS1nci1mZ2Ag0LIg0YLRkdC80L3QvtC5INGC0LXQvNC1INC+0YHQstC10YLQu9GP0LvQsCDQsdGLINC60L3QvtC/0LrRgyDQv9C+0LQg0LrRg9GA0YHQvtGA0L7QvC4KICAgKi8KICAtLWdyLXByaW1hcnktc29saWQ6ICM1OTVjZTY7CiAgLS1nci1wcmltYXJ5LXNvbGlkLWhvdmVyOiAjNTA1M2RkOwogIC0tZ3ItcHJpbWFyeS1zb2xpZC1hY3RpdmU6ICM0NzRhY2Y7CiAgLS1nci1wcmltYXJ5LXNvbGlkLWZnOiB2YXIoLS1nci1zbGF0ZS0wKTsKICAtLWdyLXN1Y2Nlc3Mtc29saWQ6ICMwNDc4NTc7CiAgLS1nci1zdWNjZXNzLXNvbGlkLWhvdmVyOiAjMDM2YzRkOwogIC0tZ3Itc3VjY2Vzcy1zb2xpZC1hY3RpdmU6ICMwMjVmNDQ7CiAgLS1nci1zdWNjZXNzLXNvbGlkLWZnOiB2YXIoLS1nci1zbGF0ZS01MCk7CiAgLS1nci13YXJuaW5nLXNvbGlkOiAjYzI0MTBjOwogIC0tZ3Itd2FybmluZy1zb2xpZC1ob3ZlcjogI2I1M2IwYTsKICAtLWdyLXdhcm5pbmctc29saWQtYWN0aXZlOiAjOWYzMzA3OwogIC0tZ3Itd2FybmluZy1zb2xpZC1mZzogdmFyKC0tZ3Itc2xhdGUtNTApOwogIC0tZ3ItZGFuZ2VyLXNvbGlkOiAjYjkxYzFjOwogIC0tZ3ItZGFuZ2VyLXNvbGlkLWhvdmVyOiAjYTkxOTE5OwogIC0tZ3ItZGFuZ2VyLXNvbGlkLWFjdGl2ZTogIzkzMTUxNTsKICAtLWdyLWRhbmdlci1zb2xpZC1mZzogdmFyKC0tZ3Itc2xhdGUtNTApOwogIC0tZ3ItaW5mby1zb2xpZDogIzFkNGVkODsKICAtLWdyLWluZm8tc29saWQtaG92ZXI6ICMxZTQwYWY7CiAgLS1nci1pbmZvLXNvbGlkLWFjdGl2ZTogIzFlM2E4YTsKICAtLWdyLWluZm8tc29saWQtZmc6IHZhcigtLWdyLXNsYXRlLTUwKTsKICAtLWdyLXNsYXRlLXNvbGlkOiB2YXIoLS1nci1zbGF0ZS02MDApOwogIC0tZ3Itc2xhdGUtc29saWQtaG92ZXI6IHZhcigtLWdyLXNsYXRlLTcwMCk7CiAgLS1nci1zbGF0ZS1zb2xpZC1hY3RpdmU6IHZhcigtLWdyLXNsYXRlLTgwMCk7CiAgLS1nci1zbGF0ZS1zb2xpZC1mZzogdmFyKC0tZ3Itc2xhdGUtNTApOwogIC0tZ3ItYXp1cmUtc29saWQ6ICMwMzY5YTE7CiAgLS1nci1henVyZS1zb2xpZC1ob3ZlcjogIzA3NTk4NTsKICAtLWdyLWF6dXJlLXNvbGlkLWFjdGl2ZTogIzBjNGE2ZTsKICAtLWdyLWF6dXJlLXNvbGlkLWZnOiB2YXIoLS1nci1zbGF0ZS01MCk7CgogIC8qIERhdGEgdmlzdWFsaXphdGlvbiByb2xlcyAqLwogIC0tZ3ItY2hhcnQtMTogIzYzNjZmMTsKICAtLWdyLWNoYXJ0LTI6ICMzNGQzOTk7CiAgLS1nci1jaGFydC0zOiAjZmI5MjNjOwogIC0tZ3ItY2hhcnQtNDogIzgxOGNmODsKICAtLWdyLWNoYXJ0LTU6ICNhNzhiZmE7CgogIC8qIE5hdmlnYXRpb24gcm9sZXMgKi8KICAtLWdyLXNpZGViYXI6ICMxZTI5M2I7CiAgLS1nci1zaWRlYmFyLWZnOiAjZjhmYWZjOwogIC8qCiAgICog0JHQtdC70YvQuSDRgtC10LrRgdGCINC90LAgIzYzNjZmMSDQtNCw0ZHRgiA0LjQ3OjEg4oCUINGC0L7RgiDQttC1INC90LXQtNC+0LvRkdGCIEFBLCDQuNC3LdC30LAg0LrQvtGC0L7RgNC+0LPQvgogICAqINC/0LXRgNC10LrRgNCw0YjQtdC9IGAtLWdyLXByaW1hcnlgICjQt9Cw0LzQtdGC0LrQsCDQstGL0YjQtSkuINCX0LTQtdGB0Ywg0LLQt9GP0YIg0LzQuNC90LjQvNCw0LvRjNC90YvQuSDRiNCw0LMsINGB0L3QuNC80LDRjtGJ0LjQuQogICAqINC90LXQtNC+0LvRkdGCINCx0LXQtyDRgdC80LXQvdGLINCy0LjQtNCwOiA0LjUyOjEg0L/RgNC4IM6URSAwLjQyINC6INC/0YDQtdC20L3QtdC80YMg0YbQstC10YLRgy4KICAgKi8KICAtLWdyLXNpZGViYXItcHJpbWFyeTogIzYzNjVmMDsKICAtLWdyLXNpZGViYXItcHJpbWFyeS1mZzogI2ZmZmZmZjsKICAtLWdyLXNpZGViYXItYWNjZW50OiAjMzM0MTU1OwogIC0tZ3Itc2lkZWJhci1hY2NlbnQtZmc6ICNmMWY1Zjk7CiAgLS1nci1zaWRlYmFyLWJyZDogIzMzNDE1NTsKICAtLWdyLXNpZGViYXItcmluZzogIzgxOGNmODsKCiAgLyogRWxldmF0aW9uICovCiAgLS1nci1zaGFkb3ctMTogMCAxcHggMnB4IHJnYmEoMCwgMCwgMCwgMC40NSk7CiAgLS1nci1zaGFkb3ctMjogMCA4cHggMjRweCByZ2JhKDAsIDAsIDAsIDAuNTUpOwogIC0tZ3Itc2hhZG93LTM6IDAgMTZweCA0OHB4IHJnYmEoMCwgMCwgMCwgMC42NSk7Cn0KCkBzdXBwb3J0cyBub3QgKGNvbG9yOiBjb2xvci1taXgoaW4gc3JnYiwgIzAwMCA1MCUsICNmZmYpKSB7CiAgW2RhdGEtdGhlbWU9J2RhcmsnXSwKICAuZGFyayB7CiAgICAvKiBBY3Rpb24gcm9sZSBmYWxsYmFja3MgKi8KICAgIC0tZ3ItcHJpbWFyeS1ob3ZlcjogI2E0OTRmYTsKICAgIC0tZ3ItcHJpbWFyeS1hY3RpdmU6ICNhYzlkZmE7CiAgICAtLWdyLXNlY29uZGFyeS1ob3ZlcjogIzQzNTA2MjsKICAgIC0tZ3Itc2Vjb25kYXJ5LWFjdGl2ZTogIzUzNWY3MDsKICAgIC0tZ3ItYnJkLWhvdmVyOiAjNmU3OTg3OwogICAgLS1nci1icmQtYWN0aXZlOiAjOGM5NGEwOwoKICAgIC8qIFN0YXR1cyByb2xlIGZhbGxiYWNrcyAqLwogICAgLS1nci1zdWNjZXNzLWhvdmVyOiAjNDRkNmExOwogICAgLS1nci1zdWNjZXNzLWFjdGl2ZTogIzUzZDlhOTsKICAgIC0tZ3Itd2FybmluZy1ob3ZlcjogI2ZiOWE0YjsKICAgIC0tZ3Itd2FybmluZy1hY3RpdmU6ICNmYmEzNWI7CiAgICAtLWdyLWRhbmdlci1ob3ZlcjogI2Y4N2M3YzsKICAgIC0tZ3ItZGFuZ2VyLWFjdGl2ZTogI2Y4ODc4NzsKICAgIC0tZ3ItaW5mby1ob3ZlcjogIzZjYWNmYTsKICAgIC0tZ3ItaW5mby1hY3RpdmU6ICM3OGIzZmE7CiAgICAtLWdyLXNsYXRlLWhvdmVyOiAjOWNhYWJkOwogICAgLS1nci1zbGF0ZS1hY3RpdmU6ICNhNGIxYzM7CiAgICAtLWdyLWF6dXJlLWhvdmVyOiAjNDdjMmY4OwogICAgLS1nci1henVyZS1hY3RpdmU6ICM1N2M3Zjk7CiAgfQp9Cg==", "" + import.meta.url).href
101
102
  },
102
103
  defaultThemes: granularityDefaultThemes
103
104
  };
@@ -178,7 +179,8 @@ var granularityComponentConfigs = {
178
179
  GrToaster: grToasterConfig,
179
180
  GrTooltip: grTooltipConfig,
180
181
  GrTree: grTreeConfig,
181
- GrTreeSelect: grTreeSelectConfig
182
+ GrTreeSelect: grTreeSelectConfig,
183
+ GrValue: grValueConfig
182
184
  };
183
185
  /** Базовый набор компонентов в порядке реестра. */
184
186
  var baseComponents = Object.values(granularityComponentConfigs);
@@ -0,0 +1 @@
1
+ {"version":3,"file":"granular-provider-Dr2PKgl1.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 { 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 { grCheckboxConfig } from '../components/GrCheckbox/config'\nimport { grCheckboxGroupConfig } from '../components/GrCheckboxGroup/config'\nimport { grCodeBlockConfig } from '../components/GrCodeBlock/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 { 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 { 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 { 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 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 GrCheckbox: grCheckboxConfig,\n GrCheckboxGroup: grCheckboxGroupConfig,\n GrCodeBlock: grCodeBlockConfig,\n GrCollapse: grCollapseConfig,\n GrColorPicker: grColorPickerConfig,\n GrCommandPalette: grCommandPaletteConfig,\n GrConfigProvider: grConfigProviderConfig,\n GrConfirmDialog: grConfirmDialogConfig,\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 GrSwitch: grSwitchConfig,\n GrTable: grTableConfig,\n GrTabPanels: grTabPanelsConfig,\n GrTabs: grTabsConfig,\n GrTextarea: grTextareaConfig,\n GrTimeline: grTimelineConfig,\n GrToaster: grToasterConfig,\n GrTooltip: grTooltipConfig,\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,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;;;;ACwFD,IAAa,0BAA0B;AAIvC,IAAM,iBAAiB,sBAAsB,OAAO,KAAK,GAAG;;AAG5D,IAAa,wBAAwB,CAAC,SAAS,MAAM;;AAIrD,IAAa,2BAA4D,CAAC,OAAO;AAEjF,IAAM,QAAQ;CACZ,YAAY,IAAA,IAAA,q5KAAA,KAAA,OAAA,KAAA,GAAA,CAA8C,CAAC;CAC3D,cAAc,IAAA,IAAA,ykXAAA,KAAA,OAAA,KAAA,GAAA,CAAgD,CAAC;CAC/D,QAAQ;EACN,OAAO,IAAA,IAAA,iyYAAA,KAAA,OAAA,KAAA,GAAA,CAAsD,CAAC;EAC9D,MAAM,IAAA,IAAA,y/SAAA,KAAA,OAAA,KAAA,GAAA,CAAqD,CAAC;CAC9D;CACA,eAAe;AACjB;;;;;AAMA,IAAa,8BAA8B;CAEzC,SAAS;CACT,gBAAgB;CAChB,UAAU;CACV,SAAS;CACT,aAAa;CACb,aAAa;CACb,eAAe;CACf,UAAU;CACV,eAAe;CACf,QAAQ;CACR,YAAY;CACZ,iBAAiB;CACjB,aAAa;CACb,YAAY;CACZ,eAAe;CACf,kBAAkB;CAClB,kBAAkB;CAClB,iBAAiB;CACjB,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,UAAU;CACV,SAAS;CACT,aAAa;CACb,QAAQ;CACR,YAAY;CACZ,YAAY;CACZ,WAAW;CACX,WAAW;CACX,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;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;;;AClOA,IAAa,sBAAsB,0BAA0B"}
@@ -1,5 +1,5 @@
1
1
  import { i as useGrComponentProp } from "../../../chunks/context-CTbuwcYs.js";
2
- import { a as grCardRootClass, c as sectionDividerTopClass, i as cardTitleClass, o as paddingClass, r as cardDescriptionClass, s as sectionDividerBottomClass } from "../../../chunks/config-Bm_Sovla.js";
2
+ import { a as grCardRootClass, c as sectionDividerBottomClass, i as cardTitleClass, l as sectionDividerTopClass, o as ownHeaderPaddingClass, r as cardDescriptionClass, s as paddingClass } from "../../../chunks/config-DYgfMrIF.js";
3
3
  import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, defineComponent, markRaw, normalizeClass, openBlock, renderSlot, resolveDynamicComponent, toDisplayString, unref, useId, useSlots, withCtx } from "vue";
4
4
  //#region src/components/GrCard/GrCard.vue?vue&type=script&setup=true&lang.ts
5
5
  var _hoisted_1 = ["id"];
@@ -84,7 +84,13 @@ var GrCard_default = /* @__PURE__ */ defineComponent({
84
84
  hoverable: props.hoverable
85
85
  }));
86
86
  const sectionPaddingClass = computed(() => paddingClass[resolvedPadding.value]);
87
- const headerClass = computed(() => [sectionPaddingClass.value, sectionDividerBottomClass].filter(Boolean).join(" "));
87
+ /**
88
+ * Карточка отбивает то, что рисует сама. Шапка из `title` — её собственная, и
89
+ * отступ ей полагается независимо от `padding`. Слот `#header` сильнее пропов и
90
+ * заменяет шапку целиком: там отступы принадлежат тому, кто её наполнил, —
91
+ * иначе потребитель со своими отступами внутри слота получил бы двойные.
92
+ */
93
+ const headerClass = computed(() => [hasOwnHeader.value ? sectionPaddingClass.value : ownHeaderPaddingClass, sectionDividerBottomClass].filter(Boolean).join(" "));
88
94
  const footerClass = computed(() => [sectionPaddingClass.value, sectionDividerTopClass].filter(Boolean).join(" "));
89
95
  const bodySectionClass = computed(() => [sectionPaddingClass.value, props.bodyClass].filter(Boolean).join(" "));
90
96
  function onClick(event) {
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GrCard-gI2wA8ZZ.js","names":["$slots"],"sources":["../../../../src/components/GrCard/GrCard.vue","../../../../src/components/GrCard/GrCard.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, markRaw, useId, useSlots, type Component } from 'vue'\n\nimport { useGrComponentProp } from '../GrConfigProvider/context'\n\nimport {\n cardDescriptionClass,\n cardTitleClass,\n grCardRootClass,\n ownHeaderPaddingClass,\n paddingClass,\n sectionDividerBottomClass,\n sectionDividerTopClass,\n type GrCardHeadingLevel,\n type GrCardPadding,\n type GrCardVariant,\n} from './grCardStyles'\n\nexport type { GrCardHeadingLevel, GrCardPadding, GrCardVariant } from './grCardStyles'\n\nexport interface GrCardProps {\n /**\n * Внутренние отступы. По умолчанию `none`: карточка — поверхность, а её\n * содержимое (`GrCollapse`, `GrList`) само знает про свои отступы.\n */\n padding?: GrCardPadding\n /** `elevated` — рамка, фон и тень; `outlined` — без тени; `ghost` — без рамки. */\n variant?: GrCardVariant\n /** Свой корневой тег (`RouterLink`, `Link` от Inertia). Сильнее `href`. */\n as?: string | Component\n /** Карточка-ссылка. */\n href?: string\n /** Карточка-кнопка: интерактивна вся поверхность. */\n clickable?: boolean\n /** Подсветка при наведении без интерактивности. */\n hoverable?: boolean\n /** Классы обёртки тела — она появляется вместе с секциями. */\n bodyClass?: string\n /**\n * Заголовок карточки — настоящий `h2`…`h6`, а не жирная строка: отчёт из\n * шести карточек иначе не обойти по структуре, после `h1` страницы в нём\n * нет ни одного заголовка.\n */\n title?: string\n /** Пояснение под заголовком. */\n description?: string\n /** Уровень заголовка под структуру страницы. Не задан — из `GrConfigProvider`, иначе `3`. */\n headingLevel?: GrCardHeadingLevel\n}\n\nexport interface GrCardEmits {\n (e: 'click', event: MouseEvent): void\n}\n\nconst props = withDefaults(defineProps<GrCardProps>(), {\n // Настраивается через `GrConfigProvider`; дефолты — в резолверах ниже.\n padding: undefined,\n variant: undefined,\n as: undefined,\n href: undefined,\n clickable: false,\n hoverable: false,\n bodyClass: undefined,\n title: undefined,\n description: undefined,\n headingLevel: undefined,\n})\n\nconst emit = defineEmits<GrCardEmits>()\n\nconst slots = useSlots()\n\nconst resolvedPadding = useGrComponentProp('GrCard', 'padding', () => props.padding, 'none')\nconst resolvedVariant = useGrComponentProp('GrCard', 'variant', () => props.variant, 'elevated')\n\nconst isInteractive = computed(() => !!props.as || !!props.href || props.clickable)\n\nconst rootTag = computed<string | Component>(() => {\n if (props.as)\n return typeof props.as === 'string' ? props.as : markRaw(props.as)\n\n if (props.href)\n return 'a'\n\n return props.clickable ? 'button' : 'div'\n})\n\n/**\n * Компонент-ссылка (`Link` от Inertia, `RouterLink`) рендерит `<a>` сам, и без\n * `href` он ведёт в никуда. Строковый тег, кроме `a`, атрибут не понимает —\n * там он и гасится.\n */\nconst rootHref = computed(() => (\n typeof rootTag.value === 'string' && rootTag.value !== 'a' ? undefined : props.href\n))\n\nconst headingLevel = useGrComponentProp('GrCard', 'headingLevel', () => props.headingLevel, 3)\n\n/**\n * Заголовок внутри `<button>` невалиден: контент-модель кнопки — phrasing\n * content. Кликабельная карточка печатает подпись `<span>`, а структура\n * страницы в этом случае собирается ссылкой в заголовке рядом с `hoverable`.\n */\nlet headingInButtonWarned = false\n\nconst headingTag = computed(() => {\n if (rootTag.value !== 'button') return `h${headingLevel.value}`\n\n if (!headingInButtonWarned && process.env.NODE_ENV !== 'production') {\n headingInButtonWarned = true\n console.warn(\n '[GrCard] `title` внутри `clickable` печатается `<span>`: заголовок в '\n + '`<button>` невалиден по HTML. Нужен заголовок в структуре страницы — '\n + 'замените `clickable` на `hoverable` и поставьте ссылку в сам заголовок.',\n )\n }\n\n return 'span'\n})\n\nconst titleId = useId()\nconst descriptionId = useId()\n\n// `#header` сильнее пропов: нестандартная шапка не обязана объяснять, почему\n// она не `title`.\nconst hasOwnHeader = computed(() => Boolean(slots.header))\nconst hasTitle = computed(() => !hasOwnHeader.value && Boolean(props.title))\nconst hasDescription = computed(() => !hasOwnHeader.value && Boolean(props.description))\nconst hasHeadingBlock = computed(() => hasTitle.value || hasDescription.value)\n\n/**\n * Обёртки появляются, только когда их попросили: карточка без секций остаётся\n * одним `<div>` со слотом внутри — ровно тем, что рендерили `GrCollapse` и\n * `GrList` до появления пропов.\n */\nconst hasSections = computed(() => Boolean(\n slots.header || slots.footer || props.bodyClass || hasHeadingBlock.value,\n))\n\n/**\n * Имя карточки-ссылки. Без него доступным именем становится всё содержимое\n * подряд — заголовок, описание и тело одной строкой.\n */\nconst rootLabelledBy = computed(() => (isInteractive.value && hasTitle.value ? titleId : undefined))\nconst rootDescribedBy = computed(() => (isInteractive.value && hasDescription.value ? descriptionId : undefined))\n\nconst rootClass = computed(() => grCardRootClass({\n variant: resolvedVariant.value,\n // С секциями отступ принадлежит каждой из них, а не поверхности целиком.\n padding: hasSections.value ? 'none' : resolvedPadding.value,\n interactive: isInteractive.value,\n hoverable: props.hoverable,\n}))\n\nconst sectionPaddingClass = computed(() => paddingClass[resolvedPadding.value])\n\n/**\n * Карточка отбивает то, что рисует сама. Шапка из `title` — её собственная, и\n * отступ ей полагается независимо от `padding`. Слот `#header` сильнее пропов и\n * заменяет шапку целиком: там отступы принадлежат тому, кто её наполнил, —\n * иначе потребитель со своими отступами внутри слота получил бы двойные.\n */\nconst headerClass = computed(() => [\n hasOwnHeader.value ? sectionPaddingClass.value : ownHeaderPaddingClass,\n sectionDividerBottomClass,\n].filter(Boolean).join(' '))\nconst footerClass = computed(() => [sectionPaddingClass.value, sectionDividerTopClass].filter(Boolean).join(' '))\nconst bodySectionClass = computed(() => [sectionPaddingClass.value, props.bodyClass].filter(Boolean).join(' '))\n\nfunction onClick(event: MouseEvent): void {\n emit('click', event)\n}\n</script>\n\n<template>\n <component\n :is=\"rootTag\"\n data-gr-card\n :type=\"rootTag === 'button' ? 'button' : undefined\"\n :href=\"rootHref\"\n :class=\"rootClass\"\n :aria-labelledby=\"rootLabelledBy\"\n :aria-describedby=\"rootDescribedBy\"\n @click=\"onClick\"\n >\n <template v-if=\"hasSections\">\n <div v-if=\"hasOwnHeader || hasHeadingBlock\" data-gr-card-header :class=\"headerClass\">\n <slot name=\"header\">\n <component\n :is=\"headingTag\"\n v-if=\"hasTitle\"\n :id=\"titleId\"\n data-gr-card-title\n :class=\"cardTitleClass\"\n >\n {{ title }}\n </component>\n\n <p\n v-if=\"hasDescription\"\n :id=\"descriptionId\"\n data-gr-card-description\n :class=\"cardDescriptionClass\"\n >\n {{ description }}\n </p>\n </slot>\n </div>\n\n <div data-gr-card-body :class=\"bodySectionClass\">\n <slot />\n </div>\n\n <div v-if=\"$slots.footer\" data-gr-card-footer :class=\"footerClass\">\n <slot name=\"footer\" />\n </div>\n </template>\n\n <slot v-else />\n </component>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, markRaw, useId, useSlots, type Component } from 'vue'\n\nimport { useGrComponentProp } from '../GrConfigProvider/context'\n\nimport {\n cardDescriptionClass,\n cardTitleClass,\n grCardRootClass,\n ownHeaderPaddingClass,\n paddingClass,\n sectionDividerBottomClass,\n sectionDividerTopClass,\n type GrCardHeadingLevel,\n type GrCardPadding,\n type GrCardVariant,\n} from './grCardStyles'\n\nexport type { GrCardHeadingLevel, GrCardPadding, GrCardVariant } from './grCardStyles'\n\nexport interface GrCardProps {\n /**\n * Внутренние отступы. По умолчанию `none`: карточка — поверхность, а её\n * содержимое (`GrCollapse`, `GrList`) само знает про свои отступы.\n */\n padding?: GrCardPadding\n /** `elevated` — рамка, фон и тень; `outlined` — без тени; `ghost` — без рамки. */\n variant?: GrCardVariant\n /** Свой корневой тег (`RouterLink`, `Link` от Inertia). Сильнее `href`. */\n as?: string | Component\n /** Карточка-ссылка. */\n href?: string\n /** Карточка-кнопка: интерактивна вся поверхность. */\n clickable?: boolean\n /** Подсветка при наведении без интерактивности. */\n hoverable?: boolean\n /** Классы обёртки тела — она появляется вместе с секциями. */\n bodyClass?: string\n /**\n * Заголовок карточки — настоящий `h2`…`h6`, а не жирная строка: отчёт из\n * шести карточек иначе не обойти по структуре, после `h1` страницы в нём\n * нет ни одного заголовка.\n */\n title?: string\n /** Пояснение под заголовком. */\n description?: string\n /** Уровень заголовка под структуру страницы. Не задан — из `GrConfigProvider`, иначе `3`. */\n headingLevel?: GrCardHeadingLevel\n}\n\nexport interface GrCardEmits {\n (e: 'click', event: MouseEvent): void\n}\n\nconst props = withDefaults(defineProps<GrCardProps>(), {\n // Настраивается через `GrConfigProvider`; дефолты — в резолверах ниже.\n padding: undefined,\n variant: undefined,\n as: undefined,\n href: undefined,\n clickable: false,\n hoverable: false,\n bodyClass: undefined,\n title: undefined,\n description: undefined,\n headingLevel: undefined,\n})\n\nconst emit = defineEmits<GrCardEmits>()\n\nconst slots = useSlots()\n\nconst resolvedPadding = useGrComponentProp('GrCard', 'padding', () => props.padding, 'none')\nconst resolvedVariant = useGrComponentProp('GrCard', 'variant', () => props.variant, 'elevated')\n\nconst isInteractive = computed(() => !!props.as || !!props.href || props.clickable)\n\nconst rootTag = computed<string | Component>(() => {\n if (props.as)\n return typeof props.as === 'string' ? props.as : markRaw(props.as)\n\n if (props.href)\n return 'a'\n\n return props.clickable ? 'button' : 'div'\n})\n\n/**\n * Компонент-ссылка (`Link` от Inertia, `RouterLink`) рендерит `<a>` сам, и без\n * `href` он ведёт в никуда. Строковый тег, кроме `a`, атрибут не понимает —\n * там он и гасится.\n */\nconst rootHref = computed(() => (\n typeof rootTag.value === 'string' && rootTag.value !== 'a' ? undefined : props.href\n))\n\nconst headingLevel = useGrComponentProp('GrCard', 'headingLevel', () => props.headingLevel, 3)\n\n/**\n * Заголовок внутри `<button>` невалиден: контент-модель кнопки — phrasing\n * content. Кликабельная карточка печатает подпись `<span>`, а структура\n * страницы в этом случае собирается ссылкой в заголовке рядом с `hoverable`.\n */\nlet headingInButtonWarned = false\n\nconst headingTag = computed(() => {\n if (rootTag.value !== 'button') return `h${headingLevel.value}`\n\n if (!headingInButtonWarned && process.env.NODE_ENV !== 'production') {\n headingInButtonWarned = true\n console.warn(\n '[GrCard] `title` внутри `clickable` печатается `<span>`: заголовок в '\n + '`<button>` невалиден по HTML. Нужен заголовок в структуре страницы — '\n + 'замените `clickable` на `hoverable` и поставьте ссылку в сам заголовок.',\n )\n }\n\n return 'span'\n})\n\nconst titleId = useId()\nconst descriptionId = useId()\n\n// `#header` сильнее пропов: нестандартная шапка не обязана объяснять, почему\n// она не `title`.\nconst hasOwnHeader = computed(() => Boolean(slots.header))\nconst hasTitle = computed(() => !hasOwnHeader.value && Boolean(props.title))\nconst hasDescription = computed(() => !hasOwnHeader.value && Boolean(props.description))\nconst hasHeadingBlock = computed(() => hasTitle.value || hasDescription.value)\n\n/**\n * Обёртки появляются, только когда их попросили: карточка без секций остаётся\n * одним `<div>` со слотом внутри — ровно тем, что рендерили `GrCollapse` и\n * `GrList` до появления пропов.\n */\nconst hasSections = computed(() => Boolean(\n slots.header || slots.footer || props.bodyClass || hasHeadingBlock.value,\n))\n\n/**\n * Имя карточки-ссылки. Без него доступным именем становится всё содержимое\n * подряд — заголовок, описание и тело одной строкой.\n */\nconst rootLabelledBy = computed(() => (isInteractive.value && hasTitle.value ? titleId : undefined))\nconst rootDescribedBy = computed(() => (isInteractive.value && hasDescription.value ? descriptionId : undefined))\n\nconst rootClass = computed(() => grCardRootClass({\n variant: resolvedVariant.value,\n // С секциями отступ принадлежит каждой из них, а не поверхности целиком.\n padding: hasSections.value ? 'none' : resolvedPadding.value,\n interactive: isInteractive.value,\n hoverable: props.hoverable,\n}))\n\nconst sectionPaddingClass = computed(() => paddingClass[resolvedPadding.value])\n\n/**\n * Карточка отбивает то, что рисует сама. Шапка из `title` — её собственная, и\n * отступ ей полагается независимо от `padding`. Слот `#header` сильнее пропов и\n * заменяет шапку целиком: там отступы принадлежат тому, кто её наполнил, —\n * иначе потребитель со своими отступами внутри слота получил бы двойные.\n */\nconst headerClass = computed(() => [\n hasOwnHeader.value ? sectionPaddingClass.value : ownHeaderPaddingClass,\n sectionDividerBottomClass,\n].filter(Boolean).join(' '))\nconst footerClass = computed(() => [sectionPaddingClass.value, sectionDividerTopClass].filter(Boolean).join(' '))\nconst bodySectionClass = computed(() => [sectionPaddingClass.value, props.bodyClass].filter(Boolean).join(' '))\n\nfunction onClick(event: MouseEvent): void {\n emit('click', event)\n}\n</script>\n\n<template>\n <component\n :is=\"rootTag\"\n data-gr-card\n :type=\"rootTag === 'button' ? 'button' : undefined\"\n :href=\"rootHref\"\n :class=\"rootClass\"\n :aria-labelledby=\"rootLabelledBy\"\n :aria-describedby=\"rootDescribedBy\"\n @click=\"onClick\"\n >\n <template v-if=\"hasSections\">\n <div v-if=\"hasOwnHeader || hasHeadingBlock\" data-gr-card-header :class=\"headerClass\">\n <slot name=\"header\">\n <component\n :is=\"headingTag\"\n v-if=\"hasTitle\"\n :id=\"titleId\"\n data-gr-card-title\n :class=\"cardTitleClass\"\n >\n {{ title }}\n </component>\n\n <p\n v-if=\"hasDescription\"\n :id=\"descriptionId\"\n data-gr-card-description\n :class=\"cardDescriptionClass\"\n >\n {{ description }}\n </p>\n </slot>\n </div>\n\n <div data-gr-card-body :class=\"bodySectionClass\">\n <slot />\n </div>\n\n <div v-if=\"$slots.footer\" data-gr-card-footer :class=\"footerClass\">\n <slot name=\"footer\" />\n </div>\n </template>\n\n <slot v-else />\n </component>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAsDA,MAAM,QAAQ;EAcd,MAAM,OAAO;EAEb,MAAM,QAAQ,SAAS;EAEvB,MAAM,kBAAkB,mBAAmB,UAAU,iBAAiB,MAAM,SAAS,MAAM;EAC3F,MAAM,kBAAkB,mBAAmB,UAAU,iBAAiB,MAAM,SAAS,UAAU;EAE/F,MAAM,gBAAgB,eAAe,CAAC,CAAC,MAAM,MAAM,CAAC,CAAC,MAAM,QAAQ,MAAM,SAAS;EAElF,MAAM,UAAU,eAAmC;GACjD,IAAI,MAAM,IACR,OAAO,OAAO,MAAM,OAAO,WAAW,MAAM,KAAK,QAAQ,MAAM,EAAE;GAEnE,IAAI,MAAM,MACR,OAAO;GAET,OAAO,MAAM,YAAY,WAAW;EACtC,CAAC;;;;;;EAOD,MAAM,WAAW,eACf,OAAO,QAAQ,UAAU,YAAY,QAAQ,UAAU,MAAM,KAAA,IAAY,MAAM,IAChF;EAED,MAAM,eAAe,mBAAmB,UAAU,sBAAsB,MAAM,cAAc,CAAC;;;;;;EAO7F,IAAI,wBAAwB;EAE5B,MAAM,aAAa,eAAe;GAChC,IAAI,QAAQ,UAAU,UAAU,OAAO,IAAI,aAAa;GAExD,IAAI,CAAC,yBAAA,QAAA,IAAA,aAAkD,cAAc;IACnE,wBAAwB;IACxB,QAAQ,KACN,mNAGF;GACF;GAEA,OAAO;EACT,CAAC;EAED,MAAM,UAAU,MAAM;EACtB,MAAM,gBAAgB,MAAM;EAI5B,MAAM,eAAe,eAAe,QAAQ,MAAM,MAAM,CAAC;EACzD,MAAM,WAAW,eAAe,CAAC,aAAa,SAAS,QAAQ,MAAM,KAAK,CAAC;EAC3E,MAAM,iBAAiB,eAAe,CAAC,aAAa,SAAS,QAAQ,MAAM,WAAW,CAAC;EACvF,MAAM,kBAAkB,eAAe,SAAS,SAAS,eAAe,KAAK;;;;;;EAO7E,MAAM,cAAc,eAAe,QACjC,MAAM,UAAU,MAAM,UAAU,MAAM,aAAa,gBAAgB,KACrE,CAAC;;;;;EAMD,MAAM,iBAAiB,eAAgB,cAAc,SAAS,SAAS,QAAQ,UAAU,KAAA,CAAU;EACnG,MAAM,kBAAkB,eAAgB,cAAc,SAAS,eAAe,QAAQ,gBAAgB,KAAA,CAAU;EAEhH,MAAM,YAAY,eAAe,gBAAgB;GAC/C,SAAS,gBAAgB;GAEzB,SAAS,YAAY,QAAQ,SAAS,gBAAgB;GACtD,aAAa,cAAc;GAC3B,WAAW,MAAM;EACnB,CAAC,CAAC;EAEF,MAAM,sBAAsB,eAAe,aAAa,gBAAgB,MAAM;;;;;;;EAQ9E,MAAM,cAAc,eAAe,CACjC,aAAa,QAAQ,oBAAoB,QAAQ,uBACjD,yBACF,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG,CAAC;EAC3B,MAAM,cAAc,eAAe,CAAC,oBAAoB,OAAO,sBAAsB,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG,CAAC;EAChH,MAAM,mBAAmB,eAAe,CAAC,oBAAoB,OAAO,MAAM,SAAS,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG,CAAC;EAE9G,SAAS,QAAQ,OAAyB;GACxC,KAAK,SAAS,KAAK;EACrB;;uBAIE,YA4CY,wBA3CL,QAAA,KAAO,GAAA;IACZ,gBAAA;IACC,MAAM,QAAA,UAAO,WAAA,WAA2B,KAAA;IACxC,MAAM,SAAA;IACN,OAAK,eAAE,UAAA,KAAS;IAChB,mBAAiB,eAAA;IACjB,oBAAkB,gBAAA;IACX;;2BAiCG,CA/BK,YAAA,SAAA,UAAA,GAAhB,mBA+BW,UAAA,EAAA,KAAA,EAAA,GAAA;KA9BE,aAAA,SAAgB,gBAAA,SAAA,UAAA,GAA3B,mBAqBM,OAAA;;MArBsC,uBAAA;MAAqB,OAAK,eAAE,YAAA,KAAW;SACjF,WAmBO,KAAA,QAAA,UAAA,CAAA,SAAA,CAhBG,SAAA,SAAA,UAAA,GAFR,YAQY,wBAPL,WAAA,KAAU,GAAA;;MAEd,IAAI,MAAA,OAAA;MACL,sBAAA;MACC,OAAK,eAAE,MAAA,cAAA,CAAc;;6BAEX,CAAA,gBAAA,gBAAR,QAAA,KAAK,GAAA,CAAA,CAAA,CAAA;;6DAIF,eAAA,SAAA,UAAA,GADR,mBAOI,KAAA;;MALD,IAAI,MAAA,aAAA;MACL,4BAAA;MACC,OAAK,eAAE,MAAA,oBAAA,CAAoB;wBAEzB,QAAA,WAAW,GAAA,IAAA,UAAA,KAAA,mBAAA,IAAA,IAAA,CAAA,CAAA,CAAA,GAAA,CAAA,KAAA,mBAAA,IAAA,IAAA;KAKpB,mBAEM,OAAA;MAFD,qBAAA;MAAmB,OAAK,eAAE,iBAAA,KAAgB;SAC7C,WAAQ,KAAA,QAAA,SAAA,CAAA,GAAA,CAAA;KAGCA,KAAAA,OAAO,UAAA,UAAA,GAAlB,mBAEM,OAAA;;MAFoB,uBAAA;MAAqB,OAAK,eAAE,YAAA,KAAW;SAC/D,WAAsB,KAAA,QAAA,QAAA,CAAA,GAAA,CAAA,KAAA,mBAAA,IAAA,IAAA;cAI1B,WAAe,KAAA,QAAA,WAAA,CAAA,GAAA,KAAA,GAAA,KAAA,GAAA,CAAA,CAAA,CAAA"}
@@ -1,3 +1,3 @@
1
- import { n as grCardSafelist, t as grCardConfig } from "../../chunks/config-Bm_Sovla.js";
2
- import { t as GrCard_default } from "./chunks/GrCard-Bc7nRfbe.js";
1
+ import { n as grCardSafelist, t as grCardConfig } from "../../chunks/config-DYgfMrIF.js";
2
+ import { t as GrCard_default } from "./chunks/GrCard-gI2wA8ZZ.js";
3
3
  export { GrCard_default as GrCard, GrCard_default as default, grCardConfig, grCardSafelist };
@@ -2,7 +2,7 @@ import { a as useGrComponentSize, i as useGrComponentProp } from "../../../chunk
2
2
  import { n as useGranularityTranslations } from "../../../chunks/granularityI18n-BC5zsj_d.js";
3
3
  import { t as GrIcon_default } from "../../GrIcon/chunks/GrIcon-bQwtZtYT.js";
4
4
  import { t as chevron_down_default } from "../../../chunks/chevron-down-CQS2OG_s.js";
5
- import { t as GrCard_default } from "../../GrCard/chunks/GrCard-Bc7nRfbe.js";
5
+ import { t as GrCard_default } from "../../GrCard/chunks/GrCard-gI2wA8ZZ.js";
6
6
  import { n as hasMeaningfulSlotContent } from "../../../chunks/slotNodes-DxNXpC7v.js";
7
7
  import { a as grCollapseBodyClass, c as grCollapseHeaderClass, i as collapseExtraPaddings, l as grCollapseRowClass, o as grCollapseChevronClass, r as collapseChevronSizes, s as grCollapseEmptyClass, u as grCollapseTitleClass } from "../../../chunks/config-DU2DNSRx.js";
8
8
  import { computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, inject, normalizeClass, openBlock, provide, ref, renderSlot, resolveDynamicComponent, toDisplayString, unref, useId, useSlots, withCtx } from "vue";
@@ -1 +1 @@
1
- {"version":3,"file":"GrCollapse-C1rCfbc0.js","names":["$slots"],"sources":["../../../../src/components/GrCollapse/grCollapseContext.ts","../../../../src/components/GrCollapse/GrCollapse.vue","../../../../src/components/GrCollapse/GrCollapse.vue","../../../../src/components/GrCollapse/GrCollapseItem.vue","../../../../src/components/GrCollapse/GrCollapseItem.vue"],"sourcesContent":["import type { ComputedRef, InjectionKey } from 'vue'\n\nimport type { GrComponentSize } from '../shared/sizes'\n\nexport type GrCollapseValue = string | number\n\nexport type GrCollapseModelValue = GrCollapseValue | GrCollapseValue[] | undefined\n\n/**\n * Уровень заголовка секции. APG для accordion требует, чтобы он соответствовал\n * структуре страницы: аккордеон в разделе `<h4>` с захардкоженным `<h3>` рвёт\n * навигацию по заголовкам.\n */\nexport const GR_COLLAPSE_HEADING_LEVELS = [2, 3, 4, 5, 6] as const\n\nexport type GrCollapseHeadingLevel = typeof GR_COLLAPSE_HEADING_LEVELS[number]\n\n/** Сторона шеврона относительно заголовка — логическая, не физическая (RTL). */\nexport const GR_COLLAPSE_ICON_POSITIONS = ['start', 'end'] as const\n\nexport type GrCollapseIconPosition = typeof GR_COLLAPSE_ICON_POSITIONS[number]\n\n/**\n * Async-guard на переключение секции: `false` отменяет его. Второй аргумент —\n * куда идёт секция (`true` — раскрывается), чтобы «сохранить изменения?»\n * спрашивалось только на сворачивании.\n */\nexport type GrCollapseBeforeChange = (\n name: GrCollapseValue,\n expanding: boolean,\n) => boolean | void | Promise<boolean | void>\n\nexport type GrCollapseContext = {\n accordion: ComputedRef<boolean>\n disabled: ComputedRef<boolean>\n size: ComputedRef<GrComponentSize>\n headingLevel: ComputedRef<GrCollapseHeadingLevel>\n expandIconPosition: ComputedRef<GrCollapseIconPosition>\n isActive: (name: GrCollapseValue) => boolean\n toggle: (name: GrCollapseValue) => void\n}\n\nexport const GR_COLLAPSE_CONTEXT: InjectionKey<GrCollapseContext> = Symbol('GR_COLLAPSE_CONTEXT')\n","<script setup lang=\"ts\">\nimport { computed, provide, useSlots } from 'vue'\n\nimport GrCard from '../GrCard'\nimport { useGrComponentProp, useGrComponentSize } from '../GrConfigProvider/context'\nimport { useGranularityTranslations } from '../../internal/granularityI18n'\nimport { hasMeaningfulSlotContent } from '../shared/slotNodes'\nimport { grCollapseEmptyClass } from './grCollapseStyles'\n\nimport {\n GR_COLLAPSE_CONTEXT,\n type GrCollapseBeforeChange,\n type GrCollapseContext,\n type GrCollapseHeadingLevel,\n type GrCollapseIconPosition,\n type GrCollapseModelValue,\n type GrCollapseValue,\n} from './grCollapseContext'\n\nimport type { GrComponentSize } from '../shared/sizes'\n\nimport './defaults'\n\n/**\n * GrCollapse — контейнер секций `GrCollapseItem`.\n *\n * @prop modelValue — открытые секции. В `accordion`-режиме — `string|number|undefined`, иначе — массив значений.\n * @prop accordion — режим, когда одновременно может быть открыта только одна секция.\n * @prop disabled — блокирует взаимодействие со всеми секциями.\n * @prop divided — разделители между секциями.\n * @prop borderless — без обёртки в `GrCard`: аккордеон внутри карточки или сайдбара\n * иначе получает вторую рамку и вторую тень.\n * @prop beforeChange — async-guard: `false` отменяет переключение.\n */\nexport interface GrCollapseProps {\n modelValue?: GrCollapseModelValue\n accordion?: boolean\n disabled?: boolean\n divided?: boolean\n borderless?: boolean\n /** Уровень заголовков секций (`h2`…`h6`) — под структуру страницы. */\n headingLevel?: GrCollapseHeadingLevel\n /** Сторона шеврона относительно заголовка. */\n expandIconPosition?: GrCollapseIconPosition\n beforeChange?: GrCollapseBeforeChange\n /** Размер секций. Не задан — берётся из `GrConfigProvider`, иначе `md`. */\n size?: GrComponentSize\n /**\n * Пусто ли. Не задан — считается по содержимому: аккордеон без секций\n * показывает заглушку вместо пустой рамки. `false` подавляет автоопределение —\n * например, когда секции приезжают асинхронно и мигать текстом не надо.\n */\n empty?: boolean\n /** Текст пустого состояния. Слот `#empty` сильнее. */\n emptyText?: string\n}\n\nexport interface GrCollapseEmits {\n (e: 'update:modelValue', value: GrCollapseModelValue): void\n (e: 'change', value: GrCollapseModelValue): void\n}\n\n// Дефолты оформления намеренно `undefined`: «настоящий» дефолт живёт в\n// `useGrComponentProp`, иначе `GrConfigProvider` не отличит заданный пользователем\n// проп от подставленного Vue.\nconst props = withDefaults(defineProps<GrCollapseProps>(), {\n modelValue: undefined,\n accordion: false,\n disabled: false,\n divided: undefined,\n borderless: undefined,\n headingLevel: undefined,\n expandIconPosition: undefined,\n beforeChange: undefined,\n size: undefined,\n empty: undefined,\n emptyText: undefined,\n})\n\nconst emit = defineEmits<GrCollapseEmits>()\n\ndefineSlots<{\n /** Секции аккордеона (`GrCollapseItem`). */\n default?: () => any\n /** Содержимое пустого состояния вместо текста по умолчанию. */\n empty?: () => any\n}>()\n\nconst slots = useSlots()\nconst { t } = useGranularityTranslations()\n\nconst resolvedSize = useGrComponentSize(() => props.size, { component: 'GrCollapse' })\nconst divided = useGrComponentProp('GrCollapse', 'divided', () => props.divided, true)\nconst borderless = useGrComponentProp('GrCollapse', 'borderless', () => props.borderless, false)\nconst headingLevel = useGrComponentProp('GrCollapse', 'headingLevel', () => props.headingLevel, 3)\nconst expandIconPosition = useGrComponentProp('GrCollapse', 'expandIconPosition', () => props.expandIconPosition, 'end')\n\nconst resolvedEmptyText = computed(() => props.emptyText ?? t('gr.collapse.empty', 'Nothing here yet'))\n\n/**\n * Пустоту считает общий разборщик слота: `v-for` приходит фрагментом, `v-if`\n * оставляет после себя комментарий, а шаблон — переносы строк, и всё это не\n * содержимое.\n */\nconst isEmpty = computed(() => {\n if (props.empty !== undefined) return props.empty\n\n return !hasMeaningfulSlotContent(slots.default?.() ?? [])\n})\n\nconst activeSet = computed(() => {\n const value = props.modelValue\n\n if (props.accordion) {\n if (typeof value === 'string' || typeof value === 'number') {\n return new Set<GrCollapseValue>([value])\n }\n\n return new Set<GrCollapseValue>()\n }\n\n if (Array.isArray(value)) {\n return new Set<GrCollapseValue>(value)\n }\n\n if (typeof value === 'string' || typeof value === 'number') {\n return new Set<GrCollapseValue>([value])\n }\n\n return new Set<GrCollapseValue>()\n})\n\nfunction setModelValue(next: GrCollapseModelValue): void {\n emit('update:modelValue', next)\n emit('change', next)\n}\n\nfunction applyToggle(name: GrCollapseValue): void {\n if (props.accordion) {\n const next = activeSet.value.has(name) ? undefined : name\n setModelValue(next)\n return\n }\n\n const current = Array.isArray(props.modelValue)\n ? [...props.modelValue]\n : typeof props.modelValue === 'string' || typeof props.modelValue === 'number'\n ? [props.modelValue]\n : []\n\n const exists = current.includes(name)\n const next = exists\n ? current.filter(x => x !== name)\n : [...current, name]\n\n setModelValue(next)\n}\n\n// Секции, у которых guard ещё не ответил. Без этого повторный клик по заголовку\n// уходил бы во второй `beforeChange`, и после двух «да» состояние переключилось\n// бы дважды — то есть вернулось бы к исходному.\nconst awaitingGuard = new Set<GrCollapseValue>()\n\nasync function toggle(name: GrCollapseValue): Promise<void> {\n if (props.disabled || awaitingGuard.has(name))\n return\n\n if (!props.beforeChange) {\n applyToggle(name)\n return\n }\n\n awaitingGuard.add(name)\n try {\n if (await props.beforeChange(name, !activeSet.value.has(name)) === false)\n return\n\n applyToggle(name)\n }\n finally {\n awaitingGuard.delete(name)\n }\n}\n\nconst context: GrCollapseContext = {\n accordion: computed(() => props.accordion),\n disabled: computed(() => props.disabled),\n size: resolvedSize,\n headingLevel,\n expandIconPosition,\n isActive: name => activeSet.value.has(name),\n toggle: (name) => { void toggle(name) },\n}\n\nprovide(GR_COLLAPSE_CONTEXT, context)\n</script>\n\n<template>\n <GrCard v-if=\"!borderless\" data-gr-collapse>\n <div\n v-if=\"isEmpty\"\n data-gr-collapse-empty\n :class=\"grCollapseEmptyClass(resolvedSize)\"\n >\n <slot name=\"empty\">\n {{ resolvedEmptyText }}\n </slot>\n </div>\n\n <div v-else :class=\"divided ? 'divide-y divide-[var(--gr-brd)]' : ''\">\n <slot />\n </div>\n </GrCard>\n\n <!-- Разделители остаются на корне: без обёртки в карточку он и есть список\n секций, и лишний уровень вложенности сдвинул бы вёрстку потребителя. -->\n <div\n v-else\n data-gr-collapse\n :class=\"divided ? 'divide-y divide-[var(--gr-brd)]' : ''\"\n >\n <div\n v-if=\"isEmpty\"\n data-gr-collapse-empty\n :class=\"grCollapseEmptyClass(resolvedSize)\"\n >\n <slot name=\"empty\">\n {{ resolvedEmptyText }}\n </slot>\n </div>\n\n <slot v-else />\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, provide, useSlots } from 'vue'\n\nimport GrCard from '../GrCard'\nimport { useGrComponentProp, useGrComponentSize } from '../GrConfigProvider/context'\nimport { useGranularityTranslations } from '../../internal/granularityI18n'\nimport { hasMeaningfulSlotContent } from '../shared/slotNodes'\nimport { grCollapseEmptyClass } from './grCollapseStyles'\n\nimport {\n GR_COLLAPSE_CONTEXT,\n type GrCollapseBeforeChange,\n type GrCollapseContext,\n type GrCollapseHeadingLevel,\n type GrCollapseIconPosition,\n type GrCollapseModelValue,\n type GrCollapseValue,\n} from './grCollapseContext'\n\nimport type { GrComponentSize } from '../shared/sizes'\n\nimport './defaults'\n\n/**\n * GrCollapse — контейнер секций `GrCollapseItem`.\n *\n * @prop modelValue — открытые секции. В `accordion`-режиме — `string|number|undefined`, иначе — массив значений.\n * @prop accordion — режим, когда одновременно может быть открыта только одна секция.\n * @prop disabled — блокирует взаимодействие со всеми секциями.\n * @prop divided — разделители между секциями.\n * @prop borderless — без обёртки в `GrCard`: аккордеон внутри карточки или сайдбара\n * иначе получает вторую рамку и вторую тень.\n * @prop beforeChange — async-guard: `false` отменяет переключение.\n */\nexport interface GrCollapseProps {\n modelValue?: GrCollapseModelValue\n accordion?: boolean\n disabled?: boolean\n divided?: boolean\n borderless?: boolean\n /** Уровень заголовков секций (`h2`…`h6`) — под структуру страницы. */\n headingLevel?: GrCollapseHeadingLevel\n /** Сторона шеврона относительно заголовка. */\n expandIconPosition?: GrCollapseIconPosition\n beforeChange?: GrCollapseBeforeChange\n /** Размер секций. Не задан — берётся из `GrConfigProvider`, иначе `md`. */\n size?: GrComponentSize\n /**\n * Пусто ли. Не задан — считается по содержимому: аккордеон без секций\n * показывает заглушку вместо пустой рамки. `false` подавляет автоопределение —\n * например, когда секции приезжают асинхронно и мигать текстом не надо.\n */\n empty?: boolean\n /** Текст пустого состояния. Слот `#empty` сильнее. */\n emptyText?: string\n}\n\nexport interface GrCollapseEmits {\n (e: 'update:modelValue', value: GrCollapseModelValue): void\n (e: 'change', value: GrCollapseModelValue): void\n}\n\n// Дефолты оформления намеренно `undefined`: «настоящий» дефолт живёт в\n// `useGrComponentProp`, иначе `GrConfigProvider` не отличит заданный пользователем\n// проп от подставленного Vue.\nconst props = withDefaults(defineProps<GrCollapseProps>(), {\n modelValue: undefined,\n accordion: false,\n disabled: false,\n divided: undefined,\n borderless: undefined,\n headingLevel: undefined,\n expandIconPosition: undefined,\n beforeChange: undefined,\n size: undefined,\n empty: undefined,\n emptyText: undefined,\n})\n\nconst emit = defineEmits<GrCollapseEmits>()\n\ndefineSlots<{\n /** Секции аккордеона (`GrCollapseItem`). */\n default?: () => any\n /** Содержимое пустого состояния вместо текста по умолчанию. */\n empty?: () => any\n}>()\n\nconst slots = useSlots()\nconst { t } = useGranularityTranslations()\n\nconst resolvedSize = useGrComponentSize(() => props.size, { component: 'GrCollapse' })\nconst divided = useGrComponentProp('GrCollapse', 'divided', () => props.divided, true)\nconst borderless = useGrComponentProp('GrCollapse', 'borderless', () => props.borderless, false)\nconst headingLevel = useGrComponentProp('GrCollapse', 'headingLevel', () => props.headingLevel, 3)\nconst expandIconPosition = useGrComponentProp('GrCollapse', 'expandIconPosition', () => props.expandIconPosition, 'end')\n\nconst resolvedEmptyText = computed(() => props.emptyText ?? t('gr.collapse.empty', 'Nothing here yet'))\n\n/**\n * Пустоту считает общий разборщик слота: `v-for` приходит фрагментом, `v-if`\n * оставляет после себя комментарий, а шаблон — переносы строк, и всё это не\n * содержимое.\n */\nconst isEmpty = computed(() => {\n if (props.empty !== undefined) return props.empty\n\n return !hasMeaningfulSlotContent(slots.default?.() ?? [])\n})\n\nconst activeSet = computed(() => {\n const value = props.modelValue\n\n if (props.accordion) {\n if (typeof value === 'string' || typeof value === 'number') {\n return new Set<GrCollapseValue>([value])\n }\n\n return new Set<GrCollapseValue>()\n }\n\n if (Array.isArray(value)) {\n return new Set<GrCollapseValue>(value)\n }\n\n if (typeof value === 'string' || typeof value === 'number') {\n return new Set<GrCollapseValue>([value])\n }\n\n return new Set<GrCollapseValue>()\n})\n\nfunction setModelValue(next: GrCollapseModelValue): void {\n emit('update:modelValue', next)\n emit('change', next)\n}\n\nfunction applyToggle(name: GrCollapseValue): void {\n if (props.accordion) {\n const next = activeSet.value.has(name) ? undefined : name\n setModelValue(next)\n return\n }\n\n const current = Array.isArray(props.modelValue)\n ? [...props.modelValue]\n : typeof props.modelValue === 'string' || typeof props.modelValue === 'number'\n ? [props.modelValue]\n : []\n\n const exists = current.includes(name)\n const next = exists\n ? current.filter(x => x !== name)\n : [...current, name]\n\n setModelValue(next)\n}\n\n// Секции, у которых guard ещё не ответил. Без этого повторный клик по заголовку\n// уходил бы во второй `beforeChange`, и после двух «да» состояние переключилось\n// бы дважды — то есть вернулось бы к исходному.\nconst awaitingGuard = new Set<GrCollapseValue>()\n\nasync function toggle(name: GrCollapseValue): Promise<void> {\n if (props.disabled || awaitingGuard.has(name))\n return\n\n if (!props.beforeChange) {\n applyToggle(name)\n return\n }\n\n awaitingGuard.add(name)\n try {\n if (await props.beforeChange(name, !activeSet.value.has(name)) === false)\n return\n\n applyToggle(name)\n }\n finally {\n awaitingGuard.delete(name)\n }\n}\n\nconst context: GrCollapseContext = {\n accordion: computed(() => props.accordion),\n disabled: computed(() => props.disabled),\n size: resolvedSize,\n headingLevel,\n expandIconPosition,\n isActive: name => activeSet.value.has(name),\n toggle: (name) => { void toggle(name) },\n}\n\nprovide(GR_COLLAPSE_CONTEXT, context)\n</script>\n\n<template>\n <GrCard v-if=\"!borderless\" data-gr-collapse>\n <div\n v-if=\"isEmpty\"\n data-gr-collapse-empty\n :class=\"grCollapseEmptyClass(resolvedSize)\"\n >\n <slot name=\"empty\">\n {{ resolvedEmptyText }}\n </slot>\n </div>\n\n <div v-else :class=\"divided ? 'divide-y divide-[var(--gr-brd)]' : ''\">\n <slot />\n </div>\n </GrCard>\n\n <!-- Разделители остаются на корне: без обёртки в карточку он и есть список\n секций, и лишний уровень вложенности сдвинул бы вёрстку потребителя. -->\n <div\n v-else\n data-gr-collapse\n :class=\"divided ? 'divide-y divide-[var(--gr-brd)]' : ''\"\n >\n <div\n v-if=\"isEmpty\"\n data-gr-collapse-empty\n :class=\"grCollapseEmptyClass(resolvedSize)\"\n >\n <slot name=\"empty\">\n {{ resolvedEmptyText }}\n </slot>\n </div>\n\n <slot v-else />\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport ChevronDownIcon from '~icons/lucide/chevron-down'\nimport { computed, inject, ref, useId } from 'vue'\n\nimport GrIcon from '../GrIcon'\n\nimport { GR_COLLAPSE_CONTEXT, type GrCollapseValue } from './grCollapseContext'\nimport {\n collapseChevronSizes,\n collapseExtraPaddings,\n grCollapseBodyClass,\n grCollapseChevronClass,\n grCollapseHeaderClass,\n grCollapseRowClass,\n grCollapseTitleClass,\n} from './grCollapseStyles'\n\n/**\n * GrCollapseItem — одна секция `GrCollapse`. Должна использоваться строго внутри `GrCollapse`.\n *\n * @prop name — уникальный идентификатор секции (для `v-model` у `GrCollapse`); по умолчанию генерируется из `uid`.\n * @prop title — текст заголовка; можно заменить слотом `#title`.\n * @prop disabled — запрещает раскрытие/сворачивание секции.\n *\n * Слот `#extra` (счётчик, бейдж, кнопка) рендерится **рядом с** триггером, а не\n * внутри него: `<button>` внутри `<button>` — невалидная разметка, а axe ловит\n * это как `nested-interactive`.\n */\nexport interface GrCollapseItemProps {\n name?: GrCollapseValue\n title?: string\n disabled?: boolean\n}\n\nconst props = withDefaults(defineProps<GrCollapseItemProps>(), {\n name: undefined,\n title: undefined,\n disabled: false,\n})\n\nconst collapse = inject(GR_COLLAPSE_CONTEXT)\n\nif (!collapse) {\n throw new Error('GrCollapseItem must be used inside GrCollapse')\n}\n\nconst collapseContext = collapse\n\nconst uid = useId()\n\nconst resolvedName = computed<GrCollapseValue>(() => {\n if (typeof props.name === 'string' || typeof props.name === 'number')\n return props.name\n\n return uid\n})\n\nconst resolvedDisabled = computed(() => collapseContext.disabled.value || props.disabled)\nconst expanded = computed(() => collapseContext.isActive(resolvedName.value))\n\nconst headingTag = computed(() => `h${collapseContext.headingLevel.value}`)\nconst iconAtStart = computed(() => collapseContext.expandIconPosition.value === 'start')\n\nconst rowClassName = computed(() => grCollapseRowClass(resolvedDisabled.value))\nconst headerClassName = computed(() => grCollapseHeaderClass({\n size: collapseContext.size.value,\n disabled: resolvedDisabled.value,\n}))\nconst extraClassName = computed(() => collapseExtraPaddings[collapseContext.size.value])\nconst titleClassName = computed(() => grCollapseTitleClass(collapseContext.size.value))\nconst bodyClassName = computed(() => grCollapseBodyClass(collapseContext.size.value))\nconst chevronClassName = computed(() => grCollapseChevronClass(expanded.value))\nconst chevronSize = computed(() => collapseChevronSizes[collapseContext.size.value])\n\n// Свёрнутая панель схлопывается визуально (`grid-rows-[0fr]`), но это не\n// скрытие: без `inert` ссылки и кнопки внутри неё ловятся Tab'ом, фокус уезжает\n// в невидимую область нулевой высоты, а скринридер читает содержимое всех\n// закрытых секций подряд — прямо вопреки `aria-expanded=\"false\"` на триггере.\n// `inert` убирает поддерево и из таб-порядка, и из дерева доступности, при этом\n// (в отличие от `hidden`/`display:none`) не ломает анимацию раскрытия.\nconst headerId = `gr-collapse-header-${uid}`\nconst panelId = `gr-collapse-panel-${uid}`\n\nconst triggerEl = ref<HTMLElement | null>(null)\n\nfunction onToggle(): void {\n if (resolvedDisabled.value)\n return\n\n collapseContext.toggle(resolvedName.value)\n}\n\n/**\n * Только заголовки **своего** аккордеона: вложенный `GrCollapse` внутри\n * раскрытой панели тоже помечен `[data-gr-collapse]`, и без фильтра стрелки\n * внешнего аккордеона перескакивали бы на заголовки внутреннего.\n */\nfunction getAllTriggers(): HTMLElement[] {\n const root = triggerEl.value?.closest('[data-gr-collapse]')\n if (!root)\n return []\n\n const triggers = Array.prototype.slice.call(\n root.querySelectorAll<HTMLElement>('[data-gr-collapse-trigger]'),\n ) as HTMLElement[]\n\n return triggers.filter(trigger => trigger.closest('[data-gr-collapse]') === root)\n}\n\nfunction focusRelative(direction: 1 | -1): void {\n const current = triggerEl.value\n if (!current)\n return\n\n const triggers = getAllTriggers()\n const index = triggers.indexOf(current)\n if (index === -1 || triggers.length === 0)\n return\n\n const nextIndex = (index + direction + triggers.length) % triggers.length\n triggers[nextIndex]?.focus()\n}\n\nfunction focusEdge(edge: 'start' | 'end'): void {\n const triggers = getAllTriggers()\n if (triggers.length === 0)\n return\n\n ;(edge === 'start' ? triggers[0] : triggers.at(-1))?.focus()\n}\n\nfunction onKeydown(event: KeyboardEvent): void {\n if (event.key === 'ArrowDown') {\n event.preventDefault()\n focusRelative(1)\n return\n }\n\n if (event.key === 'ArrowUp') {\n event.preventDefault()\n focusRelative(-1)\n return\n }\n\n if (event.key === 'Home') {\n event.preventDefault()\n focusEdge('start')\n return\n }\n\n if (event.key === 'End') {\n event.preventDefault()\n focusEdge('end')\n return\n }\n\n if (event.key === ' ' || event.key === 'Enter') {\n event.preventDefault()\n onToggle()\n }\n}\n</script>\n\n<template>\n <div\n data-gr-collapse-item\n class=\"text-[var(--gr-fg)]\"\n >\n <div :class=\"rowClassName\">\n <component\n :is=\"headingTag\"\n class=\"m-0 min-w-0 flex-1\"\n >\n <button\n :id=\"headerId\"\n ref=\"triggerEl\"\n data-gr-collapse-trigger\n type=\"button\"\n :aria-expanded=\"expanded ? 'true' : 'false'\"\n :aria-controls=\"panelId\"\n :disabled=\"resolvedDisabled\"\n :class=\"headerClassName\"\n @click=\"onToggle\"\n @keydown=\"onKeydown\"\n >\n <GrIcon\n v-if=\"iconAtStart\"\n :size=\"chevronSize\"\n \n data-gr-collapse-chevron\n :class=\"chevronClassName\"\n >\n <slot name=\"icon\">\n <ChevronDownIcon />\n </slot>\n </GrIcon>\n\n <span :class=\"titleClassName\">\n <slot name=\"title\">\n <span class=\"font-600\">\n {{ title }}\n </span>\n </slot>\n </span>\n\n <GrIcon\n v-if=\"!iconAtStart\"\n :size=\"chevronSize\"\n \n data-gr-collapse-chevron\n :class=\"chevronClassName\"\n >\n <slot name=\"icon\">\n <ChevronDownIcon />\n </slot>\n </GrIcon>\n </button>\n </component>\n\n <div\n v-if=\"$slots.extra\"\n data-gr-collapse-extra\n class=\"shrink-0\"\n :class=\"extraClassName\"\n >\n <slot name=\"extra\" />\n </div>\n </div>\n\n <div\n :id=\"panelId\"\n role=\"region\"\n :aria-labelledby=\"headerId\"\n :inert=\"expanded ? undefined : true\"\n class=\"grid transition-[grid-template-rows] duration-[var(--gr-duration-base)]\"\n :class=\"expanded ? 'grid-rows-[1fr]' : 'grid-rows-[0fr]'\"\n >\n <div class=\"overflow-hidden\">\n <div :class=\"bodyClassName\">\n <slot />\n </div>\n </div>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport ChevronDownIcon from '~icons/lucide/chevron-down'\nimport { computed, inject, ref, useId } from 'vue'\n\nimport GrIcon from '../GrIcon'\n\nimport { GR_COLLAPSE_CONTEXT, type GrCollapseValue } from './grCollapseContext'\nimport {\n collapseChevronSizes,\n collapseExtraPaddings,\n grCollapseBodyClass,\n grCollapseChevronClass,\n grCollapseHeaderClass,\n grCollapseRowClass,\n grCollapseTitleClass,\n} from './grCollapseStyles'\n\n/**\n * GrCollapseItem — одна секция `GrCollapse`. Должна использоваться строго внутри `GrCollapse`.\n *\n * @prop name — уникальный идентификатор секции (для `v-model` у `GrCollapse`); по умолчанию генерируется из `uid`.\n * @prop title — текст заголовка; можно заменить слотом `#title`.\n * @prop disabled — запрещает раскрытие/сворачивание секции.\n *\n * Слот `#extra` (счётчик, бейдж, кнопка) рендерится **рядом с** триггером, а не\n * внутри него: `<button>` внутри `<button>` — невалидная разметка, а axe ловит\n * это как `nested-interactive`.\n */\nexport interface GrCollapseItemProps {\n name?: GrCollapseValue\n title?: string\n disabled?: boolean\n}\n\nconst props = withDefaults(defineProps<GrCollapseItemProps>(), {\n name: undefined,\n title: undefined,\n disabled: false,\n})\n\nconst collapse = inject(GR_COLLAPSE_CONTEXT)\n\nif (!collapse) {\n throw new Error('GrCollapseItem must be used inside GrCollapse')\n}\n\nconst collapseContext = collapse\n\nconst uid = useId()\n\nconst resolvedName = computed<GrCollapseValue>(() => {\n if (typeof props.name === 'string' || typeof props.name === 'number')\n return props.name\n\n return uid\n})\n\nconst resolvedDisabled = computed(() => collapseContext.disabled.value || props.disabled)\nconst expanded = computed(() => collapseContext.isActive(resolvedName.value))\n\nconst headingTag = computed(() => `h${collapseContext.headingLevel.value}`)\nconst iconAtStart = computed(() => collapseContext.expandIconPosition.value === 'start')\n\nconst rowClassName = computed(() => grCollapseRowClass(resolvedDisabled.value))\nconst headerClassName = computed(() => grCollapseHeaderClass({\n size: collapseContext.size.value,\n disabled: resolvedDisabled.value,\n}))\nconst extraClassName = computed(() => collapseExtraPaddings[collapseContext.size.value])\nconst titleClassName = computed(() => grCollapseTitleClass(collapseContext.size.value))\nconst bodyClassName = computed(() => grCollapseBodyClass(collapseContext.size.value))\nconst chevronClassName = computed(() => grCollapseChevronClass(expanded.value))\nconst chevronSize = computed(() => collapseChevronSizes[collapseContext.size.value])\n\n// Свёрнутая панель схлопывается визуально (`grid-rows-[0fr]`), но это не\n// скрытие: без `inert` ссылки и кнопки внутри неё ловятся Tab'ом, фокус уезжает\n// в невидимую область нулевой высоты, а скринридер читает содержимое всех\n// закрытых секций подряд — прямо вопреки `aria-expanded=\"false\"` на триггере.\n// `inert` убирает поддерево и из таб-порядка, и из дерева доступности, при этом\n// (в отличие от `hidden`/`display:none`) не ломает анимацию раскрытия.\nconst headerId = `gr-collapse-header-${uid}`\nconst panelId = `gr-collapse-panel-${uid}`\n\nconst triggerEl = ref<HTMLElement | null>(null)\n\nfunction onToggle(): void {\n if (resolvedDisabled.value)\n return\n\n collapseContext.toggle(resolvedName.value)\n}\n\n/**\n * Только заголовки **своего** аккордеона: вложенный `GrCollapse` внутри\n * раскрытой панели тоже помечен `[data-gr-collapse]`, и без фильтра стрелки\n * внешнего аккордеона перескакивали бы на заголовки внутреннего.\n */\nfunction getAllTriggers(): HTMLElement[] {\n const root = triggerEl.value?.closest('[data-gr-collapse]')\n if (!root)\n return []\n\n const triggers = Array.prototype.slice.call(\n root.querySelectorAll<HTMLElement>('[data-gr-collapse-trigger]'),\n ) as HTMLElement[]\n\n return triggers.filter(trigger => trigger.closest('[data-gr-collapse]') === root)\n}\n\nfunction focusRelative(direction: 1 | -1): void {\n const current = triggerEl.value\n if (!current)\n return\n\n const triggers = getAllTriggers()\n const index = triggers.indexOf(current)\n if (index === -1 || triggers.length === 0)\n return\n\n const nextIndex = (index + direction + triggers.length) % triggers.length\n triggers[nextIndex]?.focus()\n}\n\nfunction focusEdge(edge: 'start' | 'end'): void {\n const triggers = getAllTriggers()\n if (triggers.length === 0)\n return\n\n ;(edge === 'start' ? triggers[0] : triggers.at(-1))?.focus()\n}\n\nfunction onKeydown(event: KeyboardEvent): void {\n if (event.key === 'ArrowDown') {\n event.preventDefault()\n focusRelative(1)\n return\n }\n\n if (event.key === 'ArrowUp') {\n event.preventDefault()\n focusRelative(-1)\n return\n }\n\n if (event.key === 'Home') {\n event.preventDefault()\n focusEdge('start')\n return\n }\n\n if (event.key === 'End') {\n event.preventDefault()\n focusEdge('end')\n return\n }\n\n if (event.key === ' ' || event.key === 'Enter') {\n event.preventDefault()\n onToggle()\n }\n}\n</script>\n\n<template>\n <div\n data-gr-collapse-item\n class=\"text-[var(--gr-fg)]\"\n >\n <div :class=\"rowClassName\">\n <component\n :is=\"headingTag\"\n class=\"m-0 min-w-0 flex-1\"\n >\n <button\n :id=\"headerId\"\n ref=\"triggerEl\"\n data-gr-collapse-trigger\n type=\"button\"\n :aria-expanded=\"expanded ? 'true' : 'false'\"\n :aria-controls=\"panelId\"\n :disabled=\"resolvedDisabled\"\n :class=\"headerClassName\"\n @click=\"onToggle\"\n @keydown=\"onKeydown\"\n >\n <GrIcon\n v-if=\"iconAtStart\"\n :size=\"chevronSize\"\n \n data-gr-collapse-chevron\n :class=\"chevronClassName\"\n >\n <slot name=\"icon\">\n <ChevronDownIcon />\n </slot>\n </GrIcon>\n\n <span :class=\"titleClassName\">\n <slot name=\"title\">\n <span class=\"font-600\">\n {{ title }}\n </span>\n </slot>\n </span>\n\n <GrIcon\n v-if=\"!iconAtStart\"\n :size=\"chevronSize\"\n \n data-gr-collapse-chevron\n :class=\"chevronClassName\"\n >\n <slot name=\"icon\">\n <ChevronDownIcon />\n </slot>\n </GrIcon>\n </button>\n </component>\n\n <div\n v-if=\"$slots.extra\"\n data-gr-collapse-extra\n class=\"shrink-0\"\n :class=\"extraClassName\"\n >\n <slot name=\"extra\" />\n </div>\n </div>\n\n <div\n :id=\"panelId\"\n role=\"region\"\n :aria-labelledby=\"headerId\"\n :inert=\"expanded ? undefined : true\"\n class=\"grid transition-[grid-template-rows] duration-[var(--gr-duration-base)]\"\n :class=\"expanded ? 'grid-rows-[1fr]' : 'grid-rows-[0fr]'\"\n >\n <div class=\"overflow-hidden\">\n <div :class=\"bodyClassName\">\n <slot />\n </div>\n </div>\n </div>\n </div>\n</template>\n"],"mappings":"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"}
1
+ {"version":3,"file":"GrCollapse-DIHEiTju.js","names":["$slots"],"sources":["../../../../src/components/GrCollapse/grCollapseContext.ts","../../../../src/components/GrCollapse/GrCollapse.vue","../../../../src/components/GrCollapse/GrCollapse.vue","../../../../src/components/GrCollapse/GrCollapseItem.vue","../../../../src/components/GrCollapse/GrCollapseItem.vue"],"sourcesContent":["import type { ComputedRef, InjectionKey } from 'vue'\n\nimport type { GrComponentSize } from '../shared/sizes'\n\nexport type GrCollapseValue = string | number\n\nexport type GrCollapseModelValue = GrCollapseValue | GrCollapseValue[] | undefined\n\n/**\n * Уровень заголовка секции. APG для accordion требует, чтобы он соответствовал\n * структуре страницы: аккордеон в разделе `<h4>` с захардкоженным `<h3>` рвёт\n * навигацию по заголовкам.\n */\nexport const GR_COLLAPSE_HEADING_LEVELS = [2, 3, 4, 5, 6] as const\n\nexport type GrCollapseHeadingLevel = typeof GR_COLLAPSE_HEADING_LEVELS[number]\n\n/** Сторона шеврона относительно заголовка — логическая, не физическая (RTL). */\nexport const GR_COLLAPSE_ICON_POSITIONS = ['start', 'end'] as const\n\nexport type GrCollapseIconPosition = typeof GR_COLLAPSE_ICON_POSITIONS[number]\n\n/**\n * Async-guard на переключение секции: `false` отменяет его. Второй аргумент —\n * куда идёт секция (`true` — раскрывается), чтобы «сохранить изменения?»\n * спрашивалось только на сворачивании.\n */\nexport type GrCollapseBeforeChange = (\n name: GrCollapseValue,\n expanding: boolean,\n) => boolean | void | Promise<boolean | void>\n\nexport type GrCollapseContext = {\n accordion: ComputedRef<boolean>\n disabled: ComputedRef<boolean>\n size: ComputedRef<GrComponentSize>\n headingLevel: ComputedRef<GrCollapseHeadingLevel>\n expandIconPosition: ComputedRef<GrCollapseIconPosition>\n isActive: (name: GrCollapseValue) => boolean\n toggle: (name: GrCollapseValue) => void\n}\n\nexport const GR_COLLAPSE_CONTEXT: InjectionKey<GrCollapseContext> = Symbol('GR_COLLAPSE_CONTEXT')\n","<script setup lang=\"ts\">\nimport { computed, provide, useSlots } from 'vue'\n\nimport GrCard from '../GrCard'\nimport { useGrComponentProp, useGrComponentSize } from '../GrConfigProvider/context'\nimport { useGranularityTranslations } from '../../internal/granularityI18n'\nimport { hasMeaningfulSlotContent } from '../shared/slotNodes'\nimport { grCollapseEmptyClass } from './grCollapseStyles'\n\nimport {\n GR_COLLAPSE_CONTEXT,\n type GrCollapseBeforeChange,\n type GrCollapseContext,\n type GrCollapseHeadingLevel,\n type GrCollapseIconPosition,\n type GrCollapseModelValue,\n type GrCollapseValue,\n} from './grCollapseContext'\n\nimport type { GrComponentSize } from '../shared/sizes'\n\nimport './defaults'\n\n/**\n * GrCollapse — контейнер секций `GrCollapseItem`.\n *\n * @prop modelValue — открытые секции. В `accordion`-режиме — `string|number|undefined`, иначе — массив значений.\n * @prop accordion — режим, когда одновременно может быть открыта только одна секция.\n * @prop disabled — блокирует взаимодействие со всеми секциями.\n * @prop divided — разделители между секциями.\n * @prop borderless — без обёртки в `GrCard`: аккордеон внутри карточки или сайдбара\n * иначе получает вторую рамку и вторую тень.\n * @prop beforeChange — async-guard: `false` отменяет переключение.\n */\nexport interface GrCollapseProps {\n modelValue?: GrCollapseModelValue\n accordion?: boolean\n disabled?: boolean\n divided?: boolean\n borderless?: boolean\n /** Уровень заголовков секций (`h2`…`h6`) — под структуру страницы. */\n headingLevel?: GrCollapseHeadingLevel\n /** Сторона шеврона относительно заголовка. */\n expandIconPosition?: GrCollapseIconPosition\n beforeChange?: GrCollapseBeforeChange\n /** Размер секций. Не задан — берётся из `GrConfigProvider`, иначе `md`. */\n size?: GrComponentSize\n /**\n * Пусто ли. Не задан — считается по содержимому: аккордеон без секций\n * показывает заглушку вместо пустой рамки. `false` подавляет автоопределение —\n * например, когда секции приезжают асинхронно и мигать текстом не надо.\n */\n empty?: boolean\n /** Текст пустого состояния. Слот `#empty` сильнее. */\n emptyText?: string\n}\n\nexport interface GrCollapseEmits {\n (e: 'update:modelValue', value: GrCollapseModelValue): void\n (e: 'change', value: GrCollapseModelValue): void\n}\n\n// Дефолты оформления намеренно `undefined`: «настоящий» дефолт живёт в\n// `useGrComponentProp`, иначе `GrConfigProvider` не отличит заданный пользователем\n// проп от подставленного Vue.\nconst props = withDefaults(defineProps<GrCollapseProps>(), {\n modelValue: undefined,\n accordion: false,\n disabled: false,\n divided: undefined,\n borderless: undefined,\n headingLevel: undefined,\n expandIconPosition: undefined,\n beforeChange: undefined,\n size: undefined,\n empty: undefined,\n emptyText: undefined,\n})\n\nconst emit = defineEmits<GrCollapseEmits>()\n\ndefineSlots<{\n /** Секции аккордеона (`GrCollapseItem`). */\n default?: () => any\n /** Содержимое пустого состояния вместо текста по умолчанию. */\n empty?: () => any\n}>()\n\nconst slots = useSlots()\nconst { t } = useGranularityTranslations()\n\nconst resolvedSize = useGrComponentSize(() => props.size, { component: 'GrCollapse' })\nconst divided = useGrComponentProp('GrCollapse', 'divided', () => props.divided, true)\nconst borderless = useGrComponentProp('GrCollapse', 'borderless', () => props.borderless, false)\nconst headingLevel = useGrComponentProp('GrCollapse', 'headingLevel', () => props.headingLevel, 3)\nconst expandIconPosition = useGrComponentProp('GrCollapse', 'expandIconPosition', () => props.expandIconPosition, 'end')\n\nconst resolvedEmptyText = computed(() => props.emptyText ?? t('gr.collapse.empty', 'Nothing here yet'))\n\n/**\n * Пустоту считает общий разборщик слота: `v-for` приходит фрагментом, `v-if`\n * оставляет после себя комментарий, а шаблон — переносы строк, и всё это не\n * содержимое.\n */\nconst isEmpty = computed(() => {\n if (props.empty !== undefined) return props.empty\n\n return !hasMeaningfulSlotContent(slots.default?.() ?? [])\n})\n\nconst activeSet = computed(() => {\n const value = props.modelValue\n\n if (props.accordion) {\n if (typeof value === 'string' || typeof value === 'number') {\n return new Set<GrCollapseValue>([value])\n }\n\n return new Set<GrCollapseValue>()\n }\n\n if (Array.isArray(value)) {\n return new Set<GrCollapseValue>(value)\n }\n\n if (typeof value === 'string' || typeof value === 'number') {\n return new Set<GrCollapseValue>([value])\n }\n\n return new Set<GrCollapseValue>()\n})\n\nfunction setModelValue(next: GrCollapseModelValue): void {\n emit('update:modelValue', next)\n emit('change', next)\n}\n\nfunction applyToggle(name: GrCollapseValue): void {\n if (props.accordion) {\n const next = activeSet.value.has(name) ? undefined : name\n setModelValue(next)\n return\n }\n\n const current = Array.isArray(props.modelValue)\n ? [...props.modelValue]\n : typeof props.modelValue === 'string' || typeof props.modelValue === 'number'\n ? [props.modelValue]\n : []\n\n const exists = current.includes(name)\n const next = exists\n ? current.filter(x => x !== name)\n : [...current, name]\n\n setModelValue(next)\n}\n\n// Секции, у которых guard ещё не ответил. Без этого повторный клик по заголовку\n// уходил бы во второй `beforeChange`, и после двух «да» состояние переключилось\n// бы дважды — то есть вернулось бы к исходному.\nconst awaitingGuard = new Set<GrCollapseValue>()\n\nasync function toggle(name: GrCollapseValue): Promise<void> {\n if (props.disabled || awaitingGuard.has(name))\n return\n\n if (!props.beforeChange) {\n applyToggle(name)\n return\n }\n\n awaitingGuard.add(name)\n try {\n if (await props.beforeChange(name, !activeSet.value.has(name)) === false)\n return\n\n applyToggle(name)\n }\n finally {\n awaitingGuard.delete(name)\n }\n}\n\nconst context: GrCollapseContext = {\n accordion: computed(() => props.accordion),\n disabled: computed(() => props.disabled),\n size: resolvedSize,\n headingLevel,\n expandIconPosition,\n isActive: name => activeSet.value.has(name),\n toggle: (name) => { void toggle(name) },\n}\n\nprovide(GR_COLLAPSE_CONTEXT, context)\n</script>\n\n<template>\n <GrCard v-if=\"!borderless\" data-gr-collapse>\n <div\n v-if=\"isEmpty\"\n data-gr-collapse-empty\n :class=\"grCollapseEmptyClass(resolvedSize)\"\n >\n <slot name=\"empty\">\n {{ resolvedEmptyText }}\n </slot>\n </div>\n\n <div v-else :class=\"divided ? 'divide-y divide-[var(--gr-brd)]' : ''\">\n <slot />\n </div>\n </GrCard>\n\n <!-- Разделители остаются на корне: без обёртки в карточку он и есть список\n секций, и лишний уровень вложенности сдвинул бы вёрстку потребителя. -->\n <div\n v-else\n data-gr-collapse\n :class=\"divided ? 'divide-y divide-[var(--gr-brd)]' : ''\"\n >\n <div\n v-if=\"isEmpty\"\n data-gr-collapse-empty\n :class=\"grCollapseEmptyClass(resolvedSize)\"\n >\n <slot name=\"empty\">\n {{ resolvedEmptyText }}\n </slot>\n </div>\n\n <slot v-else />\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, provide, useSlots } from 'vue'\n\nimport GrCard from '../GrCard'\nimport { useGrComponentProp, useGrComponentSize } from '../GrConfigProvider/context'\nimport { useGranularityTranslations } from '../../internal/granularityI18n'\nimport { hasMeaningfulSlotContent } from '../shared/slotNodes'\nimport { grCollapseEmptyClass } from './grCollapseStyles'\n\nimport {\n GR_COLLAPSE_CONTEXT,\n type GrCollapseBeforeChange,\n type GrCollapseContext,\n type GrCollapseHeadingLevel,\n type GrCollapseIconPosition,\n type GrCollapseModelValue,\n type GrCollapseValue,\n} from './grCollapseContext'\n\nimport type { GrComponentSize } from '../shared/sizes'\n\nimport './defaults'\n\n/**\n * GrCollapse — контейнер секций `GrCollapseItem`.\n *\n * @prop modelValue — открытые секции. В `accordion`-режиме — `string|number|undefined`, иначе — массив значений.\n * @prop accordion — режим, когда одновременно может быть открыта только одна секция.\n * @prop disabled — блокирует взаимодействие со всеми секциями.\n * @prop divided — разделители между секциями.\n * @prop borderless — без обёртки в `GrCard`: аккордеон внутри карточки или сайдбара\n * иначе получает вторую рамку и вторую тень.\n * @prop beforeChange — async-guard: `false` отменяет переключение.\n */\nexport interface GrCollapseProps {\n modelValue?: GrCollapseModelValue\n accordion?: boolean\n disabled?: boolean\n divided?: boolean\n borderless?: boolean\n /** Уровень заголовков секций (`h2`…`h6`) — под структуру страницы. */\n headingLevel?: GrCollapseHeadingLevel\n /** Сторона шеврона относительно заголовка. */\n expandIconPosition?: GrCollapseIconPosition\n beforeChange?: GrCollapseBeforeChange\n /** Размер секций. Не задан — берётся из `GrConfigProvider`, иначе `md`. */\n size?: GrComponentSize\n /**\n * Пусто ли. Не задан — считается по содержимому: аккордеон без секций\n * показывает заглушку вместо пустой рамки. `false` подавляет автоопределение —\n * например, когда секции приезжают асинхронно и мигать текстом не надо.\n */\n empty?: boolean\n /** Текст пустого состояния. Слот `#empty` сильнее. */\n emptyText?: string\n}\n\nexport interface GrCollapseEmits {\n (e: 'update:modelValue', value: GrCollapseModelValue): void\n (e: 'change', value: GrCollapseModelValue): void\n}\n\n// Дефолты оформления намеренно `undefined`: «настоящий» дефолт живёт в\n// `useGrComponentProp`, иначе `GrConfigProvider` не отличит заданный пользователем\n// проп от подставленного Vue.\nconst props = withDefaults(defineProps<GrCollapseProps>(), {\n modelValue: undefined,\n accordion: false,\n disabled: false,\n divided: undefined,\n borderless: undefined,\n headingLevel: undefined,\n expandIconPosition: undefined,\n beforeChange: undefined,\n size: undefined,\n empty: undefined,\n emptyText: undefined,\n})\n\nconst emit = defineEmits<GrCollapseEmits>()\n\ndefineSlots<{\n /** Секции аккордеона (`GrCollapseItem`). */\n default?: () => any\n /** Содержимое пустого состояния вместо текста по умолчанию. */\n empty?: () => any\n}>()\n\nconst slots = useSlots()\nconst { t } = useGranularityTranslations()\n\nconst resolvedSize = useGrComponentSize(() => props.size, { component: 'GrCollapse' })\nconst divided = useGrComponentProp('GrCollapse', 'divided', () => props.divided, true)\nconst borderless = useGrComponentProp('GrCollapse', 'borderless', () => props.borderless, false)\nconst headingLevel = useGrComponentProp('GrCollapse', 'headingLevel', () => props.headingLevel, 3)\nconst expandIconPosition = useGrComponentProp('GrCollapse', 'expandIconPosition', () => props.expandIconPosition, 'end')\n\nconst resolvedEmptyText = computed(() => props.emptyText ?? t('gr.collapse.empty', 'Nothing here yet'))\n\n/**\n * Пустоту считает общий разборщик слота: `v-for` приходит фрагментом, `v-if`\n * оставляет после себя комментарий, а шаблон — переносы строк, и всё это не\n * содержимое.\n */\nconst isEmpty = computed(() => {\n if (props.empty !== undefined) return props.empty\n\n return !hasMeaningfulSlotContent(slots.default?.() ?? [])\n})\n\nconst activeSet = computed(() => {\n const value = props.modelValue\n\n if (props.accordion) {\n if (typeof value === 'string' || typeof value === 'number') {\n return new Set<GrCollapseValue>([value])\n }\n\n return new Set<GrCollapseValue>()\n }\n\n if (Array.isArray(value)) {\n return new Set<GrCollapseValue>(value)\n }\n\n if (typeof value === 'string' || typeof value === 'number') {\n return new Set<GrCollapseValue>([value])\n }\n\n return new Set<GrCollapseValue>()\n})\n\nfunction setModelValue(next: GrCollapseModelValue): void {\n emit('update:modelValue', next)\n emit('change', next)\n}\n\nfunction applyToggle(name: GrCollapseValue): void {\n if (props.accordion) {\n const next = activeSet.value.has(name) ? undefined : name\n setModelValue(next)\n return\n }\n\n const current = Array.isArray(props.modelValue)\n ? [...props.modelValue]\n : typeof props.modelValue === 'string' || typeof props.modelValue === 'number'\n ? [props.modelValue]\n : []\n\n const exists = current.includes(name)\n const next = exists\n ? current.filter(x => x !== name)\n : [...current, name]\n\n setModelValue(next)\n}\n\n// Секции, у которых guard ещё не ответил. Без этого повторный клик по заголовку\n// уходил бы во второй `beforeChange`, и после двух «да» состояние переключилось\n// бы дважды — то есть вернулось бы к исходному.\nconst awaitingGuard = new Set<GrCollapseValue>()\n\nasync function toggle(name: GrCollapseValue): Promise<void> {\n if (props.disabled || awaitingGuard.has(name))\n return\n\n if (!props.beforeChange) {\n applyToggle(name)\n return\n }\n\n awaitingGuard.add(name)\n try {\n if (await props.beforeChange(name, !activeSet.value.has(name)) === false)\n return\n\n applyToggle(name)\n }\n finally {\n awaitingGuard.delete(name)\n }\n}\n\nconst context: GrCollapseContext = {\n accordion: computed(() => props.accordion),\n disabled: computed(() => props.disabled),\n size: resolvedSize,\n headingLevel,\n expandIconPosition,\n isActive: name => activeSet.value.has(name),\n toggle: (name) => { void toggle(name) },\n}\n\nprovide(GR_COLLAPSE_CONTEXT, context)\n</script>\n\n<template>\n <GrCard v-if=\"!borderless\" data-gr-collapse>\n <div\n v-if=\"isEmpty\"\n data-gr-collapse-empty\n :class=\"grCollapseEmptyClass(resolvedSize)\"\n >\n <slot name=\"empty\">\n {{ resolvedEmptyText }}\n </slot>\n </div>\n\n <div v-else :class=\"divided ? 'divide-y divide-[var(--gr-brd)]' : ''\">\n <slot />\n </div>\n </GrCard>\n\n <!-- Разделители остаются на корне: без обёртки в карточку он и есть список\n секций, и лишний уровень вложенности сдвинул бы вёрстку потребителя. -->\n <div\n v-else\n data-gr-collapse\n :class=\"divided ? 'divide-y divide-[var(--gr-brd)]' : ''\"\n >\n <div\n v-if=\"isEmpty\"\n data-gr-collapse-empty\n :class=\"grCollapseEmptyClass(resolvedSize)\"\n >\n <slot name=\"empty\">\n {{ resolvedEmptyText }}\n </slot>\n </div>\n\n <slot v-else />\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport ChevronDownIcon from '~icons/lucide/chevron-down'\nimport { computed, inject, ref, useId } from 'vue'\n\nimport GrIcon from '../GrIcon'\n\nimport { GR_COLLAPSE_CONTEXT, type GrCollapseValue } from './grCollapseContext'\nimport {\n collapseChevronSizes,\n collapseExtraPaddings,\n grCollapseBodyClass,\n grCollapseChevronClass,\n grCollapseHeaderClass,\n grCollapseRowClass,\n grCollapseTitleClass,\n} from './grCollapseStyles'\n\n/**\n * GrCollapseItem — одна секция `GrCollapse`. Должна использоваться строго внутри `GrCollapse`.\n *\n * @prop name — уникальный идентификатор секции (для `v-model` у `GrCollapse`); по умолчанию генерируется из `uid`.\n * @prop title — текст заголовка; можно заменить слотом `#title`.\n * @prop disabled — запрещает раскрытие/сворачивание секции.\n *\n * Слот `#extra` (счётчик, бейдж, кнопка) рендерится **рядом с** триггером, а не\n * внутри него: `<button>` внутри `<button>` — невалидная разметка, а axe ловит\n * это как `nested-interactive`.\n */\nexport interface GrCollapseItemProps {\n name?: GrCollapseValue\n title?: string\n disabled?: boolean\n}\n\nconst props = withDefaults(defineProps<GrCollapseItemProps>(), {\n name: undefined,\n title: undefined,\n disabled: false,\n})\n\nconst collapse = inject(GR_COLLAPSE_CONTEXT)\n\nif (!collapse) {\n throw new Error('GrCollapseItem must be used inside GrCollapse')\n}\n\nconst collapseContext = collapse\n\nconst uid = useId()\n\nconst resolvedName = computed<GrCollapseValue>(() => {\n if (typeof props.name === 'string' || typeof props.name === 'number')\n return props.name\n\n return uid\n})\n\nconst resolvedDisabled = computed(() => collapseContext.disabled.value || props.disabled)\nconst expanded = computed(() => collapseContext.isActive(resolvedName.value))\n\nconst headingTag = computed(() => `h${collapseContext.headingLevel.value}`)\nconst iconAtStart = computed(() => collapseContext.expandIconPosition.value === 'start')\n\nconst rowClassName = computed(() => grCollapseRowClass(resolvedDisabled.value))\nconst headerClassName = computed(() => grCollapseHeaderClass({\n size: collapseContext.size.value,\n disabled: resolvedDisabled.value,\n}))\nconst extraClassName = computed(() => collapseExtraPaddings[collapseContext.size.value])\nconst titleClassName = computed(() => grCollapseTitleClass(collapseContext.size.value))\nconst bodyClassName = computed(() => grCollapseBodyClass(collapseContext.size.value))\nconst chevronClassName = computed(() => grCollapseChevronClass(expanded.value))\nconst chevronSize = computed(() => collapseChevronSizes[collapseContext.size.value])\n\n// Свёрнутая панель схлопывается визуально (`grid-rows-[0fr]`), но это не\n// скрытие: без `inert` ссылки и кнопки внутри неё ловятся Tab'ом, фокус уезжает\n// в невидимую область нулевой высоты, а скринридер читает содержимое всех\n// закрытых секций подряд — прямо вопреки `aria-expanded=\"false\"` на триггере.\n// `inert` убирает поддерево и из таб-порядка, и из дерева доступности, при этом\n// (в отличие от `hidden`/`display:none`) не ломает анимацию раскрытия.\nconst headerId = `gr-collapse-header-${uid}`\nconst panelId = `gr-collapse-panel-${uid}`\n\nconst triggerEl = ref<HTMLElement | null>(null)\n\nfunction onToggle(): void {\n if (resolvedDisabled.value)\n return\n\n collapseContext.toggle(resolvedName.value)\n}\n\n/**\n * Только заголовки **своего** аккордеона: вложенный `GrCollapse` внутри\n * раскрытой панели тоже помечен `[data-gr-collapse]`, и без фильтра стрелки\n * внешнего аккордеона перескакивали бы на заголовки внутреннего.\n */\nfunction getAllTriggers(): HTMLElement[] {\n const root = triggerEl.value?.closest('[data-gr-collapse]')\n if (!root)\n return []\n\n const triggers = Array.prototype.slice.call(\n root.querySelectorAll<HTMLElement>('[data-gr-collapse-trigger]'),\n ) as HTMLElement[]\n\n return triggers.filter(trigger => trigger.closest('[data-gr-collapse]') === root)\n}\n\nfunction focusRelative(direction: 1 | -1): void {\n const current = triggerEl.value\n if (!current)\n return\n\n const triggers = getAllTriggers()\n const index = triggers.indexOf(current)\n if (index === -1 || triggers.length === 0)\n return\n\n const nextIndex = (index + direction + triggers.length) % triggers.length\n triggers[nextIndex]?.focus()\n}\n\nfunction focusEdge(edge: 'start' | 'end'): void {\n const triggers = getAllTriggers()\n if (triggers.length === 0)\n return\n\n ;(edge === 'start' ? triggers[0] : triggers.at(-1))?.focus()\n}\n\nfunction onKeydown(event: KeyboardEvent): void {\n if (event.key === 'ArrowDown') {\n event.preventDefault()\n focusRelative(1)\n return\n }\n\n if (event.key === 'ArrowUp') {\n event.preventDefault()\n focusRelative(-1)\n return\n }\n\n if (event.key === 'Home') {\n event.preventDefault()\n focusEdge('start')\n return\n }\n\n if (event.key === 'End') {\n event.preventDefault()\n focusEdge('end')\n return\n }\n\n if (event.key === ' ' || event.key === 'Enter') {\n event.preventDefault()\n onToggle()\n }\n}\n</script>\n\n<template>\n <div\n data-gr-collapse-item\n class=\"text-[var(--gr-fg)]\"\n >\n <div :class=\"rowClassName\">\n <component\n :is=\"headingTag\"\n class=\"m-0 min-w-0 flex-1\"\n >\n <button\n :id=\"headerId\"\n ref=\"triggerEl\"\n data-gr-collapse-trigger\n type=\"button\"\n :aria-expanded=\"expanded ? 'true' : 'false'\"\n :aria-controls=\"panelId\"\n :disabled=\"resolvedDisabled\"\n :class=\"headerClassName\"\n @click=\"onToggle\"\n @keydown=\"onKeydown\"\n >\n <GrIcon\n v-if=\"iconAtStart\"\n :size=\"chevronSize\"\n \n data-gr-collapse-chevron\n :class=\"chevronClassName\"\n >\n <slot name=\"icon\">\n <ChevronDownIcon />\n </slot>\n </GrIcon>\n\n <span :class=\"titleClassName\">\n <slot name=\"title\">\n <span class=\"font-600\">\n {{ title }}\n </span>\n </slot>\n </span>\n\n <GrIcon\n v-if=\"!iconAtStart\"\n :size=\"chevronSize\"\n \n data-gr-collapse-chevron\n :class=\"chevronClassName\"\n >\n <slot name=\"icon\">\n <ChevronDownIcon />\n </slot>\n </GrIcon>\n </button>\n </component>\n\n <div\n v-if=\"$slots.extra\"\n data-gr-collapse-extra\n class=\"shrink-0\"\n :class=\"extraClassName\"\n >\n <slot name=\"extra\" />\n </div>\n </div>\n\n <div\n :id=\"panelId\"\n role=\"region\"\n :aria-labelledby=\"headerId\"\n :inert=\"expanded ? undefined : true\"\n class=\"grid transition-[grid-template-rows] duration-[var(--gr-duration-base)]\"\n :class=\"expanded ? 'grid-rows-[1fr]' : 'grid-rows-[0fr]'\"\n >\n <div class=\"overflow-hidden\">\n <div :class=\"bodyClassName\">\n <slot />\n </div>\n </div>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport ChevronDownIcon from '~icons/lucide/chevron-down'\nimport { computed, inject, ref, useId } from 'vue'\n\nimport GrIcon from '../GrIcon'\n\nimport { GR_COLLAPSE_CONTEXT, type GrCollapseValue } from './grCollapseContext'\nimport {\n collapseChevronSizes,\n collapseExtraPaddings,\n grCollapseBodyClass,\n grCollapseChevronClass,\n grCollapseHeaderClass,\n grCollapseRowClass,\n grCollapseTitleClass,\n} from './grCollapseStyles'\n\n/**\n * GrCollapseItem — одна секция `GrCollapse`. Должна использоваться строго внутри `GrCollapse`.\n *\n * @prop name — уникальный идентификатор секции (для `v-model` у `GrCollapse`); по умолчанию генерируется из `uid`.\n * @prop title — текст заголовка; можно заменить слотом `#title`.\n * @prop disabled — запрещает раскрытие/сворачивание секции.\n *\n * Слот `#extra` (счётчик, бейдж, кнопка) рендерится **рядом с** триггером, а не\n * внутри него: `<button>` внутри `<button>` — невалидная разметка, а axe ловит\n * это как `nested-interactive`.\n */\nexport interface GrCollapseItemProps {\n name?: GrCollapseValue\n title?: string\n disabled?: boolean\n}\n\nconst props = withDefaults(defineProps<GrCollapseItemProps>(), {\n name: undefined,\n title: undefined,\n disabled: false,\n})\n\nconst collapse = inject(GR_COLLAPSE_CONTEXT)\n\nif (!collapse) {\n throw new Error('GrCollapseItem must be used inside GrCollapse')\n}\n\nconst collapseContext = collapse\n\nconst uid = useId()\n\nconst resolvedName = computed<GrCollapseValue>(() => {\n if (typeof props.name === 'string' || typeof props.name === 'number')\n return props.name\n\n return uid\n})\n\nconst resolvedDisabled = computed(() => collapseContext.disabled.value || props.disabled)\nconst expanded = computed(() => collapseContext.isActive(resolvedName.value))\n\nconst headingTag = computed(() => `h${collapseContext.headingLevel.value}`)\nconst iconAtStart = computed(() => collapseContext.expandIconPosition.value === 'start')\n\nconst rowClassName = computed(() => grCollapseRowClass(resolvedDisabled.value))\nconst headerClassName = computed(() => grCollapseHeaderClass({\n size: collapseContext.size.value,\n disabled: resolvedDisabled.value,\n}))\nconst extraClassName = computed(() => collapseExtraPaddings[collapseContext.size.value])\nconst titleClassName = computed(() => grCollapseTitleClass(collapseContext.size.value))\nconst bodyClassName = computed(() => grCollapseBodyClass(collapseContext.size.value))\nconst chevronClassName = computed(() => grCollapseChevronClass(expanded.value))\nconst chevronSize = computed(() => collapseChevronSizes[collapseContext.size.value])\n\n// Свёрнутая панель схлопывается визуально (`grid-rows-[0fr]`), но это не\n// скрытие: без `inert` ссылки и кнопки внутри неё ловятся Tab'ом, фокус уезжает\n// в невидимую область нулевой высоты, а скринридер читает содержимое всех\n// закрытых секций подряд — прямо вопреки `aria-expanded=\"false\"` на триггере.\n// `inert` убирает поддерево и из таб-порядка, и из дерева доступности, при этом\n// (в отличие от `hidden`/`display:none`) не ломает анимацию раскрытия.\nconst headerId = `gr-collapse-header-${uid}`\nconst panelId = `gr-collapse-panel-${uid}`\n\nconst triggerEl = ref<HTMLElement | null>(null)\n\nfunction onToggle(): void {\n if (resolvedDisabled.value)\n return\n\n collapseContext.toggle(resolvedName.value)\n}\n\n/**\n * Только заголовки **своего** аккордеона: вложенный `GrCollapse` внутри\n * раскрытой панели тоже помечен `[data-gr-collapse]`, и без фильтра стрелки\n * внешнего аккордеона перескакивали бы на заголовки внутреннего.\n */\nfunction getAllTriggers(): HTMLElement[] {\n const root = triggerEl.value?.closest('[data-gr-collapse]')\n if (!root)\n return []\n\n const triggers = Array.prototype.slice.call(\n root.querySelectorAll<HTMLElement>('[data-gr-collapse-trigger]'),\n ) as HTMLElement[]\n\n return triggers.filter(trigger => trigger.closest('[data-gr-collapse]') === root)\n}\n\nfunction focusRelative(direction: 1 | -1): void {\n const current = triggerEl.value\n if (!current)\n return\n\n const triggers = getAllTriggers()\n const index = triggers.indexOf(current)\n if (index === -1 || triggers.length === 0)\n return\n\n const nextIndex = (index + direction + triggers.length) % triggers.length\n triggers[nextIndex]?.focus()\n}\n\nfunction focusEdge(edge: 'start' | 'end'): void {\n const triggers = getAllTriggers()\n if (triggers.length === 0)\n return\n\n ;(edge === 'start' ? triggers[0] : triggers.at(-1))?.focus()\n}\n\nfunction onKeydown(event: KeyboardEvent): void {\n if (event.key === 'ArrowDown') {\n event.preventDefault()\n focusRelative(1)\n return\n }\n\n if (event.key === 'ArrowUp') {\n event.preventDefault()\n focusRelative(-1)\n return\n }\n\n if (event.key === 'Home') {\n event.preventDefault()\n focusEdge('start')\n return\n }\n\n if (event.key === 'End') {\n event.preventDefault()\n focusEdge('end')\n return\n }\n\n if (event.key === ' ' || event.key === 'Enter') {\n event.preventDefault()\n onToggle()\n }\n}\n</script>\n\n<template>\n <div\n data-gr-collapse-item\n class=\"text-[var(--gr-fg)]\"\n >\n <div :class=\"rowClassName\">\n <component\n :is=\"headingTag\"\n class=\"m-0 min-w-0 flex-1\"\n >\n <button\n :id=\"headerId\"\n ref=\"triggerEl\"\n data-gr-collapse-trigger\n type=\"button\"\n :aria-expanded=\"expanded ? 'true' : 'false'\"\n :aria-controls=\"panelId\"\n :disabled=\"resolvedDisabled\"\n :class=\"headerClassName\"\n @click=\"onToggle\"\n @keydown=\"onKeydown\"\n >\n <GrIcon\n v-if=\"iconAtStart\"\n :size=\"chevronSize\"\n \n data-gr-collapse-chevron\n :class=\"chevronClassName\"\n >\n <slot name=\"icon\">\n <ChevronDownIcon />\n </slot>\n </GrIcon>\n\n <span :class=\"titleClassName\">\n <slot name=\"title\">\n <span class=\"font-600\">\n {{ title }}\n </span>\n </slot>\n </span>\n\n <GrIcon\n v-if=\"!iconAtStart\"\n :size=\"chevronSize\"\n \n data-gr-collapse-chevron\n :class=\"chevronClassName\"\n >\n <slot name=\"icon\">\n <ChevronDownIcon />\n </slot>\n </GrIcon>\n </button>\n </component>\n\n <div\n v-if=\"$slots.extra\"\n data-gr-collapse-extra\n class=\"shrink-0\"\n :class=\"extraClassName\"\n >\n <slot name=\"extra\" />\n </div>\n </div>\n\n <div\n :id=\"panelId\"\n role=\"region\"\n :aria-labelledby=\"headerId\"\n :inert=\"expanded ? undefined : true\"\n class=\"grid transition-[grid-template-rows] duration-[var(--gr-duration-base)]\"\n :class=\"expanded ? 'grid-rows-[1fr]' : 'grid-rows-[0fr]'\"\n >\n <div class=\"overflow-hidden\">\n <div :class=\"bodyClassName\">\n <slot />\n </div>\n </div>\n </div>\n </div>\n</template>\n"],"mappings":"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"}
@@ -1,3 +1,3 @@
1
1
  import { n as grCollapseSafelist, t as grCollapseConfig } from "../../chunks/config-DU2DNSRx.js";
2
- import { n as GrCollapse_default, t as GrCollapseItem_default } from "./chunks/GrCollapse-C1rCfbc0.js";
2
+ import { n as GrCollapse_default, t as GrCollapseItem_default } from "./chunks/GrCollapse-DIHEiTju.js";
3
3
  export { GrCollapse_default as GrCollapse, GrCollapse_default as default, GrCollapseItem_default as GrCollapseItem, grCollapseConfig, grCollapseSafelist };