@activecollab/components 2.0.371 → 2.0.373

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 (68) hide show
  1. package/dist/cjs/components/Icons/collection/ConnectionIcon.js +9 -17
  2. package/dist/cjs/components/Icons/collection/ConnectionIcon.js.map +1 -1
  3. package/dist/cjs/components/Icons/collection/ShapesIcon.js +61 -0
  4. package/dist/cjs/components/Icons/collection/ShapesIcon.js.map +1 -0
  5. package/dist/cjs/components/Icons/collection/index.js +7 -0
  6. package/dist/cjs/components/Icons/collection/index.js.map +1 -1
  7. package/dist/cjs/components/StackedCard/StackedCard.js +103 -19
  8. package/dist/cjs/components/StackedCard/StackedCard.js.map +1 -1
  9. package/dist/cjs/components/StackedCard/Styles.js +23 -18
  10. package/dist/cjs/components/StackedCard/Styles.js.map +1 -1
  11. package/dist/cjs/components/StackedCard/index.js +22 -0
  12. package/dist/cjs/components/StackedCard/index.js.map +1 -1
  13. package/dist/cjs/components/StackedCard/resizePolicy.js +238 -0
  14. package/dist/cjs/components/StackedCard/resizePolicy.js.map +1 -0
  15. package/dist/cjs/components/StackedCard/resizePolicy.test.js +474 -0
  16. package/dist/cjs/components/StackedCard/resizePolicy.test.js.map +1 -0
  17. package/dist/cjs/components/StackedCard/useStackedCardResize.js +145 -0
  18. package/dist/cjs/components/StackedCard/useStackedCardResize.js.map +1 -0
  19. package/dist/cjs/presentation/stackedCard/content/LinkCard.js +35 -22
  20. package/dist/cjs/presentation/stackedCard/content/LinkCard.js.map +1 -1
  21. package/dist/esm/components/Icons/collection/ConnectionIcon.d.ts.map +1 -1
  22. package/dist/esm/components/Icons/collection/ConnectionIcon.js +9 -17
  23. package/dist/esm/components/Icons/collection/ConnectionIcon.js.map +1 -1
  24. package/dist/esm/components/Icons/collection/ShapesIcon.d.ts +32 -0
  25. package/dist/esm/components/Icons/collection/ShapesIcon.d.ts.map +1 -0
  26. package/dist/esm/components/Icons/collection/ShapesIcon.js +54 -0
  27. package/dist/esm/components/Icons/collection/ShapesIcon.js.map +1 -0
  28. package/dist/esm/components/Icons/collection/index.d.ts +1 -0
  29. package/dist/esm/components/Icons/collection/index.d.ts.map +1 -1
  30. package/dist/esm/components/Icons/collection/index.js +1 -0
  31. package/dist/esm/components/Icons/collection/index.js.map +1 -1
  32. package/dist/esm/components/StackedCard/StackedCard.d.ts +44 -3
  33. package/dist/esm/components/StackedCard/StackedCard.d.ts.map +1 -1
  34. package/dist/esm/components/StackedCard/StackedCard.js +102 -19
  35. package/dist/esm/components/StackedCard/StackedCard.js.map +1 -1
  36. package/dist/esm/components/StackedCard/Styles.d.ts +4 -1
  37. package/dist/esm/components/StackedCard/Styles.d.ts.map +1 -1
  38. package/dist/esm/components/StackedCard/Styles.js +23 -18
  39. package/dist/esm/components/StackedCard/Styles.js.map +1 -1
  40. package/dist/esm/components/StackedCard/index.d.ts +2 -0
  41. package/dist/esm/components/StackedCard/index.d.ts.map +1 -1
  42. package/dist/esm/components/StackedCard/index.js +2 -0
  43. package/dist/esm/components/StackedCard/index.js.map +1 -1
  44. package/dist/esm/components/StackedCard/resizePolicy.d.ts +111 -0
  45. package/dist/esm/components/StackedCard/resizePolicy.d.ts.map +1 -0
  46. package/dist/esm/{presentation/stackedCard → components/StackedCard}/resizePolicy.js +93 -48
  47. package/dist/esm/components/StackedCard/resizePolicy.js.map +1 -0
  48. package/dist/esm/components/StackedCard/resizePolicy.test.d.ts +2 -0
  49. package/dist/esm/components/StackedCard/resizePolicy.test.d.ts.map +1 -0
  50. package/dist/esm/components/StackedCard/resizePolicy.test.js +470 -0
  51. package/dist/esm/components/StackedCard/resizePolicy.test.js.map +1 -0
  52. package/dist/esm/components/StackedCard/useStackedCardResize.d.ts +62 -0
  53. package/dist/esm/components/StackedCard/useStackedCardResize.d.ts.map +1 -0
  54. package/dist/esm/components/StackedCard/useStackedCardResize.js +137 -0
  55. package/dist/esm/components/StackedCard/useStackedCardResize.js.map +1 -0
  56. package/dist/esm/presentation/stackedCard/content/LinkCard.d.ts.map +1 -1
  57. package/dist/esm/presentation/stackedCard/content/LinkCard.js +35 -20
  58. package/dist/esm/presentation/stackedCard/content/LinkCard.js.map +1 -1
  59. package/dist/index.js +989 -482
  60. package/dist/index.js.map +1 -1
  61. package/dist/index.min.js +1 -1
  62. package/dist/index.min.js.map +1 -1
  63. package/package.json +1 -1
  64. package/dist/cjs/presentation/stackedCard/resizePolicy.js +0 -183
  65. package/dist/cjs/presentation/stackedCard/resizePolicy.js.map +0 -1
  66. package/dist/esm/presentation/stackedCard/resizePolicy.d.ts +0 -97
  67. package/dist/esm/presentation/stackedCard/resizePolicy.d.ts.map +0 -1
  68. package/dist/esm/presentation/stackedCard/resizePolicy.js.map +0 -1
@@ -93,7 +93,7 @@ StyledStackedCardCoverMedia.displayName = "StyledStackedCardCoverMedia";
93
93
  var StyledStackedCardCoverFill = exports.StyledStackedCardCoverFill = _styledComponents.default.div.withConfig({
94
94
  displayName: "Styles__StyledStackedCardCoverFill",
95
95
  componentId: "sc-vnqm9x-3"
96
- })(["position:absolute;inset:0;> *{width:100%;height:100%;}> img{display:block;object-fit:cover;}"]);
96
+ })(["position:absolute;inset:0;> *{width:100%;height:100%;}> img{display:block;object-fit:cover;}> img,> svg{-webkit-user-drag:none;user-select:none;pointer-events:none;}"]);
97
97
  StyledStackedCardCoverFill.displayName = "StyledStackedCardCoverFill";
98
98
  var StyledStackedCardCoverCenter = exports.StyledStackedCardCoverCenter = _styledComponents.default.div.withConfig({
99
99
  displayName: "Styles__StyledStackedCardCoverCenter",
@@ -149,10 +149,15 @@ StyledStackedCardCoverButton.displayName = "StyledStackedCardCoverButton";
149
149
  /* Resize (opt-in): handle on hover, the card only reports deltas */
150
150
  /* ------------------------------------------------------------------ */
151
151
 
152
+ /* The grip is a focusable separator, so it needs a focus ring of its own — a
153
+ keyboard user has no pointer to tell them where they are. */
152
154
  var StyledStackedCardResizeHandle = exports.StyledStackedCardResizeHandle = _styledComponents.default.span.withConfig({
153
155
  displayName: "Styles__StyledStackedCardResizeHandle",
154
156
  componentId: "sc-vnqm9x-10"
155
- })(["position:absolute;right:2px;bottom:2px;width:14px;height:14px;cursor:nwse-resize;color:var(--color-theme-600);z-index:2;svg{display:block;}"]);
157
+ })(["position:absolute;right:2px;bottom:2px;display:inline-flex;align-items:center;justify-content:center;width:14px;height:14px;border-radius:4px;cursor:", ";color:var(--color-theme-600);z-index:2;&:hover{color:var(--color-theme-900);}&:focus-visible{outline:2px solid ", ";outline-offset:1px;color:var(--color-theme-900);}svg{display:block;}"], function (_ref8) {
158
+ var $axis = _ref8.$axis;
159
+ return $axis === "width" ? "ew-resize" : "nwse-resize";
160
+ }, SELECTION_RING);
156
161
  StyledStackedCardResizeHandle.displayName = "StyledStackedCardResizeHandle";
157
162
 
158
163
  /* ------------------------------------------------------------------ */
