@readme/markdown 15.9.1 → 15.9.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.
@@ -1,16 +1,20 @@
1
+ import type { Variables } from '../../../types';
1
2
  import type { Root } from 'hast';
2
3
  import type { Plugin } from 'unified';
4
+ interface Options {
5
+ variables?: Variables;
6
+ }
3
7
  /**
4
8
  * Resolve attribute expressions that `mdxJsxElementHandler` deferred.
5
9
  *
6
10
  * The handler stashed each attribute expression's source in `node.data.deferredExpressions`
7
11
  * (keyed by prop name) instead of evaluating eagerly, because an eager result can be a React
8
12
  * element or function that rehypeRaw's `structuredClone` passthrough rejects. Now that we're
9
- * past the clone, evaluate each source with a scope of `{ React, ...mdxishScope }` and write
13
+ * past the clone, evaluate each source with a scope of `{ user, React, ...mdxishScope }` and write
10
14
  * the real value into `properties` (e.g. an array of objects whose fields are React elements).
11
15
  *
12
16
  * Must run after `rehypeRaw` (past the clone) but before `normalizeMdxJsxNodes` rewrites these
13
17
  * `mdx-jsx` nodes into plain elements. Skipped in safeMode, which keeps expressions literal.
14
18
  */
15
- declare const resolveDeferredAttributeExpressionProps: Plugin<[], Root>;
19
+ declare const resolveDeferredAttributeExpressionProps: Plugin<[Options?], Root>;
16
20
  export default resolveDeferredAttributeExpressionProps;
