@nowline/layout 0.0.0-dev.20261004032054.g2cf911c → 0.0.0-dev.20261004035821.gd8a6927

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/dist/index.d.ts +1 -1
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +1 -1
  4. package/dist/index.js.map +1 -1
  5. package/dist/inline-date-pin-geometry.d.ts.map +1 -1
  6. package/dist/inline-date-pin-geometry.js +11 -26
  7. package/dist/inline-date-pin-geometry.js.map +1 -1
  8. package/dist/item-bar-geometry.d.ts +156 -0
  9. package/dist/item-bar-geometry.d.ts.map +1 -1
  10. package/dist/item-bar-geometry.js +208 -0
  11. package/dist/item-bar-geometry.js.map +1 -1
  12. package/dist/layout-context.d.ts +18 -6
  13. package/dist/layout-context.d.ts.map +1 -1
  14. package/dist/layout-insights.d.ts.map +1 -1
  15. package/dist/layout-insights.js +11 -1
  16. package/dist/layout-insights.js.map +1 -1
  17. package/dist/layout.d.ts.map +1 -1
  18. package/dist/layout.js +305 -206
  19. package/dist/layout.js.map +1 -1
  20. package/dist/nodes/content-extent.d.ts +7 -0
  21. package/dist/nodes/content-extent.d.ts.map +1 -0
  22. package/dist/nodes/content-extent.js +43 -0
  23. package/dist/nodes/content-extent.js.map +1 -0
  24. package/dist/nodes/group-node.d.ts +5 -4
  25. package/dist/nodes/group-node.d.ts.map +1 -1
  26. package/dist/nodes/group-node.js +10 -6
  27. package/dist/nodes/group-node.js.map +1 -1
  28. package/dist/nodes/include-node.d.ts +1 -1
  29. package/dist/nodes/include-node.d.ts.map +1 -1
  30. package/dist/nodes/include-node.js +8 -5
  31. package/dist/nodes/include-node.js.map +1 -1
  32. package/dist/nodes/item-node.d.ts +98 -0
  33. package/dist/nodes/item-node.d.ts.map +1 -1
  34. package/dist/nodes/item-node.js +172 -35
  35. package/dist/nodes/item-node.js.map +1 -1
  36. package/dist/nodes/roadmap-node.d.ts.map +1 -1
  37. package/dist/nodes/roadmap-node.js +50 -1
  38. package/dist/nodes/roadmap-node.js.map +1 -1
  39. package/dist/nodes/swimlane-node.d.ts +5 -4
  40. package/dist/nodes/swimlane-node.d.ts.map +1 -1
  41. package/dist/nodes/swimlane-node.js +10 -6
  42. package/dist/nodes/swimlane-node.js.map +1 -1
  43. package/dist/text-measure.d.ts +20 -0
  44. package/dist/text-measure.d.ts.map +1 -0
  45. package/dist/text-measure.js +52 -0
  46. package/dist/text-measure.js.map +1 -0
  47. package/dist/types.d.ts +25 -0
  48. package/dist/types.d.ts.map +1 -1
  49. package/package.json +2 -2
  50. package/src/index.ts +10 -0
  51. package/src/inline-date-pin-geometry.ts +13 -33
  52. package/src/item-bar-geometry.ts +269 -0
  53. package/src/layout-context.ts +18 -6
  54. package/src/layout-insights.ts +10 -1
  55. package/src/layout.ts +391 -207
  56. package/src/nodes/content-extent.ts +45 -0
  57. package/src/nodes/group-node.ts +18 -10
  58. package/src/nodes/include-node.ts +12 -9
  59. package/src/nodes/item-node.ts +242 -37
  60. package/src/nodes/roadmap-node.ts +51 -1
  61. package/src/nodes/swimlane-node.ts +18 -10
  62. package/src/text-measure.ts +54 -0
  63. package/src/types.ts +29 -2
