baseline-kit 5.1.0 → 5.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -22,6 +22,14 @@
22
22
  - Box and Padder now opt into `text-box: trim-both ex alphabetic` when the
23
23
  browser supports it, while retaining normal line boxes as a fallback.
24
24
 
25
+ ## 5.2.0
26
+
27
+ ### Minor Changes
28
+
29
+ - 906488c: Use readable TSX source for the native Remix adapter, keep Maestro workflow
30
+ state local-only, and let Box choose whether height-snap correction goes to the
31
+ top or bottom padding edge.
32
+
25
33
  ## 5.1.0
26
34
 
27
35
  ### Minor Changes
package/README.md CHANGED
@@ -109,12 +109,16 @@ Spacing props accept the following shapes:
109
109
 
110
110
  ### Grid snapping
111
111
 
112
- `Box` defaults to `snapping="clamp"`. `height` adds bottom spacing to round the
113
- measured height up to the next base interval; `clamp` also reduces the top and
114
- bottom spacing modulo the base. Use `snapping="none"` to keep explicit spacing.
115
- Snapping happens once after the first nonzero measurement, not continuously on
116
- resize. `Padder` uses height snapping in both adapters. Set `ssrMode` on Padder
117
- to retain explicit padding without applying its measured snap.
112
+ `Box` defaults to `snapping="clamp"`. `height` adds spacing to round the measured
113
+ height up to the next base interval; it adds that correction to the bottom by
114
+ default. Use `snapEdge="top"` with `snapping="height"` when the text's trimmed
115
+ alphabetic edge should stay anchored while the top padding absorbs the
116
+ correction. `snapEdge="bottom"` is the explicit equivalent of the default.
117
+ `clamp` reduces the top and bottom spacing modulo the base, and
118
+ `snapping="none"` keeps explicit spacing. Snapping happens once after the first
119
+ nonzero measurement, not continuously on resize. `Padder` uses height snapping
120
+ with bottom correction in both adapters. Set `ssrMode` on Padder to retain
121
+ explicit padding without applying its measured snap.
118
122
 
119
123
  ### Debugging modes
120
124
 
package/dist/core.cjs CHANGED
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./src-C-1u5WNS.cjs");exports.ABSOLUTE_UNIT_CONVERSIONS=e.b,exports.DEFAULT_CONFIG=e.k,exports.GRID_ALIGNMENTS=e.T,exports.PADD_VARIANTS=e.E,exports.RELATIVE_UNITS=e.x,exports.calculateGuideTemplate=e.s,exports.calculateRowCount=e.v,exports.calculateSnappedSpacing=e.m,exports.clamp=e.y,exports.convertValue=e.S,exports.createBaselineDescriptor=e.i,exports.createBoxDescriptor=e.r,exports.createCSSVariables=e.D,exports.createGridSpanStyles=e.c,exports.createGuideConfig=e.a,exports.createGuideDescriptor=e.o,exports.createPadderDescriptor=e.t,exports.createSpacerDescriptor=e.n,exports.createStyleOverride=e.d,exports.cx=e.f,exports.formatValue=e.C,exports.isValidGuideColumnValue=e.l,exports.isValidGuidePattern=e.u,exports.mergeConfig=e.O,exports.normalizeValue=e.g,exports.normalizeValuePair=e._,exports.parsePadding=e.h,exports.parseUnit=e.w,exports.resolveDebugState=e.p;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./src-R5usYJol.cjs");exports.ABSOLUTE_UNIT_CONVERSIONS=e.b,exports.DEFAULT_CONFIG=e.k,exports.GRID_ALIGNMENTS=e.T,exports.PADD_VARIANTS=e.E,exports.RELATIVE_UNITS=e.x,exports.calculateGuideTemplate=e.s,exports.calculateRowCount=e.v,exports.calculateSnappedSpacing=e.m,exports.clamp=e.y,exports.convertValue=e.S,exports.createBaselineDescriptor=e.i,exports.createBoxDescriptor=e.r,exports.createCSSVariables=e.D,exports.createGridSpanStyles=e.c,exports.createGuideConfig=e.a,exports.createGuideDescriptor=e.o,exports.createPadderDescriptor=e.t,exports.createSpacerDescriptor=e.n,exports.createStyleOverride=e.d,exports.cx=e.f,exports.formatValue=e.C,exports.isValidGuideColumnValue=e.l,exports.isValidGuidePattern=e.u,exports.mergeConfig=e.O,exports.normalizeValue=e.g,exports.normalizeValuePair=e._,exports.parsePadding=e.h,exports.parseUnit=e.w,exports.resolveDebugState=e.p;
package/dist/core.d.ts CHANGED
@@ -33,6 +33,7 @@ type PaddedVariant = (typeof PADD_VARIANTS)[number];
33
33
  type Variant = 'line' | 'flat' | 'pattern';
34
34
  type BaselineVariant = Exclude<Variant, 'pattern'>;
35
35
  type SnappingMode = 'none' | 'height' | 'clamp';
36
+ type SnapEdge = 'top' | 'bottom';
36
37
  type DebuggingMode = 'none' | 'hidden' | 'visible';
