@betterworldcollective/dashboard 0.0.0-stage → 0.0.3

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 (30) hide show
  1. package/dist/components/card/CampaignCard.vue.d.ts +9 -0
  2. package/dist/components/header/BwHeader.story-mocks.d.ts +4 -0
  3. package/dist/components/header/BwHeader.vue.d.ts +25 -0
  4. package/dist/components/header/index.d.ts +1 -0
  5. package/dist/components/layout/BwLayout.vue.d.ts +29 -0
  6. package/dist/components/layout/index.d.ts +1 -0
  7. package/dist/components/onboarding/campaign-card/BwOnboardingCampaignCardCreation.vue.d.ts +43 -0
  8. package/dist/components/onboarding/campaign-card/index.d.ts +1 -0
  9. package/dist/components/organization/OrganizationLogo.vue.d.ts +7 -0
  10. package/dist/components/sidebar/BwSidebar.vue.d.ts +12 -0
  11. package/dist/components/sidebar/BwSidebarBadge.vue.d.ts +12 -0
  12. package/dist/components/sidebar/BwSidebarGroup.vue.d.ts +18 -0
  13. package/dist/components/sidebar/BwSidebarItem.vue.d.ts +34 -0
  14. package/dist/components/sidebar/BwSidebarSubItem.vue.d.ts +27 -0
  15. package/dist/components/sidebar/context.d.ts +13 -0
  16. package/dist/components/sidebar/icons.d.ts +4 -0
  17. package/dist/components/sidebar/index.d.ts +5 -0
  18. package/dist/components/ticket/BwTicketStatsCard.vue.d.ts +34 -0
  19. package/dist/components/ticket/TicketStatsRing.vue.d.ts +9 -0
  20. package/dist/components/ticket/index.d.ts +2 -0
  21. package/dist/composables/useChart.d.ts +12 -0
  22. package/dist/index.cjs +2 -0
  23. package/dist/index.cjs.map +1 -0
  24. package/dist/index.d.ts +14 -0
  25. package/dist/index.js +488 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/style.css +3 -0
  28. package/dist/types/Campaign.d.ts +17 -0
  29. package/package.json +47 -3
  30. package/README.md +0 -3
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","names":["$slots","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_openBlock","_createElementBlock","_createElementVNode","_renderSlot","_createVNode","_unref","BwSlideTransition","_withCtx","_createCommentVNode","_sfc_main","_hoisted_1","_hoisted_2","_hoisted_3","shallowRef","computed","ref","_openBlock","_createElementBlock","_createElementVNode","_renderSlot","_sfc_main","$slots","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","useId","_openBlock","_createElementBlock","_createElementVNode","_unref","_renderSlot","_createTextVNode","_toDisplayString","_createCommentVNode","_sfc_main","_hoisted_1","_openBlock","_createElementBlock","_renderSlot","_sfc_main","HomeIcon","DonationIcon","DonationFormIcon","CampaignIcon","EventIcon","DonorIcon","GiftIcon","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","useSlots","inject","isVNode","Fragment","Comment","computed","_openBlock","_createElementBlock","_createBlock","_resolveDynamicComponent","_normalizeClass","_unref","_withCtx","_createElementVNode","_renderSlot","_createCommentVNode","_createTextVNode","_toDisplayString","BwSidebarBadge","ChevronDownIcon","_createVNode","_Transition","_sfc_main","_hoisted_1","_hoisted_2","useSlots","computed","_openBlock","_createElementBlock","_createBlock","_resolveDynamicComponent","_normalizeClass","_withCtx","_createElementVNode","_renderSlot","_createTextVNode","_toDisplayString","BwSidebarBadge","_createCommentVNode","_sfc_main","$slots","_hoisted_1","_hoisted_2","_hoisted_3","_openBlock","_createElementBlock","_createVNode","_unref","BwHeader","_createSlots","_withCtx","_renderSlot","_createElementVNode","_createBlock","BwSidebar","_createCommentVNode","_sfc_main","$slots","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_useModel","SilentAuctionIcon","LiveAuctionIcon","DonationFormIcon","ImpactGivingIcon","CrowdfundingIcon","PaddleRaiseIcon","PeerToPeerIcon","EventIcon","GiveawaysIcon","AthonIcon","computed","ref","nextTick","_openBlock","_createBlock","_resolveDynamicComponent","_normalizeClass","_withCtx","_createElementVNode","_normalizeStyle","_createElementBlock","_createCommentVNode","_renderSlot","_createTextVNode","_toDisplayString","_createVNode","_Transition","_unref","CheckIcon","_sfc_main","use","PieChart","SVGRenderer","shallowRef","markRaw","init","_hoisted_1","_hoisted_2","ref","computed","_openBlock","_createElementBlock","_normalizeStyle","_createElementVNode","_toDisplayString","_sfc_main","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","computed","_openBlock","_createElementBlock","_createElementVNode","_renderSlot","_createBlock","_resolveDynamicComponent","_createCommentVNode","_toDisplayString","TicketStatsRing","_createTextVNode","_sfc_main","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_openBlock","_createElementBlock","_createElementVNode","_toDisplayString","_Fragment","_renderList","_sfc_main","_openBlock","_createElementBlock","_createElementVNode","_createCommentVNode","_toDisplayString","_sfc_main","vue","_betterworldcollective_core","_betterworldcollective_icons","echarts_charts","echarts_core","echarts_renderers","_hoisted_1$11","_hoisted_2$10","_hoisted_3$8","_hoisted_4$6","_hoisted_5$4","_hoisted_6$2","BwHeader_default","_ctx","__props","_cache","SIDEBAR_CONTEXT","_hoisted_1$10","_hoisted_2$9","_hoisted_3$7","BwSidebar_default","items","activeParentId","i","pinnedId","expandedId","item","id","_hoisted_1$9","_hoisted_2$8","_hoisted_3$6","_hoisted_4$5","BwSidebarGroup_default","labelId","_hoisted_1$8","BwSidebarBadge_default","SIDEBAR_ICONS","_hoisted_1$7","_hoisted_2$7","_hoisted_3$5","_hoisted_4$4","_hoisted_5$3","BwSidebarItem_default","props","slots","ctx","flatten","out","node","nodes","childVNodes","hasChildren","hasActiveChild","isExpanded","hasBadge","resolvedIcon","tag","onEnter","el","onAfterEnter","onLeave","_hoisted_1$6","_hoisted_2$6","BwSidebarSubItem_default","_hoisted_1$5","_hoisted_2$5","_hoisted_3$4","BwLayout_default","_hoisted_1$4","_hoisted_2$4","_hoisted_3$3","_hoisted_4$3","_hoisted_5$2","_hoisted_6$1","_hoisted_7$1","shadowClass","BwOnboardingCampaignCardCreation_default","\"modelValue\"","\"modelModifiers\"","model","ICONS","\"auction\"","\"donation\"","\"impact\"","\"crowdfunding\"","\"paddleraise\"","\"giveaway\"","isActive","rippleOrigin","rippleLayer","toggle","rect","event","origin","layer","rippleStyle","iconTileClass","useChart","chart","observer","option","next","_hoisted_1$3","_hoisted_2$3","SIZE","INNER_RADIUS","TicketStatsRing_default","_hoisted_1$2","_hoisted_2$2","_hoisted_3$2","_hoisted_4$2","_hoisted_5$1","_hoisted_6","_hoisted_7","_hoisted_8","BwTicketStatsCard_default","percent","data","chartLabel","CampaignType","_hoisted_1$1","_hoisted_2$1","_hoisted_3$1","_hoisted_4$1","CampaignCard_default","index","_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","OrganizationLogo_default","plugin"],"sources":["../src/components/header/BwHeader.vue","../src/components/header/BwHeader.vue","../src/components/sidebar/context.ts","../src/components/sidebar/BwSidebar.vue","../src/components/sidebar/BwSidebar.vue","../src/components/sidebar/BwSidebarGroup.vue","../src/components/sidebar/BwSidebarGroup.vue","../src/components/sidebar/BwSidebarBadge.vue","../src/components/sidebar/BwSidebarBadge.vue","../src/components/sidebar/icons.ts","../src/components/sidebar/BwSidebarItem.vue","../src/components/sidebar/BwSidebarItem.vue","../src/components/sidebar/BwSidebarSubItem.vue","../src/components/sidebar/BwSidebarSubItem.vue","../src/components/layout/BwLayout.vue","../src/components/layout/BwLayout.vue","../src/components/onboarding/campaign-card/BwOnboardingCampaignCardCreation.vue","../src/components/onboarding/campaign-card/BwOnboardingCampaignCardCreation.vue","../src/composables/useChart.ts","../src/components/ticket/TicketStatsRing.vue","../src/components/ticket/TicketStatsRing.vue","../src/components/ticket/BwTicketStatsCard.vue","../src/components/ticket/BwTicketStatsCard.vue","../src/types/Campaign.ts","../src/components/card/CampaignCard.vue","../src/components/card/CampaignCard.vue","../src/components/organization/OrganizationLogo.vue","../src/components/organization/OrganizationLogo.vue","../src/index.ts"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { BwSlideTransition } from '@betterworldcollective/core'\n\ninterface Props {\n /** Where the default logo links to. */\n logoHref?: string\n /** Shows the `sub-header` slot in a second row below the header, sliding it open and closed. */\n isSubHeaderVisible?: boolean\n}\nwithDefaults(defineProps<Props>(), {\n logoHref: '/',\n isSubHeaderVisible: false,\n})\n</script>\n\n<template>\n <header class=\"bw-header flex w-full flex-col bg-surface-brand text-white\">\n <!-- Two parts: the left one is as wide as the 290px BwSidebar below it, so the right one starts\n where the page content does. -->\n <div class=\"flex min-h-15 w-full items-stretch\">\n <div class=\"flex w-72.5 shrink-0 items-center px-7\">\n <slot name=\"left\">\n <a\n class=\"block shrink-0 rounded-[4px] outline-none focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-white\"\n :href=\"logoHref\"\n aria-label=\"BetterWorld\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"136\"\n height=\"20\"\n viewBox=\"0 0 170 25\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <path\n fill=\"currentColor\"\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M4.39 23.25c-.14-.1-.36 0-.36.17v.74c0 .11-.1.2-.21.2H2.68c-.93 0-1.68-.74-1.68-1.67V1.2c0-.12.1-.21.21-.21h1.24c.92 0 1.68.75 1.68 1.68V9.8c0 .18.2.28.35.17a7.4 7.4 0 0 1 4.39-1.4 7.3 7.3 0 0 1 3.78.99 8.2 8.2 0 0 1 3.98 7.07 8.1 8.1 0 0 1-3.95 7.05A8 8 0 0 1 8.8 24.7c-1.67 0-3.2-.52-4.41-1.45m29.2-6.15q-.03.18-.21.2h-11.5a.2.2 0 0 0-.2.22 5 5 0 0 0 4.97 4.45c1.4 0 2.4-.41 3.17-.95.78-.54 1.84-.62 2.53.03l.65.62c.08.07.09.2.02.28a8.2 8.2 0 0 1-6.4 2.75c-4.5 0-8-3.43-8-8.07s3.16-8.06 7.54-8.06c4.31 0 7.44 3.49 7.44 8.06l-.02.47m-3.32-2.7a4.3 4.3 0 0 0-4.01-3.1 4.5 4.5 0 0 0-4.27 3.1.2.2 0 0 0 .2.26h7.89a.2.2 0 0 0 .2-.26m15.91 8.82c-.2-.91-1.15-1.48-2.08-1.48-.83 0-1.72-.3-2.14-.83-.4-.46-.46-1.15-.46-1.97V11.9q.02-.2.2-.21h3.05c.93 0 1.68-.76 1.68-1.68V9.1a.2.2 0 0 0-.2-.21H41.7a.2.2 0 0 1-.21-.21V4.83c0-.12-.1-.21-.21-.21h-1.24c-.93 0-1.68.75-1.68 1.68v2.4c0 .12-.1.2-.21.2H36.1c-.93 0-1.68.76-1.68 1.7v.9c0 .11.1.2.21.2h3.53q.19.02.2.22v6.86c0 1.68.34 3.1 1.26 4.12A5.6 5.6 0 0 0 44 24.7c.8 0 1.66-.1 2.25-.27a.2.2 0 0 0 .14-.24zm11.07-1.48c.94 0 1.88.57 2.09 1.48l.2.96a.2.2 0 0 1-.13.24c-.6.17-1.45.28-2.26.28-1.94 0-3.39-.7-4.38-1.81-.92-1.02-1.25-2.44-1.25-4.12v-6.86q-.02-.2-.2-.21h-3.54a.2.2 0 0 1-.2-.21v-.9c0-.94.75-1.7 1.68-1.7h2.05q.2-.01.21-.2V6.3c0-.93.76-1.68 1.69-1.68h1.23c.12 0 .21.1.21.21V8.7c0 .12.1.2.21.2h4.52q.18.02.2.22v.9c0 .93-.74 1.69-1.67 1.69h-3.05a.2.2 0 0 0-.2.2v7.04c0 .82.06 1.51.45 1.97.43.53 1.32.83 2.14.83m18.58-4.45c.1 0 .2-.08.2-.19q.03-.3.02-.47c0-4.57-3.12-8.06-7.44-8.06-4.37 0-7.53 3.42-7.53 8.06a7.86 7.86 0 0 0 8 8.07 8.2 8.2 0 0 0 6.4-2.75.2.2 0 0 0-.03-.28l-.65-.62c-.68-.65-1.75-.57-2.52-.03-.78.54-1.78.95-3.17.95a5 5 0 0 1-4.99-4.45.2.2 0 0 1 .21-.23zm-7.12-5.99a4.3 4.3 0 0 1 4.02 3.1.2.2 0 0 1-.2.26h-7.89a.2.2 0 0 1-.2-.26 4.5 4.5 0 0 1 4.27-3.1m19.32-2.66a.2.2 0 0 1 .17.23l-.19 1.57c-.07.65-.71 1.1-1.36 1.1a5.2 5.2 0 0 0-4.15 2.54l-.03.1v8.5c0 .94-.75 1.69-1.68 1.69h-1.24a.2.2 0 0 1-.2-.21V10.58c0-.93.74-1.68 1.67-1.68h1.14c.12 0 .21.1.21.2v.92c0 .2.28.3.42.16a6 6 0 0 1 4.22-1.61c.27 0 .68.02 1.02.07m14.64.26c-.66 0-1.25.4-1.49 1l-3.65 9.08a.21.21 0 0 1-.39 0l-3.62-9.03a1.7 1.7 0 0 0-1.56-1.05h-1.78a.2.2 0 0 0-.2.29l6.12 15.05q.06.13.2.13h1.88q.15 0 .2-.13l4.1-10.25a.21.21 0 0 1 .39 0l4.1 10.25q.05.12.19.13h1.89q.13 0 .2-.13l6.1-15.05a.21.21 0 0 0-.19-.3h-1.77c-.7 0-1.3.43-1.56 1.06l-3.63 9.03a.21.21 0 0 1-.4 0l-3.64-9.07a1.6 1.6 0 0 0-1.49-1.01m21.46 15.8c-4.58 0-8-3.46-8-8.07 0-4.6 3.42-8.06 8-8.06s8 3.46 8 8.06-3.43 8.07-8 8.07m0-13.17c-2.86 0-4.87 2.27-4.87 5.1s2 5.1 4.87 5.1c2.86 0 4.87-2.27 4.87-5.1s-2-5.1-4.87-5.1m20.16-2.66a.2.2 0 0 0-.17-.23 9 9 0 0 0-1.03-.07 6 6 0 0 0-4.22 1.61c-.14.15-.42.05-.42-.16v-.91a.2.2 0 0 0-.2-.21h-1.15c-.92 0-1.68.75-1.68 1.68v13.58c0 .11.1.2.21.2h1.24c.93 0 1.68-.74 1.68-1.67v-8.5q0-.06.03-.1a5.2 5.2 0 0 1 4.15-2.56c.65 0 1.29-.44 1.37-1.09zm3.02 15.5a.2.2 0 0 1-.21-.21V2.68c0-.93.75-1.68 1.68-1.68h1.24c.11 0 .2.1.2.21v21.48c0 .93-.75 1.68-1.67 1.68zm18.8-.21c0 .11.1.2.21.2h1.14c.93 0 1.68-.74 1.68-1.67V1.2c0-.12-.1-.21-.21-.21h-1.24c-.92 0-1.68.75-1.68 1.68V9.8c0 .18-.2.28-.35.17a7.4 7.4 0 0 0-4.39-1.4 7.3 7.3 0 0 0-3.78.99 8.2 8.2 0 0 0-3.98 7.07 8.1 8.1 0 0 0 3.95 7.05 8 8 0 0 0 3.88 1.02c1.67 0 3.2-.52 4.41-1.45.15-.1.36 0 .36.17zm.37-7.55a5.05 5.05 0 1 1-10.1 0 5.05 5.05 0 0 1 10.1 0M8.77 21.66a5.05 5.05 0 1 0 0-10.1 5.05 5.05 0 0 0 0 10.1\"\n />\n </svg>\n </a>\n </slot>\n </div>\n\n <!-- `relative`, so a BwFadeUp in the slot can lift its leaving copy out of the flow. -->\n <div class=\"relative flex min-w-0 flex-1 items-center px-7 py-3\">\n <slot name=\"right\" />\n </div>\n </div>\n\n <!-- The slide sizes this wrapper, so it carries no padding, border or margin of its own. -->\n <BwSlideTransition>\n <div\n v-if=\"isSubHeaderVisible && $slots['sub-header']\"\n class=\"bg-white text-text-primary\"\n >\n <slot name=\"sub-header\" />\n </div>\n </BwSlideTransition>\n </header>\n</template>\n","<script lang=\"ts\" setup>\nimport { BwSlideTransition } from '@betterworldcollective/core'\n\ninterface Props {\n /** Where the default logo links to. */\n logoHref?: string\n /** Shows the `sub-header` slot in a second row below the header, sliding it open and closed. */\n isSubHeaderVisible?: boolean\n}\nwithDefaults(defineProps<Props>(), {\n logoHref: '/',\n isSubHeaderVisible: false,\n})\n</script>\n\n<template>\n <header class=\"bw-header flex w-full flex-col bg-surface-brand text-white\">\n <!-- Two parts: the left one is as wide as the 290px BwSidebar below it, so the right one starts\n where the page content does. -->\n <div class=\"flex min-h-15 w-full items-stretch\">\n <div class=\"flex w-72.5 shrink-0 items-center px-7\">\n <slot name=\"left\">\n <a\n class=\"block shrink-0 rounded-[4px] outline-none focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-white\"\n :href=\"logoHref\"\n aria-label=\"BetterWorld\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"136\"\n height=\"20\"\n viewBox=\"0 0 170 25\"\n fill=\"none\"\n aria-hidden=\"true\"\n >\n <path\n fill=\"currentColor\"\n fill-rule=\"evenodd\"\n clip-rule=\"evenodd\"\n d=\"M4.39 23.25c-.14-.1-.36 0-.36.17v.74c0 .11-.1.2-.21.2H2.68c-.93 0-1.68-.74-1.68-1.67V1.2c0-.12.1-.21.21-.21h1.24c.92 0 1.68.75 1.68 1.68V9.8c0 .18.2.28.35.17a7.4 7.4 0 0 1 4.39-1.4 7.3 7.3 0 0 1 3.78.99 8.2 8.2 0 0 1 3.98 7.07 8.1 8.1 0 0 1-3.95 7.05A8 8 0 0 1 8.8 24.7c-1.67 0-3.2-.52-4.41-1.45m29.2-6.15q-.03.18-.21.2h-11.5a.2.2 0 0 0-.2.22 5 5 0 0 0 4.97 4.45c1.4 0 2.4-.41 3.17-.95.78-.54 1.84-.62 2.53.03l.65.62c.08.07.09.2.02.28a8.2 8.2 0 0 1-6.4 2.75c-4.5 0-8-3.43-8-8.07s3.16-8.06 7.54-8.06c4.31 0 7.44 3.49 7.44 8.06l-.02.47m-3.32-2.7a4.3 4.3 0 0 0-4.01-3.1 4.5 4.5 0 0 0-4.27 3.1.2.2 0 0 0 .2.26h7.89a.2.2 0 0 0 .2-.26m15.91 8.82c-.2-.91-1.15-1.48-2.08-1.48-.83 0-1.72-.3-2.14-.83-.4-.46-.46-1.15-.46-1.97V11.9q.02-.2.2-.21h3.05c.93 0 1.68-.76 1.68-1.68V9.1a.2.2 0 0 0-.2-.21H41.7a.2.2 0 0 1-.21-.21V4.83c0-.12-.1-.21-.21-.21h-1.24c-.93 0-1.68.75-1.68 1.68v2.4c0 .12-.1.2-.21.2H36.1c-.93 0-1.68.76-1.68 1.7v.9c0 .11.1.2.21.2h3.53q.19.02.2.22v6.86c0 1.68.34 3.1 1.26 4.12A5.6 5.6 0 0 0 44 24.7c.8 0 1.66-.1 2.25-.27a.2.2 0 0 0 .14-.24zm11.07-1.48c.94 0 1.88.57 2.09 1.48l.2.96a.2.2 0 0 1-.13.24c-.6.17-1.45.28-2.26.28-1.94 0-3.39-.7-4.38-1.81-.92-1.02-1.25-2.44-1.25-4.12v-6.86q-.02-.2-.2-.21h-3.54a.2.2 0 0 1-.2-.21v-.9c0-.94.75-1.7 1.68-1.7h2.05q.2-.01.21-.2V6.3c0-.93.76-1.68 1.69-1.68h1.23c.12 0 .21.1.21.21V8.7c0 .12.1.2.21.2h4.52q.18.02.2.22v.9c0 .93-.74 1.69-1.67 1.69h-3.05a.2.2 0 0 0-.2.2v7.04c0 .82.06 1.51.45 1.97.43.53 1.32.83 2.14.83m18.58-4.45c.1 0 .2-.08.2-.19q.03-.3.02-.47c0-4.57-3.12-8.06-7.44-8.06-4.37 0-7.53 3.42-7.53 8.06a7.86 7.86 0 0 0 8 8.07 8.2 8.2 0 0 0 6.4-2.75.2.2 0 0 0-.03-.28l-.65-.62c-.68-.65-1.75-.57-2.52-.03-.78.54-1.78.95-3.17.95a5 5 0 0 1-4.99-4.45.2.2 0 0 1 .21-.23zm-7.12-5.99a4.3 4.3 0 0 1 4.02 3.1.2.2 0 0 1-.2.26h-7.89a.2.2 0 0 1-.2-.26 4.5 4.5 0 0 1 4.27-3.1m19.32-2.66a.2.2 0 0 1 .17.23l-.19 1.57c-.07.65-.71 1.1-1.36 1.1a5.2 5.2 0 0 0-4.15 2.54l-.03.1v8.5c0 .94-.75 1.69-1.68 1.69h-1.24a.2.2 0 0 1-.2-.21V10.58c0-.93.74-1.68 1.67-1.68h1.14c.12 0 .21.1.21.2v.92c0 .2.28.3.42.16a6 6 0 0 1 4.22-1.61c.27 0 .68.02 1.02.07m14.64.26c-.66 0-1.25.4-1.49 1l-3.65 9.08a.21.21 0 0 1-.39 0l-3.62-9.03a1.7 1.7 0 0 0-1.56-1.05h-1.78a.2.2 0 0 0-.2.29l6.12 15.05q.06.13.2.13h1.88q.15 0 .2-.13l4.1-10.25a.21.21 0 0 1 .39 0l4.1 10.25q.05.12.19.13h1.89q.13 0 .2-.13l6.1-15.05a.21.21 0 0 0-.19-.3h-1.77c-.7 0-1.3.43-1.56 1.06l-3.63 9.03a.21.21 0 0 1-.4 0l-3.64-9.07a1.6 1.6 0 0 0-1.49-1.01m21.46 15.8c-4.58 0-8-3.46-8-8.07 0-4.6 3.42-8.06 8-8.06s8 3.46 8 8.06-3.43 8.07-8 8.07m0-13.17c-2.86 0-4.87 2.27-4.87 5.1s2 5.1 4.87 5.1c2.86 0 4.87-2.27 4.87-5.1s-2-5.1-4.87-5.1m20.16-2.66a.2.2 0 0 0-.17-.23 9 9 0 0 0-1.03-.07 6 6 0 0 0-4.22 1.61c-.14.15-.42.05-.42-.16v-.91a.2.2 0 0 0-.2-.21h-1.15c-.92 0-1.68.75-1.68 1.68v13.58c0 .11.1.2.21.2h1.24c.93 0 1.68-.74 1.68-1.67v-8.5q0-.06.03-.1a5.2 5.2 0 0 1 4.15-2.56c.65 0 1.29-.44 1.37-1.09zm3.02 15.5a.2.2 0 0 1-.21-.21V2.68c0-.93.75-1.68 1.68-1.68h1.24c.11 0 .2.1.2.21v21.48c0 .93-.75 1.68-1.67 1.68zm18.8-.21c0 .11.1.2.21.2h1.14c.93 0 1.68-.74 1.68-1.67V1.2c0-.12-.1-.21-.21-.21h-1.24c-.92 0-1.68.75-1.68 1.68V9.8c0 .18-.2.28-.35.17a7.4 7.4 0 0 0-4.39-1.4 7.3 7.3 0 0 0-3.78.99 8.2 8.2 0 0 0-3.98 7.07 8.1 8.1 0 0 0 3.95 7.05 8 8 0 0 0 3.88 1.02c1.67 0 3.2-.52 4.41-1.45.15-.1.36 0 .36.17zm.37-7.55a5.05 5.05 0 1 1-10.1 0 5.05 5.05 0 0 1 10.1 0M8.77 21.66a5.05 5.05 0 1 0 0-10.1 5.05 5.05 0 0 0 0 10.1\"\n />\n </svg>\n </a>\n </slot>\n </div>\n\n <!-- `relative`, so a BwFadeUp in the slot can lift its leaving copy out of the flow. -->\n <div class=\"relative flex min-w-0 flex-1 items-center px-7 py-3\">\n <slot name=\"right\" />\n </div>\n </div>\n\n <!-- The slide sizes this wrapper, so it carries no padding, border or margin of its own. -->\n <BwSlideTransition>\n <div\n v-if=\"isSubHeaderVisible && $slots['sub-header']\"\n class=\"bg-white text-text-primary\"\n >\n <slot name=\"sub-header\" />\n </div>\n </BwSlideTransition>\n </header>\n</template>\n","import type { ComputedRef, InjectionKey, Ref } from 'vue'\n\nexport interface SidebarItemRegistration {\n id: symbol\n hasActiveChild: ComputedRef<boolean>\n}\n\nexport interface SidebarContext {\n /** Id of the item whose dropdown is open, or null when the sidebar is in its default state. */\n expandedId: Ref<symbol | null> | ComputedRef<symbol | null>\n register: (item: SidebarItemRegistration) => void\n unregister: (id: symbol) => void\n toggle: (id: symbol) => void\n}\n\nexport const SIDEBAR_CONTEXT: InjectionKey<SidebarContext> = Symbol('BwSidebar')\n","<script lang=\"ts\" setup>\nimport { computed, provide, ref, shallowRef } from 'vue'\nimport { SIDEBAR_CONTEXT, type SidebarItemRegistration } from './context'\n\n// shallowRef, not ref: ref() would deep-unwrap each registration's nested computed refs.\nconst items = shallowRef<SidebarItemRegistration[]>([])\n\nconst activeParentId = computed(() => items.value.find((i) => i.hasActiveChild.value)?.id ?? null)\nconst pinnedId = ref<symbol | null>(null)\n\n// An item opens because it was clicked, or because it owns the active sub-item. Pointer position\n// never opens or closes anything.\nconst expandedId = computed<symbol | null>(() => {\n if (pinnedId.value && items.value.some((i) => i.id === pinnedId.value)) return pinnedId.value\n return activeParentId.value\n})\n\nprovide(SIDEBAR_CONTEXT, {\n expandedId,\n register: (item) => {\n items.value = [...items.value, item]\n },\n unregister: (id) => {\n items.value = items.value.filter((i) => i.id !== id)\n },\n toggle: (id) => {\n pinnedId.value = pinnedId.value === id ? null : id\n },\n})\n</script>\n\n<template>\n <!-- h-full fills the parent, so the parent needs a definite height for the nav to scroll rather\n than grow. -->\n <div class=\"bw-sidebar relative flex h-full w-72.5 overflow-hidden bg-white\">\n <nav class=\"min-h-0 w-72.5 shrink-0 overflow-y-auto overflow-x-hidden bg-white py-[25px]\">\n <!-- Rows touch; BwSidebarGroup sections put 20px between themselves and their neighbours. -->\n <ul class=\"flex flex-col\">\n <slot />\n </ul>\n </nav>\n </div>\n</template>\n","<script lang=\"ts\" setup>\nimport { computed, provide, ref, shallowRef } from 'vue'\nimport { SIDEBAR_CONTEXT, type SidebarItemRegistration } from './context'\n\n// shallowRef, not ref: ref() would deep-unwrap each registration's nested computed refs.\nconst items = shallowRef<SidebarItemRegistration[]>([])\n\nconst activeParentId = computed(() => items.value.find((i) => i.hasActiveChild.value)?.id ?? null)\nconst pinnedId = ref<symbol | null>(null)\n\n// An item opens because it was clicked, or because it owns the active sub-item. Pointer position\n// never opens or closes anything.\nconst expandedId = computed<symbol | null>(() => {\n if (pinnedId.value && items.value.some((i) => i.id === pinnedId.value)) return pinnedId.value\n return activeParentId.value\n})\n\nprovide(SIDEBAR_CONTEXT, {\n expandedId,\n register: (item) => {\n items.value = [...items.value, item]\n },\n unregister: (id) => {\n items.value = items.value.filter((i) => i.id !== id)\n },\n toggle: (id) => {\n pinnedId.value = pinnedId.value === id ? null : id\n },\n})\n</script>\n\n<template>\n <!-- h-full fills the parent, so the parent needs a definite height for the nav to scroll rather\n than grow. -->\n <div class=\"bw-sidebar relative flex h-full w-72.5 overflow-hidden bg-white\">\n <nav class=\"min-h-0 w-72.5 shrink-0 overflow-y-auto overflow-x-hidden bg-white py-[25px]\">\n <!-- Rows touch; BwSidebarGroup sections put 20px between themselves and their neighbours. -->\n <ul class=\"flex flex-col\">\n <slot />\n </ul>\n </nav>\n </div>\n</template>\n","<script lang=\"ts\" setup>\nimport { useId } from 'vue'\n\n// shadcn-vue's SidebarGroup + SidebarGroupLabel, folded into one part: a titled section of\n// BwSidebarItems. Sections sit 20px apart; the rows inside a section touch.\n\ninterface Props {\n /** Section title, drawn small and faded with a rule running to the right. Omit for an untitled section. */\n label?: string\n}\ndefineProps<Props>()\n\nconst labelId = useId()\n</script>\n\n<template>\n <li class=\"bw-sidebar-group not-first:mt-5\">\n <!-- The same box as a BwSidebarItem row (mx-4, 262px, pl-6 pr-2): the label starts over the item icons\n and the divider ends with their chevrons and badges. -->\n <div\n v-if=\"label || $slots.label\"\n class=\"mx-4 flex w-65.5 items-center gap-3 pl-6 pr-2 text-[11px] font-normal leading-[1.35] text-text-primary opacity-30\"\n >\n <span\n :id=\"labelId\"\n class=\"shrink-0\"\n >\n <slot name=\"label\">{{ label }}</slot>\n </span>\n <span class=\"h-px flex-1 bg-current opacity-30\" />\n </div>\n\n <ul\n class=\"flex flex-col\"\n :aria-labelledby=\"label || $slots.label ? labelId : undefined\"\n >\n <slot />\n </ul>\n </li>\n</template>\n","<script lang=\"ts\" setup>\nimport { useId } from 'vue'\n\n// shadcn-vue's SidebarGroup + SidebarGroupLabel, folded into one part: a titled section of\n// BwSidebarItems. Sections sit 20px apart; the rows inside a section touch.\n\ninterface Props {\n /** Section title, drawn small and faded with a rule running to the right. Omit for an untitled section. */\n label?: string\n}\ndefineProps<Props>()\n\nconst labelId = useId()\n</script>\n\n<template>\n <li class=\"bw-sidebar-group not-first:mt-5\">\n <!-- The same box as a BwSidebarItem row (mx-4, 262px, pl-6 pr-2): the label starts over the item icons\n and the divider ends with their chevrons and badges. -->\n <div\n v-if=\"label || $slots.label\"\n class=\"mx-4 flex w-65.5 items-center gap-3 pl-6 pr-2 text-[11px] font-normal leading-[1.35] text-text-primary opacity-30\"\n >\n <span\n :id=\"labelId\"\n class=\"shrink-0\"\n >\n <slot name=\"label\">{{ label }}</slot>\n </span>\n <span class=\"h-px flex-1 bg-current opacity-30\" />\n </div>\n\n <ul\n class=\"flex flex-col\"\n :aria-labelledby=\"label || $slots.label ? labelId : undefined\"\n >\n <slot />\n </ul>\n </li>\n</template>\n","<script lang=\"ts\" setup>\n// Internal: the count bubble shared by BwSidebarItem and BwSidebarSubItem (shadcn's SidebarMenuBadge).\n// A 16px circle for one character, widening into a pill for longer text.\n</script>\n\n<template>\n <span\n data-slot=\"sidebar-menu-badge\"\n class=\"inline-flex h-4 min-w-4 shrink-0 items-center justify-center rounded-full bg-action-primary px-1 text-[11px] leading-none font-normal text-white tabular-nums\"\n >\n <slot />\n </span>\n</template>\n","<script lang=\"ts\" setup>\n// Internal: the count bubble shared by BwSidebarItem and BwSidebarSubItem (shadcn's SidebarMenuBadge).\n// A 16px circle for one character, widening into a pill for longer text.\n</script>\n\n<template>\n <span\n data-slot=\"sidebar-menu-badge\"\n class=\"inline-flex h-4 min-w-4 shrink-0 items-center justify-center rounded-full bg-action-primary px-1 text-[11px] leading-none font-normal text-white tabular-nums\"\n >\n <slot />\n </span>\n</template>\n","import {\n CampaignIcon,\n DonationFormIcon,\n DonationIcon,\n DonorIcon,\n EventIcon,\n GiftIcon,\n HomeIcon,\n} from '@betterworldcollective/icons'\nimport type { Component } from 'vue'\n\nexport type IconName = 'home' | 'donation' | 'form' | 'campaign' | 'event' | 'donor' | 'gift'\n\n/** Named glyphs from the sidebar design, so `icon=\"home\"` works without an icon-font dependency. */\nexport const SIDEBAR_ICONS: Record<IconName, Component> = {\n home: HomeIcon,\n donation: DonationIcon,\n form: DonationFormIcon,\n campaign: CampaignIcon,\n event: EventIcon,\n donor: DonorIcon,\n gift: GiftIcon,\n}\n","<script lang=\"ts\" setup>\nimport {\n Comment,\n Fragment,\n computed,\n inject,\n isVNode,\n onUnmounted,\n useSlots,\n type Component,\n type VNode,\n} from 'vue'\nimport { ChevronDownIcon } from '@betterworldcollective/icons'\nimport BwSidebarBadge from './BwSidebarBadge.vue'\nimport { SIDEBAR_CONTEXT } from './context'\nimport { SIDEBAR_ICONS, type IconName } from './icons'\n\ninterface Props {\n /** Row text; the `label` slot overrides it. */\n label?: string\n /** A named sidebar glyph or any icon component; the `icon` slot overrides it. */\n icon?: IconName | Component\n /** Marks the current page: tinted row and `aria-current=\"page\"`. */\n active?: boolean\n /** Count or short tag shown at the row's end (shadcn's SidebarMenuBadge); the `badge` slot overrides it. */\n badge?: number | string\n /** Turns a childless row into a link. Ignored on a row with children, which only expands. */\n href?: string\n /** Escape hatch for a custom tag or component (e.g. RouterLink) without depending on vue-router. */\n as?: string | Component\n}\nconst props = defineProps<Props>()\n\nconst slots = useSlots()\nconst ctx = inject(SIDEBAR_CONTEXT, null)\nconst id = Symbol('BwSidebarItem')\n\nfunction flatten(nodes: VNode[]): VNode[] {\n const out: VNode[] = []\n for (const node of nodes) {\n if (!isVNode(node)) continue\n if (node.type === Fragment) out.push(...flatten((node.children ?? []) as VNode[]))\n else if (node.type !== Comment) out.push(node)\n }\n return out\n}\n\n// The children's VNodes have to be inspected without being rendered: expansion depends on having an\n// active child, yet the children only render once expanded — waiting for them to mount would be\n// circular.\nconst childVNodes = computed(() => flatten(slots.default?.() ?? []))\nconst hasChildren = computed(() => childVNodes.value.length > 0)\nconst hasActiveChild = computed(() =>\n // A bare `active` attribute compiles to the empty string, not `true`.\n childVNodes.value.some((node) => node.props?.active === '' || node.props?.active === true),\n)\n\nctx?.register({ id, hasActiveChild })\nonUnmounted(() => ctx?.unregister(id))\n\nconst isExpanded = computed(() => ctx?.expandedId.value === id)\n\nconst hasBadge = computed(() => (props.badge !== undefined && props.badge !== '') || Boolean(slots.badge))\n\nconst resolvedIcon = computed<Component | null>(() => {\n if (!props.icon) return null\n return typeof props.icon === 'string' ? SIDEBAR_ICONS[props.icon] : props.icon\n})\n\n// An item with children is an expander, not a link: it stays a <button> and ignores href, so the\n// row cannot navigate away when its only job is to reveal its children. An explicit `as` still wins.\nconst tag = computed(() => props.as ?? (props.href && !hasChildren.value ? 'a' : 'button'))\n\n// A CSS transition cannot interpolate to `height: auto`, so the dropdown's height is measured and\n// pinned in JS for the duration of the animation, then released.\nfunction onEnter(el: Element) {\n const node = el as HTMLElement\n node.style.height = '0px'\n node.style.opacity = '0'\n void node.offsetHeight // flush, so the browser has a start value to animate from\n node.style.height = `${node.scrollHeight}px`\n node.style.opacity = '1'\n}\n\nfunction onAfterEnter(el: Element) {\n const node = el as HTMLElement\n // Release the pinned height so the list can reflow if its contents change.\n node.style.height = ''\n node.style.opacity = ''\n}\n\nfunction onLeave(el: Element) {\n const node = el as HTMLElement\n node.style.height = `${node.scrollHeight}px`\n node.style.opacity = '1'\n void node.offsetHeight\n node.style.height = '0px'\n node.style.opacity = '0'\n}\n</script>\n\n<template>\n <!-- 4px between rows (shadcn's SidebarMenu gap-1); a row that follows a BwSidebarGroup keeps the 20px\n section gap. -->\n <li class=\"bw-sidebar-item [.bw-sidebar-item+&]:mt-1 [.bw-sidebar-group+&]:mt-5\">\n <component\n :is=\"tag\"\n :href=\"tag === 'a' ? href : undefined\"\n :type=\"tag === 'button' ? 'button' : undefined\"\n class=\"mx-4 flex w-65.5 items-center gap-[7px] rounded-[4px] py-2 pl-6 pr-2 text-left text-text-primary transition-colors duration-250 ease-in-out outline-none hover:bg-surface-brand/10 focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-ring\"\n :class=\"active ? 'bg-surface-brand/5' : ''\"\n :aria-expanded=\"hasChildren ? isExpanded : undefined\"\n :aria-current=\"active ? 'page' : undefined\"\n @click=\"hasChildren ? ctx?.toggle(id) : undefined\"\n >\n <!-- A fixed 17px box, so every label starts at the same x whatever the glyph's own width. -->\n <span class=\"flex w-[17px] shrink-0 items-center justify-center\">\n <slot name=\"icon\">\n <component\n :is=\"resolvedIcon\"\n v-if=\"resolvedIcon\"\n />\n </slot>\n </span>\n\n <span class=\"min-w-0 flex-1 truncate text-[15px] font-normal leading-[1.35]\">\n <slot name=\"label\">{{ label }}</slot>\n </span>\n\n <BwSidebarBadge v-if=\"hasBadge\">\n <slot name=\"badge\">{{ badge }}</slot>\n </BwSidebarBadge>\n\n <!-- Points up while the section is open. -->\n <ChevronDownIcon\n v-if=\"hasChildren\"\n class=\"shrink-0 transition-[rotate] duration-250 ease-in-out\"\n :class=\"isExpanded ? 'rotate-180' : ''\"\n />\n </component>\n\n <!-- BwSidebarSubItem indents itself. The animated wrapper carries no padding of its own — with\n border-box sizing an element cannot shrink below its own padding, so it would never collapse\n fully. -->\n <Transition\n enter-active-class=\"overflow-hidden transition-[height,opacity] duration-250 ease-in-out\"\n leave-active-class=\"overflow-hidden transition-[height,opacity] duration-250 ease-in-out\"\n @enter=\"onEnter\"\n @after-enter=\"onAfterEnter\"\n @leave=\"onLeave\"\n >\n <div v-if=\"hasChildren && isExpanded\">\n <!-- 4px above the first sub-item and between them (shadcn's SidebarMenuSub gap-1). -->\n <ul class=\"flex flex-col gap-1 pt-1\">\n <slot />\n </ul>\n </div>\n </Transition>\n </li>\n</template>\n","<script lang=\"ts\" setup>\nimport {\n Comment,\n Fragment,\n computed,\n inject,\n isVNode,\n onUnmounted,\n useSlots,\n type Component,\n type VNode,\n} from 'vue'\nimport { ChevronDownIcon } from '@betterworldcollective/icons'\nimport BwSidebarBadge from './BwSidebarBadge.vue'\nimport { SIDEBAR_CONTEXT } from './context'\nimport { SIDEBAR_ICONS, type IconName } from './icons'\n\ninterface Props {\n /** Row text; the `label` slot overrides it. */\n label?: string\n /** A named sidebar glyph or any icon component; the `icon` slot overrides it. */\n icon?: IconName | Component\n /** Marks the current page: tinted row and `aria-current=\"page\"`. */\n active?: boolean\n /** Count or short tag shown at the row's end (shadcn's SidebarMenuBadge); the `badge` slot overrides it. */\n badge?: number | string\n /** Turns a childless row into a link. Ignored on a row with children, which only expands. */\n href?: string\n /** Escape hatch for a custom tag or component (e.g. RouterLink) without depending on vue-router. */\n as?: string | Component\n}\nconst props = defineProps<Props>()\n\nconst slots = useSlots()\nconst ctx = inject(SIDEBAR_CONTEXT, null)\nconst id = Symbol('BwSidebarItem')\n\nfunction flatten(nodes: VNode[]): VNode[] {\n const out: VNode[] = []\n for (const node of nodes) {\n if (!isVNode(node)) continue\n if (node.type === Fragment) out.push(...flatten((node.children ?? []) as VNode[]))\n else if (node.type !== Comment) out.push(node)\n }\n return out\n}\n\n// The children's VNodes have to be inspected without being rendered: expansion depends on having an\n// active child, yet the children only render once expanded — waiting for them to mount would be\n// circular.\nconst childVNodes = computed(() => flatten(slots.default?.() ?? []))\nconst hasChildren = computed(() => childVNodes.value.length > 0)\nconst hasActiveChild = computed(() =>\n // A bare `active` attribute compiles to the empty string, not `true`.\n childVNodes.value.some((node) => node.props?.active === '' || node.props?.active === true),\n)\n\nctx?.register({ id, hasActiveChild })\nonUnmounted(() => ctx?.unregister(id))\n\nconst isExpanded = computed(() => ctx?.expandedId.value === id)\n\nconst hasBadge = computed(() => (props.badge !== undefined && props.badge !== '') || Boolean(slots.badge))\n\nconst resolvedIcon = computed<Component | null>(() => {\n if (!props.icon) return null\n return typeof props.icon === 'string' ? SIDEBAR_ICONS[props.icon] : props.icon\n})\n\n// An item with children is an expander, not a link: it stays a <button> and ignores href, so the\n// row cannot navigate away when its only job is to reveal its children. An explicit `as` still wins.\nconst tag = computed(() => props.as ?? (props.href && !hasChildren.value ? 'a' : 'button'))\n\n// A CSS transition cannot interpolate to `height: auto`, so the dropdown's height is measured and\n// pinned in JS for the duration of the animation, then released.\nfunction onEnter(el: Element) {\n const node = el as HTMLElement\n node.style.height = '0px'\n node.style.opacity = '0'\n void node.offsetHeight // flush, so the browser has a start value to animate from\n node.style.height = `${node.scrollHeight}px`\n node.style.opacity = '1'\n}\n\nfunction onAfterEnter(el: Element) {\n const node = el as HTMLElement\n // Release the pinned height so the list can reflow if its contents change.\n node.style.height = ''\n node.style.opacity = ''\n}\n\nfunction onLeave(el: Element) {\n const node = el as HTMLElement\n node.style.height = `${node.scrollHeight}px`\n node.style.opacity = '1'\n void node.offsetHeight\n node.style.height = '0px'\n node.style.opacity = '0'\n}\n</script>\n\n<template>\n <!-- 4px between rows (shadcn's SidebarMenu gap-1); a row that follows a BwSidebarGroup keeps the 20px\n section gap. -->\n <li class=\"bw-sidebar-item [.bw-sidebar-item+&]:mt-1 [.bw-sidebar-group+&]:mt-5\">\n <component\n :is=\"tag\"\n :href=\"tag === 'a' ? href : undefined\"\n :type=\"tag === 'button' ? 'button' : undefined\"\n class=\"mx-4 flex w-65.5 items-center gap-[7px] rounded-[4px] py-2 pl-6 pr-2 text-left text-text-primary transition-colors duration-250 ease-in-out outline-none hover:bg-surface-brand/10 focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-ring\"\n :class=\"active ? 'bg-surface-brand/5' : ''\"\n :aria-expanded=\"hasChildren ? isExpanded : undefined\"\n :aria-current=\"active ? 'page' : undefined\"\n @click=\"hasChildren ? ctx?.toggle(id) : undefined\"\n >\n <!-- A fixed 17px box, so every label starts at the same x whatever the glyph's own width. -->\n <span class=\"flex w-[17px] shrink-0 items-center justify-center\">\n <slot name=\"icon\">\n <component\n :is=\"resolvedIcon\"\n v-if=\"resolvedIcon\"\n />\n </slot>\n </span>\n\n <span class=\"min-w-0 flex-1 truncate text-[15px] font-normal leading-[1.35]\">\n <slot name=\"label\">{{ label }}</slot>\n </span>\n\n <BwSidebarBadge v-if=\"hasBadge\">\n <slot name=\"badge\">{{ badge }}</slot>\n </BwSidebarBadge>\n\n <!-- Points up while the section is open. -->\n <ChevronDownIcon\n v-if=\"hasChildren\"\n class=\"shrink-0 transition-[rotate] duration-250 ease-in-out\"\n :class=\"isExpanded ? 'rotate-180' : ''\"\n />\n </component>\n\n <!-- BwSidebarSubItem indents itself. The animated wrapper carries no padding of its own — with\n border-box sizing an element cannot shrink below its own padding, so it would never collapse\n fully. -->\n <Transition\n enter-active-class=\"overflow-hidden transition-[height,opacity] duration-250 ease-in-out\"\n leave-active-class=\"overflow-hidden transition-[height,opacity] duration-250 ease-in-out\"\n @enter=\"onEnter\"\n @after-enter=\"onAfterEnter\"\n @leave=\"onLeave\"\n >\n <div v-if=\"hasChildren && isExpanded\">\n <!-- 4px above the first sub-item and between them (shadcn's SidebarMenuSub gap-1). -->\n <ul class=\"flex flex-col gap-1 pt-1\">\n <slot />\n </ul>\n </div>\n </Transition>\n </li>\n</template>\n","<script lang=\"ts\" setup>\nimport { computed, useSlots, type Component } from 'vue'\nimport BwSidebarBadge from './BwSidebarBadge.vue'\n\ninterface Props {\n /** Row text; the default slot overrides it. */\n label?: string\n /** Marks the current page: tinted row and `aria-current=\"page\"`. Auto-expands the parent item. */\n active?: boolean\n /** Count or short tag shown at the row's end (shadcn's SidebarMenuBadge); the `badge` slot overrides it. */\n badge?: number | string\n /** Turns the row into a link. */\n href?: string\n /** Escape hatch for a custom tag or component (e.g. RouterLink) without depending on vue-router. */\n as?: string | Component\n}\nconst props = defineProps<Props>()\n\nconst slots = useSlots()\n\nconst hasBadge = computed(() => (props.badge !== undefined && props.badge !== '') || Boolean(slots.badge))\n\nconst tag = computed(() => props.as ?? (props.href ? 'a' : 'button'))\n</script>\n\n<template>\n <li class=\"bw-sidebar-sub-item\">\n <!-- Sits under its parent row (mx-4, 262px), inset 40px so its text starts 16px past the parent's\n label, and runs to the same right edge (16 + 40 = 56px left margin, 262 - 40 = 222px wide), so a\n badge here lines up with the parent's chevron. -->\n <component\n :is=\"tag\"\n :href=\"href\"\n :type=\"tag === 'button' ? 'button' : undefined\"\n class=\"ml-14 mr-4 flex w-55.5 items-center gap-[7px] rounded-[4px] py-2 pl-6 pr-2 text-left text-[15px] font-normal leading-[1.35] text-text-primary transition-colors outline-none hover:bg-surface-brand/10 focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-ring\"\n :class=\"active ? 'bg-surface-brand/5' : ''\"\n :aria-current=\"active ? 'page' : undefined\"\n >\n <span class=\"min-w-0 flex-1 truncate\">\n <slot>{{ label }}</slot>\n </span>\n\n <BwSidebarBadge v-if=\"hasBadge\">\n <slot name=\"badge\">{{ badge }}</slot>\n </BwSidebarBadge>\n </component>\n </li>\n</template>\n","<script lang=\"ts\" setup>\nimport { computed, useSlots, type Component } from 'vue'\nimport BwSidebarBadge from './BwSidebarBadge.vue'\n\ninterface Props {\n /** Row text; the default slot overrides it. */\n label?: string\n /** Marks the current page: tinted row and `aria-current=\"page\"`. Auto-expands the parent item. */\n active?: boolean\n /** Count or short tag shown at the row's end (shadcn's SidebarMenuBadge); the `badge` slot overrides it. */\n badge?: number | string\n /** Turns the row into a link. */\n href?: string\n /** Escape hatch for a custom tag or component (e.g. RouterLink) without depending on vue-router. */\n as?: string | Component\n}\nconst props = defineProps<Props>()\n\nconst slots = useSlots()\n\nconst hasBadge = computed(() => (props.badge !== undefined && props.badge !== '') || Boolean(slots.badge))\n\nconst tag = computed(() => props.as ?? (props.href ? 'a' : 'button'))\n</script>\n\n<template>\n <li class=\"bw-sidebar-sub-item\">\n <!-- Sits under its parent row (mx-4, 262px), inset 40px so its text starts 16px past the parent's\n label, and runs to the same right edge (16 + 40 = 56px left margin, 262 - 40 = 222px wide), so a\n badge here lines up with the parent's chevron. -->\n <component\n :is=\"tag\"\n :href=\"href\"\n :type=\"tag === 'button' ? 'button' : undefined\"\n class=\"ml-14 mr-4 flex w-55.5 items-center gap-[7px] rounded-[4px] py-2 pl-6 pr-2 text-left text-[15px] font-normal leading-[1.35] text-text-primary transition-colors outline-none hover:bg-surface-brand/10 focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-ring\"\n :class=\"active ? 'bg-surface-brand/5' : ''\"\n :aria-current=\"active ? 'page' : undefined\"\n >\n <span class=\"min-w-0 flex-1 truncate\">\n <slot>{{ label }}</slot>\n </span>\n\n <BwSidebarBadge v-if=\"hasBadge\">\n <slot name=\"badge\">{{ badge }}</slot>\n </BwSidebarBadge>\n </component>\n </li>\n</template>\n","<script lang=\"ts\" setup>\nimport { BwHeader } from '../header'\nimport { BwSidebar } from '../sidebar'\n\n// The dashboard shell: BwHeader across the top, BwSidebar down the left, and the page beside it.\n\ninterface Props {\n /** Passed to BwHeader: where the default logo links to. */\n logoHref?: string\n /** Passed to BwHeader: shows the `sub-header` slot in a second row below the header. */\n isSubHeaderVisible?: boolean\n}\nwithDefaults(defineProps<Props>(), {\n logoHref: '/',\n isSubHeaderVisible: false,\n})\n</script>\n\n<template>\n <!-- h-full fills the parent, so the parent needs a definite height (h-screen, say) for the sidebar\n and the page to scroll on their own rather than grow. -->\n <div class=\"bw-layout flex h-full w-full flex-col bg-[#F4F4F6]\">\n <!-- Each header slot is forwarded only when filled: an empty `left` would replace the default\n logo, and BwHeader shows the sub-header row only if it was given one. -->\n <BwHeader\n class=\"shrink-0\"\n :logo-href=\"logoHref\"\n :is-sub-header-visible=\"isSubHeaderVisible\"\n >\n <template\n v-if=\"$slots['header-left']\"\n #left\n >\n <slot name=\"header-left\" />\n </template>\n <template\n v-if=\"$slots['header-right']\"\n #right\n >\n <slot name=\"header-right\" />\n </template>\n <template\n v-if=\"$slots['sub-header']\"\n #sub-header\n >\n <slot name=\"sub-header\" />\n </template>\n </BwHeader>\n\n <div class=\"flex min-h-0 flex-1\">\n <BwSidebar v-if=\"$slots.sidebar\">\n <slot name=\"sidebar\" />\n </BwSidebar>\n\n <main class=\"min-w-0 flex-1 overflow-y-auto\">\n <slot />\n </main>\n </div>\n </div>\n</template>\n","<script lang=\"ts\" setup>\nimport { BwHeader } from '../header'\nimport { BwSidebar } from '../sidebar'\n\n// The dashboard shell: BwHeader across the top, BwSidebar down the left, and the page beside it.\n\ninterface Props {\n /** Passed to BwHeader: where the default logo links to. */\n logoHref?: string\n /** Passed to BwHeader: shows the `sub-header` slot in a second row below the header. */\n isSubHeaderVisible?: boolean\n}\nwithDefaults(defineProps<Props>(), {\n logoHref: '/',\n isSubHeaderVisible: false,\n})\n</script>\n\n<template>\n <!-- h-full fills the parent, so the parent needs a definite height (h-screen, say) for the sidebar\n and the page to scroll on their own rather than grow. -->\n <div class=\"bw-layout flex h-full w-full flex-col bg-[#F4F4F6]\">\n <!-- Each header slot is forwarded only when filled: an empty `left` would replace the default\n logo, and BwHeader shows the sub-header row only if it was given one. -->\n <BwHeader\n class=\"shrink-0\"\n :logo-href=\"logoHref\"\n :is-sub-header-visible=\"isSubHeaderVisible\"\n >\n <template\n v-if=\"$slots['header-left']\"\n #left\n >\n <slot name=\"header-left\" />\n </template>\n <template\n v-if=\"$slots['header-right']\"\n #right\n >\n <slot name=\"header-right\" />\n </template>\n <template\n v-if=\"$slots['sub-header']\"\n #sub-header\n >\n <slot name=\"sub-header\" />\n </template>\n </BwHeader>\n\n <div class=\"flex min-h-0 flex-1\">\n <BwSidebar v-if=\"$slots.sidebar\">\n <slot name=\"sidebar\" />\n </BwSidebar>\n\n <main class=\"min-w-0 flex-1 overflow-y-auto\">\n <slot />\n </main>\n </div>\n </div>\n</template>\n","<script lang=\"ts\" setup>\nimport { type Component, computed, nextTick, ref } from 'vue'\nimport {\n AthonIcon,\n CheckIcon,\n CrowdfundingIcon,\n DonationFormIcon,\n EventIcon,\n GiveawaysIcon,\n ImpactGivingIcon,\n LiveAuctionIcon,\n PaddleRaiseIcon,\n PeerToPeerIcon,\n SilentAuctionIcon,\n} from '@betterworldcollective/icons'\nimport type { CampaignType } from '../../../types/Campaign'\n\ninterface Props {\n /** Picks the glyph in the icon tile. */\n type: CampaignType\n title?: string\n subtitle?: string\n /** Makes the whole card a checkbox: shows the check / empty box on the right and toggles v-model on click. */\n canSelect?: boolean\n /** Forces the active look (green icon tile, gradient background) whatever v-model holds. */\n active?: boolean\n showIcon?: boolean\n}\nconst props = withDefaults(defineProps<Props>(), {\n title: '',\n subtitle: '',\n canSelect: false,\n active: false,\n showIcon: true,\n})\n\n/** Selected (true) or default (false). A selected card also takes the active look. */\nconst model = defineModel<boolean>({ default: false })\n\ndefineSlots<{\n title?(): unknown\n subtitle?(): unknown\n /** Right-hand side; wraps the check / empty box shown when `canSelect` is set. */\n right?(props: { selected: boolean }): unknown\n}>()\n\n// Same glyphs as the Create campaign page's type chips.\nconst ICONS: Record<CampaignType, Component> = {\n 'auction': SilentAuctionIcon,\n 'live-auction': LiveAuctionIcon,\n 'donation': DonationFormIcon,\n 'impact': ImpactGivingIcon,\n 'crowdfunding': CrowdfundingIcon,\n 'paddleraise': PaddleRaiseIcon,\n 'peer-to-peer': PeerToPeerIcon,\n 'ticketed-event': EventIcon,\n 'giveaway': GiveawaysIcon,\n 'a-thons': AthonIcon,\n}\n\nconst isActive = computed(() => props.active || model.value)\n\n// The active background ripples out from where the card was pressed, and back into it when deselected.\n// A keyboard press (`detail` 0) or an `active` set from outside starts from the centre.\nconst rippleOrigin = ref('50% 50%')\nconst rippleLayer = ref<HTMLElement | null>(null)\n\nasync function toggle(event: MouseEvent) {\n if (!props.canSelect) return\n const el = event.currentTarget as HTMLElement\n const rect = el.getBoundingClientRect()\n const origin = event.detail > 0 ? `${event.clientX - rect.left}px ${event.clientY - rect.top}px` : '50% 50%'\n\n // Only the radius may animate: move the centre with the transition off first. The jump is invisible,\n // as the circle is either empty or already covering the card. Otherwise the centre would slide over from\n // the previous press while the circle grows.\n const layer = rippleLayer.value\n if (layer && origin !== rippleOrigin.value) {\n layer.style.transition = 'none'\n rippleOrigin.value = origin\n await nextTick()\n void layer.offsetWidth // commit the new centre before the transition is restored\n layer.style.transition = ''\n }\n model.value = !model.value\n}\n\n// 150% of circle()'s reference radius reaches the farthest corner from any point in the card.\nconst rippleStyle = computed(() => ({\n clipPath: `circle(${isActive.value ? '150%' : '0%'} at ${rippleOrigin.value})`,\n}))\n\n// Every competing property comes from one computed per element: equal-specificity Tailwind utilities\n// resolve by stylesheet order, so a static class plus a conditional override would not reliably swap.\n//\n// Rest carries the design's ambient 30px/64px glow plus the 24px and 4px drop shadows; hover drops the\n// soft 24px one so the card settles onto the page (as BwCampaignChip does).\nconst shadowClass =\n 'shadow-[30px_0px_64px_0px_#3A4E610D,0px_6px_24px_0px_#0000001A,0px_4px_4px_0px_#0000000D] hover:shadow-[30px_0px_64px_0px_#3A4E610D,0px_4px_4px_0px_#0000000D]'\n\nconst iconTileClass = computed(() =>\n isActive.value ? 'bg-action-primary/15 text-action-primary' : 'bg-surface-brand/15 text-text-primary',\n)\n</script>\n\n<template>\n <component\n :is=\"canSelect ? 'button' : 'div'\"\n :type=\"canSelect ? 'button' : undefined\"\n :role=\"canSelect ? 'checkbox' : undefined\"\n :aria-checked=\"canSelect ? model : undefined\"\n class=\"relative flex w-full items-center gap-6 rounded-[24px] border border-white bg-white/40 px-5 py-4.5 text-left text-text-primary [transition:box-shadow_200ms_ease,transform_200ms_cubic-bezier(0.34,1.56,0.64,1)] motion-reduce:transition-none\"\n :class=\"[\n shadowClass,\n canSelect && 'cursor-pointer active:scale-[0.99] focus-visible:outline-solid focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-action-primary',\n ]\"\n @click=\"toggle\"\n >\n <!-- The active gradient can't be transitioned as a background-image, so it lives on its own layer,\n revealed by a circular clip-path that ripples from the press point. -->\n <span\n ref=\"rippleLayer\"\n aria-hidden=\"true\"\n class=\"pointer-events-none absolute inset-0 rounded-[inherit] bg-[linear-gradient(158.53deg,#FFFFFF_20.63%,rgba(255,255,255,0.4)_100%)] [transition:clip-path_200ms_cubic-bezier(0.4,0,0.2,1)] motion-reduce:transition-none\"\n :style=\"rippleStyle\"\n />\n\n <span\n v-if=\"showIcon\"\n aria-hidden=\"true\"\n class=\"relative flex shrink-0 items-center justify-center rounded-lg p-5 transition-colors duration-200 motion-reduce:transition-none\"\n :class=\"iconTileClass\"\n >\n <!-- The 16px glyph sits in a 24px icon frame, as in the design: 20px padding + 24 = a 64px tile. -->\n <span class=\"flex h-6 w-6 items-center justify-center\">\n <component :is=\"ICONS[type]\" />\n </span>\n </span>\n\n <span class=\"relative flex min-w-0 flex-1 flex-col gap-1.5\">\n <span class=\"text-[18px] leading-[1.2]\">\n <slot name=\"title\">{{ title }}</slot>\n </span>\n <span\n v-if=\"subtitle || $slots.subtitle\"\n class=\"text-[13px] font-light leading-[1.2] text-text-primary/70\"\n >\n <slot name=\"subtitle\">{{ subtitle }}</slot>\n </span>\n </span>\n\n <span\n v-if=\"canSelect || $slots.right\"\n class=\"relative flex shrink-0 items-center\"\n >\n <slot\n name=\"right\"\n :selected=\"model\"\n >\n <!-- Both marks share one grid cell so the check and the empty box cross-fade in place; the\n check springs in on the same overshoot curve BwCampaignChip uses for its press. -->\n <span\n aria-hidden=\"true\"\n class=\"grid h-6 w-6 place-items-center\"\n >\n <Transition\n enter-active-class=\"transition duration-200 ease-[cubic-bezier(0.34,1.56,0.64,1)] motion-reduce:transition-none\"\n enter-from-class=\"opacity-0 scale-50\"\n leave-active-class=\"transition duration-100 ease-in motion-reduce:transition-none\"\n leave-to-class=\"opacity-0 scale-75\"\n >\n <CheckIcon\n v-if=\"model\"\n class=\"text-action-primary [grid-area:1/1]\"\n width=\"24\"\n height=\"24\"\n />\n <span\n v-else\n class=\"h-5.5 w-5.5 rounded-[5px] border-[1.5px] border-text-primary [grid-area:1/1]\"\n />\n </Transition>\n </span>\n </slot>\n </span>\n </component>\n</template>\n","<script lang=\"ts\" setup>\nimport { type Component, computed, nextTick, ref } from 'vue'\nimport {\n AthonIcon,\n CheckIcon,\n CrowdfundingIcon,\n DonationFormIcon,\n EventIcon,\n GiveawaysIcon,\n ImpactGivingIcon,\n LiveAuctionIcon,\n PaddleRaiseIcon,\n PeerToPeerIcon,\n SilentAuctionIcon,\n} from '@betterworldcollective/icons'\nimport type { CampaignType } from '../../../types/Campaign'\n\ninterface Props {\n /** Picks the glyph in the icon tile. */\n type: CampaignType\n title?: string\n subtitle?: string\n /** Makes the whole card a checkbox: shows the check / empty box on the right and toggles v-model on click. */\n canSelect?: boolean\n /** Forces the active look (green icon tile, gradient background) whatever v-model holds. */\n active?: boolean\n showIcon?: boolean\n}\nconst props = withDefaults(defineProps<Props>(), {\n title: '',\n subtitle: '',\n canSelect: false,\n active: false,\n showIcon: true,\n})\n\n/** Selected (true) or default (false). A selected card also takes the active look. */\nconst model = defineModel<boolean>({ default: false })\n\ndefineSlots<{\n title?(): unknown\n subtitle?(): unknown\n /** Right-hand side; wraps the check / empty box shown when `canSelect` is set. */\n right?(props: { selected: boolean }): unknown\n}>()\n\n// Same glyphs as the Create campaign page's type chips.\nconst ICONS: Record<CampaignType, Component> = {\n 'auction': SilentAuctionIcon,\n 'live-auction': LiveAuctionIcon,\n 'donation': DonationFormIcon,\n 'impact': ImpactGivingIcon,\n 'crowdfunding': CrowdfundingIcon,\n 'paddleraise': PaddleRaiseIcon,\n 'peer-to-peer': PeerToPeerIcon,\n 'ticketed-event': EventIcon,\n 'giveaway': GiveawaysIcon,\n 'a-thons': AthonIcon,\n}\n\nconst isActive = computed(() => props.active || model.value)\n\n// The active background ripples out from where the card was pressed, and back into it when deselected.\n// A keyboard press (`detail` 0) or an `active` set from outside starts from the centre.\nconst rippleOrigin = ref('50% 50%')\nconst rippleLayer = ref<HTMLElement | null>(null)\n\nasync function toggle(event: MouseEvent) {\n if (!props.canSelect) return\n const el = event.currentTarget as HTMLElement\n const rect = el.getBoundingClientRect()\n const origin = event.detail > 0 ? `${event.clientX - rect.left}px ${event.clientY - rect.top}px` : '50% 50%'\n\n // Only the radius may animate: move the centre with the transition off first. The jump is invisible,\n // as the circle is either empty or already covering the card. Otherwise the centre would slide over from\n // the previous press while the circle grows.\n const layer = rippleLayer.value\n if (layer && origin !== rippleOrigin.value) {\n layer.style.transition = 'none'\n rippleOrigin.value = origin\n await nextTick()\n void layer.offsetWidth // commit the new centre before the transition is restored\n layer.style.transition = ''\n }\n model.value = !model.value\n}\n\n// 150% of circle()'s reference radius reaches the farthest corner from any point in the card.\nconst rippleStyle = computed(() => ({\n clipPath: `circle(${isActive.value ? '150%' : '0%'} at ${rippleOrigin.value})`,\n}))\n\n// Every competing property comes from one computed per element: equal-specificity Tailwind utilities\n// resolve by stylesheet order, so a static class plus a conditional override would not reliably swap.\n//\n// Rest carries the design's ambient 30px/64px glow plus the 24px and 4px drop shadows; hover drops the\n// soft 24px one so the card settles onto the page (as BwCampaignChip does).\nconst shadowClass =\n 'shadow-[30px_0px_64px_0px_#3A4E610D,0px_6px_24px_0px_#0000001A,0px_4px_4px_0px_#0000000D] hover:shadow-[30px_0px_64px_0px_#3A4E610D,0px_4px_4px_0px_#0000000D]'\n\nconst iconTileClass = computed(() =>\n isActive.value ? 'bg-action-primary/15 text-action-primary' : 'bg-surface-brand/15 text-text-primary',\n)\n</script>\n\n<template>\n <component\n :is=\"canSelect ? 'button' : 'div'\"\n :type=\"canSelect ? 'button' : undefined\"\n :role=\"canSelect ? 'checkbox' : undefined\"\n :aria-checked=\"canSelect ? model : undefined\"\n class=\"relative flex w-full items-center gap-6 rounded-[24px] border border-white bg-white/40 px-5 py-4.5 text-left text-text-primary [transition:box-shadow_200ms_ease,transform_200ms_cubic-bezier(0.34,1.56,0.64,1)] motion-reduce:transition-none\"\n :class=\"[\n shadowClass,\n canSelect && 'cursor-pointer active:scale-[0.99] focus-visible:outline-solid focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-action-primary',\n ]\"\n @click=\"toggle\"\n >\n <!-- The active gradient can't be transitioned as a background-image, so it lives on its own layer,\n revealed by a circular clip-path that ripples from the press point. -->\n <span\n ref=\"rippleLayer\"\n aria-hidden=\"true\"\n class=\"pointer-events-none absolute inset-0 rounded-[inherit] bg-[linear-gradient(158.53deg,#FFFFFF_20.63%,rgba(255,255,255,0.4)_100%)] [transition:clip-path_200ms_cubic-bezier(0.4,0,0.2,1)] motion-reduce:transition-none\"\n :style=\"rippleStyle\"\n />\n\n <span\n v-if=\"showIcon\"\n aria-hidden=\"true\"\n class=\"relative flex shrink-0 items-center justify-center rounded-lg p-5 transition-colors duration-200 motion-reduce:transition-none\"\n :class=\"iconTileClass\"\n >\n <!-- The 16px glyph sits in a 24px icon frame, as in the design: 20px padding + 24 = a 64px tile. -->\n <span class=\"flex h-6 w-6 items-center justify-center\">\n <component :is=\"ICONS[type]\" />\n </span>\n </span>\n\n <span class=\"relative flex min-w-0 flex-1 flex-col gap-1.5\">\n <span class=\"text-[18px] leading-[1.2]\">\n <slot name=\"title\">{{ title }}</slot>\n </span>\n <span\n v-if=\"subtitle || $slots.subtitle\"\n class=\"text-[13px] font-light leading-[1.2] text-text-primary/70\"\n >\n <slot name=\"subtitle\">{{ subtitle }}</slot>\n </span>\n </span>\n\n <span\n v-if=\"canSelect || $slots.right\"\n class=\"relative flex shrink-0 items-center\"\n >\n <slot\n name=\"right\"\n :selected=\"model\"\n >\n <!-- Both marks share one grid cell so the check and the empty box cross-fade in place; the\n check springs in on the same overshoot curve BwCampaignChip uses for its press. -->\n <span\n aria-hidden=\"true\"\n class=\"grid h-6 w-6 place-items-center\"\n >\n <Transition\n enter-active-class=\"transition duration-200 ease-[cubic-bezier(0.34,1.56,0.64,1)] motion-reduce:transition-none\"\n enter-from-class=\"opacity-0 scale-50\"\n leave-active-class=\"transition duration-100 ease-in motion-reduce:transition-none\"\n leave-to-class=\"opacity-0 scale-75\"\n >\n <CheckIcon\n v-if=\"model\"\n class=\"text-action-primary [grid-area:1/1]\"\n width=\"24\"\n height=\"24\"\n />\n <span\n v-else\n class=\"h-5.5 w-5.5 rounded-[5px] border-[1.5px] border-text-primary [grid-area:1/1]\"\n />\n </Transition>\n </span>\n </slot>\n </span>\n </component>\n</template>\n","import { PieChart } from 'echarts/charts'\nimport { type ComposeOption, type ECharts, init, use } from 'echarts/core'\nimport type { PieSeriesOption } from 'echarts/charts'\nimport { SVGRenderer } from 'echarts/renderers'\nimport { markRaw, onBeforeUnmount, onMounted, type Ref, shallowRef, watch } from 'vue'\n\n// Tree-shaken registration: only the chart types and renderer actually used ship to the consumer,\n// rather than the whole of `import * as echarts`. Register more here as new chart types are added.\n// SVG rather than canvas: these charts are small, and SVG stays crisp at any zoom.\nuse([PieChart, SVGRenderer])\n\nexport type ChartOption = ComposeOption<PieSeriesOption>\n\n/**\n * Mounts an ECharts instance on `el` and keeps it in sync with `option`.\n * The chart is resized in place through a ResizeObserver on its own element, so it also reacts to\n * layout changes, not just window resizes, without being disposed and re-initialised.\n */\nexport function useChart(el: Ref<HTMLElement | null>, option: Ref<ChartOption>) {\n // markRaw + shallowRef: ECharts instances are large, mutable objects Vue must not make deeply reactive.\n const chart = shallowRef<ECharts>()\n let observer: ResizeObserver | undefined\n\n onMounted(() => {\n if (!el.value) return\n chart.value = markRaw(init(el.value, undefined, { renderer: 'svg' }))\n chart.value.setOption(option.value)\n observer = new ResizeObserver(() => chart.value?.resize())\n observer.observe(el.value)\n })\n\n watch(option, (next) => chart.value?.setOption(next), { deep: true })\n\n onBeforeUnmount(() => {\n observer?.disconnect()\n chart.value?.dispose()\n })\n\n return { chart }\n}\n","<script lang=\"ts\" setup>\nimport { computed, ref } from 'vue'\nimport { type ChartOption, useChart } from '../../composables/useChart'\n\ninterface Props {\n /** 0–100. */\n percent: number\n label: string\n /** Accessible description of the ring, e.g. \"12 of 52 (23%)\". */\n summary: string\n}\nconst props = defineProps<Props>()\n\n// 44px ring with a 5px band, measured off the design: inner radius 17/22 of the outer.\nconst SIZE = 44\nconst INNER_RADIUS = '77%'\n\nconst el = ref<HTMLElement | null>(null)\n\nconst option = computed<ChartOption>(() => ({\n series: [\n {\n type: 'pie',\n radius: [INNER_RADIUS, '100%'],\n // Progress starts at 12 o'clock and runs clockwise.\n startAngle: 90,\n clockwise: true,\n // A display ring, not an explorable chart: no hover emphasis, tooltip or labels.\n silent: true,\n label: { show: false },\n labelLine: { show: false },\n // Sweeps in on first render and eases between values.\n animationDuration: 800,\n animationDurationUpdate: 800,\n animationEasing: 'cubicOut',\n animationEasingUpdate: 'cubicOut',\n data: [\n { value: props.percent, itemStyle: { color: '#1D9E75' } },\n { value: 100 - props.percent, itemStyle: { color: '#D9D9D9' } },\n ],\n },\n ],\n}))\n\nuseChart(el, option)\n</script>\n\n<template>\n <!-- #FFFFFF from the spec is the ring's centre, which is simply the card showing through the hole. -->\n <div\n class=\"relative shrink-0\"\n :style=\"{ width: `${SIZE}px`, height: `${SIZE}px` }\"\n role=\"img\"\n :aria-label=\"summary\"\n >\n <div\n ref=\"el\"\n class=\"h-full w-full\"\n aria-hidden=\"true\"\n />\n <span class=\"pointer-events-none absolute inset-0 flex items-center justify-center text-[11px] leading-none\">{{ label }}</span>\n </div>\n</template>\n","<script lang=\"ts\" setup>\nimport { computed, ref } from 'vue'\nimport { type ChartOption, useChart } from '../../composables/useChart'\n\ninterface Props {\n /** 0–100. */\n percent: number\n label: string\n /** Accessible description of the ring, e.g. \"12 of 52 (23%)\". */\n summary: string\n}\nconst props = defineProps<Props>()\n\n// 44px ring with a 5px band, measured off the design: inner radius 17/22 of the outer.\nconst SIZE = 44\nconst INNER_RADIUS = '77%'\n\nconst el = ref<HTMLElement | null>(null)\n\nconst option = computed<ChartOption>(() => ({\n series: [\n {\n type: 'pie',\n radius: [INNER_RADIUS, '100%'],\n // Progress starts at 12 o'clock and runs clockwise.\n startAngle: 90,\n clockwise: true,\n // A display ring, not an explorable chart: no hover emphasis, tooltip or labels.\n silent: true,\n label: { show: false },\n labelLine: { show: false },\n // Sweeps in on first render and eases between values.\n animationDuration: 800,\n animationDurationUpdate: 800,\n animationEasing: 'cubicOut',\n animationEasingUpdate: 'cubicOut',\n data: [\n { value: props.percent, itemStyle: { color: '#1D9E75' } },\n { value: 100 - props.percent, itemStyle: { color: '#D9D9D9' } },\n ],\n },\n ],\n}))\n\nuseChart(el, option)\n</script>\n\n<template>\n <!-- #FFFFFF from the spec is the ring's centre, which is simply the card showing through the hole. -->\n <div\n class=\"relative shrink-0\"\n :style=\"{ width: `${SIZE}px`, height: `${SIZE}px` }\"\n role=\"img\"\n :aria-label=\"summary\"\n >\n <div\n ref=\"el\"\n class=\"h-full w-full\"\n aria-hidden=\"true\"\n />\n <span class=\"pointer-events-none absolute inset-0 flex items-center justify-center text-[11px] leading-none\">{{ label }}</span>\n </div>\n</template>\n","<script lang=\"ts\" setup>\nimport { type Component, computed } from 'vue'\nimport TicketStatsRing from './TicketStatsRing.vue'\n\nexport interface TicketStatsChartData {\n /** Amount reached, e.g. tickets sold or dollars received. */\n value: number\n /** Amount the ring represents when full, e.g. tickets available or dollars expected. */\n total: number\n /** Overrides the centre text, which defaults to the rounded percentage (\"23%\"). */\n label?: string\n}\n\ninterface Props {\n /** A glyph component, typically from @betterworldcollective/icons. */\n icon?: Component\n title?: string\n /** Optional ring chart; omit it for a plain number card. */\n chartData?: TicketStatsChartData\n description?: string | number\n subText?: string\n}\nconst props = defineProps<Props>()\n\nconst percent = computed(() => {\n const data = props.chartData\n if (!data || data.total <= 0) return 0\n return Math.min(100, Math.max(0, (data.value / data.total) * 100))\n})\nconst chartLabel = computed(() => props.chartData?.label ?? `${Math.round(percent.value)}%`)\n</script>\n\n<template>\n <!-- The gradient border (transparent at the top, #E5E8EB at the bottom) is painted as a border-box\n background behind a white padding-box one: `border-image` would have been the literal translation,\n but it ignores border-radius and would square off the 12px corners. -->\n <div\n class=\"flex flex-col gap-3 rounded-lg border border-solid border-transparent px-3.5 py-3 text-text-primary shadow-[0px_5px_20px_0px_#3A4E6112] [background:linear-gradient(#FFFFFF,#FFFFFF)_padding-box,linear-gradient(180deg,rgba(229,232,235,0)_0%,#E5E8EB_100%)_border-box]\"\n >\n <div class=\"flex items-center gap-2\">\n <!-- e.g. a drag handle -->\n <slot name=\"pre-header\" />\n <span\n v-if=\"icon\"\n class=\"flex shrink-0 items-center\"\n aria-hidden=\"true\"\n >\n <component :is=\"icon\" />\n </span>\n <span class=\"text-[14px] leading-normal\">{{ title }}</span>\n </div>\n\n <!-- The spec gives 0.5px #3A4E61, but the design renders it at ~15% (#E1E5E7 sampled); a solid\n denim hairline would read as a dark rule, so the opacity is applied here. -->\n <hr class=\"m-0 border-0 border-t-[0.5px] border-solid border-t-[rgba(58,78,97,0.15)]\">\n\n <div class=\"flex items-center gap-3\">\n <!-- Drawn with ECharts (see useChart). -->\n <TicketStatsRing\n v-if=\"chartData\"\n :percent=\"percent\"\n :label=\"chartLabel\"\n :summary=\"`${chartData.value} of ${chartData.total} (${chartLabel})`\"\n />\n\n <div class=\"flex min-w-0 flex-col\">\n <slot name=\"body\">\n <span class=\"text-[32px] leading-none\">\n <slot name=\"description\">{{ description }}</slot>\n </span>\n <!-- Uppercase is taken from the design (\"SOLD, 40 LEFT\"), which is what the 0.9px tracking suits. -->\n <span\n v-if=\"subText\"\n class=\"mt-1 text-[10px] uppercase leading-normal tracking-[0.9px]\"\n >{{ subText }}</span>\n </slot>\n </div>\n </div>\n </div>\n</template>\n","<script lang=\"ts\" setup>\nimport { type Component, computed } from 'vue'\nimport TicketStatsRing from './TicketStatsRing.vue'\n\nexport interface TicketStatsChartData {\n /** Amount reached, e.g. tickets sold or dollars received. */\n value: number\n /** Amount the ring represents when full, e.g. tickets available or dollars expected. */\n total: number\n /** Overrides the centre text, which defaults to the rounded percentage (\"23%\"). */\n label?: string\n}\n\ninterface Props {\n /** A glyph component, typically from @betterworldcollective/icons. */\n icon?: Component\n title?: string\n /** Optional ring chart; omit it for a plain number card. */\n chartData?: TicketStatsChartData\n description?: string | number\n subText?: string\n}\nconst props = defineProps<Props>()\n\nconst percent = computed(() => {\n const data = props.chartData\n if (!data || data.total <= 0) return 0\n return Math.min(100, Math.max(0, (data.value / data.total) * 100))\n})\nconst chartLabel = computed(() => props.chartData?.label ?? `${Math.round(percent.value)}%`)\n</script>\n\n<template>\n <!-- The gradient border (transparent at the top, #E5E8EB at the bottom) is painted as a border-box\n background behind a white padding-box one: `border-image` would have been the literal translation,\n but it ignores border-radius and would square off the 12px corners. -->\n <div\n class=\"flex flex-col gap-3 rounded-lg border border-solid border-transparent px-3.5 py-3 text-text-primary shadow-[0px_5px_20px_0px_#3A4E6112] [background:linear-gradient(#FFFFFF,#FFFFFF)_padding-box,linear-gradient(180deg,rgba(229,232,235,0)_0%,#E5E8EB_100%)_border-box]\"\n >\n <div class=\"flex items-center gap-2\">\n <!-- e.g. a drag handle -->\n <slot name=\"pre-header\" />\n <span\n v-if=\"icon\"\n class=\"flex shrink-0 items-center\"\n aria-hidden=\"true\"\n >\n <component :is=\"icon\" />\n </span>\n <span class=\"text-[14px] leading-normal\">{{ title }}</span>\n </div>\n\n <!-- The spec gives 0.5px #3A4E61, but the design renders it at ~15% (#E1E5E7 sampled); a solid\n denim hairline would read as a dark rule, so the opacity is applied here. -->\n <hr class=\"m-0 border-0 border-t-[0.5px] border-solid border-t-[rgba(58,78,97,0.15)]\">\n\n <div class=\"flex items-center gap-3\">\n <!-- Drawn with ECharts (see useChart). -->\n <TicketStatsRing\n v-if=\"chartData\"\n :percent=\"percent\"\n :label=\"chartLabel\"\n :summary=\"`${chartData.value} of ${chartData.total} (${chartLabel})`\"\n />\n\n <div class=\"flex min-w-0 flex-col\">\n <slot name=\"body\">\n <span class=\"text-[32px] leading-none\">\n <slot name=\"description\">{{ description }}</slot>\n </span>\n <!-- Uppercase is taken from the design (\"SOLD, 40 LEFT\"), which is what the 0.9px tracking suits. -->\n <span\n v-if=\"subText\"\n class=\"mt-1 text-[10px] uppercase leading-normal tracking-[0.9px]\"\n >{{ subText }}</span>\n </slot>\n </div>\n </div>\n </div>\n</template>\n","/**\n * Campaign types offered during onboarding. A const object rather than a TS `enum`, so it works both\n * as a value (`CampaignType.PaddleRaise`) and as a string-literal union (`'paddleraise'`).\n */\nexport const CampaignType = {\n Auction: 'auction',\n LiveAuction: 'live-auction',\n Donation: 'donation',\n Impact: 'impact',\n Crowdfunding: 'crowdfunding',\n PaddleRaise: 'paddleraise',\n PeerToPeer: 'peer-to-peer',\n TicketedEvent: 'ticketed-event',\n Giveaway: 'giveaway',\n Athons: 'a-thons',\n} as const\n\nexport type CampaignType = (typeof CampaignType)[keyof typeof CampaignType]\n","<script lang=\"ts\" setup>\ndefineProps<{\n title: string;\n items: {\n label: string;\n value: string;\n }[]\n}>()\n</script>\n\n<template>\n <div class=\"py-3 px-4 shadow-high rounded-sm\">\n <h6 class=\"text-text-primary font-medium\">\n {{ title }}\n </h6>\n\n <div class=\"mt-4\">\n <div\n v-for=\"(item, index) in items\"\n :key=\"index\"\n class=\"flex items-center gap-1\"\n >\n <span>{{ item.label }}:</span>\n <span class=\"font-medium\">{{ item.value }}</span>\n </div>\n </div>\n </div>\n</template>\n","<script lang=\"ts\" setup>\ndefineProps<{\n title: string;\n items: {\n label: string;\n value: string;\n }[]\n}>()\n</script>\n\n<template>\n <div class=\"py-3 px-4 shadow-high rounded-sm\">\n <h6 class=\"text-text-primary font-medium\">\n {{ title }}\n </h6>\n\n <div class=\"mt-4\">\n <div\n v-for=\"(item, index) in items\"\n :key=\"index\"\n class=\"flex items-center gap-1\"\n >\n <span>{{ item.label }}:</span>\n <span class=\"font-medium\">{{ item.value }}</span>\n </div>\n </div>\n </div>\n</template>\n","<script lang=\"ts\" setup>\ndefineProps<{\n logoUrl: string;\n organizationName: string;\n organizationUrl: string;\n}>()\n</script>\n\n<template>\n <div class=\"flex gap-2.5 items-center text-left\">\n <div v-if=\"logoUrl\" class=\"rounded-xs bg-surface-brand w-12 h-12\">\n <img\n :src=\"logoUrl\"\n alt=\"Logo\"\n width=\"48\"\n height=\"48\"\n class=\"rounded-[inherit] w-[inherit] h-[inherit]\"\n />\n </div>\n <div>\n <div class=\"text-sm m-0 text-pineStone\">\n Organized by\n </div>\n <a\n :href=\"organizationUrl\"\n class=\"no-underline flex items-center gap-1 hover:gap-2 hover:underline transition-all\"\n >\n <span class=\"text-base leading-6 lg:text-[20px] font-normal mt-1 text-text-primary\">\n {{ organizationName }}\n </span>\n <svg\n width=\"9\"\n height=\"7\"\n viewBox=\"0 0 9 7\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"mt-1\"\n >\n <path d=\"M5.66675 1L7.99995 3.33321L5.66675 5.66641\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M7.22192 3.33325L1.00004 3.33325\" stroke=\"currentColor\" stroke-linecap=\"round\"/>\n </svg>\n </a>\n </div>\n </div>\n</template>\n","<script lang=\"ts\" setup>\ndefineProps<{\n logoUrl: string;\n organizationName: string;\n organizationUrl: string;\n}>()\n</script>\n\n<template>\n <div class=\"flex gap-2.5 items-center text-left\">\n <div v-if=\"logoUrl\" class=\"rounded-xs bg-surface-brand w-12 h-12\">\n <img\n :src=\"logoUrl\"\n alt=\"Logo\"\n width=\"48\"\n height=\"48\"\n class=\"rounded-[inherit] w-[inherit] h-[inherit]\"\n />\n </div>\n <div>\n <div class=\"text-sm m-0 text-pineStone\">\n Organized by\n </div>\n <a\n :href=\"organizationUrl\"\n class=\"no-underline flex items-center gap-1 hover:gap-2 hover:underline transition-all\"\n >\n <span class=\"text-base leading-6 lg:text-[20px] font-normal mt-1 text-text-primary\">\n {{ organizationName }}\n </span>\n <svg\n width=\"9\"\n height=\"7\"\n viewBox=\"0 0 9 7\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"mt-1\"\n >\n <path d=\"M5.66675 1L7.99995 3.33321L5.66675 5.66641\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M7.22192 3.33325L1.00004 3.33325\" stroke=\"currentColor\" stroke-linecap=\"round\"/>\n </svg>\n </a>\n </div>\n </div>\n</template>\n","import './tailwind.css'\nimport type { Plugin } from 'vue'\n\nexport { BwHeader } from './components/header'\nexport { BwLayout } from './components/layout'\nexport { BwSidebar, BwSidebarGroup, BwSidebarItem, BwSidebarSubItem } from './components/sidebar'\nexport type { IconName } from './components/sidebar'\nexport { BwOnboardingCampaignCardCreation } from './components/onboarding/campaign-card'\nexport { BwTicketStatsCard } from './components/ticket'\nexport type { TicketStatsChartData } from './components/ticket'\nexport { CampaignType } from './types/Campaign'\nexport { default as CampaignCard } from '../src/components/card/CampaignCard.vue'\nexport { default as OrganizationLogo } from '../src/components/organization/OrganizationLogo.vue'\n\nconst plugin: Plugin = {\n install() {\n },\n}\n\nexport default plugin\n"],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import './tailwind.css';
2
+ import type { Plugin } from 'vue';
3
+ export { BwHeader } from './components/header';
4
+ export { BwLayout } from './components/layout';
5
+ export { BwSidebar, BwSidebarGroup, BwSidebarItem, BwSidebarSubItem } from './components/sidebar';
6
+ export type { IconName } from './components/sidebar';
7
+ export { BwOnboardingCampaignCardCreation } from './components/onboarding/campaign-card';
8
+ export { BwTicketStatsCard } from './components/ticket';
9
+ export type { TicketStatsChartData } from './components/ticket';
10
+ export { CampaignType } from './types/Campaign';
11
+ export { default as CampaignCard } from '../src/components/card/CampaignCard.vue';
12
+ export { default as OrganizationLogo } from '../src/components/organization/OrganizationLogo.vue';
13
+ declare const plugin: Plugin;
14
+ export default plugin;