package/dist/index.d.ts CHANGED
@@ -4,7 +4,7 @@ export { FRAME_TAB_INNER_GAP_PX, FRAME_TAB_LEFT_INSET_PX, FRAME_TAB_MIN_WIDTH_PX
4
4
  export { groupHasFill, groupTitleTabWidth } from './group-title-tab-geometry.js';
5
5
  export { HEADER_AUTHOR_FONT_SIZE_PX, HEADER_AUTHOR_LINE_HEIGHT_PX, HEADER_CARD_PADDING_BOTTOM, HEADER_CARD_PADDING_TOP, HEADER_CARD_PADDING_X, HEADER_TITLE_FONT_SIZE_PX, HEADER_TITLE_LINE_HEIGHT_PX, HEADER_TITLE_TO_AUTHOR_GAP_PX, } from './header-card-geometry.js';
6
6
  export { INCLUDE_CHROME_BADGE_GAP_PX, INCLUDE_CHROME_BADGE_SIZE_PX, INCLUDE_CHROME_OFFSET_FROM_BOX_PX, INCLUDE_CHROME_SOURCE_GAP_PX, INCLUDE_CHROME_SOURCE_HALO_PAD_PX, INCLUDE_CHROME_SOURCE_PER_CHAR_PX, INCLUDE_CHROME_TAB_LABEL_PER_CHAR_PX, INCLUDE_CHROME_TAB_LEFT_INSET_PX, INCLUDE_CHROME_TAB_MIN_WIDTH_PX, INCLUDE_CHROME_TAB_RIGHT_INSET_PX, type IncludeChromeGeometry, includeChromeGeometry, } from './include-chrome-geometry.js';
7
- export { ITEM_CAPTION_INSET_X_PX, ITEM_CAPTION_META_BASELINE_OFFSET_PX, ITEM_CAPTION_META_FONT_SIZE_PX, ITEM_CAPTION_SPILL_GAP_PX, ITEM_CAPTION_TITLE_BASELINE_OFFSET_PX, ITEM_CAPTION_TITLE_FONT_SIZE_PX, ITEM_DECORATION_SPILL_GAP_PX, ITEM_FOOTNOTE_INDICATOR_BASELINE_OFFSET_PX, ITEM_FOOTNOTE_INDICATOR_INSET_RIGHT_PX, ITEM_FOOTNOTE_INDICATOR_STEP_PX, ITEM_LINK_ICON_INSET_PX, ITEM_LINK_ICON_TILE_SIZE_PX, ITEM_STATUS_DOT_INSET_RIGHT_PX, ITEM_STATUS_DOT_INSET_TOP_PX, ITEM_STATUS_DOT_RADIUS_PX, LABEL_CHIP_GAP_ABOVE_PROGRESS_STRIP_PX, LABEL_CHIP_GAP_BETWEEN_PX, LABEL_CHIP_HEIGHT_PX, MIN_BAR_WIDTH_FOR_DOT_PX, MIN_BAR_WIDTH_FOR_FOOTNOTE_PX, MIN_BAR_WIDTH_FOR_LINK_AND_DOT_PX, } from './item-bar-geometry.js';
7
+ export { computeTitleBarExtra, ITEM_CAPTION_INSET_X_PX, ITEM_CAPTION_META_BASELINE_OFFSET_PX, ITEM_CAPTION_META_FONT_SIZE_PX, ITEM_CAPTION_SPILL_GAP_PX, ITEM_CAPTION_TITLE_BASELINE_OFFSET_PX, ITEM_CAPTION_TITLE_FONT_SIZE_PX, ITEM_CAPTION_TITLE_LINE_HEIGHT_PX, ITEM_CAPTION_TITLE_MAX_LINES, ITEM_DECORATION_SPILL_GAP_PX, ITEM_FOOTNOTE_INDICATOR_BASELINE_OFFSET_PX, ITEM_FOOTNOTE_INDICATOR_FONT_SIZE_PX, ITEM_FOOTNOTE_INDICATOR_INSET_RIGHT_PX, ITEM_FOOTNOTE_INDICATOR_STEP_PX, ITEM_LINK_ICON_INSET_PX, ITEM_LINK_ICON_TILE_SIZE_PX, ITEM_LINK_ICON_TO_CAPTION_GAP_PX, ITEM_STATUS_DOT_INSET_RIGHT_PX, ITEM_STATUS_DOT_INSET_TOP_PX, ITEM_STATUS_DOT_RADIUS_PX, type ItemCaptionAfterGlyph, itemCaptionInsetX, itemCaptionLastBaselineOffset, itemCaptionMetaBaselineOffset, itemTitleFirstLineRightReservePx, LABEL_CHIP_GAP_ABOVE_PROGRESS_STRIP_PX, LABEL_CHIP_GAP_BETWEEN_PX, LABEL_CHIP_HEIGHT_PX, MIN_BAR_WIDTH_FOR_DOT_PX, MIN_BAR_WIDTH_FOR_FOOTNOTE_PX, MIN_BAR_WIDTH_FOR_LINK_AND_DOT_PX, } from './item-bar-geometry.js';
8
8
  export type { LayoutOptions, LayoutResult } from './layout.js';
9
9
  export { layoutRoadmap } from './layout.js';
10
10
  export { collectLayoutInsights, type LayoutInsight, type LayoutInsightContext, type LayoutInsightSeverity, } from './layout-insights.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -4,7 +4,7 @@ export { FRAME_TAB_INNER_GAP_PX, FRAME_TAB_LEFT_INSET_PX, FRAME_TAB_MIN_WIDTH_PX
4
4
  export { groupHasFill, groupTitleTabWidth } from './group-title-tab-geometry.js';
5
5
  export { HEADER_AUTHOR_FONT_SIZE_PX, HEADER_AUTHOR_LINE_HEIGHT_PX, HEADER_CARD_PADDING_BOTTOM, HEADER_CARD_PADDING_TOP, HEADER_CARD_PADDING_X, HEADER_TITLE_FONT_SIZE_PX, HEADER_TITLE_LINE_HEIGHT_PX, HEADER_TITLE_TO_AUTHOR_GAP_PX, } from './header-card-geometry.js';
6
6
  export { INCLUDE_CHROME_BADGE_GAP_PX, INCLUDE_CHROME_BADGE_SIZE_PX, INCLUDE_CHROME_OFFSET_FROM_BOX_PX, INCLUDE_CHROME_SOURCE_GAP_PX, INCLUDE_CHROME_SOURCE_HALO_PAD_PX, INCLUDE_CHROME_SOURCE_PER_CHAR_PX, INCLUDE_CHROME_TAB_LABEL_PER_CHAR_PX, INCLUDE_CHROME_TAB_LEFT_INSET_PX, INCLUDE_CHROME_TAB_MIN_WIDTH_PX, INCLUDE_CHROME_TAB_RIGHT_INSET_PX, includeChromeGeometry, } from './include-chrome-geometry.js';
7
- export { ITEM_CAPTION_INSET_X_PX, ITEM_CAPTION_META_BASELINE_OFFSET_PX, ITEM_CAPTION_META_FONT_SIZE_PX, ITEM_CAPTION_SPILL_GAP_PX, ITEM_CAPTION_TITLE_BASELINE_OFFSET_PX, ITEM_CAPTION_TITLE_FONT_SIZE_PX, ITEM_DECORATION_SPILL_GAP_PX, ITEM_FOOTNOTE_INDICATOR_BASELINE_OFFSET_PX, ITEM_FOOTNOTE_INDICATOR_INSET_RIGHT_PX, ITEM_FOOTNOTE_INDICATOR_STEP_PX, ITEM_LINK_ICON_INSET_PX, ITEM_LINK_ICON_TILE_SIZE_PX, ITEM_STATUS_DOT_INSET_RIGHT_PX, ITEM_STATUS_DOT_INSET_TOP_PX, ITEM_STATUS_DOT_RADIUS_PX, LABEL_CHIP_GAP_ABOVE_PROGRESS_STRIP_PX, LABEL_CHIP_GAP_BETWEEN_PX, LABEL_CHIP_HEIGHT_PX, MIN_BAR_WIDTH_FOR_DOT_PX, MIN_BAR_WIDTH_FOR_FOOTNOTE_PX, MIN_BAR_WIDTH_FOR_LINK_AND_DOT_PX, } from './item-bar-geometry.js';
7
+ export { computeTitleBarExtra, ITEM_CAPTION_INSET_X_PX, ITEM_CAPTION_META_BASELINE_OFFSET_PX, ITEM_CAPTION_META_FONT_SIZE_PX, ITEM_CAPTION_SPILL_GAP_PX, ITEM_CAPTION_TITLE_BASELINE_OFFSET_PX, ITEM_CAPTION_TITLE_FONT_SIZE_PX, ITEM_CAPTION_TITLE_LINE_HEIGHT_PX, ITEM_CAPTION_TITLE_MAX_LINES, ITEM_DECORATION_SPILL_GAP_PX, ITEM_FOOTNOTE_INDICATOR_BASELINE_OFFSET_PX, ITEM_FOOTNOTE_INDICATOR_FONT_SIZE_PX, ITEM_FOOTNOTE_INDICATOR_INSET_RIGHT_PX, ITEM_FOOTNOTE_INDICATOR_STEP_PX, ITEM_LINK_ICON_INSET_PX, ITEM_LINK_ICON_TILE_SIZE_PX, ITEM_LINK_ICON_TO_CAPTION_GAP_PX, ITEM_STATUS_DOT_INSET_RIGHT_PX, ITEM_STATUS_DOT_INSET_TOP_PX, ITEM_STATUS_DOT_RADIUS_PX, itemCaptionInsetX, itemCaptionLastBaselineOffset, itemCaptionMetaBaselineOffset, itemTitleFirstLineRightReservePx, LABEL_CHIP_GAP_ABOVE_PROGRESS_STRIP_PX, LABEL_CHIP_GAP_BETWEEN_PX, LABEL_CHIP_HEIGHT_PX, MIN_BAR_WIDTH_FOR_DOT_PX, MIN_BAR_WIDTH_FOR_FOOTNOTE_PX, MIN_BAR_WIDTH_FOR_LINK_AND_DOT_PX, } from './item-bar-geometry.js';
8
8
  export { layoutRoadmap } from './layout.js';
9
9
  export { collectLayoutInsights, } from './layout-insights.js';
10
10
  export { civilDateInZone, normalizeZone, resolveToday, TimezoneError, } from './resolve-today.js';
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,2BAA2B,EAC3B,oBAAoB,EACpB,kBAAkB,EAElB,mBAAmB,GACtB,MAAM,eAAe,CAAC;AACvB,OAAO,EACH,wBAAwB,EACxB,yCAAyC,EACzC,mCAAmC,EACnC,qBAAqB,EACrB,6BAA6B,EAC7B,iBAAiB,EACjB,gCAAgC,GACnC,MAAM,gCAAgC,CAAC;AACxC,OAAO,EACH,sBAAsB,EACtB,uBAAuB,EACvB,sBAAsB,EACtB,4BAA4B,EAC5B,2BAA2B,EAC3B,wBAAwB,EACxB,2BAA2B,EAE3B,gBAAgB,GACnB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACjF,OAAO,EACH,0BAA0B,EAC1B,4BAA4B,EAC5B,0BAA0B,EAC1B,uBAAuB,EACvB,qBAAqB,EACrB,yBAAyB,EACzB,2BAA2B,EAC3B,6BAA6B,GAChC,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACH,2BAA2B,EAC3B,4BAA4B,EAC5B,iCAAiC,EACjC,4BAA4B,EAC5B,iCAAiC,EACjC,iCAAiC,EACjC,oCAAoC,EACpC,gCAAgC,EAChC,+BAA+B,EAC/B,iCAAiC,EAEjC,qBAAqB,GACxB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACH,uBAAuB,EACvB,oCAAoC,EACpC,8BAA8B,EAC9B,yBAAyB,EACzB,qCAAqC,EACrC,+BAA+B,EAC/B,4BAA4B,EAC5B,0CAA0C,EAC1C,sCAAsC,EACtC,+BAA+B,EAC/B,uBAAuB,EACvB,2BAA2B,EAC3B,8BAA8B,EAC9B,4BAA4B,EAC5B,yBAAyB,EACzB,sCAAsC,EACtC,yBAAyB,EACzB,oBAAoB,EACpB,wBAAwB,EACxB,6BAA6B,EAC7B,iCAAiC,GACpC,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EACH,qBAAqB,GAIxB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACH,eAAe,EAEf,aAAa,EAEb,YAAY,EACZ,aAAa,GAChB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EACH,SAAS,EACT,cAAc,EACd,UAAU,EACV,kBAAkB,EAGlB,MAAM,GACT,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACH,mBAAmB,EACnB,6BAA6B,EAC7B,yBAAyB,EACzB,yBAAyB,EACzB,gBAAgB,EAChB,yBAAyB,EACzB,4BAA4B,EAC5B,iBAAiB,EACjB,gBAAgB,EAChB,8BAA8B,EAC9B,gBAAgB,EAChB,kBAAkB,EAClB,UAAU,EACV,kCAAkC,EAClC,yBAAyB,EACzB,yBAAyB,EACzB,mBAAmB,EACnB,mBAAmB,EACnB,kCAAkC,EAClC,mBAAmB,EACnB,+BAA+B,EAC/B,6BAA6B,EAC7B,yBAAyB,EACzB,yBAAyB,EACzB,wCAAwC,EACxC,kCAAkC,EAClC,wBAAwB,EACxB,yBAAyB,EACzB,kBAAkB,EAClB,iCAAiC,EACjC,2BAA2B,EAC3B,yBAAyB,EACzB,iBAAiB,EACjB,uBAAuB,EACvB,wBAAwB,EACxB,YAAY,EACZ,sCAAsC,EACtC,6BAA6B,EAC7B,0BAA0B,GAC7B,MAAM,oBAAoB,CAAC;AAC5B,cAAc,YAAY,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,2BAA2B,EAC3B,oBAAoB,EACpB,kBAAkB,EAElB,mBAAmB,GACtB,MAAM,eAAe,CAAC;AACvB,OAAO,EACH,wBAAwB,EACxB,yCAAyC,EACzC,mCAAmC,EACnC,qBAAqB,EACrB,6BAA6B,EAC7B,iBAAiB,EACjB,gCAAgC,GACnC,MAAM,gCAAgC,CAAC;AACxC,OAAO,EACH,sBAAsB,EACtB,uBAAuB,EACvB,sBAAsB,EACtB,4BAA4B,EAC5B,2BAA2B,EAC3B,wBAAwB,EACxB,2BAA2B,EAE3B,gBAAgB,GACnB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACjF,OAAO,EACH,0BAA0B,EAC1B,4BAA4B,EAC5B,0BAA0B,EAC1B,uBAAuB,EACvB,qBAAqB,EACrB,yBAAyB,EACzB,2BAA2B,EAC3B,6BAA6B,GAChC,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACH,2BAA2B,EAC3B,4BAA4B,EAC5B,iCAAiC,EACjC,4BAA4B,EAC5B,iCAAiC,EACjC,iCAAiC,EACjC,oCAAoC,EACpC,gCAAgC,EAChC,+BAA+B,EAC/B,iCAAiC,EAEjC,qBAAqB,GACxB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACH,oBAAoB,EACpB,uBAAuB,EACvB,oCAAoC,EACpC,8BAA8B,EAC9B,yBAAyB,EACzB,qCAAqC,EACrC,+BAA+B,EAC/B,iCAAiC,EACjC,4BAA4B,EAC5B,4BAA4B,EAC5B,0CAA0C,EAC1C,oCAAoC,EACpC,sCAAsC,EACtC,+BAA+B,EAC/B,uBAAuB,EACvB,2BAA2B,EAC3B,gCAAgC,EAChC,8BAA8B,EAC9B,4BAA4B,EAC5B,yBAAyB,EAEzB,iBAAiB,EACjB,6BAA6B,EAC7B,6BAA6B,EAC7B,gCAAgC,EAChC,sCAAsC,EACtC,yBAAyB,EACzB,oBAAoB,EACpB,wBAAwB,EACxB,6BAA6B,EAC7B,iCAAiC,GACpC,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EACH,qBAAqB,GAIxB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACH,eAAe,EAEf,aAAa,EAEb,YAAY,EACZ,aAAa,GAChB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EACH,SAAS,EACT,cAAc,EACd,UAAU,EACV,kBAAkB,EAGlB,MAAM,GACT,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACH,mBAAmB,EACnB,6BAA6B,EAC7B,yBAAyB,EACzB,yBAAyB,EACzB,gBAAgB,EAChB,yBAAyB,EACzB,4BAA4B,EAC5B,iBAAiB,EACjB,gBAAgB,EAChB,8BAA8B,EAC9B,gBAAgB,EAChB,kBAAkB,EAClB,UAAU,EACV,kCAAkC,EAClC,yBAAyB,EACzB,yBAAyB,EACzB,mBAAmB,EACnB,mBAAmB,EACnB,kCAAkC,EAClC,mBAAmB,EACnB,+BAA+B,EAC/B,6BAA6B,EAC7B,yBAAyB,EACzB,yBAAyB,EACzB,wCAAwC,EACxC,kCAAkC,EAClC,wBAAwB,EACxB,yBAAyB,EACzB,kBAAkB,EAClB,iCAAiC,EACjC,2BAA2B,EAC3B,yBAAyB,EACzB,iBAAiB,EACjB,uBAAuB,EACvB,wBAAwB,EACxB,YAAY,EACZ,sCAAsC,EACtC,6BAA6B,EAC7B,0BAA0B,GAC7B,MAAM,oBAAoB,CAAC;AAC5B,cAAc,YAAY,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"inline-date-pin-geometry.d.ts","sourceRoot":"","sources":["../src/inline-date-pin-geometry.ts"],"names":[],"mappings":"AAgDA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAS,MAAM,YAAY,CAAC;AAEpE,MAAM,WAAW,uBAAuB;IACpC,GAAG,EAAE,WAAW,CAAC;IACjB,8EAA8E;IAC9E,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,gFAAgF;IAChF,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,WAAW,EAAE,OAAO,CAAC;IACrB,6EAA6E;IAC7E,aAAa,EAAE,MAAM,CAAC;CACzB;AAED;;;;;;;;;GASG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,uBAAuB,GAAG,aAAa,EAAE,CAmExF;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,MAAM,iBAAiB,GACvB;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAA;CAAE,GACjD;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnE,MAAM,WAAW,4BAA4B;IACzC;;0DAEsD;IACtD,GAAG,EAAE,WAAW,CAAC;IACjB,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,GAAG,EAAE,iBAAiB,CAAC;CAC1B;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,8BAA8B,CAC1C,IAAI,EAAE,4BAA4B,GACnC,aAAa,EAAE,CAqDjB;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,GAAG,SAAS,CAK5E"}
1
+ {"version":3,"file":"inline-date-pin-geometry.d.ts","sourceRoot":"","sources":["../src/inline-date-pin-geometry.ts"],"names":[],"mappings":"AA4CA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAS,MAAM,YAAY,CAAC;AAEpE,MAAM,WAAW,uBAAuB;IACpC,GAAG,EAAE,WAAW,CAAC;IACjB,8EAA8E;IAC9E,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,gFAAgF;IAChF,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,WAAW,EAAE,OAAO,CAAC;IACrB,6EAA6E;IAC7E,aAAa,EAAE,MAAM,CAAC;CACzB;AAED;;;;;;;;;GASG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,uBAAuB,GAAG,aAAa,EAAE,CAmDxF;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,MAAM,iBAAiB,GACvB;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAA;CAAE,GACjD;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC;AAEnE,MAAM,WAAW,4BAA4B;IACzC;;0DAEsD;IACtD,GAAG,EAAE,WAAW,CAAC;IACjB,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,GAAG,EAAE,iBAAiB,CAAC;CAC1B;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,8BAA8B,CAC1C,IAAI,EAAE,4BAA4B,GACnC,aAAa,EAAE,CAqDjB;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,GAAG,SAAS,CAK5E"}
@@ -25,7 +25,7 @@
25
25
  // Containers don't carry status dots or footnote indicators, so the
