UNPKG

@wordpress/block-library

Version:
8 lines (7 loc) 7.21 kB
{ "version": 3, "sources": ["../../src/columns/utils.js"], "sourcesContent": ["/**\n * Returns a column width attribute value rounded to standard precision.\n * Returns `undefined` if the value is not a valid finite number.\n *\n * @param {?number} value Raw value.\n *\n * @return {number} Value rounded to standard precision.\n */\nexport const toWidthPrecision = ( value ) => {\n\tconst unitlessValue = parseFloat( value );\n\treturn Number.isFinite( unitlessValue )\n\t\t? parseFloat( unitlessValue.toFixed( 2 ) )\n\t\t: undefined;\n};\n/**\n * Returns an effective width for a given block. An effective width is equal to\n * its attribute value if set, or a computed value assuming equal distribution.\n *\n * @param {WPBlock} block Block object.\n * @param {number} totalBlockCount Total number of blocks in Columns.\n *\n * @return {number} Effective column width.\n */\nexport function getEffectiveColumnWidth( block, totalBlockCount ) {\n\tconst { width = 100 / totalBlockCount } = block.attributes;\n\treturn toWidthPrecision( width );\n}\n\n/**\n * Returns the total width occupied by the given set of column blocks.\n *\n * @param {WPBlock[]} blocks Block objects.\n * @param {?number} totalBlockCount Total number of blocks in Columns.\n * Defaults to number of blocks passed.\n *\n * @return {number} Total width occupied by blocks.\n */\nexport function getTotalColumnsWidth(\n\tblocks,\n\ttotalBlockCount = blocks.length\n) {\n\treturn blocks.reduce(\n\t\t( sum, block ) =>\n\t\t\tsum + getEffectiveColumnWidth( block, totalBlockCount ),\n\t\t0\n\t);\n}\n\n/**\n * Returns an object of `clientId` \u2192 `width` of effective column widths.\n *\n * @param {WPBlock[]} blocks Block objects.\n * @param {?number} totalBlockCount Total number of blocks in Columns.\n * Defaults to number of blocks passed.\n *\n * @return {Object<string,number>} Column widths.\n */\nexport function getColumnWidths( blocks, totalBlockCount = blocks.length ) {\n\treturn blocks.reduce( ( accumulator, block ) => {\n\t\tconst width = getEffectiveColumnWidth( block, totalBlockCount );\n\t\treturn Object.assign( accumulator, { [ block.clientId ]: width } );\n\t}, {} );\n}\n\n/**\n * Returns an object of `clientId` \u2192 `width` of column widths as redistributed\n * proportional to their current widths, constrained or expanded to fit within\n * the given available width.\n *\n * @param {WPBlock[]} blocks Block objects.\n * @param {number} availableWidth Maximum width to fit within.\n * @param {?number} totalBlockCount Total number of blocks in Columns.\n * Defaults to number of blocks passed.\n *\n * @return {Object<string,number>} Redistributed column widths.\n */\nexport function getRedistributedColumnWidths(\n\tblocks,\n\tavailableWidth,\n\ttotalBlockCount = blocks.length\n) {\n\tconst totalWidth = getTotalColumnsWidth( blocks, totalBlockCount );\n\n\treturn Object.fromEntries(\n\t\tObject.entries( getColumnWidths( blocks, totalBlockCount ) ).map(\n\t\t\t( [ clientId, width ] ) => {\n\t\t\t\tconst newWidth = ( availableWidth * width ) / totalWidth;\n\t\t\t\treturn [ clientId, toWidthPrecision( newWidth ) ];\n\t\t\t}\n\t\t)\n\t);\n}\n\n/**\n * Returns true if column blocks within the provided set are assigned with\n * explicit widths, or false otherwise.\n *\n * @param {WPBlock[]} blocks Block objects.\n *\n * @return {boolean} Whether columns have explicit widths.\n */\nexport function hasExplicitPercentColumnWidths( blocks ) {\n\treturn blocks.every( ( block ) => {\n\t\tconst blockWidth = block.attributes.width;\n\t\treturn Number.isFinite(\n\t\t\tblockWidth?.endsWith?.( '%' )\n\t\t\t\t? parseFloat( blockWidth )\n\t\t\t\t: blockWidth\n\t\t);\n\t} );\n}\n\n/**\n * Returns a copy of the given set of blocks with new widths assigned from the\n * provided object of redistributed column widths.\n *\n * @param {WPBlock[]} blocks Block objects.\n * @param {Object<string,number>} widths Redistributed column widths.\n *\n * @return {WPBlock[]} blocks Mapped block objects.\n */\nexport function getMappedColumnWidths( blocks, widths ) {\n\treturn blocks.map( ( block ) => ( {\n\t\t...block,\n\t\tattributes: {\n\t\t\t...block.attributes,\n\t\t\twidth: `${ widths[ block.clientId ] }%`,\n\t\t},\n\t} ) );\n}\n\n/**\n * Returns an array with columns widths values, parsed or no depends on `withParsing` flag.\n *\n * @param {WPBlock[]} blocks Block objects.\n * @param {?boolean} withParsing Whether value has to be parsed.\n *\n * @return {Array<number,string>} Column widths.\n */\nexport function getWidths( blocks, withParsing = true ) {\n\treturn blocks.map( ( innerColumn ) => {\n\t\tconst innerColumnWidth =\n\t\t\tinnerColumn.attributes.width || 100 / blocks.length;\n\n\t\treturn withParsing ? parseFloat( innerColumnWidth ) : innerColumnWidth;\n\t} );\n}\n\n/**\n * Returns a column width with unit.\n *\n * @param {string} width Column width.\n * @param {string} unit Column width unit.\n *\n * @return {string} Column width with unit.\n */\nexport function getWidthWithUnit( width, unit ) {\n\twidth = 0 > parseFloat( width ) ? '0' : width;\n\n\tif ( isPercentageUnit( unit ) ) {\n\t\twidth = Math.min( width, 100 );\n\t}\n\n\treturn `${ width }${ unit }`;\n}\n\n/**\n * Returns a boolean whether passed unit is percentage\n *\n * @param {string} unit Column width unit.\n *\n * @return {boolean} \tWhether unit is '%'.\n */\nexport function isPercentageUnit( unit ) {\n\treturn unit === '%';\n}\n"], "mappings": ";AAQO,IAAM,mBAAmB,CAAE,UAAW;AAC5C,QAAM,gBAAgB,WAAY,KAAM;AACxC,SAAO,OAAO,SAAU,aAAc,IACnC,WAAY,cAAc,QAAS,CAAE,CAAE,IACvC;AACJ;AAUO,SAAS,wBAAyB,OAAO,iBAAkB;AACjE,QAAM,EAAE,QAAQ,MAAM,gBAAgB,IAAI,MAAM;AAChD,SAAO,iBAAkB,KAAM;AAChC;AAWO,SAAS,qBACf,QACA,kBAAkB,OAAO,QACxB;AACD,SAAO,OAAO;AAAA,IACb,CAAE,KAAK,UACN,MAAM,wBAAyB,OAAO,eAAgB;AAAA,IACvD;AAAA,EACD;AACD;AAWO,SAAS,gBAAiB,QAAQ,kBAAkB,OAAO,QAAS;AAC1E,SAAO,OAAO,OAAQ,CAAE,aAAa,UAAW;AAC/C,UAAM,QAAQ,wBAAyB,OAAO,eAAgB;AAC9D,WAAO,OAAO,OAAQ,aAAa,EAAE,CAAE,MAAM,QAAS,GAAG,MAAM,CAAE;AAAA,EAClE,GAAG,CAAC,CAAE;AACP;AAcO,SAAS,6BACf,QACA,gBACA,kBAAkB,OAAO,QACxB;AACD,QAAM,aAAa,qBAAsB,QAAQ,eAAgB;AAEjE,SAAO,OAAO;AAAA,IACb,OAAO,QAAS,gBAAiB,QAAQ,eAAgB,CAAE,EAAE;AAAA,MAC5D,CAAE,CAAE,UAAU,KAAM,MAAO;AAC1B,cAAM,WAAa,iBAAiB,QAAU;AAC9C,eAAO,CAAE,UAAU,iBAAkB,QAAS,CAAE;AAAA,MACjD;AAAA,IACD;AAAA,EACD;AACD;AAUO,SAAS,+BAAgC,QAAS;AACxD,SAAO,OAAO,MAAO,CAAE,UAAW;AACjC,UAAM,aAAa,MAAM,WAAW;AACpC,WAAO,OAAO;AAAA,MACb,YAAY,WAAY,GAAI,IACzB,WAAY,UAAW,IACvB;AAAA,IACJ;AAAA,EACD,CAAE;AACH;AAWO,SAAS,sBAAuB,QAAQ,QAAS;AACvD,SAAO,OAAO,IAAK,CAAE,WAAa;AAAA,IACjC,GAAG;AAAA,IACH,YAAY;AAAA,MACX,GAAG,MAAM;AAAA,MACT,OAAO,GAAI,OAAQ,MAAM,QAAS,CAAE;AAAA,IACrC;AAAA,EACD,EAAI;AACL;AAUO,SAAS,UAAW,QAAQ,cAAc,MAAO;AACvD,SAAO,OAAO,IAAK,CAAE,gBAAiB;AACrC,UAAM,mBACL,YAAY,WAAW,SAAS,MAAM,OAAO;AAE9C,WAAO,cAAc,WAAY,gBAAiB,IAAI;AAAA,EACvD,CAAE;AACH;AAUO,SAAS,iBAAkB,OAAO,MAAO;AAC/C,UAAQ,IAAI,WAAY,KAAM,IAAI,MAAM;AAExC,MAAK,iBAAkB,IAAK,GAAI;AAC/B,YAAQ,KAAK,IAAK,OAAO,GAAI;AAAA,EAC9B;AAEA,SAAO,GAAI,KAAM,GAAI,IAAK;AAC3B;AASO,SAAS,iBAAkB,MAAO;AACxC,SAAO,SAAS;AACjB;", "names": [] }