@@ -163,29 +168,29 @@ var hoverStyle = (0, _styledComponents.css)(["box-shadow:0 4px 12px rgba(0,0,0,0
163
168
  var StyledStackedCard = exports.StyledStackedCard = _styledComponents.default.div.withConfig({
164
169
  displayName: "Styles__StyledStackedCard",
165
170
  componentId: "sc-vnqm9x-11"
166
- })(["", " position:relative;display:flex;flex-direction:column;width:", "px;border-radius:", "px;background-color:var(--page-paper-main);border:1px solid var(--border-primary);box-shadow:0 1px 3px rgba(0,0,0,0.08);overflow:hidden;transition:box-shadow 150ms ease,border-color 150ms ease;", " &:hover{", "}&:focus-visible{outline:none;", " box-shadow:0 0 0 2px ", ";}", " ", " ", " ", " ", " ", " ", " ", ""], _BoxSizingStyle.BoxSizingStyle, _constants.STACKED_CARD_WIDTH, _constants.STACKED_CARD_RADIUS, revealControls, hoverStyle, hoverStyle, SELECTION_RING, function (_ref8) {
167
- var $forceHover = _ref8.$forceHover;
171
+ })(["", " position:relative;display:flex;flex-direction:column;width:", "px;border-radius:", "px;background-color:var(--page-paper-main);border:1px solid var(--border-primary);box-shadow:0 1px 3px rgba(0,0,0,0.08);overflow:hidden;transition:box-shadow 150ms ease,border-color 150ms ease;", " &:hover{", "}&:focus-visible{outline:none;", " box-shadow:0 0 0 2px ", ";}", " ", " ", " ", " ", " ", " ", " ", ""], _BoxSizingStyle.BoxSizingStyle, _constants.STACKED_CARD_WIDTH, _constants.STACKED_CARD_RADIUS, revealControls, hoverStyle, hoverStyle, SELECTION_RING, function (_ref9) {
172
+ var $forceHover = _ref9.$forceHover;
168
173
  return $forceHover && (0, _styledComponents.css)(["", " && ", "{opacity:1;}"], hoverStyle, CONTROL);
169
- }, function (_ref9) {
170
- var $priorityColor = _ref9.$priorityColor;
171
- return $priorityColor && (0, _styledComponents.css)(["&::before{content:\"\";position:absolute;top:0;bottom:0;left:0;width:4px;background:", ";z-index:2;}"], $priorityColor);
172
174
  }, function (_ref0) {
173
- var $selected = _ref0.$selected;
174
- return $selected && (0, _styledComponents.css)(["border-color:", ";box-shadow:0 0 0 2px ", ";"], SELECTION_RING, SELECTION_RING);
175
+ var $priorityColor = _ref0.$priorityColor;
176
+ return $priorityColor && (0, _styledComponents.css)(["&::before{content:\"\";position:absolute;top:0;bottom:0;left:0;width:4px;background:", ";z-index:2;}"], $priorityColor);
175
177
  }, function (_ref1) {
176
- var $disabled = _ref1.$disabled;
177
- return $disabled && (0, _styledComponents.css)(["opacity:0.5;pointer-events:none;"]);
178
+ var $selected = _ref1.$selected;
179
+ return $selected && (0, _styledComponents.css)(["&&{border-color:", ";box-shadow:0 0 0 2px ", ";}"], SELECTION_RING, SELECTION_RING);
178
180
  }, function (_ref10) {
179
- var $pending = _ref10.$pending;
180
- return $pending && (0, _styledComponents.css)(["opacity:0.6;pointer-events:none;cursor:progress;"]);
181
+ var $disabled = _ref10.$disabled;
182
+ return $disabled && (0, _styledComponents.css)(["opacity:0.5;pointer-events:none;"]);
181
183
  }, function (_ref11) {
182
- var $isDragSource = _ref11.$isDragSource;
183
- return $isDragSource && (0, _styledComponents.css)(["background:transparent;border:1px dashed var(--color-theme-500);box-shadow:none;&:hover{box-shadow:none;border-color:var(--color-theme-500);}> *{visibility:hidden;}"]);
184
+ var $pending = _ref11.$pending;
185
+ return $pending && (0, _styledComponents.css)(["opacity:0.6;pointer-events:none;cursor:progress;"]);
184
186
  }, function (_ref12) {
185
- var $isDragPreview = _ref12.$isDragPreview;
186
- return $isDragPreview && (0, _styledComponents.css)(["box-shadow:0 12px 28px rgba(0,0,0,0.24);cursor:grabbing;"]);
187
+ var $isDragSource = _ref12.$isDragSource;
188
+ return $isDragSource && (0, _styledComponents.css)(["background:transparent;border:1px dashed var(--color-theme-500);box-shadow:none;&:hover{box-shadow:none;border-color:var(--color-theme-500);}> *{visibility:hidden;}"]);
187
189
  }, function (_ref13) {
188
- var $entered = _ref13.$entered;
190
+ var $isDragPreview = _ref13.$isDragPreview;
191
+ return $isDragPreview && (0, _styledComponents.css)(["box-shadow:0 12px 28px rgba(0,0,0,0.24);cursor:grabbing;"]);
192
+ }, function (_ref14) {
193
+ var $entered = _ref14.$entered;
189
194
  return $entered && (0, _styledComponents.css)(["&&{border-color:", ";box-shadow:inset 0 0 0 2px ", ",0 0 0 2px ", ";}"], SELECTION_RING, SELECTION_RING, SELECTION_RING);
190
195
  });
191
196
  StyledStackedCard.displayName = "StyledStackedCard";
@@ -1 +1 @@
1
- {"version":3,"file":"Styles.js","names":["_styledComponents","_interopRequireWildcard","require","_constants","_BoxSizingStyle","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","_t","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","SELECTION_RING","SCRIM","SCRIM_STRONG","SCRIM_FG","CONTROL","concat","STACKED_CARD_CONTROL_CLASS","revealControls","css","StyledStackedCardStack","exports","styled","div","withConfig","displayName","componentId","BoxSizingStyle","StyledStackedCardRow","_ref","$direction","_ref2","_ref3","_ref4","$role","$bleed","STACKED_CARD_ROLE_PADDING","_ref5","$background","_ref6","STACKED_CARD_FIXED_ATTR","StyledStackedCardCoverMedia","_ref7","$aspectRatio","StyledStackedCardCoverFill","StyledStackedCardCoverCenter","StyledStackedCardCoverTopRight","StyledStackedCardCollapsedStrip","button","StyledStackedCardStripExpand","span","StyledStackedCardPlayBadge","StyledStackedCardCoverButton","StyledStackedCardResizeHandle","hoverStyle","StyledStackedCard","STACKED_CARD_WIDTH","STACKED_CARD_RADIUS","_ref8","$forceHover","_ref9","$priorityColor","_ref0","$selected","_ref1","$disabled","_ref10","$pending","_ref11","$isDragSource","_ref12","$isDragPreview","_ref13","$entered"],"sources":["../../../../src/components/StackedCard/Styles.ts"],"sourcesContent":["import styled, { css } from \"styled-components\";\n\nimport {\n STACKED_CARD_CONTROL_CLASS,\n STACKED_CARD_FIXED_ATTR,\n STACKED_CARD_RADIUS,\n STACKED_CARD_ROLE_PADDING,\n STACKED_CARD_WIDTH,\n StackedCardRowDirection,\n StackedCardRowRole,\n} from \"./constants\";\nimport { BoxSizingStyle } from \"../BoxSizingStyle\";\n\n/**\n * Theming hooks.\n *\n * Every colour a StackedCard part needs is read through a `--sc-*` custom\n * property with a built-in fallback, so the component looks right standing on\n * its own and a host surface can still retint it by declaring the variable on\n * any ancestor. No rgba/hex is baked into a rule; data colours (a swatch value,\n * a priority colour) are always passed in by the caller.\n */\nconst SELECTION_RING = \"var(--sc-selection-ring, var(--color-primary-500))\";\nconst SCRIM = \"var(--sc-scrim, rgba(0, 0, 0, 0.55))\";\nconst SCRIM_STRONG = \"var(--sc-scrim-strong, rgba(0, 0, 0, 0.72))\";\nconst SCRIM_FG = \"var(--sc-scrim-fg, #ffffff)\";\n\n/** Selector for anything carrying the control class. */\nconst CONTROL = `.${STACKED_CARD_CONTROL_CLASS}`;\n\n/**\n * The one reveal rule the whole subsystem shares: controls are hidden until the\n * card (or the cover) is hovered OR holds focus. The focus path is what keeps\n * them reachable by keyboard instead of mouse-only.\n */\nconst revealControls = css`\n ${CONTROL} {\n opacity: 0;\n transition: opacity 120ms ease;\n }\n\n &:hover ${CONTROL}, &:focus-within ${CONTROL} {\n opacity: 1;\n }\n`;\n\n/* ------------------------------------------------------------------ */\n/* Stack — the vertical column. A card is a Stack of rows. */\n/* ------------------------------------------------------------------ */\n\nexport const StyledStackedCardStack = styled.div`\n ${BoxSizingStyle}\n\n position: relative;\n display: flex;\n flex-direction: column;\n`;\nStyledStackedCardStack.displayName = \"StyledStackedCardStack\";\n\n/* ------------------------------------------------------------------ */\n/* Row — the only layout primitive, differentiated by `role`. */\n/* ------------------------------------------------------------------ */\n\ninterface IStyledRowProps {\n $role: StackedCardRowRole;\n $bleed?: boolean;\n $direction: StackedCardRowDirection;\n $background?: string;\n}\n\nexport const StyledStackedCardRow = styled.div<IStyledRowProps>`\n ${BoxSizingStyle}\n\n position: relative;\n display: flex;\n flex-direction: ${({ $direction }) => $direction};\n align-items: ${({ $direction }) =>\n $direction === \"column\" ? \"stretch\" : \"center\"};\n gap: ${({ $direction }) => ($direction === \"column\" ? \"4px\" : \"8px\")};\n\n /* bleed overrides any role and runs the row edge to edge. */\n padding: ${({ $role, $bleed }) =>\n $bleed ? \"0\" : STACKED_CARD_ROLE_PADDING[$role]};\n\n ${({ $background }) =>\n $background &&\n css`\n background: ${$background};\n `}\n\n /* Distribution (row direction only): fixed-width children keep their width,\n the rest share what remains evenly; drop an empty spacer to push items. */\n ${({ $direction }) =>\n $direction === \"row\" &&\n css`\n > * {\n flex: 1 1 0;\n min-width: 0;\n }\n\n > [${STACKED_CARD_FIXED_ATTR}] {\n flex: 0 0 auto;\n }\n `}\n`;\nStyledStackedCardRow.displayName = \"StyledStackedCardRow\";\n\n/* ------------------------------------------------------------------ */\n/* Cover — a bleed row that holds media. */\n/* ------------------------------------------------------------------ */\n\n/**\n * The media box reserves its height with `aspect-ratio` so the image (or the\n * skeleton standing in for it) never reflows the card when it arrives.\n */\nexport const StyledStackedCardCoverMedia = styled.div<{ $aspectRatio: string }>`\n position: relative;\n width: 100%;\n aspect-ratio: ${({ $aspectRatio }) => $aspectRatio};\n overflow: hidden;\n\n ${revealControls}\n`;\nStyledStackedCardCoverMedia.displayName = \"StyledStackedCardCoverMedia\";\n\n/* The fill (an <img>, an inline <svg> wrapper, or a solid-colour box) is laid\n over the reserved box and made to cover it. */\nexport const StyledStackedCardCoverFill = styled.div`\n position: absolute;\n inset: 0;\n\n > * {\n width: 100%;\n height: 100%;\n }\n\n > img {\n display: block;\n object-fit: cover;\n }\n`;\nStyledStackedCardCoverFill.displayName = \"StyledStackedCardCoverFill\";\n\nexport const StyledStackedCardCoverCenter = styled.div`\n position: absolute;\n inset: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n`;\nStyledStackedCardCoverCenter.displayName = \"StyledStackedCardCoverCenter\";\n\nexport const StyledStackedCardCoverTopRight = styled.div`\n position: absolute;\n top: 8px;\n right: 8px;\n display: flex;\n gap: 6px;\n`;\nStyledStackedCardCoverTopRight.displayName = \"StyledStackedCardCoverTopRight\";\n\n/**\n * Collapsed cover — the media box gives way to a thin strip. The strip IS the\n * expand affordance: the whole bar is a button and a chevron hint is revealed\n * on hover or focus. It reserves no height of its own; the caller's\n * `collapsedStrip` (an ~8px colour bar, a favicon + domain row) sets how tall\n * it reads.\n */\nexport const StyledStackedCardCollapsedStrip = styled.button`\n ${BoxSizingStyle}\n\n position: relative;\n display: flex;\n align-items: center;\n width: 100%;\n min-height: 16px;\n padding: 0;\n border: 0;\n background: transparent;\n cursor: pointer;\n text-align: left;\n\n ${CONTROL} {\n opacity: 0;\n transition: opacity 120ms ease;\n }\n\n &:hover ${CONTROL}, &:focus-visible ${CONTROL} {\n opacity: 1;\n }\n\n &:focus-visible {\n outline: 2px solid ${SELECTION_RING};\n outline-offset: -2px;\n }\n`;\nStyledStackedCardCollapsedStrip.displayName = \"StyledStackedCardCollapsedStrip\";\n\n/* The expand chevron sits at the right, vertically centred, so it reads the\n same whether the strip is a hairline colour bar or a taller favicon row. */\nexport const StyledStackedCardStripExpand = styled.span`\n position: absolute;\n top: 50%;\n right: 8px;\n transform: translateY(-50%);\n display: inline-flex;\n width: 16px;\n height: 16px;\n color: var(--color-theme-600);\n\n svg {\n width: 14px;\n height: 14px;\n }\n`;\nStyledStackedCardStripExpand.displayName = \"StyledStackedCardStripExpand\";\n\n/* ------------------------------------------------------------------ */\n/* Cover chrome — scrim-backed controls that sit over media */\n/* ------------------------------------------------------------------ */\n\n/** Centered media control (a play button). The caller drops the glyph inside. */\nexport const StyledStackedCardPlayBadge = styled.span`\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 44px;\n height: 44px;\n border-radius: 12px;\n background: ${SCRIM};\n color: ${SCRIM_FG};\n\n svg {\n fill: currentColor;\n width: 20px;\n height: 20px;\n margin-left: 2px;\n }\n`;\nStyledStackedCardPlayBadge.displayName = \"StyledStackedCardPlayBadge\";\n\n/** Top-right cover-management button (collapse, remove …). */\nexport const StyledStackedCardCoverButton = styled.button`\n ${BoxSizingStyle}\n\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 30px;\n height: 30px;\n padding: 0;\n border: 0;\n border-radius: 8px;\n cursor: pointer;\n color: ${SCRIM_FG};\n background: ${SCRIM};\n\n svg {\n width: 16px;\n height: 16px;\n display: block;\n }\n\n &:hover {\n background: ${SCRIM_STRONG};\n }\n`;\nStyledStackedCardCoverButton.displayName = \"StyledStackedCardCoverButton\";\n\n/* ------------------------------------------------------------------ */\n/* Resize (opt-in): handle on hover, the card only reports deltas */\n/* ------------------------------------------------------------------ */\n\nexport const StyledStackedCardResizeHandle = styled.span`\n position: absolute;\n right: 2px;\n bottom: 2px;\n width: 14px;\n height: 14px;\n cursor: nwse-resize;\n color: var(--color-theme-600);\n z-index: 2;\n\n svg {\n display: block;\n }\n`;\nStyledStackedCardResizeHandle.displayName = \"StyledStackedCardResizeHandle\";\n\n/* ------------------------------------------------------------------ */\n/* The shell */\n/* ------------------------------------------------------------------ */\n\nexport interface IStyledStackedCardProps {\n $selected?: boolean;\n $disabled?: boolean;\n $pending?: boolean;\n $isDragSource?: boolean;\n $isDragPreview?: boolean;\n $entered?: boolean;\n $forceHover?: boolean;\n $priorityColor?: string;\n}\n\nconst hoverStyle = css`\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.12);\n border-color: var(--color-theme-500);\n`;\n\nexport const StyledStackedCard = styled.div<IStyledStackedCardProps>`\n ${BoxSizingStyle}\n\n position: relative;\n display: flex;\n flex-direction: column;\n width: ${STACKED_CARD_WIDTH}px;\n border-radius: ${STACKED_CARD_RADIUS}px;\n background-color: var(--page-paper-main);\n border: 1px solid var(--border-primary);\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08);\n overflow: hidden;\n transition: box-shadow 150ms ease, border-color 150ms ease;\n\n ${revealControls}\n\n &:hover {\n ${hoverStyle}\n }\n\n &:focus-visible {\n outline: none;\n ${hoverStyle}\n box-shadow: 0 0 0 2px ${SELECTION_RING};\n }\n\n /* Forced hover — for docs, snapshots and \"this is what hover looks like\"\n demos. The doubled ampersand gives it the specificity to beat the cover's\n own reveal rule. */\n ${({ $forceHover }) =>\n $forceHover &&\n css`\n ${hoverStyle}\n && ${CONTROL} {\n opacity: 1;\n }\n `}\n\n ${({ $priorityColor }) =>\n $priorityColor &&\n css`\n &::before {\n content: \"\";\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: 4px;\n background: ${$priorityColor};\n z-index: 2;\n }\n `}\n\n ${({ $selected }) =>\n $selected &&\n css`\n border-color: ${SELECTION_RING};\n box-shadow: 0 0 0 2px ${SELECTION_RING};\n `}\n\n ${({ $disabled }) =>\n $disabled &&\n css`\n opacity: 0.5;\n pointer-events: none;\n `}\n\n /* Pending / optimistic — created or moved, not yet confirmed by the server.\n Dimmed, non-interactive and NOT draggable, but distinct from disabled: a\n transient in-flight state, not a policy. */\n ${({ $pending }) =>\n $pending &&\n css`\n opacity: 0.6;\n pointer-events: none;\n cursor: progress;\n `}\n\n /* Drag SOURCE — full-size outline placeholder. Content is hidden but keeps\n its box (visibility, not display) so the card holds identical dimensions\n and the surrounding cards never move. */\n ${({ $isDragSource }) =>\n $isDragSource &&\n css`\n background: transparent;\n border: 1px dashed var(--color-theme-500);\n box-shadow: none;\n\n &:hover {\n box-shadow: none;\n border-color: var(--color-theme-500);\n }\n\n > * {\n visibility: hidden;\n }\n `}\n\n /* Drag PREVIEW — the 1:1 copy the host floats in its drag layer. Elevated\n shadow ONLY: no rotate, no scale, no translate. */\n ${({ $isDragPreview }) =>\n $isDragPreview &&\n css`\n box-shadow: 0 12px 28px rgba(0, 0, 0, 0.24);\n cursor: grabbing;\n `}\n\n /* Entered (focus model) — focus has moved inside, onto an inner control. */\n ${({ $entered }) =>\n $entered &&\n css`\n && {\n border-color: ${SELECTION_RING};\n box-shadow: inset 0 0 0 2px ${SELECTION_RING},\n 0 0 0 2px ${SELECTION_RING};\n }\n `}\n`;\nStyledStackedCard.displayName = \"StyledStackedCard\";\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"Styles.js","names":["_styledComponents","_interopRequireWildcard","require","_constants","_BoxSizingStyle","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","_t","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","SELECTION_RING","SCRIM","SCRIM_STRONG","SCRIM_FG","CONTROL","concat","STACKED_CARD_CONTROL_CLASS","revealControls","css","StyledStackedCardStack","exports","styled","div","withConfig","displayName","componentId","BoxSizingStyle","StyledStackedCardRow","_ref","$direction","_ref2","_ref3","_ref4","$role","$bleed","STACKED_CARD_ROLE_PADDING","_ref5","$background","_ref6","STACKED_CARD_FIXED_ATTR","StyledStackedCardCoverMedia","_ref7","$aspectRatio","StyledStackedCardCoverFill","StyledStackedCardCoverCenter","StyledStackedCardCoverTopRight","StyledStackedCardCollapsedStrip","button","StyledStackedCardStripExpand","span","StyledStackedCardPlayBadge","StyledStackedCardCoverButton","StyledStackedCardResizeHandle","_ref8","$axis","hoverStyle","StyledStackedCard","STACKED_CARD_WIDTH","STACKED_CARD_RADIUS","_ref9","$forceHover","_ref0","$priorityColor","_ref1","$selected","_ref10","$disabled","_ref11","$pending","_ref12","$isDragSource","_ref13","$isDragPreview","_ref14","$entered"],"sources":["../../../../src/components/StackedCard/Styles.ts"],"sourcesContent":["import styled, { css } from \"styled-components\";\n\nimport {\n STACKED_CARD_CONTROL_CLASS,\n STACKED_CARD_FIXED_ATTR,\n STACKED_CARD_RADIUS,\n STACKED_CARD_ROLE_PADDING,\n STACKED_CARD_WIDTH,\n StackedCardRowDirection,\n StackedCardRowRole,\n} from \"./constants\";\nimport { StackedCardResizeAxis } from \"./resizePolicy\";\nimport { BoxSizingStyle } from \"../BoxSizingStyle\";\n\n/**\n * Theming hooks.\n *\n * Every colour a StackedCard part needs is read through a `--sc-*` custom\n * property with a built-in fallback, so the component looks right standing on\n * its own and a host surface can still retint it by declaring the variable on\n * any ancestor. No rgba/hex is baked into a rule; data colours (a swatch value,\n * a priority colour) are always passed in by the caller.\n */\nconst SELECTION_RING = \"var(--sc-selection-ring, var(--color-primary-500))\";\nconst SCRIM = \"var(--sc-scrim, rgba(0, 0, 0, 0.55))\";\nconst SCRIM_STRONG = \"var(--sc-scrim-strong, rgba(0, 0, 0, 0.72))\";\nconst SCRIM_FG = \"var(--sc-scrim-fg, #ffffff)\";\n\n/** Selector for anything carrying the control class. */\nconst CONTROL = `.${STACKED_CARD_CONTROL_CLASS}`;\n\n/**\n * The one reveal rule the whole subsystem shares: controls are hidden until the\n * card (or the cover) is hovered OR holds focus. The focus path is what keeps\n * them reachable by keyboard instead of mouse-only.\n */\nconst revealControls = css`\n ${CONTROL} {\n opacity: 0;\n transition: opacity 120ms ease;\n }\n\n &:hover ${CONTROL}, &:focus-within ${CONTROL} {\n opacity: 1;\n }\n`;\n\n/* ------------------------------------------------------------------ */\n/* Stack — the vertical column. A card is a Stack of rows. */\n/* ------------------------------------------------------------------ */\n\nexport const StyledStackedCardStack = styled.div`\n ${BoxSizingStyle}\n\n position: relative;\n display: flex;\n flex-direction: column;\n`;\nStyledStackedCardStack.displayName = \"StyledStackedCardStack\";\n\n/* ------------------------------------------------------------------ */\n/* Row — the only layout primitive, differentiated by `role`. */\n/* ------------------------------------------------------------------ */\n\ninterface IStyledRowProps {\n $role: StackedCardRowRole;\n $bleed?: boolean;\n $direction: StackedCardRowDirection;\n $background?: string;\n}\n\nexport const StyledStackedCardRow = styled.div<IStyledRowProps>`\n ${BoxSizingStyle}\n\n position: relative;\n display: flex;\n flex-direction: ${({ $direction }) => $direction};\n align-items: ${({ $direction }) =>\n $direction === \"column\" ? \"stretch\" : \"center\"};\n gap: ${({ $direction }) => ($direction === \"column\" ? \"4px\" : \"8px\")};\n\n /* bleed overrides any role and runs the row edge to edge. */\n padding: ${({ $role, $bleed }) =>\n $bleed ? \"0\" : STACKED_CARD_ROLE_PADDING[$role]};\n\n ${({ $background }) =>\n $background &&\n css`\n background: ${$background};\n `}\n\n /* Distribution (row direction only): fixed-width children keep their width,\n the rest share what remains evenly; drop an empty spacer to push items. */\n ${({ $direction }) =>\n $direction === \"row\" &&\n css`\n > * {\n flex: 1 1 0;\n min-width: 0;\n }\n\n > [${STACKED_CARD_FIXED_ATTR}] {\n flex: 0 0 auto;\n }\n `}\n`;\nStyledStackedCardRow.displayName = \"StyledStackedCardRow\";\n\n/* ------------------------------------------------------------------ */\n/* Cover — a bleed row that holds media. */\n/* ------------------------------------------------------------------ */\n\n/**\n * The media box reserves its height with `aspect-ratio` so the image (or the\n * skeleton standing in for it) never reflows the card when it arrives.\n */\nexport const StyledStackedCardCoverMedia = styled.div<{ $aspectRatio: string }>`\n position: relative;\n width: 100%;\n aspect-ratio: ${({ $aspectRatio }) => $aspectRatio};\n overflow: hidden;\n\n ${revealControls}\n`;\nStyledStackedCardCoverMedia.displayName = \"StyledStackedCardCoverMedia\";\n\n/* The fill (an <img>, an inline <svg> wrapper, or a solid-colour box) is laid\n over the reserved box and made to cover it. */\nexport const StyledStackedCardCoverFill = styled.div`\n position: absolute;\n inset: 0;\n\n > * {\n width: 100%;\n height: 100%;\n }\n\n > img {\n display: block;\n object-fit: cover;\n }\n\n /* Media must never be natively draggable. An <img> is a browser drag source\n by default, so grabbing the cover would start an image drag and swallow the\n mousemove/mouseup the HOST's drag depends on — the card would stay put and\n then jump on the next pointer move. The host owns dragging; the cover must\n not compete with it. */\n > img,\n > svg {\n -webkit-user-drag: none;\n user-select: none;\n pointer-events: none;\n }\n`;\nStyledStackedCardCoverFill.displayName = \"StyledStackedCardCoverFill\";\n\nexport const StyledStackedCardCoverCenter = styled.div`\n position: absolute;\n inset: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n`;\nStyledStackedCardCoverCenter.displayName = \"StyledStackedCardCoverCenter\";\n\nexport const StyledStackedCardCoverTopRight = styled.div`\n position: absolute;\n top: 8px;\n right: 8px;\n display: flex;\n gap: 6px;\n`;\nStyledStackedCardCoverTopRight.displayName = \"StyledStackedCardCoverTopRight\";\n\n/**\n * Collapsed cover — the media box gives way to a thin strip. The strip IS the\n * expand affordance: the whole bar is a button and a chevron hint is revealed\n * on hover or focus. It reserves no height of its own; the caller's\n * `collapsedStrip` (an ~8px colour bar, a favicon + domain row) sets how tall\n * it reads.\n */\nexport const StyledStackedCardCollapsedStrip = styled.button`\n ${BoxSizingStyle}\n\n position: relative;\n display: flex;\n align-items: center;\n width: 100%;\n min-height: 16px;\n padding: 0;\n border: 0;\n background: transparent;\n cursor: pointer;\n text-align: left;\n\n ${CONTROL} {\n opacity: 0;\n transition: opacity 120ms ease;\n }\n\n &:hover ${CONTROL}, &:focus-visible ${CONTROL} {\n opacity: 1;\n }\n\n &:focus-visible {\n outline: 2px solid ${SELECTION_RING};\n outline-offset: -2px;\n }\n`;\nStyledStackedCardCollapsedStrip.displayName = \"StyledStackedCardCollapsedStrip\";\n\n/* The expand chevron sits at the right, vertically centred, so it reads the\n same whether the strip is a hairline colour bar or a taller favicon row. */\nexport const StyledStackedCardStripExpand = styled.span`\n position: absolute;\n top: 50%;\n right: 8px;\n transform: translateY(-50%);\n display: inline-flex;\n width: 16px;\n height: 16px;\n color: var(--color-theme-600);\n\n svg {\n width: 14px;\n height: 14px;\n }\n`;\nStyledStackedCardStripExpand.displayName = \"StyledStackedCardStripExpand\";\n\n/* ------------------------------------------------------------------ */\n/* Cover chrome — scrim-backed controls that sit over media */\n/* ------------------------------------------------------------------ */\n\n/** Centered media control (a play button). The caller drops the glyph inside. */\nexport const StyledStackedCardPlayBadge = styled.span`\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 44px;\n height: 44px;\n border-radius: 12px;\n background: ${SCRIM};\n color: ${SCRIM_FG};\n\n svg {\n fill: currentColor;\n width: 20px;\n height: 20px;\n margin-left: 2px;\n }\n`;\nStyledStackedCardPlayBadge.displayName = \"StyledStackedCardPlayBadge\";\n\n/** Top-right cover-management button (collapse, remove …). */\nexport const StyledStackedCardCoverButton = styled.button`\n ${BoxSizingStyle}\n\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 30px;\n height: 30px;\n padding: 0;\n border: 0;\n border-radius: 8px;\n cursor: pointer;\n color: ${SCRIM_FG};\n background: ${SCRIM};\n\n svg {\n width: 16px;\n height: 16px;\n display: block;\n }\n\n &:hover {\n background: ${SCRIM_STRONG};\n }\n`;\nStyledStackedCardCoverButton.displayName = \"StyledStackedCardCoverButton\";\n\n/* ------------------------------------------------------------------ */\n/* Resize (opt-in): handle on hover, the card only reports deltas */\n/* ------------------------------------------------------------------ */\n\n/* The grip is a focusable separator, so it needs a focus ring of its own — a\n keyboard user has no pointer to tell them where they are. */\nexport const StyledStackedCardResizeHandle = styled.span<{\n $axis: StackedCardResizeAxis;\n}>`\n position: absolute;\n right: 2px;\n bottom: 2px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 14px;\n height: 14px;\n border-radius: 4px;\n cursor: ${({ $axis }) => ($axis === \"width\" ? \"ew-resize\" : \"nwse-resize\")};\n color: var(--color-theme-600);\n z-index: 2;\n\n &:hover {\n color: var(--color-theme-900);\n }\n\n &:focus-visible {\n outline: 2px solid ${SELECTION_RING};\n outline-offset: 1px;\n color: var(--color-theme-900);\n }\n\n svg {\n display: block;\n }\n`;\nStyledStackedCardResizeHandle.displayName = \"StyledStackedCardResizeHandle\";\n\n/* ------------------------------------------------------------------ */\n/* The shell */\n/* ------------------------------------------------------------------ */\n\nexport interface IStyledStackedCardProps {\n $selected?: boolean;\n $disabled?: boolean;\n $pending?: boolean;\n $isDragSource?: boolean;\n $isDragPreview?: boolean;\n $entered?: boolean;\n $forceHover?: boolean;\n $priorityColor?: string;\n}\n\nconst hoverStyle = css`\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.12);\n border-color: var(--color-theme-500);\n`;\n\nexport const StyledStackedCard = styled.div<IStyledStackedCardProps>`\n ${BoxSizingStyle}\n\n position: relative;\n display: flex;\n flex-direction: column;\n width: ${STACKED_CARD_WIDTH}px;\n border-radius: ${STACKED_CARD_RADIUS}px;\n background-color: var(--page-paper-main);\n border: 1px solid var(--border-primary);\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08);\n overflow: hidden;\n transition: box-shadow 150ms ease, border-color 150ms ease;\n\n ${revealControls}\n\n &:hover {\n ${hoverStyle}\n }\n\n &:focus-visible {\n outline: none;\n ${hoverStyle}\n box-shadow: 0 0 0 2px ${SELECTION_RING};\n }\n\n /* Forced hover — for docs, snapshots and \"this is what hover looks like\"\n demos. The doubled ampersand gives it the specificity to beat the cover's\n own reveal rule. */\n ${({ $forceHover }) =>\n $forceHover &&\n css`\n ${hoverStyle}\n && ${CONTROL} {\n opacity: 1;\n }\n `}\n\n ${({ $priorityColor }) =>\n $priorityColor &&\n css`\n &::before {\n content: \"\";\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: 4px;\n background: ${$priorityColor};\n z-index: 2;\n }\n `}\n\n /* Selection outranks hover: a selected card must keep its ring while the\n pointer is over it — which, right after the click that selected it, is\n always. The doubled ampersand buys the specificity to beat the hover rule\n above (same reason the entered state below does it). */\n ${({ $selected }) =>\n $selected &&\n css`\n && {\n border-color: ${SELECTION_RING};\n box-shadow: 0 0 0 2px ${SELECTION_RING};\n }\n `}\n\n ${({ $disabled }) =>\n $disabled &&\n css`\n opacity: 0.5;\n pointer-events: none;\n `}\n\n /* Pending / optimistic — created or moved, not yet confirmed by the server.\n Dimmed, non-interactive and NOT draggable, but distinct from disabled: a\n transient in-flight state, not a policy. */\n ${({ $pending }) =>\n $pending &&\n css`\n opacity: 0.6;\n pointer-events: none;\n cursor: progress;\n `}\n\n /* Drag SOURCE — full-size outline placeholder. Content is hidden but keeps\n its box (visibility, not display) so the card holds identical dimensions\n and the surrounding cards never move. */\n ${({ $isDragSource }) =>\n $isDragSource &&\n css`\n background: transparent;\n border: 1px dashed var(--color-theme-500);\n box-shadow: none;\n\n &:hover {\n box-shadow: none;\n border-color: var(--color-theme-500);\n }\n\n > * {\n visibility: hidden;\n }\n `}\n\n /* Drag PREVIEW — the 1:1 copy the host floats in its drag layer. Elevated\n shadow ONLY: no rotate, no scale, no translate. */\n ${({ $isDragPreview }) =>\n $isDragPreview &&\n css`\n box-shadow: 0 12px 28px rgba(0, 0, 0, 0.24);\n cursor: grabbing;\n `}\n\n /* Entered (focus model) — focus has moved inside, onto an inner control. */\n ${({ $entered }) =>\n $entered &&\n css`\n && {\n border-color: ${SELECTION_RING};\n box-shadow: inset 0 0 0 2px ${SELECTION_RING},\n 0 0 0 2px ${SELECTION_RING};\n }\n `}\n`;\nStyledStackedCard.displayName = \"StyledStackedCard\";\n"],"mappings":"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","ignoreList":[]}
@@ -47,4 +47,26 @@ Object.keys(_constants).forEach(function (key) {
47
47
  }
48
48
  });
49
49
  });