26
26
  // only neighbor to clear is the container's own title.
27
27
  import { CONTAINER_HEADER_BAND_PX, containerHeaderTitleWidth, containerHeaderTitleX, } from './container-header-geometry.js';
28
- import { INLINE_DATE_GLYPH_GAP_PX, INLINE_DATE_GLYPH_INSET_LEFT_PX, INLINE_DATE_GLYPH_INSET_RIGHT_PX, INLINE_DATE_GLYPH_INSET_TOP_PX, INLINE_DATE_GLYPH_TILE_SIZE_PX, ITEM_CAPTION_SPILL_GAP_PX, ITEM_FOOTNOTE_INDICATOR_INSET_RIGHT_PX, ITEM_FOOTNOTE_INDICATOR_STEP_PX, ITEM_LINK_ICON_INSET_PX, ITEM_LINK_ICON_TILE_SIZE_PX, ITEM_STATUS_DOT_INSET_RIGHT_PX, ITEM_STATUS_DOT_RADIUS_PX, MIN_BAR_WIDTH_FOR_INLINE_DATE_PX, } from './item-bar-geometry.js';
28
+ import { INLINE_DATE_GLYPH_GAP_PX, INLINE_DATE_GLYPH_INSET_LEFT_PX, INLINE_DATE_GLYPH_INSET_RIGHT_PX, INLINE_DATE_GLYPH_INSET_TOP_PX, INLINE_DATE_GLYPH_TILE_SIZE_PX, ITEM_CAPTION_SPILL_GAP_PX, inlineDateGlyphSpills, itemAfterGlyphInsideLeftX, itemBeforeGlyphInsideLeftX, } from './item-bar-geometry.js';
29
29
  import { GROUP_TITLE_TAB_HEIGHT_PX } from './themes/shared.js';