@@ -1,4 +1,4 @@
1
- .Accordion{background:rgba(var(--color-bg-page-rgb, white), 1);border:1px solid var(--color-border-default, rgba(0, 0, 0, 0.1));border-radius:5px}.Accordion-title{align-items:center;background:rgba(var(--color-bg-page-rgb, white), 1);border:0;border-radius:5px;color:var(--color-text-default, #384248);cursor:pointer;display:flex;font-size:16px;font-weight:500;padding:10px;position:relative;text-align:left;width:100%}.Accordion-title:hover{background:var(--color-bg-hover, rgba(0, 0, 0, 0.05))}.Accordion[open] .Accordion-title{border-bottom-left-radius:0;border-bottom-right-radius:0}.Accordion-title::marker{content:""}.Accordion-title::-webkit-details-marker{display:none}.Accordion-toggleIcon,.Accordion-toggleIcon_opened{color:var(--color-text-minimum, #637288);font-size:14px;margin-left:5px;margin-right:10px;transition:transform .1s}.Accordion-toggleIcon_opened,.Accordion-toggleIcon_opened_opened{transform:rotate(90deg)}.Accordion-icon{color:var(--project-color-primary, inherit);margin-right:10px}.Accordion-content{color:var(--color-text-muted, #4f5a66);padding:5px 15px 0 15px}.Accordion-content>*{margin-bottom:var(--markdown-spacing, 15px)}
1
+ .Accordion{background:rgba(var(--color-bg-page-rgb, white), 1);border:1px solid var(--color-border-default, rgba(0, 0, 0, 0.1));border-radius:5px}.Accordion-title{align-items:center;background:rgba(var(--color-bg-page-rgb, white), 1);border:0;border-radius:5px;color:var(--color-text-default, #384248);cursor:pointer;font-size:16px;font-weight:500;padding:10px;position:relative;text-align:left;width:100%}.Accordion>.Accordion-title{display:flex}.Accordion-title:hover{background:var(--color-bg-hover, rgba(0, 0, 0, 0.05))}.Accordion[open] .Accordion-title{border-bottom-left-radius:0;border-bottom-right-radius:0}.Accordion-title::marker{content:""}.Accordion-title::-webkit-details-marker{display:none}.Accordion-toggleIcon,.Accordion-toggleIcon_opened{color:var(--color-text-minimum, #637288);font-size:14px;margin-left:5px;margin-right:10px;transition:transform .1s}.Accordion-toggleIcon_opened,.Accordion-toggleIcon_opened_opened{transform:rotate(90deg)}.Accordion-icon{color:var(--project-color-primary, inherit);margin-right:10px}.Accordion-content{color:var(--color-text-muted, #4f5a66);padding:5px 15px 0 15px}.Accordion-content>*{margin-bottom:var(--markdown-spacing, 15px)}
2
2
  .CardsGrid{--CardsGrid-gap: 1.5em;--CardsGrid-columns: auto-fit;--CardsGrid-cardWidth: auto;display:grid;gap:var(--CardsGrid-gap);grid-template-columns:repeat(var(--CardsGrid-columns), minmax(var(--CardsGrid-cardWidth), 1fr))}.Card{--Card-badge-bg-color: var(--yellow);--Card-badge-color: var(--yellow10);--Card-content-color: var(--color-text-minimum);--Card-gap: 0.25em;--Card-href-arrow-opacity: 0;--Card-href-arrow-transform: translateX(-5px);--Card-icon-color: var(--color-text-default);--Card-icon-opacity: 0.65;--Card-icon-opacity-hover: 0.75;--Card-line-height: 1.4;--Card-shadow: none;--Card-title-color: var(--color-text-default);background:var(--Card-bg-color);border:1px solid var(--Card-border-color);border-radius:var(--border-radius-lg);box-shadow:var(--Card-shadow);display:flex;flex-direction:var(--Card-layout);gap:var(--Card-gap);line-height:var(--Card-line-height);padding:var(--Card-padding);text-decoration:none}.Card_card{--Card-bg-color: rgba(var(--color-bg-page-inverse-rgb), 0);--Card-bg-color-hover: rgba(var(--color-bg-page-inverse-rgb), 0);--Card-border-color: var(--color-border-default);--Card-layout: column;--Card-padding: 1.5em}.rm-ReadMe[data-color-mode=dark] .Card_card{--Card-bg-color: rgba(var(--color-bg-page-inverse-rgb), 0.05);--Card-bg-color-hover: rgba(var(--color-bg-page-inverse-rgb), 0.1)}@media(prefers-color-scheme: dark){.rm-ReadMe[data-color-mode=system] .Card_card{--Card-bg-color: rgba(var(--color-bg-page-inverse-rgb), 0.05);--Card-bg-color-hover: rgba(var(--color-bg-page-inverse-rgb), 0.1)}}.Card_tile{--Card-gap: 1em;--Card-icon-opacity: 0.5;--Card-layout: row}.Card_tile .Card-content{--Card-gap: 0}.Card[href]:not([href=""]){color:inherit;text-decoration:none}.Card[href]:not([href=""]):hover,.Card[href]:not([href=""]):active,.Card[href]:not([href=""]):focus{--Card-icon-opacity: var(--Card-icon-opacity-hover);--Card-href-arrow-opacity: 0.75;--Card-href-arrow-transform: none;background:var(--Card-bg-color-hover)}.Card-icon{color:var(--Card-icon-color);font-size:1.4em;margin-bottom:.5em;opacity:var(--Card-icon-opacity);transition:opacity var(--transition-timing) var(--transition-fast)}.Card-title{align-items:flex-start;color:var(--Card-title-color);display:flex;gap:.5em;font-weight:var(--font-weight-bold)}.Card-badge{align-items:center;background:var(--Card-badge-bg-color);border-radius:1em;color:var(--Card-badge-color);font-size:.6em;padding:0 .5em;display:inline-flex;position:relative;top:.5em}.Card-arrow{font-size:.8em;opacity:var(--Card-href-arrow-opacity);position:relative;top:.375em;transition:opacity var(--transition-timing) var(--transition-fast),transform var(--transition-timing) var(--transition-fast);transform:var(--Card-href-arrow-transform)}.Card-content{color:var(--Card-content-color);display:flex;flex-direction:column;font-size:1em;gap:var(--Card-gap)}.Card-content p:last-child{margin-bottom:0}
3
3
  .Columns{display:grid;gap:var(--md, 20px)}@media(max-width: 414px){.Columns{grid-template-columns:1fr !important}}
4
4
  .TabGroup-nav{border-bottom:solid var(--color-border-default, rgba(0, 0, 0, 0.1));margin-bottom:15px}.TabGroup-tab{background:none;border:0;color:var(--color-text-minimum, #637288);cursor:pointer;font-size:15px;font-weight:600;margin-right:15px;padding:0;padding-bottom:10px}.TabGroup-tab_active{background:none;border:0;border-bottom:solid var(--color-tab-active, currentcolor);color:var(--color-tab-active, currentcolor);font-size:15px;font-weight:600;margin-right:15px;margin-bottom:-2px;padding:0;padding-bottom:10px}.TabGroup-tab:hover{color:var(--color-text-muted, #4f5a66)}.TabGroup-icon{color:var(--project-color-primary, inherit);margin-right:10px}.TabGroup .TabContent{color:var(--color-text-muted, #4f5a66)}:where(.TabGroup .TabContent>*:not(:last-child)){margin-bottom:var(--markdown-spacing, 15px)}
@@ -1 +1 @@
1
- {"version":3,"file":"render-fixture.css","mappings":"AAAA,WACE,oDACA,iEACA,kBAEA,iBACE,mBACA,oDACA,SACA,kBACA,yCACA,eACA,aACA,eACA,gBACA,aACA,kBACA,gBACA,WAEA,uBACE,sDAGF,kCACE,4BACA,6BAGF,yBACE,WAGF,yCACE,aAIJ,mDAEE,yCACA,eACA,gBACA,kBACA,yBAEA,iEACE,wBAIJ,gBACE,4CACA,kBAGF,mBACE,uCACA,wBAEA,qBACE,4C;ACzDN,WACE,uBACA,8BACA,4BAEA,aACA,yBACA,gGAGF,MAGE,qCACA,oCACA,gDACA,mBACA,6BACA,8CACA,6CACA,0BACA,gCACA,wBACA,oBACA,8CAEA,gCACA,0CACA,sCACA,8BACA,aACA,kCACA,oBACA,oCACA,4BACA,qBAEA,WACE,2DACA,iEACA,iDACA,sBACA,sBCTA,4CDYE,8DACA,mECRA,mCADF,8CDQE,8DACA,oEAIJ,WACE,gBACA,yBACA,mBAEA,yBACE,cAKJ,2BACE,cACA,qBAEA,oGAGE,oDACA,gCACA,kCAEA,sCAIJ,WACE,6BACA,gBACA,mBACA,iCACA,mEAGF,YACE,uBACA,8BACA,aACA,SACA,oCAGF,YACE,mBACA,sCACA,kBACA,8BACA,eACA,eACA,oBACA,kBACA,SAGF,YACE,eACA,uCACA,kBACA,WACA,4HACE,CAEF,2CAGF,cACE,gCACA,aACA,sBACA,cACA,oBAEA,2BACE,gB;AE7HN,SACE,aACA,oBAEA,yBAJF,SAKI,sC;ACNF,cACE,oEACA,mBAGF,cACE,gBACA,SACA,yCACA,eACA,eACA,gBACA,kBACA,UACA,oBAEA,qBACE,gBACA,SACA,0DACA,4CACA,eACA,gBACA,kBACA,mBACA,UACA,oBAGF,oBACE,uCAIJ,eACE,4CACA,kBAGF,sBACE,uCAIJ,iDACE,4C","sources":["webpack://@readme/markdown/./components/Accordion/style.scss","webpack://@readme/markdown/./components/Cards/style.scss","webpack://@readme/markdown/./styles/mixins/when-color-mode-dark.scss","webpack://@readme/markdown/./components/Columns/style.scss","webpack://@readme/markdown/./components/Tabs/style.scss"],"sourcesContent":[".Accordion {\n background: rgba(var(--color-bg-page-rgb, white), 1);\n border: 1px solid var(--color-border-default, rgba(black, 0.1));\n border-radius: 5px;\n\n &-title {\n align-items: center;\n background: rgba(var(--color-bg-page-rgb, white), 1);\n border: 0;\n border-radius: 5px;\n color: var(--color-text-default, #384248);\n cursor: pointer;\n display: flex;\n font-size: 16px;\n font-weight: 500;\n padding: 10px;\n position: relative;\n text-align: left;\n width: 100%;\n\n &:hover {\n background: var(--color-bg-hover, rgba(black, 0.05));\n }\n\n .Accordion[open] & {\n border-bottom-left-radius: 0;\n border-bottom-right-radius: 0;\n }\n\n &::marker {\n content: \"\";\n }\n\n &::-webkit-details-marker {\n display: none;\n } \n }\n\n &-toggleIcon,\n &-toggleIcon_opened {\n color: var(--color-text-minimum, #637288);\n font-size: 14px;\n margin-left: 5px;\n margin-right: 10px;\n transition: transform 0.1s;\n\n &_opened {\n transform: rotate(90deg);\n }\n }\n\n &-icon {\n color: var(--project-color-primary, inherit);\n margin-right: 10px;\n }\n\n &-content {\n color: var(--color-text-muted, #4f5a66);\n padding: 5px 15px 0 15px;\n\n > * {\n margin-bottom: var(--markdown-spacing, 15px);\n }\n }\n}\n","@import '../../styles/mixins/when-color-mode-dark.scss';\n\n$iphone-plus: 414px;\n\n.CardsGrid {\n --CardsGrid-gap: 1.5em;\n --CardsGrid-columns: auto-fit;\n --CardsGrid-cardWidth: auto;\n\n display: grid;\n gap: var(--CardsGrid-gap);\n grid-template-columns: repeat(var(--CardsGrid-columns), minmax(var(--CardsGrid-cardWidth), 1fr));\n}\n\n.Card {\n $card: &;\n\n --Card-badge-bg-color: var(--yellow);\n --Card-badge-color: var(--yellow10);\n --Card-content-color: var(--color-text-minimum);\n --Card-gap: 0.25em;\n --Card-href-arrow-opacity: 0;\n --Card-href-arrow-transform: translateX(-5px);\n --Card-icon-color: var(--color-text-default);\n --Card-icon-opacity: 0.65;\n --Card-icon-opacity-hover: 0.75;\n --Card-line-height: 1.4;\n --Card-shadow: none;\n --Card-title-color: var(--color-text-default);\n\n background: var(--Card-bg-color);\n border: 1px solid var(--Card-border-color);\n border-radius: var(--border-radius-lg);\n box-shadow: var(--Card-shadow);\n display: flex;\n flex-direction: var(--Card-layout);\n gap: var(--Card-gap);\n line-height: var(--Card-line-height);\n padding: var(--Card-padding);\n text-decoration: none;\n\n &_card {\n --Card-bg-color: rgba(var(--color-bg-page-inverse-rgb), 0);\n --Card-bg-color-hover: rgba(var(--color-bg-page-inverse-rgb), 0);\n --Card-border-color: var(--color-border-default);\n --Card-layout: column;\n --Card-padding: 1.5em;\n\n @include when-color-mode-dark('.rm-ReadMe') {\n --Card-bg-color: rgba(var(--color-bg-page-inverse-rgb), 0.05);\n --Card-bg-color-hover: rgba(var(--color-bg-page-inverse-rgb), 0.1);\n }\n }\n\n &_tile {\n --Card-gap: 1em;\n --Card-icon-opacity: 0.5;\n --Card-layout: row;\n\n #{$card}-content {\n --Card-gap: 0;\n }\n }\n\n // needs specificity to override the default link styles; while preserving logic for empty hrefs\n &[href]:not([href='']) {\n color: inherit;\n text-decoration: none;\n\n &:hover,\n &:active,\n &:focus {\n --Card-icon-opacity: var(--Card-icon-opacity-hover);\n --Card-href-arrow-opacity: 0.75;\n --Card-href-arrow-transform: none;\n\n background: var(--Card-bg-color-hover);\n }\n }\n\n &-icon {\n color: var(--Card-icon-color);\n font-size: 1.4em;\n margin-bottom: 0.5em;\n opacity: var(--Card-icon-opacity);\n transition: opacity var(--transition-timing) var(--transition-fast);\n }\n\n &-title {\n align-items: flex-start;\n color: var(--Card-title-color);\n display: flex;\n gap: 0.5em;\n font-weight: var(--font-weight-bold);\n }\n\n &-badge {\n align-items: center;\n background: var(--Card-badge-bg-color);\n border-radius: 1em;\n color: var(--Card-badge-color);\n font-size: 0.6em;\n padding: 0 0.5em;\n display: inline-flex;\n position: relative;\n top: 0.5em;\n }\n\n &-arrow {\n font-size: 0.8em;\n opacity: var(--Card-href-arrow-opacity);\n position: relative;\n top: 0.375em;\n transition:\n opacity var(--transition-timing) var(--transition-fast),\n transform var(--transition-timing) var(--transition-fast);\n transform: var(--Card-href-arrow-transform);\n }\n\n &-content {\n color: var(--Card-content-color);\n display: flex;\n flex-direction: column;\n font-size: 1em;\n gap: var(--Card-gap);\n\n p:last-child {\n margin-bottom: 0;\n }\n }\n}\n","/**\n * Dark styles keyed off `$root`'s own `data-color-mode`, not any ancestor.\n * Unlike `dark-mode` (which matches ANY ancestor carrying the attribute —\n * see the warning on that mixin), this only fires when `$root` itself\n * declares the dark/system mode. None of this package's components carry\n * `data-color-mode` on their own root, so callers must pass the selector\n * for whichever wrapper actually carries it in their consuming app — there\n * is no default.\n *\n * IMPORTANT: this package ships one precompiled `dist/main.css` — there is\n * no build step where a consumer can supply their own value for `$root`.\n * Whatever gets passed at each `@include` call site below is permanent for\n * every installer of this package. Call sites currently hardcode\n * `'.rm-ReadMe'`, readme's hub color-mode wrapper, because readme is this\n * package's only real consumer today. If that ever changes, this becomes\n * silently wrong (not an error — dark mode just never activates) for any\n * consumer without that exact class in their DOM, and `$root` should be\n * dropped in favor of each component resolving its own nearest\n * `[data-color-mode]` ancestor at mount via `Element.closest()` and\n * stamping it onto its own root, so the CSS can self-anchor with no\n * hardcoded selector at all.\n *\n * $global: wrap the root-anchor selector in :global(), for use when this\n * file is imported into a CSS-module context (mirrors `dark-mode`'s param).\n */\n@mixin when-color-mode-dark($root, $global: false) {\n @if $global {\n :global(#{$root}[data-color-mode='dark']) & {\n @content;\n }\n\n :global(#{$root}[data-color-mode='system']) & {\n @media (prefers-color-scheme: dark) {\n @content;\n }\n }\n } @else {\n #{$root}[data-color-mode='dark'] & {\n @content;\n }\n\n #{$root}[data-color-mode='system'] & {\n @media (prefers-color-scheme: dark) {\n @content;\n }\n }\n }\n}\n","$iphone-plus: 414px;\n\n.Columns {\n display: grid;\n gap: var(--md, 20px);\n\n @media (max-width: $iphone-plus) {\n grid-template-columns: 1fr !important;\n }\n}\n",".TabGroup {\n &-nav {\n border-bottom: solid var(--color-border-default, #{rgba(black, 0.1)});\n margin-bottom: 15px;\n }\n\n &-tab {\n background: none;\n border: 0;\n color: var(--color-text-minimum, #637288);\n cursor: pointer;\n font-size: 15px;\n font-weight: 600;\n margin-right: 15px;\n padding: 0;\n padding-bottom: 10px;\n\n &_active {\n background: none;\n border: 0;\n border-bottom: solid var(--color-tab-active, currentcolor);\n color: var(--color-tab-active, currentcolor);\n font-size: 15px;\n font-weight: 600;\n margin-right: 15px;\n margin-bottom: -2px;\n padding: 0;\n padding-bottom: 10px;\n }\n\n &:hover {\n color: var(--color-text-muted, #4f5a66);\n }\n }\n\n &-icon {\n color: var(--project-color-primary, inherit);\n margin-right: 10px;\n }\n\n .TabContent {\n color: var(--color-text-muted, #4f5a66);\n }\n}\n\n:where(.TabGroup .TabContent > *:not(:last-child)) {\n margin-bottom: var(--markdown-spacing, 15px);\n}\n"],"names":[],"sourceRoot":""}
1
+ {"version":3,"file":"render-fixture.css","mappings":"AAAA,WACE,oDACA,iEACA,kBAEA,iBACE,mBACA,oDACA,SACA,kBACA,yCACA,eACA,eACA,gBACA,aACA,kBACA,gBACA,WAEA,4BACE,aAGF,uBACE,sDAGF,kCACE,4BACA,6BAGF,yBACE,WAGF,yCACE,aAIJ,mDAEE,yCACA,eACA,gBACA,kBACA,yBAEA,iEACE,wBAIJ,gBACE,4CACA,kBAGF,mBACE,uCACA,wBAEA,qBACE,4C;AC5DN,WACE,uBACA,8BACA,4BAEA,aACA,yBACA,gGAGF,MAGE,qCACA,oCACA,gDACA,mBACA,6BACA,8CACA,6CACA,0BACA,gCACA,wBACA,oBACA,8CAEA,gCACA,0CACA,sCACA,8BACA,aACA,kCACA,oBACA,oCACA,4BACA,qBAEA,WACE,2DACA,iEACA,iDACA,sBACA,sBCTA,4CDYE,8DACA,mECRA,mCADF,8CDQE,8DACA,oEAIJ,WACE,gBACA,yBACA,mBAEA,yBACE,cAKJ,2BACE,cACA,qBAEA,oGAGE,oDACA,gCACA,kCAEA,sCAIJ,WACE,6BACA,gBACA,mBACA,iCACA,mEAGF,YACE,uBACA,8BACA,aACA,SACA,oCAGF,YACE,mBACA,sCACA,kBACA,8BACA,eACA,eACA,oBACA,kBACA,SAGF,YACE,eACA,uCACA,kBACA,WACA,4HACE,CAEF,2CAGF,cACE,gCACA,aACA,sBACA,cACA,oBAEA,2BACE,gB;AE7HN,SACE,aACA,oBAEA,yBAJF,SAKI,sC;ACNF,cACE,oEACA,mBAGF,cACE,gBACA,SACA,yCACA,eACA,eACA,gBACA,kBACA,UACA,oBAEA,qBACE,gBACA,SACA,0DACA,4CACA,eACA,gBACA,kBACA,mBACA,UACA,oBAGF,oBACE,uCAIJ,eACE,4CACA,kBAGF,sBACE,uCAIJ,iDACE,4C","sources":["webpack://@readme/markdown/./components/Accordion/style.scss","webpack://@readme/markdown/./components/Cards/style.scss","webpack://@readme/markdown/./styles/mixins/when-color-mode-dark.scss","webpack://@readme/markdown/./components/Columns/style.scss","webpack://@readme/markdown/./components/Tabs/style.scss"],"sourcesContent":[".Accordion {\n background: rgba(var(--color-bg-page-rgb, white), 1);\n border: 1px solid var(--color-border-default, rgba(black, 0.1));\n border-radius: 5px;\n\n &-title {\n align-items: center;\n background: rgba(var(--color-bg-page-rgb, white), 1);\n border: 0;\n border-radius: 5px;\n color: var(--color-text-default, #384248);\n cursor: pointer;\n font-size: 16px;\n font-weight: 500;\n padding: 10px;\n position: relative;\n text-align: left;\n width: 100%;\n \n .Accordion > & {\n display: flex;\n }\n\n &:hover {\n background: var(--color-bg-hover, rgba(black, 0.05));\n }\n\n .Accordion[open] & {\n border-bottom-left-radius: 0;\n border-bottom-right-radius: 0;\n }\n\n &::marker {\n content: \"\";\n }\n\n &::-webkit-details-marker {\n display: none;\n } \n }\n\n &-toggleIcon,\n &-toggleIcon_opened {\n color: var(--color-text-minimum, #637288);\n font-size: 14px;\n margin-left: 5px;\n margin-right: 10px;\n transition: transform 0.1s;\n\n &_opened {\n transform: rotate(90deg);\n }\n }\n\n &-icon {\n color: var(--project-color-primary, inherit);\n margin-right: 10px;\n }\n\n &-content {\n color: var(--color-text-muted, #4f5a66);\n padding: 5px 15px 0 15px;\n\n > * {\n margin-bottom: var(--markdown-spacing, 15px);\n }\n }\n}\n","@import '../../styles/mixins/when-color-mode-dark.scss';\n\n$iphone-plus: 414px;\n\n.CardsGrid {\n --CardsGrid-gap: 1.5em;\n --CardsGrid-columns: auto-fit;\n --CardsGrid-cardWidth: auto;\n\n display: grid;\n gap: var(--CardsGrid-gap);\n grid-template-columns: repeat(var(--CardsGrid-columns), minmax(var(--CardsGrid-cardWidth), 1fr));\n}\n\n.Card {\n $card: &;\n\n --Card-badge-bg-color: var(--yellow);\n --Card-badge-color: var(--yellow10);\n --Card-content-color: var(--color-text-minimum);\n --Card-gap: 0.25em;\n --Card-href-arrow-opacity: 0;\n --Card-href-arrow-transform: translateX(-5px);\n --Card-icon-color: var(--color-text-default);\n --Card-icon-opacity: 0.65;\n --Card-icon-opacity-hover: 0.75;\n --Card-line-height: 1.4;\n --Card-shadow: none;\n --Card-title-color: var(--color-text-default);\n\n background: var(--Card-bg-color);\n border: 1px solid var(--Card-border-color);\n border-radius: var(--border-radius-lg);\n box-shadow: var(--Card-shadow);\n display: flex;\n flex-direction: var(--Card-layout);\n gap: var(--Card-gap);\n line-height: var(--Card-line-height);\n padding: var(--Card-padding);\n text-decoration: none;\n\n &_card {\n --Card-bg-color: rgba(var(--color-bg-page-inverse-rgb), 0);\n --Card-bg-color-hover: rgba(var(--color-bg-page-inverse-rgb), 0);\n --Card-border-color: var(--color-border-default);\n --Card-layout: column;\n --Card-padding: 1.5em;\n\n @include when-color-mode-dark('.rm-ReadMe') {\n --Card-bg-color: rgba(var(--color-bg-page-inverse-rgb), 0.05);\n --Card-bg-color-hover: rgba(var(--color-bg-page-inverse-rgb), 0.1);\n }\n }\n\n &_tile {\n --Card-gap: 1em;\n --Card-icon-opacity: 0.5;\n --Card-layout: row;\n\n #{$card}-content {\n --Card-gap: 0;\n }\n }\n\n // needs specificity to override the default link styles; while preserving logic for empty hrefs\n &[href]:not([href='']) {\n color: inherit;\n text-decoration: none;\n\n &:hover,\n &:active,\n &:focus {\n --Card-icon-opacity: var(--Card-icon-opacity-hover);\n --Card-href-arrow-opacity: 0.75;\n --Card-href-arrow-transform: none;\n\n background: var(--Card-bg-color-hover);\n }\n }\n\n &-icon {\n color: var(--Card-icon-color);\n font-size: 1.4em;\n margin-bottom: 0.5em;\n opacity: var(--Card-icon-opacity);\n transition: opacity var(--transition-timing) var(--transition-fast);\n }\n\n &-title {\n align-items: flex-start;\n color: var(--Card-title-color);\n display: flex;\n gap: 0.5em;\n font-weight: var(--font-weight-bold);\n }\n\n &-badge {\n align-items: center;\n background: var(--Card-badge-bg-color);\n border-radius: 1em;\n color: var(--Card-badge-color);\n font-size: 0.6em;\n padding: 0 0.5em;\n display: inline-flex;\n position: relative;\n top: 0.5em;\n }\n\n &-arrow {\n font-size: 0.8em;\n opacity: var(--Card-href-arrow-opacity);\n position: relative;\n top: 0.375em;\n transition:\n opacity var(--transition-timing) var(--transition-fast),\n transform var(--transition-timing) var(--transition-fast);\n transform: var(--Card-href-arrow-transform);\n }\n\n &-content {\n color: var(--Card-content-color);\n display: flex;\n flex-direction: column;\n font-size: 1em;\n gap: var(--Card-gap);\n\n p:last-child {\n margin-bottom: 0;\n }\n }\n}\n","/**\n * Dark styles keyed off `$root`'s own `data-color-mode`, not any ancestor.\n * Unlike `dark-mode` (which matches ANY ancestor carrying the attribute —\n * see the warning on that mixin), this only fires when `$root` itself\n * declares the dark/system mode. None of this package's components carry\n * `data-color-mode` on their own root, so callers must pass the selector\n * for whichever wrapper actually carries it in their consuming app — there\n * is no default.\n *\n * IMPORTANT: this package ships one precompiled `dist/main.css` — there is\n * no build step where a consumer can supply their own value for `$root`.\n * Whatever gets passed at each `@include` call site below is permanent for\n * every installer of this package. Call sites currently hardcode\n * `'.rm-ReadMe'`, readme's hub color-mode wrapper, because readme is this\n * package's only real consumer today. If that ever changes, this becomes\n * silently wrong (not an error — dark mode just never activates) for any\n * consumer without that exact class in their DOM, and `$root` should be\n * dropped in favor of each component resolving its own nearest\n * `[data-color-mode]` ancestor at mount via `Element.closest()` and\n * stamping it onto its own root, so the CSS can self-anchor with no\n * hardcoded selector at all.\n *\n * $global: wrap the root-anchor selector in :global(), for use when this\n * file is imported into a CSS-module context (mirrors `dark-mode`'s param).\n */\n@mixin when-color-mode-dark($root, $global: false) {\n @if $global {\n :global(#{$root}[data-color-mode='dark']) & {\n @content;\n }\n\n :global(#{$root}[data-color-mode='system']) & {\n @media (prefers-color-scheme: dark) {\n @content;\n }\n }\n } @else {\n #{$root}[data-color-mode='dark'] & {\n @content;\n }\n\n #{$root}[data-color-mode='system'] & {\n @media (prefers-color-scheme: dark) {\n @content;\n }\n }\n }\n}\n","$iphone-plus: 414px;\n\n.Columns {\n display: grid;\n gap: var(--md, 20px);\n\n @media (max-width: $iphone-plus) {\n grid-template-columns: 1fr !important;\n }\n}\n",".TabGroup {\n &-nav {\n border-bottom: solid var(--color-border-default, #{rgba(black, 0.1)});\n margin-bottom: 15px;\n }\n\n &-tab {\n background: none;\n border: 0;\n color: var(--color-text-minimum, #637288);\n cursor: pointer;\n font-size: 15px;\n font-weight: 600;\n margin-right: 15px;\n padding: 0;\n padding-bottom: 10px;\n\n &_active {\n background: none;\n border: 0;\n border-bottom: solid var(--color-tab-active, currentcolor);\n color: var(--color-tab-active, currentcolor);\n font-size: 15px;\n font-weight: 600;\n margin-right: 15px;\n margin-bottom: -2px;\n padding: 0;\n padding-bottom: 10px;\n }\n\n &:hover {\n color: var(--color-text-muted, #4f5a66);\n }\n }\n\n &-icon {\n color: var(--project-color-primary, inherit);\n margin-right: 10px;\n }\n\n .TabContent {\n color: var(--color-text-muted, #4f5a66);\n }\n}\n\n:where(.TabGroup .TabContent > *:not(:last-child)) {\n margin-bottom: var(--markdown-spacing, 15px);\n}\n"],"names":[],"sourceRoot":""}
@@ -16243,6 +16243,15 @@ function cloneSort(comparator) {
16243
16243
  return templateFn(comparator);
16244
16244
  }
16245
16245
 
16246
+ let isEvalAllowed = (function () {
16247
+ try {
16248
+ new Function('return 0')();
16249
+ return true;
16250
+ } catch {
16251
+ return false;
16252
+ }
16253
+ })();
16254
+
16246
16255
  /**
16247
16256
  * Sort the given array in-place with the given comparator function.
16248
16257
  *
@@ -16254,7 +16263,7 @@ function cloneSort(comparator) {
16254
16263
 
16255
16264
  let sortCache = new WeakMap();
16256
16265
  exports.g = function (ary, comparator, start = 0) {
16257
- let doQuickSort = sortCache.get(comparator);
16266
+ let doQuickSort = isEvalAllowed ? sortCache.get(comparator) : SortTemplate(comparator);
16258
16267
  if (doQuickSort === void 0) {
16259
16268
  doQuickSort = cloneSort(comparator);
16260
16269
  sortCache.set(comparator, doQuickSort);
@@ -16282,6 +16291,14 @@ var ArraySet = (__webpack_require__(4361)/* .ArraySet */ .C);
16282
16291
  var base64VLQ = __webpack_require__(582);
16283
16292
  var quickSort = (__webpack_require__(4951)/* .quickSort */ .g);
16284
16293
 
16294
+ // Upper bound for a section's `offset.line` in an indexed source map. A flat
16295
+ // map spends one ';' per generated line, so a tiny indexed map with a huge
16296
+ // offset.line turns into a huge amount of work and memory once its mappings
16297
+ // are copied into a SourceMapGenerator (CVE-2026-93749). Ten million lines is
16298
+ // far beyond any real generated file. Columns are VLQ-encoded as deltas and
16299
+ // don't amplify, so they only need to be valid integers.
16300
+ var MAX_SECTION_OFFSET_LINE = 1e7;
16301
+
16285
16302
  function SourceMapConsumer(aSourceMap, aSourceMapURL) {
16286
16303
  var sourceMap = aSourceMap;
16287
16304
  if (typeof aSourceMap === 'string') {
@@ -17206,6 +17223,7 @@ function IndexedSourceMapConsumer(aSourceMap, aSourceMapURL) {
17206
17223
  line: -1,
17207
17224
  column: 0
17208
17225
  };
17226
+ var maxOffsetLine = 0;
17209
17227
  this._sections = sections.map(function (s) {
17210
17228
  if (s.url) {
17211
17229
  // The url field will require support for asynchronicity.
@@ -17216,12 +17234,32 @@ function IndexedSourceMapConsumer(aSourceMap, aSourceMapURL) {
17216
17234
  var offsetLine = util.getArg(offset, 'line');
17217
17235
  var offsetColumn = util.getArg(offset, 'column');
17218
17236
 
17237
+ if (!isValidOffset(offsetLine) || !isValidOffset(offsetColumn)) {
17238
+ throw new Error('Section offset line and column must be non-negative integers.');
17239
+ }
17240
+ if (offsetLine > MAX_SECTION_OFFSET_LINE) {
17241
+ throw new Error('Section offset line must not exceed ' + MAX_SECTION_OFFSET_LINE + '.');
17242
+ }
17243
+
17219
17244
  if (offsetLine < lastOffset.line ||
17220
17245
  (offsetLine === lastOffset.line && offsetColumn < lastOffset.column)) {
17221
17246
  throw new Error('Section offsets must be ordered and non-overlapping.');
17222
17247
  }
17223
17248
  lastOffset = offset;
17224
17249
 
17250
+ var consumer = new SourceMapConsumer(util.getArg(s, 'map'), aSourceMapURL);
17251
+
17252
+ // Offsets of a nested indexed map add up with this one, so apply the
17253
+ // bound to the total.
17254
+ var totalOffsetLine = offsetLine + (consumer._maxOffsetLine || 0);
17255
+ if (totalOffsetLine > MAX_SECTION_OFFSET_LINE) {
17256
+ throw new Error('Section offset line must not exceed ' + MAX_SECTION_OFFSET_LINE +
17257
+ ', including offsets of nested sections.');
17258
+ }
17259
+ if (totalOffsetLine > maxOffsetLine) {
17260
+ maxOffsetLine = totalOffsetLine;
17261
+ }
17262
+
17225
17263
  return {
17226
17264
  generatedOffset: {
17227
17265
  // The offset fields are 0-based, but we use 1-based indices when
@@ -17229,9 +17267,24 @@ function IndexedSourceMapConsumer(aSourceMap, aSourceMapURL) {
17229
17267
  generatedLine: offsetLine + 1,
17230
17268
  generatedColumn: offsetColumn + 1
17231
17269
  },
17232
- consumer: new SourceMapConsumer(util.getArg(s, 'map'), aSourceMapURL)
17270
+ consumer: consumer
17233
17271
  }
17234
17272
  });
17273
+
17274
+ // The largest offset.line of any section, including nested sections.
17275
+ this._maxOffsetLine = maxOffsetLine;
17276
+ }
17277
+
17278
+ /**
17279
+ * Section offsets come from untrusted input and are used as line/column
17280
+ * numbers, so only accept non-negative safe integers (rejects NaN, Infinity,
17281
+ * strings, fractions, etc).
17282
+ */
17283
+ function isValidOffset(aValue) {
17284
+ return typeof aValue === 'number' &&
17285
+ aValue >= 0 &&
17286
+ aValue <= 9007199254740991 && // Number.MAX_SAFE_INTEGER
17287
+ Math.floor(aValue) === aValue;
17235
17288
  }
17236
17289
 
17237
17290
  IndexedSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype);
@@ -17249,8 +17302,12 @@ Object.defineProperty(IndexedSourceMapConsumer.prototype, 'sources', {
17249
17302
  get: function () {
17250
17303
  var sources = [];
17251
17304
  for (var i = 0; i < this._sections.length; i++) {
17252
- for (var j = 0; j < this._sections[i].consumer.sources.length; j++) {
17253
- sources.push(this._sections[i].consumer.sources[j]);
17305
+ // Read the getter once per section: for a nested indexed map it is
17306
+ // itself this getter, and re-reading it per item is exponential in the
17307
+ // nesting depth (CVE-2026-93749).
17308
+ var sectionSources = this._sections[i].consumer.sources;
17309
+ for (var j = 0; j < sectionSources.length; j++) {
17310
+ sources.push(sectionSources[j]);
17254
17311
  }
17255
17312
  }
17256
17313
  return sources;
@@ -17814,10 +17871,12 @@ SourceMapGenerator.prototype._serializeMappings =
17814
17871
 
17815
17872
  if (mapping.generatedLine !== previousGeneratedLine) {
17816
17873
  previousGeneratedColumn = 0;
17817
- while (mapping.generatedLine !== previousGeneratedLine) {
17818
- next += ';';
17819
- previousGeneratedLine++;
17820
- }
17874
+ // One ';' per skipped line. Build large gaps with a single flat
17875
+ // string: appending ';' one by one creates a rope node per line, which
17876
+ // can exhaust the heap for a big gap (CVE-2026-93749).
17877
+ var lineDelta = mapping.generatedLine - previousGeneratedLine;
17878
+ next += lineDelta === 1 ? ';' : ';'.repeat(lineDelta);
17879
+ previousGeneratedLine = mapping.generatedLine;
17821
17880
  }
17822
17881
  else {
17823
17882
  if (i > 0) {
@@ -18031,6 +18090,13 @@ SourceNode.fromStringWithSourceMap =
18031
18090
  // to the SourceNode without any mapping.
18032
18091
  // Each line is added as separate string.
18033
18092
  while (lastGeneratedLine < mapping.generatedLine) {
18093
+ if (remainingLinesIndex >= remainingLines.length) {
18094
+ // The generated code is exhausted. Skip the rest instead of adding
18095
+ // empty lines one by one: a mapping may point far past the end of
18096
+ // the code (e.g. an indexed map section with a huge offset.line).
18097
+ lastGeneratedLine = mapping.generatedLine;
18098
+ break;
18099
+ }
18034
18100
  node.add(shiftNextLine());
18035
18101
  lastGeneratedLine++;
18036
18102
  }
@@ -19292,6 +19358,8 @@ const TOKENIZER_MDX_COMPONENT_EXCLUDED_TAGS = new Set([
19292
19358
  * run after rehype (where hast `tagName` is normalized to lowercase).
19293
19359
  */
19294
19360
  const INLINE_COMPONENT_TAGS_LOWER = new Set([...INLINE_COMPONENT_TAGS].map(t => t.toLowerCase()));
19361
+ /** Raw markup props injected with `dangerouslySetInnerHTML` by HTMLBlock and Embed; never interpolate reader values. */
19362
+ const RAW_HTML_PROP_NAMES = new Set(['html']);
19295
19363
 
19296
19364
  ;// ./node_modules/github-slugger/regex.js
19297
19365
  // This module is generated by `script/`.
@@ -92257,7 +92325,8 @@ const HTMLBlock = ({ children = '', html: htmlProp, runScripts, safeMode: safeMo
92257
92325
  // In MDX mode, safeMode is passed in as a boolean from JSX parsing
92258
92326
  // In MDXish mode, safeMode comes in as a string from HAST props
92259
92327
  const safeMode = typeof safeModeRaw !== 'boolean' ? safeModeRaw === 'true' : safeModeRaw;
92260
- const [cleanedHtml, exec] = extractScripts(html);
92328
+ // Memoised so `exec` is stable across rerenders and the effect below only runs when the html changes.
92329
+ const [cleanedHtml, exec] = (0,external_react_.useMemo)(() => extractScripts(html), [html]);
92261
92330
  (0,external_react_.useEffect)(() => {
92262
92331
  if (typeof window !== 'undefined' && typeof runScripts === 'boolean' && runScripts)
92263
92332
  exec();
@@ -127725,33 +127794,75 @@ function repairMistakenTableClosers(content) {
127725
127794
  return applyInserts(content, edits).value;
127726
127795
  }
127727
127796
 
127797
+ ;// ./lib/utils/mdxish/mdxish-variables.ts
127798
+
127799
+
127800
+ // The `$` guard skips template-literal interpolation: `${user.name}` embeds `{user.name}`, and
127801
+ // substituting it would leave a mangled `` `Hi $Name` `` behind. Those belong to an expression,
127802
+ // which either evaluated already or is meant to stay literal.
127803
+ const MDX_VARIABLE_REGEX = new RegExp(`(?<!\\$)${variable_dist.MDX_VARIABLE_REGEXP}`, 'gu');
127804
+ // A whole attribute expression that is one `user.*` reference, e.g. the `user.name` in `title={user.name}`.
127805
+ const BARE_VARIABLE_REGEX = new RegExp(`^${variable_dist.MDX_VARIABLE_REGEXP}$`, 'u');
127806
+ // Bracket notation names the same variable as dot notation, so normalize it before substituting.
127807
+ // Escaped and `$`-prefixed forms are left alone so a reference that stays literal keeps its source.
127808
+ // A closing escape needs no lookahead: requiring a literal `]}` already rules out `]\}`.
127809
+ const BRACKET_NOTATION_REGEX = /(?<![$\\])\{user\[['"](\w+)['"]\]\}/gu;
127810
+ /**
127811
+ * Resolve `{user.*}` in a JSX attribute value against the same `user` binding the rmdx engine gets,
127812
+ * so both engines agree. Body text differs on empty values: `Variable` falls back to the default.
127813
+ *
127814
+ * Legacy `<<...>>` is valid inside a quoted attribute but deliberately left literal — attributes are
127815
+ * an MDX surface, and `{user.*}` is the syntax authors use there.
127816
+ */
127817
+ function resolveAttributeVariables(value, user) {
127818
+ if (!value.includes('{user'))
127819
+ return value;
127820
+ return value
127821
+ .replace(BRACKET_NOTATION_REGEX, '{user.$1}')
127822
+ .replace(MDX_VARIABLE_REGEX, (source, escapePrefix, name, escapeSuffix) => {
127823
+ if (escapePrefix || escapeSuffix)
127824
+ return source;
127825
+ return stringifyVariableValue(user[name]);
127826
+ });
127827
+ }
127828
+ /** Whether an attribute expression's source is a bare `user.*` reference, left for render-time substitution. */
127829
+ const isBareVariableReference = (source) => BARE_VARIABLE_REGEX.test(`{${source.trim()}}`.replace(BRACKET_NOTATION_REGEX, '{user.$1}'));
127830
+
127728
127831
  ;// ./processor/transform/mdxish/resolve-deferred-attribute-expression-props.ts
127729
127832
 
127730
127833
 
127731
127834
 
127732
127835
 
127836
+
127837
+
127838
+
127733
127839
  /**
127734
127840
  * Resolve attribute expressions that `mdxJsxElementHandler` deferred.
127735
127841
  *
127736
127842
  * The handler stashed each attribute expression's source in `node.data.deferredExpressions`
127737
127843
  * (keyed by prop name) instead of evaluating eagerly, because an eager result can be a React
127738
127844
  * element or function that rehypeRaw's `structuredClone` passthrough rejects. Now that we're
127739
- * past the clone, evaluate each source with a scope of `{ React, ...mdxishScope }` and write
127845
+ * past the clone, evaluate each source with a scope of `{ user, React, ...mdxishScope }` and write
127740
127846
  * the real value into `properties` (e.g. an array of objects whose fields are React elements).
127741
127847
  *
127742
127848
  * Must run after `rehypeRaw` (past the clone) but before `normalizeMdxJsxNodes` rewrites these
127743
127849
  * `mdx-jsx` nodes into plain elements. Skipped in safeMode, which keeps expressions literal.
127744
127850
  */
127745
- const resolveDeferredAttributeExpressionProps = () => (tree, file) => {
127851
+ const resolveDeferredAttributeExpressionProps = ({ variables } = {}) => (tree, file) => {
127746
127852
  const scope = { ...file.data.mdxishScope, React: (external_react_default()) };
127853
+ // `user` only when variables were supplied, as in `evaluateExpressions`.
127854
+ const userScope = variables ? { user: user(variables), ...scope } : scope;
127747
127855
  visit(tree, 'mdx-jsx', (node) => {
127748
127856
  const deferredExpressions = node.data?.deferredExpressions;
127749
127857
  if (!deferredExpressions)
127750
127858
  return;
127751
127859
  const properties = node.properties;
127752
127860
  Object.entries(deferredExpressions).forEach(([name, source]) => {
127861
+ // Raw markup never gets `user`: a reader's values reaching `dangerouslySetInnerHTML` is an injection
127862
+ // vector. A bare `{user.x}` keeps render-time substitution, which stringifies structured values.
127863
+ const canReadUser = !RAW_HTML_PROP_NAMES.has(name) && !isBareVariableReference(source);
127753
127864
  try {
127754
- const result = evalExpression(source, scope);
127865
+ const result = evalExpression(source, canReadUser ? userScope : scope);
127755
127866
  // hast/HTML `style` is a plain CSS string; a `style={{...}}` expression evaluates to
127756
127867
  // a JS object, which must be serialized or it renders as the literal "[object Object]".
127757
127868
  properties[name] = name === 'style' && style_object_to_css_isPlainObject(result) ? styleObjectToCssText(result) : result;
@@ -128361,7 +128472,7 @@ function mdxish(mdContent, opts = {}) {
128361
128472
  .use(preserveBooleanProperties) // RehypeRaw converts boolean properties to empty strings
128362
128473
  .use(rehypeRaw, { passThrough: ['html-block', 'mdx-jsx'] }) // MDX JSX nodes bypass parse5's string-only HTML round-trip
128363
128474
  .use(restoreBooleanProperties)
128364
- .use(safeMode ? undefined : resolve_deferred_attribute_expression_props) // Evaluate deferred attribute expressions on mdx-jsx nodes (now past rehypeRaw's clone)
128475
+ .use(safeMode ? undefined : resolve_deferred_attribute_expression_props, { variables }) // Evaluate deferred attribute expressions on mdx-jsx nodes (now past rehypeRaw's clone)
128365
128476
  .use(normalize_mdx_jsx_nodes) // Rewrite `mdx-jsx` back to standard `element` nodes for downstream plugins
128366
128477
  .use(sanitize ? rehypeStripTags : undefined) // Strip STRIPPED_TAG_NAMES elements; this pipeline has no sanitization step
128367
128478
  .use(rehypeFlattenTableCellParagraphs) // Remove <p> wrappers inside table cells to prevent margin issues
@@ -128526,36 +128637,6 @@ const makeUseMDXComponents = (more = {}) => {
128526
128637
  };
128527
128638
  /* harmony default export */ const makeUseMdxComponents = (makeUseMDXComponents);
128528
128639
 
128529
- ;// ./lib/utils/mdxish/mdxish-variables.ts
128530
-
128531
-
128532
- // The `$` guard skips template-literal interpolation: `${user.name}` embeds `{user.name}`, and
128533
- // substituting it would leave a mangled `` `Hi $Name` `` behind. Those belong to an expression,
128534
- // which either evaluated already or is meant to stay literal.
128535
- const MDX_VARIABLE_REGEX = new RegExp(`(?<!\\$)${variable_dist.MDX_VARIABLE_REGEXP}`, 'gu');
128536
- // Bracket notation names the same variable as dot notation, so normalize it before substituting.
128537
- // Escaped and `$`-prefixed forms are left alone so a reference that stays literal keeps its source.
128538
- // A closing escape needs no lookahead: requiring a literal `]}` already rules out `]\}`.
128539
- const BRACKET_NOTATION_REGEX = /(?<![$\\])\{user\[['"](\w+)['"]\]\}/gu;
128540
- /**
128541
- * Resolve `{user.*}` in a JSX attribute value against the same `user` binding the rmdx engine gets,
128542
- * so both engines agree. Body text differs on empty values: `Variable` falls back to the default.
128543
- *
128544
- * Legacy `<<...>>` is valid inside a quoted attribute but deliberately left literal — attributes are
128545
- * an MDX surface, and `{user.*}` is the syntax authors use there.
128546
- */
128547
- function resolveAttributeVariables(value, user) {
128548
- if (!value.includes('{user'))
128549
- return value;
128550
- return value
128551
- .replace(BRACKET_NOTATION_REGEX, '{user.$1}')
128552
- .replace(MDX_VARIABLE_REGEX, (source, escapePrefix, name, escapeSuffix) => {
128553
- if (escapePrefix || escapeSuffix)
128554
- return source;
128555
- return stringifyVariableValue(user[name]);
128556
- });
128557
- }
128558
-
128559
128640
  ;// ./lib/utils/mdxish/mdxish-render-utils.tsx
128560
128641
 
128561
128642
 
@@ -128566,6 +128647,7 @@ function resolveAttributeVariables(value, user) {
128566
128647
 
128567
128648
 
128568
128649
 
128650
+
128569
128651
  /** Flatten CustomComponents into a component map for rehype-react */
128570
128652
  function exportComponentsForRehype(components) {
128571
128653
  const exported = Object.entries(components).reduce((memo, [tag, mod]) => {
@@ -128598,8 +128680,6 @@ function exportComponentsForRehype(components) {
128598
128680
  * deliberately leaves mermaid alone; resolving it again here would override that.
128599
128681
  */
128600
128682
  const CODE_TAG_NAMES = new Set(['code']);
128601
- /** Raw markup injected with `dangerouslySetInnerHTML` by HTMLBlock and Embed — never interpolate. */
128602
- const RAW_HTML_PROP_NAMES = new Set(['html']);
128603
128683
  /**
128604
128684
  * Resolve `{user.*}` in string-valued props. Body text is handled by the `Variable` component, but
128605
128685
  * attributes are plain strings, so they are substituted here — at render time, so that a