50
+ var _resizePolicy = require("./resizePolicy");
51
+ Object.keys(_resizePolicy).forEach(function (key) {
52
+ if (key === "default" || key === "__esModule") return;
53
+ if (key in exports && exports[key] === _resizePolicy[key]) return;
54
+ Object.defineProperty(exports, key, {
55
+ enumerable: true,
56
+ get: function get() {
57
+ return _resizePolicy[key];
58
+ }
59
+ });
60
+ });
61
+ var _useStackedCardResize = require("./useStackedCardResize");
62
+ Object.keys(_useStackedCardResize).forEach(function (key) {
63
+ if (key === "default" || key === "__esModule") return;
64
+ if (key in exports && exports[key] === _useStackedCardResize[key]) return;
65
+ Object.defineProperty(exports, key, {
66
+ enumerable: true,
67
+ get: function get() {
68
+ return _useStackedCardResize[key];
69
+ }
70
+ });
71
+ });
50
72
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["_StackedCard","require","Object","keys","forEach","key","exports","defineProperty","enumerable","get","_Primitives","_Glyphs","_constants"],"sources":["../../../../src/components/StackedCard/index.ts"],"sourcesContent":["export * from \"./StackedCard\";\nexport * from \"./Primitives\";\nexport * from \"./Glyphs\";\nexport * from \"./constants\";\n"],"mappings":";;;;;AAAA,IAAAA,YAAA,GAAAC,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAH,YAAA,EAAAI,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAL,YAAA,CAAAK,GAAA;EAAAH,MAAA,CAAAK,cAAA,CAAAD,OAAA,EAAAD,GAAA;IAAAG,UAAA;IAAAC,GAAA,WAAAA,IAAA;MAAA,OAAAT,YAAA,CAAAK,GAAA;IAAA;EAAA;AAAA;AACA,IAAAK,WAAA,GAAAT,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAO,WAAA,EAAAN,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAK,WAAA,CAAAL,GAAA;EAAAH,MAAA,CAAAK,cAAA,CAAAD,OAAA,EAAAD,GAAA;IAAAG,UAAA;IAAAC,GAAA,WAAAA,IAAA;MAAA,OAAAC,WAAA,CAAAL,GAAA;IAAA;EAAA;AAAA;AACA,IAAAM,OAAA,GAAAV,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAQ,OAAA,EAAAP,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAM,OAAA,CAAAN,GAAA;EAAAH,MAAA,CAAAK,cAAA,CAAAD,OAAA,EAAAD,GAAA;IAAAG,UAAA;IAAAC,GAAA,WAAAA,IAAA;MAAA,OAAAE,OAAA,CAAAN,GAAA;IAAA;EAAA;AAAA;AACA,IAAAO,UAAA,GAAAX,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAS,UAAA,EAAAR,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAO,UAAA,CAAAP,GAAA;EAAAH,MAAA,CAAAK,cAAA,CAAAD,OAAA,EAAAD,GAAA;IAAAG,UAAA;IAAAC,GAAA,WAAAA,IAAA;MAAA,OAAAG,UAAA,CAAAP,GAAA;IAAA;EAAA;AAAA","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["_StackedCard","require","Object","keys","forEach","key","exports","defineProperty","enumerable","get","_Primitives","_Glyphs","_constants","_resizePolicy","_useStackedCardResize"],"sources":["../../../../src/components/StackedCard/index.ts"],"sourcesContent":["export * from \"./StackedCard\";\nexport * from \"./Primitives\";\nexport * from \"./Glyphs\";\nexport * from \"./constants\";\nexport * from \"./resizePolicy\";\nexport * from \"./useStackedCardResize\";\n"],"mappings":";;;;;AAAA,IAAAA,YAAA,GAAAC,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAH,YAAA,EAAAI,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAL,YAAA,CAAAK,GAAA;EAAAH,MAAA,CAAAK,cAAA,CAAAD,OAAA,EAAAD,GAAA;IAAAG,UAAA;IAAAC,GAAA,WAAAA,IAAA;MAAA,OAAAT,YAAA,CAAAK,GAAA;IAAA;EAAA;AAAA;AACA,IAAAK,WAAA,GAAAT,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAO,WAAA,EAAAN,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAK,WAAA,CAAAL,GAAA;EAAAH,MAAA,CAAAK,cAAA,CAAAD,OAAA,EAAAD,GAAA;IAAAG,UAAA;IAAAC,GAAA,WAAAA,IAAA;MAAA,OAAAC,WAAA,CAAAL,GAAA;IAAA;EAAA;AAAA;AACA,IAAAM,OAAA,GAAAV,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAQ,OAAA,EAAAP,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAM,OAAA,CAAAN,GAAA;EAAAH,MAAA,CAAAK,cAAA,CAAAD,OAAA,EAAAD,GAAA;IAAAG,UAAA;IAAAC,GAAA,WAAAA,IAAA;MAAA,OAAAE,OAAA,CAAAN,GAAA;IAAA;EAAA;AAAA;AACA,IAAAO,UAAA,GAAAX,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAS,UAAA,EAAAR,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAO,UAAA,CAAAP,GAAA;EAAAH,MAAA,CAAAK,cAAA,CAAAD,OAAA,EAAAD,GAAA;IAAAG,UAAA;IAAAC,GAAA,WAAAA,IAAA;MAAA,OAAAG,UAAA,CAAAP,GAAA;IAAA;EAAA;AAAA;AACA,IAAAQ,aAAA,GAAAZ,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAU,aAAA,EAAAT,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAQ,aAAA,CAAAR,GAAA;EAAAH,MAAA,CAAAK,cAAA,CAAAD,OAAA,EAAAD,GAAA;IAAAG,UAAA;IAAAC,GAAA,WAAAA,IAAA;MAAA,OAAAI,aAAA,CAAAR,GAAA;IAAA;EAAA;AAAA;AACA,IAAAS,qBAAA,GAAAb,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAW,qBAAA,EAAAV,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAA,GAAA,IAAAC,OAAA,IAAAA,OAAA,CAAAD,GAAA,MAAAS,qBAAA,CAAAT,GAAA;EAAAH,MAAA,CAAAK,cAAA,CAAAD,OAAA,EAAAD,GAAA;IAAAG,UAAA;IAAAC,GAAA,WAAAA,IAAA;MAAA,OAAAK,qBAAA,CAAAT,GAAA;IAAA;EAAA;AAAA","ignoreList":[]}
@@ -0,0 +1,238 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.snap = exports.measurePercent = exports.makeStart = exports.keyboardResize = exports.isResizeKey = exports.effectiveBounds = exports.clamp = exports.applyResize = exports.SHIFT_STEP_MULTIPLIER = exports.RESIZE_KEYS = exports.DEFAULT_KEYBOARD_STEP = void 0;
7
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
8
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
9
+ function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
10
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
11
+ function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
12
+ /**
13
+ * StackedCard resize policy — pure math.
14
+ *
15
+ * The card reports intent; the HOST applies a resize policy (spec §7). This
16
+ * module is that policy, packaged as pure functions so the SAME code path
17
+ * serves the pointer drag and the keyboard resize. Nothing here touches the
18
+ * DOM, React or the card's content: it takes a start size, a delta and a
19
+ * policy, and returns a clamped size. `useStackedCardResize` wires events to
20
+ * it; the card's intrinsic content minimum is measured by the host and passed
21
+ * in as `contentMin`, so this module knows nothing about heroes or footers.
22
+ *
23
+ * The policy has four parts:
24
+ * - bounds — optional min/max per axis; unset means unbounded.
25
+ * - proportional — lock the aspect ratio captured at the start of the gesture;
26
+ * the scale is clamped by the BINDING axis so the ratio never
27
+ * distorts at a bound.
28
+ * - step — optional grid snap; proportion wins over the grid.
29
+ * - content min — the effective min is max(policyMin, contentMin) per axis,
30
+ * so a card can never be crushed below what its content needs.
31
+ */
32
+
33
+ /** The card's intrinsic minimum, measured from its real content. */
34
+
35
+ /** The size captured at the start of a gesture (pointer down or a key press). */
36
+
37
+ /**
38
+ * `width` locks the vertical axis: an auto-height card takes a width and lets
39
+ * its rows set the height, so the gesture's vertical component is ignored.
40
+ */
41
+
42
+ /** Which input drove a resize event. Hosts log undo entries per source. */
43
+
44
+ /** Keyboard resize nudges by the policy step, or this when no step is set. */
45
+ var DEFAULT_KEYBOARD_STEP = exports.DEFAULT_KEYBOARD_STEP = 8;
46
+
47
+ /** Shift + arrow resizes by a larger increment (the familiar coarse nudge). */
48
+ var SHIFT_STEP_MULTIPLIER = exports.SHIFT_STEP_MULTIPLIER = 4;
49
+
50
+ /** Keys the separator handles; everything else falls through to the browser. */
51
+ var RESIZE_KEYS = exports.RESIZE_KEYS = ["ArrowLeft", "ArrowRight", "ArrowUp", "ArrowDown", "Home", "End"];
52
+ var isResizeKey = exports.isResizeKey = function isResizeKey(key) {
53
+ return RESIZE_KEYS.includes(key);
54
+ };
55
+ var clamp = exports.clamp = function clamp(v, lo, hi) {
56
+ return Math.min(hi !== null && hi !== void 0 ? hi : Number.POSITIVE_INFINITY, Math.max(lo, v));
57
+ };
58
+ var snap = exports.snap = function snap(v, step) {
59
+ return step && step > 0 ? Math.round(v / step) * step : v;
60
+ };
61
+ var makeStart = exports.makeStart = function makeStart(size, contentMin) {
62
+ return {
63
+ w: size.w,
64
+ h: size.h,
65
+ contentMin
66
+ };
67
+ };
68
+
69
+ /**
70
+ * The effective bounds a size is clamped to: the policy min floored by the
71
+ * content min, and the policy max (unbounded when unset). Independent of any
72
+ * live gesture, so a host can also use it for the aria value and Home/End.
73
+ */
74
+ var effectiveBounds = exports.effectiveBounds = function effectiveBounds(policy, contentMin) {
75
+ var _policy$minW, _policy$minH, _policy$maxW, _policy$maxH;
76
+ return {
77
+ wMin: Math.max((_policy$minW = policy.minW) !== null && _policy$minW !== void 0 ? _policy$minW : 0, contentMin.w),
78
+ hMin: Math.max((_policy$minH = policy.minH) !== null && _policy$minH !== void 0 ? _policy$minH : 0, contentMin.h),
79
+ wMax: (_policy$maxW = policy.maxW) !== null && _policy$maxW !== void 0 ? _policy$maxW : Number.POSITIVE_INFINITY,
80
+ hMax: (_policy$maxH = policy.maxH) !== null && _policy$maxH !== void 0 ? _policy$maxH : Number.POSITIVE_INFINITY
81
+ };
82
+ };
83
+
84
+ /**
85
+ * Whether an axis has a floor anyone asked for. `effectiveBounds` reports 0 for
86
+ * an unset minimum — correct as a clamp, but not something Home should jump to:
87
+ * an axis nobody gave a minimum must not collapse to nothing.
88
+ */
89
+ var hasFloor = function hasFloor(policyMin, contentMin) {
90
+ return policyMin !== undefined || contentMin > 0;
91
+ };
92
+
93
+ /**
94
+ * Apply a delta to the start size under the policy — the single path for both
95
+ * inputs.
96
+ *
97
+ * `constrain` is the transient Shift-to-constrain lock: a free-form policy
98
+ * behaves proportionally for that one gesture; a proportional policy is already
99
+ * locked and ignores it. `axis: "width"` drops the gesture's vertical component;
100
+ * the height then holds still in free-form mode, and still follows the ratio in
101
+ * proportional mode (that is what proportional means).
102
+ */
103
+ var applyResize = exports.applyResize = function applyResize(start, delta, policy) {
104
+ var opts = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
105
+ var _effectiveBounds = effectiveBounds(policy, start.contentMin),
106
+ wMin = _effectiveBounds.wMin,
107
+ hMin = _effectiveBounds.hMin,
108
+ wMax = _effectiveBounds.wMax,
109
+ hMax = _effectiveBounds.hMax;
110
+ var widthOnly = opts.axis === "width";
111
+ var dx = delta.dx;
112
+ var dy = widthOnly ? 0 : delta.dy;
113
+
114
+ // A ratio needs two non-zero sides to be a ratio at all; a width-only card
115
+ // parks a placeholder height, so fall back to free-form rather than dividing
116
+ // by zero.
117
+ var proportional = (policy.proportional || opts.constrain === true) && start.w > 0 && start.h > 0;
118
+ var w;
119
+ var h;
120
+ if (proportional) {
121
+ // one scale drives both axes; the corner's dominant direction wins, so a
122
+ // vertical drag is as effective as a horizontal one
123
+ var sW = (start.w + dx) / start.w;
124
+ var sH = (start.h + dy) / start.h;
125
+ var scale = Math.abs(sW - 1) >= Math.abs(sH - 1) ? sW : sH;
126
+
127
+ // step: proportion wins over the grid. Snap through the SCALE (driven off
128
+ // the width edge) so both axes move together and the ratio survives; the
129
+ // grid yields whenever honouring it would cost the ratio.
130
+ if (policy.step) {
131
+ scale = snap(start.w * scale, policy.step) / start.w;
132
+ }
133
+
134
+ // Then clamp the scale so both axes stay in bounds (the binding constraint):
135
+ // the ratio can never break at a bound — whichever edge is limiting stops
136
+ // both. The clamp comes last on purpose: a bound is a hard stop, so the card
137
+ // sits exactly on it rather than at the nearest grid line inside it.
138
+ var scaleMin = Math.max(wMin / start.w, hMin / start.h);
139
+ var scaleMax = Math.min(wMax / start.w, hMax / start.h);
140
+ scale = clamp(scale, scaleMin, Math.max(scaleMin, scaleMax));
141
+ w = start.w * scale;
142
+ h = start.h * scale;
143
+ } else {
144
+ w = clamp(snap(start.w + dx, policy.step), wMin, wMax);
145
+ h = widthOnly ? start.h : clamp(snap(start.h + dy, policy.step), hMin, hMax);
146
+ }
147
+ return {
148
+ w: Math.round(w),
149
+ h: Math.round(h)
150
+ };
151
+ };
152
+
153
+ /**
154
+ * Translate a resize key into the next size, reusing `applyResize` so the
155
+ * keyboard clamps exactly like the pointer. Arrows nudge by the step (Shift ×4);
156
+ * Home/End jump to the min/max of the allowed range, leaving any axis without
157
+ * that bound where it is. Returns null for a key the handle does not own, and
158
+ * for a vertical key on a width-only card.
159
+ */
160
+ var keyboardResize = exports.keyboardResize = function keyboardResize(key, size, policy, contentMin) {
161
+ var opts = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {};
162
+ var widthOnly = opts.axis === "width";
163
+ if (widthOnly && (key === "ArrowUp" || key === "ArrowDown")) return null;
164
+ var base = policy.step && policy.step > 0 ? policy.step : DEFAULT_KEYBOARD_STEP;
165
+ var step = base * (opts.shiftKey ? SHIFT_STEP_MULTIPLIER : 1);
166
+ var start = makeStart(size, contentMin);
167
+ var b = effectiveBounds(policy, contentMin);
168
+ var apply = function apply(delta) {
169
+ return applyResize(start, delta, policy, {
170
+ axis: opts.axis
171
+ });
172
+ };
173
+
174
+ /**
175
+ * Home and End are absolute jumps to a bound, not nudges, so they ignore the
176
+ * grid: landing 4px off the minimum because that is where the nearest grid
177
+ * line fell would mean the keyboard could never reach the bound the pointer
178
+ * stops at.
179
+ */
180
+ var jump = function jump(delta) {
181
+ return applyResize(start, delta, _objectSpread(_objectSpread({}, policy), {}, {
182
+ step: 0
183
+ }), {
184
+ axis: opts.axis
185
+ });
186
+ };
187
+ switch (key) {
188
+ case "ArrowRight":
189
+ return apply({
190
+ dx: step,
191
+ dy: 0
192
+ });
193
+ case "ArrowLeft":
194
+ return apply({
195
+ dx: -step,
196
+ dy: 0
197
+ });
198
+ case "ArrowDown":
199
+ return apply({
200
+ dx: 0,
201
+ dy: step
202
+ });
203
+ case "ArrowUp":
204
+ return apply({
205
+ dx: 0,
206
+ dy: -step
207
+ });
208
+ case "Home":
209
+ // jump to the min corner; an axis with no floor of its own stays put
210
+ return jump({
211
+ dx: hasFloor(policy.minW, contentMin.w) ? b.wMin - size.w : 0,
212
+ dy: !widthOnly && hasFloor(policy.minH, contentMin.h) ? b.hMin - size.h : 0
213
+ });
214
+ case "End":
215
+ // jump to the max corner; an unbounded axis simply doesn't move
216
+ return jump({
217
+ dx: Number.isFinite(b.wMax) ? b.wMax - size.w : 0,
218
+ dy: !widthOnly && Number.isFinite(b.hMax) ? b.hMax - size.h : 0
219
+ });
220
+ default:
221
+ return null;
222
+ }
223
+ };
224
+
225
+ /**
226
+ * The handle's `aria-valuenow`: the current size as a percent (0–100) of its
227
+ * allowed range. The corner resizes both axes, but the value must be a single
228
+ * number, so it reports the WIDTH axis — the one axis the fixed-box and the
229
+ * width-only cards share. Returns 0 when the range isn't finite (no max bound).
230
+ */
231
+ var measurePercent = exports.measurePercent = function measurePercent(size, policy, contentMin) {
232
+ var _effectiveBounds2 = effectiveBounds(policy, contentMin),
233
+ wMin = _effectiveBounds2.wMin,
234
+ wMax = _effectiveBounds2.wMax;
235
+ if (!Number.isFinite(wMax) || wMax <= wMin) return 0;
236
+ return Math.round(clamp((size.w - wMin) / (wMax - wMin) * 100, 0, 100));
237
+ };
238
+ //# sourceMappingURL=resizePolicy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resizePolicy.js","names":["DEFAULT_KEYBOARD_STEP","exports","SHIFT_STEP_MULTIPLIER","RESIZE_KEYS","isResizeKey","key","includes","clamp","v","lo","hi","Math","min","Number","POSITIVE_INFINITY","max","snap","step","round","makeStart","size","contentMin","w","h","effectiveBounds","policy","_policy$minW","_policy$minH","_policy$maxW","_policy$maxH","wMin","minW","hMin","minH","wMax","maxW","hMax","maxH","hasFloor","policyMin","undefined","applyResize","start","delta","opts","arguments","length","_effectiveBounds","widthOnly","axis","dx","dy","proportional","constrain","sW","sH","scale","abs","scaleMin","scaleMax","keyboardResize","base","shiftKey","b","apply","jump","_objectSpread","isFinite","measurePercent","_effectiveBounds2"],"sources":["../../../../src/components/StackedCard/resizePolicy.ts"],"sourcesContent":["/**\n * StackedCard resize policy — pure math.\n *\n * The card reports intent; the HOST applies a resize policy (spec §7). This\n * module is that policy, packaged as pure functions so the SAME code path\n * serves the pointer drag and the keyboard resize. Nothing here touches the\n * DOM, React or the card's content: it takes a start size, a delta and a\n * policy, and returns a clamped size. `useStackedCardResize` wires events to\n * it; the card's intrinsic content minimum is measured by the host and passed\n * in as `contentMin`, so this module knows nothing about heroes or footers.\n *\n * The policy has four parts:\n * - bounds — optional min/max per axis; unset means unbounded.\n * - proportional — lock the aspect ratio captured at the start of the gesture;\n * the scale is clamped by the BINDING axis so the ratio never\n * distorts at a bound.\n * - step — optional grid snap; proportion wins over the grid.\n * - content min — the effective min is max(policyMin, contentMin) per axis,\n * so a card can never be crushed below what its content needs.\n */\n\nexport interface StackedCardSize {\n w: number;\n h: number;\n}\n\n/** The card's intrinsic minimum, measured from its real content. */\nexport interface StackedCardContentMin {\n w: number;\n h: number;\n}\n\nexport interface StackedCardResizePolicy {\n minW?: number;\n maxW?: number;\n minH?: number;\n maxH?: number;\n /** Lock the aspect ratio for the whole gesture. */\n proportional: boolean;\n /** Grid snap increment in px; omitted / 0 means continuous. */\n step?: number;\n}\n\n/** The size captured at the start of a gesture (pointer down or a key press). */\nexport interface StackedCardResizeStart {\n w: number;\n h: number;\n contentMin: StackedCardContentMin;\n}\n\nexport interface StackedCardResizeDelta {\n dx: number;\n dy: number;\n}\n\nexport interface StackedCardResizeBounds {\n wMin: number;\n wMax: number;\n hMin: number;\n hMax: number;\n}\n\n/**\n * `width` locks the vertical axis: an auto-height card takes a width and lets\n * its rows set the height, so the gesture's vertical component is ignored.\n */\nexport type StackedCardResizeAxis = \"both\" | \"width\";\n\n/** Which input drove a resize event. Hosts log undo entries per source. */\nexport type StackedCardResizeSource = \"pointer\" | \"keyboard\";\n\n/** Keyboard resize nudges by the policy step, or this when no step is set. */\nexport const DEFAULT_KEYBOARD_STEP = 8;\n\n/** Shift + arrow resizes by a larger increment (the familiar coarse nudge). */\nexport const SHIFT_STEP_MULTIPLIER = 4;\n\n/** Keys the separator handles; everything else falls through to the browser. */\nexport const RESIZE_KEYS: ReadonlyArray<string> = [\n \"ArrowLeft\",\n \"ArrowRight\",\n \"ArrowUp\",\n \"ArrowDown\",\n \"Home\",\n \"End\",\n];\n\nexport const isResizeKey = (key: string): boolean => RESIZE_KEYS.includes(key);\n\nexport const clamp = (v: number, lo: number, hi?: number): number =>\n Math.min(hi ?? Number.POSITIVE_INFINITY, Math.max(lo, v));\n\nexport const snap = (v: number, step?: number): number =>\n step && step > 0 ? Math.round(v / step) * step : v;\n\nexport const makeStart = (\n size: StackedCardSize,\n contentMin: StackedCardContentMin\n): StackedCardResizeStart => ({\n w: size.w,\n h: size.h,\n contentMin,\n});\n\n/**\n * The effective bounds a size is clamped to: the policy min floored by the\n * content min, and the policy max (unbounded when unset). Independent of any\n * live gesture, so a host can also use it for the aria value and Home/End.\n */\nexport const effectiveBounds = (\n policy: StackedCardResizePolicy,\n contentMin: StackedCardContentMin\n): StackedCardResizeBounds => ({\n wMin: Math.max(policy.minW ?? 0, contentMin.w),\n hMin: Math.max(policy.minH ?? 0, contentMin.h),\n wMax: policy.maxW ?? Number.POSITIVE_INFINITY,\n hMax: policy.maxH ?? Number.POSITIVE_INFINITY,\n});\n\n/**\n * Whether an axis has a floor anyone asked for. `effectiveBounds` reports 0 for\n * an unset minimum — correct as a clamp, but not something Home should jump to:\n * an axis nobody gave a minimum must not collapse to nothing.\n */\nconst hasFloor = (policyMin: number | undefined, contentMin: number): boolean =>\n policyMin !== undefined || contentMin > 0;\n\n/**\n * Apply a delta to the start size under the policy — the single path for both\n * inputs.\n *\n * `constrain` is the transient Shift-to-constrain lock: a free-form policy\n * behaves proportionally for that one gesture; a proportional policy is already\n * locked and ignores it. `axis: \"width\"` drops the gesture's vertical component;\n * the height then holds still in free-form mode, and still follows the ratio in\n * proportional mode (that is what proportional means).\n */\nexport const applyResize = (\n start: StackedCardResizeStart,\n delta: StackedCardResizeDelta,\n policy: StackedCardResizePolicy,\n opts: { constrain?: boolean; axis?: StackedCardResizeAxis } = {}\n): StackedCardSize => {\n const { wMin, hMin, wMax, hMax } = effectiveBounds(policy, start.contentMin);\n const widthOnly = opts.axis === \"width\";\n const dx = delta.dx;\n const dy = widthOnly ? 0 : delta.dy;\n\n // A ratio needs two non-zero sides to be a ratio at all; a width-only card\n // parks a placeholder height, so fall back to free-form rather than dividing\n // by zero.\n const proportional =\n (policy.proportional || opts.constrain === true) &&\n start.w > 0 &&\n start.h > 0;\n\n let w: number;\n let h: number;\n\n if (proportional) {\n // one scale drives both axes; the corner's dominant direction wins, so a\n // vertical drag is as effective as a horizontal one\n const sW = (start.w + dx) / start.w;\n const sH = (start.h + dy) / start.h;\n let scale = Math.abs(sW - 1) >= Math.abs(sH - 1) ? sW : sH;\n\n // step: proportion wins over the grid. Snap through the SCALE (driven off\n // the width edge) so both axes move together and the ratio survives; the\n // grid yields whenever honouring it would cost the ratio.\n if (policy.step) {\n scale = snap(start.w * scale, policy.step) / start.w;\n }\n\n // Then clamp the scale so both axes stay in bounds (the binding constraint):\n // the ratio can never break at a bound — whichever edge is limiting stops\n // both. The clamp comes last on purpose: a bound is a hard stop, so the card\n // sits exactly on it rather than at the nearest grid line inside it.\n const scaleMin = Math.max(wMin / start.w, hMin / start.h);\n const scaleMax = Math.min(wMax / start.w, hMax / start.h);\n scale = clamp(scale, scaleMin, Math.max(scaleMin, scaleMax));\n\n w = start.w * scale;\n h = start.h * scale;\n } else {\n w = clamp(snap(start.w + dx, policy.step), wMin, wMax);\n h = widthOnly\n ? start.h\n : clamp(snap(start.h + dy, policy.step), hMin, hMax);\n }\n\n return { w: Math.round(w), h: Math.round(h) };\n};\n\n/**\n * Translate a resize key into the next size, reusing `applyResize` so the\n * keyboard clamps exactly like the pointer. Arrows nudge by the step (Shift ×4);\n * Home/End jump to the min/max of the allowed range, leaving any axis without\n * that bound where it is. Returns null for a key the handle does not own, and\n * for a vertical key on a width-only card.\n */\nexport const keyboardResize = (\n key: string,\n size: StackedCardSize,\n policy: StackedCardResizePolicy,\n contentMin: StackedCardContentMin,\n opts: { shiftKey?: boolean; axis?: StackedCardResizeAxis } = {}\n): StackedCardSize | null => {\n const widthOnly = opts.axis === \"width\";\n if (widthOnly && (key === \"ArrowUp\" || key === \"ArrowDown\")) return null;\n\n const base =\n policy.step && policy.step > 0 ? policy.step : DEFAULT_KEYBOARD_STEP;\n const step = base * (opts.shiftKey ? SHIFT_STEP_MULTIPLIER : 1);\n const start = makeStart(size, contentMin);\n const b = effectiveBounds(policy, contentMin);\n const apply = (delta: StackedCardResizeDelta): StackedCardSize =>\n applyResize(start, delta, policy, { axis: opts.axis });\n\n /**\n * Home and End are absolute jumps to a bound, not nudges, so they ignore the\n * grid: landing 4px off the minimum because that is where the nearest grid\n * line fell would mean the keyboard could never reach the bound the pointer\n * stops at.\n */\n const jump = (delta: StackedCardResizeDelta): StackedCardSize =>\n applyResize(start, delta, { ...policy, step: 0 }, { axis: opts.axis });\n\n switch (key) {\n case \"ArrowRight\":\n return apply({ dx: step, dy: 0 });\n case \"ArrowLeft\":\n return apply({ dx: -step, dy: 0 });\n case \"ArrowDown\":\n return apply({ dx: 0, dy: step });\n case \"ArrowUp\":\n return apply({ dx: 0, dy: -step });\n case \"Home\":\n // jump to the min corner; an axis with no floor of its own stays put\n return jump({\n dx: hasFloor(policy.minW, contentMin.w) ? b.wMin - size.w : 0,\n dy:\n !widthOnly && hasFloor(policy.minH, contentMin.h)\n ? b.hMin - size.h\n : 0,\n });\n case \"End\":\n // jump to the max corner; an unbounded axis simply doesn't move\n return jump({\n dx: Number.isFinite(b.wMax) ? b.wMax - size.w : 0,\n dy: !widthOnly && Number.isFinite(b.hMax) ? b.hMax - size.h : 0,\n });\n default:\n return null;\n }\n};\n\n/**\n * The handle's `aria-valuenow`: the current size as a percent (0–100) of its\n * allowed range. The corner resizes both axes, but the value must be a single\n * number, so it reports the WIDTH axis — the one axis the fixed-box and the\n * width-only cards share. Returns 0 when the range isn't finite (no max bound).\n */\nexport const measurePercent = (\n size: StackedCardSize,\n policy: StackedCardResizePolicy,\n contentMin: StackedCardContentMin\n): number => {\n const { wMin, wMax } = effectiveBounds(policy, contentMin);\n if (!Number.isFinite(wMax) || wMax <= wMin) return 0;\n return Math.round(clamp(((size.w - wMin) / (wMax - wMin)) * 100, 0, 100));\n};\n"],"mappings":"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","ignoreList":[]}