30
30
  /**
31
31
  * Compute inline-date pin glyph placements for an item bar. Returns an
@@ -44,14 +44,12 @@ export function computeItemInlineDatePins(opts) {
44
44
  const pins = [];
45
45
  const tileSize = INLINE_DATE_GLYPH_TILE_SIZE_PX;
46
46
  const topY = box.y + INLINE_DATE_GLYPH_INSET_TOP_PX;
47
- const spilled = box.width < MIN_BAR_WIDTH_FOR_INLINE_DATE_PX;
47
+ const spilled = inlineDateGlyphSpills(box.width);
48
48
  if (afterDate) {
49
- const insideLeftX = hasLinkIcon
50
- ? box.x +
51
- ITEM_LINK_ICON_INSET_PX +
52
- ITEM_LINK_ICON_TILE_SIZE_PX +
53
- INLINE_DATE_GLYPH_GAP_PX
54
- : box.x + INLINE_DATE_GLYPH_INSET_LEFT_PX;
49
+ // Walk RIGHT past the link tile when there is one; the formula is
50
+ // shared with the caption's left inset, see
51
+ // `itemAfterGlyphInsideLeftX`.
52
+ const insideLeftX = itemAfterGlyphInsideLeftX(box.x, hasLinkIcon);
55
53
  const glyphLeft = spilled
56
54
  ? {
57
55
  x: box.x - ITEM_CAPTION_SPILL_GAP_PX - tileSize,
@@ -67,30 +65,17 @@ export function computeItemInlineDatePins(opts) {
67
65
  });
68
66
  }
69
67
  if (beforeDate) {
70
- // Walk LEFT from the rightmost top-decoration slot:
71
- // - rightmost footnote anchors at (box.right - INSET_RIGHT_PX)
72
- // - leftmost footnote sits one step further left per extra digit
73
- // - status dot left edge sits at (box.right - INSET_RIGHT - DOT_RADIUS)
74
- // - inline-date glyph sits one INLINE_DATE_GLYPH_GAP_PX further left
68
+ // Walk LEFT from the rightmost top-decoration slot; the formula is
69
+ // shared with the title first-line clearance, see
70
+ // `itemBeforeGlyphInsideLeftX`.
75
71
  const rightEdge = box.x + box.width;
76
- let anchorRightX;
77
- if (footnoteCount > 0) {
78
- const leftmostFootnoteCenter = rightEdge -
79
- ITEM_FOOTNOTE_INDICATOR_INSET_RIGHT_PX -
80
- (footnoteCount - 1) * ITEM_FOOTNOTE_INDICATOR_STEP_PX;
81
- anchorRightX = leftmostFootnoteCenter - INLINE_DATE_GLYPH_GAP_PX;
82
- }
83
- else {
84
- const dotLeftEdge = rightEdge - ITEM_STATUS_DOT_INSET_RIGHT_PX - ITEM_STATUS_DOT_RADIUS_PX;
85
- anchorRightX = dotLeftEdge - INLINE_DATE_GLYPH_GAP_PX;
86
- }
87
- const insideRightX = anchorRightX - tileSize;
72
+ const insideLeftX = itemBeforeGlyphInsideLeftX(rightEdge, footnoteCount);
88
73
  const glyphLeft = spilled
89
74
  ? {
90
75
  x: rightEdge + ITEM_CAPTION_SPILL_GAP_PX,
91
76
  y: topY,
92
77
  }
93
- : { x: insideRightX, y: topY };
78
+ : { x: insideLeftX, y: topY };
94
79
  pins.push({
95
80
  side: 'before',
96
81
  isoDate: beforeDate,
@@ -1 +1 @@
1
- {"version":3,"file":"inline-date-pin-geometry.js","sourceRoot":"","sources":["../src/inline-date-pin-geometry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"inline-date-pin-geometry.js","sourceRoot":"","sources":["../src/inline-date-pin-geometry.ts"],"names":[],"mappings":"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"}
@@ -15,6 +15,45 @@ export declare const ITEM_CAPTION_META_BASELINE_OFFSET_PX = 38;
15
15
  export declare const ITEM_CAPTION_TITLE_FONT_SIZE_PX = 13;
16
16
  /** Font size (px) of the meta text. */
17
17
  export declare const ITEM_CAPTION_META_FONT_SIZE_PX = 11;
18
+ /**
19
+ * Baseline-to-baseline pitch (px) between consecutive TITLE lines when
20
+ * a long title word-wraps inside the bar. The meta line sits one more
21
+ * pitch below the last title line for every extra title line, see
22
+ * `itemCaptionMetaBaselineOffset`.
23
+ */
24
+ export declare const ITEM_CAPTION_TITLE_LINE_HEIGHT_PX = 16;
25
+ /**
26
+ * Most title lines layout will wrap a title onto inside the bar. A
27
+ * title that needs more than this spills to the right of the bar as a
28
+ * single line instead.
29
+ */
30
+ export declare const ITEM_CAPTION_TITLE_MAX_LINES = 2;
31
+ /**
32
+ * Baseline Y (px from the bar's top) of the meta line when the title
33
+ * occupies `lineCount` lines. One line gives the classic
34
+ * `ITEM_CAPTION_META_BASELINE_OFFSET_PX`; each extra title line pushes
35
+ * the meta baseline down by `ITEM_CAPTION_TITLE_LINE_HEIGHT_PX`.
36
+ */
37
+ export declare function itemCaptionMetaBaselineOffset(lineCount: number): number;
38
+ /**
39
+ * Baseline Y (px from the bar's top) of the LAST caption line: the
40
+ * meta line when the item has one, otherwise the final title line.
41
+ * Anything stacked below the caption (label chips) must clear this.
42
+ */
43
+ export declare function itemCaptionLastBaselineOffset(lineCount: number, hasMeta: boolean): number;
44
+ /**
45
+ * Extra bar height (px) a wrapped title needs on top of the default
46
+ * `bandwidth`. The default bar is sized so the caption's last baseline
47
+ * is at most `ITEM_CAPTION_META_BASELINE_OFFSET_PX`; anything below
48
+ * that grows the bar by the overshoot:
49
+ *
50
+ * - 1 title line (with or without meta): 0.
51
+ * - 2 title lines, no meta: line 2 lands at baseline 36, so 0.
52
+ * - 2 title lines + meta: meta baseline 54, so 16.
53
+ *
54
+ * The same number is the row-pitch increase for the bar's row.
55
+ */
56
+ export declare function computeTitleBarExtra(lineCount: number, hasMeta: boolean): number;
18
57
  /** Distance (px) from the bar's right edge to the dot's center. */
19
58
  export declare const ITEM_STATUS_DOT_INSET_RIGHT_PX = 12;
20
59
  /** Distance (px) from the bar's top edge to the dot's center. */
@@ -28,6 +67,12 @@ export declare const ITEM_STATUS_DOT_RADIUS_PX = 5;
28
67
  export declare const ITEM_FOOTNOTE_INDICATOR_INSET_RIGHT_PX = 22;
29
68
  /** Baseline Y (px from bar's top) for footnote indicator digits. */
30
69
  export declare const ITEM_FOOTNOTE_INDICATOR_BASELINE_OFFSET_PX = 14;
70
+ /**
71
+ * Font size (px) of the footnote indicator digits. The renderer paints
72
+ * them at this size and layout measures them with it (to find the
73
+ * cluster's left edge), so both read the same constant.
74
+ */
75
+ export declare const ITEM_FOOTNOTE_INDICATOR_FONT_SIZE_PX = 10;
31
76
  /**
32
77
  * Horizontal step (px) between consecutive footnote indicators when
33
78
  * an item carries more than one footnote — they walk LEFT from the
@@ -38,6 +83,42 @@ export declare const ITEM_FOOTNOTE_INDICATOR_STEP_PX = 8;
38
83
  export declare const ITEM_LINK_ICON_TILE_SIZE_PX = 14;
39
84
  /** Distance (px) from the bar's right/bottom edges to the tile's edge. */