37
38
  type BaseGuideConfig = {
38
39
  gap?: number | string;
@@ -165,7 +166,12 @@ declare function normalizeValuePair(values: [
165
166
 
166
167
  declare function parsePadding(spacing: SpacingProps): Padding;
167
168
 
168
- declare function calculateSnappedSpacing(height: number, base: number, initial: PaddingValue, snapping: SnappingMode): Padding;
169
+ type SnappingOptions = {
170
+ mode: SnappingMode;
171
+ snapEdge?: SnapEdge;
172
+ };
173
+ type SnappingInput = SnappingMode | SnappingOptions;
174
+ declare function calculateSnappedSpacing(height: number, base: number, initial: PaddingValue, snappingInput: SnappingInput): Padding;
169
175
 
170
176
  /**
171
177
  * Combines class names, filtering out falsy values.
@@ -351,4 +357,4 @@ interface PadderDescriptor {
351
357
  declare function createPadderDescriptor(params: PadderDescriptorParams): PadderDescriptor;
352
358
 
353
359
  export { ABSOLUTE_UNIT_CONVERSIONS, DEFAULT_CONFIG, GRID_ALIGNMENTS, PADD_VARIANTS, RELATIVE_UNITS, calculateGuideTemplate, calculateRowCount, calculateSnappedSpacing, clamp, convertValue, createBaselineDescriptor, createBoxDescriptor, createCSSVariables, createGridSpanStyles, createGuideConfig, createGuideDescriptor, createPadderDescriptor, createSpacerDescriptor, createStyleOverride, cx, formatValue, isValidGuideColumnValue, isValidGuidePattern, mergeConfig, normalizeValue, normalizeValuePair, parsePadding, parseUnit, resolveDebugState };
354
- export type { AutoConfig, BaselineDescriptor, BaselineDescriptorParams, BaselineVariant, BoxDescriptor, BoxDescriptorParams, ConfigOverrides, ConfigSchema, ConversionContext, DebugState, DebuggingMode, FixedConfig, GridAlignment, GuideColumnValue, GuideColumnsPattern, GuideConfig, GuideConfigParams, GuideDescriptor, GuideDescriptorParams, GuideResult, GuideVariant, LineConfig, NormalizationOptions, PaddedVariant, PadderDescriptor, PadderDescriptorParams, Padding, PaddingValue, PatternConfig, SnappingMode, SpacerDescriptor, SpacerDescriptorParams, Spacing, SpacingProps, StyleOverrideParams, Variant };
360
+ export type { AutoConfig, BaselineDescriptor, BaselineDescriptorParams, BaselineVariant, BoxDescriptor, BoxDescriptorParams, ConfigOverrides, ConfigSchema, ConversionContext, DebugState, DebuggingMode, FixedConfig, GridAlignment, GuideColumnValue, GuideColumnsPattern, GuideConfig, GuideConfigParams, GuideDescriptor, GuideDescriptorParams, GuideResult, GuideVariant, LineConfig, NormalizationOptions, PaddedVariant, PadderDescriptor, PadderDescriptorParams, Padding, PaddingValue, PatternConfig, SnapEdge, SnappingMode, SnappingOptions, SpacerDescriptor, SpacerDescriptorParams, Spacing, SpacingProps, StyleOverrideParams, Variant };
package/dist/core.mjs CHANGED
@@ -1,2 +1,2 @@
1
- import { C as e, D as t, E as n, O as r, S as i, T as a, _ as o, a as s, b as c, c as l, d as u, f as d, g as f, h as p, i as m, k as h, l as g, m as _, n as v, o as y, p as b, r as x, s as S, t as C, u as w, v as T, w as E, x as D, y as O } from "./src-C3TICsw6.js";
1
+ import { C as e, D as t, E as n, O as r, S as i, T as a, _ as o, a as s, b as c, c as l, d as u, f as d, g as f, h as p, i as m, k as h, l as g, m as _, n as v, o as y, p as b, r as x, s as S, t as C, u as w, v as T, w as E, x as D, y as O } from "./src-D0nL1BwZ.js";
2
2
  export { c as ABSOLUTE_UNIT_CONVERSIONS, h as DEFAULT_CONFIG, a as GRID_ALIGNMENTS, n as PADD_VARIANTS, D as RELATIVE_UNITS, S as calculateGuideTemplate, T as calculateRowCount, _ as calculateSnappedSpacing, O as clamp, i as convertValue, m as createBaselineDescriptor, x as createBoxDescriptor, t as createCSSVariables, l as createGridSpanStyles, s as createGuideConfig, y as createGuideDescriptor, C as createPadderDescriptor, v as createSpacerDescriptor, u as createStyleOverride, d as cx, e as formatValue, g as isValidGuideColumnValue, w as isValidGuidePattern, r as mergeConfig, f as normalizeValue, o as normalizeValuePair, p as parsePadding, E as parseUnit, b as resolveDebugState };
package/dist/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,s)=>(s=n==null?{}:e(i(n)),o(r||!n||!n.__esModule||!a.call(n,`default`)?t(s,`default`,{value:n,enumerable:!0}):s,n));const c=require("./src-C-1u5WNS.cjs");let l=require("react");l=s(l,1);let u=require("react/jsx-runtime");var d=`__baseline_kit_config_context__`,f=globalThis,p=f[d]??(f[d]=l.createContext(c.k));p.displayName=`ConfigContext`;var m=()=>l.use(p);function h({children:e,base:t,baseline:n,guide:r,spacer:i,box:a,padder:o}){let s=m(),d=l.useMemo(()=>c.O({parentConfig:s,base:t,baseline:n,guide:r,spacer:i,box:a,padder:o}),[s,t,n,r,i,a,o]);return(0,u.jsx)(p,{value:d,children:e})}var g=e=>{let t=null,n=null;return[(...r)=>{n=r,t!==null&&cancelAnimationFrame(t),t=requestAnimationFrame(()=>{e(...n),t=null,n=null})},()=>{t!==null&&(cancelAnimationFrame(t),t=null,n=null)}]};function _(e,t){let n={width:0,height:0},r=()=>{try{let r=e.getBoundingClientRect(),i={width:Math.round(r.width),height:Math.round(r.height)};(i.width!==n.width||i.height!==n.height)&&(n=i,t(i))}catch{}},[i,a]=g(r);r();let o=new ResizeObserver(i);return o.observe(e),{refresh:i,disconnect(){o.disconnect(),a()}}}var v={width:0,height:0};function y(e){let[t,n]=l.useState(v),r=l.useRef(null);l.useLayoutEffect(()=>{if(typeof window>`u`||!e.current)return;let t=_(e.current,e=>{n(t=>t.width===e.width&&t.height===e.height?t:e)});return r.current=t,()=>{t.disconnect(),r.current=null}},[e]);let i=l.useCallback(()=>{r.current?.refresh()},[]);return{...t,refresh:i}}function b(e,t,n){let{totalItems:r,itemHeight:i,buffer:a=0}=t;if(!Number.isFinite(i)||i<=0)throw Error(`createVirtualTracker requires itemHeight to be greater than 0`);if(!Number.isFinite(r)||r<0)throw Error(`createVirtualTracker requires totalItems to be 0 or greater`);let o=()=>{let t=e.getBoundingClientRect().top+window.scrollY,n=Math.max(0,window.scrollY-t-a),o=n+window.innerHeight+a*2;return{start:Math.max(0,Math.floor(n/i)),end:Math.min(r,Math.ceil(o/i))}},s={start:0,end:r},[c,l]=g(()=>{let e=o();(e.start!==s.start||e.end!==s.end)&&(s=e,n(e))}),u={passive:!0};window.addEventListener(`scroll`,c,u),window.addEventListener(`resize`,c,u);let d=new IntersectionObserver(c,{threshold:0});return d.observe(e),c(),{refresh:c,disconnect(){window.removeEventListener(`scroll`,c,u),window.removeEventListener(`resize`,c,u),d.disconnect(),l()}}}function x({totalLines:e,lineHeight:t,containerRef:n,buffer:r=0}){let i=typeof r==`number`?r:parseInt(r,10)||0,[a,o]=(0,l.useState)({start:0,end:e}),s=(0,l.useCallback)(e=>{o(t=>t.start===e.start&&t.end===e.end?t:e)},[]);return(0,l.useLayoutEffect)(()=>{if(!n.current)return;o(t=>t.start===0&&t.end===e?t:{start:0,end:e});let r=b(n.current,{totalItems:e,itemHeight:t,buffer:i},s);return()=>r.disconnect()},[n,e,t,i,s]),a}function S(e,{base:t=8,snapping:n=`none`,spacing:r={}}={}){if(t<1)throw Error(`Base must be >= 1 for baseline alignment.`);let{height:i}=y(e),a=l.useRef(null);return l.useMemo(()=>{let e=c.h({padding:r}),o=i%t===0;if(n===`none`)return{padding:e,isAligned:o,height:i};if(a.current)return{padding:a.current,isAligned:o,height:i};if(i===0)return{padding:e,isAligned:o,height:i};let s=c.m(i,t,e,n);return a.current=s,{padding:s,isAligned:o,height:i}},[t,n,r,i])}function C(){return typeof window>`u`?{}:{viewportWidth:window.innerWidth,viewportHeight:window.innerHeight}}function w(e,t){let{width:n}=y(e);return l.useMemo(()=>c.s(n,t,C()),[t,n])}function T(e){let t=m();return(0,l.useMemo)(()=>Object.assign({base:t.base},t[e]),[t,e])}function E(e,t){return(0,l.useMemo)(()=>c.p(e,t),[e,t])}function D(){let[e,t]=(0,l.useState)(!1);return(0,l.useEffect)(()=>{t(!0)},[]),e}function O({children:e,fallback:t=null}){return D()?(0,u.jsx)(u.Fragment,{children:e}):(0,u.jsx)(u.Fragment,{children:t})}function k(...e){return Object.assign({},...e.filter(Boolean))}function A(...e){return t=>{e.forEach(e=>{e&&(typeof e==`function`?e(t):Object.assign(e,{current:t}))})}}var j={bas:`bas_4Emvv`,v:`v_lNfeX`,h:`h_PbNDU`,row:`row_J1Wva`,ssr:`ssr_PQAP-`},M=l.memo(function({className:e,debugging:t,style:n,variant:r,height:i,width:a,base:o,color:s,...d}){let f=T(`baseline`),{isShown:p}=E(t,f.debugging),m=l.useRef(null),{width:h,height:g}=y(m),_=o||f.base,v=l.useMemo(()=>c.i({base:_,colors:f.colors,variant:r??f.variant,width:a,height:i,color:s,containerWidth:h,containerHeight:g,spacing:d,isVisible:p}),[_,f.colors,f.variant,r,a,i,s,h,g,d,p]),{start:b,end:S}=x({totalLines:v.rowCount,lineHeight:_,containerRef:m,buffer:160}),C=l.useMemo(()=>k(v.containerStyle,n),[v.containerStyle,n]);return(0,u.jsx)(`div`,{ref:m,"data-testid":`baseline`,"aria-hidden":`true`,className:c.f(...v.classTokens.map(e=>j[e]),e),style:C,...d,children:p&&Array.from({length:S-b},(e,t)=>{let n=t+b;return(0,u.jsx)(`div`,{className:j.row,"data-row-index":n,style:v.getRowStyle(n)},n)})})}),N=l.memo(function({className:e,debugging:t,style:n,variant:r,height:i,width:a,base:o,color:s,ssrMode:l=!1,...d}){let f=T(`baseline`),p=r??f.variant,m=o??f.base,{isShown:h}=E(t,f.debugging);if(!h)return(0,u.jsx)(`div`,{className:c.f(j.bas,j.h,e),style:n,"data-testid":`baseline`,"aria-hidden":`true`,...d});let g=(0,u.jsx)(`div`,{className:c.f(j.bas,j.h,j.ssr,e),style:{width:a??`100%`,height:i??`100%`,...n},"data-testid":`baseline`,"aria-hidden":`true`});return l?g:(0,u.jsx)(O,{fallback:g,children:(0,u.jsx)(M,{className:e,debugging:t,style:n,variant:p,height:i,width:a,base:m,color:s,...d})})}),P={gde:`gde_4PKz3`,v:`v_yAvN0`,h:`h_XcWcy`,line:`line_UaLjW`,cols:`cols_ibtT4`,col:`col_QPSDI`,ssr:`ssr_4UN4k`},F=l.memo(function({className:e,debugging:t,style:n,variant:r,align:i=`center`,gap:a,height:o,width:s,columns:l,columnWidth:d,maxWidth:f,color:p,children:m,ssrMode:h=!1,...g}){let _=T(`guide`),v=r??_.variant,y=typeof a==`number`?a:0,{isShown:b}=E(t,_.debugging);if(!b)return(0,u.jsx)(`div`,{className:c.f(P.gde,P.h,e),style:n,"data-testid":`guide`,"data-variant":v,"aria-hidden":`true`,...g,children:m});let x=(0,u.jsx)(`div`,{className:c.f(P.gde,P.h,P.ssr,e),style:{width:s??`100%`,height:o??`100%`,maxWidth:f??`none`,...n},"data-testid":`guide`,"data-variant":v,"aria-hidden":`true`,children:m});return h?x:(0,u.jsx)(O,{fallback:x,children:(0,u.jsx)(I,{className:e,debugging:t,style:n,variant:v,align:i,gap:y,height:o,width:s,columns:l,columnWidth:d,maxWidth:f,color:p,...g,children:m})})}),I=l.memo(function({className:e,debugging:t,style:n,variant:r,align:i=`center`,gap:a,height:o,width:s,columns:d,columnWidth:f,maxWidth:p,color:m,children:h,...g}){let _=T(`guide`),{isShown:v}=E(t,_.debugging),b=l.useRef(null);y(b);let x=r??_.variant,S=typeof a==`number`?a:0,{template:C,columnsCount:D,calculatedGap:O}=w(b,l.useMemo(()=>c.a({variant:x,base:_.base,gap:S,columns:d,columnWidth:f}),[x,_.base,S,d,f])),A=l.useMemo(()=>c.o({base:_.base,colors:_.colors,variant:x,align:i||`center`,width:s,height:o,columnWidth:f,maxWidth:p,color:m,template:C,columnsCount:D,calculatedGap:O,isVisible:v}),[_.base,_.colors,x,i,s,o,f,p,m,C,D,O,v]),j=l.useMemo(()=>k(A.containerStyle,n),[A.containerStyle,n]);return(0,u.jsxs)(`div`,{ref:b,"data-testid":`guide`,"aria-hidden":`true`,className:c.f(...A.classTokens.map(e=>P[e]),e),"data-variant":r,style:j,...g,children:[v&&(0,u.jsx)(`div`,{className:P.cols,"data-variant":r,children:!A.isLineVariant&&Array.from({length:A.columnsCount},(e,t)=>(0,u.jsx)(`div`,{className:P.col,"data-column-index":t,"data-variant":r},t))}),h]})}),L=typeof window>`u`;function R(e,t){if(L)return t;try{return e()}catch{return t}}function z(e,t,n){return!e||L?t:n}var B={spr:`spr_syfhf`,line:`line_nzGsp`,flat:`flat_XJWHt`,indicator:`indicator_inw1x`},V=l.memo(function({height:e,width:t,indicatorNode:n,debugging:r,variant:i,base:a,color:o,className:s,style:d,children:f,ssrMode:p=!1,...m}){let h=l.useRef(null),g=T(`spacer`),{isShown:_}=E(r,g.debugging),v=i??g.variant,y=a??g.base,b=D(),x=l.useMemo(()=>c.n({base:y,colors:g.colors,width:t,height:e,color:o,variant:v,isVisible:_}),[y,g.colors,t,e,o,v,_]),S=z(b&&!p,!1,_&&n!==void 0),C=l.useMemo(()=>{if(!S)return null;let e=x.normWidth,t=x.normHeight;return(0,u.jsxs)(u.Fragment,{children:[t!==0&&(0,u.jsx)(`span`,{className:B.indicator,"aria-hidden":`true`,children:n(t,`height`)},`height`),e!==0&&(0,u.jsx)(`span`,{className:B.indicator,"aria-hidden":`true`,children:n(e,`width`)},`width`)]})},[S,n,x.normWidth,x.normHeight]),w=l.useMemo(()=>k(x.style,d),[x.style,d]);return(0,u.jsxs)(`div`,{ref:h,"data-testid":`spacer`,className:c.f(...x.classTokens.map(e=>B[e]),s),"data-variant":v,"data-height":typeof x.normHeight==`number`?`${x.normHeight}px`:x.normHeight,style:w,...m,children:[C,f]})}),H={pad:`pad_NizuS`,content:`content_xFX0U`,v:`v_dowAz`},U=(e,t,n)=>{let r=e||`line`,i=t||`none`,a=(e,t)=>(0,u.jsx)(V,{variant:r,debugging:t===0||e===0?`none`:i,indicatorNode:n,height:t===`100%`?void 0:t,width:e===`100%`?void 0:e});return a.displayName=`PadderSpacer`,a},W={gridColumn:`1 / -1`},G={gridRow:`2 / 3`},K={gridRow:`2 / 3`,gridColumn:`2 / 3`},q=l.memo(l.forwardRef(function({children:e,className:t,debugging:n,height:r,indicatorNode:i,style:a,width:o,ssrMode:s=!1,...d},f){let p=T(`padder`),{variant:m}=T(`spacer`),h=l.useMemo(()=>c.h(d),[d]),{isShown:g,isNone:_,debugging:v}=E(n,p.debugging),y=!_,b=D(),x=l.useRef(null),C=S(x,{base:p.base,snapping:`height`,spacing:h}),w={padding:{top:h.top||0,right:h.right||0,bottom:h.bottom||0,left:h.left||0}},{padding:O}=z(b&&!s,w,C),j=A(f,x),M=l.useMemo(()=>c.t({base:p.base,color:p.color,width:o,height:r,padding:O,enableSpacers:y,isVisible:g}),[p.base,p.color,o,r,O,y,g]),N=l.useMemo(()=>k(M.containerStyle,a),[M.containerStyle,a]),P=l.useMemo(()=>U(m,v,i),[m,v,i]);return y?(0,u.jsxs)(`div`,{ref:j,"data-testid":`padder`,className:c.f(...M.classTokens.map(e=>H[e]),t),style:N,children:[(0,u.jsxs)(u.Fragment,{children:[O.top>=0&&(0,u.jsx)(`div`,{style:W,children:P(`100%`,O.top)}),O.left>=0&&(0,u.jsx)(`div`,{style:G,children:P(O.left,`100%`)})]}),(0,u.jsx)(`div`,{"data-testid":`padder-content`,className:H.content,style:K,children:e}),(0,u.jsxs)(u.Fragment,{children:[O.right>=0&&(0,u.jsx)(`div`,{style:G,children:P(O.right,`100%`)}),O.bottom>=0&&(0,u.jsx)(`div`,{style:W,children:P(`100%`,O.bottom)})]})]}):(0,u.jsx)(`div`,{ref:j,"data-testid":`padder`,className:c.f(...M.classTokens.map(e=>H[e]),t),style:N,children:e})})),J={box:`box_sPqFs`,v:`v_ZrZ5j`},Y=l.memo(l.forwardRef(function({children:e,snapping:t=`clamp`,debugging:n,className:r,colSpan:i,rowSpan:a,span:o,width:s,height:d,style:f,ssrMode:p=!1,...m},g){let _=T(`box`),{isShown:v,debugging:y}=E(n,_.debugging),b=D(),x=l.useRef(null),{top:C,bottom:w,left:O,right:j}=c.h(m),M=S(x,{base:_.base,snapping:t,spacing:{top:C,bottom:w,left:O,right:j}}),{padding:N}=z(b&&!p,{padding:{top:C||0,right:j||0,bottom:w||0,left:O||0}},M),P=l.useMemo(()=>c.r({base:_.base,lineColor:_.colors.line,width:s,height:d,span:o,colSpan:i,rowSpan:a,isVisible:v}),[_.base,_.colors.line,s,d,o,i,a,v]),F=l.useMemo(()=>k(P.boxStyle,f),[P.boxStyle,f]);return(0,u.jsx)(`div`,{ref:A(g,x),"data-testid":`box`,className:c.f(...P.classTokens.map(e=>J[e]),r),style:k(F,P.gridSpanStyle),children:(0,u.jsx)(h,{base:1,spacer:{variant:`flat`},children:(0,u.jsx)(q,{block:[N.top,N.bottom],inline:[N.left,N.right],width:`fit-content`,height:d,debugging:y,ssrMode:!0,children:e})})})}));exports.Baseline=N,exports.Box=Y,exports.Config=h,exports.Guide=F,exports.Padder=q,exports.Spacer=V,exports.isSSR=L,exports.safeClientValue=R;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,s)=>(s=n==null?{}:e(i(n)),o(r||!n||!n.__esModule||!a.call(n,`default`)?t(s,`default`,{value:n,enumerable:!0}):s,n));const c=require("./src-R5usYJol.cjs");let l=require("react");l=s(l,1);let u=require("react/jsx-runtime");var d=`__baseline_kit_config_context__`,f=globalThis,p=f[d]??(f[d]=l.createContext(c.k));p.displayName=`ConfigContext`;var m=()=>l.use(p);function h({children:e,base:t,baseline:n,guide:r,spacer:i,box:a,padder:o}){let s=m(),d=l.useMemo(()=>c.O({parentConfig:s,base:t,baseline:n,guide:r,spacer:i,box:a,padder:o}),[s,t,n,r,i,a,o]);return(0,u.jsx)(p,{value:d,children:e})}var g=e=>{let t=null,n=null;return[(...r)=>{n=r,t!==null&&cancelAnimationFrame(t),t=requestAnimationFrame(()=>{e(...n),t=null,n=null})},()=>{t!==null&&(cancelAnimationFrame(t),t=null,n=null)}]};function _(e,t){let n={width:0,height:0},r=()=>{try{let r=e.getBoundingClientRect(),i={width:Math.round(r.width),height:Math.round(r.height)};(i.width!==n.width||i.height!==n.height)&&(n=i,t(i))}catch{}},[i,a]=g(r);r();let o=new ResizeObserver(i);return o.observe(e),{refresh:i,disconnect(){o.disconnect(),a()}}}var v={width:0,height:0};function y(e){let[t,n]=l.useState(v),r=l.useRef(null);l.useLayoutEffect(()=>{if(typeof window>`u`||!e.current)return;let t=_(e.current,e=>{n(t=>t.width===e.width&&t.height===e.height?t:e)});return r.current=t,()=>{t.disconnect(),r.current=null}},[e]);let i=l.useCallback(()=>{r.current?.refresh()},[]);return{...t,refresh:i}}function b(e,t,n){let{totalItems:r,itemHeight:i,buffer:a=0}=t;if(!Number.isFinite(i)||i<=0)throw Error(`createVirtualTracker requires itemHeight to be greater than 0`);if(!Number.isFinite(r)||r<0)throw Error(`createVirtualTracker requires totalItems to be 0 or greater`);let o=()=>{let t=e.getBoundingClientRect().top+window.scrollY,n=Math.max(0,window.scrollY-t-a),o=n+window.innerHeight+a*2;return{start:Math.max(0,Math.floor(n/i)),end:Math.min(r,Math.ceil(o/i))}},s={start:0,end:r},[c,l]=g(()=>{let e=o();(e.start!==s.start||e.end!==s.end)&&(s=e,n(e))}),u={passive:!0};window.addEventListener(`scroll`,c,u),window.addEventListener(`resize`,c,u);let d=new IntersectionObserver(c,{threshold:0});return d.observe(e),c(),{refresh:c,disconnect(){window.removeEventListener(`scroll`,c,u),window.removeEventListener(`resize`,c,u),d.disconnect(),l()}}}function x({totalLines:e,lineHeight:t,containerRef:n,buffer:r=0}){let i=typeof r==`number`?r:parseInt(r,10)||0,[a,o]=(0,l.useState)({start:0,end:e}),s=(0,l.useCallback)(e=>{o(t=>t.start===e.start&&t.end===e.end?t:e)},[]);return(0,l.useLayoutEffect)(()=>{if(!n.current)return;o(t=>t.start===0&&t.end===e?t:{start:0,end:e});let r=b(n.current,{totalItems:e,itemHeight:t,buffer:i},s);return()=>r.disconnect()},[n,e,t,i,s]),a}function S(e,{base:t=8,snapping:n=`none`,snapEdge:r=`bottom`,spacing:i={}}={}){if(t<1)throw Error(`Base must be >= 1 for baseline alignment.`);let{height:a}=y(e),o=l.useRef(null);return l.useMemo(()=>{let e=c.h({padding:i}),s=a%t===0;if(n===`none`)return{padding:e,isAligned:s,height:a};if(o.current)return{padding:o.current,isAligned:s,height:a};if(a===0)return{padding:e,isAligned:s,height:a};let l=c.m(a,t,e,{mode:n,snapEdge:r});return o.current=l,{padding:l,isAligned:s,height:a}},[t,n,r,i,a])}function C(){return typeof window>`u`?{}:{viewportWidth:window.innerWidth,viewportHeight:window.innerHeight}}function w(e,t){let{width:n}=y(e);return l.useMemo(()=>c.s(n,t,C()),[t,n])}function T(e){let t=m();return(0,l.useMemo)(()=>Object.assign({base:t.base},t[e]),[t,e])}function E(e,t){return(0,l.useMemo)(()=>c.p(e,t),[e,t])}function D(){let[e,t]=(0,l.useState)(!1);return(0,l.useEffect)(()=>{t(!0)},[]),e}function O({children:e,fallback:t=null}){return D()?(0,u.jsx)(u.Fragment,{children:e}):(0,u.jsx)(u.Fragment,{children:t})}function k(...e){return Object.assign({},...e.filter(Boolean))}function A(...e){return t=>{e.forEach(e=>{e&&(typeof e==`function`?e(t):Object.assign(e,{current:t}))})}}var j={bas:`bas_4Emvv`,v:`v_lNfeX`,h:`h_PbNDU`,row:`row_J1Wva`,ssr:`ssr_PQAP-`},M=l.memo(function({className:e,debugging:t,style:n,variant:r,height:i,width:a,base:o,color:s,...d}){let f=T(`baseline`),{isShown:p}=E(t,f.debugging),m=l.useRef(null),{width:h,height:g}=y(m),_=o||f.base,v=l.useMemo(()=>c.i({base:_,colors:f.colors,variant:r??f.variant,width:a,height:i,color:s,containerWidth:h,containerHeight:g,spacing:d,isVisible:p}),[_,f.colors,f.variant,r,a,i,s,h,g,d,p]),{start:b,end:S}=x({totalLines:v.rowCount,lineHeight:_,containerRef:m,buffer:160}),C=l.useMemo(()=>k(v.containerStyle,n),[v.containerStyle,n]);return(0,u.jsx)(`div`,{ref:m,"data-testid":`baseline`,"aria-hidden":`true`,className:c.f(...v.classTokens.map(e=>j[e]),e),style:C,...d,children:p&&Array.from({length:S-b},(e,t)=>{let n=t+b;return(0,u.jsx)(`div`,{className:j.row,"data-row-index":n,style:v.getRowStyle(n)},n)})})}),N=l.memo(function({className:e,debugging:t,style:n,variant:r,height:i,width:a,base:o,color:s,ssrMode:l=!1,...d}){let f=T(`baseline`),p=r??f.variant,m=o??f.base,{isShown:h}=E(t,f.debugging);if(!h)return(0,u.jsx)(`div`,{className:c.f(j.bas,j.h,e),style:n,"data-testid":`baseline`,"aria-hidden":`true`,...d});let g=(0,u.jsx)(`div`,{className:c.f(j.bas,j.h,j.ssr,e),style:{width:a??`100%`,height:i??`100%`,...n},"data-testid":`baseline`,"aria-hidden":`true`});return l?g:(0,u.jsx)(O,{fallback:g,children:(0,u.jsx)(M,{className:e,debugging:t,style:n,variant:p,height:i,width:a,base:m,color:s,...d})})}),P={gde:`gde_4PKz3`,v:`v_yAvN0`,h:`h_XcWcy`,line:`line_UaLjW`,cols:`cols_ibtT4`,col:`col_QPSDI`,ssr:`ssr_4UN4k`},F=l.memo(function({className:e,debugging:t,style:n,variant:r,align:i=`center`,gap:a,height:o,width:s,columns:l,columnWidth:d,maxWidth:f,color:p,children:m,ssrMode:h=!1,...g}){let _=T(`guide`),v=r??_.variant,y=typeof a==`number`?a:0,{isShown:b}=E(t,_.debugging);if(!b)return(0,u.jsx)(`div`,{className:c.f(P.gde,P.h,e),style:n,"data-testid":`guide`,"data-variant":v,"aria-hidden":`true`,...g,children:m});let x=(0,u.jsx)(`div`,{className:c.f(P.gde,P.h,P.ssr,e),style:{width:s??`100%`,height:o??`100%`,maxWidth:f??`none`,...n},"data-testid":`guide`,"data-variant":v,"aria-hidden":`true`,children:m});return h?x:(0,u.jsx)(O,{fallback:x,children:(0,u.jsx)(I,{className:e,debugging:t,style:n,variant:v,align:i,gap:y,height:o,width:s,columns:l,columnWidth:d,maxWidth:f,color:p,...g,children:m})})}),I=l.memo(function({className:e,debugging:t,style:n,variant:r,align:i=`center`,gap:a,height:o,width:s,columns:d,columnWidth:f,maxWidth:p,color:m,children:h,...g}){let _=T(`guide`),{isShown:v}=E(t,_.debugging),b=l.useRef(null);y(b);let x=r??_.variant,S=typeof a==`number`?a:0,{template:C,columnsCount:D,calculatedGap:O}=w(b,l.useMemo(()=>c.a({variant:x,base:_.base,gap:S,columns:d,columnWidth:f}),[x,_.base,S,d,f])),A=l.useMemo(()=>c.o({base:_.base,colors:_.colors,variant:x,align:i||`center`,width:s,height:o,columnWidth:f,maxWidth:p,color:m,template:C,columnsCount:D,calculatedGap:O,isVisible:v}),[_.base,_.colors,x,i,s,o,f,p,m,C,D,O,v]),j=l.useMemo(()=>k(A.containerStyle,n),[A.containerStyle,n]);return(0,u.jsxs)(`div`,{ref:b,"data-testid":`guide`,"aria-hidden":`true`,className:c.f(...A.classTokens.map(e=>P[e]),e),"data-variant":r,style:j,...g,children:[v&&(0,u.jsx)(`div`,{className:P.cols,"data-variant":r,children:!A.isLineVariant&&Array.from({length:A.columnsCount},(e,t)=>(0,u.jsx)(`div`,{className:P.col,"data-column-index":t,"data-variant":r},t))}),h]})}),L=typeof window>`u`;function R(e,t){if(L)return t;try{return e()}catch{return t}}function z(e,t,n){return!e||L?t:n}var B={spr:`spr_syfhf`,line:`line_nzGsp`,flat:`flat_XJWHt`,indicator:`indicator_inw1x`},V=l.memo(function({height:e,width:t,indicatorNode:n,debugging:r,variant:i,base:a,color:o,className:s,style:d,children:f,ssrMode:p=!1,...m}){let h=l.useRef(null),g=T(`spacer`),{isShown:_}=E(r,g.debugging),v=i??g.variant,y=a??g.base,b=D(),x=l.useMemo(()=>c.n({base:y,colors:g.colors,width:t,height:e,color:o,variant:v,isVisible:_}),[y,g.colors,t,e,o,v,_]),S=z(b&&!p,!1,_&&n!==void 0),C=l.useMemo(()=>{if(!S)return null;let e=x.normWidth,t=x.normHeight;return(0,u.jsxs)(u.Fragment,{children:[t!==0&&(0,u.jsx)(`span`,{className:B.indicator,"aria-hidden":`true`,children:n(t,`height`)},`height`),e!==0&&(0,u.jsx)(`span`,{className:B.indicator,"aria-hidden":`true`,children:n(e,`width`)},`width`)]})},[S,n,x.normWidth,x.normHeight]),w=l.useMemo(()=>k(x.style,d),[x.style,d]);return(0,u.jsxs)(`div`,{ref:h,"data-testid":`spacer`,className:c.f(...x.classTokens.map(e=>B[e]),s),"data-variant":v,"data-height":typeof x.normHeight==`number`?`${x.normHeight}px`:x.normHeight,style:w,...m,children:[C,f]})}),H={pad:`pad_NizuS`,content:`content_xFX0U`,v:`v_dowAz`},U=(e,t,n)=>{let r=e||`line`,i=t||`none`,a=(e,t)=>(0,u.jsx)(V,{variant:r,debugging:t===0||e===0?`none`:i,indicatorNode:n,height:t===`100%`?void 0:t,width:e===`100%`?void 0:e});return a.displayName=`PadderSpacer`,a},W={gridColumn:`1 / -1`},G={gridRow:`2 / 3`},K={gridRow:`2 / 3`,gridColumn:`2 / 3`},q=l.memo(l.forwardRef(function({children:e,className:t,debugging:n,height:r,indicatorNode:i,style:a,width:o,ssrMode:s=!1,...d},f){let p=T(`padder`),{variant:m}=T(`spacer`),h=l.useMemo(()=>c.h(d),[d]),{isShown:g,isNone:_,debugging:v}=E(n,p.debugging),y=!_,b=D(),x=l.useRef(null),C=S(x,{base:p.base,snapping:`height`,spacing:h}),w={padding:{top:h.top||0,right:h.right||0,bottom:h.bottom||0,left:h.left||0}},{padding:O}=z(b&&!s,w,C),j=A(f,x),M=l.useMemo(()=>c.t({base:p.base,color:p.color,width:o,height:r,padding:O,enableSpacers:y,isVisible:g}),[p.base,p.color,o,r,O,y,g]),N=l.useMemo(()=>k(M.containerStyle,a),[M.containerStyle,a]),P=l.useMemo(()=>U(m,v,i),[m,v,i]);return y?(0,u.jsxs)(`div`,{ref:j,"data-testid":`padder`,className:c.f(...M.classTokens.map(e=>H[e]),t),style:N,children:[(0,u.jsxs)(u.Fragment,{children:[O.top>=0&&(0,u.jsx)(`div`,{style:W,children:P(`100%`,O.top)}),O.left>=0&&(0,u.jsx)(`div`,{style:G,children:P(O.left,`100%`)})]}),(0,u.jsx)(`div`,{"data-testid":`padder-content`,className:H.content,style:K,children:e}),(0,u.jsxs)(u.Fragment,{children:[O.right>=0&&(0,u.jsx)(`div`,{style:G,children:P(O.right,`100%`)}),O.bottom>=0&&(0,u.jsx)(`div`,{style:W,children:P(`100%`,O.bottom)})]})]}):(0,u.jsx)(`div`,{ref:j,"data-testid":`padder`,className:c.f(...M.classTokens.map(e=>H[e]),t),style:N,children:e})})),J={box:`box_sPqFs`,v:`v_ZrZ5j`},Y=l.memo(l.forwardRef(function({children:e,snapping:t=`clamp`,snapEdge:n=`bottom`,debugging:r,className:i,colSpan:a,rowSpan:o,span:s,width:d,height:f,style:p,ssrMode:m=!1,...g},_){let v=T(`box`),{isShown:y,debugging:b}=E(r,v.debugging),x=D(),C=l.useRef(null),{top:w,bottom:O,left:j,right:M}=c.h(g),N=S(C,{base:v.base,snapping:t,snapEdge:n,spacing:{top:w,bottom:O,left:j,right:M}}),{padding:P}=z(x&&!m,{padding:{top:w||0,right:M||0,bottom:O||0,left:j||0}},N),F=l.useMemo(()=>c.r({base:v.base,lineColor:v.colors.line,width:d,height:f,span:s,colSpan:a,rowSpan:o,isVisible:y}),[v.base,v.colors.line,d,f,s,a,o,y]),I=l.useMemo(()=>k(F.boxStyle,p),[F.boxStyle,p]);return(0,u.jsx)(`div`,{ref:A(_,C),"data-testid":`box`,className:c.f(...F.classTokens.map(e=>J[e]),i),style:k(I,F.gridSpanStyle),children:(0,u.jsx)(h,{base:1,spacer:{variant:`flat`},children:(0,u.jsx)(q,{block:[P.top,P.bottom],inline:[P.left,P.right],width:`fit-content`,height:f,debugging:b,ssrMode:!0,children:e})})})}));exports.Baseline=N,exports.Box=Y,exports.Config=h,exports.Guide=F,exports.Padder=q,exports.Spacer=V,exports.isSSR=L,exports.safeClientValue=R;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":[],"sources":["../packages/react/src/components/Config/Config.tsx","../packages/dom/src/timing.ts","../packages/dom/src/measure.ts","../packages/react/src/hooks/useMeasure.ts","../packages/dom/src/virtual.ts","../packages/react/src/hooks/useVirtual.ts","../packages/react/src/hooks/useBaseline.ts","../packages/dom/src/viewport.ts","../packages/react/src/hooks/useGuide.ts","../packages/react/src/hooks/useConfig.ts","../packages/react/src/hooks/useDebug.ts","../packages/react/src/hooks/useIsClient.ts","../packages/react/src/utils/ssr.tsx","../packages/react/src/utils/merge.ts","../packages/react/src/components/Baseline/styles.module.css","../packages/react/src/components/Baseline/Baseline.tsx","../packages/react/src/components/Guide/styles.module.css","../packages/react/src/components/Guide/Guide.tsx","../packages/dom/src/ssr.ts","../packages/react/src/components/Spacer/styles.module.css","../packages/react/src/components/Spacer/Spacer.tsx","../packages/react/src/components/Padder/styles.module.css","../packages/react/src/components/Padder/Padder.tsx","../packages/react/src/components/Box/styles.module.css","../packages/react/src/components/Box/Box.tsx"],"sourcesContent":["import * as React from 'react'\nimport type { ConfigSchema } from '@baseline-kit/core/config/schema'\nimport { DEFAULT_CONFIG } from '@baseline-kit/core/config/defaults'\nimport {\n type ConfigOverrides,\n mergeConfig,\n createCSSVariables,\n} from '@baseline-kit/core/config/merge'\n\n// Re-export types that consumers need\nexport type { DebuggingMode } from '@baseline-kit/core/types'\nexport type { ConfigSchema } from '@baseline-kit/core/config/schema'\n\n// Root and guide are published as separate bundles. Keep their context\n// identity shared when an application imports both entry points.\nconst CONFIG_CONTEXT_KEY = '__baseline_kit_config_context__'\nconst contextStore = globalThis as typeof globalThis & {\n [CONFIG_CONTEXT_KEY]?: React.Context<ConfigSchema>\n}\nconst ConfigContext =\n contextStore[CONFIG_CONTEXT_KEY] ??\n (contextStore[CONFIG_CONTEXT_KEY] = React.createContext(DEFAULT_CONFIG))\nConfigContext.displayName = 'ConfigContext'\n\n// Update to use React 19's use hook instead of useContext\nexport const useDefaultConfig = () => React.use(ConfigContext)\n\ntype ConfigProps = ConfigOverrides & {\n children: React.ReactNode\n}\n\n/**\n * Configuration provider for baseline-kit components.\n */\nexport function Config({\n children,\n base,\n baseline,\n guide,\n spacer,\n box,\n padder,\n}: ConfigProps) {\n const parentConfig = useDefaultConfig()\n\n const value = React.useMemo(() => {\n return mergeConfig({\n parentConfig,\n base,\n baseline,\n guide,\n spacer,\n box,\n padder,\n })\n }, [parentConfig, base, baseline, guide, spacer, box, padder])\n\n return <ConfigContext value={value}>{children}</ConfigContext>\n}\n\n// Re-export createCSSVariables and mergeConfig for consumers\nexport { createCSSVariables, mergeConfig }\n","export const debounce = <T extends (...args: unknown[]) => void>(\n fn: T,\n delay: number\n): [T, () => void] => {\n let timer: ReturnType<typeof setTimeout> | null = null\n\n const cancel = () => {\n if (timer) {\n clearTimeout(timer)\n timer = null\n }\n }\n\n const debounced = ((...args) => {\n cancel()\n timer = setTimeout(() => fn(...args), delay)\n }) as T\n\n return [debounced, cancel]\n}\n\nexport const rafThrottle = <T extends (...args: never[]) => void>(\n fn: T\n): [T, () => void] => {\n let rafId: number | null = null\n let lastArgs: Parameters<T> | null = null\n\n const cancel = () => {\n if (rafId !== null) {\n cancelAnimationFrame(rafId)\n rafId = null\n lastArgs = null\n }\n }\n\n const throttled = (...args: Parameters<T>) => {\n lastArgs = args\n\n if (rafId !== null) {\n cancelAnimationFrame(rafId)\n }\n\n rafId = requestAnimationFrame(() => {\n fn(...lastArgs!)\n rafId = null\n lastArgs = null\n })\n }\n\n return [throttled as T, cancel]\n}\n","/**\n * Element measurement observer.\n */\n\nimport { rafThrottle } from './timing'\n\nexport interface MeasureRect {\n width: number\n height: number\n}\n\nexport interface MeasureObserverHandle {\n /** Force an immediate re-measure */\n refresh(): void\n /** Stop observing */\n disconnect(): void\n}\n\n/**\n * Observes an element's dimensions via ResizeObserver.\n * Calls `onChange` with rounded width/height whenever the size changes.\n */\nexport function createMeasureObserver(\n el: Element,\n onChange: (rect: MeasureRect) => void\n): MeasureObserverHandle {\n let prev: MeasureRect = { width: 0, height: 0 }\n\n const measure = () => {\n try {\n const rect = el.getBoundingClientRect()\n const next: MeasureRect = {\n width: Math.round(rect.width),\n height: Math.round(rect.height),\n }\n if (next.width !== prev.width || next.height !== prev.height) {\n prev = next\n onChange(next)\n }\n } catch {\n // element may have been removed\n }\n }\n\n const [throttledMeasure, cancelMeasure] = rafThrottle(measure)\n\n // Initial measurement\n measure()\n\n const observer = new ResizeObserver(throttledMeasure)\n observer.observe(el)\n\n return {\n refresh: throttledMeasure,\n disconnect() {\n observer.disconnect()\n cancelMeasure()\n },\n }\n}\n","import * as React from 'react'\nimport { createMeasureObserver } from '@baseline-kit/dom/measure'\nimport type { MeasureRect } from '@baseline-kit/dom/measure'\n\nexport interface MeasureResult extends MeasureRect {\n refresh: () => void\n}\n\nconst ZERO: MeasureRect = { width: 0, height: 0 }\n\n/**\n * Hook for measuring and tracking DOM element dimensions.\n * Thin wrapper around the imperative createMeasureObserver from @baseline-kit/dom.\n */\nexport function useMeasure(\n ref: React.RefObject<HTMLElement | null>\n): MeasureResult {\n const [dimensions, setDimensions] = React.useState<MeasureRect>(ZERO)\n const handleRef = React.useRef<ReturnType<\n typeof createMeasureObserver\n > | null>(null)\n\n React.useLayoutEffect(() => {\n if (typeof window === 'undefined' || !ref.current) return\n\n const handle = createMeasureObserver(ref.current, (rect) => {\n setDimensions((prev) =>\n prev.width === rect.width && prev.height === rect.height ? prev : rect\n )\n })\n handleRef.current = handle\n\n return () => {\n handle.disconnect()\n handleRef.current = null\n }\n }, [ref])\n\n const refresh = React.useCallback(() => {\n handleRef.current?.refresh()\n }, [])\n\n return { ...dimensions, refresh }\n}\n","/**\n * Virtual scroll range tracker.\n */\n\nimport { rafThrottle } from './timing'\n\nexport interface VirtualRange {\n start: number\n end: number\n}\n\nexport interface VirtualTrackerOptions {\n totalItems: number\n itemHeight: number\n buffer?: number\n}\n\nexport interface VirtualTrackerHandle {\n /** Force recalculation */\n refresh(): void\n /** Stop tracking */\n disconnect(): void\n}\n\n/**\n * Tracks which slice of a virtual list is visible in the viewport.\n * Uses IntersectionObserver + window scroll/resize events.\n */\nexport function createVirtualTracker(\n el: Element,\n options: VirtualTrackerOptions,\n onChange: (range: VirtualRange) => void\n): VirtualTrackerHandle {\n const { totalItems, itemHeight, buffer = 0 } = options\n\n if (!Number.isFinite(itemHeight) || itemHeight <= 0) {\n throw new Error(\n 'createVirtualTracker requires itemHeight to be greater than 0'\n )\n }\n\n if (!Number.isFinite(totalItems) || totalItems < 0) {\n throw new Error(\n 'createVirtualTracker requires totalItems to be 0 or greater'\n )\n }\n\n const calculateRange = (): VirtualRange => {\n const rect = el.getBoundingClientRect()\n const offsetTop = rect.top + window.scrollY\n const viewportTop = Math.max(0, window.scrollY - offsetTop - buffer)\n const viewportBottom = viewportTop + window.innerHeight + buffer * 2\n\n const start = Math.max(0, Math.floor(viewportTop / itemHeight))\n const end = Math.min(totalItems, Math.ceil(viewportBottom / itemHeight))\n return { start, end }\n }\n\n let prev: VirtualRange = { start: 0, end: totalItems }\n\n const update = () => {\n const next = calculateRange()\n if (next.start !== prev.start || next.end !== prev.end) {\n prev = next\n onChange(next)\n }\n }\n\n const [throttledUpdate, cancelUpdate] = rafThrottle(update)\n\n const listenerOptions: AddEventListenerOptions = { passive: true }\n\n window.addEventListener('scroll', throttledUpdate, listenerOptions)\n window.addEventListener('resize', throttledUpdate, listenerOptions)\n\n const intersectionObserver = new IntersectionObserver(throttledUpdate, {\n threshold: 0,\n })\n intersectionObserver.observe(el)\n\n throttledUpdate()\n\n return {\n refresh: throttledUpdate,\n disconnect() {\n window.removeEventListener('scroll', throttledUpdate, listenerOptions)\n window.removeEventListener('resize', throttledUpdate, listenerOptions)\n intersectionObserver.disconnect()\n cancelUpdate()\n },\n }\n}\n","import { RefObject, useCallback, useLayoutEffect, useState } from 'react'\nimport { createVirtualTracker } from '@baseline-kit/dom/virtual'\nimport type { VirtualRange } from '@baseline-kit/dom/virtual'\n\ntype VirtualOptions = {\n totalLines: number\n lineHeight: number\n containerRef: RefObject<HTMLDivElement | null>\n buffer?: number | string\n}\n\n/**\n * Hook for optimizing large lists through virtual scrolling.\n * Thin wrapper around the imperative createVirtualTracker from @baseline-kit/dom.\n */\nexport function useVirtual({\n totalLines,\n lineHeight,\n containerRef,\n buffer = 0,\n}: VirtualOptions) {\n const numericBuffer =\n typeof buffer === 'number' ? buffer : parseInt(buffer, 10) || 0\n\n const [visibleRange, setVisibleRange] = useState<VirtualRange>({\n start: 0,\n end: totalLines,\n })\n\n const updateRange = useCallback((range: VirtualRange) => {\n setVisibleRange((prev) =>\n prev.start === range.start && prev.end === range.end ? prev : range\n )\n }, [])\n\n useLayoutEffect(() => {\n if (!containerRef.current) return\n\n // The first client measurement can change the descriptor's total line\n // count (for example, from a relative CSS height to the measured pixels).\n // Reset the range for that new total before tracking it; otherwise the\n // previous one-item fallback can remain mounted forever.\n setVisibleRange((prev) =>\n prev.start === 0 && prev.end === totalLines\n ? prev\n : { start: 0, end: totalLines }\n )\n\n const handle = createVirtualTracker(\n containerRef.current,\n { totalItems: totalLines, itemHeight: lineHeight, buffer: numericBuffer },\n updateRange\n )\n\n return () => handle.disconnect()\n }, [containerRef, totalLines, lineHeight, numericBuffer, updateRange])\n\n return visibleRange\n}\n","import * as React from 'react'\nimport type { SnappingMode, Padding } from '@baseline-kit/core'\nimport { parsePadding, calculateSnappedSpacing } from '@baseline-kit/core'\nimport { useMeasure } from './useMeasure'\n\nexport interface BaselineOptions {\n base?: number\n snapping?: SnappingMode\n spacing?: Partial<Padding> | number\n}\n\nexport interface BaselineResult {\n padding: Padding\n isAligned: boolean\n height: number\n}\n\n/**\n * Hook for managing baseline grid alignment in components.\n *\n * Snapping notes\n * --------------\n * `clamp` mode would oscillate without a latch: each snap tweaks the\n * element's padding which changes its measured height, which would\n * trigger another snap, and so on. We snap exactly once per mount on\n * the *first non-zero* measurement, then keep returning the snapped\n * padding for the rest of the element's life. Resizes after the first\n * snap intentionally do not re-snap (avoids visual jitter and the\n * `clamp` oscillation).\n */\nexport function useBaseline(\n ref: React.RefObject<HTMLElement | null>,\n { base = 8, snapping = 'none', spacing = {} }: BaselineOptions = {}\n): BaselineResult {\n if (base < 1) {\n throw new Error('Base must be >= 1 for baseline alignment.')\n }\n\n const { height } = useMeasure(ref)\n const snappedPaddingRef = React.useRef<Padding | null>(null)\n\n return React.useMemo(() => {\n const initialPadding = parsePadding({ padding: spacing })\n const isAligned = height % base === 0\n\n if (snapping === 'none') {\n return { padding: initialPadding, isAligned, height }\n }\n\n // Reuse the cached snap on subsequent renders.\n if (snappedPaddingRef.current) {\n return { padding: snappedPaddingRef.current, isAligned, height }\n }\n\n // Wait for a real measurement before snapping. Without this guard\n // the very first render (height = 0, before useMeasure settles)\n // would compute a no-op snap and prematurely poison the cache,\n // making real measurements never get snapped.\n if (height === 0) {\n return { padding: initialPadding, isAligned, height }\n }\n\n const finalPadding = calculateSnappedSpacing(\n height,\n base,\n initialPadding,\n snapping\n )\n snappedPaddingRef.current = finalPadding\n\n return { padding: finalPadding, isAligned, height }\n }, [base, snapping, spacing, height])\n}\n","import type { ConversionContext } from '@baseline-kit/core'\n\n/**\n * Returns the current browser viewport for vw/vh/vmin/vmax conversion.\n * Returns an empty object on the server so callers fall back to the\n * core defaults without crashing.\n */\nexport function getViewportContext(): Partial<ConversionContext> {\n if (typeof window === 'undefined') return {}\n return {\n viewportWidth: window.innerWidth,\n viewportHeight: window.innerHeight,\n }\n}\n","import * as React from 'react'\nimport type { GuideConfig } from '@baseline-kit/core/types'\nimport { calculateGuideTemplate } from '@baseline-kit/core/utils/grid'\nimport { getViewportContext } from '@baseline-kit/dom/viewport'\nimport { useMeasure } from './useMeasure'\n\nexport type { GuideResult } from '@baseline-kit/core/utils/grid'\n\n/**\n * Hook for calculating grid layout parameters based on container dimensions.\n */\nexport function useGuide(\n ref: React.RefObject<HTMLElement | null>,\n config: GuideConfig\n) {\n const { width } = useMeasure(ref)\n return React.useMemo(\n () => calculateGuideTemplate(width, config, getViewportContext()),\n [config, width]\n )\n}\n","import { useMemo } from 'react'\nimport type { ConfigSchema } from '@baseline-kit/core/config/schema'\nimport { useDefaultConfig } from '../components/Config/Config'\n\n/** Type helper that merges base configuration with component-specific settings. */\nexport type ComponentConfig<K extends keyof ConfigSchema> = ConfigSchema[K] & {\n base: number\n}\n\n/**\n * Hook for accessing component-specific theme configuration.\n */\nexport function useConfig<K extends keyof ConfigSchema>(\n component: K\n): ComponentConfig<K> {\n const defaultConfig = useDefaultConfig()\n return useMemo(() => {\n return Object.assign(\n { base: defaultConfig.base },\n defaultConfig[component]\n ) as ComponentConfig<K>\n }, [defaultConfig, component])\n}\n","import { useMemo } from 'react'\nimport { resolveDebugState } from '@baseline-kit/core/utils/merge'\nimport type { DebuggingMode } from '@baseline-kit/core/types'\n\n/**\n * Hook for managing component debug state and visibility.\n * Delegates to pure resolveDebugState in core.\n */\nexport function useDebug(\n debuggingProp?: DebuggingMode,\n debuggingConfig?: DebuggingMode\n) {\n return useMemo(\n () => resolveDebugState(debuggingProp, debuggingConfig),\n [debuggingProp, debuggingConfig]\n )\n}\n","import { useEffect, useState } from 'react'\n\n/**\n * Hook to determine if the code is running on the client side.\n */\nexport function useIsClient() {\n const [isClient, setIsClient] = useState(false)\n\n useEffect(() => {\n setIsClient(true)\n }, [])\n\n return isClient\n}\n","/**\n * React-specific SSR utilities (ClientOnly component)\n */\nimport * as React from 'react'\nimport { useIsClient } from '../hooks/useIsClient'\n\ninterface ClientOnlyProps {\n children: React.ReactNode\n fallback?: React.ReactNode\n}\n\n/**\n * A utility component that only renders its children on the client side.\n * @internal Not part of the public API\n */\nexport function ClientOnly({ children, fallback = null }: ClientOnlyProps) {\n const isClient = useIsClient()\n\n if (!isClient) {\n return <>{fallback}</>\n }\n\n return <>{children}</>\n}\n","import * as React from 'react'\n\n/**\n * Combines descriptor style records and React style objects.\n * Accepts Record<string, string> from descriptors and React.CSSProperties.\n */\nexport function mergeStyles(\n ...styles: Array<Record<string, string> | React.CSSProperties | undefined>\n): React.CSSProperties {\n return Object.assign({}, ...styles.filter(Boolean))\n}\n\n/**\n * Merges multiple React refs into a single callback ref.\n */\nexport function mergeRefs<T>(\n ...refs: Array<React.Ref<T> | null | undefined>\n): React.RefCallback<T> {\n return (node: T | null) => {\n refs.forEach((ref) => {\n if (!ref) return\n if (typeof ref === 'function') {\n ref(node)\n } else {\n Object.assign(ref, { current: node })\n }\n })\n }\n}\n",".bas {\n position: absolute;\n inset: 0;\n pointer-events: none;\n width: var(--bkbl-w);\n height: var(--bkbl-h);\n overflow: hidden;\n contain: layout style paint;\n}\n\n.v {\n opacity: 1;\n visibility: visible;\n transition:\n opacity var(--bk-transition-base),\n visibility 0ms linear;\n}\n\n.h {\n opacity: 0;\n visibility: hidden;\n transition:\n opacity var(--bk-transition-base),\n visibility 0ms linear 180ms;\n}\n\n.row {\n left: 0;\n right: 0;\n position: absolute;\n top: var(--bkbl-rt);\n height: var(--bkbl-rh);\n background-color: var(--bkbl-c);\n}\n\n/* Style for SSR rendering */\n.ssr {\n box-sizing: border-box;\n z-index: 1;\n pointer-events: none;\n}\n","import * as React from 'react'\nimport { ComponentsProps } from '../types'\nimport { useConfig, useDebug, useVirtual, useMeasure } from '../../hooks'\nimport { cx, createBaselineDescriptor } from '@baseline-kit/core'\nimport type { BaselineVariant } from '@baseline-kit/core'\nimport { ClientOnly } from '../../utils/ssr'\nimport { mergeStyles } from '../../utils/merge'\nimport styles from './styles.module.css'\n\nexport type { BaselineVariant }\n\nexport type BaselineProps = {\n variant?: BaselineVariant\n width?: number | string\n height?: number | string\n base?: number\n color?: string\n ssrMode?: boolean\n} & ComponentsProps\n\nconst BaselineImpl = React.memo(function BaselineImpl({\n className,\n debugging,\n style,\n variant,\n height: heightProp,\n width: widthProp,\n base,\n color: colorProp,\n ...spacingProps\n}: BaselineProps) {\n const config = useConfig('baseline')\n const { isShown } = useDebug(debugging, config.debugging)\n const containerRef = React.useRef<HTMLDivElement | null>(null)\n const { width: containerWidth, height: containerHeight } =\n useMeasure(containerRef)\n\n const resolvedBase = base || config.base\n\n const descriptor = React.useMemo(\n () =>\n createBaselineDescriptor({\n base: resolvedBase,\n colors: config.colors,\n variant: (variant as BaselineVariant) ?? config.variant,\n width: widthProp,\n height: heightProp,\n color: colorProp,\n containerWidth,\n containerHeight,\n spacing: spacingProps,\n isVisible: isShown,\n }),\n [\n resolvedBase,\n config.colors,\n config.variant,\n variant,\n widthProp,\n heightProp,\n colorProp,\n containerWidth,\n containerHeight,\n spacingProps,\n isShown,\n ]\n )\n\n const { start, end } = useVirtual({\n totalLines: descriptor.rowCount,\n lineHeight: resolvedBase,\n containerRef,\n buffer: 160,\n })\n\n const containerStyles = React.useMemo(\n () => mergeStyles(descriptor.containerStyle, style),\n [descriptor.containerStyle, style]\n )\n\n return (\n <div\n ref={containerRef}\n data-testid=\"baseline\"\n aria-hidden=\"true\"\n className={cx(...descriptor.classTokens.map((t) => styles[t]), className)}\n style={containerStyles}\n {...spacingProps}\n >\n {isShown &&\n Array.from({ length: end - start }, (_, i) => {\n const rowIndex = i + start\n return (\n <div\n className={styles.row}\n key={rowIndex}\n data-row-index={rowIndex}\n style={descriptor.getRowStyle(rowIndex)}\n />\n )\n })}\n </div>\n )\n})\n\nexport const Baseline = React.memo(function Baseline({\n className,\n debugging,\n style,\n variant: variantProp,\n height: heightProp,\n width: widthProp,\n base: baseProp,\n color: colorProp,\n ssrMode = false,\n ...spacingProps\n}: BaselineProps) {\n const config = useConfig('baseline')\n const variant = variantProp ?? config.variant\n const base = baseProp ?? config.base\n const { isShown } = useDebug(debugging, config.debugging)\n\n if (!isShown) {\n return (\n <div\n className={cx(styles.bas, styles.h, className)}\n style={style}\n data-testid=\"baseline\"\n aria-hidden=\"true\"\n {...spacingProps}\n />\n )\n }\n\n const ssrFallback = (\n <div\n className={cx(styles.bas, styles.h, styles.ssr, className)}\n style={{\n width: widthProp ?? '100%',\n height: heightProp ?? '100%',\n ...style,\n }}\n data-testid=\"baseline\"\n aria-hidden=\"true\"\n />\n )\n\n if (ssrMode) {\n return ssrFallback\n }\n\n return (\n <ClientOnly fallback={ssrFallback}>\n <BaselineImpl\n className={className}\n debugging={debugging}\n style={style}\n variant={variant}\n height={heightProp}\n width={widthProp}\n base={base}\n color={colorProp}\n {...spacingProps}\n />\n </ClientOnly>\n )\n})\n",".gde {\n position: absolute;\n inset: 0;\n box-sizing: border-box;\n width: var(--bkgd-w, 100%);\n height: var(--bkgd-h, 100%);\n max-width: var(--bkgd-mw, none);\n margin-inline: auto;\n pointer-events: none;\n padding: var(--bkgd-pb, 0) var(--bkgd-pi, 0);\n}\n\n.v {\n opacity: 1;\n visibility: visible;\n transition:\n opacity var(--bk-transition-base),\n visibility 0ms linear;\n}\n\n.h {\n opacity: 0;\n visibility: hidden;\n transition:\n opacity var(--bk-transition-base),\n visibility 0ms linear 180ms;\n}\n\n.line {\n left: -0.5px; /* Alignment correction for line variant */\n}\n\n.cols {\n position: absolute;\n inset: 0;\n display: grid;\n column-gap: var(--bkgd-g);\n grid-template-rows: 1fr;\n grid-template-columns: var(--bkgd-t);\n justify-content: var(--bkgd-j);\n width: var(--bk-wf);\n height: var(--bk-hf);\n overflow: hidden;\n contain: layout style paint;\n}\n\n.col {\n min-width: 0;\n width: var(--bk-wf);\n height: var(--bk-hf);\n}\n\n/* Variant-specific styles */\n.col[data-variant='line'] {\n width: 1px;\n background-color: var(--bkgd-cl);\n}\n\n.cols[data-variant='line'] {\n display: block;\n background-image: repeating-linear-gradient(\n to right,\n var(--bkgd-line-color, var(--bkgd-cl)) 0 1px,\n transparent 1px var(--bkgd-line-period, 1px)\n );\n}\n\n.col[data-variant='pattern'] {\n background-color: var(--bkgd-cp);\n}\n\n.col[data-variant='auto'] {\n background-color: var(--bkgd-ca);\n overflow: hidden;\n}\n\n.col[data-variant='fixed'] {\n background-color: var(--bkgd-cf);\n}\n\n/* Style for SSR rendering */\n.ssr {\n box-sizing: border-box;\n z-index: 1;\n pointer-events: none;\n}\n","import * as React from 'react'\nimport type { ComponentsProps } from '../types'\nimport { useConfig } from '../../hooks/useConfig'\nimport { useDebug } from '../../hooks/useDebug'\nimport { useMeasure } from '../../hooks/useMeasure'\nimport { useGuide } from '../../hooks/useGuide'\nimport { cx } from '@baseline-kit/core/utils/merge'\nimport {\n createGuideDescriptor,\n createGuideConfig,\n} from '@baseline-kit/core/descriptors/guide'\nimport type { GuideVariant, GuideConfig } from '@baseline-kit/core/types'\nimport { ClientOnly } from '../../utils/ssr'\nimport { mergeStyles } from '../../utils/merge'\nimport styles from './styles.module.css'\n\nexport type { GuideConfig }\n\nexport type GuideProps = {\n align?: React.CSSProperties['justifyContent']\n variant?: GuideVariant\n columns?: number | readonly (string | number | undefined | 'auto')[]\n columnWidth?: React.CSSProperties['width']\n maxWidth?: React.CSSProperties['maxWidth']\n color?: React.CSSProperties['color']\n children?: React.ReactNode\n gap?: number\n ssrMode?: boolean\n} & ComponentsProps &\n Omit<GuideConfig, 'columns' | 'columnWidth' | 'gap'>\n\nexport const Guide = React.memo(function Guide({\n className,\n debugging,\n style,\n variant: variantProp,\n align = 'center',\n gap: gapProp,\n height,\n width,\n columns,\n columnWidth,\n maxWidth,\n color,\n children,\n ssrMode = false,\n ...props\n}: GuideProps) {\n const config = useConfig('guide')\n const variant = variantProp ?? config.variant\n const gap = typeof gapProp === 'number' ? gapProp : 0\n const { isShown } = useDebug(debugging, config.debugging)\n\n if (!isShown) {\n return (\n <div\n className={cx(styles.gde, styles.h, className)}\n style={style}\n data-testid=\"guide\"\n data-variant={variant}\n aria-hidden=\"true\"\n {...props}\n >\n {children}\n </div>\n )\n }\n\n const ssrFallback = (\n <div\n className={cx(styles.gde, styles.h, styles.ssr, className)}\n style={{\n width: width ?? '100%',\n height: height ?? '100%',\n maxWidth: maxWidth ?? 'none',\n ...style,\n }}\n data-testid=\"guide\"\n data-variant={variant}\n aria-hidden=\"true\"\n >\n {children}\n </div>\n )\n\n if (ssrMode) {\n return ssrFallback\n }\n\n return (\n <ClientOnly fallback={ssrFallback}>\n <GuideImpl\n className={className}\n debugging={debugging}\n style={style}\n variant={variant}\n align={align}\n gap={gap}\n height={height}\n width={width}\n columns={columns}\n columnWidth={columnWidth}\n maxWidth={maxWidth}\n color={color}\n {...props}\n >\n {children}\n </GuideImpl>\n </ClientOnly>\n )\n})\n\nconst GuideImpl = React.memo(function GuideImpl({\n className,\n debugging,\n style,\n variant,\n align = 'center',\n gap,\n height,\n width,\n columns,\n columnWidth,\n maxWidth,\n color,\n children,\n ...props\n}: GuideProps) {\n const config = useConfig('guide')\n const { isShown } = useDebug(debugging, config.debugging)\n const containerRef = React.useRef<HTMLDivElement | null>(null)\n useMeasure(containerRef)\n\n const resolvedVariant = (variant ?? config.variant) as GuideVariant\n const resolvedGap = typeof gap === 'number' ? gap : 0\n\n const gridConfig = React.useMemo(\n () =>\n createGuideConfig({\n variant: resolvedVariant,\n base: config.base,\n gap: resolvedGap,\n columns,\n columnWidth: columnWidth as number | string | undefined,\n }),\n [resolvedVariant, config.base, resolvedGap, columns, columnWidth]\n )\n\n const { template, columnsCount, calculatedGap } = useGuide(\n containerRef,\n gridConfig\n )\n\n const descriptor = React.useMemo(\n () =>\n createGuideDescriptor({\n base: config.base,\n colors: config.colors,\n variant: resolvedVariant,\n align: align || 'center',\n width,\n height,\n columnWidth,\n maxWidth,\n color,\n template,\n columnsCount,\n calculatedGap,\n isVisible: isShown,\n }),\n [\n config.base,\n config.colors,\n resolvedVariant,\n align,\n width,\n height,\n columnWidth,\n maxWidth,\n color,\n template,\n columnsCount,\n calculatedGap,\n isShown,\n ]\n )\n\n const containerStyles = React.useMemo(\n () => mergeStyles(descriptor.containerStyle, style),\n [descriptor.containerStyle, style]\n )\n\n return (\n <div\n ref={containerRef}\n data-testid=\"guide\"\n aria-hidden=\"true\"\n className={cx(...descriptor.classTokens.map((t) => styles[t]), className)}\n data-variant={variant}\n style={containerStyles}\n {...props}\n >\n {isShown && (\n <div className={styles.cols} data-variant={variant}>\n {!descriptor.isLineVariant &&\n Array.from({ length: descriptor.columnsCount }, (_, i) => (\n <div\n key={i}\n className={styles.col}\n data-column-index={i}\n data-variant={variant}\n />\n ))}\n </div>\n )}\n {children}\n </div>\n )\n})\n","/**\n * Detects if code is running in a server-side environment\n */\nexport const isSSR = typeof window === 'undefined'\n\n/**\n * Default dimensions to use during server-side rendering\n */\nexport const SSR_DIMENSIONS = {\n width: 1024,\n height: 768,\n}\n\n/**\n * Safe window-using function that works in both server and client\n */\nexport function safeClientValue<T>(clientFn: () => T, fallback: T): T {\n if (isSSR) {\n return fallback\n }\n\n try {\n return clientFn()\n } catch {\n return fallback\n }\n}\n\n/**\n * Returns a stable value during SSR and initial render, then switches to\n * the dynamic value after hydration\n */\nexport function hydratedValue<T>(\n isHydrated: boolean,\n ssrValue: T,\n dynamicValue: T\n): T {\n return !isHydrated || isSSR ? ssrValue : dynamicValue\n}\n",".spr {\n position: relative;\n box-sizing: border-box;\n width: var(--bksp-w, 100%);\n height: var(--bksp-h, auto);\n flex-shrink: 0;\n display: block;\n margin: 0;\n padding: 0;\n}\n\n.line::after {\n content: '';\n position: absolute;\n inset: 0;\n border: 1px solid var(--bksp-cl, hsla(270, 60%, 40%, 0.6));\n z-index: calc(var(--bk-zi, 1));\n}\n\n.flat {\n background-color: var(--bksp-cf, hsla(230, 100%, 70%, 0.2));\n}\n\n.indicator {\n color: var(--bksp-ct, hsla(270, 60%, 40%, 1));\n}\n","import * as React from 'react'\nimport { useConfig, useDebug, useIsClient } from '../../hooks'\nimport { cx, createSpacerDescriptor } from '@baseline-kit/core'\nimport { hydratedValue } from '@baseline-kit/dom'\nimport { ComponentsProps, Variant } from '../types'\nimport { mergeStyles } from '../../utils/merge'\nimport styles from './styles.module.css'\n\nexport type IndicatorNode = (\n value: number,\n type: 'width' | 'height'\n) => React.ReactNode\n\nexport type SpacerProps = {\n width?: React.CSSProperties['width']\n height?: React.CSSProperties['height']\n variant?: Variant\n color?: string\n base?: number\n children?: React.ReactNode\n indicatorNode?: IndicatorNode\n ssrMode?: boolean\n} & ComponentsProps\n\nexport const Spacer = React.memo(function Spacer({\n height: heightProp,\n width: widthProp,\n indicatorNode,\n debugging: debuggingProp,\n variant: variantProp,\n base: baseProp,\n color: colorProp,\n className,\n style,\n children,\n ssrMode = false,\n ...props\n}: SpacerProps) {\n const ref = React.useRef<HTMLDivElement>(null)\n const config = useConfig('spacer')\n const { isShown } = useDebug(debuggingProp, config.debugging)\n const variant = variantProp ?? config.variant\n const base = baseProp ?? config.base\n\n const isHydrated = useIsClient()\n\n const descriptor = React.useMemo(\n () =>\n createSpacerDescriptor({\n base,\n colors: config.colors,\n width: widthProp as number | string | undefined,\n height: heightProp as number | string | undefined,\n color: colorProp,\n variant,\n isVisible: isShown,\n }),\n [base, config.colors, widthProp, heightProp, colorProp, variant, isShown]\n )\n\n const shouldShowMeasurements = hydratedValue(\n isHydrated && !ssrMode,\n false,\n isShown && indicatorNode !== undefined\n )\n\n const measurements = React.useMemo(() => {\n if (!shouldShowMeasurements) return null\n const w = descriptor.normWidth\n const h = descriptor.normHeight\n return (\n <>\n {h !== 0 && (\n <span key=\"height\" className={styles.indicator} aria-hidden=\"true\">\n {indicatorNode!(h, 'height')}\n </span>\n )}\n {w !== 0 && (\n <span key=\"width\" className={styles.indicator} aria-hidden=\"true\">\n {indicatorNode!(w, 'width')}\n </span>\n )}\n </>\n )\n }, [\n shouldShowMeasurements,\n indicatorNode,\n descriptor.normWidth,\n descriptor.normHeight,\n ])\n\n const baseStyles = React.useMemo(\n () => mergeStyles(descriptor.style, style),\n [descriptor.style, style]\n )\n\n return (\n <div\n ref={ref}\n data-testid=\"spacer\"\n className={cx(...descriptor.classTokens.map((t) => styles[t]), className)}\n data-variant={variant}\n data-height={\n typeof descriptor.normHeight === 'number'\n ? `${descriptor.normHeight}px`\n : descriptor.normHeight\n }\n style={baseStyles}\n {...props}\n >\n {measurements}\n {children}\n </div>\n )\n})\n",".pad {\n position: relative;\n display: grid;\n grid-template-columns: auto 1fr auto;\n grid-template-rows: auto 1fr auto;\n width: var(--bkpd-w, auto);\n height: var(--bkpd-h, auto);\n text-box-trim: trim-both;\n text-box-edge: ex alphabetic;\n}\n\n.content {\n text-box-trim: trim-both;\n text-box-edge: ex alphabetic;\n}\n\n.v::after {\n content: '';\n position: absolute;\n inset: 0;\n border: 1px solid var(--bkpd-c, var(--bk-padder-color-theme));\n pointer-events: none;\n z-index: var(--bk-zi);\n}\n","import * as React from 'react'\nimport { useConfig, useDebug, useBaseline, useIsClient } from '../../hooks'\nimport { cx, parsePadding, createPadderDescriptor } from '@baseline-kit/core'\nimport { hydratedValue } from '@baseline-kit/dom'\nimport { mergeStyles, mergeRefs } from '../../utils/merge'\nimport { ComponentsProps, Variant } from '../types'\nimport { Spacer, IndicatorNode } from '../Spacer'\nimport type { DebuggingMode } from '../types'\nimport styles from './styles.module.css'\n\nexport type PadderProps = {\n indicatorNode?: IndicatorNode\n ssrMode?: boolean\n children?: React.ReactNode\n} & ComponentsProps\n\nconst createRenderSpacerFn = (\n variant: Variant | undefined,\n debugging: DebuggingMode | undefined,\n indicatorNode?: IndicatorNode\n) => {\n const safeVariant = variant || 'line'\n const safeDebugging = debugging || 'none'\n\n const SpacerElement = (\n widthVal: React.CSSProperties['width'],\n heightVal: React.CSSProperties['height']\n ) => (\n <Spacer\n variant={safeVariant}\n debugging={heightVal === 0 || widthVal === 0 ? 'none' : safeDebugging}\n indicatorNode={indicatorNode}\n height={heightVal !== '100%' ? heightVal : undefined}\n width={widthVal !== '100%' ? widthVal : undefined}\n />\n )\n SpacerElement.displayName = 'PadderSpacer'\n return SpacerElement\n}\n\n// Static grid position styles — hoisted to avoid re-creation on render\nconst GRID_FULL_ROW: React.CSSProperties = { gridColumn: '1 / -1' }\nconst GRID_MID_COL: React.CSSProperties = { gridRow: '2 / 3' }\nconst GRID_CENTER: React.CSSProperties = {\n gridRow: '2 / 3',\n gridColumn: '2 / 3',\n}\n\nexport const Padder = React.memo(\n React.forwardRef<HTMLDivElement, PadderProps>(function Padder(\n {\n children,\n className,\n debugging: debuggingProp,\n height,\n indicatorNode,\n style,\n width,\n ssrMode = false,\n ...spacingProps\n },\n ref\n ) {\n const config = useConfig('padder')\n const { variant } = useConfig('spacer')\n const initialPadding = React.useMemo(\n () => parsePadding(spacingProps),\n [spacingProps]\n )\n const { isShown, isNone, debugging } = useDebug(\n debuggingProp,\n config.debugging\n )\n const enableSpacers = !isNone\n\n const isHydrated = useIsClient()\n const internalRef = React.useRef<HTMLDivElement | null>(null)\n\n const baselinePadding = useBaseline(internalRef, {\n base: config.base,\n snapping: 'height',\n spacing: initialPadding,\n })\n\n const stablePadding = {\n padding: {\n top: initialPadding.top || 0,\n right: initialPadding.right || 0,\n bottom: initialPadding.bottom || 0,\n left: initialPadding.left || 0,\n },\n }\n const { padding } = hydratedValue(\n isHydrated && !ssrMode,\n stablePadding,\n baselinePadding\n )\n\n const setRefs = mergeRefs(ref, internalRef)\n\n const descriptor = React.useMemo(\n () =>\n createPadderDescriptor({\n base: config.base,\n color: config.color,\n width: width as number | string | undefined,\n height: height as number | string | undefined,\n padding,\n enableSpacers,\n isVisible: isShown,\n }),\n [\n config.base,\n config.color,\n width,\n height,\n padding,\n enableSpacers,\n isShown,\n ]\n )\n\n const containerStyles = React.useMemo(\n () => mergeStyles(descriptor.containerStyle, style),\n [descriptor.containerStyle, style]\n )\n\n const renderSpacer = React.useMemo(\n () => createRenderSpacerFn(variant, debugging, indicatorNode),\n [variant, debugging, indicatorNode]\n )\n\n if (!enableSpacers) {\n return (\n <div\n ref={setRefs}\n data-testid=\"padder\"\n className={cx(\n ...descriptor.classTokens.map((t) => styles[t]),\n className\n )}\n style={containerStyles}\n >\n {children}\n </div>\n )\n }\n\n return (\n <div\n ref={setRefs}\n data-testid=\"padder\"\n className={cx(\n ...descriptor.classTokens.map((t) => styles[t]),\n className\n )}\n style={containerStyles}\n >\n <>\n {padding.top >= 0 && (\n <div style={GRID_FULL_ROW}>{renderSpacer('100%', padding.top)}</div>\n )}\n {padding.left >= 0 && (\n <div style={GRID_MID_COL}>{renderSpacer(padding.left, '100%')}</div>\n )}\n </>\n <div\n data-testid=\"padder-content\"\n className={styles.content}\n style={GRID_CENTER}\n >\n {children}\n </div>\n <>\n {padding.right >= 0 && (\n <div style={GRID_MID_COL}>\n {renderSpacer(padding.right, '100%')}\n </div>\n )}\n {padding.bottom >= 0 && (\n <div style={GRID_FULL_ROW}>\n {renderSpacer('100%', padding.bottom)}\n </div>\n )}\n </>\n </div>\n )\n })\n)\n",".box {\n position: relative;\n width: var(--bkbx-w);\n height: var(--bkbx-h);\n text-box-trim: trim-both;\n text-box-edge: ex alphabetic;\n}\n\n.v::after {\n content: '';\n position: absolute;\n inset: 0;\n border: 1px solid var(--bkbx-cl);\n pointer-events: none;\n z-index: var(--bk-zi);\n}\n","import * as React from 'react'\nimport { useConfig, useDebug, useBaseline, useIsClient } from '../../hooks'\nimport { cx, parsePadding, createBoxDescriptor } from '@baseline-kit/core'\nimport type { SnappingMode } from '@baseline-kit/core'\nimport { hydratedValue } from '@baseline-kit/dom'\nimport { mergeStyles, mergeRefs } from '../../utils/merge'\nimport { Config } from '../Config/Config'\nimport { Padder } from '../Padder'\nimport { ComponentsProps } from '../types'\nimport styles from './styles.module.css'\n\nexport type { SnappingMode }\n\nexport type BoxProps = {\n colSpan?: number\n rowSpan?: number\n span?: number\n snapping?: SnappingMode\n ssrMode?: boolean\n children?: React.ReactNode\n} & ComponentsProps\n\nexport const Box = React.memo(\n React.forwardRef<HTMLDivElement, BoxProps>(function Box(\n {\n children,\n snapping = 'clamp',\n debugging: debuggingProp,\n className,\n colSpan,\n rowSpan,\n span,\n width,\n height,\n style,\n ssrMode = false,\n ...spacingProps\n },\n ref\n ) {\n const config = useConfig('box')\n const { isShown, debugging } = useDebug(debuggingProp, config.debugging)\n\n const isHydrated = useIsClient()\n const internalRef = React.useRef<HTMLDivElement | null>(null)\n const { top, bottom, left, right } = parsePadding(spacingProps)\n\n const baselinePadding = useBaseline(internalRef, {\n base: config.base,\n snapping,\n spacing: { top, bottom, left, right },\n })\n\n const stablePadding = {\n padding: {\n top: top || 0,\n right: right || 0,\n bottom: bottom || 0,\n left: left || 0,\n },\n }\n const { padding } = hydratedValue(\n isHydrated && !ssrMode,\n stablePadding,\n baselinePadding\n )\n\n const descriptor = React.useMemo(\n () =>\n createBoxDescriptor({\n base: config.base,\n lineColor: config.colors.line,\n width,\n height,\n span,\n colSpan,\n rowSpan,\n isVisible: isShown,\n }),\n [\n config.base,\n config.colors.line,\n width,\n height,\n span,\n colSpan,\n rowSpan,\n isShown,\n ]\n )\n\n const boxStyles = React.useMemo(\n () => mergeStyles(descriptor.boxStyle, style),\n [descriptor.boxStyle, style]\n )\n\n return (\n <div\n ref={mergeRefs(ref, internalRef)}\n data-testid=\"box\"\n className={cx(\n ...descriptor.classTokens.map((t) => styles[t]),\n className\n )}\n style={mergeStyles(boxStyles, descriptor.gridSpanStyle)}\n >\n <Config base={1} spacer={{ variant: 'flat' }}>\n <Padder\n block={[padding.top, padding.bottom]}\n inline={[padding.left, padding.right]}\n width=\"fit-content\"\n height={height}\n debugging={debugging}\n // Box owns snapping; the inner Padder renders its resolved edges.\n ssrMode\n >\n {children}\n </Padder>\n </Config>\n </div>\n )\n })\n)\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","names":[],"sources":["../packages/react/src/components/Config/Config.tsx","../packages/dom/src/timing.ts","../packages/dom/src/measure.ts","../packages/react/src/hooks/useMeasure.ts","../packages/dom/src/virtual.ts","../packages/react/src/hooks/useVirtual.ts","../packages/react/src/hooks/useBaseline.ts","../packages/dom/src/viewport.ts","../packages/react/src/hooks/useGuide.ts","../packages/react/src/hooks/useConfig.ts","../packages/react/src/hooks/useDebug.ts","../packages/react/src/hooks/useIsClient.ts","../packages/react/src/utils/ssr.tsx","../packages/react/src/utils/merge.ts","../packages/react/src/components/Baseline/styles.module.css","../packages/react/src/components/Baseline/Baseline.tsx","../packages/react/src/components/Guide/styles.module.css","../packages/react/src/components/Guide/Guide.tsx","../packages/dom/src/ssr.ts","../packages/react/src/components/Spacer/styles.module.css","../packages/react/src/components/Spacer/Spacer.tsx","../packages/react/src/components/Padder/styles.module.css","../packages/react/src/components/Padder/Padder.tsx","../packages/react/src/components/Box/styles.module.css","../packages/react/src/components/Box/Box.tsx"],"sourcesContent":["import * as React from 'react'\nimport type { ConfigSchema } from '@baseline-kit/core/config/schema'\nimport { DEFAULT_CONFIG } from '@baseline-kit/core/config/defaults'\nimport {\n type ConfigOverrides,\n mergeConfig,\n createCSSVariables,\n} from '@baseline-kit/core/config/merge'\n\n// Re-export types that consumers need\nexport type { DebuggingMode } from '@baseline-kit/core/types'\nexport type { ConfigSchema } from '@baseline-kit/core/config/schema'\n\n// Root and guide are published as separate bundles. Keep their context\n// identity shared when an application imports both entry points.\nconst CONFIG_CONTEXT_KEY = '__baseline_kit_config_context__'\nconst contextStore = globalThis as typeof globalThis & {\n [CONFIG_CONTEXT_KEY]?: React.Context<ConfigSchema>\n}\nconst ConfigContext =\n contextStore[CONFIG_CONTEXT_KEY] ??\n (contextStore[CONFIG_CONTEXT_KEY] = React.createContext(DEFAULT_CONFIG))\nConfigContext.displayName = 'ConfigContext'\n\n// Update to use React 19's use hook instead of useContext\nexport const useDefaultConfig = () => React.use(ConfigContext)\n\ntype ConfigProps = ConfigOverrides & {\n children: React.ReactNode\n}\n\n/**\n * Configuration provider for baseline-kit components.\n */\nexport function Config({\n children,\n base,\n baseline,\n guide,\n spacer,\n box,\n padder,\n}: ConfigProps) {\n const parentConfig = useDefaultConfig()\n\n const value = React.useMemo(() => {\n return mergeConfig({\n parentConfig,\n base,\n baseline,\n guide,\n spacer,\n box,\n padder,\n })\n }, [parentConfig, base, baseline, guide, spacer, box, padder])\n\n return <ConfigContext value={value}>{children}</ConfigContext>\n}\n\n// Re-export createCSSVariables and mergeConfig for consumers\nexport { createCSSVariables, mergeConfig }\n","export const debounce = <T extends (...args: unknown[]) => void>(\n fn: T,\n delay: number\n): [T, () => void] => {\n let timer: ReturnType<typeof setTimeout> | null = null\n\n const cancel = () => {\n if (timer) {\n clearTimeout(timer)\n timer = null\n }\n }\n\n const debounced = ((...args) => {\n cancel()\n timer = setTimeout(() => fn(...args), delay)\n }) as T\n\n return [debounced, cancel]\n}\n\nexport const rafThrottle = <T extends (...args: never[]) => void>(\n fn: T\n): [T, () => void] => {\n let rafId: number | null = null\n let lastArgs: Parameters<T> | null = null\n\n const cancel = () => {\n if (rafId !== null) {\n cancelAnimationFrame(rafId)\n rafId = null\n lastArgs = null\n }\n }\n\n const throttled = (...args: Parameters<T>) => {\n lastArgs = args\n\n if (rafId !== null) {\n cancelAnimationFrame(rafId)\n }\n\n rafId = requestAnimationFrame(() => {\n fn(...lastArgs!)\n rafId = null\n lastArgs = null\n })\n }\n\n return [throttled as T, cancel]\n}\n","/**\n * Element measurement observer.\n */\n\nimport { rafThrottle } from './timing'\n\nexport interface MeasureRect {\n width: number\n height: number\n}\n\nexport interface MeasureObserverHandle {\n /** Force an immediate re-measure */\n refresh(): void\n /** Stop observing */\n disconnect(): void\n}\n\n/**\n * Observes an element's dimensions via ResizeObserver.\n * Calls `onChange` with rounded width/height whenever the size changes.\n */\nexport function createMeasureObserver(\n el: Element,\n onChange: (rect: MeasureRect) => void\n): MeasureObserverHandle {\n let prev: MeasureRect = { width: 0, height: 0 }\n\n const measure = () => {\n try {\n const rect = el.getBoundingClientRect()\n const next: MeasureRect = {\n width: Math.round(rect.width),\n height: Math.round(rect.height),\n }\n if (next.width !== prev.width || next.height !== prev.height) {\n prev = next\n onChange(next)\n }\n } catch {\n // element may have been removed\n }\n }\n\n const [throttledMeasure, cancelMeasure] = rafThrottle(measure)\n\n // Initial measurement\n measure()\n\n const observer = new ResizeObserver(throttledMeasure)\n observer.observe(el)\n\n return {\n refresh: throttledMeasure,\n disconnect() {\n observer.disconnect()\n cancelMeasure()\n },\n }\n}\n","import * as React from 'react'\nimport { createMeasureObserver } from '@baseline-kit/dom/measure'\nimport type { MeasureRect } from '@baseline-kit/dom/measure'\n\nexport interface MeasureResult extends MeasureRect {\n refresh: () => void\n}\n\nconst ZERO: MeasureRect = { width: 0, height: 0 }\n\n/**\n * Hook for measuring and tracking DOM element dimensions.\n * Thin wrapper around the imperative createMeasureObserver from @baseline-kit/dom.\n */\nexport function useMeasure(\n ref: React.RefObject<HTMLElement | null>\n): MeasureResult {\n const [dimensions, setDimensions] = React.useState<MeasureRect>(ZERO)\n const handleRef = React.useRef<ReturnType<\n typeof createMeasureObserver\n > | null>(null)\n\n React.useLayoutEffect(() => {\n if (typeof window === 'undefined' || !ref.current) return\n\n const handle = createMeasureObserver(ref.current, (rect) => {\n setDimensions((prev) =>\n prev.width === rect.width && prev.height === rect.height ? prev : rect\n )\n })\n handleRef.current = handle\n\n return () => {\n handle.disconnect()\n handleRef.current = null\n }\n }, [ref])\n\n const refresh = React.useCallback(() => {\n handleRef.current?.refresh()\n }, [])\n\n return { ...dimensions, refresh }\n}\n","/**\n * Virtual scroll range tracker.\n */\n\nimport { rafThrottle } from './timing'\n\nexport interface VirtualRange {\n start: number\n end: number\n}\n\nexport interface VirtualTrackerOptions {\n totalItems: number\n itemHeight: number\n buffer?: number\n}\n\nexport interface VirtualTrackerHandle {\n /** Force recalculation */\n refresh(): void\n /** Stop tracking */\n disconnect(): void\n}\n\n/**\n * Tracks which slice of a virtual list is visible in the viewport.\n * Uses IntersectionObserver + window scroll/resize events.\n */\nexport function createVirtualTracker(\n el: Element,\n options: VirtualTrackerOptions,\n onChange: (range: VirtualRange) => void\n): VirtualTrackerHandle {\n const { totalItems, itemHeight, buffer = 0 } = options\n\n if (!Number.isFinite(itemHeight) || itemHeight <= 0) {\n throw new Error(\n 'createVirtualTracker requires itemHeight to be greater than 0'\n )\n }\n\n if (!Number.isFinite(totalItems) || totalItems < 0) {\n throw new Error(\n 'createVirtualTracker requires totalItems to be 0 or greater'\n )\n }\n\n const calculateRange = (): VirtualRange => {\n const rect = el.getBoundingClientRect()\n const offsetTop = rect.top + window.scrollY\n const viewportTop = Math.max(0, window.scrollY - offsetTop - buffer)\n const viewportBottom = viewportTop + window.innerHeight + buffer * 2\n\n const start = Math.max(0, Math.floor(viewportTop / itemHeight))\n const end = Math.min(totalItems, Math.ceil(viewportBottom / itemHeight))\n return { start, end }\n }\n\n let prev: VirtualRange = { start: 0, end: totalItems }\n\n const update = () => {\n const next = calculateRange()\n if (next.start !== prev.start || next.end !== prev.end) {\n prev = next\n onChange(next)\n }\n }\n\n const [throttledUpdate, cancelUpdate] = rafThrottle(update)\n\n const listenerOptions: AddEventListenerOptions = { passive: true }\n\n window.addEventListener('scroll', throttledUpdate, listenerOptions)\n window.addEventListener('resize', throttledUpdate, listenerOptions)\n\n const intersectionObserver = new IntersectionObserver(throttledUpdate, {\n threshold: 0,\n })\n intersectionObserver.observe(el)\n\n throttledUpdate()\n\n return {\n refresh: throttledUpdate,\n disconnect() {\n window.removeEventListener('scroll', throttledUpdate, listenerOptions)\n window.removeEventListener('resize', throttledUpdate, listenerOptions)\n intersectionObserver.disconnect()\n cancelUpdate()\n },\n }\n}\n","import { RefObject, useCallback, useLayoutEffect, useState } from 'react'\nimport { createVirtualTracker } from '@baseline-kit/dom/virtual'\nimport type { VirtualRange } from '@baseline-kit/dom/virtual'\n\ntype VirtualOptions = {\n totalLines: number\n lineHeight: number\n containerRef: RefObject<HTMLDivElement | null>\n buffer?: number | string\n}\n\n/**\n * Hook for optimizing large lists through virtual scrolling.\n * Thin wrapper around the imperative createVirtualTracker from @baseline-kit/dom.\n */\nexport function useVirtual({\n totalLines,\n lineHeight,\n containerRef,\n buffer = 0,\n}: VirtualOptions) {\n const numericBuffer =\n typeof buffer === 'number' ? buffer : parseInt(buffer, 10) || 0\n\n const [visibleRange, setVisibleRange] = useState<VirtualRange>({\n start: 0,\n end: totalLines,\n })\n\n const updateRange = useCallback((range: VirtualRange) => {\n setVisibleRange((prev) =>\n prev.start === range.start && prev.end === range.end ? prev : range\n )\n }, [])\n\n useLayoutEffect(() => {\n if (!containerRef.current) return\n\n // The first client measurement can change the descriptor's total line\n // count (for example, from a relative CSS height to the measured pixels).\n // Reset the range for that new total before tracking it; otherwise the\n // previous one-item fallback can remain mounted forever.\n setVisibleRange((prev) =>\n prev.start === 0 && prev.end === totalLines\n ? prev\n : { start: 0, end: totalLines }\n )\n\n const handle = createVirtualTracker(\n containerRef.current,\n { totalItems: totalLines, itemHeight: lineHeight, buffer: numericBuffer },\n updateRange\n )\n\n return () => handle.disconnect()\n }, [containerRef, totalLines, lineHeight, numericBuffer, updateRange])\n\n return visibleRange\n}\n","import * as React from 'react'\nimport type { SnapEdge, SnappingMode, Padding } from '@baseline-kit/core'\nimport { parsePadding, calculateSnappedSpacing } from '@baseline-kit/core'\nimport { useMeasure } from './useMeasure'\n\nexport interface BaselineOptions {\n base?: number\n snapping?: SnappingMode\n snapEdge?: SnapEdge\n spacing?: Partial<Padding> | number\n}\n\nexport interface BaselineResult {\n padding: Padding\n isAligned: boolean\n height: number\n}\n\n/**\n * Hook for managing baseline grid alignment in components.\n *\n * Snapping notes\n * --------------\n * `clamp` mode would oscillate without a latch: each snap tweaks the\n * element's padding which changes its measured height, which would\n * trigger another snap, and so on. We snap exactly once per mount on\n * the *first non-zero* measurement, then keep returning the snapped\n * padding for the rest of the element's life. Resizes after the first\n * snap intentionally do not re-snap (avoids visual jitter and the\n * `clamp` oscillation).\n */\nexport function useBaseline(\n ref: React.RefObject<HTMLElement | null>,\n {\n base = 8,\n snapping = 'none',\n snapEdge = 'bottom',\n spacing = {},\n }: BaselineOptions = {}\n): BaselineResult {\n if (base < 1) {\n throw new Error('Base must be >= 1 for baseline alignment.')\n }\n\n const { height } = useMeasure(ref)\n const snappedPaddingRef = React.useRef<Padding | null>(null)\n\n return React.useMemo(() => {\n const initialPadding = parsePadding({ padding: spacing })\n const isAligned = height % base === 0\n\n if (snapping === 'none') {\n return { padding: initialPadding, isAligned, height }\n }\n\n // Reuse the cached snap on subsequent renders.\n if (snappedPaddingRef.current) {\n return { padding: snappedPaddingRef.current, isAligned, height }\n }\n\n // Wait for a real measurement before snapping. Without this guard\n // the very first render (height = 0, before useMeasure settles)\n // would compute a no-op snap and prematurely poison the cache,\n // making real measurements never get snapped.\n if (height === 0) {\n return { padding: initialPadding, isAligned, height }\n }\n\n const finalPadding = calculateSnappedSpacing(height, base, initialPadding, {\n mode: snapping,\n snapEdge,\n })\n snappedPaddingRef.current = finalPadding\n\n return { padding: finalPadding, isAligned, height }\n }, [base, snapping, snapEdge, spacing, height])\n}\n","import type { ConversionContext } from '@baseline-kit/core'\n\n/**\n * Returns the current browser viewport for vw/vh/vmin/vmax conversion.\n * Returns an empty object on the server so callers fall back to the\n * core defaults without crashing.\n */\nexport function getViewportContext(): Partial<ConversionContext> {\n if (typeof window === 'undefined') return {}\n return {\n viewportWidth: window.innerWidth,\n viewportHeight: window.innerHeight,\n }\n}\n","import * as React from 'react'\nimport type { GuideConfig } from '@baseline-kit/core/types'\nimport { calculateGuideTemplate } from '@baseline-kit/core/utils/grid'\nimport { getViewportContext } from '@baseline-kit/dom/viewport'\nimport { useMeasure } from './useMeasure'\n\nexport type { GuideResult } from '@baseline-kit/core/utils/grid'\n\n/**\n * Hook for calculating grid layout parameters based on container dimensions.\n */\nexport function useGuide(\n ref: React.RefObject<HTMLElement | null>,\n config: GuideConfig\n) {\n const { width } = useMeasure(ref)\n return React.useMemo(\n () => calculateGuideTemplate(width, config, getViewportContext()),\n [config, width]\n )\n}\n","import { useMemo } from 'react'\nimport type { ConfigSchema } from '@baseline-kit/core/config/schema'\nimport { useDefaultConfig } from '../components/Config/Config'\n\n/** Type helper that merges base configuration with component-specific settings. */\nexport type ComponentConfig<K extends keyof ConfigSchema> = ConfigSchema[K] & {\n base: number\n}\n\n/**\n * Hook for accessing component-specific theme configuration.\n */\nexport function useConfig<K extends keyof ConfigSchema>(\n component: K\n): ComponentConfig<K> {\n const defaultConfig = useDefaultConfig()\n return useMemo(() => {\n return Object.assign(\n { base: defaultConfig.base },\n defaultConfig[component]\n ) as ComponentConfig<K>\n }, [defaultConfig, component])\n}\n","import { useMemo } from 'react'\nimport { resolveDebugState } from '@baseline-kit/core/utils/merge'\nimport type { DebuggingMode } from '@baseline-kit/core/types'\n\n/**\n * Hook for managing component debug state and visibility.\n * Delegates to pure resolveDebugState in core.\n */\nexport function useDebug(\n debuggingProp?: DebuggingMode,\n debuggingConfig?: DebuggingMode\n) {\n return useMemo(\n () => resolveDebugState(debuggingProp, debuggingConfig),\n [debuggingProp, debuggingConfig]\n )\n}\n","import { useEffect, useState } from 'react'\n\n/**\n * Hook to determine if the code is running on the client side.\n */\nexport function useIsClient() {\n const [isClient, setIsClient] = useState(false)\n\n useEffect(() => {\n setIsClient(true)\n }, [])\n\n return isClient\n}\n","/**\n * React-specific SSR utilities (ClientOnly component)\n */\nimport * as React from 'react'\nimport { useIsClient } from '../hooks/useIsClient'\n\ninterface ClientOnlyProps {\n children: React.ReactNode\n fallback?: React.ReactNode\n}\n\n/**\n * A utility component that only renders its children on the client side.\n * @internal Not part of the public API\n */\nexport function ClientOnly({ children, fallback = null }: ClientOnlyProps) {\n const isClient = useIsClient()\n\n if (!isClient) {\n return <>{fallback}</>\n }\n\n return <>{children}</>\n}\n","import * as React from 'react'\n\n/**\n * Combines descriptor style records and React style objects.\n * Accepts Record<string, string> from descriptors and React.CSSProperties.\n */\nexport function mergeStyles(\n ...styles: Array<Record<string, string> | React.CSSProperties | undefined>\n): React.CSSProperties {\n return Object.assign({}, ...styles.filter(Boolean))\n}\n\n/**\n * Merges multiple React refs into a single callback ref.\n */\nexport function mergeRefs<T>(\n ...refs: Array<React.Ref<T> | null | undefined>\n): React.RefCallback<T> {\n return (node: T | null) => {\n refs.forEach((ref) => {\n if (!ref) return\n if (typeof ref === 'function') {\n ref(node)\n } else {\n Object.assign(ref, { current: node })\n }\n })\n }\n}\n",".bas {\n position: absolute;\n inset: 0;\n pointer-events: none;\n width: var(--bkbl-w);\n height: var(--bkbl-h);\n overflow: hidden;\n contain: layout style paint;\n}\n\n.v {\n opacity: 1;\n visibility: visible;\n transition:\n opacity var(--bk-transition-base),\n visibility 0ms linear;\n}\n\n.h {\n opacity: 0;\n visibility: hidden;\n transition:\n opacity var(--bk-transition-base),\n visibility 0ms linear 180ms;\n}\n\n.row {\n left: 0;\n right: 0;\n position: absolute;\n top: var(--bkbl-rt);\n height: var(--bkbl-rh);\n background-color: var(--bkbl-c);\n}\n\n/* Style for SSR rendering */\n.ssr {\n box-sizing: border-box;\n z-index: 1;\n pointer-events: none;\n}\n","import * as React from 'react'\nimport { ComponentsProps } from '../types'\nimport { useConfig, useDebug, useVirtual, useMeasure } from '../../hooks'\nimport { cx, createBaselineDescriptor } from '@baseline-kit/core'\nimport type { BaselineVariant } from '@baseline-kit/core'\nimport { ClientOnly } from '../../utils/ssr'\nimport { mergeStyles } from '../../utils/merge'\nimport styles from './styles.module.css'\n\nexport type { BaselineVariant }\n\nexport type BaselineProps = {\n variant?: BaselineVariant\n width?: number | string\n height?: number | string\n base?: number\n color?: string\n ssrMode?: boolean\n} & ComponentsProps\n\nconst BaselineImpl = React.memo(function BaselineImpl({\n className,\n debugging,\n style,\n variant,\n height: heightProp,\n width: widthProp,\n base,\n color: colorProp,\n ...spacingProps\n}: BaselineProps) {\n const config = useConfig('baseline')\n const { isShown } = useDebug(debugging, config.debugging)\n const containerRef = React.useRef<HTMLDivElement | null>(null)\n const { width: containerWidth, height: containerHeight } =\n useMeasure(containerRef)\n\n const resolvedBase = base || config.base\n\n const descriptor = React.useMemo(\n () =>\n createBaselineDescriptor({\n base: resolvedBase,\n colors: config.colors,\n variant: (variant as BaselineVariant) ?? config.variant,\n width: widthProp,\n height: heightProp,\n color: colorProp,\n containerWidth,\n containerHeight,\n spacing: spacingProps,\n isVisible: isShown,\n }),\n [\n resolvedBase,\n config.colors,\n config.variant,\n variant,\n widthProp,\n heightProp,\n colorProp,\n containerWidth,\n containerHeight,\n spacingProps,\n isShown,\n ]\n )\n\n const { start, end } = useVirtual({\n totalLines: descriptor.rowCount,\n lineHeight: resolvedBase,\n containerRef,\n buffer: 160,\n })\n\n const containerStyles = React.useMemo(\n () => mergeStyles(descriptor.containerStyle, style),\n [descriptor.containerStyle, style]\n )\n\n return (\n <div\n ref={containerRef}\n data-testid=\"baseline\"\n aria-hidden=\"true\"\n className={cx(...descriptor.classTokens.map((t) => styles[t]), className)}\n style={containerStyles}\n {...spacingProps}\n >\n {isShown &&\n Array.from({ length: end - start }, (_, i) => {\n const rowIndex = i + start\n return (\n <div\n className={styles.row}\n key={rowIndex}\n data-row-index={rowIndex}\n style={descriptor.getRowStyle(rowIndex)}\n />\n )\n })}\n </div>\n )\n})\n\nexport const Baseline = React.memo(function Baseline({\n className,\n debugging,\n style,\n variant: variantProp,\n height: heightProp,\n width: widthProp,\n base: baseProp,\n color: colorProp,\n ssrMode = false,\n ...spacingProps\n}: BaselineProps) {\n const config = useConfig('baseline')\n const variant = variantProp ?? config.variant\n const base = baseProp ?? config.base\n const { isShown } = useDebug(debugging, config.debugging)\n\n if (!isShown) {\n return (\n <div\n className={cx(styles.bas, styles.h, className)}\n style={style}\n data-testid=\"baseline\"\n aria-hidden=\"true\"\n {...spacingProps}\n />\n )\n }\n\n const ssrFallback = (\n <div\n className={cx(styles.bas, styles.h, styles.ssr, className)}\n style={{\n width: widthProp ?? '100%',\n height: heightProp ?? '100%',\n ...style,\n }}\n data-testid=\"baseline\"\n aria-hidden=\"true\"\n />\n )\n\n if (ssrMode) {\n return ssrFallback\n }\n\n return (\n <ClientOnly fallback={ssrFallback}>\n <BaselineImpl\n className={className}\n debugging={debugging}\n style={style}\n variant={variant}\n height={heightProp}\n width={widthProp}\n base={base}\n color={colorProp}\n {...spacingProps}\n />\n </ClientOnly>\n )\n})\n",".gde {\n position: absolute;\n inset: 0;\n box-sizing: border-box;\n width: var(--bkgd-w, 100%);\n height: var(--bkgd-h, 100%);\n max-width: var(--bkgd-mw, none);\n margin-inline: auto;\n pointer-events: none;\n padding: var(--bkgd-pb, 0) var(--bkgd-pi, 0);\n}\n\n.v {\n opacity: 1;\n visibility: visible;\n transition:\n opacity var(--bk-transition-base),\n visibility 0ms linear;\n}\n\n.h {\n opacity: 0;\n visibility: hidden;\n transition:\n opacity var(--bk-transition-base),\n visibility 0ms linear 180ms;\n}\n\n.line {\n left: -0.5px; /* Alignment correction for line variant */\n}\n\n.cols {\n position: absolute;\n inset: 0;\n display: grid;\n column-gap: var(--bkgd-g);\n grid-template-rows: 1fr;\n grid-template-columns: var(--bkgd-t);\n justify-content: var(--bkgd-j);\n width: var(--bk-wf);\n height: var(--bk-hf);\n overflow: hidden;\n contain: layout style paint;\n}\n\n.col {\n min-width: 0;\n width: var(--bk-wf);\n height: var(--bk-hf);\n}\n\n/* Variant-specific styles */\n.col[data-variant='line'] {\n width: 1px;\n background-color: var(--bkgd-cl);\n}\n\n.cols[data-variant='line'] {\n display: block;\n background-image: repeating-linear-gradient(\n to right,\n var(--bkgd-line-color, var(--bkgd-cl)) 0 1px,\n transparent 1px var(--bkgd-line-period, 1px)\n );\n}\n\n.col[data-variant='pattern'] {\n background-color: var(--bkgd-cp);\n}\n\n.col[data-variant='auto'] {\n background-color: var(--bkgd-ca);\n overflow: hidden;\n}\n\n.col[data-variant='fixed'] {\n background-color: var(--bkgd-cf);\n}\n\n/* Style for SSR rendering */\n.ssr {\n box-sizing: border-box;\n z-index: 1;\n pointer-events: none;\n}\n","import * as React from 'react'\nimport type { ComponentsProps } from '../types'\nimport { useConfig } from '../../hooks/useConfig'\nimport { useDebug } from '../../hooks/useDebug'\nimport { useMeasure } from '../../hooks/useMeasure'\nimport { useGuide } from '../../hooks/useGuide'\nimport { cx } from '@baseline-kit/core/utils/merge'\nimport {\n createGuideDescriptor,\n createGuideConfig,\n} from '@baseline-kit/core/descriptors/guide'\nimport type { GuideVariant, GuideConfig } from '@baseline-kit/core/types'\nimport { ClientOnly } from '../../utils/ssr'\nimport { mergeStyles } from '../../utils/merge'\nimport styles from './styles.module.css'\n\nexport type { GuideConfig }\n\nexport type GuideProps = {\n align?: React.CSSProperties['justifyContent']\n variant?: GuideVariant\n columns?: number | readonly (string | number | undefined | 'auto')[]\n columnWidth?: React.CSSProperties['width']\n maxWidth?: React.CSSProperties['maxWidth']\n color?: React.CSSProperties['color']\n children?: React.ReactNode\n gap?: number\n ssrMode?: boolean\n} & ComponentsProps &\n Omit<GuideConfig, 'columns' | 'columnWidth' | 'gap'>\n\nexport const Guide = React.memo(function Guide({\n className,\n debugging,\n style,\n variant: variantProp,\n align = 'center',\n gap: gapProp,\n height,\n width,\n columns,\n columnWidth,\n maxWidth,\n color,\n children,\n ssrMode = false,\n ...props\n}: GuideProps) {\n const config = useConfig('guide')\n const variant = variantProp ?? config.variant\n const gap = typeof gapProp === 'number' ? gapProp : 0\n const { isShown } = useDebug(debugging, config.debugging)\n\n if (!isShown) {\n return (\n <div\n className={cx(styles.gde, styles.h, className)}\n style={style}\n data-testid=\"guide\"\n data-variant={variant}\n aria-hidden=\"true\"\n {...props}\n >\n {children}\n </div>\n )\n }\n\n const ssrFallback = (\n <div\n className={cx(styles.gde, styles.h, styles.ssr, className)}\n style={{\n width: width ?? '100%',\n height: height ?? '100%',\n maxWidth: maxWidth ?? 'none',\n ...style,\n }}\n data-testid=\"guide\"\n data-variant={variant}\n aria-hidden=\"true\"\n >\n {children}\n </div>\n )\n\n if (ssrMode) {\n return ssrFallback\n }\n\n return (\n <ClientOnly fallback={ssrFallback}>\n <GuideImpl\n className={className}\n debugging={debugging}\n style={style}\n variant={variant}\n align={align}\n gap={gap}\n height={height}\n width={width}\n columns={columns}\n columnWidth={columnWidth}\n maxWidth={maxWidth}\n color={color}\n {...props}\n >\n {children}\n </GuideImpl>\n </ClientOnly>\n )\n})\n\nconst GuideImpl = React.memo(function GuideImpl({\n className,\n debugging,\n style,\n variant,\n align = 'center',\n gap,\n height,\n width,\n columns,\n columnWidth,\n maxWidth,\n color,\n children,\n ...props\n}: GuideProps) {\n const config = useConfig('guide')\n const { isShown } = useDebug(debugging, config.debugging)\n const containerRef = React.useRef<HTMLDivElement | null>(null)\n useMeasure(containerRef)\n\n const resolvedVariant = (variant ?? config.variant) as GuideVariant\n const resolvedGap = typeof gap === 'number' ? gap : 0\n\n const gridConfig = React.useMemo(\n () =>\n createGuideConfig({\n variant: resolvedVariant,\n base: config.base,\n gap: resolvedGap,\n columns,\n columnWidth: columnWidth as number | string | undefined,\n }),\n [resolvedVariant, config.base, resolvedGap, columns, columnWidth]\n )\n\n const { template, columnsCount, calculatedGap } = useGuide(\n containerRef,\n gridConfig\n )\n\n const descriptor = React.useMemo(\n () =>\n createGuideDescriptor({\n base: config.base,\n colors: config.colors,\n variant: resolvedVariant,\n align: align || 'center',\n width,\n height,\n columnWidth,\n maxWidth,\n color,\n template,\n columnsCount,\n calculatedGap,\n isVisible: isShown,\n }),\n [\n config.base,\n config.colors,\n resolvedVariant,\n align,\n width,\n height,\n columnWidth,\n maxWidth,\n color,\n template,\n columnsCount,\n calculatedGap,\n isShown,\n ]\n )\n\n const containerStyles = React.useMemo(\n () => mergeStyles(descriptor.containerStyle, style),\n [descriptor.containerStyle, style]\n )\n\n return (\n <div\n ref={containerRef}\n data-testid=\"guide\"\n aria-hidden=\"true\"\n className={cx(...descriptor.classTokens.map((t) => styles[t]), className)}\n data-variant={variant}\n style={containerStyles}\n {...props}\n >\n {isShown && (\n <div className={styles.cols} data-variant={variant}>\n {!descriptor.isLineVariant &&\n Array.from({ length: descriptor.columnsCount }, (_, i) => (\n <div\n key={i}\n className={styles.col}\n data-column-index={i}\n data-variant={variant}\n />\n ))}\n </div>\n )}\n {children}\n </div>\n )\n})\n","/**\n * Detects if code is running in a server-side environment\n */\nexport const isSSR = typeof window === 'undefined'\n\n/**\n * Default dimensions to use during server-side rendering\n */\nexport const SSR_DIMENSIONS = {\n width: 1024,\n height: 768,\n}\n\n/**\n * Safe window-using function that works in both server and client\n */\nexport function safeClientValue<T>(clientFn: () => T, fallback: T): T {\n if (isSSR) {\n return fallback\n }\n\n try {\n return clientFn()\n } catch {\n return fallback\n }\n}\n\n/**\n * Returns a stable value during SSR and initial render, then switches to\n * the dynamic value after hydration\n */\nexport function hydratedValue<T>(\n isHydrated: boolean,\n ssrValue: T,\n dynamicValue: T\n): T {\n return !isHydrated || isSSR ? ssrValue : dynamicValue\n}\n",".spr {\n position: relative;\n box-sizing: border-box;\n width: var(--bksp-w, 100%);\n height: var(--bksp-h, auto);\n flex-shrink: 0;\n display: block;\n margin: 0;\n padding: 0;\n}\n\n.line::after {\n content: '';\n position: absolute;\n inset: 0;\n border: 1px solid var(--bksp-cl, hsla(270, 60%, 40%, 0.6));\n z-index: calc(var(--bk-zi, 1));\n}\n\n.flat {\n background-color: var(--bksp-cf, hsla(230, 100%, 70%, 0.2));\n}\n\n.indicator {\n color: var(--bksp-ct, hsla(270, 60%, 40%, 1));\n}\n","import * as React from 'react'\nimport { useConfig, useDebug, useIsClient } from '../../hooks'\nimport { cx, createSpacerDescriptor } from '@baseline-kit/core'\nimport { hydratedValue } from '@baseline-kit/dom'\nimport { ComponentsProps, Variant } from '../types'\nimport { mergeStyles } from '../../utils/merge'\nimport styles from './styles.module.css'\n\nexport type IndicatorNode = (\n value: number,\n type: 'width' | 'height'\n) => React.ReactNode\n\nexport type SpacerProps = {\n width?: React.CSSProperties['width']\n height?: React.CSSProperties['height']\n variant?: Variant\n color?: string\n base?: number\n children?: React.ReactNode\n indicatorNode?: IndicatorNode\n ssrMode?: boolean\n} & ComponentsProps\n\nexport const Spacer = React.memo(function Spacer({\n height: heightProp,\n width: widthProp,\n indicatorNode,\n debugging: debuggingProp,\n variant: variantProp,\n base: baseProp,\n color: colorProp,\n className,\n style,\n children,\n ssrMode = false,\n ...props\n}: SpacerProps) {\n const ref = React.useRef<HTMLDivElement>(null)\n const config = useConfig('spacer')\n const { isShown } = useDebug(debuggingProp, config.debugging)\n const variant = variantProp ?? config.variant\n const base = baseProp ?? config.base\n\n const isHydrated = useIsClient()\n\n const descriptor = React.useMemo(\n () =>\n createSpacerDescriptor({\n base,\n colors: config.colors,\n width: widthProp as number | string | undefined,\n height: heightProp as number | string | undefined,\n color: colorProp,\n variant,\n isVisible: isShown,\n }),\n [base, config.colors, widthProp, heightProp, colorProp, variant, isShown]\n )\n\n const shouldShowMeasurements = hydratedValue(\n isHydrated && !ssrMode,\n false,\n isShown && indicatorNode !== undefined\n )\n\n const measurements = React.useMemo(() => {\n if (!shouldShowMeasurements) return null\n const w = descriptor.normWidth\n const h = descriptor.normHeight\n return (\n <>\n {h !== 0 && (\n <span key=\"height\" className={styles.indicator} aria-hidden=\"true\">\n {indicatorNode!(h, 'height')}\n </span>\n )}\n {w !== 0 && (\n <span key=\"width\" className={styles.indicator} aria-hidden=\"true\">\n {indicatorNode!(w, 'width')}\n </span>\n )}\n </>\n )\n }, [\n shouldShowMeasurements,\n indicatorNode,\n descriptor.normWidth,\n descriptor.normHeight,\n ])\n\n const baseStyles = React.useMemo(\n () => mergeStyles(descriptor.style, style),\n [descriptor.style, style]\n )\n\n return (\n <div\n ref={ref}\n data-testid=\"spacer\"\n className={cx(...descriptor.classTokens.map((t) => styles[t]), className)}\n data-variant={variant}\n data-height={\n typeof descriptor.normHeight === 'number'\n ? `${descriptor.normHeight}px`\n : descriptor.normHeight\n }\n style={baseStyles}\n {...props}\n >\n {measurements}\n {children}\n </div>\n )\n})\n",".pad {\n position: relative;\n display: grid;\n grid-template-columns: auto 1fr auto;\n grid-template-rows: auto 1fr auto;\n width: var(--bkpd-w, auto);\n height: var(--bkpd-h, auto);\n text-box-trim: trim-both;\n text-box-edge: ex alphabetic;\n}\n\n.content {\n text-box-trim: trim-both;\n text-box-edge: ex alphabetic;\n}\n\n.v::after {\n content: '';\n position: absolute;\n inset: 0;\n border: 1px solid var(--bkpd-c, var(--bk-padder-color-theme));\n pointer-events: none;\n z-index: var(--bk-zi);\n}\n","import * as React from 'react'\nimport { useConfig, useDebug, useBaseline, useIsClient } from '../../hooks'\nimport { cx, parsePadding, createPadderDescriptor } from '@baseline-kit/core'\nimport { hydratedValue } from '@baseline-kit/dom'\nimport { mergeStyles, mergeRefs } from '../../utils/merge'\nimport { ComponentsProps, Variant } from '../types'\nimport { Spacer, IndicatorNode } from '../Spacer'\nimport type { DebuggingMode } from '../types'\nimport styles from './styles.module.css'\n\nexport type PadderProps = {\n indicatorNode?: IndicatorNode\n ssrMode?: boolean\n children?: React.ReactNode\n} & ComponentsProps\n\nconst createRenderSpacerFn = (\n variant: Variant | undefined,\n debugging: DebuggingMode | undefined,\n indicatorNode?: IndicatorNode\n) => {\n const safeVariant = variant || 'line'\n const safeDebugging = debugging || 'none'\n\n const SpacerElement = (\n widthVal: React.CSSProperties['width'],\n heightVal: React.CSSProperties['height']\n ) => (\n <Spacer\n variant={safeVariant}\n debugging={heightVal === 0 || widthVal === 0 ? 'none' : safeDebugging}\n indicatorNode={indicatorNode}\n height={heightVal !== '100%' ? heightVal : undefined}\n width={widthVal !== '100%' ? widthVal : undefined}\n />\n )\n SpacerElement.displayName = 'PadderSpacer'\n return SpacerElement\n}\n\n// Static grid position styles — hoisted to avoid re-creation on render\nconst GRID_FULL_ROW: React.CSSProperties = { gridColumn: '1 / -1' }\nconst GRID_MID_COL: React.CSSProperties = { gridRow: '2 / 3' }\nconst GRID_CENTER: React.CSSProperties = {\n gridRow: '2 / 3',\n gridColumn: '2 / 3',\n}\n\nexport const Padder = React.memo(\n React.forwardRef<HTMLDivElement, PadderProps>(function Padder(\n {\n children,\n className,\n debugging: debuggingProp,\n height,\n indicatorNode,\n style,\n width,\n ssrMode = false,\n ...spacingProps\n },\n ref\n ) {\n const config = useConfig('padder')\n const { variant } = useConfig('spacer')\n const initialPadding = React.useMemo(\n () => parsePadding(spacingProps),\n [spacingProps]\n )\n const { isShown, isNone, debugging } = useDebug(\n debuggingProp,\n config.debugging\n )\n const enableSpacers = !isNone\n\n const isHydrated = useIsClient()\n const internalRef = React.useRef<HTMLDivElement | null>(null)\n\n const baselinePadding = useBaseline(internalRef, {\n base: config.base,\n snapping: 'height',\n spacing: initialPadding,\n })\n\n const stablePadding = {\n padding: {\n top: initialPadding.top || 0,\n right: initialPadding.right || 0,\n bottom: initialPadding.bottom || 0,\n left: initialPadding.left || 0,\n },\n }\n const { padding } = hydratedValue(\n isHydrated && !ssrMode,\n stablePadding,\n baselinePadding\n )\n\n const setRefs = mergeRefs(ref, internalRef)\n\n const descriptor = React.useMemo(\n () =>\n createPadderDescriptor({\n base: config.base,\n color: config.color,\n width: width as number | string | undefined,\n height: height as number | string | undefined,\n padding,\n enableSpacers,\n isVisible: isShown,\n }),\n [\n config.base,\n config.color,\n width,\n height,\n padding,\n enableSpacers,\n isShown,\n ]\n )\n\n const containerStyles = React.useMemo(\n () => mergeStyles(descriptor.containerStyle, style),\n [descriptor.containerStyle, style]\n )\n\n const renderSpacer = React.useMemo(\n () => createRenderSpacerFn(variant, debugging, indicatorNode),\n [variant, debugging, indicatorNode]\n )\n\n if (!enableSpacers) {\n return (\n <div\n ref={setRefs}\n data-testid=\"padder\"\n className={cx(\n ...descriptor.classTokens.map((t) => styles[t]),\n className\n )}\n style={containerStyles}\n >\n {children}\n </div>\n )\n }\n\n return (\n <div\n ref={setRefs}\n data-testid=\"padder\"\n className={cx(\n ...descriptor.classTokens.map((t) => styles[t]),\n className\n )}\n style={containerStyles}\n >\n <>\n {padding.top >= 0 && (\n <div style={GRID_FULL_ROW}>{renderSpacer('100%', padding.top)}</div>\n )}\n {padding.left >= 0 && (\n <div style={GRID_MID_COL}>{renderSpacer(padding.left, '100%')}</div>\n )}\n </>\n <div\n data-testid=\"padder-content\"\n className={styles.content}\n style={GRID_CENTER}\n >\n {children}\n </div>\n <>\n {padding.right >= 0 && (\n <div style={GRID_MID_COL}>\n {renderSpacer(padding.right, '100%')}\n </div>\n )}\n {padding.bottom >= 0 && (\n <div style={GRID_FULL_ROW}>\n {renderSpacer('100%', padding.bottom)}\n </div>\n )}\n </>\n </div>\n )\n })\n)\n",".box {\n position: relative;\n width: var(--bkbx-w);\n height: var(--bkbx-h);\n text-box-trim: trim-both;\n text-box-edge: ex alphabetic;\n}\n\n.v::after {\n content: '';\n position: absolute;\n inset: 0;\n border: 1px solid var(--bkbx-cl);\n pointer-events: none;\n z-index: var(--bk-zi);\n}\n","import * as React from 'react'\nimport { useConfig, useDebug, useBaseline, useIsClient } from '../../hooks'\nimport { cx, parsePadding, createBoxDescriptor } from '@baseline-kit/core'\nimport type { SnapEdge, SnappingMode } from '@baseline-kit/core'\nimport { hydratedValue } from '@baseline-kit/dom'\nimport { mergeStyles, mergeRefs } from '../../utils/merge'\nimport { Config } from '../Config/Config'\nimport { Padder } from '../Padder'\nimport { ComponentsProps } from '../types'\nimport styles from './styles.module.css'\n\nexport type { SnapEdge, SnappingMode }\n\nexport type BoxProps = {\n colSpan?: number\n rowSpan?: number\n span?: number\n snapping?: SnappingMode\n snapEdge?: SnapEdge\n ssrMode?: boolean\n children?: React.ReactNode\n} & ComponentsProps\n\nexport const Box = React.memo(\n React.forwardRef<HTMLDivElement, BoxProps>(function Box(\n {\n children,\n snapping = 'clamp',\n snapEdge = 'bottom',\n debugging: debuggingProp,\n className,\n colSpan,\n rowSpan,\n span,\n width,\n height,\n style,\n ssrMode = false,\n ...spacingProps\n },\n ref\n ) {\n const config = useConfig('box')\n const { isShown, debugging } = useDebug(debuggingProp, config.debugging)\n\n const isHydrated = useIsClient()\n const internalRef = React.useRef<HTMLDivElement | null>(null)\n const { top, bottom, left, right } = parsePadding(spacingProps)\n\n const baselinePadding = useBaseline(internalRef, {\n base: config.base,\n snapping,\n snapEdge,\n spacing: { top, bottom, left, right },\n })\n\n const stablePadding = {\n padding: {\n top: top || 0,\n right: right || 0,\n bottom: bottom || 0,\n left: left || 0,\n },\n }\n const { padding } = hydratedValue(\n isHydrated && !ssrMode,\n stablePadding,\n baselinePadding\n )\n\n const descriptor = React.useMemo(\n () =>\n createBoxDescriptor({\n base: config.base,\n lineColor: config.colors.line,\n width,\n height,\n span,\n colSpan,\n rowSpan,\n isVisible: isShown,\n }),\n [\n config.base,\n config.colors.line,\n width,\n height,\n span,\n colSpan,\n rowSpan,\n isShown,\n ]\n )\n\n const boxStyles = React.useMemo(\n () => mergeStyles(descriptor.boxStyle, style),\n [descriptor.boxStyle, style]\n )\n\n return (\n <div\n ref={mergeRefs(ref, internalRef)}\n data-testid=\"box\"\n className={cx(\n ...descriptor.classTokens.map((t) => styles[t]),\n className\n )}\n style={mergeStyles(boxStyles, descriptor.gridSpanStyle)}\n >\n <Config base={1} spacer={{ variant: 'flat' }}>\n <Padder\n block={[padding.top, padding.bottom]}\n inline={[padding.left, padding.right]}\n width=\"fit-content\"\n height={height}\n debugging={debugging}\n // Box owns snapping; the inner Padder renders its resolved edges.\n ssrMode\n >\n {children}\n </Padder>\n </Config>\n </div>\n )\n })\n)\n"],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -25,6 +25,7 @@ type GuideColumnsPattern = readonly GuideColumnValue[];
25
25
  type Variant = 'line' | 'flat' | 'pattern';
26
26
  type BaselineVariant = Exclude<Variant, 'pattern'>;
27
27
  type SnappingMode = 'none' | 'height' | 'clamp';
28
+ type SnapEdge = 'top' | 'bottom';
28
29
  type DebuggingMode = 'none' | 'hidden' | 'visible';
29
30
  type BaseGuideConfig = {
30
31
  gap?: number | string;
@@ -145,6 +146,7 @@ type BoxProps = {
145
146
  rowSpan?: number;
146
147
  span?: number;
147
148
  snapping?: SnappingMode;
149
+ snapEdge?: SnapEdge;
148
150
  ssrMode?: boolean;
149
151
  children?: React.ReactNode;
150
152
  } & ComponentsProps;
@@ -153,6 +155,7 @@ declare const Box: React.NamedExoticComponent<{
153
155
  rowSpan?: number;
154
156
  span?: number;
155
157
  snapping?: SnappingMode;
158
+ snapEdge?: SnapEdge;
156
159
  ssrMode?: boolean;
157
160
  children?: React.ReactNode;
158
161
  } & {
@@ -203,4 +206,4 @@ declare const isSSR: boolean;
203
206
  declare function safeClientValue<T>(clientFn: () => T, fallback: T): T;
204
207
 
205
208
  export { Baseline, Box, Config, Guide, Padder, Spacer, isSSR, safeClientValue };
206
- export type { BaselineProps, BaselineVariant, BoxProps, ConfigSchema, DebuggingMode, GuideProps, GuideVariant, IndicatorNode, PadderProps, PaddingValue, SnappingMode, SpacerProps, Spacing, SpacingProps, Variant };
209
+ export type { BaselineProps, BaselineVariant, BoxProps, ConfigSchema, DebuggingMode, GuideProps, GuideVariant, IndicatorNode, PadderProps, PaddingValue, SnapEdge, SnappingMode, SpacerProps, Spacing, SpacingProps, Variant };