40
85
  export declare const ITEM_LINK_ICON_INSET_PX = 6;
86
+ /**
87
+ * Horizontal gap (px) between the link-icon tile's right edge and the
88
+ * start of the caption text when both render inside the bar.
89
+ */
90
+ export declare const ITEM_LINK_ICON_TO_CAPTION_GAP_PX = 4;
91
+ /**
92
+ * The item carries an inline `after:DATE` glyph, on a bar of the given
93
+ * painted width. Passed to `itemCaptionInsetX` so the glyph, not just
94
+ * the link tile, reserves room at the caption's left edge.
95
+ */
96
+ export interface ItemCaptionAfterGlyph {
97
+ /** Painted bar width (px): `box.width`. Decides whether the glyph spills. */
98
+ barWidth: number;
99
+ }
100
+ /**
101
+ * Left inset (px) of the in-bar caption from the bar's left edge. It is
102
+ * `ITEM_CAPTION_INSET_X_PX` normally, pushed right past the link-icon
103
+ * tile (and its gap) when the bar carries a link icon, and pushed right
104
+ * past the `after:` inline-date glyph (and a gap) when the bar carries
105
+ * one INSIDE it:
106
+ *
107
+ * - no link icon, no glyph: 12
108
+ * - link icon, no glyph: 24
109
+ * - glyph, no link icon: 22 (the glyph spans 6..18, plus a 4 px gap)
110
+ * - glyph and link icon: 40 (the glyph spans 24..36, plus a 4 px gap)
111
+ *
112
+ * A glyph on a bar narrower than `MIN_BAR_WIDTH_FOR_INLINE_DATE_PX`
113
+ * spills out of the bar to the left and reserves nothing.
114
+ *
115
+ * `hasLinkIcon` is the same flag `computeItemInlineDatePins` places the
116
+ * glyph with, and the glyph's right edge comes from the same helper
117
+ * (`itemAfterGlyphInsideLeftX`), so the inset and the glyph can't
118
+ * disagree. The inset applies to every caption line, not only line 1,
119
+ * so the caption's left edge stays straight.
120
+ */
121
+ export declare function itemCaptionInsetX(hasLinkIcon: boolean, afterGlyph?: ItemCaptionAfterGlyph): number;
41
122
  /**
42
123
  * Horizontal gap (px) between consecutive decorations (status dot,
43
124
  * link icon, footnote, title) when they spill into the column to
@@ -97,6 +178,81 @@ export declare const INLINE_DATE_GLYPH_GAP_PX = 4;
97
178
  * glyphs don't overlap inside narrow bars.
98
179
  */
99
180
  export declare const MIN_BAR_WIDTH_FOR_INLINE_DATE_PX: number;
181
+ /**
182
+ * True when a bar of painted width `barWidth` is too narrow to host the
183
+ * inline-date glyph inside, so it spills (`before:` right, `after:` left).
184
+ * The one threshold behind the glyph's `spilled` flag and the caption
185
+ * inset's decision to reserve room for it.
186
+ */
187
+ export declare function inlineDateGlyphSpills(barWidth: number): boolean;
188
+ /**
189
+ * Left x of the `after:` inline-date glyph when it sits INSIDE the bar,
190
+ * for a bar whose left edge is at `leftEdge`:
191
+ *
192
+ * - no link icon: the glyph sits at the leftmost top-decoration slot,
193
+ * `INLINE_DATE_GLYPH_INSET_LEFT_PX` (6) from the edge
194
+ * - link icon: one `INLINE_DATE_GLYPH_GAP_PX` right of the tile's right
195
+ * edge (6 + 14 + 4 = 24 from the edge)
196
+ *
197
+ * The one formula behind both the glyph placement
198
+ * (`computeItemInlineDatePins`) and the caption's left inset
199
+ * (`itemCaptionInsetX`), so the two can never disagree. Pass
200
+ * `leftEdge = 0` to get the offset from the bar's left edge.
201
+ */
202
+ export declare function itemAfterGlyphInsideLeftX(leftEdge: number, hasLinkIcon: boolean): number;
203
+ /**
204
+ * Left x of the `before:` inline-date glyph when it sits INSIDE the bar,
205
+ * for a bar whose right edge is at `rightEdge`. The glyph walks LEFT
206
+ * from the rightmost top-decoration slot:
207
+ *
208
+ * - rightmost footnote anchors at (rightEdge - INSET_RIGHT_PX)
209
+ * - the leftmost footnote sits one step further left per extra digit
210
+ * - the status dot's left edge sits at (rightEdge - INSET_RIGHT - DOT_RADIUS)
211
+ * - the glyph sits one `INLINE_DATE_GLYPH_GAP_PX` further left than
212
+ * whichever of those is leftmost (footnotes win when present, since
213
+ * they are always left of the dot)
214
+ *
215
+ * The one formula behind both the glyph placement
216
+ * (`computeItemInlineDatePins`) and the title first-line clearance
217
+ * (`itemTitleFirstLineRightReservePx`), so the two can never disagree.
218
+ * Pass `rightEdge = 0` to get the offset from the bar's right edge
219
+ * (negative, inside the bar) with exact integer arithmetic.
220
+ */
221
+ export declare function itemBeforeGlyphInsideLeftX(rightEdge: number, footnoteCount: number): number;
222
+ export interface ItemTitleFirstLineReserveInputs {
223
+ /** Painted bar width (px): `box.width`. */
224
+ barWidth: number;
225
+ /**
226
+ * Footnote indicator labels in the order the renderer paints them,
227
+ * left to right (ascending footnote number). Empty when the item
228
+ * carries no footnote.
229
+ */
230
+ footnoteLabels: readonly string[];
231
+ /** True when the item has an inline `before:DATE` glyph. */
232
+ hasBeforeGlyph: boolean;
233
+ }
234
+ /**
235
+ * Right-side space (px) the FIRST title line must leave free, measured
236
+ * from the bar's right edge: the larger of the plain right inset
237
+ * (`ITEM_CAPTION_INSET_X_PX`) and the distance to the top-right
238
+ * cluster's left edge plus `ITEM_DECORATION_SPILL_GAP_PX` of air.
239
+ *
240
+ * The cluster is the leftmost of three parts, each counted only when it
241
+ * renders INSIDE the bar (a narrow bar spills it into the column to the
242
+ * right instead, where it can't touch the title):
243
+ *
244
+ * - status dot: left edge at (right - 17); absent below
245
+ * `MIN_BAR_WIDTH_FOR_DOT_PX`. Dot only gives 21.
246
+ * - footnote digits: leftmost digit's left edge at
247
+ * (right - 22 - (n-1) * 8 - width); absent when they spill
248
+ * (`MIN_BAR_WIDTH_FOR_FOOTNOTE_PX`).
249
+ * - `before:` glyph: its left x, from `itemBeforeGlyphInsideLeftX`;
250
+ * absent when it spills (`MIN_BAR_WIDTH_FOR_INLINE_DATE_PX`).
251
+ *
252
+ * Offsets are computed from a right edge of 0 (inside the bar is
253
+ * negative) so the common cases are exact integers.
254
+ */
255
+ export declare function itemTitleFirstLineRightReservePx(opts: ItemTitleFirstLineReserveInputs): number;
100
256
  /** Height (px) of a label chip rectangle. */
101
257
  export declare const LABEL_CHIP_HEIGHT_PX = 13;
102
258
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"item-bar-geometry.d.ts","sourceRoot":"","sources":["../src/item-bar-geometry.ts"],"names":[],"mappings":"AAkBA,wEAAwE;AACxE,eAAO,MAAM,uBAAuB,KAAK,CAAC;AAE1C;;;;;GAKG;AACH,eAAO,MAAM,yBAAyB,IAAI,CAAC;AAE3C,8DAA8D;AAC9D,eAAO,MAAM,qCAAqC,KAAK,CAAC;AAExD,2EAA2E;AAC3E,eAAO,MAAM,oCAAoC,KAAK,CAAC;AAEvD,wCAAwC;AACxC,eAAO,MAAM,+BAA+B,KAAK,CAAC;AAElD,uCAAuC;AACvC,eAAO,MAAM,8BAA8B,KAAK,CAAC;AAIjD,mEAAmE;AACnE,eAAO,MAAM,8BAA8B,KAAK,CAAC;AAEjD,iEAAiE;AACjE,eAAO,MAAM,4BAA4B,KAAK,CAAC;AAE/C,qCAAqC;AACrC,eAAO,MAAM,yBAAyB,IAAI,CAAC;AAI3C;;;GAGG;AACH,eAAO,MAAM,sCAAsC,KAAK,CAAC;AAEzD,oEAAoE;AACpE,eAAO,MAAM,0CAA0C,KAAK,CAAC;AAE7D;;;;GAIG;AACH,eAAO,MAAM,+BAA+B,IAAI,CAAC;AAIjD,qDAAqD;AACrD,eAAO,MAAM,2BAA2B,KAAK,CAAC;AAE9C,0EAA0E;AAC1E,eAAO,MAAM,uBAAuB,IAAI,CAAC;AAIzC;;;;GAIG;AACH,eAAO,MAAM,4BAA4B,IAAI,CAAC;AAE9C;;;;;GAKG;AACH,eAAO,MAAM,wBAAwB,QAA6D,CAAC;AAEnG;;;;;;;GAOG;AACH,eAAO,MAAM,iCAAiC,QAKjB,CAAC;AAE9B;;;;;GAKG;AACH,eAAO,MAAM,6BAA6B,QAA6C,CAAC;AAUxF,+DAA+D;AAC/D,eAAO,MAAM,8BAA8B,KAAK,CAAC;AAEjD;;qBAEqB;AACrB,eAAO,MAAM,+BAA+B,IAAI,CAAC;AAEjD;;uCAEuC;AACvC,eAAO,MAAM,gCAAgC,IAAI,CAAC;AAElD,qEAAqE;AACrE,eAAO,MAAM,8BAA8B,IAAI,CAAC;AAEhD;;;8CAG8C;AAC9C,eAAO,MAAM,wBAAwB,IAA+B,CAAC;AAErE;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,gCAAgC,QAKT,CAAC;AAIrC,6CAA6C;AAC7C,eAAO,MAAM,oBAAoB,KAAK,CAAC;AAEvC;;;;GAIG;AACH,eAAO,MAAM,sCAAsC,IAAI,CAAC;AAExD,8DAA8D;AAC9D,eAAO,MAAM,yBAAyB,IAAI,CAAC;AAE3C;;;GAGG;AACH,eAAO,MAAM,qBAAqB,IAAI,CAAC;AAEvC;;;GAGG;AACH,eAAO,MAAM,sBAAsB,QAA+C,CAAC;AAEnF;;;;;;;;GAQG;AACH,eAAO,MAAM,wBAAwB,OAAO,CAAC;AAE7C,MAAM,WAAW,aAAa,CAAC,CAAC;IAC5B,EAAE,EAAE,CAAC,CAAC;IACN,KAAK,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa,CAAC,CAAC;IAC5B;;qBAEiB;IACjB,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IAC3B;;qDAEiD;IACjD,QAAQ,EAAE,OAAO,CAAC;CACrB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAC5B,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,EACzB,cAAc,EAAE,MAAM,GACvB,aAAa,CAAC,CAAC,CAAC,CAkClB"}
1
+ {"version":3,"file":"item-bar-geometry.d.ts","sourceRoot":"","sources":["../src/item-bar-geometry.ts"],"names":[],"mappings":"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"}
@@ -13,6 +13,7 @@
13
13
  // `box`** (`box.x` for X, `box.y` for Y), with `box.height` /
14
14
  // `box.width` used as the "right edge" / "bottom edge" anchor where
15
15
  // noted.
16
+ import { estimateTextWidth } from './text-measure.js';
16
17
  // ---- Caption (title + meta text) ---------------------------------
17
18
  /** Horizontal inset (px) for the caption's left edge inside the bar. */
18
19
  export const ITEM_CAPTION_INSET_X_PX = 12;
@@ -31,6 +32,55 @@ export const ITEM_CAPTION_META_BASELINE_OFFSET_PX = 38;
31
32
  export const ITEM_CAPTION_TITLE_FONT_SIZE_PX = 13;
32
33
  /** Font size (px) of the meta text. */
33
34
  export const ITEM_CAPTION_META_FONT_SIZE_PX = 11;
35
+ /**
36
+ * Baseline-to-baseline pitch (px) between consecutive TITLE lines when
37
+ * a long title word-wraps inside the bar. The meta line sits one more
38
+ * pitch below the last title line for every extra title line, see
39
+ * `itemCaptionMetaBaselineOffset`.
40
+ */
41
+ export const ITEM_CAPTION_TITLE_LINE_HEIGHT_PX = 16;
42
+ /**
43
+ * Most title lines layout will wrap a title onto inside the bar. A
44
+ * title that needs more than this spills to the right of the bar as a
45
+ * single line instead.
46
+ */
47
+ export const ITEM_CAPTION_TITLE_MAX_LINES = 2;
48
+ /**
49
+ * Baseline Y (px from the bar's top) of the meta line when the title
50
+ * occupies `lineCount` lines. One line gives the classic
51
+ * `ITEM_CAPTION_META_BASELINE_OFFSET_PX`; each extra title line pushes
52
+ * the meta baseline down by `ITEM_CAPTION_TITLE_LINE_HEIGHT_PX`.
53
+ */
54
+ export function itemCaptionMetaBaselineOffset(lineCount) {
55
+ return (ITEM_CAPTION_META_BASELINE_OFFSET_PX +
56
+ (Math.max(1, lineCount) - 1) * ITEM_CAPTION_TITLE_LINE_HEIGHT_PX);
57
+ }
58
+ /**
59
+ * Baseline Y (px from the bar's top) of the LAST caption line: the
60
+ * meta line when the item has one, otherwise the final title line.
61
+ * Anything stacked below the caption (label chips) must clear this.
62
+ */
63
+ export function itemCaptionLastBaselineOffset(lineCount, hasMeta) {
64
+ if (hasMeta)
65
+ return itemCaptionMetaBaselineOffset(lineCount);
66
+ return (ITEM_CAPTION_TITLE_BASELINE_OFFSET_PX +
67
+ (Math.max(1, lineCount) - 1) * ITEM_CAPTION_TITLE_LINE_HEIGHT_PX);
68
+ }
69
+ /**
70
+ * Extra bar height (px) a wrapped title needs on top of the default
71
+ * `bandwidth`. The default bar is sized so the caption's last baseline
72
+ * is at most `ITEM_CAPTION_META_BASELINE_OFFSET_PX`; anything below
73
+ * that grows the bar by the overshoot:
74
+ *
75
+ * - 1 title line (with or without meta): 0.
76
+ * - 2 title lines, no meta: line 2 lands at baseline 36, so 0.
77
+ * - 2 title lines + meta: meta baseline 54, so 16.
78
+ *
79
+ * The same number is the row-pitch increase for the bar's row.
80
+ */
81
+ export function computeTitleBarExtra(lineCount, hasMeta) {
82
+ return Math.max(0, itemCaptionLastBaselineOffset(lineCount, hasMeta) - ITEM_CAPTION_META_BASELINE_OFFSET_PX);
83
+ }
34
84
  // ---- Status dot (upper-right glyph) ------------------------------
35
85
  /** Distance (px) from the bar's right edge to the dot's center. */
36
86
  export const ITEM_STATUS_DOT_INSET_RIGHT_PX = 12;
@@ -46,6 +96,12 @@ export const ITEM_STATUS_DOT_RADIUS_PX = 5;
46
96
  export const ITEM_FOOTNOTE_INDICATOR_INSET_RIGHT_PX = 22;
47
97
  /** Baseline Y (px from bar's top) for footnote indicator digits. */
48
98
  export const ITEM_FOOTNOTE_INDICATOR_BASELINE_OFFSET_PX = 14;
99
+ /**
100
+ * Font size (px) of the footnote indicator digits. The renderer paints
101
+ * them at this size and layout measures them with it (to find the
102
+ * cluster's left edge), so both read the same constant.
103
+ */
104
+ export const ITEM_FOOTNOTE_INDICATOR_FONT_SIZE_PX = 10;
49
105
  /**
50
106
  * Horizontal step (px) between consecutive footnote indicators when
51
107
  * an item carries more than one footnote — they walk LEFT from the
@@ -57,6 +113,48 @@ export const ITEM_FOOTNOTE_INDICATOR_STEP_PX = 8;
57
113
  export const ITEM_LINK_ICON_TILE_SIZE_PX = 14;
58
114
  /** Distance (px) from the bar's right/bottom edges to the tile's edge. */
59
115
  export const ITEM_LINK_ICON_INSET_PX = 6;
116
+ /**
117
+ * Horizontal gap (px) between the link-icon tile's right edge and the
118
+ * start of the caption text when both render inside the bar.
119
+ */
120
+ export const ITEM_LINK_ICON_TO_CAPTION_GAP_PX = 4;
121
+ /**
122
+ * Left inset (px) of the in-bar caption from the bar's left edge. It is
123
+ * `ITEM_CAPTION_INSET_X_PX` normally, pushed right past the link-icon
124
+ * tile (and its gap) when the bar carries a link icon, and pushed right
125
+ * past the `after:` inline-date glyph (and a gap) when the bar carries
126
+ * one INSIDE it:
127
+ *
128
+ * - no link icon, no glyph: 12
129
+ * - link icon, no glyph: 24
130
+ * - glyph, no link icon: 22 (the glyph spans 6..18, plus a 4 px gap)
131
+ * - glyph and link icon: 40 (the glyph spans 24..36, plus a 4 px gap)
132
+ *
133
+ * A glyph on a bar narrower than `MIN_BAR_WIDTH_FOR_INLINE_DATE_PX`
134
+ * spills out of the bar to the left and reserves nothing.
135
+ *
136
+ * `hasLinkIcon` is the same flag `computeItemInlineDatePins` places the
137
+ * glyph with, and the glyph's right edge comes from the same helper
138
+ * (`itemAfterGlyphInsideLeftX`), so the inset and the glyph can't
139
+ * disagree. The inset applies to every caption line, not only line 1,
140
+ * so the caption's left edge stays straight.
141
+ */
142
+ export function itemCaptionInsetX(hasLinkIcon, afterGlyph) {
143
+ let inset = ITEM_CAPTION_INSET_X_PX;
144
+ if (hasLinkIcon) {
145
+ const linkColumn = ITEM_LINK_ICON_INSET_PX +
146
+ ITEM_LINK_ICON_TILE_SIZE_PX +
147
+ ITEM_LINK_ICON_TO_CAPTION_GAP_PX -
148
+ ITEM_CAPTION_INSET_X_PX;
149
+ inset = ITEM_CAPTION_INSET_X_PX + Math.max(0, linkColumn);
150
+ }
151
+ if (afterGlyph && !inlineDateGlyphSpills(afterGlyph.barWidth)) {
152
+ // Offsets from a left edge of 0, so the numbers are exact integers.
153
+ const glyphRight = itemAfterGlyphInsideLeftX(0, hasLinkIcon) + INLINE_DATE_GLYPH_TILE_SIZE_PX;
154
+ inset = Math.max(inset, glyphRight + ITEM_DECORATION_SPILL_GAP_PX);
155
+ }
156
+ return inset;
157
+ }
60
158
  // ---- Narrow-bar decoration spill --------------------------------
61
159
  /**
62
160
  * Horizontal gap (px) between consecutive decorations (status dot,
@@ -132,6 +230,116 @@ export const MIN_BAR_WIDTH_FOR_INLINE_DATE_PX = INLINE_DATE_GLYPH_INSET_LEFT_PX
132
230
  INLINE_DATE_GLYPH_GAP_PX +
133
231
  INLINE_DATE_GLYPH_TILE_SIZE_PX +
134
232
  INLINE_DATE_GLYPH_INSET_RIGHT_PX;
233
+ /**
234
+ * True when a bar of painted width `barWidth` is too narrow to host the
235
+ * inline-date glyph inside, so it spills (`before:` right, `after:` left).
236
+ * The one threshold behind the glyph's `spilled` flag and the caption
237
+ * inset's decision to reserve room for it.
238
+ */
239
+ export function inlineDateGlyphSpills(barWidth) {
240
+ return barWidth < MIN_BAR_WIDTH_FOR_INLINE_DATE_PX;
241
+ }
242
+ /**
243
+ * Left x of the `after:` inline-date glyph when it sits INSIDE the bar,
244
+ * for a bar whose left edge is at `leftEdge`:
245
+ *
246
+ * - no link icon: the glyph sits at the leftmost top-decoration slot,
247
+ * `INLINE_DATE_GLYPH_INSET_LEFT_PX` (6) from the edge
248
+ * - link icon: one `INLINE_DATE_GLYPH_GAP_PX` right of the tile's right
249
+ * edge (6 + 14 + 4 = 24 from the edge)
250
+ *
251
+ * The one formula behind both the glyph placement
252
+ * (`computeItemInlineDatePins`) and the caption's left inset
253
+ * (`itemCaptionInsetX`), so the two can never disagree. Pass
254
+ * `leftEdge = 0` to get the offset from the bar's left edge.
255
+ */
256
+ export function itemAfterGlyphInsideLeftX(leftEdge, hasLinkIcon) {
257
+ return hasLinkIcon
258
+ ? leftEdge +
259
+ ITEM_LINK_ICON_INSET_PX +
260
+ ITEM_LINK_ICON_TILE_SIZE_PX +
261
+ INLINE_DATE_GLYPH_GAP_PX
262
+ : leftEdge + INLINE_DATE_GLYPH_INSET_LEFT_PX;
263
+ }
264
+ /**
265
+ * Left x of the `before:` inline-date glyph when it sits INSIDE the bar,
266
+ * for a bar whose right edge is at `rightEdge`. The glyph walks LEFT
267
+ * from the rightmost top-decoration slot:
268
+ *
269
+ * - rightmost footnote anchors at (rightEdge - INSET_RIGHT_PX)
270
+ * - the leftmost footnote sits one step further left per extra digit
271
+ * - the status dot's left edge sits at (rightEdge - INSET_RIGHT - DOT_RADIUS)
272
+ * - the glyph sits one `INLINE_DATE_GLYPH_GAP_PX` further left than
273
+ * whichever of those is leftmost (footnotes win when present, since
274
+ * they are always left of the dot)
275
+ *
276
+ * The one formula behind both the glyph placement
277
+ * (`computeItemInlineDatePins`) and the title first-line clearance
278
+ * (`itemTitleFirstLineRightReservePx`), so the two can never disagree.
279
+ * Pass `rightEdge = 0` to get the offset from the bar's right edge
280
+ * (negative, inside the bar) with exact integer arithmetic.
281
+ */
282
+ export function itemBeforeGlyphInsideLeftX(rightEdge, footnoteCount) {
283
+ let anchorRightX;
284
+ if (footnoteCount > 0) {
285
+ const leftmostFootnoteCenter = rightEdge -
286
+ ITEM_FOOTNOTE_INDICATOR_INSET_RIGHT_PX -
287
+ (footnoteCount - 1) * ITEM_FOOTNOTE_INDICATOR_STEP_PX;
288
+ anchorRightX = leftmostFootnoteCenter - INLINE_DATE_GLYPH_GAP_PX;
289
+ }
290
+ else {
291
+ const dotLeftEdge = rightEdge - ITEM_STATUS_DOT_INSET_RIGHT_PX - ITEM_STATUS_DOT_RADIUS_PX;
292
+ anchorRightX = dotLeftEdge - INLINE_DATE_GLYPH_GAP_PX;
293
+ }
294
+ return anchorRightX - INLINE_DATE_GLYPH_TILE_SIZE_PX;
295
+ }
296
+ /**
297
+ * Right-side space (px) the FIRST title line must leave free, measured
298
+ * from the bar's right edge: the larger of the plain right inset
299
+ * (`ITEM_CAPTION_INSET_X_PX`) and the distance to the top-right
300
+ * cluster's left edge plus `ITEM_DECORATION_SPILL_GAP_PX` of air.
301
+ *
302
+ * The cluster is the leftmost of three parts, each counted only when it
303
+ * renders INSIDE the bar (a narrow bar spills it into the column to the
304
+ * right instead, where it can't touch the title):
305
+ *
306
+ * - status dot: left edge at (right - 17); absent below
307
+ * `MIN_BAR_WIDTH_FOR_DOT_PX`. Dot only gives 21.
308
+ * - footnote digits: leftmost digit's left edge at
309
+ * (right - 22 - (n-1) * 8 - width); absent when they spill
310
+ * (`MIN_BAR_WIDTH_FOR_FOOTNOTE_PX`).
311
+ * - `before:` glyph: its left x, from `itemBeforeGlyphInsideLeftX`;
312
+ * absent when it spills (`MIN_BAR_WIDTH_FOR_INLINE_DATE_PX`).
313
+ *
314
+ * Offsets are computed from a right edge of 0 (inside the bar is
315
+ * negative) so the common cases are exact integers.
316
+ */
317
+ export function itemTitleFirstLineRightReservePx(opts) {
318
+ const { barWidth, footnoteLabels, hasBeforeGlyph } = opts;
319
+ let clusterLeft = Number.POSITIVE_INFINITY;
320
+ if (barWidth >= MIN_BAR_WIDTH_FOR_DOT_PX) {
321
+ clusterLeft = Math.min(clusterLeft, -(ITEM_STATUS_DOT_INSET_RIGHT_PX + ITEM_STATUS_DOT_RADIUS_PX));
322
+ }
323
+ const footnoteCount = footnoteLabels.length;
324
+ const footnotesInside = footnoteCount > 0 && barWidth >= MIN_BAR_WIDTH_FOR_FOOTNOTE_PX;
325
+ if (footnotesInside) {
326
+ // Digit `k` (0 = leftmost) anchors its RIGHT end at
327
+ // `-22 - (n-1-k) * 8`, so its left edge is that minus its width.
328
+ // Normally digit 0 reaches furthest left; checking all of them
329
+ // also covers a wide late digit (e.g. footnote 100 next to 9).
330
+ for (let k = 0; k < footnoteCount; k += 1) {
331
+ const anchorX = -ITEM_FOOTNOTE_INDICATOR_INSET_RIGHT_PX -
332
+ (footnoteCount - 1 - k) * ITEM_FOOTNOTE_INDICATOR_STEP_PX;
333
+ const left = anchorX -
334
+ estimateTextWidth(footnoteLabels[k], ITEM_FOOTNOTE_INDICATOR_FONT_SIZE_PX);
335
+ clusterLeft = Math.min(clusterLeft, left);
336
+ }
337
+ }
338
+ if (hasBeforeGlyph && barWidth >= MIN_BAR_WIDTH_FOR_INLINE_DATE_PX) {
339
+ clusterLeft = Math.min(clusterLeft, itemBeforeGlyphInsideLeftX(0, footnoteCount));
340
+ }
341
+ return Math.max(ITEM_CAPTION_INSET_X_PX, -clusterLeft + ITEM_DECORATION_SPILL_GAP_PX);
342
+ }
135
343
  // ---- Label chips (along the bar's bottom) ------------------------
136
344
  /** Height (px) of a label chip rectangle. */
137
345
  export const LABEL_CHIP_HEIGHT_PX = 13;
@@ -1 +1 @@
1
- {"version":3,"file":"item-bar-geometry.js","sourceRoot":"","sources":["../src/item-bar-geometry.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,oEAAoE;AACpE,oEAAoE;AACpE,8CAA8C;AAC9C,EAAE;AACF,iEAAiE;AACjE,sEAAsE;AACtE,qEAAqE;AACrE,oEAAoE;AACpE,wCAAwC;AACxC,EAAE;AACF,kEAAkE;AAClE,8DAA8D;AAC9D,oEAAoE;AACpE,SAAS;AAET,qEAAqE;AAErE,wEAAwE;AACxE,MAAM,CAAC,MAAM,uBAAuB,GAAG,EAAE,CAAC;AAE1C;;;;;GAKG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,CAAC;AAE3C,8DAA8D;AAC9D,MAAM,CAAC,MAAM,qCAAqC,GAAG,EAAE,CAAC;AAExD,2EAA2E;AAC3E,MAAM,CAAC,MAAM,oCAAoC,GAAG,EAAE,CAAC;AAEvD,wCAAwC;AACxC,MAAM,CAAC,MAAM,+BAA+B,GAAG,EAAE,CAAC;AAElD,uCAAuC;AACvC,MAAM,CAAC,MAAM,8BAA8B,GAAG,EAAE,CAAC;AAEjD,qEAAqE;AAErE,mEAAmE;AACnE,MAAM,CAAC,MAAM,8BAA8B,GAAG,EAAE,CAAC;AAEjD,iEAAiE;AACjE,MAAM,CAAC,MAAM,4BAA4B,GAAG,EAAE,CAAC;AAE/C,qCAAqC;AACrC,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,CAAC;AAE3C,qEAAqE;AAErE;;;GAGG;AACH,MAAM,CAAC,MAAM,sCAAsC,GAAG,EAAE,CAAC;AAEzD,oEAAoE;AACpE,MAAM,CAAC,MAAM,0CAA0C,GAAG,EAAE,CAAC;AAE7D;;;;GAIG;AACH,MAAM,CAAC,MAAM,+BAA+B,GAAG,CAAC,CAAC;AAEjD,qEAAqE;AAErE,qDAAqD;AACrD,MAAM,CAAC,MAAM,2BAA2B,GAAG,EAAE,CAAC;AAE9C,0EAA0E;AAC1E,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC;AAEzC,oEAAoE;AAEpE;;;;GAIG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,CAAC;AAE9C;;;;;GAKG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,8BAA8B,GAAG,yBAAyB,CAAC;AAEnG;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,iCAAiC,GAC1C,uBAAuB;IACvB,2BAA2B;IAC3B,4BAA4B;IAC5B,8BAA8B;IAC9B,yBAAyB,CAAC;AAE9B;;;;;GAKG;AACH,MAAM,CAAC,MAAM,6BAA6B,GAAG,sCAAsC,GAAG,CAAC,CAAC;AAExF,qEAAqE;AACrE,EAAE;AACF,uEAAuE;AACvE,mEAAmE;AACnE,sEAAsE;AACtE,wDAAwD;AACxD,0CAA0C;AAE1C,+DAA+D;AAC/D,MAAM,CAAC,MAAM,8BAA8B,GAAG,EAAE,CAAC;AAEjD;;qBAEqB;AACrB,MAAM,CAAC,MAAM,+BAA+B,GAAG,CAAC,CAAC;AAEjD;;uCAEuC;AACvC,MAAM,CAAC,MAAM,gCAAgC,GAAG,CAAC,CAAC;AAElD,qEAAqE;AACrE,MAAM,CAAC,MAAM,8BAA8B,GAAG,CAAC,CAAC;AAEhD;;;8CAG8C;AAC9C,MAAM,CAAC,MAAM,wBAAwB,GAAG,4BAA4B,CAAC;AAErE;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,gCAAgC,GACzC,+BAA+B;IAC/B,8BAA8B;IAC9B,wBAAwB;IACxB,8BAA8B;IAC9B,gCAAgC,CAAC;AAErC,qEAAqE;AAErE,6CAA6C;AAC7C,MAAM,CAAC,MAAM,oBAAoB,GAAG,EAAE,CAAC;AAEvC;;;;GAIG;AACH,MAAM,CAAC,MAAM,sCAAsC,GAAG,CAAC,CAAC;AAExD,8DAA8D;AAC9D,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,CAAC;AAE3C;;;GAGG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC;AAEvC;;;GAGG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,oBAAoB,GAAG,qBAAqB,CAAC;AAEnF;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,IAAI,CAAC;AAkB7C;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,cAAc,CAC1B,KAAyB,EACzB,cAAsB;IAEtB,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IAC/D,MAAM,IAAI,GAAyB,CAAC,EAAE,CAAC,CAAC;IACxC,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,IAAI,MAAM,GAAG,cAAc,CAAC;IAC5B,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACvB,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAClC,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,yBAAyB,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC;QAC/E,MAAM,OAAO,GAAG,IAAI,GAAG,MAAM,CAAC;QAC9B,IAAI,OAAO,IAAI,MAAM,EAAE,CAAC;YACpB,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACf,IAAI,GAAG,OAAO,CAAC;YACf,SAAS;QACb,CAAC;QACD,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACnB,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACf,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC;YAClB,SAAS;QACb,CAAC;QACD,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,CAAC;QAClC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,wBAAwB,CAAC;QACpD,IAAI,CAAC,QAAQ,IAAI,QAAQ,IAAI,KAAK,EAAE,CAAC;YACjC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACf,IAAI,GAAG,OAAO,CAAC;YACf,MAAM,GAAG,OAAO,CAAC;YACjB,QAAQ,GAAG,IAAI,CAAC;YAChB,SAAS;QACb,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAClB,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC;QAClB,MAAM,GAAG,cAAc,CAAC;IAC5B,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;AAC9B,CAAC"}
1
+ {"version":3,"file":"item-bar-geometry.js","sourceRoot":"","sources":["../src/item-bar-geometry.ts"],"names":[],"mappings":"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"}