{"_id":"slack-block-builder","_rev":"48-0067451ebb51967ba1af0504aa47f52a","name":"slack-block-builder","dist-tags":{"latest":"2.8.0","beta":"2.4.1-beta.0"},"versions":{"0.1.0":{"name":"slack-block-builder","version":"0.1.0","description":"Lightweight, no-dependency JavaScript library for creating Slack Block Kit UIs, with a builder interface, inspired by SwiftUI.","author":{"name":"Ray East","url":"https://github.com/raycharius"},"repository":{"type":"git","url":"git+https://github.com/raycharius/slack-block-builder.git"},"homepage":"https://github.com/raycharius/slack-block-builder#readme","bugs":{"url":"https://github.com/raycharius/slack-block-builder/issues"},"main":"./src/index.js","license":"MIT","keywords":["slack","interactive-messages","block-actions","bot","slack-bot","modal","block-kit","swiftui","bot","modal","message-builder","block-builder","slack-block-builder","block-kit"],"scripts":{"test":"jest","lint-fix":"eslint 'src/**/*.js' --fix","lint-check":"eslint 'src/**/*.js'","prettier-fix":"prettier --write 'src/**/*.js'","prettier-check":"prettier --check 'src/**/*.js'"},"devDependencies":{"eslint":"^6.8.0","eslint-config-airbnb-base":"^14.1.0","eslint-plugin-import":"^2.20.2","prettier-eslint-cli":"^5.0.0","jest":"^26.0.1"},"gitHead":"998b5966b53fdf0b110db4fee682a2228b5cd06d","_id":"slack-block-builder@0.1.0","_nodeVersion":"14.1.0","_npmVersion":"6.14.4","dist":{"integrity":"sha512-R2HBm84ikU/BfyWrTinrN/nDvuTqYV9vy03QlJDJlDw705eSouSN8Ubw1FCvCCP8ltrxeJCphGVHIS4e6IF91g==","shasum":"025e7edc8de49908ae6af70e21e77fac4502f4fd","tarball":"https://registry.npmjs.org/slack-block-builder/-/slack-block-builder-0.1.0.tgz","fileCount":81,"unpackedSize":167023,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe35UDCRA9TVsSAnZWagAAiJQP/A2lbk6Kj29EDs6tgtkK\nS0NOtHUJDvIT3gMH2p+kHujq542L/HKaG7MAcJ4LuxsvYR9xAn9BBeLKEQC1\nUMz0iAc8zeNTf0Mgbdwp2b0yvDRi5dDA4OEYqQx8YTPBlHFl0L700FpBgnp7\nEP0ia1/LohkFRBUQxRFz+HMOk9if8qzw8dBDV6pbSggZhWtfuLaEF2SFPng7\n4J325Nq2wtC6axVKS15v8pvk4eoaRC6vxa5qZGCNiJhsTsZZYoQLfOVL6KJu\nbAV1hROsXgW+iBHfkS2KSN6y4vJpD1FUsNnMoIGxsrmdumIcAG2cap1EehZo\nLWyH13aePt9+bSu4pHXGw1Oa427+dqgaSz5WNFRsP66nfmGxxWHPz9X+k/px\nbCCPp56Vx8pYMSl9EFbG/EsfrzsYpM2WMQh+Bi7IYEiGhb91Y5Zgldgnx9CE\ndmm5wdYA4EyujJPg0ak0cFgMngjfmgxyhBAuIbuFaE09fgZUr8toMidErefW\nKUiAw+qgKKeVaU/SJJGm8yVPZOCIFBCZr+2NA7sVbVk1uoiExt/HsGDvFSZz\n0qzHzNakmfQB9nJVXFi5Gfb/SdYG6ZgT5KYdGo6iRXvX8a44F6X3TOHgNBZp\njseUZJfzkgipttx7v2jbxL+Y064Ac8m8svqAh2UerBDwInbqLEy6gw2pOw9W\nkHau\r\n=h9YV\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFcoRNOrhfiQ6knUfo+zNFD7Fg2FWQVCNBX0h7qbqd7QAiEAqJE/fXg9uYtZrH7yiEZGtEY/4+Bjtd8SBGwGVtNbkHs="}]},"maintainers":[{"name":"raycharius","email":"raydeast@gmail.com"}],"_npmUser":{"name":"raycharius","email":"raydeast@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/slack-block-builder_0.1.0_1591710979381_0.32797107484229104"},"_hasShrinkwrap":false},"0.1.1":{"name":"slack-block-builder","version":"0.1.1","description":"Lightweight, zero-dependency library for creating Slack messages and modals, with a builder interface inspired by SwiftUI.","author":{"name":"Ray East","url":"https://github.com/raycharius"},"repository":{"type":"git","url":"git+https://github.com/raycharius/slack-block-builder.git"},"homepage":"https://github.com/raycharius/slack-block-builder#readme","bugs":{"url":"https://github.com/raycharius/slack-block-builder/issues"},"main":"./src/index.js","license":"MIT","keywords":["slack","interactive-messages","block-actions","bot","slack-bot","modal","block","kit","swiftui","bot","modal","messages","message-builder","block-builder","slack-block-builder","block-kit"],"scripts":{"test":"jest","lint-fix":"eslint 'src/**/*.js' --fix","lint-check":"eslint 'src/**/*.js'","prettier-fix":"prettier --write 'src/**/*.js'","prettier-check":"prettier --check 'src/**/*.js'"},"devDependencies":{"eslint":"^6.8.0","eslint-config-airbnb-base":"^14.1.0","eslint-plugin-import":"^2.20.2","prettier-eslint-cli":"^5.0.0","jest":"^26.0.1"},"gitHead":"e02cdee6a3777ac8ec1ebf94c8ceb942aa552499","_id":"slack-block-builder@0.1.1","_nodeVersion":"14.1.0","_npmVersion":"6.14.4","dist":{"integrity":"sha512-/vMiLzYuDWMvrShRpgeEVYITV45pdzoS0cSBh6FGQX4PY7HuuQNK7c/wt0p/rgy1c2Tlm6EXwhnMnYtn5RmzgA==","shasum":"3d995425ae666d0aa8f3ab34163d0abb4da3539b","tarball":"https://registry.npmjs.org/slack-block-builder/-/slack-block-builder-0.1.1.tgz","fileCount":81,"unpackedSize":167582,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe4UG2CRA9TVsSAnZWagAAi+EQAKSIEtV6Mv5DJX/nucgR\nzAJqj2mKnv192BywXSqe3jxUfTEqwqzKqUhQnKyMSfF1njPIZd2dcBbr/Wa6\nOIpFffBnPCElTTMnixVs0N9/CMfBq26tBqNwjlY3o/SwXK6t0Yrj32QdNAEM\nsBcJfgWw3bRuSeMnMaHVOnxPe6+Hz0YbvwyGP5f2foBdsibV12Jse7bf7Iim\nVi9/FsEwMLzh5tcgJJNhTKW6q1AP1zhYQ8mEyrx4Hcgqd3Sw0rs20/mTU4TU\n2VR5XxP6ePXEQf03YdfznO5QtBW90/tziX3xAg591tnGEt0QkM1W70EsiLJ/\n9DW3SDKewzaWfTT92+H1VOI0WThwMTFdqJuMDES6Y+oaau6aiZM39qhq3BLF\n35k4Emy6POLIQOlYx/GVocwVKPkLu8T3uDrtt7qnxuzCawmwe0ccMnTI9u9z\n+yOK7QoXPxp2O9eOx4/bcPPhA3pImdxyvzmABTj8Z1P0aBBLOFnnXEDZT7TC\nU7bIEk7JmQjscAFHfnhoT4NeZELXS5JRbETesX0Izv+nsHkk/jAEwZfzW0lq\nCeafG1pcdJzeX5naVl5Xl3aIznKaRZ0885znBoUGOAzEC+dGHINLAwtjJhaX\nHGv0aCfiuJLqLVdqbw8M0dOEUtDnGkGGaz/A/pY2sIwns+V0YMmZ24nCsJc5\ntt+A\r\n=+kyV\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDjpkdwWPCRqEDf+g4wDgxH6zVxpTEi7HvKiGsyH6zRggIhAPiQkpuiCNLKIBTbER7QacatWehrcAL6o8dxhavC89Sp"}]},"maintainers":[{"name":"raycharius","email":"raydeast@gmail.com"}],"_npmUser":{"name":"raycharius","email":"raydeast@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/slack-block-builder_0.1.1_1591820726278_0.6094075470192648"},"_hasShrinkwrap":false},"0.1.2":{"name":"slack-block-builder","version":"0.1.2","description":"Lightweight, zero-dependency library for creating Slack messages and modals, with a builder interface inspired by SwiftUI.","author":{"name":"Ray East","url":"https://github.com/raycharius"},"repository":{"type":"git","url":"git+https://github.com/raycharius/slack-block-builder.git"},"homepage":"https://github.com/raycharius/slack-block-builder#readme","bugs":{"url":"https://github.com/raycharius/slack-block-builder/issues"},"main":"./src/index.js","license":"MIT","keywords":["slack","interactive-messages","block-actions","bot","slack-bot","modal","block","kit","swiftui","bot","modal","messages","message-builder","block-builder","slack-block-builder","block-kit"],"scripts":{"test":"jest","lint-fix":"eslint 'src/**/*.js' --fix","lint-check":"eslint 'src/**/*.js'","prettier-fix":"prettier --write 'src/**/*.js'","prettier-check":"prettier --check 'src/**/*.js'"},"devDependencies":{"eslint":"^6.8.0","eslint-config-airbnb-base":"^14.1.0","eslint-plugin-import":"^2.20.2","prettier-eslint-cli":"^5.0.0","jest":"^26.0.1"},"gitHead":"d1fb2cc84ebd8b52635735098ac9e8d526e74388","_id":"slack-block-builder@0.1.2","_nodeVersion":"14.1.0","_npmVersion":"6.14.4","dist":{"integrity":"sha512-/iq6AprdEXoxezvI67M6UJ0pN23hG3r7sn5QQXNMVjNxagn5HhjUVfg4Jpd/c4SJ86GdAGFa7w4hsWuNLjWPYQ==","shasum":"1a58ccd49bb32b435f7d9782dc58fb1db5266383","tarball":"https://registry.npmjs.org/slack-block-builder/-/slack-block-builder-0.1.2.tgz","fileCount":81,"unpackedSize":167935,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe49mTCRA9TVsSAnZWagAAG1sP/ApL49zcxnOluogsUAHF\neIAFxIZ7OZ9RCpA4yvhcj1lJxmdrsrdetYc7hhMYhmsBQ7cX3hbO/KsDKs6B\n99ZbwCihPJ2yzj8LmumXuVN3qwrWBIdTTgbeJ387OE5I4MTQ2FIL65otD20j\nlJa1CC8TFjnaGIevgSA1KF95cT1DHkppvb3rEmn7fYbZ79Yx4zWE+N+qLhaf\n7K6IL4fWYKKxN8pYLbrlAFPW8H9XFNJKkpsTGfh+O2g108SUnChm7/93YQxY\nkziTOwcZPYwDRsNfxyMzY3OKwU1ovwmmwV05sjJD2c47lftZ08Y2K1MAC+TV\nw6r790bfAlrhrbPWpp3Jhy53huYWFRVGTD0kHUKkARbavP5LqWoZTZ2Rjjke\nhkuHdZz40ZQOnNkRGDY5ybQchFFvAO+85opwcnWGnXPuIjidiS/rX3S1xlFo\npgD/FYNoxg5OjewzpIwY51qQdmJ6BWG14fsJepB4qobIfVZTPIEnnfKgEKdN\nVIXQaY3HN8b1diyIpO+iWs4BtO5KK3OITfGhz4uDR8+kLJ7vmbpfk3HBlr8B\nI3L9TuNyuNtyW25Wq4ZLyhZ6IUQtwoEYzugCwh1neV22GY04xjlDbGsS/knK\no2E5eftJKb0pYP3bn649Z0OHWK/BgyjVOAlE8LIvv3uGMMq1BJwHkM7QGYA9\n6lE3\r\n=kqoq\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCePcuUohl3tRd2bQdIX19Os8ONLwOvmkjiqwb2qKu0VgIgXybd5CBUW+GHkJVrDx3jQW73Kx90qG0S+QD5hSNu46I="}]},"maintainers":[{"name":"raycharius","email":"raydeast@gmail.com"}],"_npmUser":{"name":"raycharius","email":"raydeast@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/slack-block-builder_0.1.2_1591990674943_0.08973411629302097"},"_hasShrinkwrap":false},"0.1.3":{"name":"slack-block-builder","version":"0.1.3","description":"Lightweight, zero-dependency library for creating Slack messages and modals, with a builder interface inspired by SwiftUI.","author":{"name":"Ray East","url":"https://github.com/raycharius"},"repository":{"type":"git","url":"git+https://github.com/raycharius/slack-block-builder.git"},"homepage":"https://github.com/raycharius/slack-block-builder#readme","bugs":{"url":"https://github.com/raycharius/slack-block-builder/issues"},"main":"./src/index.js","license":"MIT","keywords":["slack","interactive-messages","block-actions","bot","slack-bot","modal","block","kit","swiftui","bot","modal","messages","message-builder","block-builder","slack-block-builder","block-kit"],"scripts":{"test":"jest","lint-fix":"eslint 'src/**/*.js' --fix","lint-check":"eslint 'src/**/*.js'","prettier-fix":"prettier --write 'src/**/*.js'","prettier-check":"prettier --check 'src/**/*.js'"},"devDependencies":{"eslint":"^6.8.0","eslint-config-airbnb-base":"^14.1.0","eslint-plugin-import":"^2.20.2","prettier-eslint-cli":"^5.0.0","jest":"^26.0.1"},"gitHead":"072d93b9a7b681254a80c75cb258c4da8f7e902b","_id":"slack-block-builder@0.1.3","_nodeVersion":"14.1.0","_npmVersion":"6.14.4","dist":{"integrity":"sha512-eoQjFYAgVWvi16nXQ9buN8XhbAolR/VfuwLJOaKVQgQ1pl62hOeOyvlu9zVave9MzCEzO4BH4Gb9rFsWyQjQbA==","shasum":"a1ac3f7acca1b7ffe77a94d24b05ade80ac0b452","tarball":"https://registry.npmjs.org/slack-block-builder/-/slack-block-builder-0.1.3.tgz","fileCount":81,"unpackedSize":169717,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe5AFoCRA9TVsSAnZWagAA1EMP/0sUSRAsQItxMuJPb97l\nGZCerRiIUiRlYFbV8ZeOfjhoERobdu9RHwRIMn654SLOvoMaAM7UuRMIpxxP\nIgMlkD/cONO0UnRGVVBLXM5rEiuJzt7B9F+q8rHat8u/5Mg8EvnBWDtax0k+\n7Rx+dVn9ukxTFsRqrLhw5dgx3KGY3clYl1X81gp9JaEcVfnKZJJ0rSWOvh1L\n7bRTjcwd7oE95e3w9mnv9Aq5UGBf6QHvUia04i176p1O0o2axFKXtwmAaDZG\nqngEk4qYs0afZYWeR+9YkEJal4C6YF4SQrCWvOJNqWrkbgRJ0OXk4pTYhWZD\ny2IQi+jGqy+a8ijquNRbF8qvV6m/i+FZvWZFDgZMCyx4nJKuUbH2C4zWk1CE\nHAV8LmW6oeGfVvhddBMPmvmRWbCs09WLwrGq0hgLkVJ553RGGRSsAsp429zX\n4onc1lqooGjagkdrE19QM8ktOTg4UkhIAUayNtzhHJ4pAUbK4dyOYGOq3mXf\ndWd0laWe2iZYgt7prgPIB4m90bnceIxKYPMP+QFf9C/8oKmpYzQm+Q/o0ZT0\nTkE9EWPqS2txHmbK7BPlfYchzbXzhXZPSldHrXu7T8qEbaWqyDbjVCoA9Hlt\nRVmko/4lEVDUAz21LpoN90E4XUsQhbOa7j0LBRhsg/LCQC3yp0fqqJLFzP/+\nXZkq\r\n=ZwEu\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDzdRgSp1q5rrdYEpuBOe6rnCiEXaZSaERGRuXmLyIgEAiEA6f8gBQNdIX5W9eWThYzx2fjNHxHJJsfNHsF4OCPDdjQ="}]},"maintainers":[{"name":"raycharius","email":"raydeast@gmail.com"}],"_npmUser":{"name":"raycharius","email":"raydeast@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/slack-block-builder_0.1.3_1592000871991_0.8048833103090576"},"_hasShrinkwrap":false},"0.1.4":{"name":"slack-block-builder","version":"0.1.4","description":"Lightweight, zero-dependency library for creating Slack messages and modals, with a builder interface inspired by SwiftUI.","author":{"name":"Ray East","url":"https://github.com/raycharius"},"repository":{"type":"git","url":"git+https://github.com/raycharius/slack-block-builder.git"},"homepage":"https://github.com/raycharius/slack-block-builder#readme","bugs":{"url":"https://github.com/raycharius/slack-block-builder/issues"},"main":"./src/index.js","license":"MIT","keywords":["slack","interactive-messages","block-actions","bot","slack-bot","modal","block","kit","swiftui","bot","modal","messages","message-builder","block-builder","slack-block-builder","block-kit"],"scripts":{"test":"jest","lint-fix":"eslint 'src/**/*.js' --fix","lint-check":"eslint 'src/**/*.js'","prettier-fix":"prettier --write 'src/**/*.js'","prettier-check":"prettier --check 'src/**/*.js'"},"devDependencies":{"eslint":"^6.8.0","eslint-config-airbnb-base":"^14.1.0","eslint-plugin-import":"^2.20.2","prettier-eslint-cli":"^5.0.0","jest":"^26.0.1"},"gitHead":"9979031e3c562ce3c84c48b30fe5bd7cd823c8bd","_id":"slack-block-builder@0.1.4","_nodeVersion":"14.1.0","_npmVersion":"6.14.4","dist":{"integrity":"sha512-moMZciO802bbrAKIOJERrjqb+23M1vxyqtl1l8QR2TF5xI1yMECvzbRfq23jP2wjnA24mlf9AxjjnPdeJkNWng==","shasum":"d20c2192601c491ab85787ecf2ebaa3304afb039","tarball":"https://registry.npmjs.org/slack-block-builder/-/slack-block-builder-0.1.4.tgz","fileCount":81,"unpackedSize":170210,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe5nzXCRA9TVsSAnZWagAAGj8QAJwWnWk7TTn0tzwDxf/r\nGN4C8IZX2wAqcjgykw/y8aRUFACdwX2Lt3p6f7CsbsTUMN4whkKGjEW17bRs\n0+k1RWIYVp5Vq/irDglulmLwZFkOO6xwzcgttJHtTXDChJTsDoGAYkCMkmlR\nQR4Wp1+qFZut6DKDm5awYmQVHBdW5CC0MQjpw4oprYjPhdjFM1MpaZVbQaLA\nOwIKr+uvQ7O3O0B3nYvvSEMJEaGxeA4HNDlfUWDQbEAfG1QKQtxhJc775JlH\n9YHzv0A8w1YuALJEQ6aPapsPCjv1iIypWUL1scNRlGZweGZQYREgqivYl+JA\nbVVb5Hn1j8m3wuIWkNL/WdOh/Z4dtuXqgM8o1048D9SIB5uQnDvDlWHRfLYH\n5gnCZvO7vyLm+B4GBKbi6SVvEIKTDiXoprA4Pr6gqgvzI0nvDvXqHqJVYkG6\nOTKWK6aicjzNGZMExLEP6P2ql/dLCyrs0afWiHL/WZSb60TIzPUSgSuJACkm\nY/qu+xzLYCDAMoaH8ZY/irsR64YI0zLENR2MnBxStkIf6j15deEpz9tDC4S0\nHiEZUty6DPy+kTXX7gQasECPu4u5WajP2USmyA8GPyYpzDdMx81K5FJetOvF\nQtYBS3rQzlKlfxrFquwgHtfT2wPjOIf0M4hsXGfs/aXLhpGbIF7eky2k3mna\nXcnA\r\n=Xndi\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIG6245L3CPw0tzp0OJ7a5FxHwp+7p41ix+NIwIs8BiRdAiEA7KlByk49IrwbZPIYmIiO00aNFgA3RcvHin+wHR6oCTk="}]},"maintainers":[{"name":"raycharius","email":"raydeast@gmail.com"}],"_npmUser":{"name":"raycharius","email":"raydeast@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/slack-block-builder_0.1.4_1592163543022_0.3801726461567976"},"_hasShrinkwrap":false},"1.0.0":{"name":"slack-block-builder","version":"1.0.0","description":"Maintainable code for interactive Slack messages, modals and home tabs. A must-have for the Slack Block Kit framework.","author":{"name":"Ray East","url":"https://github.com/raycharius"},"repository":{"type":"git","url":"git+https://github.com/raycharius/slack-block-builder.git"},"homepage":"https://github.com/raycharius/slack-block-builder#readme","bugs":{"url":"https://github.com/raycharius/slack-block-builder/issues"},"main":"./src/index.js","license":"MIT","keywords":["slack","interactive-messages","block-actions","bot","slack-bot","modal","block","kit","swiftui","bot","modal","messages","message-builder","block-builder","slack-block-builder","block-kit"],"scripts":{"test":"jest","lint-fix":"eslint 'src/**/*.js' --fix","lint-check":"eslint 'src/**/*.js'","prettier-fix":"prettier --write 'src/**/*.js'","prettier-check":"prettier --check 'src/**/*.js'"},"devDependencies":{"eslint":"^6.8.0","eslint-config-airbnb-base":"^14.1.0","eslint-plugin-import":"^2.20.2","prettier-eslint-cli":"^5.0.0","jest":"^26.0.1"},"gitHead":"c0ba51947cb8870bdc1c811df12c2b411a349a7e","_id":"slack-block-builder@1.0.0","_nodeVersion":"14.1.0","_npmVersion":"6.14.4","dist":{"integrity":"sha512-UlCZ7WM1Qyf+3alsfoO0qsfBIv9YGDyCjWCHUhhxIYY6hPTvLRoGlIBuZxLffvP7UA5p887ez7Qgkk0ya9bMew==","shasum":"cc85b0d528688da6df0caa403f2251a6c71713b7","tarball":"https://registry.npmjs.org/slack-block-builder/-/slack-block-builder-1.0.0.tgz","fileCount":81,"unpackedSize":153695,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe6UuzCRA9TVsSAnZWagAAZCIP/0p/nvM0TIGgOSOIhkHj\nrtLAA+SjV7ZsIaSlOu8634wVDUxfZkwd4K655v/6J2paglEddo0KfYX6r6mt\ngpAQzaL5Rwqft0sMiaOZr44BYTQRjRNI7yTx152FaYnvtS/Kq+xXokXEbScV\niDFTAgaQw1ec7Mkzmnlf1djOlL0QJJW9jGjAf6xY3Ja403HLs5PSPOA5AZGK\n/oumiqcoANFrY7JdrwDOBCq2RjK7ajoktIfOq9krKiW+jduYhY117MuG1TLe\nVo4ek+qNi4TqISVhuNJsfg+eGTDQx5ttijkNhGFbdZNbQpM+JQlSUKV5582y\ntDf+Y1c6bzFjAShR+5rQ82QMWbGV78QsYk/0yHLQPoiCD/1jlEyvaWxACzhl\n5vDsB1fN1TXiIOgBaj28YQdeTIHcXBj2mfNNpTseFkX8eK/9tpLccMhdvbgu\nHqMHTpPVln/oLtdXkTGpQ2qKlngil2m2gJYuin3md8kZO711i9vwPnJSX50q\nMvpuE3cZNDbarnESOAT2G4SpLN6gnd0xefKPtzzGhji1IedBZse0ZdIepZs3\n1QzfrYvxVU28iFW/FhyJLdfCWP0OEcBAmrdNoUeP70vAzSE1indlL678o4Dk\nYHJ8hbX+xIRP3H67pEfH+eA9OTYlFB7YRE0uIRzXfZrOADUNCX16mp0m+rTQ\nSdhf\r\n=q2Uf\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDnaPqnvpNEEu42LEnn2JRAM7mZ28TjWnf/EfClxBPqDAIgYpiSkGTSksndeAY8oH26aEJ0iC/QYO11VZDTp+pdQQU="}]},"maintainers":[{"name":"raycharius","email":"raydeast@gmail.com"}],"_npmUser":{"name":"raycharius","email":"raydeast@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/slack-block-builder_1.0.0_1592347570541_0.9876961521867071"},"_hasShrinkwrap":false},"1.1.0":{"name":"slack-block-builder","version":"1.1.0","description":"Maintainable code for interactive Slack messages, modals and home tabs. A must-have for the Slack Block Kit framework.","author":{"name":"Ray East","url":"https://github.com/raycharius"},"repository":{"type":"git","url":"git+https://github.com/raycharius/slack-block-builder.git"},"homepage":"https://blockbuilder.dev","bugs":{"url":"https://github.com/raycharius/slack-block-builder/issues"},"main":"./src/index.js","license":"MIT","keywords":["slack","interactive-messages","block-actions","bot","slack-bot","modal","block","kit","swiftui","bot","modal","messages","message-builder","block-builder","slack-block-builder","block-kit"],"scripts":{"test":"jest","lint-fix":"eslint 'src/**/*.js' --fix","lint-check":"eslint 'src/**/*.js'","prettier-fix":"prettier --write 'src/**/*.js'","prettier-check":"prettier --check 'src/**/*.js'"},"devDependencies":{"eslint":"^6.8.0","eslint-config-airbnb-base":"^14.1.0","eslint-plugin-import":"^2.20.2","prettier-eslint-cli":"^5.0.0","jest":"^26.0.1"},"gitHead":"cf81c9f9fc1ff07a1d500cb72167eb2487dd951a","_id":"slack-block-builder@1.1.0","_nodeVersion":"14.1.0","_npmVersion":"6.14.4","dist":{"integrity":"sha512-fXlrkxPoeSpkSARo2yt09G4V8UW8FbICHEgA1YCF6fWZsiQphDipC1iKlYZjJxS/V63TLEIAf9cHaMbSr2pgNA==","shasum":"cb19ada0f6a07266460603dffd10f0ff647bdc4e","tarball":"https://registry.npmjs.org/slack-block-builder/-/slack-block-builder-1.1.0.tgz","fileCount":81,"unpackedSize":154609,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe6qUVCRA9TVsSAnZWagAA9bMP/0vV7XUJi6BXjBo+G5Hw\nXmg8ipxFI4shlzuYhWwUDsMqbJNapvJGKW4BAeL5vEfLXFQm3kUSoH7PPuaN\noV2KAFzbvzldWiV5aqgBtb4c2s6VBeHi2d3uCWtRccPkWUi5XsKLgWC8Zogw\nw1ETKYJhkes9/sA6OaIvgW9H0CKUC9G+cn/2hAfKjo9wk6/rEQjBPOwAPnvM\nMlZDHHp7JpvfEvQPMpF70wnzJSPespMP4l8MraWuPdEy/p2MuhcR+kjLJ9Hq\npTDAtuoITPr+ezM4omTvRMHoU4yNHBuDfXiJ/krGeGORM9O6pWEeFXWrYsLT\naAeXO2ojRX1BGqys+SWJy7P4rASmbR8eJDICHGWAfFpema+7jMk4HbWkkeFA\n3hUcqliBuaviJtelUlaDTGtQ9vnrOKarDtWEn8VCeTHpTrHv0DgCK55RkNji\nDr/D9wFPUHBz96plNE0bbZMKyI6urH65vsjJWNN2/8DP6jETWUH3jRlsTFh8\nGCWo2PvZqyvQ9GNLtPD020732rptL6XL0z6/q+CT+9YP4NbwsDPe+UK9mxH8\nkOtYP1anfz69yKD3KGnWfyGQC42VeRZB1xYI7ciwE5pb/pOwErDj46HL8oxw\nZ0YBDscEaj4k/3H7I++8hiB3UdK2hSNFGDJnINB6y5PNRCreFaqCiynbIhzU\n/fa2\r\n=7xx2\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCNpAzgPQGmlxacsNChNbVVSnRKRrarcgwXegqzqZCSXAIgTi2Ght467MOasod8xhFnlzz54DGg8uTywzFV8dXAkmE="}]},"maintainers":[{"name":"raycharius","email":"raydeast@gmail.com"}],"_npmUser":{"name":"raycharius","email":"raydeast@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/slack-block-builder_1.1.0_1592435988891_0.01997007547006513"},"_hasShrinkwrap":false},"1.2.0":{"name":"slack-block-builder","version":"1.2.0","description":"Maintainable code for interactive Slack messages, modals and home tabs. A must-have for the Slack Block Kit framework.","author":{"name":"Ray East","url":"https://github.com/raycharius"},"repository":{"type":"git","url":"git+https://github.com/raycharius/slack-block-builder.git"},"homepage":"https://blockbuilder.dev","bugs":{"url":"https://github.com/raycharius/slack-block-builder/issues"},"main":"./src/index.js","license":"MIT","keywords":["slack","interactive-messages","block-actions","bot","slack-bot","modal","block","kit","swiftui","bot","modal","messages","message-builder","block-builder","slack-block-builder","block-kit"],"scripts":{"test":"jest","lint-fix":"eslint 'src/**/*.js' --fix","lint-check":"eslint 'src/**/*.js'","prettier-fix":"prettier --write 'src/**/*.js'","prettier-check":"prettier --check 'src/**/*.js'"},"devDependencies":{"eslint":"^6.8.0","eslint-config-airbnb-base":"^14.1.0","eslint-plugin-import":"^2.20.2","prettier-eslint-cli":"^5.0.0","jest":"^26.0.1"},"gitHead":"66b852502763ae71af49efd369819a47d5f8f968","_id":"slack-block-builder@1.2.0","_nodeVersion":"14.1.0","_npmVersion":"6.14.4","dist":{"integrity":"sha512-WY7YGEujsRcfR0DGl3MP8jItYbnXdWuoJksFfaluj+AI2h6ANOW9rCGc97gqLu7259oEThG6dLb7bn1i/jbahA==","shasum":"9739bf19f7409da35034918ff3534797aec4991f","tarball":"https://registry.npmjs.org/slack-block-builder/-/slack-block-builder-1.2.0.tgz","fileCount":81,"unpackedSize":155305,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe9S1aCRA9TVsSAnZWagAA+EAP/1Kncdea3rapolKqtQ0P\nKWE99qPdn1hWTgErQf1iqETL+B6eGwYrW07WNZjVNC79Qwkbe1Fii68Yt+cH\n3YvamlhgER6x3QaEKPshqMQ3ds6UcZkc5D30L6xwGiCVdk2Ag9XBsbr8IVKc\ntom5IwoT8I3oUqKtUmtnV4axo/+nZA1FXdyNuwhjC80m/8Z6rLtfMEI6HAT7\nFcUTMwjzgUJit5ZF2zvFSi+efdJ4noOAGKidAhoBSCLI88dgioScu/lIQiXo\n/Bf4EBMgWzuw/bH0T6jeTCR0SChk6Ot9DF5Xy+GszMCDv9c3sBSNhJAo0vrE\nLBHR7ryoI92I3nn9ncGLV70R08ViX6KYYqwLjy9bhdinW3JtiDhDsEMlhBCs\n0vG5cAK4+nvj+ibtdW1CXXL35JAOfwfIcjQrHEeJawMsjic0V4ZSiq93zte4\nMrUNCVAp3Jj39viRXALtOkdFQgIfWa7LY1oJsdNVnJ/0iYxmkR+brIXfCq+g\nGvt2VHljheb8YcN8WeWrUYAixVw9hqx4SIi3N5AcXI3g42stGKP0FcZ2MHY0\ncqr85jeua4NOOug8biVACZao7gryFxvO9VHY1UKW9FRglmUuDQucckG93eQI\nNnLQhAglhwwZZ4OdFUBkU+I89o7WrO7T43Mbd+T/SjxukKQPhhqdbvBFtbFc\nNkBf\r\n=Rrqj\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC+iLFNPIGRY5/SkniJNgM+lF5pvgR6KSEZXwWBOihoowIhAMLIE3JP8/LB5HJg3lFtVUK0pb7JdvDLmQ4xt+MEmOwm"}]},"maintainers":[{"name":"raycharius","email":"raydeast@gmail.com"}],"_npmUser":{"name":"raycharius","email":"raydeast@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/slack-block-builder_1.2.0_1593126233860_0.1792623812405134"},"_hasShrinkwrap":false},"1.2.1":{"name":"slack-block-builder","version":"1.2.1","description":"Maintainable code for interactive Slack messages, modals and home tabs. A must-have for the Slack Block Kit framework.","author":{"name":"Ray East","url":"https://github.com/raycharius"},"repository":{"type":"git","url":"git+https://github.com/raycharius/slack-block-builder.git"},"homepage":"https://blockbuilder.dev","bugs":{"url":"https://github.com/raycharius/slack-block-builder/issues"},"main":"./src/index.js","license":"MIT","keywords":["slack","interactive-messages","block-actions","bot","slack-bot","modal","block","kit","swiftui","bot","modal","messages","message-builder","block-builder","slack-block-builder","block-kit"],"scripts":{"test":"jest","lint-fix":"eslint 'src/**/*.js' --fix","lint-check":"eslint 'src/**/*.js'","prettier-fix":"prettier --write 'src/**/*.js'","prettier-check":"prettier --check 'src/**/*.js'"},"devDependencies":{"eslint":"^6.8.0","eslint-config-airbnb-base":"^14.1.0","eslint-plugin-import":"^2.20.2","prettier-eslint-cli":"^5.0.0","jest":"^26.0.1"},"gitHead":"bbc8e7f96bbb70a5df09640a28bf04ce36dd60fe","_id":"slack-block-builder@1.2.1","_nodeVersion":"14.1.0","_npmVersion":"6.14.4","dist":{"integrity":"sha512-M87w5qCT17ws8S5l6kVLZDMsd/yV1t2QyIPt9Xgpqxbckph9w1ucezrlnx8D4t5Bycd7+lc4gPo6ZaJyJmvc7A==","shasum":"2c0c9aba124c65ca06b032bdfc00afd900b20f23","tarball":"https://registry.npmjs.org/slack-block-builder/-/slack-block-builder-1.2.1.tgz","fileCount":81,"unpackedSize":155453,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe9TioCRA9TVsSAnZWagAAy30QAJVzEqAPD9I3BiyIQ2mv\nMq7qU8QakcUi4YBY6R3I48sjuThnX6P8x1JT1GSZf25rZTWLug1geB2F05Po\nURI7pOuYgjf28F9qIDtKZO+NRYsQoPsG46zD0Cwn7ecEMVjYTmrGLGYBWKVe\nqNimpTjp7i5AhlHnGOkVpadomHBbyTYVo4fZbPiXyJq7uN52q1VZrFnksaYr\nLU+Jn41rGAu3FjMX21gOodcah+hmE2IuSAjBgQfMq8jjb4R7D1T9UXfo//od\nNoCIw8VtY/rRBM0gryX27aY76EC741EEmKAwJ2OlQHd0l7DxK1J1K6chdIZQ\nlg/fK28tutK4Hkf42j/HEFNa2PJIyQQdfO0J33341wLNP7DPyOvRmCNKzEvq\ni3clFMDAOGXKWzOtKHT6LgoZlEBMTZ5E0VQFJb1YQ/dI+MVnK/tgRKqaFIz9\nwFrf3/DGdvQT/QhOYceJRDLvsS9YRTZI+FJKoL8g5nBkS5tSbQ2sr+bHT+lY\n2xtHWFyjCkRR4mtlrKBqMzkrJ6KP8JQ0waQz/CRtLdfXWhl0/QSFWLCTKSDv\n8k/nKp239QUWoZQFgEGBSuzCMemciBm+YAgri56hvn8qO99vLv4RrTdlNaJw\n3Fr1/Xa3S3SMjZq3L0C++xuyPywjL5Vx5vnMWaUNrOjR3cAdhzuxlKb4xShW\n4VQ4\r\n=lFe5\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBp1xTuANGjk+CuKFsdUDLOsAOXOrSt25lilACgox+/ZAiBYSx1dabH6STLtaTpGkg8nYG0WS/bwS+t0obk4Ix8ZLA=="}]},"maintainers":[{"name":"raycharius","email":"raydeast@gmail.com"}],"_npmUser":{"name":"raycharius","email":"raydeast@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/slack-block-builder_1.2.1_1593129128075_0.5864648052926471"},"_hasShrinkwrap":false},"1.3.1":{"name":"slack-block-builder","version":"1.3.1","description":"Maintainable code for interactive Slack messages, modals and home tabs. A must-have for the Slack Block Kit framework.","author":{"name":"Ray East","url":"https://github.com/raycharius"},"repository":{"type":"git","url":"git+https://github.com/raycharius/slack-block-builder.git"},"homepage":"https://blockbuilder.dev","bugs":{"url":"https://github.com/raycharius/slack-block-builder/issues"},"main":"./src/index.js","license":"MIT","keywords":["slack","interactive-messages","block-actions","bot","slack-bot","modal","block","kit","swiftui","bot","modal","messages","message-builder","block-builder","slack-block-builder","block-kit","blocks","botkit","bolt","slack-bolt"],"scripts":{"test":"jest","lint-fix":"eslint 'src/**/*.js' --fix","lint-check":"eslint 'src/**/*.js'","prettier-fix":"prettier --write 'src/**/*.js'","prettier-check":"prettier --check 'src/**/*.js'"},"devDependencies":{"eslint":"^6.8.0","eslint-config-airbnb-base":"^14.1.0","eslint-plugin-import":"^2.20.2","prettier-eslint-cli":"^5.0.0","jest":"^26.0.1"},"gitHead":"c0c60d855d469a0bbbd5227131b8cc6183a752f8","_id":"slack-block-builder@1.3.1","_nodeVersion":"14.1.0","_npmVersion":"6.14.4","dist":{"integrity":"sha512-KSIo5/KNutunYfhTLkIMw6C5ZYjZkHBpzm7sD1IZSY8nlL9zlGZIBXKz98hvLhe25t/XqAR4v/zgHtNMl9aqRw==","shasum":"261ddda5238e3d070a6a3d7fada94ead951f4660","tarball":"https://registry.npmjs.org/slack-block-builder/-/slack-block-builder-1.3.1.tgz","fileCount":81,"unpackedSize":155730,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe+nVwCRA9TVsSAnZWagAAlQsP/3aUsTvjj6LzF5PMzkCq\nm/r+J7WZ8hAmfcPwZnZ4Yi58Ov497MgxjMV/9oyH1lDdXPFbb49m0Ou3UbqS\nvgnQIdrhr5BGX/s4E28P7bxpwu0vbHaQdqcIGgLW+hmYaHY636KMFzX+wS7s\nhNu9RPvJ2wPVV4U1L8yMEvTx/jaASOjFcNNug1BtwSMbHMe0pBrfswA3z1wt\npqtwOGg+kIg3PVIp8pTPa/G5PABT1ToaIIeJGTDrxCR2lGnYYu9izzKgZWTB\nYu+o3+M2tJH7v0K/FqaFKh4r8/W2MJBtOxPxNVkuOOYa/7HCYDgULyX+OmGP\nqpNDg7GxpqKlO3to/cCUwsUJ/HpHgBL7xQ46OVLsfhaXA/cUY/h8y/swZyVL\nkDf8T+sVuzzDjlL+oK9PDOEpfJtRbNu8+RgFlV+xWeeIgqaSBdVLL/Pbg4bU\n657YtNY5yz1VP2nMcYPEbhVgVyCUXpO9hkeRlEcVqvMyljS4GOYKOIbji88i\nRBIce59LVMXqA5Tci6CMae8lUoq84DWoOlHiM9ptCjKV4+Z2Fikv1F4XaElM\nZbHx+pysK8XsIJIqET52bOdRVPFHod68rEUE2wXdpqT5mYSXUxWS2R8Axxjw\neNXqCgGl2QWxb4/l8q4SCIEJgNGyMyf9RMbureTh1EB6Hb7Rg8iR+QNLH+sk\n3jWC\r\n=6Mpq\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBuWf3XMwapLcFfboIjCwK5H48JTZIr5eOOhln/2SkvIAiEAmhTGSZ/Z+cPw63qNmWrKqes44ft7vsop1T4tmh9pjhI="}]},"maintainers":[{"name":"raycharius","email":"raydeast@gmail.com"}],"_npmUser":{"name":"raycharius","email":"raydeast@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/slack-block-builder_1.3.1_1593472367469_0.45073703832993206"},"_hasShrinkwrap":false},"1.4.0":{"name":"slack-block-builder","version":"1.4.0","description":"Maintainable code for interactive Slack messages, modals and home tabs. A must-have for the Slack Block Kit framework.","author":{"name":"Ray East","url":"https://github.com/raycharius"},"repository":{"type":"git","url":"git+https://github.com/raycharius/slack-block-builder.git"},"homepage":"https://blockbuilder.dev","bugs":{"url":"https://github.com/raycharius/slack-block-builder/issues"},"main":"./src/index.js","license":"MIT","keywords":["slack","interactive-messages","block-actions","bot","slack-bot","modal","block","kit","swiftui","bot","modal","messages","message-builder","block-builder","slack-block-builder","block-kit","blocks","botkit","bolt","slack-bolt"],"scripts":{"test":"jest","lint-fix":"eslint 'src/**/*.js' --fix","lint-check":"eslint 'src/**/*.js'"},"devDependencies":{"eslint":"^6.8.0","eslint-config-airbnb-base":"^14.1.0","eslint-plugin-import":"^2.20.2","prettier-eslint-cli":"^5.0.0","jest":"^26.0.1"},"gitHead":"9d9ebd9409ec7e2347a325160e70285fc20c9684","_id":"slack-block-builder@1.4.0","_nodeVersion":"14.1.0","_npmVersion":"6.14.4","dist":{"integrity":"sha512-vNksTYEq7TH4pMurO1VYE958KDPEnV6P4AB0HzJhk9XyS0w6OdbuAAnJ+GRLfppzLglHP9khtclnWgYqH/CXKA==","shasum":"d1832395fa446696e01b0a81980b1bf8b6fd508d","tarball":"https://registry.npmjs.org/slack-block-builder/-/slack-block-builder-1.4.0.tgz","fileCount":82,"unpackedSize":159506,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJe/O9MCRA9TVsSAnZWagAAqHEP/03wv08kPhJG5kNSD+8F\nLCSvAPjMa0WPBeF7OATkgo0nUDjQfT+n2IlNIMYTUw3VUzWVMAjqK7nlJoCc\nP7Vq4HPaU1i/ykCXjQZjfWcPhQrkdLh+K3q02mrGeFFedqxyyGyBMYf0zAzZ\nvvtuFBpNVq/jSh4OY6fp1GItnjmJJxzTdPOxI7Q+UObei0521YEVYIYeIOOb\njTB5dFlW+r5VzLiGuO+1ds8MxqJJ7/ZZOh+vmRIgba3EM+IHzBR2lWq+k9wQ\nBlJ+SnUc3fPjBpqDJ9aQidZCYBLSlKMI5q5vM1dhGahZSxeOViNxqT/4MgCS\nqNKX6TnqSBQztGkzyHrqS/dJw3JKtMlAhgKT304HFr3e/y/37HkmByTJHLIO\n2LBSuJSlnwsTrtGGVExgB89XC7qy/P5GqBWh+8Eoa88hq/8lE7yGwOwXPK0c\npK4umKmpiXWHohFt5mNGD0Z8m/VhdB632UUJ63qLiWRPm3L8+DbbpdFLVIMk\nyO2NKLu35cWeoVb4UlEE9aroojLlzPo0jiEqn1vPFLp5X67XAfWCHvO2GUoy\nHAp/5qrPifO6SMRMnKoB9sxKWEK0gDiMRkd9jFfGMmjHBwNxj67M1TlebtcH\nVPXwrT0pUllwCZblhHfYr2Ozo5EXUTy2NJJJSOXDojVu0kqHo/uClBskGHV9\n4Rcd\r\n=7sqw\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCVrYzSftAOC8MXxrxiNPuw0UUTTeaCdbrpRNG7aW2PpwIgEA1DJvKEqng74G5AIuBYJkIrHh6K2g+h8gB8WqAK2N4="}]},"maintainers":[{"name":"raycharius","email":"raydeast@gmail.com"}],"_npmUser":{"name":"raycharius","email":"raydeast@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/slack-block-builder_1.4.0_1593634635984_0.8321626045798827"},"_hasShrinkwrap":false},"1.5.0":{"name":"slack-block-builder","version":"1.5.0","description":"Maintainable code for interactive Slack messages, modals and home tabs. A must-have for the Slack Block Kit framework.","author":{"name":"Ray East","url":"https://github.com/raycharius"},"repository":{"type":"git","url":"git+https://github.com/raycharius/slack-block-builder.git"},"homepage":"https://blockbuilder.dev","bugs":{"url":"https://github.com/raycharius/slack-block-builder/issues"},"main":"./src/index.js","license":"MIT","keywords":["slack","interactive-messages","block-actions","bot","slack-bot","modal","block","kit","swiftui","bot","modal","messages","message-builder","block-builder","slack-block-builder","block-kit","blocks","botkit","bolt","slack-bolt"],"scripts":{"test":"jest","lint-fix":"eslint 'src/**/*.js' --fix","lint-check":"eslint 'src/**/*.js'"},"devDependencies":{"eslint":"^6.8.0","eslint-config-airbnb-base":"^14.1.0","eslint-plugin-import":"^2.20.2","prettier-eslint-cli":"^5.0.0","jest":"^26.0.1"},"gitHead":"012e5fdf3ca20bfdf970ce2b1dbacdd6742032b1","_id":"slack-block-builder@1.5.0","_nodeVersion":"14.1.0","_npmVersion":"6.14.4","dist":{"integrity":"sha512-iXlxsAH2PBceovMrm3x6kTBt7+qjXg5lj2U/czOj1TmFe2dqKCEIRtvtmzrYvSeJZpDnhzWAFgBuhSOwRqYwRQ==","shasum":"8560aff0750f10aa0e9b2fdc11f1feef7a056072","tarball":"https://registry.npmjs.org/slack-block-builder/-/slack-block-builder-1.5.0.tgz","fileCount":82,"unpackedSize":159664,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfC26UCRA9TVsSAnZWagAA2c4QAJU5eaT4rk9XdJDF6Q8a\nrQAjUtQqmPUJ2BfXn0w02HAQhNOc2aYswli+rKaV2Qlq3fbH9+nKXhoOqv65\nbgmnJ5Ch35OXMvwpLnWxkM/woNl7/ErBgoQSzvBIF5YQWjaT5nV0yrzSdTE7\nNaLN2WYX0279GGRdD8MDiWgLCfDG+IBYloUX4oHthd4fjdD3dfByWVVNTrgf\n8vjvryW7ZYRN5Z9nTWbNhoxwjbtn9TPbOjTQHkD1NJfV2NGfKQ18lPQ5pq4f\nDAkSF7jGzyAkb7vzUE4yfeLwE+kfOJDGdyVTO97M4i6R7anEJ+kmHuXwWwXH\nuq/eARHfyjqyJNRWOww/WwP2d4epVkOeytSQ/bPnsZE8BVfwfAuo48hdclRx\nUemXDx1zKFoVvKFncd0KmGw/fTnI/7lcdazF0vaJc39FhRY5zbiudlhuPoCC\nCJniFR+juyGSyvCMrw9gw5yyOlTVnka7EMLU7JTrkQ3pI5Ht8F7KP+OTzjZF\nGgSB+umflJ5lEOHVd/LIhSQ+fLiTrDGg+WBdtmk+2e0LVbKTGqlvKySQFfBi\n9+VmkZI6cDrOty63Ddh01YXlsZ8Ar6kj0nnnZbhfudXbqySSp/sYXELQl3xe\nWo4BXgYWSBGOOSQHyKHLeedIxltuQISomcwujzCTpJlWwYK8rR+bRPuhYoub\nLQE9\r\n=2JoK\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCIxe1lmmWCGU27GgIlXjgElETD9meWfrPjYWenpE2THQIgOJdJTXe9SxSEs9Dyo5k+R4CRAyOWKDVcLjjRaLlnXtE="}]},"maintainers":[{"name":"raycharius","email":"raydeast@gmail.com"}],"_npmUser":{"name":"raycharius","email":"raydeast@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/slack-block-builder_1.5.0_1594584724112_0.8406051421952025"},"_hasShrinkwrap":false},"1.6.0":{"name":"slack-block-builder","version":"1.6.0","description":"Maintainable code for interactive Slack messages, modals and home tabs. A must-have for the Slack Block Kit framework.","author":{"name":"Ray East","url":"https://github.com/raycharius"},"repository":{"type":"git","url":"git+https://github.com/raycharius/slack-block-builder.git"},"homepage":"https://blockbuilder.dev","bugs":{"url":"https://github.com/raycharius/slack-block-builder/issues"},"main":"./src/index.js","license":"MIT","keywords":["slack","interactive-messages","block-actions","bot","slack-bot","modal","block","kit","swiftui","bot","modal","messages","message-builder","block-builder","slack-block-builder","block-kit","blocks","botkit","bolt","slack-bolt"],"scripts":{"test":"jest","lint-fix":"eslint 'src/**/*.js' --fix","lint-check":"eslint 'src/**/*.js'"},"devDependencies":{"eslint":"^6.8.0","eslint-config-airbnb-base":"^14.1.0","eslint-plugin-import":"^2.20.2","prettier-eslint-cli":"^5.0.0","jest":"^26.0.1"},"gitHead":"a1a2ee8b9a957bcf74d5359699a58bcb8011c83c","_id":"slack-block-builder@1.6.0","_nodeVersion":"14.1.0","_npmVersion":"6.14.4","dist":{"integrity":"sha512-7zkMLzmlreU7BInxooZXyMgCjvlt/0NfqYcV3Ix7bx5J1BtNWm9yHyCqzMTWAFQO7pyuI34aCLFQylHQDp56ww==","shasum":"9f05200c45883251295bc7c72a716485751076ee","tarball":"https://registry.npmjs.org/slack-block-builder/-/slack-block-builder-1.6.0.tgz","fileCount":83,"unpackedSize":161739,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfInyuCRA9TVsSAnZWagAAlDEP/1rePqbviBILIc2piyLX\n9SGmZ0vfnYRLmdhl+jheh2lUnN4nndeOdyfs9da4JNoy8ZDmGn5in4wPjPSZ\nYRqqNyikEjGZLkp0hW5JawV2F/nhBSPChB1vBAQKG2dh1ljNicrEgb7aVGTZ\nyab8ZA7aR7oPV3K2kjWAeIX4AfM0OWimePT0aj4SX5KoKSf72bykxzuyDuln\nnWMvwCouOqCX95+ISfQNHRl1Liha0cf3WFj467QP6/VGSGqHMRSiz4c5blg5\nCKlkr4oi7RnRRbOyOo2XmsdDD3M2D9Ovsuof2DVAmwuCunhaEG6DyC4RlTNv\nOPOHQrc+ghHmbUYx+ULVD709r5OfLZkO1lX0hcxi287OQrrZXgouIVifzpkT\nweqGM+DmfeUIaqZLPkIWI0MUBZl7OJg2vCJi41A+SDyQMb/IbeOKvKmxEPD1\n9YSOxIypZNS5tD/zm/aLFSUi8Noz3el4a5t2y6K9LJZTWe6nAZ1niCN0Dpu2\nRviC4u21mppSLWqOuu1RKe5MrrffBKlzfyQ1p/r4ad3Io2iB0pRkZ+hlJUu9\nZINMxu2FvDZOlKF8M8BiTv+PAReQDp83/9Lg5qX5BjtiXFo0z1esf3dQJvtd\ni0f+Kqpm5pVh/W6EEu3HEE7S6k5JTUIabQD3ngvwLBRcWI8QEsUbMDKRJrWC\n3x7L\r\n=koWy\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFUjyZ5IE+bppuxIDPn5KOOSig80JGgvb4QYmGQhYaToAiAHJnV/yDOWXrZrD1Ww8VXcELEiVga8g5Tpc1kNSHcD8g=="}]},"maintainers":[{"name":"raycharius","email":"raydeast@gmail.com"}],"_npmUser":{"name":"raycharius","email":"raydeast@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/slack-block-builder_1.6.0_1596095662403_0.49531414844565136"},"_hasShrinkwrap":false},"1.6.1":{"name":"slack-block-builder","version":"1.6.1","description":"Maintainable code for interactive Slack messages, modals and home tabs. A must-have for the Slack Block Kit framework.","author":{"name":"Ray East","url":"https://github.com/raycharius"},"repository":{"type":"git","url":"git+https://github.com/raycharius/slack-block-builder.git"},"homepage":"https://blockbuilder.dev","bugs":{"url":"https://github.com/raycharius/slack-block-builder/issues"},"main":"./src/index.js","license":"MIT","keywords":["slack","interactive-messages","block-actions","bot","slack-bot","modal","block","kit","swiftui","bot","modal","messages","message-builder","block-builder","slack-block-builder","block-kit","blocks","botkit","bolt","slack-bolt"],"scripts":{"test":"jest","lint-fix":"eslint 'src/**/*.js' --fix","lint-check":"eslint 'src/**/*.js'"},"devDependencies":{"eslint":"^6.8.0","eslint-config-airbnb-base":"^14.1.0","eslint-plugin-import":"^2.20.2","prettier-eslint-cli":"^5.0.0","jest":"^26.0.1"},"gitHead":"c0043b50c1563771056e6643c916e93bcd7e489b","_id":"slack-block-builder@1.6.1","_nodeVersion":"14.1.0","_npmVersion":"6.14.4","dist":{"integrity":"sha512-P1HLsk6EK3UbQCIbNmQCK485wKVqA4F3M5uMFOTcPbmUZ42ib4ITxHpXj10HaO9bCPKVp412rKXGIgmzop1nSA==","shasum":"eb87125db5231c52a3757e2e51f24da2f79aa3e7","tarball":"https://registry.npmjs.org/slack-block-builder/-/slack-block-builder-1.6.1.tgz","fileCount":83,"unpackedSize":161870,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfhf4/CRA9TVsSAnZWagAA5LwP/j/IEPqecMsf3i8MLCQR\nnR0gbdzYaoHcnot8aIHPru5GhHSfbPOAxsokbwkeJfos01HJRiWaiTwxp0ak\nmpCIMms1ivkoh75rjaFk3ZK1XU+Sm/u5fyqmAvHLohkH7wYqAAr7DAM/jGWn\nnTvyXAFMs495t4OqoeZF+kKVSi1flsMu2VzxUvP+Mgf9+elM1Uu32jlEyWAa\nKOnfgDBjIeVhojfuCorkhIpsMndm/YaADSQwGwj6h6IwffG8o67EU6I+kLWU\n2pN8LgLOYcMXBdobt9tbSAZpSrF6TCsiGMFOYJmuplAPp1auwAjzdO6h/AVk\n+BSTg1yR4mE+oqMzk7EsyhztC82DZ5TeHTh1QrYtSkF+5lV6hMhDtCl55ahg\noODN2tpleoZzAD5RySWPulivspj8f1UBdLYA75dUV/PtYGrdqGG6HUQ/E0V9\nEjZB5XYxKvYSQdNJ7SAI3Yea5u7jQ0W0IV6FXbKjFNzbO5rgdlJon4IBbPmk\ne9q1EtbVG5xTulO58teDX7dtRC/O+TjXV9Yy6syFcyL4oun6YV5wc6skWyHu\nJ/58n0nimZeSqem9ZGx9dAsnRwKMctcmJkqEixPgtyPiOsXSOwu68pPkwkk6\npJnuo0WAXFEohLLMZbWO/9O5pnqhoDi7kcBudvcaePKJBpiYYmfpPqM39lvt\n6xrD\r\n=1X98\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQColx0yctbfIJP7vcXhd+Ayhuw7SiUydTsg4jC6RaYjSQIgE0mUCdC1TapfNnzbbd0XFZzoQPqnX9bnYV+ekWk9dLE="}]},"maintainers":[{"name":"bravecow","email":"neporozhniy@gmail.com"},{"name":"raycharius","email":"raydeast@gmail.com"}],"_npmUser":{"name":"raycharius","email":"raydeast@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/slack-block-builder_1.6.1_1602616894583_0.6071078873508176"},"_hasShrinkwrap":false},"1.7.0":{"name":"slack-block-builder","version":"1.7.0","description":"Maintainable code for interactive Slack messages, modals and home tabs. A must-have for the Slack Block Kit framework.","author":{"name":"Ray East","url":"https://github.com/raycharius"},"repository":{"type":"git","url":"git+https://github.com/raycharius/slack-block-builder.git"},"homepage":"https://blockbuilder.dev","bugs":{"url":"https://github.com/raycharius/slack-block-builder/issues"},"main":"./src/index.js","types":"./src/types.d.ts","license":"MIT","keywords":["slack","interactive-messages","block-actions","bot","slack-bot","modal","block","kit","swiftui","bot","modal","messages","message-builder","block-builder","slack-block-builder","block-kit","blocks","botkit","bolt","slack-bolt"],"scripts":{"test":"jest","lint-fix":"eslint 'src/**/*.js' --fix","lint-check":"eslint 'src/**/*.js'"},"devDependencies":{"eslint":"^6.8.0","eslint-config-airbnb-base":"^14.1.0","eslint-plugin-import":"^2.20.2","prettier-eslint-cli":"^5.0.0","jest":"^26.0.1"},"gitHead":"0a102ba672a6953f3693c2deb299b1b2151aa6c6","_id":"slack-block-builder@1.7.0","_nodeVersion":"14.1.0","_npmVersion":"6.14.4","dist":{"integrity":"sha512-M3LATGIj2eLl1H/vpnPmfAAo5fso/SIfzJ+8qeqVAVEzBygyWrjXqU7lu/5DjTFqGWC6n5KFH0H0sUTncrpO3w==","shasum":"f30c0d03b1ec9b50db4c54e4bf71bea3d75632cf","tarball":"https://registry.npmjs.org/slack-block-builder/-/slack-block-builder-1.7.0.tgz","fileCount":86,"unpackedSize":182894,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfi0y9CRA9TVsSAnZWagAAQWkP/16Zah3Hhmver0daqFkB\nMdHQOd742kTDFYT1PR45fiovbp4Rnnhp/+K4Pyi9JEkESgAWY9vKISckuAD/\nRHsctBrpeKbQZuyknyTRjAS2CuuF9CVPcIQ3igktiEuMc+2MA96u4Bp3q5Vm\nHm4KicjGRy0DsRHUXMh1D1cYUo5ajCu54FhA5xoFNxnjdxZdPIjiC0y0o/QS\nfkmG6Ff7TUzN8vQI7avQwZI6HY5NwECxMwVD93E5UDsg+UoYTO887rh/kSrD\nUHQHY5tvQmSzwe8ExfUrWJxLxXg66JeWr71eMEzaE0Ox0/Aygcaa11Puikbr\nIYsz1Q8dKPJj1+/GjYyOAbpZZulg6rTdliPVYBNA8ttA6LxQCfiN+YDwqomD\nCavnS8G+8FpesieQ1foK2gKyyp4se4430nJi7jnFRLxo1K31bjMGMnD6uzLN\nFrjCCdDI5asE262tTWH5K4/6jWcvp++XEOG0xF7c3zn6awk/QS1thTzorC7u\ngTRC4XaX5fts3JaS1JMbCcjS1+qFZj0/Iim/8jP1r5ofsiaOjwtkgJ0se73j\nfa1/KbfrWwXwTz1CJ6nh9a4Ap6YZwcqhHtNKAe44ejnObhtIFHztsER2nWkj\nTSxvtGVl4zKXCvI15Mb3YUZ/cTIhwHREwPeetJTOotTSlD8lcfO/arj4tysl\naOvn\r\n=aFhb\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGwA/xgrwMXtEhMKg828hWSmrTJgPDpPLGhQRJ76by81AiBcqlXJY+ZweZtA82dLkn9oFkX6XQHRtva32rKdN9bSAA=="}]},"maintainers":[{"name":"bravecow","email":"neporozhniy@gmail.com"},{"name":"raycharius","email":"raydeast@gmail.com"}],"_npmUser":{"name":"raycharius","email":"raydeast@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/slack-block-builder_1.7.0_1602964669320_0.018175817212214396"},"_hasShrinkwrap":false},"1.7.1":{"name":"slack-block-builder","version":"1.7.1","description":"Maintainable code for interactive Slack messages, modals and home tabs. A must-have for the Slack Block Kit framework.","author":{"name":"Ray East","url":"https://github.com/raycharius"},"repository":{"type":"git","url":"git+https://github.com/raycharius/slack-block-builder.git"},"homepage":"https://blockbuilder.dev","bugs":{"url":"https://github.com/raycharius/slack-block-builder/issues"},"main":"./src/index.js","types":"./src/types.d.ts","license":"MIT","keywords":["slack","interactive-messages","block-actions","bot","slack-bot","modal","block","kit","swiftui","bot","modal","messages","message-builder","block-builder","slack-block-builder","block-kit","blocks","botkit","bolt","slack-bolt"],"scripts":{"test":"jest","lint-fix":"eslint 'src/**/*.js' --fix","lint-check":"eslint 'src/**/*.js'"},"devDependencies":{"eslint":"^6.8.0","eslint-config-airbnb-base":"^14.1.0","eslint-plugin-import":"^2.20.2","prettier-eslint-cli":"^5.0.0","jest":"^26.0.1"},"gitHead":"615aba7ff9d1d5936f28549a50d523f85435473d","_id":"slack-block-builder@1.7.1","_nodeVersion":"14.1.0","_npmVersion":"6.14.4","dist":{"integrity":"sha512-DEhHBpKpoPYUS4vG4hHoz6pTAC/QJ5yTF0QwU1FMn/F+fQavjGdsKpqZ5Pg0oTa8CYkDiOwNZOgt6LkfE84VSg==","shasum":"68a1258040929e55a3effb3d78883c7c26908a85","tarball":"https://registry.npmjs.org/slack-block-builder/-/slack-block-builder-1.7.1.tgz","fileCount":86,"unpackedSize":183407,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfi1EbCRA9TVsSAnZWagAA9T8P/1nJnYvJGEr9fuFprGcP\npiaRHYOmy5L3K5zV+zpatn7OWfuqDqtPDuvnNRPIUfBFoN0MQfh+ocba/vbi\nXHhCwh4D4OAWuos1EzwiKWkIiWhOxb6pUY1c23nBBu45oqsXdKXJ76k1XuKZ\nMd73YeQDaIAPYWNAu6z8PzgSQMif87N6kYOv3XjcAyOlnKR8n0Q0Jfj7nr/3\n4QRRqhlfCNVc/9KIit/jP/AnZ7hgee6l8DMrjo8etchcIKsEYYImpgpJ/N7I\nUakwxmT6whT9uRHho1tmHwKL1lyOX+NK9Yr6ZkFF88E2wh/I3X++efWElTVn\n0B9Mgmw4oVYrFUv5gWnNCZqNO1xRzl4mZ7k5DPYJWJFq57k8n4AFAjWTBZC8\nYE8g+cZnFc1Cz4ANx+lVTx+uEYEU7POirsLlJPezNhwwWSo0vjEHmmzCb0dd\n5YdVBywSG2UUJPx2I1scQ6uns+q/kuGEDDacpDiod2UvjCgZfjq9OlqSIoDu\niRnswTv5ed1co2b9oipPWfDjxLx3Ggs53y/bodaarKodXoKZFz6PIdUzJezN\npmvCB8/NWnN4hdFNhcLmzHYmE2EXSCQ/7NQ1/WfmSGqJzWy8CA/uOUan0Jix\nXgVXiamXhRd7mlgPsPN4o5j6IQP2Un3FjPJ9Mz+LuDo/ycA98obOxtmPfplm\nKMEQ\r\n=J79E\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDGuQAw3LPyeH7yvaDYuM7IxxjX/y4S8ZyiOXK/bn+4GgIhAMeQvhJpq/JNwL1IQFgRFXCZNELwq0aLqQoURm1Tn/tl"}]},"maintainers":[{"name":"bravecow","email":"neporozhniy@gmail.com"},{"name":"raycharius","email":"raydeast@gmail.com"}],"_npmUser":{"name":"raycharius","email":"raydeast@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/slack-block-builder_1.7.1_1602965786577_0.8737792893035496"},"_hasShrinkwrap":false},"1.7.2":{"name":"slack-block-builder","version":"1.7.2","description":"Maintainable code for interactive Slack messages, modals and home tabs. A must-have for the Slack Block Kit framework.","author":{"name":"Ray East","url":"https://github.com/raycharius"},"repository":{"type":"git","url":"git+https://github.com/raycharius/slack-block-builder.git"},"homepage":"https://blockbuilder.dev","bugs":{"url":"https://github.com/raycharius/slack-block-builder/issues"},"main":"./src/index.js","types":"./src/types.d.ts","license":"MIT","keywords":["slack","interactive-messages","block-actions","bot","slack-bot","modal","block","kit","swiftui","bot","modal","messages","message-builder","block-builder","slack-block-builder","block-kit","blocks","botkit","bolt","slack-bolt"],"scripts":{"test":"jest","lint-fix":"eslint 'src/**/*.js' --fix","lint-check":"eslint 'src/**/*.js'"},"devDependencies":{"eslint":"^6.8.0","eslint-config-airbnb-base":"^14.1.0","eslint-plugin-import":"^2.20.2","prettier-eslint-cli":"^5.0.0","jest":"^26.0.1"},"gitHead":"52f1fa18b8cf9e9bb81524a4737d5e902e14c53c","_id":"slack-block-builder@1.7.2","_nodeVersion":"14.1.0","_npmVersion":"6.14.4","dist":{"integrity":"sha512-xiRfEQEjP/V2D5824/pPwbJXy4BpQWotK2mkieHD0St7KEGeDihIzyAlS68wMnJ5qzRZhtfoWi14OqTkYsiJ9A==","shasum":"e9c42bcd4455ea2a2a6c4917ea8b23d5259ddc8b","tarball":"https://registry.npmjs.org/slack-block-builder/-/slack-block-builder-1.7.2.tgz","fileCount":86,"unpackedSize":183567,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfqHeXCRA9TVsSAnZWagAAtXcP/1hJ7Olpa/V8q6RPAblf\nI3ndysXt6yVdgMDCSLcwt1PquW1Yx1evDSp5u/TxzbwT908ysqBZQRTWpiBv\nrFshXrLwc64d323E+ijNe7mS9M/rkpvIHBxKH8VND/XSQKzLn1t9w24m5o1a\nqSo4nwAS6fxWnofaBK77ja7+MacgkpLdmqqzVnta6i6DWIOV1F2O2TYkDleW\nxugjyvGIHGUf29+9TR1cB4g0EWmw9UYJu04GcCtZQU2/V2zZBssakUoENd5q\nDUzet8TaBTAPQFbbUISGTx+ii2CAvU7gkVecs2gogubMfdaJlT7UIh0NMQS4\n0CjU2CrVcTjdtvOf7y7Nso9PfKnQkF8CrfaKUYyBGJfNNGAKokAAvCwC2Ugg\nupUweVUPZ52tYKH505i2DaRO06tedUPXiR6NfphMoVdrXNSt/rw/leubNKe5\n9jf+HqeZeDaCGWjic+DxbfY0XszjaInKf+mdIUD4GOKFxTniPmQSsPvcfAY6\n3F/czwEkjCzh3ofrCp8VmSAB/ADCvKrsB+KGrReXACb75v3+0V1jX/+9XCtf\n/6ddDCjaNlDPes7AvNV47ntfqz+2uE+MDRuEe7qH5U1qK14M0IS4MHh/dyMZ\nSsy5lbXdIFC1alNshXVO0WVaK9ROqCQCo8aSez03LXnZYKJgQKBsovOgJqAK\n9SoK\r\n=6usO\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGsJ65mppx8Zt3Kq/C6LuW9sWdV/QPPfuKKAIVdDMMqLAiBOg2X/fd3xtgMSkV1KV0ZXzFjr0EoWFva98k2aILJgjA=="}]},"_npmUser":{"name":"raycharius","email":"raydeast@gmail.com"},"directories":{},"maintainers":[{"name":"bravecow","email":"neporozhniy@gmail.com"},{"name":"raycharius","email":"raydeast@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/slack-block-builder_1.7.2_1604876182794_0.14521863637540666"},"_hasShrinkwrap":false},"1.8.0":{"name":"slack-block-builder","version":"1.8.0","description":"Maintainable code for interactive Slack messages, modals and home tabs. A must-have for the Slack Block Kit framework.","author":{"name":"Ray East","url":"https://github.com/raycharius"},"repository":{"type":"git","url":"git+https://github.com/raycharius/slack-block-builder.git"},"homepage":"https://blockbuilder.dev","bugs":{"url":"https://github.com/raycharius/slack-block-builder/issues"},"main":"./src/index.js","types":"./src/types.d.ts","license":"MIT","keywords":["slack","interactive-messages","block-actions","bot","slack-bot","modal","block","kit","swiftui","bot","modal","messages","message-builder","block-builder","slack-block-builder","block-kit","blocks","botkit","bolt","slack-bolt"],"scripts":{"test":"jest","lint-fix":"eslint 'src/**/*.js' --fix","lint-check":"eslint 'src/**/*.js'"},"devDependencies":{"eslint":"^6.8.0","eslint-config-airbnb-base":"^14.1.0","eslint-plugin-import":"^2.20.2","prettier-eslint-cli":"^5.0.0","jest":"^26.0.1"},"gitHead":"c9a44125c3a3292bc08ec7c676076fe92c1dfb4f","_id":"slack-block-builder@1.8.0","_nodeVersion":"14.1.0","_npmVersion":"6.14.4","dist":{"integrity":"sha512-kpEAYRNilCKN7mwraliYpQNoExZE6op3vrUZYcxUE1G80YyGUxOsWeIPJqLthzzonYkz0I0rpQ7EC4JO7Rk58g==","shasum":"699017bb2830cf53533a8b30b4845f7199b0dbf7","tarball":"https://registry.npmjs.org/slack-block-builder/-/slack-block-builder-1.8.0.tgz","fileCount":86,"unpackedSize":184272,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfvaH+CRA9TVsSAnZWagAAqqgP/jBHtzBP3vYuLXkeLWIx\nY/vMk3iKk7cv88tmdzZ+dviDEi+AjIi6tWi7Mh0rNRUsLEvrx2S5mHchhIF8\npJdWkj+Gf6aA9409WyK5LE6vrv1q5h1MhC6c4B4MI8LmiJHVxlvsAOXiG6mF\nBwqGVAweqDDcbTudW7KnQIOaNab/WqHPVAHiOrEQEjkOvbSGg8GYHq8HFxzo\nY313Xv4ROIIibV+0tbxyw7PekNDi86GXeBgMuD+kFg5CQ/rd1IEjKkSIVBhz\nb2mnmM4xQwdBl7aalC7MGOHaVVXPXuw6PGqd3mdOw7I655QiD+/x2z67226t\nnjNOVcLX8E0FyBqE8wcWBwyFeb91uMHQZFYlzOb2EyXVNflFgzVSHGJSs3Nh\nYI5ICVlx/fgTV8Hr9fNZsZnHSMqgBRZZYfHotBmMWoHZ0wwENQXiPooxQ/8m\nJLGw8pH9mMRKZitHZNbWV3nIynrDm++yH5QWXpSMSEcHMHXWDIQkXGMgbTI6\nsKwoAQ5hTtb6I8lNQ7x57GyoEgBedb1s4segDuPPAoW84czjsRG/9p3b3+qE\nsgIW2p0ie7Q8laCriC4zDZa1Y2ZUrFKDkcEpL7A+beCgIo3tbPbkJ6JtyBmK\nIrIIzMAapuwyu0qdWBH3UKT7dNDdDL/E0TCod1aj91VMdz3uwc/QHlNHR6Pi\nOUYe\r\n=7Yio\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGdLFfzo+idBABfq1gcywuTTfVdSoRoBfx5FUtGqhMHbAiEAqrlKxFzMCON+dLsFdhjyPuYPkYSE5uXly/9lzM8AuRo="}]},"_npmUser":{"name":"raycharius","email":"raydeast@gmail.com"},"directories":{},"maintainers":[{"name":"bravecow","email":"neporozhniy@gmail.com"},{"name":"raycharius","email":"raydeast@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/slack-block-builder_1.8.0_1606263293839_0.5571285364559453"},"_hasShrinkwrap":false},"1.9.0":{"name":"slack-block-builder","version":"1.9.0","description":"Maintainable code for interactive Slack messages, modals and home tabs. A must-have for the Slack Block Kit framework.","author":{"name":"Ray East","url":"https://github.com/raycharius"},"repository":{"type":"git","url":"git+https://github.com/raycharius/slack-block-builder.git"},"homepage":"https://blockbuilder.dev","bugs":{"url":"https://github.com/raycharius/slack-block-builder/issues"},"main":"./src/index.js","types":"./src/types.d.ts","license":"MIT","keywords":["slack","interactive-messages","block-actions","bot","slack-bot","modal","block","kit","swiftui","bot","modal","messages","message-builder","block-builder","slack-block-builder","block-kit","blocks","botkit","bolt","slack-bolt"],"scripts":{"test":"jest","lint-fix":"eslint 'src/**/*.js' --fix","lint-check":"eslint 'src/**/*.js'"},"devDependencies":{"eslint":"^6.8.0","eslint-config-airbnb-base":"^14.1.0","eslint-plugin-import":"^2.20.2","prettier-eslint-cli":"^5.0.0","jest":"^26.0.1"},"gitHead":"d6ff7f0503eb5b7b8ff57c00d266b6c2416cd4d3","_id":"slack-block-builder@1.9.0","_nodeVersion":"14.1.0","_npmVersion":"6.14.4","dist":{"integrity":"sha512-B5XERXmeXqeT3XG2PKqVuDM4K/zXEa8dOMznJa1yewfLbSSZ9A2/Y1IC3g7igvuWRDbcJKy0tdOTPH/iFGWfXg==","shasum":"d5491e1564d3583b93b20eaa02938d8e37baf14c","tarball":"https://registry.npmjs.org/slack-block-builder/-/slack-block-builder-1.9.0.tgz","fileCount":86,"unpackedSize":184928,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfvwSWCRA9TVsSAnZWagAAdBYQAJISTXbWbqAS8/VaF5bj\nG2d/gcsy7FK+aVa6UWJr+flaNXwETK/YEd2KwXE/owBapDhJGLa6UpDgS2vt\n8EM33Cl3l/R6v9sjXOwfQMt0Bf3fAVdN0tQ56zPAOTLZbBgqakP7EpALxevi\npibgcoUppuPdofY1OsGtOKWQhUhfPXcjTeonogv4UvKDoj+Ykb3JPiepYEdR\naXJyWwlf8l41fNwVOGf+rwINBlhw2kRf+mdZv6fKAQP1EwJhfrbf9umPig4x\nof//HbHg6mpcxrgO/UOwXMJz91HNQE1s/cVsCzaLR/ZOJyplPXW/k88R3yxB\nTLn4FDbIWlLRpbJm/I5zxaYaU1Str6X7HXoE/B3nN9gKGHd1b5NPQEIiCB5+\nDCnsFvAXd84o2CqjQbciM8MsJuFtkFtKXx2MEoLzz1ACLH1EqhaL0lp8itDe\nH6wd52ridsoE6Fm7NKrYPejZ2ptqY67lz1dS3oG8WVpg5rPnlJq7N0v4CKiN\nwac4bkpkQc04n/TEISQGFC8O77eo5iW/zwEfCfthtBbBocDXpxtVpnbBGwvC\nb8l/FHQiEDICxtt2+8QSYIs0bVH2dTZ6FvNs6gacf5HkJGMFm4fKYrN6XnZ3\nG8wR/IKodKLyRVAxrNL7tQHhUL5i4X87rq97m2FslMsWIuTNndS2LcfiBwfP\nyYxv\r\n=22dK\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAWiwd4seJGaZHQYGNLjc1JswlSFCpbAmLNZn6kngx94AiEAiLiyPOwTB42KejIKxQWmxjHb9JmdNfCEpDVt/hN+hvA="}]},"_npmUser":{"name":"raycharius","email":"raydeast@gmail.com"},"directories":{},"maintainers":[{"name":"bravecow","email":"neporozhniy@gmail.com"},{"name":"raycharius","email":"raydeast@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/slack-block-builder_1.9.0_1606354070133_0.08791669298626736"},"_hasShrinkwrap":false},"1.10.0":{"name":"slack-block-builder","version":"1.10.0","description":"Maintainable code for interactive Slack messages, modals and home tabs. A must-have for the Slack Block Kit framework.","author":{"name":"Ray East","url":"https://github.com/raycharius"},"repository":{"type":"git","url":"git+https://github.com/raycharius/slack-block-builder.git"},"homepage":"https://blockbuilder.dev","bugs":{"url":"https://github.com/raycharius/slack-block-builder/issues"},"main":"./src/index.js","types":"./src/types.d.ts","license":"MIT","keywords":["slack","interactive-messages","block-actions","bot","slack-bot","modal","block","kit","swiftui","bot","modal","messages","message-builder","block-builder","slack-block-builder","block-kit","blocks","botkit","bolt","slack-bolt"],"scripts":{"test":"jest","lint-fix":"eslint 'src/**/*.js' --fix","lint-check":"eslint 'src/**/*.js'"},"devDependencies":{"eslint":"^6.8.0","eslint-config-airbnb-base":"^14.1.0","eslint-plugin-import":"^2.20.2","prettier-eslint-cli":"^5.0.0","jest":"^26.0.1"},"gitHead":"c95155ebd51e7779d80dc653f7d2a6335792bc05","_id":"slack-block-builder@1.10.0","_nodeVersion":"14.1.0","_npmVersion":"6.14.4","dist":{"integrity":"sha512-KPtibIq4MIGS7BfSYdyyzNIOMYktEbofi/fr6VUrGWBxD4W/bah7qbsy40o+J9T71k+FjmyMBO01ly9r6MNc1g==","shasum":"06d50ef6f109d3105131ba11010d5435747bd33d","tarball":"https://registry.npmjs.org/slack-block-builder/-/slack-block-builder-1.10.0.tgz","fileCount":87,"unpackedSize":189045,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgX7RNCRA9TVsSAnZWagAAGXcP/iWNcy/HXs/KW0DAY1Qz\njEM5JwTuoFGggzNnRPDE2W5WwNhF0q6UusR9uUhD7DKUIVJEUL7jAPBo064y\n+amQS2fO/lBSq7lDrH/eNLA8wnCiNZd76MbsiwJw44+HTeEj/5OU2fnCkNhU\nLxXQGacj2qZkIupgaPzDICTvKtbuoZFO3W4hqFXXJ4tDHsSYKJk8uKNpk+TM\nvFXouDzpH9WfhIA9lIujtnnY9CKOFOyyz1DFetdxTWWlJW3zqCWZ40/ZMYmz\nCFvY/ubzTqYKs87N8vo4a0iZoHzJ8gQqAu47p5jXtQpOnu+pMWpsRHZ5mHC9\nXe6bFe/QhSfX4EXg2FupVsNpcql39xp3rbnknYtU8qwA7DobpSJLa5kKd0Jr\n1CBennyW4RztjstXW+00zsIwx9UVb288eNi1wLc8cw/Eu4mq+v1h+c7+3G7q\nWNVMLlKqpWe3nM8Z5xop1AK3yD8sNwHg0LdFv9Hzlxmf5TA+MOhwCmom0b41\n0XUClGJhMrPL8CE5vJFW2rpIDqfyPSz1toPICSTGB7QovJJYe09Ui12I2elF\nKp7Sr+F2vZYaokr2IhcaQkYOR5e/Sme67eTnBO4B53AWInWw6nFMcw8J0XUZ\n7cMJb3WfNIxxeCC6GcrujyUlL+jN1on41bRvGrg/kS8uHsMEIPoBMsjcye6p\n/lq6\r\n=mcDu\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBtWAVFlWCkwbPC41VAt3759Mbd5eYYfL7CNP6drE4VRAiEA7tBE8+BFZYx+ka9bpFjngrl6LrQp1Taua1sGgLgH/4o="}]},"_npmUser":{"name":"raycharius","email":"raydeast@gmail.com"},"directories":{},"maintainers":[{"name":"bravecow","email":"neporozhniy@gmail.com"},{"name":"raycharius","email":"raydeast@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/slack-block-builder_1.10.0_1616884812795_0.22908823374173481"},"_hasShrinkwrap":false},"2.0.0-beta.0":{"name":"slack-block-builder","version":"2.0.0-beta.0","description":"Maintainable code for interactive Slack messages, modals, home tabs, and workflow steps. A must-have for the Slack Block Kit framework.","author":{"name":"Ray East","url":"https://github.com/raycharius"},"repository":{"type":"git","url":"git+https://github.com/raycharius/slack-block-builder.git"},"homepage":"https://blockbuilder.dev","bugs":{"url":"https://github.com/raycharius/slack-block-builder/issues"},"main":"./dist/index.js","types":"./dist/index.d.ts","license":"MIT","keywords":["slack","interactive-messages","block-actions","bot","slack-bot","modal","block","kit","swiftui","bot","modal","messages","message-builder","block-builder","slack-block-builder","block-kit","blocks","botkit","bolt","slack-bolt"],"scripts":{"src:build":"tsc -p ./tsconfig.json","src:lint":"eslint 'src/**/*.ts' --fix","docs:build":"tsc -p ./tsconfig.docs.json","docs:lint":"eslint 'docs-generator/**/*.ts' --fix","predocs:generate":"npm run docs:build","docs:generate":"node docs-generator-dist/index.js","docs:local":"docsify serve docs-generator --port 3000","tests:lint":"eslint 'tests/**/*.ts' --fix","tests:coverage":"codecov","clean":"shx rm -rf ./dist ./coverage ./docs-generator-dist","test":"jest --coverage","build":"npm run src:build","lint":"eslint 'src/**/*.ts' 'tests/**/*.ts' 'docs-generator/**/*.ts'","lint:fix":"eslint 'src/**/*.ts' 'tests/**/*.ts' 'docs-generator/**/*.ts' --fix","madge":"npx madge --circular --warning --extensions ts ./"},"devDependencies":{"@types/jest":"^26.0.22","@typescript-eslint/eslint-plugin":"^4.20.0","@typescript-eslint/parser":"^4.20.0","codecov":"^3.8.1","docsify-cli":"^4.4.3","docsify-server-renderer":"^4.12.1","docsify-tabs":"^1.4.4","eslint":"^6.8.0","eslint-config-airbnb-base":"^14.1.0","eslint-config-airbnb-typescript":"^12.3.1","eslint-plugin-import":"^2.22.1","eslint-plugin-jsx-a11y":"^6.4.1","eslint-plugin-react":"^7.23.1","eslint-plugin-react-hooks":"^4.2.0","jest":"^26.6.3","jest-environment-jsdom":"^26.6.2","madge":"^4.0.2","mustache":"^4.2.0","prettier-eslint-cli":"^5.0.0","shx":"^0.3.3","ts-jest":"^26.5.4","ts-node":"^8.10.2","typescript":"^4.2.3"},"readme":"<p align=\"center\">\n    <img src=\"https://raw.githubusercontent.com/raycharius/slack-block-builder/master/resources/images/main/logo-horizontal.png\" alt=\"Logo\" width=\"600px\">\n</p>\n\n<p align=\"center\">\n    <h3 align=\"center\">Maintainable code for Slack interactive messages, modals, and home tabs.</h3>\n</p>\n\n<p align=\"center\">\n    Lightweight, zero-dependency library for declaratively building Slack Block Kit UI.\n    <br />\n    <br />\n    <a href=\"https://blockbuilder.dev\" target=\"_blank\"><strong>View the Docs »</strong></a>\n    <br />\n    <br />\n    <a href=\"#space_invader--usage\">Quick Start Guide</a>\n    ·\n    <a href=\"https://github.com/raycharius/slack-block-builder/issues\">Request Feature</a>\n    ·\n    <a href=\"https://github.com/raycharius/slack-block-builder/issues\">Report Bug</a>\n  </p>\n</p>\n\n![An example of using Block Builder](resources/images/main/hero-image.png)\n\n***\n\n[![npm](https://img.shields.io/npm/v/slack-block-builder?color=bright-green)](https://www.npmjs.com/package/slack-block-builder)\n![NPM](https://img.shields.io/npm/l/slack-block-builder?color=bright-green)\n[![codecov](https://codecov.io/gh/raycharius/slack-block-builder/branch/master/graph/badge.svg)](https://codecov.io/gh/raycharius/slack-block-builder)\n\n**Block Builder** helps you keep your Slack app code for UI maintainable, testable, and reusable. It has a declarative, chainable syntax inspired by [SwiftUI](https://developer.apple.com/documentation/swiftui) and is built for better UI architecture.\n\n### :zap: &nbsp; Features\n\n* Declarative [SwiftUI](https://developer.apple.com/xcode/swiftui/) inspired syntax.\n* The ability to build more complex flows using loops and conditionals.\n* A `printPreviewURL()` method that outputs a link to preview your UI on Slack's [Block Kit Builder website](https://app.slack.com/block-kit-builder) for easier prototyping.\n* In-depth [doc site](https://blockbuilder.dev) at [https://blockbuilder.dev](https://blockbuilder.dev).\n* [Support](#block-kit-support-and-reference) for all current Slack Block Kit objects.\n* A great TypeScript experience.\n* Extensive JSDoc hints with explanations, validation rules, and quick links to full documentation.\n* Zero dependencies.\n\n### :rocket: &nbsp; Coming Soon\n\n* `Paginator` component.\n* `Accordion` component.\n\n### :gift: &nbsp; Benefits\n\n* Write three times less code.\n* Build more sophistocated, elegant flows.\n* Design better UI architecture for your Slack apps.\n* Focus more on code in your IDE than on studying the [Slack API docs](https://api.slack.com/).\n* Easily integrate localizations into your app.\n\n### :phone: &nbsp; Let's Talk?\n\nFeedback – love it! Aside from GitHub Issues, there are Slack channels available in popular bot communities to discuss **Block Builder** – we'll see you there! :raised_hands:\n\n* **Slack Community** – [\\#block-builder](https://slackcommunity.com)\n* **Bot Developer Hangout** – [\\#block-builder](https://community.botkit.ai)\n\n### :floppy_disk: &nbsp; Installation \n\n#### Using NPM: \n\n``` bash\nnpm install --save slack-block-builder\n```\n\n#### Using Yarn: \n\n``` bash\nyarn add slack-block-builder\n```\n\n### :space_invader: &nbsp; Usage\n\nFor full documentation, make sure you head over to [https://blockbuilder.dev](https://blockbuilder.dev).\n\n\n### Importing\n\nThe functions for creating objects can be both imported directly or through an object that groups them by category.\n\n```javascript\n// Importing exposed groups of objects\n\nimport { Surfaces, Blocks, Elements, Bits, Utilities } from 'slack-block-builder';\n\n// Importing objects top-level\n\nimport { Modal, Section, Actions, Button } from 'slack-block-builder';\n```\n\n### Group Explanations\n\n`Surfaces` – Contains functions for creating modals, messages, home tabs, and workflow steps. \n\n`Blocks` – Layout blocks used to organize the UI.\n\n`Elements` – UI elements that are used to capture user interaction.\n\n`Bits` – These are composition objects and other bits and pieces from Slack's docs. Included are `Attachment`, `Options`, `OptionGroup`, and `ConfirmationDialog`. They felt like they were deserving of their own category.\n\n`Utilities` – A group of utility functions. See [Utility Functions](#utility-functions).\n\n### Block Kit Support and Reference\n\nBelow is a list of supported objects and how to access them in **Block Builder**:\n\n| **Name**             | **Type**           | **Support**                    | **Accessed Via**                      \n|----------------------|--------------------|--------------------------------|-----------------------------------------\n| Home Tab             | Surface            | :white_check_mark:             | `Surfaces.HomeTab()`                       \n| Message              | Surface            | :white_check_mark:             | `Surfaces.Message()`                       \n| Modal                | Surface            | :white_check_mark:             | `Surfaces.Modal()`                         \n| Workflow Step        | Surface            | :white_check_mark:             | `Surfaces.WorkflowStep()`                         \n| Actions              | Block              | :white_check_mark:             | `Blocks.Actions()`                \n| Context              | Block              | :white_check_mark:             | `Blocks.Context()`                \n| Divider              | Block              | :white_check_mark:             | `Blocks.Divider()`                \n| File                 | Block              | :white_check_mark:             | `Blocks.File()`\n| Header               | Block              | :white_check_mark:             | `Blocks.Header()`\n| Image                | Block              | :white_check_mark:             | `Blocks.Image()`                  \n| Input                | Block              | :white_check_mark:             | `Blocks.Input()`                  \n| Section              | Block              | :white_check_mark:             | `Blocks.Section()`                \n| Button               | Element            | :white_check_mark:️             | `Elements.Button()`               \n| Checkboxes           | Element            | :white_check_mark:             | `Elements.Checkboxes()`           \n| Date Picker          | Element            | :white_check_mark:             | `Elements.DatePicker()`\n| Time Picker          | Element            | :white_check_mark:             | `Elements.TimePicker()`           \n| Image                | Element            | :white_check_mark:             | `Elements.Img()`                  \n| Overflow Menu        | Element            | :white_check_mark:             | `Elements.OverflowMenu()`         \n| Radio Buttons        | Element            | :white_check_mark:             | `Elements.RadioButtons()`         \n| Plain-Text Input     | Element            | :white_check_mark:             | `Elements.TextInput()`            \n| Select Menus         | Element            | :white_check_mark:             | `Elements.[Type]Select()`          \n| Multi-Select Menus   | Element            | :white_check_mark:             | `Elements.[Type]MultiSelect()`     \n| Option               | Composition Object | :white_check_mark:             | `Bits.Option()`                   \n| Confirm Dialog       | Composition Object | :white_check_mark:             | `Bits.ConfirmationDialog()`       \n| Option Group         | Composition Object | :white_check_mark:             | `Bits.OptionGroup()`\n| Attachment           | Legacy Feature     | :white_check_mark:             | `Bits.Attachment()`              \n\n### Creating a Simple Interactive Message\n\nLet's take a look at how to compose an interactive message. Even though [Slack](https://slack.com) now has modals, these have always been the basis for [Slack](https://slack.com) apps.\n\nFunctions that return Block Kit objects have setter methods for all of the properties, but also support parameters that are passed into the constructor for properties with primitive types.\n\n```javascript\nimport { Message, Blocks, Elements } from 'slack-block-builder';\n\nconst myMessage = ({ channel, dangerLevel }) => {\n  return Message()\n    .channel(channel)\n    .text('Alas, my friend.')\n    .blocks(\n      Blocks.Section()\n        .text('One does not simply walk into Slack and click a button.'),\n      Blocks.Section()\n        .text('At least that\\'s what my friend Slackomir said :crossed_swords:'),\n      Blocks.Divider(),\n      Blocks.Actions()\n        .elements(\n          Elements.Button()\n            .text('Sure One Does')\n            .actionId('gotClicked')\n            .danger(dangerLevel > 42), // Optional argument, defaults to 'true'\n          Elements.Button()\n            .text('One Does Not')\n            .actionId('scaredyCat')\n            .primary()))\n    .asUser()\n    .buildToJSON();\n};\n```\n\nAnd now an example with using both the setter methods and passing parameters into the functions at initiation:\n\n```javascript\nimport { Message, Blocks, Elements } from 'slack-block-builder';\n\nconst myShorterMessage = ({ channel, dangerLevel }) => {\n  return Message({ channel, text: 'Alas, my friend.' })\n    .blocks(\n      Blocks.Section({ text: 'One does not simply walk into Slack and click a button.' }),\n      Blocks.Section({ text: 'At least that\\'s what my friend Slackomir said :crossed_swords:' }),\n      Blocks.Divider(),\n      Blocks.Actions()\n        .elements(\n          Elements.Button({ text: 'Sure One Does', actionId: 'gotClicked' })\n            .danger(dangerLevel > 42), // Optional argument, defaults to 'true'\n          Elements.Button({ text: 'One Does Not', actionId: 'scaredyCat' })\n            .primary()))\n    .asUser()\n    .buildToJSON();\n};\n```\n\nBoth of these examples render the message below. And the best part? It only took 15 lines of code, as opposed to the 44 lines of JSON generated as a result. \n\n![An example of using Block Builder for Messages](resources/images/main/simple-message-example.png)\n\n[**View Example on Slack Block Kit Builder Website**](https://app.slack.com/block-kit-builder#%7B%22blocks%22:%5B%7B%22type%22:%22section%22,%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22One%20does%20not%20simply%20walk%20into%20Slack%20and%20click%20a%20button.%22%7D%7D,%7B%22type%22:%22section%22,%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22At%20least%20that's%20what%20my%20friend%20Slackomir%20said%20:crossed_swords:%22%7D%7D,%7B%22type%22:%22divider%22%7D,%7B%22type%22:%22actions%22,%22elements%22:%5B%7B%22type%22:%22button%22,%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22Sure%20One%20Does%22%7D,%22action_id%22:%22gotClicked%22,%22style%22:%22danger%22%7D,%7B%22type%22:%22button%22,%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22One%20Does%20Not%22%7D,%22action_id%22:%22scaredyCat%22,%22style%22:%22primary%22%7D%5D%7D%5D%7D)\n\n### Creating a Simple Modal\n\nLet's take a look at how modals are created. Here we'll also take a look at working with Bits and with loops, by adding options with the `Array.map()` method.\n\nYou'll noticed that we've added an inline condition that returns an initial option only if one has been passed into the function. This is because all the setter methods prune values of `undefined`, uncovering opportunities for inline logic. \n\n```javascript\nimport { Modal, Blocks, Elements, Bits } from 'slack-block-builder';\n\nconst myShorterModal = ({ menuOptions, selected }) => {\n  return Modal({ title: 'PizzaMate', submit: 'Get Fed' })\n    .blocks(\n      Blocks.Section({ text: 'Hey there, colleague!' }),\n      Blocks.Section({ text: 'Hurray for corporate pizza! Let\\'s get you fed and happy :pizza:' }),\n      Blocks.Input({ label: 'What can we call you?' })\n        .element(\n          Elements.TextInput({ placeholder: 'Hi, my name is... (What?!) (Who?!)' })\n            .actionId('name')),\n      Blocks.Input({ label: 'Which floor are you on?' })\n        .element(\n          Elements.TextInput({ placeholder: 'HQ – Fifth Floor' })\n            .actionId('floor')),\n      Blocks.Input({ label: 'What\\'ll you have?' })\n        .element(\n          Elements.StaticSelect({ placeholder: 'Choose your favorite...' })\n            .actionId('item')\n            .options(menuOptions\n              .map((item) => Bits.Option({ text: item.name, value: item.id })))\n            .initialOption(selected && Bits.Option({ text: selected.name, value: selected.id }))))\n    .buildToJSON();\n};\n```\n\nBoth of these examples render the modal below. \n\n![An example of using Block Builder for Modals](resources/images/main/simple-modal-example.png)\n\n[**View Example on Slack Block Kit Builder Website**](https://app.slack.com/block-kit-builder#%7B%22type%22:%22modal%22,%22title%22:%7B%22type%22:%22plain_text%22,%22text%22:%22PizzaMate%22%7D,%22blocks%22:%5B%7B%22type%22:%22section%22,%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22Hey%20there,%20colleague!%22%7D%7D,%7B%22type%22:%22section%22,%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22Hurray%20for%20corporate%20pizza!%20Let's%20get%20you%20fed%20and%20happy%20:pizza:%22%7D%7D,%7B%22type%22:%22input%22,%22label%22:%7B%22type%22:%22plain_text%22,%22text%22:%22What%20can%20we%20call%20you?%22%7D,%22element%22:%7B%22type%22:%22plain_text_input%22,%22action_id%22:%22name%22,%22placeholder%22:%7B%22type%22:%22plain_text%22,%22text%22:%22Hi,%20my%20name%20is...%20(What?!)%20(Who?!)%22%7D%7D%7D,%7B%22type%22:%22input%22,%22label%22:%7B%22type%22:%22plain_text%22,%22text%22:%22Which%20floor%20are%20you%20on?%22%7D,%22element%22:%7B%22type%22:%22plain_text_input%22,%22action_id%22:%22floor%22,%22placeholder%22:%7B%22type%22:%22plain_text%22,%22text%22:%22HQ%20–%20Fifth%20Floor%22%7D%7D%7D,%7B%22type%22:%22input%22,%22label%22:%7B%22type%22:%22plain_text%22,%22text%22:%22What'll%20you%20have?%22%7D,%22element%22:%7B%22type%22:%22static_select%22,%22placeholder%22:%7B%22type%22:%22plain_text%22,%22text%22:%22Choose%20your%20favorite...%22%7D,%22action_id%22:%22item%22,%22options%22:%5B%7B%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22:cheese_wedge:%20With%20Cheeze%22%7D,%22value%22:%22012%22%7D,%7B%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22:fish:%20With%20Anchovies%22%7D,%22value%22:%22013%22%7D,%7B%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22:cookie:%20With%20Scooby%20Snacks%22%7D,%22value%22:%22014%22%7D,%7B%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22:beer:%20I%20Prefer%20Steak%20and%20Beer%22%7D,%22value%22:%22015%22%7D%5D%7D%7D%5D,%22submit%22:%7B%22type%22:%22plain_text%22,%22text%22:%22Get%20Fed%22%7D%7D)\n\n### Utility Functions\n\nThe `Utilities` object contains various utility functions. Currently, there are two:\n\n`BlockCollection()` – Accepts multiple arguments or an array of blocks and returns them in an array, in their built state.\n\n`AttachmentCollection()` – Accepts multiple arguments or an array of attachments and returns them in an array, in their built state.\n\nThese two functions are useful when you wish to keep surface or view configuration separate from UI representation.\n\nAn example using Slack's `WebClient` from their [SDK for Node.js](https://github.com/slackapi/node-slack-sdk):\n\n```javascript\nimport { BlockCollection, AttachmentCollection, Blocks } from 'slack-block-builder';\nimport { WebClient } from '@slack/web-api';\n\nconst client = new WebClient(process.env.SLACK_TOKEN);\n\nclient.chat.postMessage({\n  channel: 'ABCDEFG',\n  text: 'Hello, my dear, sweet world!',\n  blocks: BlockCollection( /* Pass in blocks */ ),\n  attachments: AttachmentCollection( /* Pass in blocks */ ),\n})\n.then((response) => console.log(response))\n.catch((error) => console.log(error));\n```\n\nAnother example where you might find `BlockCollection()` helpful is when [unfurling links in messages](https://api.slack.com/reference/messaging/link-unfurling):\n\n```javascript\nimport { BlockCollection, Blocks } from 'slack-block-builder';\nimport { WebClient } from '@slack/web-api';\n\nconst client = new WebClient(process.env.SLACK_TOKEN);\n\nconst unfurl = ({ channel, ts, url }) => client.chat.unfurl({\n  channel,\n  ts,\n  unfurls: { [url]: BlockCollection( /* Pass in blocks */ ) },\n})\n.then((response) => console.log(response))\n.catch((error) => console.log(error));\n```\n\n## :link: &nbsp; Other Useful Slack-Related Projects\n\n[Bolt for JavaScript](https://github.com/SlackAPI/bolt) – A simple framework for building [Slack](https://slack.com) apps, developed by [Slack](https://slack.com) themselves.\n\n[Node Slack SDK](https://github.com/slackapi/node-slack-sdk) – A great and powerful SDK for building [Slack](https://slack.com) Apps from the ground up.\n\n## :fire: &nbsp; Acknowledgements\n \n<img src=\"https://github.com/korywka.png\" alt=\"@korywka\" width=\"24\" height=\"24\" valign=\"bottom\" /> Taras Neporozhniy ([@korywka](https://github.com/korywka)) - For help and ideas along the way!\n\n<img src=\"https://cdn.dribbble.com/users/683635/avatars/normal/ee2c7c826bfe244b573d145376fe0b5a.png?1510328842\" alt=\"@ft502\" width=\"24\" height=\"24\" valign=\"bottom\" /> Alexey Chernyshov ([@ft502](https://dribbble.com/ft502) on Dribbble) - For such a beautiful logo!\n\n<img src=\"https://github.com/slackhq.png\" alt=\"@slackhq\" width=\"24\" height=\"24\" valign=\"bottom\" /> SlackHQ ([@slackhq](https://github.com/slackhq)) - For such a wonderful product and API!\n\n## :black_nib: &nbsp; Author\n\n<img src=\"https://github.com/raycharius.png\" alt=\"@raycharius\" width=\"24\" height=\"24\" valign=\"bottom\" /> Ray East ([@raycharius](https://github.com/raycharius)) - Huge Fan of Slack and **Block Builder** Maintainer\n","readmeFilename":"README.md","gitHead":"61622da80b08492d4cf11fba27a57807c67e3343","_id":"slack-block-builder@2.0.0-beta.0","_nodeVersion":"14.1.0","_npmVersion":"6.14.4","dist":{"integrity":"sha512-VRPbWmYeP7Qf4HhT9TCzIO3GtEzc/ulAHBXg3IwAo6Koaz6/5VSZeK4RCuNjjWzJJIFHVMtI7VBqOdLLMHNtug==","shasum":"d1a34d6d42784e1567da07b3a326111f1b573b60","tarball":"https://registry.npmjs.org/slack-block-builder/-/slack-block-builder-2.0.0-beta.0.tgz","fileCount":162,"unpackedSize":313876,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgoZAcCRA9TVsSAnZWagAA/RQP/j6oPG7X+sVQZkDL/ybU\nH78jH/NS6C8GEt9YKNeQT5XNsMuzqQKr6QN3M3pB9vSLDbiD1sQdxt9BpfxV\n08i+oI2zqiQqpVkLUX9OrpAWgpkBjsx3lYCxtmq/l422bhErC9Oe/2tuAetR\nQTDJapsxt2ypeowvV/e3BdUsyOfeD1nRYRkS0jrQ5Ojb3TBCiEQGfWE9tm+Y\nZ/tKXPYU+WSy5IbanLB250tTYXlMwDXYykKPlxPjpGPB1zsWzgAKHwASvkoH\n9NM64Hk8K6a8sSKHtQnELJr51gPiqGyN95TdGYXk1r1Py/MXCkPPuedSdOUi\nfZNExpsZdPgPhIRHBKvsbmztxej1ZoSI64ec1SBWkW6Y5ZXWyg8GqInoA+pl\nAyYSIIqrED4ov8U6HUCE5CnEQ/MwPf9qCsGdLCizDtPHSYk4hPh4LKaoXGHn\nE7dCGNuALWHpo+DGpVANw4uvzW3fypDO4ioCoSsdlgjzmI0eVSykPvZbaLgS\n9SYuCgxjdTSd2ugUni/xhwgzp520rrZQRdMtClDu4D21K+Yef1waTabWH9JZ\nQH7//+SJo5ei8HJoG9Y7UG4Mlr0rioczqZh0Irc5E9yx6emaiqV33aHtafWZ\n+Plgy19jLN+8ORRIgcBlENkD4udM7fghWFMJLDE8HpxY2OWN94nNxf/sCjwP\nRhCz\r\n=FqIH\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCID5CMU7kLdYburqewFu5gBZQNvgA7d1xEXet6c+2oYuHAiEAusuGeZsf6CIan6pPablfp/CMbeuFkrWTSVaZJMqeydk="}]},"_npmUser":{"name":"raycharius","email":"raydeast@gmail.com"},"directories":{},"maintainers":[{"name":"bravecow","email":"neporozhniy@gmail.com"},{"name":"raycharius","email":"raydeast@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/slack-block-builder_2.0.0-beta.0_1621200923973_0.8497952399247981"},"_hasShrinkwrap":false},"2.0.0-beta.1":{"name":"slack-block-builder","version":"2.0.0-beta.1","description":"Maintainable code for interactive Slack messages, modals, home tabs, and workflow steps. A must-have for the Slack Block Kit framework.","author":{"name":"Ray East","url":"https://github.com/raycharius"},"repository":{"type":"git","url":"git+https://github.com/raycharius/slack-block-builder.git"},"homepage":"https://blockbuilder.dev","bugs":{"url":"https://github.com/raycharius/slack-block-builder/issues"},"main":"./dist/index.js","types":"./dist/index.d.ts","license":"MIT","keywords":["slack","interactive-messages","block-actions","bot","slack-bot","modal","block","kit","swiftui","bot","modal","messages","message-builder","block-builder","slack-block-builder","block-kit","blocks","botkit","bolt","slack-bolt"],"scripts":{"src:build":"tsc -p ./tsconfig.json","src:lint":"eslint 'src/**/*.ts' --fix","docs:build":"tsc -p ./tsconfig.docs.json","docs:lint":"eslint 'docs-generator/**/*.ts' --fix","predocs:generate":"npm run docs:build","docs:generate":"node docs-generator-dist/index.js","docs:local":"docsify serve docs-generator --port 3000","tests:lint":"eslint 'tests/**/*.ts' --fix","tests:coverage":"codecov","clean":"shx rm -rf ./dist ./coverage ./docs-generator-dist","test":"jest --coverage","build":"npm run src:build","lint":"eslint 'src/**/*.ts' 'tests/**/*.ts' 'docs-generator/**/*.ts'","lint:fix":"eslint 'src/**/*.ts' 'tests/**/*.ts' 'docs-generator/**/*.ts' --fix","madge":"npx madge --circular --warning --extensions ts ./"},"devDependencies":{"@types/jest":"^26.0.22","@typescript-eslint/eslint-plugin":"^4.20.0","@typescript-eslint/parser":"^4.20.0","codecov":"^3.8.1","docsify-cli":"^4.4.3","docsify-server-renderer":"^4.12.1","docsify-tabs":"^1.4.4","eslint":"^6.8.0","eslint-config-airbnb-base":"^14.1.0","eslint-config-airbnb-typescript":"^12.3.1","eslint-plugin-import":"^2.22.1","eslint-plugin-jsx-a11y":"^6.4.1","eslint-plugin-react":"^7.23.1","eslint-plugin-react-hooks":"^4.2.0","jest":"^26.6.3","jest-environment-jsdom":"^26.6.2","madge":"^4.0.2","mustache":"^4.2.0","prettier-eslint-cli":"^5.0.0","shx":"^0.3.3","ts-jest":"^26.5.4","ts-node":"^8.10.2","typescript":"^4.2.3"},"readme":"<p align=\"center\">\n    <img src=\"https://raw.githubusercontent.com/raycharius/slack-block-builder/master/resources/images/main/logo-horizontal.png\" alt=\"Logo\" width=\"600px\">\n</p>\n\n<p align=\"center\">\n    <h3 align=\"center\">Maintainable code for Slack interactive messages, modals, and home tabs.</h3>\n</p>\n\n<p align=\"center\">\n    Lightweight, zero-dependency library for declaratively building Slack Block Kit UI.\n    <br />\n    <br />\n    <a href=\"https://blockbuilder.dev\" target=\"_blank\"><strong>View the Docs »</strong></a>\n    <br />\n    <br />\n    <a href=\"#space_invader--usage\">Quick Start Guide</a>\n    ·\n    <a href=\"https://github.com/raycharius/slack-block-builder/issues\">Request Feature</a>\n    ·\n    <a href=\"https://github.com/raycharius/slack-block-builder/issues\">Report Bug</a>\n  </p>\n</p>\n\n![An example of using Block Builder](resources/images/main/hero-image.png)\n\n***\n\n[![npm](https://img.shields.io/npm/v/slack-block-builder?color=bright-green)](https://www.npmjs.com/package/slack-block-builder)\n![NPM](https://img.shields.io/npm/l/slack-block-builder?color=bright-green)\n[![codecov](https://codecov.io/gh/raycharius/slack-block-builder/branch/master/graph/badge.svg)](https://codecov.io/gh/raycharius/slack-block-builder)\n\n**Block Builder** helps you keep your Slack app code for UI maintainable, testable, and reusable. It has a declarative, chainable syntax inspired by [SwiftUI](https://developer.apple.com/documentation/swiftui) and is built for better UI architecture.\n\n### :zap: &nbsp; Features\n\n* Declarative [SwiftUI](https://developer.apple.com/xcode/swiftui/) inspired syntax.\n* The ability to build more complex flows using loops and conditionals.\n* A `printPreviewURL()` method that outputs a link to preview your UI on Slack's [Block Kit Builder website](https://app.slack.com/block-kit-builder) for easier prototyping.\n* In-depth [doc site](https://blockbuilder.dev) at [https://blockbuilder.dev](https://blockbuilder.dev).\n* [Support](#block-kit-support-and-reference) for all current Slack Block Kit objects.\n* A great TypeScript experience.\n* Extensive JSDoc hints with explanations, validation rules, and quick links to full documentation.\n* Zero dependencies.\n\n### :rocket: &nbsp; Coming Soon\n\n* `Paginator` component.\n* `Accordion` component.\n\n### :gift: &nbsp; Benefits\n\n* Write three times less code.\n* Build more sophistocated, elegant flows.\n* Design better UI architecture for your Slack apps.\n* Focus more on code in your IDE than on studying the [Slack API docs](https://api.slack.com/).\n* Easily integrate localizations into your app.\n\n### :phone: &nbsp; Let's Talk?\n\nFeedback – love it! Aside from GitHub Issues, there are Slack channels available in popular bot communities to discuss **Block Builder** – we'll see you there! :raised_hands:\n\n* **Slack Community** – [\\#block-builder](https://slackcommunity.com)\n* **Bot Developer Hangout** – [\\#block-builder](https://community.botkit.ai)\n\n### :floppy_disk: &nbsp; Installation \n\n#### Using NPM: \n\n``` bash\nnpm install --save slack-block-builder\n```\n\n#### Using Yarn: \n\n``` bash\nyarn add slack-block-builder\n```\n\n### :space_invader: &nbsp; Usage\n\nFor full documentation, make sure you head over to [https://blockbuilder.dev](https://blockbuilder.dev).\n\n\n### Importing\n\nThe functions for creating objects can be both imported directly or through an object that groups them by category.\n\n```javascript\n// Importing exposed groups of objects\n\nimport { Surfaces, Blocks, Elements, Bits, Utilities } from 'slack-block-builder';\n\n// Importing objects top-level\n\nimport { Modal, Section, Actions, Button } from 'slack-block-builder';\n```\n\n### Group Explanations\n\n`Surfaces` – Contains functions for creating modals, messages, home tabs, and workflow steps. \n\n`Blocks` – Layout blocks used to organize the UI.\n\n`Elements` – UI elements that are used to capture user interaction.\n\n`Bits` – These are composition objects and other bits and pieces from Slack's docs. Included are `Attachment`, `Options`, `OptionGroup`, and `ConfirmationDialog`. They felt like they were deserving of their own category.\n\n`Utilities` – A group of utility functions. See [Utility Functions](#utility-functions).\n\n### Block Kit Support and Reference\n\nBelow is a list of supported objects and how to access them in **Block Builder**:\n\n| **Name**             | **Type**           | **Support**                    | **Accessed Via**                      \n|----------------------|--------------------|--------------------------------|-----------------------------------------\n| Home Tab             | Surface            | :white_check_mark:             | `Surfaces.HomeTab()`                       \n| Message              | Surface            | :white_check_mark:             | `Surfaces.Message()`                       \n| Modal                | Surface            | :white_check_mark:             | `Surfaces.Modal()`                         \n| Workflow Step        | Surface            | :white_check_mark:             | `Surfaces.WorkflowStep()`                         \n| Actions              | Block              | :white_check_mark:             | `Blocks.Actions()`                \n| Context              | Block              | :white_check_mark:             | `Blocks.Context()`                \n| Divider              | Block              | :white_check_mark:             | `Blocks.Divider()`                \n| File                 | Block              | :white_check_mark:             | `Blocks.File()`\n| Header               | Block              | :white_check_mark:             | `Blocks.Header()`\n| Image                | Block              | :white_check_mark:             | `Blocks.Image()`                  \n| Input                | Block              | :white_check_mark:             | `Blocks.Input()`                  \n| Section              | Block              | :white_check_mark:             | `Blocks.Section()`                \n| Button               | Element            | :white_check_mark:️             | `Elements.Button()`               \n| Checkboxes           | Element            | :white_check_mark:             | `Elements.Checkboxes()`           \n| Date Picker          | Element            | :white_check_mark:             | `Elements.DatePicker()`\n| Time Picker          | Element            | :white_check_mark:             | `Elements.TimePicker()`           \n| Image                | Element            | :white_check_mark:             | `Elements.Img()`                  \n| Overflow Menu        | Element            | :white_check_mark:             | `Elements.OverflowMenu()`         \n| Radio Buttons        | Element            | :white_check_mark:             | `Elements.RadioButtons()`         \n| Plain-Text Input     | Element            | :white_check_mark:             | `Elements.TextInput()`            \n| Select Menus         | Element            | :white_check_mark:             | `Elements.[Type]Select()`          \n| Multi-Select Menus   | Element            | :white_check_mark:             | `Elements.[Type]MultiSelect()`     \n| Option               | Composition Object | :white_check_mark:             | `Bits.Option()`                   \n| Confirm Dialog       | Composition Object | :white_check_mark:             | `Bits.ConfirmationDialog()`       \n| Option Group         | Composition Object | :white_check_mark:             | `Bits.OptionGroup()`\n| Attachment           | Legacy Feature     | :white_check_mark:             | `Bits.Attachment()`              \n\n### Creating a Simple Interactive Message\n\nLet's take a look at how to compose an interactive message. Even though [Slack](https://slack.com) now has modals, these have always been the basis for [Slack](https://slack.com) apps.\n\nFunctions that return Block Kit objects have setter methods for all of the properties, but also support parameters that are passed into the constructor for properties with primitive types.\n\n```javascript\nimport { Message, Blocks, Elements } from 'slack-block-builder';\n\nconst myMessage = ({ channel, dangerLevel }) => {\n  return Message()\n    .channel(channel)\n    .text('Alas, my friend.')\n    .blocks(\n      Blocks.Section()\n        .text('One does not simply walk into Slack and click a button.'),\n      Blocks.Section()\n        .text('At least that\\'s what my friend Slackomir said :crossed_swords:'),\n      Blocks.Divider(),\n      Blocks.Actions()\n        .elements(\n          Elements.Button()\n            .text('Sure One Does')\n            .actionId('gotClicked')\n            .danger(dangerLevel > 42), // Optional argument, defaults to 'true'\n          Elements.Button()\n            .text('One Does Not')\n            .actionId('scaredyCat')\n            .primary()))\n    .asUser()\n    .buildToJSON();\n};\n```\n\nAnd now an example with using both the setter methods and passing parameters into the functions at initiation:\n\n```javascript\nimport { Message, Blocks, Elements } from 'slack-block-builder';\n\nconst myShorterMessage = ({ channel, dangerLevel }) => {\n  return Message({ channel, text: 'Alas, my friend.' })\n    .blocks(\n      Blocks.Section({ text: 'One does not simply walk into Slack and click a button.' }),\n      Blocks.Section({ text: 'At least that\\'s what my friend Slackomir said :crossed_swords:' }),\n      Blocks.Divider(),\n      Blocks.Actions()\n        .elements(\n          Elements.Button({ text: 'Sure One Does', actionId: 'gotClicked' })\n            .danger(dangerLevel > 42), // Optional argument, defaults to 'true'\n          Elements.Button({ text: 'One Does Not', actionId: 'scaredyCat' })\n            .primary()))\n    .asUser()\n    .buildToJSON();\n};\n```\n\nBoth of these examples render the message below. And the best part? It only took 15 lines of code, as opposed to the 44 lines of JSON generated as a result. \n\n![An example of using Block Builder for Messages](resources/images/main/simple-message-example.png)\n\n[**View Example on Slack Block Kit Builder Website**](https://app.slack.com/block-kit-builder#%7B%22blocks%22:%5B%7B%22type%22:%22section%22,%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22One%20does%20not%20simply%20walk%20into%20Slack%20and%20click%20a%20button.%22%7D%7D,%7B%22type%22:%22section%22,%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22At%20least%20that's%20what%20my%20friend%20Slackomir%20said%20:crossed_swords:%22%7D%7D,%7B%22type%22:%22divider%22%7D,%7B%22type%22:%22actions%22,%22elements%22:%5B%7B%22type%22:%22button%22,%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22Sure%20One%20Does%22%7D,%22action_id%22:%22gotClicked%22,%22style%22:%22danger%22%7D,%7B%22type%22:%22button%22,%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22One%20Does%20Not%22%7D,%22action_id%22:%22scaredyCat%22,%22style%22:%22primary%22%7D%5D%7D%5D%7D)\n\n### Creating a Simple Modal\n\nLet's take a look at how modals are created. Here we'll also take a look at working with Bits and with loops, by adding options with the `Array.map()` method.\n\nYou'll noticed that we've added an inline condition that returns an initial option only if one has been passed into the function. This is because all the setter methods prune values of `undefined`, uncovering opportunities for inline logic. \n\n```javascript\nimport { Modal, Blocks, Elements, Bits } from 'slack-block-builder';\n\nconst myShorterModal = ({ menuOptions, selected }) => {\n  return Modal({ title: 'PizzaMate', submit: 'Get Fed' })\n    .blocks(\n      Blocks.Section({ text: 'Hey there, colleague!' }),\n      Blocks.Section({ text: 'Hurray for corporate pizza! Let\\'s get you fed and happy :pizza:' }),\n      Blocks.Input({ label: 'What can we call you?' })\n        .element(\n          Elements.TextInput({ placeholder: 'Hi, my name is... (What?!) (Who?!)' })\n            .actionId('name')),\n      Blocks.Input({ label: 'Which floor are you on?' })\n        .element(\n          Elements.TextInput({ placeholder: 'HQ – Fifth Floor' })\n            .actionId('floor')),\n      Blocks.Input({ label: 'What\\'ll you have?' })\n        .element(\n          Elements.StaticSelect({ placeholder: 'Choose your favorite...' })\n            .actionId('item')\n            .options(menuOptions\n              .map((item) => Bits.Option({ text: item.name, value: item.id })))\n            .initialOption(selected && Bits.Option({ text: selected.name, value: selected.id }))))\n    .buildToJSON();\n};\n```\n\nBoth of these examples render the modal below. \n\n![An example of using Block Builder for Modals](resources/images/main/simple-modal-example.png)\n\n[**View Example on Slack Block Kit Builder Website**](https://app.slack.com/block-kit-builder#%7B%22type%22:%22modal%22,%22title%22:%7B%22type%22:%22plain_text%22,%22text%22:%22PizzaMate%22%7D,%22blocks%22:%5B%7B%22type%22:%22section%22,%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22Hey%20there,%20colleague!%22%7D%7D,%7B%22type%22:%22section%22,%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22Hurray%20for%20corporate%20pizza!%20Let's%20get%20you%20fed%20and%20happy%20:pizza:%22%7D%7D,%7B%22type%22:%22input%22,%22label%22:%7B%22type%22:%22plain_text%22,%22text%22:%22What%20can%20we%20call%20you?%22%7D,%22element%22:%7B%22type%22:%22plain_text_input%22,%22action_id%22:%22name%22,%22placeholder%22:%7B%22type%22:%22plain_text%22,%22text%22:%22Hi,%20my%20name%20is...%20(What?!)%20(Who?!)%22%7D%7D%7D,%7B%22type%22:%22input%22,%22label%22:%7B%22type%22:%22plain_text%22,%22text%22:%22Which%20floor%20are%20you%20on?%22%7D,%22element%22:%7B%22type%22:%22plain_text_input%22,%22action_id%22:%22floor%22,%22placeholder%22:%7B%22type%22:%22plain_text%22,%22text%22:%22HQ%20–%20Fifth%20Floor%22%7D%7D%7D,%7B%22type%22:%22input%22,%22label%22:%7B%22type%22:%22plain_text%22,%22text%22:%22What'll%20you%20have?%22%7D,%22element%22:%7B%22type%22:%22static_select%22,%22placeholder%22:%7B%22type%22:%22plain_text%22,%22text%22:%22Choose%20your%20favorite...%22%7D,%22action_id%22:%22item%22,%22options%22:%5B%7B%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22:cheese_wedge:%20With%20Cheeze%22%7D,%22value%22:%22012%22%7D,%7B%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22:fish:%20With%20Anchovies%22%7D,%22value%22:%22013%22%7D,%7B%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22:cookie:%20With%20Scooby%20Snacks%22%7D,%22value%22:%22014%22%7D,%7B%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22:beer:%20I%20Prefer%20Steak%20and%20Beer%22%7D,%22value%22:%22015%22%7D%5D%7D%7D%5D,%22submit%22:%7B%22type%22:%22plain_text%22,%22text%22:%22Get%20Fed%22%7D%7D)\n\n### Utility Functions\n\nThe `Utilities` object contains various utility functions. Currently, there are two:\n\n`BlockCollection()` – Accepts multiple arguments or an array of blocks and returns them in an array, in their built state.\n\n`AttachmentCollection()` – Accepts multiple arguments or an array of attachments and returns them in an array, in their built state.\n\nThese two functions are useful when you wish to keep surface or view configuration separate from UI representation.\n\nAn example using Slack's `WebClient` from their [SDK for Node.js](https://github.com/slackapi/node-slack-sdk):\n\n```javascript\nimport { BlockCollection, AttachmentCollection, Blocks } from 'slack-block-builder';\nimport { WebClient } from '@slack/web-api';\n\nconst client = new WebClient(process.env.SLACK_TOKEN);\n\nclient.chat.postMessage({\n  channel: 'ABCDEFG',\n  text: 'Hello, my dear, sweet world!',\n  blocks: BlockCollection( /* Pass in blocks */ ),\n  attachments: AttachmentCollection( /* Pass in blocks */ ),\n})\n.then((response) => console.log(response))\n.catch((error) => console.log(error));\n```\n\nAnother example where you might find `BlockCollection()` helpful is when [unfurling links in messages](https://api.slack.com/reference/messaging/link-unfurling):\n\n```javascript\nimport { BlockCollection, Blocks } from 'slack-block-builder';\nimport { WebClient } from '@slack/web-api';\n\nconst client = new WebClient(process.env.SLACK_TOKEN);\n\nconst unfurl = ({ channel, ts, url }) => client.chat.unfurl({\n  channel,\n  ts,\n  unfurls: { [url]: BlockCollection( /* Pass in blocks */ ) },\n})\n.then((response) => console.log(response))\n.catch((error) => console.log(error));\n```\n\n## :link: &nbsp; Other Useful Slack-Related Projects\n\n[Bolt for JavaScript](https://github.com/SlackAPI/bolt) – A simple framework for building [Slack](https://slack.com) apps, developed by [Slack](https://slack.com) themselves.\n\n[Node Slack SDK](https://github.com/slackapi/node-slack-sdk) – A great and powerful SDK for building [Slack](https://slack.com) Apps from the ground up.\n\n## :fire: &nbsp; Acknowledgements\n \n<img src=\"https://github.com/korywka.png\" alt=\"@korywka\" width=\"24\" height=\"24\" valign=\"bottom\" /> Taras Neporozhniy ([@korywka](https://github.com/korywka)) - For help and ideas along the way!\n\n<img src=\"https://cdn.dribbble.com/users/683635/avatars/normal/ee2c7c826bfe244b573d145376fe0b5a.png?1510328842\" alt=\"@ft502\" width=\"24\" height=\"24\" valign=\"bottom\" /> Alexey Chernyshov ([@ft502](https://dribbble.com/ft502) on Dribbble) - For such a beautiful logo!\n\n<img src=\"https://github.com/slackhq.png\" alt=\"@slackhq\" width=\"24\" height=\"24\" valign=\"bottom\" /> SlackHQ ([@slackhq](https://github.com/slackhq)) - For such a wonderful product and API!\n\n## :black_nib: &nbsp; Author\n\n<img src=\"https://github.com/raycharius.png\" alt=\"@raycharius\" width=\"24\" height=\"24\" valign=\"bottom\" /> Ray East ([@raycharius](https://github.com/raycharius)) - Huge Fan of Slack and **Block Builder** Maintainer\n","readmeFilename":"README.md","gitHead":"fe2a0d8ed841fc0ed23f3ba1ee03439d2a7a9698","_id":"slack-block-builder@2.0.0-beta.1","_nodeVersion":"14.1.0","_npmVersion":"6.14.4","dist":{"integrity":"sha512-9EPKsr0uhtxkr+PrfCWXMlgYdwfZo+mn+f2aILZhOI6DHPnPBCXbaePACbDXhmdIbi+g66jyF5ZccFOzlbBLxg==","shasum":"0dee02e87cf4e7451eabe8e24265af92bcb9bd09","tarball":"https://registry.npmjs.org/slack-block-builder/-/slack-block-builder-2.0.0-beta.1.tgz","fileCount":162,"unpackedSize":316528,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgoaAfCRA9TVsSAnZWagAA4VsQAKAPDjImHWfD6dF9oJUD\nGcIr9rs803YaNydU2vg3k9Uz74OYEHpQHjn1dc8UaLB/9y+VJsr1xhh/tyZu\nisVzRLQ+puy36be7HsFN2u+xs3ftczwWzTYAwI8jQjrMkekk2DYOg8NtJv2a\ncHEqCOg8Yi5nwx4BSm3VwVr66AraI7BeObl0WSneY5omAZgwmcQ98gkd2Vw7\nAQC3znF2bO4tTqYnWRgoVdR+pAb0g7S9wvldSZ9RH6tPxQ/tJg1eIFLuh2nQ\ng3dATwLc6Jk7wDliCXF5H4g+E/jWOquhslq5xibbJ+dHYQLctidP/+4IOK5V\nuTt3EF8z1VO+BFWd0+M+qyLHrO4PC9aOD3PNdXY6T5jufOddWZlZCWIQTob4\nK+gf5GGIBNLO3nmH3OHTO3L6sYvP5l8x+/ARO3bvnAWingDYI/IuKRVBctpv\nFDhZJcjAy7njNKZCfBpCBbeCFSvUuI5S4TYKG9kyAz8PQVx0G79qrIxZQeZu\n8E24zf051Fr95tXVbccX4bs4OxpGMxIySFBIAkWbU/kPB5zLxa+moaZ/QU7U\nvkDFhp1P4ooEBSfDLzqKBxzrUusAKKi3z6oRLkBe1lCJv5Gv69XVeYP8q+6r\n5TO1KgUawy30bH5gsia1aPSRZz4TPkgMUp/1Axk6MSUOMJGc4eHPcTCKZram\noUho\r\n=MkRJ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCEqJ/4lELhf+eQPp1LWxV8e8Tw0kQYCIkQ3jM+Y0F1vAIgVmTK+kBdcyvx5F3TGs9xZm3vxRl6v8YaMKvNTFp7t28="}]},"_npmUser":{"name":"raycharius","email":"raydeast@gmail.com"},"directories":{},"maintainers":[{"name":"bravecow","email":"neporozhniy@gmail.com"},{"name":"raycharius","email":"raydeast@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/slack-block-builder_2.0.0-beta.1_1621205022716_0.10459421445139894"},"_hasShrinkwrap":false},"2.0.0-beta.2":{"name":"slack-block-builder","version":"2.0.0-beta.2","description":"Maintainable code for interactive Slack messages, modals, home tabs, and workflow steps. A must-have for the Slack Block Kit framework.","author":{"name":"Ray East","url":"https://github.com/raycharius"},"repository":{"type":"git","url":"git+https://github.com/raycharius/slack-block-builder.git"},"homepage":"https://blockbuilder.dev","bugs":{"url":"https://github.com/raycharius/slack-block-builder/issues"},"main":"./dist/index.js","types":"./dist/index.d.ts","license":"MIT","keywords":["slack","interactive-messages","block-actions","bot","slack-bot","modal","block","kit","swiftui","bot","modal","messages","message-builder","block-builder","slack-block-builder","block-kit","blocks","botkit","bolt","slack-bolt"],"scripts":{"src:build":"tsc -p ./tsconfig.json","src:lint":"eslint 'src/**/*.ts' --fix","docs:build":"tsc -p ./tsconfig.docs.json","docs:lint":"eslint 'docs-generator/**/*.ts' --fix","predocs:generate":"npm run docs:build","docs:generate":"node docs-generator-dist/index.js","docs:local":"docsify serve docs-generator --port 3000","tests:lint":"eslint 'tests/**/*.ts' --fix","tests:coverage":"codecov","clean":"shx rm -rf ./dist ./coverage ./docs-generator-dist","test":"jest --coverage","build":"npm run src:build","lint":"eslint 'src/**/*.ts' 'tests/**/*.ts' 'docs-generator/**/*.ts'","lint:fix":"eslint 'src/**/*.ts' 'tests/**/*.ts' 'docs-generator/**/*.ts' --fix","madge":"npx madge --circular --warning --extensions ts ./"},"devDependencies":{"@types/jest":"^26.0.22","@typescript-eslint/eslint-plugin":"^4.20.0","@typescript-eslint/parser":"^4.20.0","codecov":"^3.8.1","docsify-cli":"^4.4.3","docsify-server-renderer":"^4.12.1","docsify-tabs":"^1.4.4","eslint":"^6.8.0","eslint-config-airbnb-base":"^14.1.0","eslint-config-airbnb-typescript":"^12.3.1","eslint-plugin-import":"^2.22.1","eslint-plugin-jsx-a11y":"^6.4.1","eslint-plugin-react":"^7.23.1","eslint-plugin-react-hooks":"^4.2.0","jest":"^26.6.3","jest-environment-jsdom":"^26.6.2","madge":"^4.0.2","mustache":"^4.2.0","prettier-eslint-cli":"^5.0.0","shx":"^0.3.3","ts-jest":"^26.5.4","ts-node":"^8.10.2","typescript":"^4.2.3"},"readme":"<p align=\"center\">\n    <img src=\"https://raw.githubusercontent.com/raycharius/slack-block-builder/master/resources/images/main/logo-horizontal.png\" alt=\"Logo\" width=\"600px\">\n</p>\n\n<p align=\"center\">\n    <h3 align=\"center\">Maintainable code for Slack interactive messages, modals, and home tabs.</h3>\n</p>\n\n<p align=\"center\">\n    Lightweight, zero-dependency library for declaratively building Slack Block Kit UI.\n    <br />\n    <br />\n    <a href=\"https://blockbuilder.dev\" target=\"_blank\"><strong>View the Docs »</strong></a>\n    <br />\n    <br />\n    <a href=\"#space_invader--usage\">Quick Start Guide</a>\n    ·\n    <a href=\"https://github.com/raycharius/slack-block-builder/issues\">Request Feature</a>\n    ·\n    <a href=\"https://github.com/raycharius/slack-block-builder/issues\">Report Bug</a>\n  </p>\n</p>\n\n![An example of using Block Builder](resources/images/main/hero-image.png)\n\n***\n\n[![npm](https://img.shields.io/npm/v/slack-block-builder?color=bright-green)](https://www.npmjs.com/package/slack-block-builder)\n![NPM](https://img.shields.io/npm/l/slack-block-builder?color=bright-green)\n[![codecov](https://codecov.io/gh/raycharius/slack-block-builder/branch/master/graph/badge.svg)](https://codecov.io/gh/raycharius/slack-block-builder)\n\n> :tada: **Block Builder Version 2.0 is now in beta! Learn about the new features and how to install it [here](docs/announcements/version-2.md).**\n\n**Block Builder** helps you keep your Slack app code for UI maintainable, testable, and reusable. It has a declarative, chainable syntax inspired by [SwiftUI](https://developer.apple.com/documentation/swiftui) and is built for better UI architecture.\n\n### :zap: &nbsp; Features\n\n* Declarative [SwiftUI](https://developer.apple.com/xcode/swiftui/) inspired syntax.\n* The ability to build more complex flows using loops and conditionals.\n* A `printPreviewURL()` method that outputs a link to preview your UI on Slack's [Block Kit Builder website](https://app.slack.com/block-kit-builder) for easier prototyping.\n* In-depth [doc site](https://blockbuilder.dev) at [https://blockbuilder.dev](https://blockbuilder.dev).\n* [Support](#block-kit-support-and-reference) for all current Slack Block Kit objects.\n* A great TypeScript experience.\n* Extensive JSDoc hints with explanations, validation rules, and quick links to full documentation.\n* Zero dependencies.\n\n### :rocket: &nbsp; Coming Soon\n\n* `Paginator` component.\n* `Accordion` component.\n\n### :gift: &nbsp; Benefits\n\n* Write three times less code.\n* Build more sophistocated, elegant flows.\n* Design better UI architecture for your Slack apps.\n* Focus more on code in your IDE than on studying the [Slack API docs](https://api.slack.com/).\n* Easily integrate localizations into your app.\n\n### :phone: &nbsp; Let's Talk?\n\nFeedback – love it! Aside from GitHub Issues, there are Slack channels available in popular bot communities to discuss **Block Builder** – we'll see you there! :raised_hands:\n\n* **Slack Community** – [\\#block-builder](https://slackcommunity.com)\n* **Bot Developer Hangout** – [\\#block-builder](https://community.botkit.ai)\n\n### :floppy_disk: &nbsp; Installation \n\n#### Using NPM: \n\n``` bash\nnpm install --save slack-block-builder\n```\n\n#### Using Yarn: \n\n``` bash\nyarn add slack-block-builder\n```\n\n### :space_invader: &nbsp; Usage\n\nFor full documentation, make sure you head over to [https://blockbuilder.dev](https://blockbuilder.dev).\n\n\n### Importing\n\nThe functions for creating objects can be both imported directly or through an object that groups them by category.\n\n```javascript\n// Importing exposed groups of objects\n\nimport { Surfaces, Blocks, Elements, Bits, Utilities } from 'slack-block-builder';\n\n// Importing objects top-level\n\nimport { Modal, Section, Actions, Button } from 'slack-block-builder';\n```\n\n### Group Explanations\n\n`Surfaces` – Contains functions for creating modals, messages, home tabs, and workflow steps. \n\n`Blocks` – Layout blocks used to organize the UI.\n\n`Elements` – UI elements that are used to capture user interaction.\n\n`Bits` – These are composition objects and other bits and pieces from Slack's docs. Included are `Attachment`, `Options`, `OptionGroup`, and `ConfirmationDialog`. They felt like they were deserving of their own category.\n\n`Utilities` – A group of utility functions. See [Utility Functions](#utility-functions).\n\n### Block Kit Support and Reference\n\nBelow is a list of supported objects and how to access them in **Block Builder**:\n\n| **Name**             | **Type**           | **Support**                    | **Accessed Via**                      \n|----------------------|--------------------|--------------------------------|-----------------------------------------\n| Home Tab             | Surface            | :white_check_mark:             | `Surfaces.HomeTab()`                       \n| Message              | Surface            | :white_check_mark:             | `Surfaces.Message()`                       \n| Modal                | Surface            | :white_check_mark:             | `Surfaces.Modal()`                         \n| Workflow Step        | Surface            | :white_check_mark:             | `Surfaces.WorkflowStep()`                         \n| Actions              | Block              | :white_check_mark:             | `Blocks.Actions()`                \n| Context              | Block              | :white_check_mark:             | `Blocks.Context()`                \n| Divider              | Block              | :white_check_mark:             | `Blocks.Divider()`                \n| File                 | Block              | :white_check_mark:             | `Blocks.File()`\n| Header               | Block              | :white_check_mark:             | `Blocks.Header()`\n| Image                | Block              | :white_check_mark:             | `Blocks.Image()`                  \n| Input                | Block              | :white_check_mark:             | `Blocks.Input()`                  \n| Section              | Block              | :white_check_mark:             | `Blocks.Section()`                \n| Button               | Element            | :white_check_mark:️             | `Elements.Button()`               \n| Checkboxes           | Element            | :white_check_mark:             | `Elements.Checkboxes()`           \n| Date Picker          | Element            | :white_check_mark:             | `Elements.DatePicker()`\n| Time Picker          | Element            | :white_check_mark:             | `Elements.TimePicker()`           \n| Image                | Element            | :white_check_mark:             | `Elements.Img()`                  \n| Overflow Menu        | Element            | :white_check_mark:             | `Elements.OverflowMenu()`         \n| Radio Buttons        | Element            | :white_check_mark:             | `Elements.RadioButtons()`         \n| Plain-Text Input     | Element            | :white_check_mark:             | `Elements.TextInput()`            \n| Select Menus         | Element            | :white_check_mark:             | `Elements.[Type]Select()`          \n| Multi-Select Menus   | Element            | :white_check_mark:             | `Elements.[Type]MultiSelect()`     \n| Option               | Composition Object | :white_check_mark:             | `Bits.Option()`                   \n| Confirm Dialog       | Composition Object | :white_check_mark:             | `Bits.ConfirmationDialog()`       \n| Option Group         | Composition Object | :white_check_mark:             | `Bits.OptionGroup()`\n| Attachment           | Legacy Feature     | :white_check_mark:             | `Bits.Attachment()`              \n\n### Creating a Simple Interactive Message\n\nLet's take a look at how to compose an interactive message. Even though [Slack](https://slack.com) now has modals, these have always been the basis for [Slack](https://slack.com) apps.\n\nFunctions that return Block Kit objects have setter methods for all of the properties, but also support parameters that are passed into the constructor for properties with primitive types.\n\n```javascript\nimport { Message, Blocks, Elements } from 'slack-block-builder';\n\nconst myMessage = ({ channel, dangerLevel }) => {\n  return Message()\n    .channel(channel)\n    .text('Alas, my friend.')\n    .blocks(\n      Blocks.Section()\n        .text('One does not simply walk into Slack and click a button.'),\n      Blocks.Section()\n        .text('At least that\\'s what my friend Slackomir said :crossed_swords:'),\n      Blocks.Divider(),\n      Blocks.Actions()\n        .elements(\n          Elements.Button()\n            .text('Sure One Does')\n            .actionId('gotClicked')\n            .danger(dangerLevel > 42), // Optional argument, defaults to 'true'\n          Elements.Button()\n            .text('One Does Not')\n            .actionId('scaredyCat')\n            .primary()))\n    .asUser()\n    .buildToJSON();\n};\n```\n\nAnd now an example with using both the setter methods and passing parameters into the functions at initiation:\n\n```javascript\nimport { Message, Blocks, Elements } from 'slack-block-builder';\n\nconst myShorterMessage = ({ channel, dangerLevel }) => {\n  return Message({ channel, text: 'Alas, my friend.' })\n    .blocks(\n      Blocks.Section({ text: 'One does not simply walk into Slack and click a button.' }),\n      Blocks.Section({ text: 'At least that\\'s what my friend Slackomir said :crossed_swords:' }),\n      Blocks.Divider(),\n      Blocks.Actions()\n        .elements(\n          Elements.Button({ text: 'Sure One Does', actionId: 'gotClicked' })\n            .danger(dangerLevel > 42), // Optional argument, defaults to 'true'\n          Elements.Button({ text: 'One Does Not', actionId: 'scaredyCat' })\n            .primary()))\n    .asUser()\n    .buildToJSON();\n};\n```\n\nBoth of these examples render the message below. And the best part? It only took 15 lines of code, as opposed to the 44 lines of JSON generated as a result. \n\n![An example of using Block Builder for Messages](resources/images/main/simple-message-example.png)\n\n[**View Example on Slack Block Kit Builder Website**](https://app.slack.com/block-kit-builder#%7B%22blocks%22:%5B%7B%22type%22:%22section%22,%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22One%20does%20not%20simply%20walk%20into%20Slack%20and%20click%20a%20button.%22%7D%7D,%7B%22type%22:%22section%22,%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22At%20least%20that's%20what%20my%20friend%20Slackomir%20said%20:crossed_swords:%22%7D%7D,%7B%22type%22:%22divider%22%7D,%7B%22type%22:%22actions%22,%22elements%22:%5B%7B%22type%22:%22button%22,%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22Sure%20One%20Does%22%7D,%22action_id%22:%22gotClicked%22,%22style%22:%22danger%22%7D,%7B%22type%22:%22button%22,%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22One%20Does%20Not%22%7D,%22action_id%22:%22scaredyCat%22,%22style%22:%22primary%22%7D%5D%7D%5D%7D)\n\n### Creating a Simple Modal\n\nLet's take a look at how modals are created. Here we'll also take a look at working with Bits and with loops, by adding options with the `Array.map()` method.\n\nYou'll noticed that we've added an inline condition that returns an initial option only if one has been passed into the function. This is because all the setter methods prune values of `undefined`, uncovering opportunities for inline logic. \n\n```javascript\nimport { Modal, Blocks, Elements, Bits } from 'slack-block-builder';\n\nconst myShorterModal = ({ menuOptions, selected }) => {\n  return Modal({ title: 'PizzaMate', submit: 'Get Fed' })\n    .blocks(\n      Blocks.Section({ text: 'Hey there, colleague!' }),\n      Blocks.Section({ text: 'Hurray for corporate pizza! Let\\'s get you fed and happy :pizza:' }),\n      Blocks.Input({ label: 'What can we call you?' })\n        .element(\n          Elements.TextInput({ placeholder: 'Hi, my name is... (What?!) (Who?!)' })\n            .actionId('name')),\n      Blocks.Input({ label: 'Which floor are you on?' })\n        .element(\n          Elements.TextInput({ placeholder: 'HQ – Fifth Floor' })\n            .actionId('floor')),\n      Blocks.Input({ label: 'What\\'ll you have?' })\n        .element(\n          Elements.StaticSelect({ placeholder: 'Choose your favorite...' })\n            .actionId('item')\n            .options(menuOptions\n              .map((item) => Bits.Option({ text: item.name, value: item.id })))\n            .initialOption(selected && Bits.Option({ text: selected.name, value: selected.id }))))\n    .buildToJSON();\n};\n```\n\nBoth of these examples render the modal below. \n\n![An example of using Block Builder for Modals](resources/images/main/simple-modal-example.png)\n\n[**View Example on Slack Block Kit Builder Website**](https://app.slack.com/block-kit-builder#%7B%22type%22:%22modal%22,%22title%22:%7B%22type%22:%22plain_text%22,%22text%22:%22PizzaMate%22%7D,%22blocks%22:%5B%7B%22type%22:%22section%22,%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22Hey%20there,%20colleague!%22%7D%7D,%7B%22type%22:%22section%22,%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22Hurray%20for%20corporate%20pizza!%20Let's%20get%20you%20fed%20and%20happy%20:pizza:%22%7D%7D,%7B%22type%22:%22input%22,%22label%22:%7B%22type%22:%22plain_text%22,%22text%22:%22What%20can%20we%20call%20you?%22%7D,%22element%22:%7B%22type%22:%22plain_text_input%22,%22action_id%22:%22name%22,%22placeholder%22:%7B%22type%22:%22plain_text%22,%22text%22:%22Hi,%20my%20name%20is...%20(What?!)%20(Who?!)%22%7D%7D%7D,%7B%22type%22:%22input%22,%22label%22:%7B%22type%22:%22plain_text%22,%22text%22:%22Which%20floor%20are%20you%20on?%22%7D,%22element%22:%7B%22type%22:%22plain_text_input%22,%22action_id%22:%22floor%22,%22placeholder%22:%7B%22type%22:%22plain_text%22,%22text%22:%22HQ%20–%20Fifth%20Floor%22%7D%7D%7D,%7B%22type%22:%22input%22,%22label%22:%7B%22type%22:%22plain_text%22,%22text%22:%22What'll%20you%20have?%22%7D,%22element%22:%7B%22type%22:%22static_select%22,%22placeholder%22:%7B%22type%22:%22plain_text%22,%22text%22:%22Choose%20your%20favorite...%22%7D,%22action_id%22:%22item%22,%22options%22:%5B%7B%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22:cheese_wedge:%20With%20Cheeze%22%7D,%22value%22:%22012%22%7D,%7B%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22:fish:%20With%20Anchovies%22%7D,%22value%22:%22013%22%7D,%7B%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22:cookie:%20With%20Scooby%20Snacks%22%7D,%22value%22:%22014%22%7D,%7B%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22:beer:%20I%20Prefer%20Steak%20and%20Beer%22%7D,%22value%22:%22015%22%7D%5D%7D%7D%5D,%22submit%22:%7B%22type%22:%22plain_text%22,%22text%22:%22Get%20Fed%22%7D%7D)\n\n### Utility Functions\n\nThe `Utilities` object contains various utility functions. Currently, there are two:\n\n`BlockCollection()` – Accepts multiple arguments or an array of blocks and returns them in an array, in their built state.\n\n`AttachmentCollection()` – Accepts multiple arguments or an array of attachments and returns them in an array, in their built state.\n\nThese two functions are useful when you wish to keep surface or view configuration separate from UI representation.\n\nAn example using Slack's `WebClient` from their [SDK for Node.js](https://github.com/slackapi/node-slack-sdk):\n\n```javascript\nimport { BlockCollection, AttachmentCollection, Blocks } from 'slack-block-builder';\nimport { WebClient } from '@slack/web-api';\n\nconst client = new WebClient(process.env.SLACK_TOKEN);\n\nclient.chat.postMessage({\n  channel: 'ABCDEFG',\n  text: 'Hello, my dear, sweet world!',\n  blocks: BlockCollection( /* Pass in blocks */ ),\n  attachments: AttachmentCollection( /* Pass in attachments */ ),\n})\n.then((response) => console.log(response))\n.catch((error) => console.log(error));\n```\n\nAnother example where you might find `BlockCollection()` helpful is when [unfurling links in messages](https://api.slack.com/reference/messaging/link-unfurling):\n\n```javascript\nimport { BlockCollection, Blocks } from 'slack-block-builder';\nimport { WebClient } from '@slack/web-api';\n\nconst client = new WebClient(process.env.SLACK_TOKEN);\n\nconst unfurl = ({ channel, ts, url }) => client.chat.unfurl({\n  channel,\n  ts,\n  unfurls: { [url]: BlockCollection( /* Pass in blocks */ ) },\n})\n.then((response) => console.log(response))\n.catch((error) => console.log(error));\n```\n\n## :link: &nbsp; Other Useful Slack-Related Projects\n\n[Bolt for JavaScript](https://github.com/SlackAPI/bolt) – A simple framework for building [Slack](https://slack.com) apps, developed by [Slack](https://slack.com) themselves.\n\n[Node Slack SDK](https://github.com/slackapi/node-slack-sdk) – A great and powerful SDK for building [Slack](https://slack.com) Apps from the ground up.\n\n## :fire: &nbsp; Acknowledgements\n \n<img src=\"https://github.com/korywka.png\" alt=\"@korywka\" width=\"24\" height=\"24\" valign=\"bottom\" /> Taras Neporozhniy ([@korywka](https://github.com/korywka)) - For help and ideas along the way!\n\n<img src=\"https://cdn.dribbble.com/users/683635/avatars/normal/ee2c7c826bfe244b573d145376fe0b5a.png?1510328842\" alt=\"@ft502\" width=\"24\" height=\"24\" valign=\"bottom\" /> Alexey Chernyshov ([@ft502](https://dribbble.com/ft502) on Dribbble) - For such a beautiful logo!\n\n<img src=\"https://github.com/slackhq.png\" alt=\"@slackhq\" width=\"24\" height=\"24\" valign=\"bottom\" /> SlackHQ ([@slackhq](https://github.com/slackhq)) - For such a wonderful product and API!\n\n## :black_nib: &nbsp; Author\n\n<img src=\"https://github.com/raycharius.png\" alt=\"@raycharius\" width=\"24\" height=\"24\" valign=\"bottom\" /> Ray East ([@raycharius](https://github.com/raycharius)) - Huge Fan of Slack and **Block Builder** Maintainer\n","readmeFilename":"README.md","gitHead":"e51dd05c525d568955c1550a5dee720d15063767","_id":"slack-block-builder@2.0.0-beta.2","_nodeVersion":"14.1.0","_npmVersion":"6.14.4","dist":{"integrity":"sha512-f66OWGvpP4sfwqelhH3BMJMr6HutJK2ZIQywYiJLM7+2gw9IexqYO8fmoqClh0ymHWdNGrV5I6jFI10TdEko0g==","shasum":"59e0e90f427adf9755e7f4857d49ace7c77bb87b","tarball":"https://registry.npmjs.org/slack-block-builder/-/slack-block-builder-2.0.0-beta.2.tgz","fileCount":162,"unpackedSize":248780,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgpnr2CRA9TVsSAnZWagAAbjYP/RaOas9ksGKDnNwgcRQT\nXwMY135ao6PlN28KnX7fzAGWgvygRFNpSYb0CAgq21eYIoAyUhDezZYMRIRl\nKkTiW+ZNE49QL7qdP+CqC4pM4yuyAJw6Qm8HP1+e3o6w2PdLpUZepBq51YAL\nN1BXtw2jAJ0gj222smGzWHpZZ+YPcf7lBoImvuT21nmHoo+tGnxhwHxhT+Xv\nqGNyPZH9HiDV3hPAaxVCFZ1MqdpWdgQOj1BKOdhZHt5ObLWTIQS+OLOeeiqi\nGIu9S9pS7GKEsDvu+LzcHwKFeXv6CNvHM6sOKlqdfyEHq2CFATTbyU1J/pee\nz61HQr4w9ZmdhGZt9nxNtubn0lerurc/9ci/MZxuRUhjPvUzYx7/UjgBNNLO\nymDRJ/zMujRcgXX30q0XYQEE2+ZR72tVt41XJ3mUFqUBJ/2h5DsGSqDPywt6\nLbgqAuoFcaMTt0qua2eh3+M6dQbXMZKB1GnZ/lU0hCu5CLts9oxOgJ7Q692/\n1b0pdxCgYYsv0KmU1rP/ev6/n1v8K0VDiTZZKOP+3zKdASPy1RgTJhfGMBpE\nI5syi5oZxT/cXvVTgWGEjoZ1Y2I54zWozu4IEieLWdGR7hFbcM+8FF1hBtgf\ngbZx1XDtPLMrpMwVIYlArqeLSldsJA1IxRcWhZraLhzq3H8rMK+O3htGBXJE\nE5yr\r\n=9dox\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCLRb7u+BH7ttrudp0sjjearhzdCFpz8fS1Q3QCSbXI6wIgWLAFcepZoJieRotToEubuuNu/YWlDQz96yXCIJHPiQM="}]},"_npmUser":{"name":"raycharius","email":"raydeast@gmail.com"},"directories":{},"maintainers":[{"name":"bravecow","email":"neporozhniy@gmail.com"},{"name":"raycharius","email":"raydeast@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/slack-block-builder_2.0.0-beta.2_1621523189616_0.8118414430570033"},"_hasShrinkwrap":false},"2.0.0-beta.3":{"name":"slack-block-builder","version":"2.0.0-beta.3","description":"Maintainable code for interactive Slack messages, modals, home tabs, and workflow steps. A must-have for the Slack Block Kit framework.","author":{"name":"Ray East","url":"https://github.com/raycharius"},"repository":{"type":"git","url":"git+https://github.com/raycharius/slack-block-builder.git"},"homepage":"https://blockbuilder.dev","bugs":{"url":"https://github.com/raycharius/slack-block-builder/issues"},"main":"./dist/index.js","types":"./dist/index.d.ts","license":"MIT","keywords":["slack","interactive-messages","block-actions","bot","slack-bot","modal","block","kit","swiftui","bot","modal","messages","message-builder","block-builder","slack-block-builder","block-kit","blocks","botkit","bolt","slack-bolt"],"scripts":{"src:build":"tsc -p ./tsconfig.json","src:lint":"eslint 'src/**/*.ts' --fix","docs:build":"tsc -p ./tsconfig.docs.json","docs:lint":"eslint 'docs-generator/**/*.ts' --fix","predocs:generate":"npm run docs:build","docs:generate":"node docs-generator-dist/index.js","docs:local":"docsify serve docs-generator --port 3000","tests:lint":"eslint 'tests/**/*.ts' --fix","tests:coverage":"codecov","clean":"shx rm -rf ./dist ./coverage ./docs-generator-dist","test":"jest --coverage","build":"npm run src:build","lint":"eslint 'src/**/*.ts' 'tests/**/*.ts' 'docs-generator/**/*.ts'","lint:fix":"eslint 'src/**/*.ts' 'tests/**/*.ts' 'docs-generator/**/*.ts' --fix","madge":"npx madge --circular --warning --extensions ts ./"},"devDependencies":{"@types/jest":"^26.0.22","@typescript-eslint/eslint-plugin":"^4.20.0","@typescript-eslint/parser":"^4.20.0","codecov":"^3.8.1","docsify-cli":"^4.4.3","docsify-server-renderer":"^4.12.1","docsify-tabs":"^1.4.4","eslint":"^6.8.0","eslint-config-airbnb-base":"^14.1.0","eslint-config-airbnb-typescript":"^12.3.1","eslint-plugin-import":"^2.22.1","eslint-plugin-jsx-a11y":"^6.4.1","eslint-plugin-react":"^7.23.1","eslint-plugin-react-hooks":"^4.2.0","jest":"^26.6.3","jest-environment-jsdom":"^26.6.2","madge":"^4.0.2","mustache":"^4.2.0","prettier-eslint-cli":"^5.0.0","shx":"^0.3.3","ts-jest":"^26.5.4","ts-node":"^8.10.2","typescript":"^4.2.3"},"readme":"<p align=\"center\">\n    <img src=\"https://raw.githubusercontent.com/raycharius/slack-block-builder/master/resources/images/main/logo-horizontal.png\" alt=\"Logo\" width=\"600px\">\n</p>\n\n<p align=\"center\">\n    <h3 align=\"center\">Maintainable code for Slack interactive messages, modals, and home tabs.</h3>\n</p>\n\n<p align=\"center\">\n    Lightweight, zero-dependency library for declaratively building Slack Block Kit UI.\n    <br />\n    <br />\n    <a href=\"https://blockbuilder.dev\" target=\"_blank\"><strong>View the Docs »</strong></a>\n    <br />\n    <br />\n    <a href=\"#space_invader--usage\">Quick Start Guide</a>\n    ·\n    <a href=\"https://github.com/raycharius/slack-block-builder/issues\">Request Feature</a>\n    ·\n    <a href=\"https://github.com/raycharius/slack-block-builder/issues\">Report Bug</a>\n  </p>\n</p>\n\n![An example of using Block Builder](resources/images/main/hero-image.png)\n\n***\n\n[![npm](https://img.shields.io/npm/v/slack-block-builder?color=bright-green)](https://www.npmjs.com/package/slack-block-builder)\n![NPM](https://img.shields.io/npm/l/slack-block-builder?color=bright-green)\n[![codecov](https://codecov.io/gh/raycharius/slack-block-builder/branch/master/graph/badge.svg)](https://codecov.io/gh/raycharius/slack-block-builder)\n\n> :tada: **Block Builder Version 2.0 is now in beta! Learn about the new features and how to install it [here](docs/announcements/version-2.md).**\n\n**Block Builder** helps you keep your Slack app code for UI maintainable, testable, and reusable. It has a declarative, chainable syntax inspired by [SwiftUI](https://developer.apple.com/documentation/swiftui) and is built for better UI architecture.\n\n### :zap: &nbsp; Features\n\n* Declarative [SwiftUI](https://developer.apple.com/xcode/swiftui/) inspired syntax.\n* The ability to build more complex flows using loops and conditionals.\n* A `printPreviewURL()` method that outputs a link to preview your UI on Slack's [Block Kit Builder website](https://app.slack.com/block-kit-builder) for easier prototyping.\n* In-depth [doc site](https://blockbuilder.dev) at [https://blockbuilder.dev](https://blockbuilder.dev).\n* [Support](#block-kit-support-and-reference) for all current Slack Block Kit objects.\n* A great TypeScript experience.\n* Extensive JSDoc hints with explanations, validation rules, and quick links to full documentation.\n* Zero dependencies.\n\n### :rocket: &nbsp; Coming Soon\n\n* `Paginator` component.\n* `Accordion` component.\n\n### :gift: &nbsp; Benefits\n\n* Write three times less code.\n* Build more sophistocated, elegant flows.\n* Design better UI architecture for your Slack apps.\n* Focus more on code in your IDE than on studying the [Slack API docs](https://api.slack.com/).\n* Easily integrate localizations into your app.\n\n### :phone: &nbsp; Let's Talk?\n\nFeedback – love it! Aside from GitHub Issues, there are Slack channels available in popular bot communities to discuss **Block Builder** – we'll see you there! :raised_hands:\n\n* **Slack Community** – [\\#block-builder](https://slackcommunity.com)\n* **Bot Developer Hangout** – [\\#block-builder](https://community.botkit.ai)\n\n### :floppy_disk: &nbsp; Installation \n\n#### Using NPM: \n\n``` bash\nnpm install --save slack-block-builder\n```\n\n#### Using Yarn: \n\n``` bash\nyarn add slack-block-builder\n```\n\n### :space_invader: &nbsp; Usage\n\nFor full documentation, make sure you head over to [https://blockbuilder.dev](https://blockbuilder.dev).\n\n\n### Importing\n\nThe functions for creating objects can be both imported directly or through an object that groups them by category.\n\n```javascript\n// Importing exposed groups of objects\n\nimport { Surfaces, Blocks, Elements, Bits, Utilities } from 'slack-block-builder';\n\n// Importing objects top-level\n\nimport { Modal, Section, Actions, Button } from 'slack-block-builder';\n```\n\n### Group Explanations\n\n`Surfaces` – Contains functions for creating modals, messages, home tabs, and workflow steps. \n\n`Blocks` – Layout blocks used to organize the UI.\n\n`Elements` – UI elements that are used to capture user interaction.\n\n`Bits` – These are composition objects and other bits and pieces from Slack's docs. Included are `Attachment`, `Options`, `OptionGroup`, and `ConfirmationDialog`. They felt like they were deserving of their own category.\n\n`Utilities` – A group of utility functions. See [Utility Functions](#utility-functions).\n\n### Block Kit Support and Reference\n\nBelow is a list of supported objects and how to access them in **Block Builder**:\n\n| **Name**             | **Type**           | **Support**                    | **Accessed Via**                      \n|----------------------|--------------------|--------------------------------|-----------------------------------------\n| Home Tab             | Surface            | :white_check_mark:             | `Surfaces.HomeTab()`                       \n| Message              | Surface            | :white_check_mark:             | `Surfaces.Message()`                       \n| Modal                | Surface            | :white_check_mark:             | `Surfaces.Modal()`                         \n| Workflow Step        | Surface            | :white_check_mark:             | `Surfaces.WorkflowStep()`                         \n| Actions              | Block              | :white_check_mark:             | `Blocks.Actions()`                \n| Context              | Block              | :white_check_mark:             | `Blocks.Context()`                \n| Divider              | Block              | :white_check_mark:             | `Blocks.Divider()`                \n| File                 | Block              | :white_check_mark:             | `Blocks.File()`\n| Header               | Block              | :white_check_mark:             | `Blocks.Header()`\n| Image                | Block              | :white_check_mark:             | `Blocks.Image()`                  \n| Input                | Block              | :white_check_mark:             | `Blocks.Input()`                  \n| Section              | Block              | :white_check_mark:             | `Blocks.Section()`                \n| Button               | Element            | :white_check_mark:️             | `Elements.Button()`               \n| Checkboxes           | Element            | :white_check_mark:             | `Elements.Checkboxes()`           \n| Date Picker          | Element            | :white_check_mark:             | `Elements.DatePicker()`\n| Time Picker          | Element            | :white_check_mark:             | `Elements.TimePicker()`           \n| Image                | Element            | :white_check_mark:             | `Elements.Img()`                  \n| Overflow Menu        | Element            | :white_check_mark:             | `Elements.OverflowMenu()`         \n| Radio Buttons        | Element            | :white_check_mark:             | `Elements.RadioButtons()`         \n| Plain-Text Input     | Element            | :white_check_mark:             | `Elements.TextInput()`            \n| Select Menus         | Element            | :white_check_mark:             | `Elements.[Type]Select()`          \n| Multi-Select Menus   | Element            | :white_check_mark:             | `Elements.[Type]MultiSelect()`     \n| Option               | Composition Object | :white_check_mark:             | `Bits.Option()`                   \n| Confirm Dialog       | Composition Object | :white_check_mark:             | `Bits.ConfirmationDialog()`       \n| Option Group         | Composition Object | :white_check_mark:             | `Bits.OptionGroup()`\n| Attachment           | Legacy Feature     | :white_check_mark:             | `Bits.Attachment()`              \n\n### Creating a Simple Interactive Message\n\nLet's take a look at how to compose an interactive message. Even though [Slack](https://slack.com) now has modals, these have always been the basis for [Slack](https://slack.com) apps.\n\nFunctions that return Block Kit objects have setter methods for all of the properties, but also support parameters that are passed into the constructor for properties with primitive types.\n\n```javascript\nimport { Message, Blocks, Elements } from 'slack-block-builder';\n\nconst myMessage = ({ channel, dangerLevel }) => {\n  return Message()\n    .channel(channel)\n    .text('Alas, my friend.')\n    .blocks(\n      Blocks.Section()\n        .text('One does not simply walk into Slack and click a button.'),\n      Blocks.Section()\n        .text('At least that\\'s what my friend Slackomir said :crossed_swords:'),\n      Blocks.Divider(),\n      Blocks.Actions()\n        .elements(\n          Elements.Button()\n            .text('Sure One Does')\n            .actionId('gotClicked')\n            .danger(dangerLevel > 42), // Optional argument, defaults to 'true'\n          Elements.Button()\n            .text('One Does Not')\n            .actionId('scaredyCat')\n            .primary()))\n    .asUser()\n    .buildToJSON();\n};\n```\n\nAnd now an example with using both the setter methods and passing parameters into the functions at initiation:\n\n```javascript\nimport { Message, Blocks, Elements } from 'slack-block-builder';\n\nconst myShorterMessage = ({ channel, dangerLevel }) => {\n  return Message({ channel, text: 'Alas, my friend.' })\n    .blocks(\n      Blocks.Section({ text: 'One does not simply walk into Slack and click a button.' }),\n      Blocks.Section({ text: 'At least that\\'s what my friend Slackomir said :crossed_swords:' }),\n      Blocks.Divider(),\n      Blocks.Actions()\n        .elements(\n          Elements.Button({ text: 'Sure One Does', actionId: 'gotClicked' })\n            .danger(dangerLevel > 42), // Optional argument, defaults to 'true'\n          Elements.Button({ text: 'One Does Not', actionId: 'scaredyCat' })\n            .primary()))\n    .asUser()\n    .buildToJSON();\n};\n```\n\nBoth of these examples render the message below. And the best part? It only took 15 lines of code, as opposed to the 44 lines of JSON generated as a result. \n\n![An example of using Block Builder for Messages](resources/images/main/simple-message-example.png)\n\n[**View Example on Slack Block Kit Builder Website**](https://app.slack.com/block-kit-builder#%7B%22blocks%22:%5B%7B%22type%22:%22section%22,%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22One%20does%20not%20simply%20walk%20into%20Slack%20and%20click%20a%20button.%22%7D%7D,%7B%22type%22:%22section%22,%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22At%20least%20that's%20what%20my%20friend%20Slackomir%20said%20:crossed_swords:%22%7D%7D,%7B%22type%22:%22divider%22%7D,%7B%22type%22:%22actions%22,%22elements%22:%5B%7B%22type%22:%22button%22,%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22Sure%20One%20Does%22%7D,%22action_id%22:%22gotClicked%22,%22style%22:%22danger%22%7D,%7B%22type%22:%22button%22,%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22One%20Does%20Not%22%7D,%22action_id%22:%22scaredyCat%22,%22style%22:%22primary%22%7D%5D%7D%5D%7D)\n\n### Creating a Simple Modal\n\nLet's take a look at how modals are created. Here we'll also take a look at working with Bits and with loops, by adding options with the `Array.map()` method.\n\nYou'll noticed that we've added an inline condition that returns an initial option only if one has been passed into the function. This is because all the setter methods prune values of `undefined`, uncovering opportunities for inline logic. \n\n```javascript\nimport { Modal, Blocks, Elements, Bits } from 'slack-block-builder';\n\nconst myShorterModal = ({ menuOptions, selected }) => {\n  return Modal({ title: 'PizzaMate', submit: 'Get Fed' })\n    .blocks(\n      Blocks.Section({ text: 'Hey there, colleague!' }),\n      Blocks.Section({ text: 'Hurray for corporate pizza! Let\\'s get you fed and happy :pizza:' }),\n      Blocks.Input({ label: 'What can we call you?' })\n        .element(\n          Elements.TextInput({ placeholder: 'Hi, my name is... (What?!) (Who?!)' })\n            .actionId('name')),\n      Blocks.Input({ label: 'Which floor are you on?' })\n        .element(\n          Elements.TextInput({ placeholder: 'HQ – Fifth Floor' })\n            .actionId('floor')),\n      Blocks.Input({ label: 'What\\'ll you have?' })\n        .element(\n          Elements.StaticSelect({ placeholder: 'Choose your favorite...' })\n            .actionId('item')\n            .options(menuOptions\n              .map((item) => Bits.Option({ text: item.name, value: item.id })))\n            .initialOption(selected && Bits.Option({ text: selected.name, value: selected.id }))))\n    .buildToJSON();\n};\n```\n\nBoth of these examples render the modal below. \n\n![An example of using Block Builder for Modals](resources/images/main/simple-modal-example.png)\n\n[**View Example on Slack Block Kit Builder Website**](https://app.slack.com/block-kit-builder#%7B%22type%22:%22modal%22,%22title%22:%7B%22type%22:%22plain_text%22,%22text%22:%22PizzaMate%22%7D,%22blocks%22:%5B%7B%22type%22:%22section%22,%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22Hey%20there,%20colleague!%22%7D%7D,%7B%22type%22:%22section%22,%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22Hurray%20for%20corporate%20pizza!%20Let's%20get%20you%20fed%20and%20happy%20:pizza:%22%7D%7D,%7B%22type%22:%22input%22,%22label%22:%7B%22type%22:%22plain_text%22,%22text%22:%22What%20can%20we%20call%20you?%22%7D,%22element%22:%7B%22type%22:%22plain_text_input%22,%22action_id%22:%22name%22,%22placeholder%22:%7B%22type%22:%22plain_text%22,%22text%22:%22Hi,%20my%20name%20is...%20(What?!)%20(Who?!)%22%7D%7D%7D,%7B%22type%22:%22input%22,%22label%22:%7B%22type%22:%22plain_text%22,%22text%22:%22Which%20floor%20are%20you%20on?%22%7D,%22element%22:%7B%22type%22:%22plain_text_input%22,%22action_id%22:%22floor%22,%22placeholder%22:%7B%22type%22:%22plain_text%22,%22text%22:%22HQ%20–%20Fifth%20Floor%22%7D%7D%7D,%7B%22type%22:%22input%22,%22label%22:%7B%22type%22:%22plain_text%22,%22text%22:%22What'll%20you%20have?%22%7D,%22element%22:%7B%22type%22:%22static_select%22,%22placeholder%22:%7B%22type%22:%22plain_text%22,%22text%22:%22Choose%20your%20favorite...%22%7D,%22action_id%22:%22item%22,%22options%22:%5B%7B%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22:cheese_wedge:%20With%20Cheeze%22%7D,%22value%22:%22012%22%7D,%7B%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22:fish:%20With%20Anchovies%22%7D,%22value%22:%22013%22%7D,%7B%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22:cookie:%20With%20Scooby%20Snacks%22%7D,%22value%22:%22014%22%7D,%7B%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22:beer:%20I%20Prefer%20Steak%20and%20Beer%22%7D,%22value%22:%22015%22%7D%5D%7D%7D%5D,%22submit%22:%7B%22type%22:%22plain_text%22,%22text%22:%22Get%20Fed%22%7D%7D)\n\n### Utility Functions\n\nThe `Utilities` object contains various utility functions. Currently, there are two:\n\n`BlockCollection()` – Accepts multiple arguments or an array of blocks and returns them in an array, in their built state.\n\n`AttachmentCollection()` – Accepts multiple arguments or an array of attachments and returns them in an array, in their built state.\n\nThese two functions are useful when you wish to keep surface or view configuration separate from UI representation.\n\nAn example using Slack's `WebClient` from their [SDK for Node.js](https://github.com/slackapi/node-slack-sdk):\n\n```javascript\nimport { BlockCollection, AttachmentCollection, Blocks } from 'slack-block-builder';\nimport { WebClient } from '@slack/web-api';\n\nconst client = new WebClient(process.env.SLACK_TOKEN);\n\nclient.chat.postMessage({\n  channel: 'ABCDEFG',\n  text: 'Hello, my dear, sweet world!',\n  blocks: BlockCollection( /* Pass in blocks */ ),\n  attachments: AttachmentCollection( /* Pass in attachments */ ),\n})\n.then((response) => console.log(response))\n.catch((error) => console.log(error));\n```\n\nAnother example where you might find `BlockCollection()` helpful is when [unfurling links in messages](https://api.slack.com/reference/messaging/link-unfurling):\n\n```javascript\nimport { BlockCollection, Blocks } from 'slack-block-builder';\nimport { WebClient } from '@slack/web-api';\n\nconst client = new WebClient(process.env.SLACK_TOKEN);\n\nconst unfurl = ({ channel, ts, url }) => client.chat.unfurl({\n  channel,\n  ts,\n  unfurls: { [url]: BlockCollection( /* Pass in blocks */ ) },\n})\n.then((response) => console.log(response))\n.catch((error) => console.log(error));\n```\n\n## :link: &nbsp; Other Useful Slack-Related Projects\n\n[Bolt for JavaScript](https://github.com/SlackAPI/bolt) – A simple framework for building [Slack](https://slack.com) apps, developed by [Slack](https://slack.com) themselves.\n\n[Node Slack SDK](https://github.com/slackapi/node-slack-sdk) – A great and powerful SDK for building [Slack](https://slack.com) Apps from the ground up.\n\n## :fire: &nbsp; Acknowledgements\n \n<img src=\"https://github.com/korywka.png\" alt=\"@korywka\" width=\"24\" height=\"24\" valign=\"bottom\" /> Taras Neporozhniy ([@korywka](https://github.com/korywka)) - For help and ideas along the way!\n\n<img src=\"https://cdn.dribbble.com/users/683635/avatars/normal/ee2c7c826bfe244b573d145376fe0b5a.png?1510328842\" alt=\"@ft502\" width=\"24\" height=\"24\" valign=\"bottom\" /> Alexey Chernyshov ([@ft502](https://dribbble.com/ft502) on Dribbble) - For such a beautiful logo!\n\n<img src=\"https://github.com/slackhq.png\" alt=\"@slackhq\" width=\"24\" height=\"24\" valign=\"bottom\" /> SlackHQ ([@slackhq](https://github.com/slackhq)) - For such a wonderful product and API!\n\n## :black_nib: &nbsp; Author\n\n<img src=\"https://github.com/raycharius.png\" alt=\"@raycharius\" width=\"24\" height=\"24\" valign=\"bottom\" /> Ray East ([@raycharius](https://github.com/raycharius)) - Huge Fan of Slack and **Block Builder** Maintainer\n","readmeFilename":"README.md","gitHead":"60445041e40b6dc2c30eef1ec60498250647278d","_id":"slack-block-builder@2.0.0-beta.3","_nodeVersion":"14.1.0","_npmVersion":"6.14.4","dist":{"integrity":"sha512-5F0+5kk1HdmB4QTJuqpJqkT9vnpSCoFNyV9k0qQX7+WEsXoiBMt8EOu8ciuiUcplDEMtEJ1YgllMoIEIsia69Q==","shasum":"86c7e7b7973fe8a9165ad50502acec44b578b2ab","tarball":"https://registry.npmjs.org/slack-block-builder/-/slack-block-builder-2.0.0-beta.3.tgz","fileCount":162,"unpackedSize":248810,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgpnxcCRA9TVsSAnZWagAAeAMP/1CUkWqIQ7DlGwauDHEs\nxOU2zCm3fXcqa4JetiuwufCOB5V7ch3hTxkxV3Jm83KKLWuvXPpOZI84Eivu\nPKb8514EhO0q91Gt51kpmTxbtSfzpyX0XNL338Nzg+wT31Hv05ffhLIxDBOb\n0+5IRW5e7xcMb54YmTeV6D8vPni2YlCSipS8VTN8vm8PVJAw5c1j+ImTmThq\nDusveCeVCI8JnaFLrUdQksdySXYqkn1YI4DKzYzF6Zi9p8mEkkVVnYLWPFrY\np6CbsE8UmSRBHQNY6S5yNGHdRBvpfjSvWr+tFWColUVj0qxxonuwuSGGeAvL\nc6eQ41oCqdCYt2nIVL5Zh6J4Hx0jg1qngaC+BtvUtIIyDpXcknMvKJrA7XsQ\n6MQniVumTGF6wXxuYSwqR2UFWtpHlorNpf/0ig6u3G+HotlqzxQPcoGMFxQM\ntUGCPK4uioJp/lYCU/9v7Ovvo8nDme/JSGxIVx0EAScZhQwPWFOvMmHWyDto\nTKmZEw98h+XeuqSgxpSlowDzlGhEmsUsG67jWB8gtFc/OlBRpcFI2FjDBL6+\ncm08qHpMFp/vWqq/yzSN3FKGeXcvSCpMJ+LpsEAzD/ZXcdhrdWs/MrPcXAtZ\nNSLsY/98kPvAvcPFjOiEKIbnfClr8AeuYFNDNm7Adr7ZOBh3ydtwNbkwjh72\n8+6p\r\n=2I/4\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCOO25kOX/GeXz7cf5dMDWfZ8lzDtVkXXWO6he/qc6i6wIhAJSysovvM0G1bvAmeAJXj/Icbblt7LfBtsiBLoDr3wzQ"}]},"_npmUser":{"name":"raycharius","email":"raydeast@gmail.com"},"directories":{},"maintainers":[{"name":"bravecow","email":"neporozhniy@gmail.com"},{"name":"raycharius","email":"raydeast@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/slack-block-builder_2.0.0-beta.3_1621523547706_0.2442710853029637"},"_hasShrinkwrap":false},"2.0.0-beta.4":{"name":"slack-block-builder","version":"2.0.0-beta.4","description":"Maintainable code for interactive Slack messages, modals, home tabs, and workflow steps. A must-have for the Slack Block Kit framework.","author":{"name":"Ray East","url":"https://github.com/raycharius"},"repository":{"type":"git","url":"git+https://github.com/raycharius/slack-block-builder.git"},"homepage":"https://blockbuilder.dev","bugs":{"url":"https://github.com/raycharius/slack-block-builder/issues"},"main":"./dist/index.js","types":"./dist/index.d.ts","license":"MIT","keywords":["slack","interactive-messages","block-actions","bot","slack-bot","modal","block","kit","swiftui","bot","modal","messages","message-builder","block-builder","slack-block-builder","block-kit","blocks","botkit","bolt","slack-bolt"],"scripts":{"src:build":"tsc -p ./tsconfig.json","src:lint":"eslint 'src/**/*.ts' --fix","docs:build":"tsc -p ./tsconfig.docs.json","docs:lint":"eslint 'docs-generator/**/*.ts' --fix","predocs:generate":"npm run docs:build","docs:generate":"node docs-generator-dist/index.js","docs:local":"docsify serve docs-generator --port 3000","tests:lint":"eslint 'tests/**/*.ts' --fix","tests:coverage":"codecov","clean":"shx rm -rf ./dist ./coverage ./docs-generator-dist","test":"jest --coverage","build":"npm run src:build","lint":"eslint 'src/**/*.ts' 'tests/**/*.ts' 'docs-generator/**/*.ts'","lint:fix":"eslint 'src/**/*.ts' 'tests/**/*.ts' 'docs-generator/**/*.ts' --fix","madge":"npx madge --circular --warning --extensions ts ./"},"devDependencies":{"@types/jest":"^26.0.22","@typescript-eslint/eslint-plugin":"^4.20.0","@typescript-eslint/parser":"^4.20.0","codecov":"^3.8.1","docsify-cli":"^4.4.3","docsify-server-renderer":"^4.12.1","docsify-tabs":"^1.4.4","eslint":"^6.8.0","eslint-config-airbnb-base":"^14.1.0","eslint-config-airbnb-typescript":"^12.3.1","eslint-plugin-import":"^2.22.1","eslint-plugin-jsx-a11y":"^6.4.1","eslint-plugin-react":"^7.23.1","eslint-plugin-react-hooks":"^4.2.0","jest":"^26.6.3","jest-environment-jsdom":"^26.6.2","madge":"^4.0.2","mustache":"^4.2.0","prettier-eslint-cli":"^5.0.0","shx":"^0.3.3","ts-jest":"^26.5.4","ts-node":"^8.10.2","typescript":"^4.2.3"},"readme":"<p align=\"center\">\n    <img src=\"https://raw.githubusercontent.com/raycharius/slack-block-builder/master/resources/images/main/logo-horizontal.png\" alt=\"Logo\" width=\"600px\">\n</p>\n\n<p align=\"center\">\n    <h3 align=\"center\">Maintainable code for Slack interactive messages, modals, and home tabs.</h3>\n</p>\n\n<p align=\"center\">\n    Lightweight, zero-dependency library for declaratively building Slack Block Kit UI.\n    <br />\n    <br />\n    <a href=\"https://blockbuilder.dev\" target=\"_blank\"><strong>View the Docs »</strong></a>\n    <br />\n    <br />\n    <a href=\"#space_invader--usage\">Quick Start Guide</a>\n    ·\n    <a href=\"https://github.com/raycharius/slack-block-builder/issues\">Request Feature</a>\n    ·\n    <a href=\"https://github.com/raycharius/slack-block-builder/issues\">Report Bug</a>\n  </p>\n</p>\n\n![An example of using Block Builder](resources/images/main/hero-image.png)\n\n***\n\n[![npm](https://img.shields.io/npm/v/slack-block-builder?color=bright-green)](https://www.npmjs.com/package/slack-block-builder)\n![NPM](https://img.shields.io/npm/l/slack-block-builder?color=bright-green)\n[![codecov](https://codecov.io/gh/raycharius/slack-block-builder/branch/master/graph/badge.svg)](https://codecov.io/gh/raycharius/slack-block-builder)\n\n> :tada: **Block Builder Version 2.0 is now in beta! Learn about the new features and how to install it [here](docs/announcements/version-2.md).**\n\n**Block Builder** helps you keep your Slack app code for UI maintainable, testable, and reusable. It has a declarative, chainable syntax inspired by [SwiftUI](https://developer.apple.com/documentation/swiftui) and is built for better UI architecture.\n\n### :zap: &nbsp; Features\n\n* Declarative [SwiftUI](https://developer.apple.com/xcode/swiftui/) inspired syntax.\n* The ability to build more complex flows using loops and conditionals.\n* A `printPreviewURL()` method that outputs a link to preview your UI on Slack's [Block Kit Builder website](https://app.slack.com/block-kit-builder) for easier prototyping.\n* A set of helper functions for formatting text with Slack's markdown standard.\n* In-depth [doc site](https://blockbuilder.dev) at [https://blockbuilder.dev](https://blockbuilder.dev).\n* [Support](#block-kit-support-and-reference) for all current Slack Block Kit objects.\n* A great TypeScript experience.\n* Extensive JSDoc hints with explanations, validation rules, and quick links to full documentation.\n* Zero dependencies.\n\n### :rocket: &nbsp; Coming Soon\n\n* `Paginator` component.\n* `Accordion` component.\n\n### :gift: &nbsp; Benefits\n\n* Write three times less code.\n* Build more sophistocated, elegant flows.\n* Design better UI architecture for your Slack apps.\n* Focus more on code in your IDE than on studying the [Slack API docs](https://api.slack.com/).\n* Easily integrate localizations into your app.\n\n### :phone: &nbsp; Let's Talk?\n\nFeedback – love it! Aside from GitHub Issues, there are Slack channels available in popular bot communities to discuss **Block Builder** – we'll see you there! :raised_hands:\n\n* **Slack Community** – [\\#block-builder](https://slackcommunity.com)\n* **Bot Developer Hangout** – [\\#block-builder](https://community.botkit.ai)\n\n### :floppy_disk: &nbsp; Installation \n\n#### Using NPM: \n\n``` bash\nnpm install --save slack-block-builder\n```\n\n#### Using Yarn: \n\n``` bash\nyarn add slack-block-builder\n```\n\n### :space_invader: &nbsp; Usage\n\nFor full documentation, make sure you head over to [https://blockbuilder.dev](https://blockbuilder.dev).\n\n\n### Importing\n\nThe functions for creating objects can be both imported directly or through an object that groups them by category.\n\n```javascript\n// Importing exposed groups of objects\n\nimport { Surfaces, Blocks, Elements, Bits, Utilities } from 'slack-block-builder';\n\n// Importing objects top-level\n\nimport { Modal, Section, Actions, Button } from 'slack-block-builder';\n```\n\nThe same goes for importing Slack markdown helper functions:\n\n```javascript\n// Importing the Md object\n\nimport { Surfaces, Blocks, Md } from 'slack-block-builder';\n\n// Importing the functions top-level\n\nimport { Modal, Section, bold, link } from 'slack-block-builder';\n```\n\n### Group Explanations\n\n`Surfaces` – Contains functions for creating modals, messages, home tabs, and workflow steps. \n\n`Blocks` – Layout blocks used to organize the UI.\n\n`Elements` – UI elements that are used to capture user interaction.\n\n`Bits` – These are composition objects and other bits and pieces from Slack's docs. Included are `Attachment`, `Options`, `OptionGroup`, and `ConfirmationDialog`. They felt like they were deserving of their own category.\n\n`Utilities` – A group of utility functions. See [Utility Functions](#utility-functions).\n\n`Md` – Helper functions for formatting text with Slack's markdown. See [Markdown Helpers](#markdown-helpers).\n\n### Block Kit Support and Reference\n\nBelow is a list of supported objects and how to access them in **Block Builder**:\n\n| **Name**             | **Type**           | **Support**                    | **Accessed Via**                      \n|----------------------|--------------------|--------------------------------|-----------------------------------------\n| Home Tab             | Surface            | :white_check_mark:             | `Surfaces.HomeTab()`                       \n| Message              | Surface            | :white_check_mark:             | `Surfaces.Message()`                       \n| Modal                | Surface            | :white_check_mark:             | `Surfaces.Modal()`                         \n| Workflow Step        | Surface            | :white_check_mark:             | `Surfaces.WorkflowStep()`                         \n| Actions              | Block              | :white_check_mark:             | `Blocks.Actions()`                \n| Context              | Block              | :white_check_mark:             | `Blocks.Context()`                \n| Divider              | Block              | :white_check_mark:             | `Blocks.Divider()`                \n| File                 | Block              | :white_check_mark:             | `Blocks.File()`\n| Header               | Block              | :white_check_mark:             | `Blocks.Header()`\n| Image                | Block              | :white_check_mark:             | `Blocks.Image()`                  \n| Input                | Block              | :white_check_mark:             | `Blocks.Input()`                  \n| Section              | Block              | :white_check_mark:             | `Blocks.Section()`                \n| Button               | Element            | :white_check_mark:️             | `Elements.Button()`               \n| Checkboxes           | Element            | :white_check_mark:             | `Elements.Checkboxes()`           \n| Date Picker          | Element            | :white_check_mark:             | `Elements.DatePicker()`\n| Time Picker          | Element            | :white_check_mark:             | `Elements.TimePicker()`           \n| Image                | Element            | :white_check_mark:             | `Elements.Img()`                  \n| Overflow Menu        | Element            | :white_check_mark:             | `Elements.OverflowMenu()`         \n| Radio Buttons        | Element            | :white_check_mark:             | `Elements.RadioButtons()`         \n| Plain-Text Input     | Element            | :white_check_mark:             | `Elements.TextInput()`            \n| Select Menus         | Element            | :white_check_mark:             | `Elements.[Type]Select()`          \n| Multi-Select Menus   | Element            | :white_check_mark:             | `Elements.[Type]MultiSelect()`     \n| Option               | Composition Object | :white_check_mark:             | `Bits.Option()`                   \n| Confirm Dialog       | Composition Object | :white_check_mark:             | `Bits.ConfirmationDialog()`       \n| Option Group         | Composition Object | :white_check_mark:             | `Bits.OptionGroup()`\n| Attachment           | Legacy Feature     | :white_check_mark:             | `Bits.Attachment()`              \n\n### Creating a Simple Interactive Message\n\nLet's take a look at how to compose an interactive message. Even though [Slack](https://slack.com) now has modals, these have always been the basis for [Slack](https://slack.com) apps.\n\nFunctions that return Block Kit objects have setter methods for all of the properties, but also support parameters that are passed into the constructor for properties with primitive types.\n\n```javascript\nimport { Message, Blocks, Elements } from 'slack-block-builder';\n\nconst myMessage = ({ channel, dangerLevel }) => {\n  return Message()\n    .channel(channel)\n    .text('Alas, my friend.')\n    .blocks(\n      Blocks.Section()\n        .text('One does not simply walk into Slack and click a button.'),\n      Blocks.Section()\n        .text('At least that\\'s what my friend Slackomir said :crossed_swords:'),\n      Blocks.Divider(),\n      Blocks.Actions()\n        .elements(\n          Elements.Button()\n            .text('Sure One Does')\n            .actionId('gotClicked')\n            .danger(dangerLevel > 42), // Optional argument, defaults to 'true'\n          Elements.Button()\n            .text('One Does Not')\n            .actionId('scaredyCat')\n            .primary()))\n    .asUser()\n    .buildToJSON();\n};\n```\n\nAnd now an example with using both the setter methods and passing parameters into the functions at initiation:\n\n```javascript\nimport { Message, Blocks, Elements } from 'slack-block-builder';\n\nconst myShorterMessage = ({ channel, dangerLevel }) => {\n  return Message({ channel, text: 'Alas, my friend.' })\n    .blocks(\n      Blocks.Section({ text: 'One does not simply walk into Slack and click a button.' }),\n      Blocks.Section({ text: 'At least that\\'s what my friend Slackomir said :crossed_swords:' }),\n      Blocks.Divider(),\n      Blocks.Actions()\n        .elements(\n          Elements.Button({ text: 'Sure One Does', actionId: 'gotClicked' })\n            .danger(dangerLevel > 42), // Optional argument, defaults to 'true'\n          Elements.Button({ text: 'One Does Not', actionId: 'scaredyCat' })\n            .primary()))\n    .asUser()\n    .buildToJSON();\n};\n```\n\nBoth of these examples render the message below. And the best part? It only took 15 lines of code, as opposed to the 44 lines of JSON generated as a result. \n\n![An example of using Block Builder for Messages](resources/images/main/simple-message-example.png)\n\n[**View Example on Slack Block Kit Builder Website**](https://app.slack.com/block-kit-builder#%7B%22blocks%22:%5B%7B%22type%22:%22section%22,%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22One%20does%20not%20simply%20walk%20into%20Slack%20and%20click%20a%20button.%22%7D%7D,%7B%22type%22:%22section%22,%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22At%20least%20that's%20what%20my%20friend%20Slackomir%20said%20:crossed_swords:%22%7D%7D,%7B%22type%22:%22divider%22%7D,%7B%22type%22:%22actions%22,%22elements%22:%5B%7B%22type%22:%22button%22,%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22Sure%20One%20Does%22%7D,%22action_id%22:%22gotClicked%22,%22style%22:%22danger%22%7D,%7B%22type%22:%22button%22,%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22One%20Does%20Not%22%7D,%22action_id%22:%22scaredyCat%22,%22style%22:%22primary%22%7D%5D%7D%5D%7D)\n\n### Creating a Simple Modal\n\nLet's take a look at how modals are created. Here we'll also take a look at working with Bits and with loops, by adding options with the `Array.map()` method.\n\nYou'll noticed that we've added an inline condition that returns an initial option only if one has been passed into the function. This is because all the setter methods prune values of `undefined`, uncovering opportunities for inline logic. \n\n```javascript\nimport { Modal, Blocks, Elements, Bits } from 'slack-block-builder';\n\nconst myShorterModal = ({ menuOptions, selected }) => {\n  return Modal({ title: 'PizzaMate', submit: 'Get Fed' })\n    .blocks(\n      Blocks.Section({ text: 'Hey there, colleague!' }),\n      Blocks.Section({ text: 'Hurray for corporate pizza! Let\\'s get you fed and happy :pizza:' }),\n      Blocks.Input({ label: 'What can we call you?' })\n        .element(\n          Elements.TextInput({ placeholder: 'Hi, my name is... (What?!) (Who?!)' })\n            .actionId('name')),\n      Blocks.Input({ label: 'Which floor are you on?' })\n        .element(\n          Elements.TextInput({ placeholder: 'HQ – Fifth Floor' })\n            .actionId('floor')),\n      Blocks.Input({ label: 'What\\'ll you have?' })\n        .element(\n          Elements.StaticSelect({ placeholder: 'Choose your favorite...' })\n            .actionId('item')\n            .options(menuOptions\n              .map((item) => Bits.Option({ text: item.name, value: item.id })))\n            .initialOption(selected && Bits.Option({ text: selected.name, value: selected.id }))))\n    .buildToJSON();\n};\n```\n\nBoth of these examples render the modal below. \n\n![An example of using Block Builder for Modals](resources/images/main/simple-modal-example.png)\n\n[**View Example on Slack Block Kit Builder Website**](https://app.slack.com/block-kit-builder#%7B%22type%22:%22modal%22,%22title%22:%7B%22type%22:%22plain_text%22,%22text%22:%22PizzaMate%22%7D,%22blocks%22:%5B%7B%22type%22:%22section%22,%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22Hey%20there,%20colleague!%22%7D%7D,%7B%22type%22:%22section%22,%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22Hurray%20for%20corporate%20pizza!%20Let's%20get%20you%20fed%20and%20happy%20:pizza:%22%7D%7D,%7B%22type%22:%22input%22,%22label%22:%7B%22type%22:%22plain_text%22,%22text%22:%22What%20can%20we%20call%20you?%22%7D,%22element%22:%7B%22type%22:%22plain_text_input%22,%22action_id%22:%22name%22,%22placeholder%22:%7B%22type%22:%22plain_text%22,%22text%22:%22Hi,%20my%20name%20is...%20(What?!)%20(Who?!)%22%7D%7D%7D,%7B%22type%22:%22input%22,%22label%22:%7B%22type%22:%22plain_text%22,%22text%22:%22Which%20floor%20are%20you%20on?%22%7D,%22element%22:%7B%22type%22:%22plain_text_input%22,%22action_id%22:%22floor%22,%22placeholder%22:%7B%22type%22:%22plain_text%22,%22text%22:%22HQ%20–%20Fifth%20Floor%22%7D%7D%7D,%7B%22type%22:%22input%22,%22label%22:%7B%22type%22:%22plain_text%22,%22text%22:%22What'll%20you%20have?%22%7D,%22element%22:%7B%22type%22:%22static_select%22,%22placeholder%22:%7B%22type%22:%22plain_text%22,%22text%22:%22Choose%20your%20favorite...%22%7D,%22action_id%22:%22item%22,%22options%22:%5B%7B%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22:cheese_wedge:%20With%20Cheeze%22%7D,%22value%22:%22012%22%7D,%7B%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22:fish:%20With%20Anchovies%22%7D,%22value%22:%22013%22%7D,%7B%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22:cookie:%20With%20Scooby%20Snacks%22%7D,%22value%22:%22014%22%7D,%7B%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22:beer:%20I%20Prefer%20Steak%20and%20Beer%22%7D,%22value%22:%22015%22%7D%5D%7D%7D%5D,%22submit%22:%7B%22type%22:%22plain_text%22,%22text%22:%22Get%20Fed%22%7D%7D)\n\n### Utility Functions\n\nThe `Utilities` object contains various utility functions for creating UI. Currently, there are two:\n\n`BlockCollection()` – Accepts multiple arguments or an array of blocks and returns them in an array, in their built state.\n\n`AttachmentCollection()` – Accepts multiple arguments or an array of attachments and returns them in an array, in their built state.\n\nThese two functions are useful when you wish to keep surface or view configuration separate from UI representation.\n\nAn example using Slack's `WebClient` from their [SDK for Node.js](https://github.com/slackapi/node-slack-sdk):\n\n```javascript\nimport { BlockCollection, AttachmentCollection, Blocks } from 'slack-block-builder';\nimport { WebClient } from '@slack/web-api';\n\nconst client = new WebClient(process.env.SLACK_TOKEN);\n\nclient.chat.postMessage({\n  channel: 'ABCDEFG',\n  text: 'Hello, my dear, sweet world!',\n  blocks: BlockCollection( /* Pass in blocks */ ),\n  attachments: AttachmentCollection( /* Pass in attachments */ ),\n})\n.then((response) => console.log(response))\n.catch((error) => console.log(error));\n```\n\nAnother example where you might find `BlockCollection()` helpful is when [unfurling links in messages](https://api.slack.com/reference/messaging/link-unfurling):\n\n```javascript\nimport { BlockCollection, Blocks } from 'slack-block-builder';\nimport { WebClient } from '@slack/web-api';\n\nconst client = new WebClient(process.env.SLACK_TOKEN);\n\nconst unfurl = ({ channel, ts, url }) => client.chat.unfurl({\n  channel,\n  ts,\n  unfurls: { [url]: BlockCollection( /* Pass in blocks */ ) },\n})\n.then((response) => console.log(response))\n.catch((error) => console.log(error));\n```\n\n### Markdown Helpers\n\nOften you'll find that you need to format text in your messages and modals. *Block Builder* has helper functions available to simply that process. They are available both as members of the `Md` object and as top-level imports. You can find the full list of functions on the [Block Builder doc site](https://blockbuilder.dev):\n\n``` javascript\nimport { Message, Blocks, Md } from 'slack-block-builder';\n\nconst myMdMessage = ({ channel, user }) => {\n  const slashCommands = ['/schedule', '/cancel', '/remind', '/help'];\n\n  return Message({ channel, text: 'Alas, my friend.' })\n    .blocks(\n      Blocks.Section({ text: `:wave: Hi there, ${Md.user(user)}!` }),\n      Blocks.Section({ text: `${Md.italic('Sorry')}, I didn't get that. Why don't you try out some of my slash commands?` }),\n      Blocks.Section({ text: `Here are some of the things that I can do:` }),\n      Blocks.Section()\n        .text(Md.listBullet(slashCommands\n          .map((item) => Md.codeInline(item)))))\n    .asUser()\n    .buildToObject();\n};\n```\n\n[**View Example on Slack Block Kit Builder Website**](https://app.slack.com/block-kit-builder/#%7B%22blocks%22:%5B%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22:wave:%20Hi%20there,%20%3C@U03N067AL%3E%21%22%7D,%22type%22:%22section%22%7D,%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22_Sorry_,%20I%20didn%27t%20get%20that.%20Why%20don%27t%20you%20try%20out%20some%20of%20my%20slash%20commands?%22%7D,%22type%22:%22section%22%7D,%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22Here%20are%20some%20of%20the%20things%20that%20I%20can%20do:%22%7D,%22type%22:%22section%22%7D,%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22%E2%80%A2%20%60/schedule%60%5Cn%E2%80%A2%20%60/cancel%60%5Cn%E2%80%A2%20%60/remind%60%5Cn%E2%80%A2%20%60/help%60%22%7D,%22type%22:%22section%22%7D%5D%7D)\n \n## :link: &nbsp; Other Useful Slack-Related Projects\n\n[Bolt for JavaScript](https://github.com/SlackAPI/bolt) – A simple framework for building [Slack](https://slack.com) apps, developed by [Slack](https://slack.com) themselves.\n\n[Node Slack SDK](https://github.com/slackapi/node-slack-sdk) – A great and powerful SDK for building [Slack](https://slack.com) Apps from the ground up.\n\n## :fire: &nbsp; Acknowledgements\n \n<img src=\"https://github.com/korywka.png\" alt=\"@korywka\" width=\"24\" height=\"24\" valign=\"bottom\" /> Taras Neporozhniy ([@korywka](https://github.com/korywka)) - For help and ideas along the way!\n\n<img src=\"https://cdn.dribbble.com/users/683635/avatars/normal/ee2c7c826bfe244b573d145376fe0b5a.png?1510328842\" alt=\"@ft502\" width=\"24\" height=\"24\" valign=\"bottom\" /> Alexey Chernyshov ([@ft502](https://dribbble.com/ft502) on Dribbble) - For such a beautiful logo!\n\n<img src=\"https://github.com/slackhq.png\" alt=\"@slackhq\" width=\"24\" height=\"24\" valign=\"bottom\" /> SlackHQ ([@slackhq](https://github.com/slackhq)) - For such a wonderful product and API!\n\n## :black_nib: &nbsp; Author\n\n<img src=\"https://github.com/raycharius.png\" alt=\"@raycharius\" width=\"24\" height=\"24\" valign=\"bottom\" /> Ray East ([@raycharius](https://github.com/raycharius)) - Huge Fan of Slack and **Block Builder** Maintainer\n","readmeFilename":"README.md","gitHead":"9bb7180df91e79c1b2ad32cded6d388ace1759df","_id":"slack-block-builder@2.0.0-beta.4","_nodeVersion":"14.1.0","_npmVersion":"6.14.4","dist":{"integrity":"sha512-8/TOiRYpVeYtDBgUpXEbN9oVs3NNUCRZvvW8SUat4eCWISp/Qdei8Cbdwfj2abkQplYhwIKFUBiMfcx30yPdpg==","shasum":"339647acb76da885c0c1a9bbf8108e4aae7f720e","tarball":"https://registry.npmjs.org/slack-block-builder/-/slack-block-builder-2.0.0-beta.4.tgz","fileCount":164,"unpackedSize":260124,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgsWBKCRA9TVsSAnZWagAAz7gP/jQHc0bRLwXn0I9GGL0r\nBHcL5LHt/Ex4GAwRqcvRHIxF8XtYzGWvjqOi51/LwDaoDxzHjL110O0v0MIy\n0oI0rHS+ZH5HDGOaXbbIujBmdgVkhjwKYZhKBoc7005+h+eT98duf4lW9FhZ\nnIyQnxX9YBFHqlfgKw2WdPmen8q0+rogeoVlbUgAOUv2ZwxxJyavBg6fHzO3\nPCiUYRqGZ+cHM61cgU+/MItUTEiXRl2wtK2W2gspfnzGv5AhBB3RppUMHThn\nUL3UnAFVe14L1zL0fRXLchQFjpF+hTzbU3srQChtwyMcIMzyCNh5B960SYe+\nkdm7EJkFDHMKbV3QbL0fw57kn0U7duae3YIr5Wo7WC4H8tmNi/9aVjsx3nup\nkCx1bcB8Nbk+/Z4jzwAIEgC1SHZcxXTQquRfpRQwEJfdhHy0w5Ju46cZi56n\neX0PYw49A8n60Sn6XxC6A9sENyGc12JKXtLamxQx9tOz49lcZKij4cq8qA3X\n7zogpDVYWuLxXRAXHSrhx+BsmriHXBBpJpNo/Xw+/knFQ1sjVQlP5ohBJ9t9\nDvYcpF5/lcAsbRg6A67BIlpjsVRYT/bHy+kbf8tqZlGJ+wzh6oKJZ4qekyzf\npRkZIXs1zo+GrOxehla7XqCDqh0UjKSswzPXQn3vSiHsGj+C6bRy14DLPA4w\nB6LX\r\n=btD2\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAVX75oWpUkk7NTE2roYIRmR476mzT8gCgWSGApDwsDuAiEA8HWb7DSO69dXR0xd9i5mCOzcZ0us2x9xY24GxA90Qg8="}]},"_npmUser":{"name":"raycharius","email":"raydeast@gmail.com"},"directories":{},"maintainers":[{"name":"bravecow","email":"neporozhniy@gmail.com"},{"name":"raycharius","email":"raydeast@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/slack-block-builder_2.0.0-beta.4_1622237257648_0.6986185172925021"},"_hasShrinkwrap":false},"2.0.0":{"name":"slack-block-builder","version":"2.0.0","description":"Maintainable code for interactive Slack messages, modals, home tabs, and workflow steps. A must-have for the Slack Block Kit framework.","author":{"name":"Ray East","url":"https://github.com/raycharius"},"repository":{"type":"git","url":"git+https://github.com/raycharius/slack-block-builder.git"},"homepage":"https://blockbuilder.dev","bugs":{"url":"https://github.com/raycharius/slack-block-builder/issues"},"main":"./dist/index.js","types":"./dist/index.d.ts","license":"MIT","keywords":["slack","interactive-messages","block-actions","bot","slack-bot","modal","block","kit","swiftui","bot","modal","messages","message-builder","block-builder","slack-block-builder","block-kit","blocks","botkit","bolt","slack-bolt"],"scripts":{"src:build":"tsc -p ./tsconfig.json","src:lint":"eslint 'src/**/*.ts' --fix","docs:build":"tsc -p ./tsconfig.docs.json","docs:lint":"eslint 'docs-generator/**/*.ts' --fix","docs:serve":"docsify serve ./docs","predocs:generate":"npm run docs:build","docs:generate":"node docs-generator-dist/index.js","docs:local":"docsify serve docs-generator --port 3000","tests:lint":"eslint 'tests/**/*.ts' --fix","tests:coverage":"codecov","clean":"shx rm -rf ./dist ./coverage ./docs-generator-dist","test":"jest --coverage","build":"npm run src:build","lint":"eslint 'src/**/*.ts' 'tests/**/*.ts' 'docs-generator/**/*.ts'","lint:fix":"eslint 'src/**/*.ts' 'tests/**/*.ts' 'docs-generator/**/*.ts' --fix","madge":"npx madge --circular --warning --extensions ts ./"},"devDependencies":{"@types/jest":"^26.0.22","@typescript-eslint/eslint-plugin":"^4.20.0","@typescript-eslint/parser":"^4.20.0","codecov":"^3.8.1","docsify-cli":"^4.4.3","docsify-server-renderer":"^4.12.1","docsify-tabs":"^1.4.4","eslint":"^6.8.0","eslint-config-airbnb-base":"^14.1.0","eslint-config-airbnb-typescript":"^12.3.1","eslint-plugin-import":"^2.22.1","eslint-plugin-jsx-a11y":"^6.4.1","eslint-plugin-react":"^7.23.1","eslint-plugin-react-hooks":"^4.2.0","jest":"^26.6.3","jest-environment-jsdom":"^26.6.2","madge":"^4.0.2","mustache":"^4.2.0","prettier-eslint-cli":"^5.0.0","shx":"^0.3.3","ts-jest":"^26.5.4","ts-node":"^8.10.2","typescript":"^4.2.3"},"gitHead":"56bcf5f2396b4e144bbdfbeb4d17de6d4d67ba19","_id":"slack-block-builder@2.0.0","_nodeVersion":"14.1.0","_npmVersion":"6.14.4","dist":{"integrity":"sha512-5fjfIWsL1cPgsXax7vlxRb9ExiF2yJmmqmPbwourRxJLs6fVHmJGVBcV4RZqtKOxrXiQ7blgxF+ujGigQVd8Ag==","shasum":"17769fedf62716996ff61bb5142ee648b7c9463a","tarball":"https://registry.npmjs.org/slack-block-builder/-/slack-block-builder-2.0.0.tgz","fileCount":4,"unpackedSize":23867,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgwmiTCRA9TVsSAnZWagAAAIQP/A9wwoE7zbnm6zykk13e\nA/sAMsIUoYUwSbcBTNDqzdbFcQ/pj34s8qFlG81EVTh0/kSUNkLoUu54o7in\ntLQkVUXAZpXMRxh17WUcZV3oNQ+bsIcbsAJ5Dbf+5JIPshWg4yf9TRnS2b7F\nxrvTlEkEgxQfnJiQr+T0EHRUlvYLdoUi4Kid3CZQpbCLtpcRL4etojS0gVl5\nhXNygEmYpOco5p99/xaU8PiNPpPxaQ1lAlkAYAtU7k0DlFmmNVYcKd+0RxRQ\n0skhOqp9tcrq4PkRayP9bAFr+VnYr6VZ6aPNB70rRikdqHugQrKO7Vl/5DnE\nuSQTNeaGhqS4bqBu22QuQ+0IKXgXcNIe+AV+4TRvguS+AsfWEybusa/m/uaG\nzVmMSbp63WfVRIf4/nvAJq2MmUJX8SGY5FdkZee7b5X2p+6bfaQUScrybohD\nSs0nGbRzDY4FOiPTQGUr9vRpiytdq8JrA4E4XpUkZ9vda67bXivp5NHx9SjV\nA1rMjG1lEyDpjgkwgjjNhLGux3vo3hcUGeWRD/z7N8u9BiKFE7nrWNf3S404\nqXX42XFz0sv7bRY+ALrbkGBGfAJjF+jRDziF5HnRIEO/6KCoJeduEVYsc2eK\nzymNmI4WwZrgK+oryhPnr3K0Ris7DA8T4p8DGaNgNSUr6lq6uqhL3w9kCAzK\n8clD\r\n=iZ3g\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEjUtLkDgVN/GsQ/X2Uo1shkZq67kNCQAnLOjDvm5jSmAiEAzzVkRhmWIhKOjZ1axdM/rTarvVE83jzAeOOb0FkaEZo="}]},"_npmUser":{"name":"raycharius","email":"raydeast@gmail.com"},"directories":{},"maintainers":[{"name":"bravecow","email":"neporozhniy@gmail.com"},{"name":"raycharius","email":"raydeast@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/slack-block-builder_2.0.0_1623353490900_0.971132461165159"},"_hasShrinkwrap":false},"2.0.1":{"name":"slack-block-builder","version":"2.0.1","description":"Maintainable code for interactive Slack messages, modals, home tabs, and workflow steps. A must-have for the Slack Block Kit framework.","author":{"name":"Ray East","url":"https://github.com/raycharius"},"repository":{"type":"git","url":"git+https://github.com/raycharius/slack-block-builder.git"},"homepage":"https://blockbuilder.dev","bugs":{"url":"https://github.com/raycharius/slack-block-builder/issues"},"main":"./dist/index.js","types":"./dist/index.d.ts","license":"MIT","keywords":["slack","interactive-messages","block-actions","bot","slack-bot","modal","block","kit","swiftui","bot","modal","messages","message-builder","block-builder","slack-block-builder","block-kit","blocks","botkit","bolt","slack-bolt"],"scripts":{"src:build":"tsc -p ./tsconfig.json","src:lint":"eslint 'src/**/*.ts' --fix","docs:build":"tsc -p ./tsconfig.docs.json","docs:lint":"eslint 'docs-generator/**/*.ts' --fix","docs:serve":"docsify serve ./docs","predocs:generate":"npm run docs:build","docs:generate":"node docs-generator-dist/index.js","docs:local":"docsify serve docs-generator --port 3000","tests:lint":"eslint 'tests/**/*.ts' --fix","tests:coverage":"codecov","clean":"shx rm -rf ./dist ./coverage ./docs-generator-dist","test":"jest --coverage","build":"npm run src:build","lint":"eslint 'src/**/*.ts' 'tests/**/*.ts' 'docs-generator/**/*.ts'","lint:fix":"eslint 'src/**/*.ts' 'tests/**/*.ts' 'docs-generator/**/*.ts' --fix","madge":"npx madge --circular --warning --extensions ts ./"},"devDependencies":{"@types/jest":"^26.0.22","@typescript-eslint/eslint-plugin":"^4.20.0","@typescript-eslint/parser":"^4.20.0","codecov":"^3.8.1","docsify-cli":"^4.4.3","docsify-server-renderer":"^4.12.1","docsify-tabs":"^1.4.4","eslint":"^6.8.0","eslint-config-airbnb-base":"^14.1.0","eslint-config-airbnb-typescript":"^12.3.1","eslint-plugin-import":"^2.22.1","eslint-plugin-jsx-a11y":"^6.4.1","eslint-plugin-react":"^7.23.1","eslint-plugin-react-hooks":"^4.2.0","jest":"^26.6.3","jest-environment-jsdom":"^26.6.2","madge":"^4.0.2","mustache":"^4.2.0","prettier-eslint-cli":"^5.0.0","shx":"^0.3.3","ts-jest":"^26.5.4","ts-node":"^8.10.2","typescript":"^4.2.3"},"gitHead":"56bcf5f2396b4e144bbdfbeb4d17de6d4d67ba19","_id":"slack-block-builder@2.0.1","_nodeVersion":"14.1.0","_npmVersion":"6.14.4","dist":{"integrity":"sha512-yVspw2dTyfhXtw5MU3+1ZHzfMt6MWCys4g7weD7XO/S9o95SjKcHulzzM4TWEwuq1ZTraBSg76l5ohhk2AoNhg==","shasum":"722c8eff376a44df207edea63c850174cf47dc6f","tarball":"https://registry.npmjs.org/slack-block-builder/-/slack-block-builder-2.0.1.tgz","fileCount":164,"unpackedSize":260189,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgwmljCRA9TVsSAnZWagAA1sEP/RtQ3KiiO3UUDkF8jF4b\n+ZArbmRTnbhiDpxi93M6lNoIc2L8PJtnbnsDNrCtgyms29uV7n2KhjM3VU47\nAyXJQNm3gBNrDAsm9GqlFGWlvmhnHmxqRYH/e8rnVSh9p9OVTGGqTeddEHAu\nAJxsptcCCMcFMi4jW6HHtvT++D5dPcXF7+QWIHqfa4yraPP4ARqw9K+khouR\n4P4k0T+juyCR5eJqSPVXFOHdTPBQBULRYY6zyKFzIfgiB1Ie7WjtkrHXjdz0\nZ+txDydbI9QmwgdzKpdKYMDDBDmcwi4ORtzDfEN2sxftcMrBbnWdNrrUVgdk\nWEAv7lf3jGi62TISPiZKA/6ol80CRgjnhdodwNYdcdaicNaLhqDmeim1Tu+k\nXy7g1yrsd4o+6aYw8heEV/XbOwxnn4voyW+9JcvUc8craCiJWD8dGg5/BTLX\ndQkKTuRVNqSaHaPXvGroiRO4CFpgDqGvcA5mxF5Pj3mvC+mI4KFmR3mTZGuo\nlGcwspb9rY9hs7Xfx+Cw5dNBSL2JtjAOlD0Z7RAEA7myW0FD5BoRu4hTrB/i\nLY6Urt8oevhKsd/woTh9o6TEQIRcttDJ/4DyxjWLW9MXDtnmXmQ2sK3b/haK\nO3Xox1BybAnqZsz187Mbwn9K1P/5JOHAqsOsI89hVgaoy1KmYNVtt7wCtd29\nYpC9\r\n=H7kr\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDz7MXhrdwNEvR7KaPiyUSLlcJFbujmd7w4qCGRHD0RcAIhAIHVqsT2NnSRF+u4KUfdjKatwRw4Um205hqKTmCXBwuK"}]},"_npmUser":{"name":"raycharius","email":"raydeast@gmail.com"},"directories":{},"maintainers":[{"name":"bravecow","email":"neporozhniy@gmail.com"},{"name":"raycharius","email":"raydeast@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/slack-block-builder_2.0.1_1623353699219_0.4786285741842813"},"_hasShrinkwrap":false},"2.1.0":{"name":"slack-block-builder","version":"2.1.0","description":"Maintainable code for interactive Slack messages, modals, home tabs, and workflow steps. A must-have for the Slack Block Kit framework.","author":{"name":"Ray East","url":"https://github.com/raycharius"},"repository":{"type":"git","url":"git+https://github.com/raycharius/slack-block-builder.git"},"homepage":"https://blockbuilder.dev","bugs":{"url":"https://github.com/raycharius/slack-block-builder/issues"},"main":"./dist/index.js","types":"./dist/index.d.ts","license":"MIT","keywords":["slack","interactive-messages","block-actions","bot","slack-bot","modal","block","kit","swiftui","bot","modal","messages","message-builder","block-builder","slack-block-builder","block-kit","blocks","botkit","bolt","slack-bolt"],"scripts":{"src:build":"tsc -p ./tsconfig.json","src:lint":"eslint 'src/**/*.ts' --fix","docs:build":"tsc -p ./tsconfig.docs.json","docs:lint":"eslint 'docs-generator/**/*.ts' --fix","docs:serve":"docsify serve ./docs","predocs:generate":"npm run docs:build","docs:generate":"node docs-generator-dist/index.js","docs:local":"docsify serve docs-generator --port 3000","tests:lint":"eslint 'tests/**/*.ts' --fix","tests:coverage":"codecov","clean":"shx rm -rf ./dist ./coverage ./docs-generator-dist","test":"jest --coverage","build":"npm run src:build","lint":"eslint 'src/**/*.ts' 'tests/**/*.ts' 'docs-generator/**/*.ts'","lint:fix":"eslint 'src/**/*.ts' 'tests/**/*.ts' 'docs-generator/**/*.ts' --fix","madge":"npx madge --circular --warning --extensions ts ./"},"devDependencies":{"@types/jest":"^26.0.22","@typescript-eslint/eslint-plugin":"^4.20.0","@typescript-eslint/parser":"^4.20.0","codecov":"^3.8.1","docsify-cli":"^4.4.3","docsify-server-renderer":"^4.12.1","docsify-tabs":"^1.4.4","eslint":"^6.8.0","eslint-config-airbnb-base":"^14.1.0","eslint-config-airbnb-typescript":"^12.3.1","eslint-plugin-import":"^2.22.1","eslint-plugin-jsx-a11y":"^6.4.1","eslint-plugin-react":"^7.23.1","eslint-plugin-react-hooks":"^4.2.0","jest":"^26.6.3","jest-environment-jsdom":"^26.6.2","madge":"^4.0.2","mustache":"^4.2.0","prettier-eslint-cli":"^5.0.0","shx":"^0.3.3","ts-jest":"^26.5.4","ts-node":"^8.10.2","typescript":"^4.2.3"},"gitHead":"36c72f9e9d5df7bfc3b4a67f4fddbe468b52c279","_id":"slack-block-builder@2.1.0","_nodeVersion":"14.1.0","_npmVersion":"6.14.4","dist":{"integrity":"sha512-jy7+8i0V9l+K4Gsy4Dd+6UYropkOT3DE/758x6lCFN9JJeM4JlYB8azeM3Q7NUwZpc3duWzdBzxNxtRr0b1d+A==","shasum":"0cc6ce94c8d9f206500fa88a3685101f3f3ed5ab","tarball":"https://registry.npmjs.org/slack-block-builder/-/slack-block-builder-2.1.0.tgz","fileCount":164,"unpackedSize":262196,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJg/AQCCRA9TVsSAnZWagAA5uQP/08jgbsxWPPTEGn4wmFG\n0pzzJ5+77S57cJKMX/gxS2T79zm05B6UnmEJjV5DeAybWUGTwc5lwzj1H8Bd\ndl/6qLjETF5EvcuVA7FbZBSRKC0kBBSudEaEs9Xu2kCdlBg0/BRtFkGu6O8j\nR6mq3wXt8+zvqhVxtqyEoeiN3HEXyUyYMd72z10s5SstVwnPYkcqgzUZxe05\n3xU51iUyTTFBuQOWgZKsoHF8SWvpc4CF20ukLzdmLme5X0G48BBLEToAubwy\n4twgEZ/QrbXNws+U8I0eqp9tVHP6S6GgHaIoJEFbUix+AHYw2Oebk0NJr2aq\nHWmHRK8HtYkzaGkDp19/Je0xVSu1l6gT4phak8zWJagvCIqwmp45wPfMOviL\nqcW5C6PoXVZTjT+Wpa3TmXtDX0R70EYpdoB/887Z0Ek508UYVmIREseJ1A3g\nOrHrdsUv0+REmyhsuKl73au8KmPaudDo3Fiyn5CH/SFeG49x58V+6J+GK5Zy\nEJU0pl7V/hJKWszCXJecT7RMVFsP5ITBtIYljc3GaByfsbIyfXmKDZjNg1CW\nbKWaozoRK/Xnklajak7p1Au8KW3twHt8o/m+FIIzVa7/leyy3gx8AEc9zTJ/\nXv8OqBPQdkXqrdWEKCVSDeRM2QXQeRl1cEtuEmmhP/ty7u2iNtUNBxljS6oF\nL1Si\r\n=ACeV\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDMl0ip+x7OkBimeo0pTe3HVyrW3GuqLo6sOcaWLm6xzQIhANl7hobSUsG+oXLkcqpEuFrZeaLThZaCg+jxYmG/SfMi"}]},"_npmUser":{"name":"raycharius","email":"raydeast@gmail.com"},"directories":{},"maintainers":[{"name":"bravecow","email":"neporozhniy@gmail.com"},{"name":"raycharius","email":"raydeast@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/slack-block-builder_2.1.0_1627128834776_0.8590546430478068"},"_hasShrinkwrap":false},"2.1.1":{"name":"slack-block-builder","version":"2.1.1","description":"Maintainable code for interactive Slack messages, modals, home tabs, and workflow steps. A must-have for the Slack Block Kit framework.","author":{"name":"Ray East","url":"https://github.com/raycharius"},"repository":{"type":"git","url":"git+https://github.com/raycharius/slack-block-builder.git"},"homepage":"https://blockbuilder.dev","bugs":{"url":"https://github.com/raycharius/slack-block-builder/issues"},"main":"./dist/index.js","types":"./dist/index.d.ts","license":"MIT","keywords":["slack","interactive-messages","block-actions","bot","slack-bot","modal","block","kit","swiftui","bot","modal","messages","message-builder","block-builder","slack-block-builder","block-kit","blocks","botkit","bolt","slack-bolt"],"scripts":{"src:build":"tsc -p ./tsconfig.json","src:lint":"eslint 'src/**/*.ts' --fix","docs:build":"tsc -p ./tsconfig.docs.json","docs:lint":"eslint 'docs-generator/**/*.ts' --fix","docs:serve":"docsify serve ./docs","predocs:generate":"npm run docs:build","docs:generate":"node docs-generator-dist/index.js","docs:local":"docsify serve docs-generator --port 3000","tests:lint":"eslint 'tests/**/*.ts' --fix","tests:coverage":"codecov","clean":"shx rm -rf ./dist ./coverage ./docs-generator-dist","test":"jest --coverage","build":"npm run src:build","lint":"eslint 'src/**/*.ts' 'tests/**/*.ts' 'docs-generator/**/*.ts'","lint:fix":"eslint 'src/**/*.ts' 'tests/**/*.ts' 'docs-generator/**/*.ts' --fix","madge":"npx madge --circular --warning --extensions ts ./"},"devDependencies":{"@types/jest":"^26.0.22","@typescript-eslint/eslint-plugin":"^4.20.0","@typescript-eslint/parser":"^4.20.0","codecov":"^3.8.1","docsify-cli":"^4.4.3","docsify-server-renderer":"^4.12.1","docsify-tabs":"^1.4.4","eslint":"^6.8.0","eslint-config-airbnb-base":"^14.1.0","eslint-config-airbnb-typescript":"^12.3.1","eslint-plugin-import":"^2.22.1","eslint-plugin-jsx-a11y":"^6.4.1","eslint-plugin-react":"^7.23.1","eslint-plugin-react-hooks":"^4.2.0","jest":"^26.6.3","jest-environment-jsdom":"^26.6.2","madge":"^4.0.2","mustache":"^4.2.0","prettier-eslint-cli":"^5.0.0","shx":"^0.3.3","ts-jest":"^26.5.4","ts-node":"^8.10.2","typescript":"^4.2.3"},"gitHead":"ce0f6d0e0966513e88c9d7a692f9baf6c620b689","_id":"slack-block-builder@2.1.1","_nodeVersion":"14.1.0","_npmVersion":"6.14.4","dist":{"integrity":"sha512-Y5OGAUvEQKWWOIHNINd9F1WwYur9EoQDyBv0EZ814IP9h05QXL2YWfL6/TnNJ7e1Cii8M+KVQwWGn1Lv6VAmOw==","shasum":"81911112f471d9bcbdd51ad8e5a8d1ac6d9717bd","tarball":"https://registry.npmjs.org/slack-block-builder/-/slack-block-builder-2.1.1.tgz","fileCount":164,"unpackedSize":262192,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhLUEDCRA9TVsSAnZWagAA824QAJhUJFKKTQjCNdio6ghC\nOAy/0htGEPrLmDB2RIvlFIZbQ7KdPtfKIVFU2TqKb5w4jC/fyAeoev2X3L5I\n9lyAD8YeCSs4aO6ghsHDlRzQZMPtJId3Wi4hcZ0Fw3fdDXcn9uK0ksyJNyYV\ndL3LH9WRckuVh4NctmgK3R/s5OcXod63RrCDY9fTZ16LpaIzHiKnHa7uFMNS\nmft8k7CmMUzM6evVTfwgbTqkNJwqylkMeld41X4T3Ju1Gh0Rd+iJjL4NQ4Pq\nXZAwzg50Z70XLuYb4RsxrGRdrLZUik9nIeCNJWBTSwglQTfV0qxXjkrItEyC\nGUMghBFyQBGRG/dD2bTnU+5gAeDNmlVZOttrXnrY7TKaM5+C6r+xTqOnmQrW\ngGYq+0wBAeSWlgSQhOSrKhqF9U+CoYt9GfkvpR5ZEi4kUIgXa3Hi9fkqs1UY\nHzmd/A++sw+NwP673Av7n3n3xLMD127VJLZ70KekScRX2l8WYnKvNEGJ3+RB\n6Rt8vvQ4A9X0OpEdToqkceksvEv+Ioi7w9Xc5m2fLjS5qAu02bxpRE4gtEF1\nKqrTY8+vyFdtIra5NvTm3FArNp9ZEzzo0mjnxOUxFnashkuDqe1Fxm7faBK+\nyK8kUynNbVjZyEpDhHtkmHmO+/rKnlF4JIXnyOuD45EAF3Xw5WdFsEu/4jWL\nFlnF\r\n=gh43\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBniC7TKGs0/c5gvDQvmWc7RLr9CgW6M5AgTGlgRhztYAiBdxrtG/JV4RRfV5ETX810/C2dNlU9Gg+0FVLbRe0HHuA=="}]},"_npmUser":{"name":"raycharius","email":"raydeast@gmail.com"},"directories":{},"maintainers":[{"name":"bravecow","email":"neporozhniy@gmail.com"},{"name":"raycharius","email":"raydeast@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/slack-block-builder_2.1.1_1630355715635_0.6473754012611397"},"_hasShrinkwrap":false},"2.1.2":{"name":"slack-block-builder","version":"2.1.2","description":"Maintainable code for interactive Slack messages, modals, home tabs, and workflow steps. A must-have for the Slack Block Kit framework.","author":{"name":"Ray East","url":"https://github.com/raycharius"},"repository":{"type":"git","url":"git+https://github.com/raycharius/slack-block-builder.git"},"homepage":"https://blockbuilder.dev","bugs":{"url":"https://github.com/raycharius/slack-block-builder/issues"},"main":"./dist/index.js","types":"./dist/index.d.ts","license":"MIT","keywords":["slack","interactive-messages","block-actions","bot","slack-bot","modal","block","kit","swiftui","bot","modal","messages","message-builder","block-builder","slack-block-builder","block-kit","blocks","botkit","bolt","slack-bolt"],"scripts":{"src:build":"tsc -p ./tsconfig.json","src:lint":"eslint 'src/**/*.ts' --fix","docs:build":"tsc -p ./tsconfig.docs.json","docs:lint":"eslint 'docs-generator/**/*.ts' --fix","docs:serve":"docsify serve ./docs","predocs:generate":"npm run docs:build","docs:generate":"node docs-generator-dist/index.js","docs:local":"docsify serve docs-generator --port 3000","tests:lint":"eslint 'tests/**/*.ts' --fix","tests:coverage":"codecov","clean":"shx rm -rf ./dist ./coverage ./docs-generator-dist","test":"jest --coverage","build":"npm run src:build","lint":"eslint 'src/**/*.ts' 'tests/**/*.ts' 'docs-generator/**/*.ts'","lint:fix":"eslint 'src/**/*.ts' 'tests/**/*.ts' 'docs-generator/**/*.ts' --fix","madge":"npx madge --circular --warning --extensions ts ./"},"devDependencies":{"@types/jest":"^26.0.22","@typescript-eslint/eslint-plugin":"^4.20.0","@typescript-eslint/parser":"^4.20.0","codecov":"^3.8.1","docsify-cli":"^4.4.3","docsify-server-renderer":"^4.12.1","docsify-tabs":"^1.4.4","eslint":"^6.8.0","eslint-config-airbnb-base":"^14.1.0","eslint-config-airbnb-typescript":"^12.3.1","eslint-plugin-import":"^2.22.1","eslint-plugin-jsx-a11y":"^6.4.1","eslint-plugin-react":"^7.23.1","eslint-plugin-react-hooks":"^4.2.0","jest":"^26.6.3","jest-environment-jsdom":"^26.6.2","madge":"^4.0.2","mustache":"^4.2.0","prettier-eslint-cli":"^5.0.0","shx":"^0.3.3","ts-jest":"^26.5.4","ts-node":"^8.10.2","typescript":"^4.2.3"},"gitHead":"ea70c9ebb714f25cc26a112a1be2934640af296f","_id":"slack-block-builder@2.1.2","_nodeVersion":"14.1.0","_npmVersion":"6.14.4","dist":{"integrity":"sha512-FvsrU3FdlhLqZmkTlURDZURddIMxqCRz4Iw8XgoujROeJJKEJosnr5TQkkSCtcrg980hqwBeVvU+2gyN7q7kNg==","shasum":"28d9c6b09607ebef538f265e034f88357c5f186b","tarball":"https://registry.npmjs.org/slack-block-builder/-/slack-block-builder-2.1.2.tgz","fileCount":164,"unpackedSize":263333,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIC9bzijFy1dvVRGak32gRSBHQBHgFDor8NHpvSwaAebBAiEAoFRB37qkyZ7ZnAjGdOmgAQj+LH73jj/PfnwUIJYeMJQ="}]},"_npmUser":{"name":"raycharius","email":"raydeast@gmail.com"},"directories":{},"maintainers":[{"name":"bravecow","email":"neporozhniy@gmail.com"},{"name":"raycharius","email":"raydeast@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/slack-block-builder_2.1.2_1632146781847_0.3278679397989188"},"_hasShrinkwrap":false},"2.2.0-beta.0":{"name":"slack-block-builder","version":"2.2.0-beta.0","description":"Maintainable code for interactive Slack messages, modals, home tabs, and workflow steps. A must-have for the Slack Block Kit framework.","author":{"name":"Ray East","url":"https://github.com/raycharius"},"repository":{"type":"git","url":"git+https://github.com/raycharius/slack-block-builder.git"},"homepage":"https://blockbuilder.dev","bugs":{"url":"https://github.com/raycharius/slack-block-builder/issues"},"main":"./dist/index.js","types":"./dist/index.d.ts","license":"MIT","keywords":["slack","interactive-messages","block-actions","bot","slack-bot","modal","block","kit","swiftui","bot","modal","messages","message-builder","block-builder","slack-block-builder","block-kit","blocks","botkit","bolt","slack-bolt"],"scripts":{"src:build":"tsc -p ./tsconfig.json","src:lint":"eslint 'src/**/*.ts' --fix","docs:build":"tsc -p ./tsconfig.docs.json","docs:lint":"eslint 'docs-generator/**/*.ts' --fix","docs:serve":"docsify serve ./docs","predocs:generate":"npm run docs:build","docs:generate":"node docs-generator-dist/index.js","docs:local":"docsify serve docs-generator --port 3000","tests:lint":"eslint 'tests/**/*.ts' --fix","tests:coverage":"codecov","clean":"shx rm -rf ./dist ./coverage ./docs-generator-dist","test":"jest --coverage","build":"npm run src:build","lint":"eslint 'src/**/*.ts' 'tests/**/*.ts' 'docs-generator/**/*.ts'","lint:fix":"eslint 'src/**/*.ts' 'tests/**/*.ts' 'docs-generator/**/*.ts' --fix","madge":"npx madge --circular --warning --extensions ts ./"},"devDependencies":{"@types/jest":"^26.0.22","@typescript-eslint/eslint-plugin":"^4.20.0","@typescript-eslint/parser":"^4.20.0","codecov":"^3.8.1","docsify-cli":"^4.4.3","docsify-server-renderer":"^4.12.1","docsify-tabs":"^1.4.4","eslint":"^6.8.0","eslint-config-airbnb-base":"^14.1.0","eslint-config-airbnb-typescript":"^12.3.1","eslint-plugin-import":"^2.22.1","eslint-plugin-jsx-a11y":"^6.4.1","eslint-plugin-react":"^7.23.1","eslint-plugin-react-hooks":"^4.2.0","jest":"^26.6.3","jest-environment-jsdom":"^26.6.2","madge":"^4.0.2","mustache":"^4.2.0","prettier-eslint-cli":"^5.0.0","shx":"^0.3.3","ts-jest":"^26.5.4","ts-node":"^8.10.2","typescript":"^4.2.3"},"readme":"<p align=\"center\">\n    <img src=\"https://raw.githubusercontent.com/raycharius/slack-block-builder/master/docs/resources/images/logo-horizontal.png\" alt=\"Logo\" width=\"600px\">\n</p>\n\n<p align=\"center\">\n    <h3 align=\"center\">Maintainable code for Slack interactive messages, modals, and home tabs.</h3>\n</p>\n\n<p align=\"center\">\n    Lightweight, zero-dependency library for declaratively building Slack Block Kit UI.\n    <br />\n    <br />\n    <a href=\"https://blockbuilder.dev\" target=\"_blank\"><strong>View the Docs »</strong></a>\n    <br />\n    <br />\n    <a href=\"#space_invader--usage\">Quick Start Guide</a>\n    ·\n    <a href=\"https://github.com/raycharius/slack-block-builder/issues\">Request Feature</a>\n    ·\n    <a href=\"https://github.com/raycharius/slack-block-builder/issues\">Report Bug</a>\n  </p>\n</p>\n\n![An example of using Block Builder](docs/resources/images/hero-image.png)\n\n***\n\n[![npm](https://img.shields.io/npm/v/slack-block-builder?color=bright-green)](https://www.npmjs.com/package/slack-block-builder)\n![NPM](https://img.shields.io/npm/l/slack-block-builder?color=bright-green)\n[![codecov](https://codecov.io/gh/raycharius/slack-block-builder/branch/master/graph/badge.svg)](https://codecov.io/gh/raycharius/slack-block-builder)\n\n> :tada: **Block Builder Version 2.0 is here! Learn about the new features and how to install it [here](docs/announcements/version-2.md).**\n\n**Block Builder** helps you keep your Slack app code for UI maintainable, testable, and reusable. It has a declarative, chainable syntax inspired by [SwiftUI](https://developer.apple.com/documentation/swiftui) and is built for better UI architecture.\n\n### :zap: &nbsp; Features\n\n* Declarative [SwiftUI](https://developer.apple.com/xcode/swiftui/) inspired syntax.\n* The ability to build more complex flows using loops and conditionals.\n* A `printPreviewURL()` method that outputs a link to preview your UI on Slack's [Block Kit Builder website](https://app.slack.com/block-kit-builder) for easier prototyping.\n* A set of helper functions for formatting text with Slack's markdown standard.\n* In-depth [doc site](https://blockbuilder.dev) at [https://blockbuilder.dev](https://blockbuilder.dev).\n* [Support](#block-kit-support-and-reference) for all current Slack Block Kit objects.\n* A great TypeScript experience.\n* Extensive JSDoc hints with explanations, validation rules, and quick links to full documentation.\n* Zero dependencies.\n\n### :rocket: &nbsp; Coming Soon\n\n* `Paginator` component.\n* `Accordion` component.\n\n### :gift: &nbsp; Benefits\n\n* Write three times less code.\n* Build more sophistocated, elegant flows.\n* Design better UI architecture for your Slack apps.\n* Focus more on code in your IDE than on studying the [Slack API docs](https://api.slack.com/).\n* Easily integrate localizations into your app.\n\n### :phone: &nbsp; Let's Talk?\n\nFeedback – love it! Aside from GitHub Issues, there are Slack channels available in popular bot communities to discuss **Block Builder** – we'll see you there! :raised_hands:\n\n* **Slack Community** – [\\#block-builder](https://slackcommunity.com)\n* **Bot Developer Hangout** – [\\#block-builder](https://community.botkit.ai)\n\n### :floppy_disk: &nbsp; Installation \n\n**Block Builder** requires Node.js 12 or higher, and, when using TypeScript, TypeScript 3.8 or higher.\n\n#### Using NPM: \n\n``` bash\nnpm install --save slack-block-builder\n```\n\n#### Using Yarn: \n\n``` bash\nyarn add slack-block-builder\n```\n\n### :space_invader: &nbsp; Usage\n\nFor full documentation, make sure you head over to [https://blockbuilder.dev](https://blockbuilder.dev).\n\n\n### Importing\n\nThe functions for creating objects can be both imported directly or through an object that groups them by category.\n\n```javascript\n// Importing exposed groups of objects\n\nimport { Surfaces, Blocks, Elements, Bits, Utilities } from 'slack-block-builder';\n\n// Importing objects top-level\n\nimport { Modal, Section, Actions, Button } from 'slack-block-builder';\n```\n\nThe same goes for importing Slack markdown helper functions:\n\n```javascript\n// Importing the Md object\n\nimport { Surfaces, Blocks, Md } from 'slack-block-builder';\n\n// Importing the functions top-level\n\nimport { Modal, Section, bold, link } from 'slack-block-builder';\n```\n\n### Group Explanations\n\n`Surfaces` – Contains functions for creating modals, messages, home tabs, and workflow steps. \n\n`Blocks` – Layout blocks used to organize the UI.\n\n`Elements` – UI elements that are used to capture user interaction.\n\n`Bits` – These are composition objects and other bits and pieces from Slack's docs. Included are `Attachment`, `Options`, `OptionGroup`, and `ConfirmationDialog`. They felt like they were deserving of their own category.\n\n`Utilities` – A group of utility functions. See [Utility Functions](#utility-functions).\n\n`Md` – Helper functions for formatting text with Slack's markdown. See [Markdown Helpers](#markdown-helpers).\n\n### Block Kit Support and Reference\n\nBelow is a list of supported objects and how to access them in **Block Builder**:\n\n| **Name**             | **Type**           | **Support**                    | **Accessed Via**                      \n|----------------------|--------------------|--------------------------------|-----------------------------------------\n| Home Tab             | Surface            | :white_check_mark:             | `Surfaces.HomeTab()`                       \n| Message              | Surface            | :white_check_mark:             | `Surfaces.Message()`                       \n| Modal                | Surface            | :white_check_mark:             | `Surfaces.Modal()`                         \n| Workflow Step        | Surface            | :white_check_mark:             | `Surfaces.WorkflowStep()`                         \n| Actions              | Block              | :white_check_mark:             | `Blocks.Actions()`                \n| Context              | Block              | :white_check_mark:             | `Blocks.Context()`                \n| Divider              | Block              | :white_check_mark:             | `Blocks.Divider()`                \n| File                 | Block              | :white_check_mark:             | `Blocks.File()`\n| Header               | Block              | :white_check_mark:             | `Blocks.Header()`\n| Image                | Block              | :white_check_mark:             | `Blocks.Image()`                  \n| Input                | Block              | :white_check_mark:             | `Blocks.Input()`                  \n| Section              | Block              | :white_check_mark:             | `Blocks.Section()`                \n| Button               | Element            | :white_check_mark:️             | `Elements.Button()`               \n| Checkboxes           | Element            | :white_check_mark:             | `Elements.Checkboxes()`           \n| Date Picker          | Element            | :white_check_mark:             | `Elements.DatePicker()`\n| Time Picker          | Element            | :white_check_mark:             | `Elements.TimePicker()`           \n| Image                | Element            | :white_check_mark:             | `Elements.Img()`                  \n| Overflow Menu        | Element            | :white_check_mark:             | `Elements.OverflowMenu()`         \n| Radio Buttons        | Element            | :white_check_mark:             | `Elements.RadioButtons()`         \n| Plain-Text Input     | Element            | :white_check_mark:             | `Elements.TextInput()`            \n| Select Menus         | Element            | :white_check_mark:             | `Elements.[Type]Select()`          \n| Multi-Select Menus   | Element            | :white_check_mark:             | `Elements.[Type]MultiSelect()`     \n| Option               | Composition Object | :white_check_mark:             | `Bits.Option()`                   \n| Confirm Dialog       | Composition Object | :white_check_mark:             | `Bits.ConfirmationDialog()`       \n| Option Group         | Composition Object | :white_check_mark:             | `Bits.OptionGroup()`\n| Attachment           | Legacy Feature     | :white_check_mark:             | `Bits.Attachment()`              \n\n### Creating a Simple Interactive Message\n\nLet's take a look at how to compose an interactive message. Even though [Slack](https://slack.com) now has modals, these have always been the basis for [Slack](https://slack.com) apps.\n\nFunctions that return Block Kit objects have setter methods for all of the properties, but also support parameters that are passed into the constructor for properties with primitive types.\n\n```javascript\nimport { Message, Blocks, Elements } from 'slack-block-builder';\n\nconst myMessage = ({ channel, dangerLevel }) => {\n  return Message()\n    .channel(channel)\n    .text('Alas, my friend.')\n    .blocks(\n      Blocks.Section()\n        .text('One does not simply walk into Slack and click a button.'),\n      Blocks.Section()\n        .text('At least that\\'s what my friend Slackomir said :crossed_swords:'),\n      Blocks.Divider(),\n      Blocks.Actions()\n        .elements(\n          Elements.Button()\n            .text('Sure One Does')\n            .actionId('gotClicked')\n            .danger(dangerLevel > 42), // Optional argument, defaults to 'true'\n          Elements.Button()\n            .text('One Does Not')\n            .actionId('scaredyCat')\n            .primary()))\n    .asUser()\n    .buildToJSON();\n};\n```\n\nAnd now an example with using both the setter methods and passing parameters into the functions at initiation:\n\n```javascript\nimport { Message, Blocks, Elements } from 'slack-block-builder';\n\nconst myShorterMessage = ({ channel, dangerLevel }) => {\n  return Message({ channel, text: 'Alas, my friend.' })\n    .blocks(\n      Blocks.Section({ text: 'One does not simply walk into Slack and click a button.' }),\n      Blocks.Section({ text: 'At least that\\'s what my friend Slackomir said :crossed_swords:' }),\n      Blocks.Divider(),\n      Blocks.Actions()\n        .elements(\n          Elements.Button({ text: 'Sure One Does', actionId: 'gotClicked' })\n            .danger(dangerLevel > 42), // Optional argument, defaults to 'true'\n          Elements.Button({ text: 'One Does Not', actionId: 'scaredyCat' })\n            .primary()))\n    .asUser()\n    .buildToJSON();\n};\n```\n\nBoth of these examples render the message below. And the best part? It only took 15 lines of code, as opposed to the 44 lines of JSON generated as a result. \n\n![An example of using Block Builder for Messages](docs/resources/images/simple-message-example.png)\n\n[**View Example on Slack Block Kit Builder Website**](https://app.slack.com/block-kit-builder#%7B%22blocks%22:%5B%7B%22type%22:%22section%22,%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22One%20does%20not%20simply%20walk%20into%20Slack%20and%20click%20a%20button.%22%7D%7D,%7B%22type%22:%22section%22,%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22At%20least%20that's%20what%20my%20friend%20Slackomir%20said%20:crossed_swords:%22%7D%7D,%7B%22type%22:%22divider%22%7D,%7B%22type%22:%22actions%22,%22elements%22:%5B%7B%22type%22:%22button%22,%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22Sure%20One%20Does%22%7D,%22action_id%22:%22gotClicked%22,%22style%22:%22danger%22%7D,%7B%22type%22:%22button%22,%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22One%20Does%20Not%22%7D,%22action_id%22:%22scaredyCat%22,%22style%22:%22primary%22%7D%5D%7D%5D%7D)\n\n### Creating a Simple Modal\n\nLet's take a look at how modals are created. Here we'll also take a look at working with Bits and with loops, by adding options with the `Array.map()` method.\n\nYou'll noticed that we've added an inline condition that returns an initial option only if one has been passed into the function. This is because all the setter methods prune values of `undefined`, uncovering opportunities for inline logic. \n\n```javascript\nimport { Modal, Blocks, Elements, Bits } from 'slack-block-builder';\n\nconst myShorterModal = ({ menuOptions, selected }) => {\n  return Modal({ title: 'PizzaMate', submit: 'Get Fed' })\n    .blocks(\n      Blocks.Section({ text: 'Hey there, colleague!' }),\n      Blocks.Section({ text: 'Hurray for corporate pizza! Let\\'s get you fed and happy :pizza:' }),\n      Blocks.Input({ label: 'What can we call you?' })\n        .element(\n          Elements.TextInput({ placeholder: 'Hi, my name is... (What?!) (Who?!)' })\n            .actionId('name')),\n      Blocks.Input({ label: 'Which floor are you on?' })\n        .element(\n          Elements.TextInput({ placeholder: 'HQ – Fifth Floor' })\n            .actionId('floor')),\n      Blocks.Input({ label: 'What\\'ll you have?' })\n        .element(\n          Elements.StaticSelect({ placeholder: 'Choose your favorite...' })\n            .actionId('item')\n            .options(menuOptions\n              .map((item) => Bits.Option({ text: item.name, value: item.id })))\n            .initialOption(selected && Bits.Option({ text: selected.name, value: selected.id }))))\n    .buildToJSON();\n};\n```\n\nBoth of these examples render the modal below. \n\n![An example of using Block Builder for Modals](docs/resources/images/simple-modal-example.png)\n\n[**View Example on Slack Block Kit Builder Website**](https://app.slack.com/block-kit-builder#%7B%22type%22:%22modal%22,%22title%22:%7B%22type%22:%22plain_text%22,%22text%22:%22PizzaMate%22%7D,%22blocks%22:%5B%7B%22type%22:%22section%22,%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22Hey%20there,%20colleague!%22%7D%7D,%7B%22type%22:%22section%22,%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22Hurray%20for%20corporate%20pizza!%20Let's%20get%20you%20fed%20and%20happy%20:pizza:%22%7D%7D,%7B%22type%22:%22input%22,%22label%22:%7B%22type%22:%22plain_text%22,%22text%22:%22What%20can%20we%20call%20you?%22%7D,%22element%22:%7B%22type%22:%22plain_text_input%22,%22action_id%22:%22name%22,%22placeholder%22:%7B%22type%22:%22plain_text%22,%22text%22:%22Hi,%20my%20name%20is...%20(What?!)%20(Who?!)%22%7D%7D%7D,%7B%22type%22:%22input%22,%22label%22:%7B%22type%22:%22plain_text%22,%22text%22:%22Which%20floor%20are%20you%20on?%22%7D,%22element%22:%7B%22type%22:%22plain_text_input%22,%22action_id%22:%22floor%22,%22placeholder%22:%7B%22type%22:%22plain_text%22,%22text%22:%22HQ%20–%20Fifth%20Floor%22%7D%7D%7D,%7B%22type%22:%22input%22,%22label%22:%7B%22type%22:%22plain_text%22,%22text%22:%22What'll%20you%20have?%22%7D,%22element%22:%7B%22type%22:%22static_select%22,%22placeholder%22:%7B%22type%22:%22plain_text%22,%22text%22:%22Choose%20your%20favorite...%22%7D,%22action_id%22:%22item%22,%22options%22:%5B%7B%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22:cheese_wedge:%20With%20Cheeze%22%7D,%22value%22:%22012%22%7D,%7B%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22:fish:%20With%20Anchovies%22%7D,%22value%22:%22013%22%7D,%7B%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22:cookie:%20With%20Scooby%20Snacks%22%7D,%22value%22:%22014%22%7D,%7B%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22:beer:%20I%20Prefer%20Steak%20and%20Beer%22%7D,%22value%22:%22015%22%7D%5D%7D%7D%5D,%22submit%22:%7B%22type%22:%22plain_text%22,%22text%22:%22Get%20Fed%22%7D%7D)\n\n### Utility Functions\n\nThe `Utilities` object contains various utility functions for creating UI. Currently, there are two:\n\n`BlockCollection()` – Accepts multiple arguments or an array of blocks and returns them in an array, in their built state.\n\n`AttachmentCollection()` – Accepts multiple arguments or an array of attachments and returns them in an array, in their built state.\n\nThese two functions are useful when you wish to keep surface or view configuration separate from UI representation.\n\nAn example using Slack's `WebClient` from their [SDK for Node.js](https://github.com/slackapi/node-slack-sdk):\n\n```javascript\nimport { BlockCollection, AttachmentCollection, Blocks } from 'slack-block-builder';\nimport { WebClient } from '@slack/web-api';\n\nconst client = new WebClient(process.env.SLACK_TOKEN);\n\nclient.chat.postMessage({\n  channel: 'ABCDEFG',\n  text: 'Hello, my dear, sweet world!',\n  blocks: BlockCollection( /* Pass in blocks */ ),\n  attachments: AttachmentCollection( /* Pass in attachments */ ),\n})\n.then((response) => console.log(response))\n.catch((error) => console.log(error));\n```\n\nAnother example where you might find `BlockCollection()` helpful is when [unfurling links in messages](https://api.slack.com/reference/messaging/link-unfurling):\n\n```javascript\nimport { BlockCollection, Blocks } from 'slack-block-builder';\nimport { WebClient } from '@slack/web-api';\n\nconst client = new WebClient(process.env.SLACK_TOKEN);\n\nconst unfurl = ({ channel, ts, url }) => client.chat.unfurl({\n  channel,\n  ts,\n  unfurls: { [url]: BlockCollection( /* Pass in blocks */ ) },\n})\n.then((response) => console.log(response))\n.catch((error) => console.log(error));\n```\n\n### Markdown Helpers\n\nOften you'll find that you need to format text in your messages and modals. *Block Builder* has helper functions available to simply that process. They are available both as members of the `Md` object and as top-level imports. You can find the full list of functions on the [Block Builder doc site](https://blockbuilder.dev):\n\n``` javascript\nimport { Message, Blocks, Md } from 'slack-block-builder';\n\nconst myMdMessage = ({ channel, user }) => {\n  const slashCommands = ['/schedule', '/cancel', '/remind', '/help'];\n\n  return Message({ channel, text: 'Alas, my friend.' })\n    .blocks(\n      Blocks.Section({ text: `:wave: Hi there, ${Md.user(user)}!` }),\n      Blocks.Section({ text: `${Md.italic('Sorry')}, I didn't get that. Why don't you try out some of my slash commands?` }),\n      Blocks.Section({ text: `Here are some of the things that I can do:` }),\n      Blocks.Section()\n        .text(Md.listBullet(slashCommands\n          .map((item) => Md.codeInline(item)))))\n    .asUser()\n    .buildToObject();\n};\n```\n\n[**View Example on Slack Block Kit Builder Website**](https://app.slack.com/block-kit-builder/#%7B%22blocks%22:%5B%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22:wave:%20Hi%20there,%20%3C@U03N067AL%3E%21%22%7D,%22type%22:%22section%22%7D,%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22_Sorry_,%20I%20didn%27t%20get%20that.%20Why%20don%27t%20you%20try%20out%20some%20of%20my%20slash%20commands?%22%7D,%22type%22:%22section%22%7D,%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22Here%20are%20some%20of%20the%20things%20that%20I%20can%20do:%22%7D,%22type%22:%22section%22%7D,%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22%E2%80%A2%20%60/schedule%60%5Cn%E2%80%A2%20%60/cancel%60%5Cn%E2%80%A2%20%60/remind%60%5Cn%E2%80%A2%20%60/help%60%22%7D,%22type%22:%22section%22%7D%5D%7D)\n \n## :link: &nbsp; Other Useful Slack-Related Projects\n\n[Bolt for JavaScript](https://github.com/SlackAPI/bolt) – A simple framework for building [Slack](https://slack.com) apps, developed by [Slack](https://slack.com) themselves.\n\n[Node Slack SDK](https://github.com/slackapi/node-slack-sdk) – A great and powerful SDK for building [Slack](https://slack.com) Apps from the ground up.\n\n## :fire: &nbsp; Acknowledgements\n \n<img src=\"https://github.com/korywka.png\" alt=\"@korywka\" width=\"24\" height=\"24\" valign=\"bottom\" /> Taras Neporozhniy ([@korywka](https://github.com/korywka)) - For help and ideas along the way!\n\n<img src=\"https://cdn.dribbble.com/users/683635/avatars/normal/ee2c7c826bfe244b573d145376fe0b5a.png?1510328842\" alt=\"@ft502\" width=\"24\" height=\"24\" valign=\"bottom\" /> Alexey Chernyshov ([@ft502](https://dribbble.com/ft502) on Dribbble) - For such a beautiful logo!\n\n<img src=\"https://github.com/slackhq.png\" alt=\"@slackhq\" width=\"24\" height=\"24\" valign=\"bottom\" /> SlackHQ ([@slackhq](https://github.com/slackhq)) - For such a wonderful product and API!\n\n## :black_nib: &nbsp; Author\n\n<img src=\"https://github.com/raycharius.png\" alt=\"@raycharius\" width=\"24\" height=\"24\" valign=\"bottom\" /> Ray East ([@raycharius](https://github.com/raycharius)) - Huge Fan of Slack and **Block Builder** Maintainer\n","readmeFilename":"README.md","gitHead":"2b87ba5b23baa1af2556bb308798e6895f3cae5b","_id":"slack-block-builder@2.2.0-beta.0","_nodeVersion":"14.1.0","_npmVersion":"6.14.4","dist":{"integrity":"sha512-BOKvgZgZdw7E1otoN/NKnrbQOBSfmxpYMSQZjMLTJey7+47NccC/HtiCTcTn5pMxviyDlVu02zqJUc73gKahJA==","shasum":"588e32b2ba08f9da7a4f455e3f4457c0357cdf46","tarball":"https://registry.npmjs.org/slack-block-builder/-/slack-block-builder-2.2.0-beta.0.tgz","fileCount":176,"unpackedSize":278641,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD38YIFOl2UJ3NCVqlgzvHlFuZwLbC1CYWdSAs+mh4NNwIgUTR/MAkPvBZA+ZqW3Y7gHnUh806uUXp8yyevROiboYg="}]},"_npmUser":{"name":"raycharius","email":"raydeast@gmail.com"},"directories":{},"maintainers":[{"name":"bravecow","email":"neporozhniy@gmail.com"},{"name":"raycharius","email":"raydeast@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/slack-block-builder_2.2.0-beta.0_1632917975405_0.13253934149323987"},"_hasShrinkwrap":false},"2.2.0-beta.1":{"name":"slack-block-builder","version":"2.2.0-beta.1","description":"Maintainable code for interactive Slack messages, modals, home tabs, and workflow steps. A must-have for the Slack Block Kit framework.","author":{"name":"Ray East","url":"https://github.com/raycharius"},"repository":{"type":"git","url":"git+https://github.com/raycharius/slack-block-builder.git"},"homepage":"https://blockbuilder.dev","bugs":{"url":"https://github.com/raycharius/slack-block-builder/issues"},"main":"./dist/index.js","types":"./dist/index.d.ts","license":"MIT","keywords":["slack","interactive-messages","block-actions","bot","slack-bot","modal","block","kit","swiftui","bot","modal","messages","message-builder","block-builder","slack-block-builder","block-kit","blocks","botkit","bolt","slack-bolt"],"scripts":{"src:build":"tsc -p ./tsconfig.json","src:lint":"eslint 'src/**/*.ts' --fix","docs:build":"tsc -p ./tsconfig.docs.json","docs:lint":"eslint 'docs-generator/**/*.ts' --fix","docs:serve":"docsify serve ./docs","predocs:generate":"npm run docs:build","docs:generate":"node docs-generator-dist/index.js","docs:local":"docsify serve docs-generator --port 3000","tests:lint":"eslint 'tests/**/*.ts' --fix","tests:coverage":"codecov","clean":"shx rm -rf ./dist ./coverage ./docs-generator-dist","test":"jest --coverage","build":"npm run src:build","lint":"eslint 'src/**/*.ts' 'tests/**/*.ts' 'docs-generator/**/*.ts'","lint:fix":"eslint 'src/**/*.ts' 'tests/**/*.ts' 'docs-generator/**/*.ts' --fix","madge":"npx madge --circular --warning --extensions ts ./"},"devDependencies":{"@types/jest":"^26.0.22","@typescript-eslint/eslint-plugin":"^4.20.0","@typescript-eslint/parser":"^4.20.0","codecov":"^3.8.1","docsify-cli":"^4.4.3","docsify-server-renderer":"^4.12.1","docsify-tabs":"^1.4.4","eslint":"^6.8.0","eslint-config-airbnb-base":"^14.1.0","eslint-config-airbnb-typescript":"^12.3.1","eslint-plugin-import":"^2.22.1","eslint-plugin-jsx-a11y":"^6.4.1","eslint-plugin-react":"^7.23.1","eslint-plugin-react-hooks":"^4.2.0","jest":"^26.6.3","jest-environment-jsdom":"^26.6.2","madge":"^4.0.2","mustache":"^4.2.0","prettier-eslint-cli":"^5.0.0","shx":"^0.3.3","ts-jest":"^26.5.4","ts-node":"^8.10.2","typescript":"^4.2.3"},"readme":"<p align=\"center\">\n    <img src=\"https://raw.githubusercontent.com/raycharius/slack-block-builder/master/docs/resources/images/logo-horizontal.png\" alt=\"Logo\" width=\"600px\">\n</p>\n\n<p align=\"center\">\n    <h3 align=\"center\">Maintainable code for Slack interactive messages, modals, and home tabs.</h3>\n</p>\n\n<p align=\"center\">\n    Lightweight, zero-dependency library for declaratively building Slack Block Kit UI.\n    <br />\n    <br />\n    <a href=\"https://blockbuilder.dev\" target=\"_blank\"><strong>View the Docs »</strong></a>\n    <br />\n    <br />\n    <a href=\"#space_invader--usage\">Quick Start Guide</a>\n    ·\n    <a href=\"https://github.com/raycharius/slack-block-builder/issues\">Request Feature</a>\n    ·\n    <a href=\"https://github.com/raycharius/slack-block-builder/issues\">Report Bug</a>\n  </p>\n</p>\n\n![An example of using Block Builder](docs/resources/images/hero-image.png)\n\n***\n\n[![npm](https://img.shields.io/npm/v/slack-block-builder?color=bright-green)](https://www.npmjs.com/package/slack-block-builder)\n![NPM](https://img.shields.io/npm/l/slack-block-builder?color=bright-green)\n[![codecov](https://codecov.io/gh/raycharius/slack-block-builder/branch/master/graph/badge.svg)](https://codecov.io/gh/raycharius/slack-block-builder)\n\n> :tada: **Block Builder Version 2.0 is here! Learn about the new features and how to install it [here](docs/announcements/version-2.md).**\n\n**Block Builder** helps you keep your Slack app code for UI maintainable, testable, and reusable. It has a declarative, chainable syntax inspired by [SwiftUI](https://developer.apple.com/documentation/swiftui) and is built for better UI architecture.\n\n### :zap: &nbsp; Features\n\n* Declarative [SwiftUI](https://developer.apple.com/xcode/swiftui/) inspired syntax.\n* The ability to build more complex flows using loops and conditionals.\n* A `printPreviewURL()` method that outputs a link to preview your UI on Slack's [Block Kit Builder website](https://app.slack.com/block-kit-builder) for easier prototyping.\n* A set of helper functions for formatting text with Slack's markdown standard.\n* In-depth [doc site](https://blockbuilder.dev) at [https://blockbuilder.dev](https://blockbuilder.dev).\n* [Support](#block-kit-support-and-reference) for all current Slack Block Kit objects.\n* A great TypeScript experience.\n* Extensive JSDoc hints with explanations, validation rules, and quick links to full documentation.\n* Zero dependencies.\n\n### :rocket: &nbsp; Coming Soon\n\n* `Paginator` component.\n* `Accordion` component.\n\n### :gift: &nbsp; Benefits\n\n* Write three times less code.\n* Build more sophistocated, elegant flows.\n* Design better UI architecture for your Slack apps.\n* Focus more on code in your IDE than on studying the [Slack API docs](https://api.slack.com/).\n* Easily integrate localizations into your app.\n\n### :phone: &nbsp; Let's Talk?\n\nFeedback – love it! Aside from GitHub Issues, there are Slack channels available in popular bot communities to discuss **Block Builder** – we'll see you there! :raised_hands:\n\n* **Slack Community** – [\\#block-builder](https://slackcommunity.com)\n* **Bot Developer Hangout** – [\\#block-builder](https://community.botkit.ai)\n\n### :floppy_disk: &nbsp; Installation \n\n**Block Builder** requires Node.js 12 or higher, and, when using TypeScript, TypeScript 3.8 or higher.\n\n#### Using NPM: \n\n``` bash\nnpm install --save slack-block-builder\n```\n\n#### Using Yarn: \n\n``` bash\nyarn add slack-block-builder\n```\n\n### :space_invader: &nbsp; Usage\n\nFor full documentation, make sure you head over to [https://blockbuilder.dev](https://blockbuilder.dev).\n\n\n### Importing\n\nThe functions for creating objects can be both imported directly or through an object that groups them by category.\n\n```javascript\n// Importing exposed groups of objects\n\nimport { Surfaces, Blocks, Elements, Bits, Utilities } from 'slack-block-builder';\n\n// Importing objects top-level\n\nimport { Modal, Section, Actions, Button } from 'slack-block-builder';\n```\n\nThe same goes for importing Slack markdown helper functions:\n\n```javascript\n// Importing the Md object\n\nimport { Surfaces, Blocks, Md } from 'slack-block-builder';\n\n// Importing the functions top-level\n\nimport { Modal, Section, bold, link } from 'slack-block-builder';\n```\n\n### Group Explanations\n\n`Surfaces` – Contains functions for creating modals, messages, home tabs, and workflow steps. \n\n`Blocks` – Layout blocks used to organize the UI.\n\n`Elements` – UI elements that are used to capture user interaction.\n\n`Bits` – These are composition objects and other bits and pieces from Slack's docs. Included are `Attachment`, `Options`, `OptionGroup`, and `ConfirmationDialog`. They felt like they were deserving of their own category.\n\n`Utilities` – A group of utility functions. See [Utility Functions](#utility-functions).\n\n`Md` – Helper functions for formatting text with Slack's markdown. See [Markdown Helpers](#markdown-helpers).\n\n### Block Kit Support and Reference\n\nBelow is a list of supported objects and how to access them in **Block Builder**:\n\n| **Name**             | **Type**           | **Support**                    | **Accessed Via**                      \n|----------------------|--------------------|--------------------------------|-----------------------------------------\n| Home Tab             | Surface            | :white_check_mark:             | `Surfaces.HomeTab()`                       \n| Message              | Surface            | :white_check_mark:             | `Surfaces.Message()`                       \n| Modal                | Surface            | :white_check_mark:             | `Surfaces.Modal()`                         \n| Workflow Step        | Surface            | :white_check_mark:             | `Surfaces.WorkflowStep()`                         \n| Actions              | Block              | :white_check_mark:             | `Blocks.Actions()`                \n| Context              | Block              | :white_check_mark:             | `Blocks.Context()`                \n| Divider              | Block              | :white_check_mark:             | `Blocks.Divider()`                \n| File                 | Block              | :white_check_mark:             | `Blocks.File()`\n| Header               | Block              | :white_check_mark:             | `Blocks.Header()`\n| Image                | Block              | :white_check_mark:             | `Blocks.Image()`                  \n| Input                | Block              | :white_check_mark:             | `Blocks.Input()`                  \n| Section              | Block              | :white_check_mark:             | `Blocks.Section()`                \n| Button               | Element            | :white_check_mark:️             | `Elements.Button()`               \n| Checkboxes           | Element            | :white_check_mark:             | `Elements.Checkboxes()`           \n| Date Picker          | Element            | :white_check_mark:             | `Elements.DatePicker()`\n| Time Picker          | Element            | :white_check_mark:             | `Elements.TimePicker()`           \n| Image                | Element            | :white_check_mark:             | `Elements.Img()`                  \n| Overflow Menu        | Element            | :white_check_mark:             | `Elements.OverflowMenu()`         \n| Radio Buttons        | Element            | :white_check_mark:             | `Elements.RadioButtons()`         \n| Plain-Text Input     | Element            | :white_check_mark:             | `Elements.TextInput()`            \n| Select Menus         | Element            | :white_check_mark:             | `Elements.[Type]Select()`          \n| Multi-Select Menus   | Element            | :white_check_mark:             | `Elements.[Type]MultiSelect()`     \n| Option               | Composition Object | :white_check_mark:             | `Bits.Option()`                   \n| Confirm Dialog       | Composition Object | :white_check_mark:             | `Bits.ConfirmationDialog()`       \n| Option Group         | Composition Object | :white_check_mark:             | `Bits.OptionGroup()`\n| Attachment           | Legacy Feature     | :white_check_mark:             | `Bits.Attachment()`              \n\n### Creating a Simple Interactive Message\n\nLet's take a look at how to compose an interactive message. Even though [Slack](https://slack.com) now has modals, these have always been the basis for [Slack](https://slack.com) apps.\n\nFunctions that return Block Kit objects have setter methods for all of the properties, but also support parameters that are passed into the constructor for properties with primitive types.\n\n```javascript\nimport { Message, Blocks, Elements } from 'slack-block-builder';\n\nconst myMessage = ({ channel, dangerLevel }) => {\n  return Message()\n    .channel(channel)\n    .text('Alas, my friend.')\n    .blocks(\n      Blocks.Section()\n        .text('One does not simply walk into Slack and click a button.'),\n      Blocks.Section()\n        .text('At least that\\'s what my friend Slackomir said :crossed_swords:'),\n      Blocks.Divider(),\n      Blocks.Actions()\n        .elements(\n          Elements.Button()\n            .text('Sure One Does')\n            .actionId('gotClicked')\n            .danger(dangerLevel > 42), // Optional argument, defaults to 'true'\n          Elements.Button()\n            .text('One Does Not')\n            .actionId('scaredyCat')\n            .primary()))\n    .asUser()\n    .buildToJSON();\n};\n```\n\nAnd now an example with using both the setter methods and passing parameters into the functions at initiation:\n\n```javascript\nimport { Message, Blocks, Elements } from 'slack-block-builder';\n\nconst myShorterMessage = ({ channel, dangerLevel }) => {\n  return Message({ channel, text: 'Alas, my friend.' })\n    .blocks(\n      Blocks.Section({ text: 'One does not simply walk into Slack and click a button.' }),\n      Blocks.Section({ text: 'At least that\\'s what my friend Slackomir said :crossed_swords:' }),\n      Blocks.Divider(),\n      Blocks.Actions()\n        .elements(\n          Elements.Button({ text: 'Sure One Does', actionId: 'gotClicked' })\n            .danger(dangerLevel > 42), // Optional argument, defaults to 'true'\n          Elements.Button({ text: 'One Does Not', actionId: 'scaredyCat' })\n            .primary()))\n    .asUser()\n    .buildToJSON();\n};\n```\n\nBoth of these examples render the message below. And the best part? It only took 15 lines of code, as opposed to the 44 lines of JSON generated as a result. \n\n![An example of using Block Builder for Messages](docs/resources/images/simple-message-example.png)\n\n[**View Example on Slack Block Kit Builder Website**](https://app.slack.com/block-kit-builder#%7B%22blocks%22:%5B%7B%22type%22:%22section%22,%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22One%20does%20not%20simply%20walk%20into%20Slack%20and%20click%20a%20button.%22%7D%7D,%7B%22type%22:%22section%22,%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22At%20least%20that's%20what%20my%20friend%20Slackomir%20said%20:crossed_swords:%22%7D%7D,%7B%22type%22:%22divider%22%7D,%7B%22type%22:%22actions%22,%22elements%22:%5B%7B%22type%22:%22button%22,%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22Sure%20One%20Does%22%7D,%22action_id%22:%22gotClicked%22,%22style%22:%22danger%22%7D,%7B%22type%22:%22button%22,%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22One%20Does%20Not%22%7D,%22action_id%22:%22scaredyCat%22,%22style%22:%22primary%22%7D%5D%7D%5D%7D)\n\n### Creating a Simple Modal\n\nLet's take a look at how modals are created. Here we'll also take a look at working with Bits and with loops, by adding options with the `Array.map()` method.\n\nYou'll noticed that we've added an inline condition that returns an initial option only if one has been passed into the function. This is because all the setter methods prune values of `undefined`, uncovering opportunities for inline logic. \n\n```javascript\nimport { Modal, Blocks, Elements, Bits } from 'slack-block-builder';\n\nconst myShorterModal = ({ menuOptions, selected }) => {\n  return Modal({ title: 'PizzaMate', submit: 'Get Fed' })\n    .blocks(\n      Blocks.Section({ text: 'Hey there, colleague!' }),\n      Blocks.Section({ text: 'Hurray for corporate pizza! Let\\'s get you fed and happy :pizza:' }),\n      Blocks.Input({ label: 'What can we call you?' })\n        .element(\n          Elements.TextInput({ placeholder: 'Hi, my name is... (What?!) (Who?!)' })\n            .actionId('name')),\n      Blocks.Input({ label: 'Which floor are you on?' })\n        .element(\n          Elements.TextInput({ placeholder: 'HQ – Fifth Floor' })\n            .actionId('floor')),\n      Blocks.Input({ label: 'What\\'ll you have?' })\n        .element(\n          Elements.StaticSelect({ placeholder: 'Choose your favorite...' })\n            .actionId('item')\n            .options(menuOptions\n              .map((item) => Bits.Option({ text: item.name, value: item.id })))\n            .initialOption(selected && Bits.Option({ text: selected.name, value: selected.id }))))\n    .buildToJSON();\n};\n```\n\nBoth of these examples render the modal below. \n\n![An example of using Block Builder for Modals](docs/resources/images/simple-modal-example.png)\n\n[**View Example on Slack Block Kit Builder Website**](https://app.slack.com/block-kit-builder#%7B%22type%22:%22modal%22,%22title%22:%7B%22type%22:%22plain_text%22,%22text%22:%22PizzaMate%22%7D,%22blocks%22:%5B%7B%22type%22:%22section%22,%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22Hey%20there,%20colleague!%22%7D%7D,%7B%22type%22:%22section%22,%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22Hurray%20for%20corporate%20pizza!%20Let's%20get%20you%20fed%20and%20happy%20:pizza:%22%7D%7D,%7B%22type%22:%22input%22,%22label%22:%7B%22type%22:%22plain_text%22,%22text%22:%22What%20can%20we%20call%20you?%22%7D,%22element%22:%7B%22type%22:%22plain_text_input%22,%22action_id%22:%22name%22,%22placeholder%22:%7B%22type%22:%22plain_text%22,%22text%22:%22Hi,%20my%20name%20is...%20(What?!)%20(Who?!)%22%7D%7D%7D,%7B%22type%22:%22input%22,%22label%22:%7B%22type%22:%22plain_text%22,%22text%22:%22Which%20floor%20are%20you%20on?%22%7D,%22element%22:%7B%22type%22:%22plain_text_input%22,%22action_id%22:%22floor%22,%22placeholder%22:%7B%22type%22:%22plain_text%22,%22text%22:%22HQ%20–%20Fifth%20Floor%22%7D%7D%7D,%7B%22type%22:%22input%22,%22label%22:%7B%22type%22:%22plain_text%22,%22text%22:%22What'll%20you%20have?%22%7D,%22element%22:%7B%22type%22:%22static_select%22,%22placeholder%22:%7B%22type%22:%22plain_text%22,%22text%22:%22Choose%20your%20favorite...%22%7D,%22action_id%22:%22item%22,%22options%22:%5B%7B%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22:cheese_wedge:%20With%20Cheeze%22%7D,%22value%22:%22012%22%7D,%7B%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22:fish:%20With%20Anchovies%22%7D,%22value%22:%22013%22%7D,%7B%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22:cookie:%20With%20Scooby%20Snacks%22%7D,%22value%22:%22014%22%7D,%7B%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22:beer:%20I%20Prefer%20Steak%20and%20Beer%22%7D,%22value%22:%22015%22%7D%5D%7D%7D%5D,%22submit%22:%7B%22type%22:%22plain_text%22,%22text%22:%22Get%20Fed%22%7D%7D)\n\n### Utility Functions\n\nThe `Utilities` object contains various utility functions for creating UI. Currently, there are two:\n\n`BlockCollection()` – Accepts multiple arguments or an array of blocks and returns them in an array, in their built state.\n\n`AttachmentCollection()` – Accepts multiple arguments or an array of attachments and returns them in an array, in their built state.\n\nThese two functions are useful when you wish to keep surface or view configuration separate from UI representation.\n\nAn example using Slack's `WebClient` from their [SDK for Node.js](https://github.com/slackapi/node-slack-sdk):\n\n```javascript\nimport { BlockCollection, AttachmentCollection, Blocks } from 'slack-block-builder';\nimport { WebClient } from '@slack/web-api';\n\nconst client = new WebClient(process.env.SLACK_TOKEN);\n\nclient.chat.postMessage({\n  channel: 'ABCDEFG',\n  text: 'Hello, my dear, sweet world!',\n  blocks: BlockCollection( /* Pass in blocks */ ),\n  attachments: AttachmentCollection( /* Pass in attachments */ ),\n})\n.then((response) => console.log(response))\n.catch((error) => console.log(error));\n```\n\nAnother example where you might find `BlockCollection()` helpful is when [unfurling links in messages](https://api.slack.com/reference/messaging/link-unfurling):\n\n```javascript\nimport { BlockCollection, Blocks } from 'slack-block-builder';\nimport { WebClient } from '@slack/web-api';\n\nconst client = new WebClient(process.env.SLACK_TOKEN);\n\nconst unfurl = ({ channel, ts, url }) => client.chat.unfurl({\n  channel,\n  ts,\n  unfurls: { [url]: BlockCollection( /* Pass in blocks */ ) },\n})\n.then((response) => console.log(response))\n.catch((error) => console.log(error));\n```\n\n### Markdown Helpers\n\nOften you'll find that you need to format text in your messages and modals. *Block Builder* has helper functions available to simply that process. They are available both as members of the `Md` object and as top-level imports. You can find the full list of functions on the [Block Builder doc site](https://blockbuilder.dev):\n\n``` javascript\nimport { Message, Blocks, Md } from 'slack-block-builder';\n\nconst myMdMessage = ({ channel, user }) => {\n  const slashCommands = ['/schedule', '/cancel', '/remind', '/help'];\n\n  return Message({ channel, text: 'Alas, my friend.' })\n    .blocks(\n      Blocks.Section({ text: `:wave: Hi there, ${Md.user(user)}!` }),\n      Blocks.Section({ text: `${Md.italic('Sorry')}, I didn't get that. Why don't you try out some of my slash commands?` }),\n      Blocks.Section({ text: `Here are some of the things that I can do:` }),\n      Blocks.Section()\n        .text(Md.listBullet(slashCommands\n          .map((item) => Md.codeInline(item)))))\n    .asUser()\n    .buildToObject();\n};\n```\n\n[**View Example on Slack Block Kit Builder Website**](https://app.slack.com/block-kit-builder/#%7B%22blocks%22:%5B%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22:wave:%20Hi%20there,%20%3C@U03N067AL%3E%21%22%7D,%22type%22:%22section%22%7D,%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22_Sorry_,%20I%20didn%27t%20get%20that.%20Why%20don%27t%20you%20try%20out%20some%20of%20my%20slash%20commands?%22%7D,%22type%22:%22section%22%7D,%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22Here%20are%20some%20of%20the%20things%20that%20I%20can%20do:%22%7D,%22type%22:%22section%22%7D,%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22%E2%80%A2%20%60/schedule%60%5Cn%E2%80%A2%20%60/cancel%60%5Cn%E2%80%A2%20%60/remind%60%5Cn%E2%80%A2%20%60/help%60%22%7D,%22type%22:%22section%22%7D%5D%7D)\n \n## :link: &nbsp; Other Useful Slack-Related Projects\n\n[Bolt for JavaScript](https://github.com/SlackAPI/bolt) – A simple framework for building [Slack](https://slack.com) apps, developed by [Slack](https://slack.com) themselves.\n\n[Node Slack SDK](https://github.com/slackapi/node-slack-sdk) – A great and powerful SDK for building [Slack](https://slack.com) Apps from the ground up.\n\n## :fire: &nbsp; Acknowledgements\n \n<img src=\"https://github.com/korywka.png\" alt=\"@korywka\" width=\"24\" height=\"24\" valign=\"bottom\" /> Taras Neporozhniy ([@korywka](https://github.com/korywka)) - For help and ideas along the way!\n\n<img src=\"https://cdn.dribbble.com/users/683635/avatars/normal/ee2c7c826bfe244b573d145376fe0b5a.png?1510328842\" alt=\"@ft502\" width=\"24\" height=\"24\" valign=\"bottom\" /> Alexey Chernyshov ([@ft502](https://dribbble.com/ft502) on Dribbble) - For such a beautiful logo!\n\n<img src=\"https://github.com/slackhq.png\" alt=\"@slackhq\" width=\"24\" height=\"24\" valign=\"bottom\" /> SlackHQ ([@slackhq](https://github.com/slackhq)) - For such a wonderful product and API!\n\n## :black_nib: &nbsp; Author\n\n<img src=\"https://github.com/raycharius.png\" alt=\"@raycharius\" width=\"24\" height=\"24\" valign=\"bottom\" /> Ray East ([@raycharius](https://github.com/raycharius)) - Huge Fan of Slack and **Block Builder** Maintainer\n","readmeFilename":"README.md","gitHead":"95e58391167a3927e6cc4f38c4d43f5b0c0489f4","_id":"slack-block-builder@2.2.0-beta.1","_nodeVersion":"14.1.0","_npmVersion":"6.14.4","dist":{"integrity":"sha512-ubm5guJsdkCeITNKfOW6EPvcb/2HC6sIpOcoGxGWwKf2NUdDprX7B402UHu+4ckEIdUDa+ScZ5lN8AfeDZkWQQ==","shasum":"93b03b3a0ff6fb71cab320a093ac291c331a1933","tarball":"https://registry.npmjs.org/slack-block-builder/-/slack-block-builder-2.2.0-beta.1.tgz","fileCount":176,"unpackedSize":278101,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC4sdZ8VYK9IUOikMhMH2GRPkiDUuC6HJ4elLJ9IMBpYQIhAK9peTT/dxCMLOcfWzg1WqfzSRnhBONKmx6onWYh/Vn5"}]},"_npmUser":{"name":"raycharius","email":"raydeast@gmail.com"},"directories":{},"maintainers":[{"name":"bravecow","email":"neporozhniy@gmail.com"},{"name":"raycharius","email":"raydeast@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/slack-block-builder_2.2.0-beta.1_1632942159297_0.5930800446041276"},"_hasShrinkwrap":false},"2.2.0-beta.2":{"name":"slack-block-builder","version":"2.2.0-beta.2","description":"Maintainable code for interactive Slack messages, modals, home tabs, and workflow steps. A must-have for the Slack Block Kit framework.","author":{"name":"Ray East","url":"https://github.com/raycharius"},"repository":{"type":"git","url":"git+https://github.com/raycharius/slack-block-builder.git"},"homepage":"https://blockbuilder.dev","bugs":{"url":"https://github.com/raycharius/slack-block-builder/issues"},"main":"./dist/index.js","types":"./dist/index.d.ts","license":"MIT","keywords":["slack","interactive-messages","block-actions","bot","slack-bot","modal","block","kit","swiftui","bot","modal","messages","message-builder","block-builder","slack-block-builder","block-kit","blocks","botkit","bolt","slack-bolt"],"scripts":{"src:build":"tsc -p ./tsconfig.json","src:lint":"eslint 'src/**/*.ts' --fix","docs:build":"tsc -p ./tsconfig.docs.json","docs:lint":"eslint 'docs-generator/**/*.ts' --fix","docs:serve":"docsify serve ./docs","predocs:generate":"npm run docs:build","docs:generate":"node docs-generator-dist/index.js","docs:local":"docsify serve docs --port 3000","tests:lint":"eslint 'tests/**/*.ts' --fix","tests:coverage":"codecov","clean":"shx rm -rf ./dist ./coverage ./docs-generator-dist","test":"jest --coverage","build":"npm run src:build","lint":"eslint 'src/**/*.ts' 'tests/**/*.ts' 'docs-generator/**/*.ts'","lint:fix":"eslint 'src/**/*.ts' 'tests/**/*.ts' 'docs-generator/**/*.ts' --fix","madge":"npx madge --circular --warning --extensions ts ./"},"devDependencies":{"@types/jest":"^26.0.22","@typescript-eslint/eslint-plugin":"^4.20.0","@typescript-eslint/parser":"^4.20.0","codecov":"^3.8.1","docsify-cli":"^4.4.3","docsify-server-renderer":"^4.12.1","docsify-tabs":"^1.4.4","eslint":"^6.8.0","eslint-config-airbnb-base":"^14.1.0","eslint-config-airbnb-typescript":"^12.3.1","eslint-plugin-import":"^2.22.1","eslint-plugin-jsx-a11y":"^6.4.1","eslint-plugin-react":"^7.23.1","eslint-plugin-react-hooks":"^4.2.0","jest":"^26.6.3","jest-environment-jsdom":"^26.6.2","madge":"^4.0.2","mustache":"^4.2.0","prettier-eslint-cli":"^5.0.0","shx":"^0.3.3","ts-jest":"^26.5.4","ts-node":"^8.10.2","typescript":"^4.2.3"},"readme":"<p align=\"center\">\n    <img src=\"https://raw.githubusercontent.com/raycharius/slack-block-builder/master/docs/resources/images/logo-horizontal.png\" alt=\"Logo\" width=\"600px\">\n</p>\n\n<p align=\"center\">\n    <h3 align=\"center\">Maintainable code for Slack interactive messages, modals, and home tabs.</h3>\n</p>\n\n<p align=\"center\">\n    Lightweight, zero-dependency library for declaratively building Slack Block Kit UI.\n    <br />\n    <br />\n    <a href=\"https://blockbuilder.dev\" target=\"_blank\"><strong>View the Docs »</strong></a>\n    <br />\n    <br />\n    <a href=\"#space_invader--usage\">Quick Start Guide</a>\n    ·\n    <a href=\"https://github.com/raycharius/slack-block-builder/issues\">Request Feature</a>\n    ·\n    <a href=\"https://github.com/raycharius/slack-block-builder/issues\">Report Bug</a>\n  </p>\n</p>\n\n![An example of using Block Builder](docs/resources/images/block-builder-hero-image.png)\n\n***\n\n[![npm](https://img.shields.io/npm/v/slack-block-builder?color=bright-green)](https://www.npmjs.com/package/slack-block-builder)\n![NPM](https://img.shields.io/npm/l/slack-block-builder?color=bright-green)\n[![codecov](https://codecov.io/gh/raycharius/slack-block-builder/branch/master/graph/badge.svg)](https://codecov.io/gh/raycharius/slack-block-builder)\n\n**Block Builder** helps you keep your Slack app code for UI maintainable, testable, and reusable. It has a declarative, chainable syntax inspired by [SwiftUI](https://developer.apple.com/documentation/swiftui) and is built for better UI architecture.\n\n### :zap: &nbsp; Features\n\n* Declarative [SwiftUI](https://developer.apple.com/xcode/swiftui/) inspired syntax.\n* Commonly-used UI components, such as a `Paginator` and `Accordion`.\n* The ability to build more complex flows using loops and conditionals.\n* A `printPreviewURL()` method that outputs a link to preview your UI on Slack's [Block Kit Builder website](https://app.slack.com/block-kit-builder) for easier prototyping.\n* A set of helper functions for formatting text with Slack's markdown standard.\n* In-depth [doc site](https://blockbuilder.dev) at [https://blockbuilder.dev](https://blockbuilder.dev).\n* [Support](#block-kit-support-and-reference) for all current Slack Block Kit objects.\n* A great TypeScript experience.\n* Extensive JSDoc hints with explanations, validation rules, and quick links to full documentation.\n* Zero dependencies.\n\n### :gift: &nbsp; Benefits\n\n* Write three times less code.\n* Build more sophisticated, elegant flows.\n* Design better UI architecture for your Slack apps.\n* Focus more on code in your IDE than on studying the [Slack API docs](https://api.slack.com/).\n* Easily integrate localizations into your app.\n\n### :busts_in_silhouette: &nbsp; Join The Community\n\nFeedback – love it! Aside from GitHub Issues, there's a Slack channel available in the Slack Community workspace to discuss **Block Builder** – we'll see you there! :raised_hands:\n\n* **Slack Community** – [\\#block-builder](https://slackcommunity.com)\n\n### :floppy_disk: &nbsp; Installation \n\n**Block Builder** requires Node.js 12 or higher, and, when using TypeScript, TypeScript 3.8 or higher.\n\n#### Using NPM: \n\n``` bash\nnpm install --save slack-block-builder\n```\n\n#### Using Yarn: \n\n``` bash\nyarn add slack-block-builder\n```\n\n### :space_invader: &nbsp; Usage\n\nFor full documentation, make sure you head over to [https://blockbuilder.dev](https://blockbuilder.dev).\n\n\n### Importing\n\nThe functions for creating objects can be both imported directly or through an object that groups them by category.\n\n```javascript\n// Importing exposed groups of objects\n\nimport { Surfaces, Blocks, Elements, Bits, Utilities } from 'slack-block-builder';\n\n// Importing objects top-level\n\nimport { Modal, Section, Actions, Button } from 'slack-block-builder';\n```\n\nThe same goes for importing Slack markdown helper functions:\n\n```javascript\n// Importing the Md object\n\nimport { Surfaces, Blocks, Md } from 'slack-block-builder';\n\n// Importing the functions top-level\n\nimport { Modal, Section, bold, link } from 'slack-block-builder';\n```\n\n### Object Breakdown\n\n`Surfaces` – Contains functions for creating modals, messages, home tabs, and workflow steps. \n\n`Blocks` – Layout blocks used to organize the UI.\n\n`Elements` – UI elements that are used to capture user interaction.\n\n`Bits` – These are composition objects and other bits and pieces from Slack's docs. Included are `Attachment`, `Options`, `OptionGroup`, and `ConfirmationDialog`. They felt like they were deserving of their own category.\n\n`Utilities` – A group of utility functions. See [Utility Functions](#utility-functions).\n\n`Md` – Helper functions for formatting text with Slack's markdown. See [Markdown Helpers](#markdown-helpers).\n\n### Block Kit Support and Reference\n\nBelow is a list of supported objects and how to access them in **Block Builder**:\n\n| **Name**             | **Type**           | **Support**                    | **Accessed Via**                      \n|----------------------|--------------------|--------------------------------|-----------------------------------------\n| Home Tab             | Surface            | :white_check_mark:             | `Surfaces.HomeTab()`                       \n| Message              | Surface            | :white_check_mark:             | `Surfaces.Message()`                       \n| Modal                | Surface            | :white_check_mark:             | `Surfaces.Modal()`                         \n| Workflow Step        | Surface            | :white_check_mark:             | `Surfaces.WorkflowStep()`                         \n| Actions              | Block              | :white_check_mark:             | `Blocks.Actions()`                \n| Context              | Block              | :white_check_mark:             | `Blocks.Context()`                \n| Divider              | Block              | :white_check_mark:             | `Blocks.Divider()`                \n| File                 | Block              | :white_check_mark:             | `Blocks.File()`\n| Header               | Block              | :white_check_mark:             | `Blocks.Header()`\n| Image                | Block              | :white_check_mark:             | `Blocks.Image()`                  \n| Input                | Block              | :white_check_mark:             | `Blocks.Input()`                  \n| Section              | Block              | :white_check_mark:             | `Blocks.Section()`                \n| Button               | Element            | :white_check_mark:️             | `Elements.Button()`               \n| Checkboxes           | Element            | :white_check_mark:             | `Elements.Checkboxes()`           \n| Date Picker          | Element            | :white_check_mark:             | `Elements.DatePicker()`\n| Time Picker          | Element            | :white_check_mark:             | `Elements.TimePicker()`           \n| Image                | Element            | :white_check_mark:             | `Elements.Img()`                  \n| Overflow Menu        | Element            | :white_check_mark:             | `Elements.OverflowMenu()`         \n| Radio Buttons        | Element            | :white_check_mark:             | `Elements.RadioButtons()`         \n| Plain-Text Input     | Element            | :white_check_mark:             | `Elements.TextInput()`            \n| Select Menus         | Element            | :white_check_mark:             | `Elements.[Type]Select()`          \n| Multi-Select Menus   | Element            | :white_check_mark:             | `Elements.[Type]MultiSelect()`     \n| Option               | Composition Object | :white_check_mark:             | `Bits.Option()`                   \n| Confirm Dialog       | Composition Object | :white_check_mark:             | `Bits.ConfirmationDialog()`       \n| Option Group         | Composition Object | :white_check_mark:             | `Bits.OptionGroup()`\n| Attachment           | Legacy Feature     | :white_check_mark:             | `Bits.Attachment()`              \n\n### Creating a Simple Interactive Message\n\nLet's take a look at how to compose an interactive message. Even though [Slack](https://slack.com) now has modals, these have always been the basis for [Slack](https://slack.com) apps.\n\nFunctions that return Block Kit objects have setter methods for all of the properties, but also support parameters that are passed into the constructor for properties with primitive types.\n\n```javascript\nimport { Message, Blocks, Elements } from 'slack-block-builder';\n\nexport default ({ channel, dangerLevel }) =>\n  Message()\n    .channel(channel)\n    .text('Alas, my friend.')\n    .blocks(\n      Blocks.Section()\n        .text('One does not simply walk into Slack and click a button.'),\n      Blocks.Section()\n        .text('At least that\\'s what my friend Slackomir said :crossed_swords:'),\n      Blocks.Divider(),\n      Blocks.Actions()\n        .elements(\n          Elements.Button()\n            .text('Sure One Does')\n            .actionId('gotClicked')\n            .danger(dangerLevel > 42), // Optional argument, defaults to 'true'\n          Elements.Button()\n            .text('One Does Not')\n            .actionId('scaredyCat')\n            .primary()))\n    .asUser()\n    .buildToJSON();\n```\n\nAnd now an example with using both the setter methods and passing parameters into the functions at initiation:\n\n```javascript\nimport { Message, Blocks, Elements } from 'slack-block-builder';\n\nexport default ({ channel, dangerLevel }) =>\n  Message({ channel, text: 'Alas, my friend.' })\n    .blocks(\n      Blocks.Section({ text: 'One does not simply walk into Slack and click a button.' }),\n      Blocks.Section({ text: 'At least that\\'s what my friend Slackomir said :crossed_swords:' }),\n      Blocks.Divider(),\n      Blocks.Actions()\n        .elements(\n          Elements.Button({ text: 'Sure One Does', actionId: 'gotClicked' })\n            .danger(dangerLevel > 42), // Optional argument, defaults to 'true'\n          Elements.Button({ text: 'One Does Not', actionId: 'scaredyCat' })\n            .primary()))\n    .asUser()\n    .buildToJSON();\n```\n\nBoth of these examples render the message below. And the best part? It only took 15 lines of code, as opposed to the 44 lines of JSON generated as a result. \n\n![An example of using Block Builder for Messages](docs/resources/images/simple-message-example.png)\n\n[**View Example on Slack Block Kit Builder Website**](https://app.slack.com/block-kit-builder#%7B%22blocks%22:%5B%7B%22type%22:%22section%22,%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22One%20does%20not%20simply%20walk%20into%20Slack%20and%20click%20a%20button.%22%7D%7D,%7B%22type%22:%22section%22,%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22At%20least%20that's%20what%20my%20friend%20Slackomir%20said%20:crossed_swords:%22%7D%7D,%7B%22type%22:%22divider%22%7D,%7B%22type%22:%22actions%22,%22elements%22:%5B%7B%22type%22:%22button%22,%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22Sure%20One%20Does%22%7D,%22action_id%22:%22gotClicked%22,%22style%22:%22danger%22%7D,%7B%22type%22:%22button%22,%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22One%20Does%20Not%22%7D,%22action_id%22:%22scaredyCat%22,%22style%22:%22primary%22%7D%5D%7D%5D%7D)\n\n### Creating a Simple Modal\n\nLet's take a look at how modals are created. Here we'll also take a look at working with Bits and with loops, by adding options with the `Array.map()` method.\n\nYou'll noticed that we've added an inline condition that returns an initial option only if one has been passed into the function. This is because all the setter methods prune values of `undefined`, uncovering opportunities for inline logic. \n\n```javascript\nimport { Modal, Blocks, Elements, Bits } from 'slack-block-builder';\n\nexport default ({ menuOptions, selected }) =>\n  Modal({ title: 'PizzaMate', submit: 'Get Fed' })\n    .blocks(\n      Blocks.Section({ text: 'Hey there, colleague!' }),\n      Blocks.Section({ text: 'Hurray for corporate pizza! Let\\'s get you fed and happy :pizza:' }),\n      Blocks.Input({ label: 'What can we call you?' })\n        .element(\n          Elements.TextInput({ placeholder: 'Hi, my name is... (What?!) (Who?!)' })\n            .actionId('name')),\n      Blocks.Input({ label: 'Which floor are you on?' })\n        .element(\n          Elements.TextInput({ placeholder: 'HQ – Fifth Floor' })\n            .actionId('floor')),\n      Blocks.Input({ label: 'What\\'ll you have?' })\n        .element(\n          Elements.StaticSelect({ placeholder: 'Choose your favorite...' })\n            .actionId('item')\n            .options(menuOptions\n              .map((item) => Bits.Option({ text: item.name, value: item.id })))\n            .initialOption(selected && Bits.Option({ text: selected.name, value: selected.id }))))\n    .buildToJSON();\n```\n\nBoth of these examples render the modal below. \n\n![An example of using Block Builder for Modals](docs/resources/images/simple-modal-example.png)\n\n[**View Example on Slack Block Kit Builder Website**](https://app.slack.com/block-kit-builder#%7B%22type%22:%22modal%22,%22title%22:%7B%22type%22:%22plain_text%22,%22text%22:%22PizzaMate%22%7D,%22blocks%22:%5B%7B%22type%22:%22section%22,%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22Hey%20there,%20colleague!%22%7D%7D,%7B%22type%22:%22section%22,%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22Hurray%20for%20corporate%20pizza!%20Let's%20get%20you%20fed%20and%20happy%20:pizza:%22%7D%7D,%7B%22type%22:%22input%22,%22label%22:%7B%22type%22:%22plain_text%22,%22text%22:%22What%20can%20we%20call%20you?%22%7D,%22element%22:%7B%22type%22:%22plain_text_input%22,%22action_id%22:%22name%22,%22placeholder%22:%7B%22type%22:%22plain_text%22,%22text%22:%22Hi,%20my%20name%20is...%20(What?!)%20(Who?!)%22%7D%7D%7D,%7B%22type%22:%22input%22,%22label%22:%7B%22type%22:%22plain_text%22,%22text%22:%22Which%20floor%20are%20you%20on?%22%7D,%22element%22:%7B%22type%22:%22plain_text_input%22,%22action_id%22:%22floor%22,%22placeholder%22:%7B%22type%22:%22plain_text%22,%22text%22:%22HQ%20–%20Fifth%20Floor%22%7D%7D%7D,%7B%22type%22:%22input%22,%22label%22:%7B%22type%22:%22plain_text%22,%22text%22:%22What'll%20you%20have?%22%7D,%22element%22:%7B%22type%22:%22static_select%22,%22placeholder%22:%7B%22type%22:%22plain_text%22,%22text%22:%22Choose%20your%20favorite...%22%7D,%22action_id%22:%22item%22,%22options%22:%5B%7B%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22:cheese_wedge:%20With%20Cheeze%22%7D,%22value%22:%22012%22%7D,%7B%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22:fish:%20With%20Anchovies%22%7D,%22value%22:%22013%22%7D,%7B%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22:cookie:%20With%20Scooby%20Snacks%22%7D,%22value%22:%22014%22%7D,%7B%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22:beer:%20I%20Prefer%20Steak%20and%20Beer%22%7D,%22value%22:%22015%22%7D%5D%7D%7D%5D,%22submit%22:%7B%22type%22:%22plain_text%22,%22text%22:%22Get%20Fed%22%7D%7D)\n\n### Paginator Component\n\n**Block Builder** provides a `Paginator` component that assists in producing paginated UI. It allows you to dictate the UI to build for each items passed in and provides to the `actionId` all of the data (`page`, `perPage`, `totalPages`, `offset`, `totalItems` ) you need to produce the right page when a user clicks the Next or Previous buttons.\n\nIt supports optional customizations, such as:  \n\n`nextButtonText` – Used to pass in custom text for the Next button, but has a default.\n\n`previousButtonText` – Used to pass in custom text for the Next button, but has a default.\n\n`pageCountText` – Used to pass in custom text for the page count, accepts a function and passes the function an object with `page` and `totalPages` properties.\n\n```javascript\nimport { Modal, Blocks, Elements, Paginator } from 'slack-block-builder';\n\nexport default ({ tasks, totalTasks, page, perPage }) => Modal({ title: 'Open Tasks' })\n  .blocks(\n    Blocks.Section({ text: 'Hi! :wave: And welcome to the FAQ section! Take a look around and if you don\\'t find what you need, feel free to open an issue on GitHub.' }),\n    Blocks.Section({ text: `You currently have *${totalTasks} open task(s)*:` }),\n    Paginator({\n      perPage,\n      items: tasks,\n      totalItems: totalTasks,\n      page: page || 1,\n      actionId: ({ page, offset }) => JSON.stringify({ action: 'render-tasks', page, offset }),\n      blocksForEach: ({ item }) => [\n        Blocks.Divider(),\n        Blocks.Section({ text: `*${item.title}*` })\n          .accessory(\n            Elements.Button({ text: 'View Details' })\n              .actionId('view-details')\n              .value(item.id.toString())),\n        Blocks.Section({ text: `*Due Date:* ${getDate(item.dueDate)}` }),\n      ],\n    }).getBlocks())\n  .close('Done')\n  .buildToJSON();\n``` \n\nThe code above renders the modal below. And be sure to check out the full documentation on the **Block Builder** doc site for more information.\n\n![An example of using Block Builder for Modals](docs/resources/images/paginator-modal-example.png)\n\n[**View Example on Slack Block Kit Builder Website**](https://app.slack.com/block-kit-builder/#%7B%22title%22:%7B%22type%22:%22plain_text%22,%22text%22:%22Open%20Tasks%22%7D,%22blocks%22:%5B%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22Hello!%20:wave::skin-tone-4:%20%20Below%20you%20can%20find%20all%20of%20your%20open%20tasks.%22%7D,%22type%22:%22section%22%7D,%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22You%20currently%20have%20*58%20open%20task(s)*:%22%7D,%22type%22:%22section%22%7D,%7B%22type%22:%22divider%22%7D,%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22*Set%20Up%20Webhook%20Monitoring*%22%7D,%22accessory%22:%7B%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22View%20Details%22%7D,%22action_id%22:%22view-details%22,%22value%22:%225%22,%22type%22:%22button%22%7D,%22type%22:%22section%22%7D,%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22*Due%20Date:*%20%3C!date%5E1633392000%5E%7Bdate%7D%7C2021-10-05%3E%22%7D,%22type%22:%22section%22%7D,%7B%22type%22:%22divider%22%7D,%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22*Refactor%20Payment%20Service*%22%7D,%22accessory%22:%7B%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22View%20Details%22%7D,%22action_id%22:%22view-details%22,%22value%22:%223%22,%22type%22:%22button%22%7D,%22type%22:%22section%22%7D,%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22*Due%20Date:*%20%3C!date%5E1635292800%5E%7Bdate%7D%7C2021-10-27%3E%22%7D,%22type%22:%22section%22%7D,%7B%22type%22:%22divider%22%7D,%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22*Finalize%20JumboCode%20Documentation*%22%7D,%22accessory%22:%7B%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22View%20Details%22%7D,%22action_id%22:%22view-details%22,%22value%22:%224%22,%22type%22:%22button%22%7D,%22type%22:%22section%22%7D,%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22*Due%20Date:*%20%3C!date%5E1635465600%5E%7Bdate%7D%7C2021-10-29%3E%22%7D,%22type%22:%22section%22%7D,%7B%22elements%22:%5B%7B%22type%22:%22mrkdwn%22,%22text%22:%22Page%208%20of%2020%22%7D%5D,%22type%22:%22context%22%7D,%7B%22type%22:%22divider%22%7D,%7B%22elements%22:%5B%7B%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22Previous%22%7D,%22action_id%22:%22%7B%5C%22action%5C%22:%5C%22render-tasks%5C%22,%5C%22page%5C%22:7,%5C%22offset%5C%22:18%7D%22,%22type%22:%22button%22%7D,%7B%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22Next%22%7D,%22action_id%22:%22%7B%5C%22action%5C%22:%5C%22render-tasks%5C%22,%5C%22page%5C%22:9,%5C%22offset%5C%22:24%7D%22,%22type%22:%22button%22%7D%5D,%22type%22:%22actions%22%7D%5D,%22close%22:%7B%22type%22:%22plain_text%22,%22text%22:%22Done%22%7D,%22type%22:%22modal%22%7D)\n\n### Accordion Component\n\nUsing the `Accordion` component, you can easily create a customizable accordion for your Slack app. It not only assists in building a suitable UI, but also calculates the next state and gives you access to it in the `actionId` of the buttons in the accordion, so that you can pass that back to your app's backend and use it to render the next state.\n\nIt supports optional customizations, such as: \n\n`collapseOnExpand` – Dictates whether or not multiple items can be expanded at once. When set to true, only one item will be expanded at any given time.\n\n`expandButtonText` – Used to pass in custom text for the button that expands an item, but has a default.\n\n`collapseButtonText` – Used to pass in custom text for the button that collapses an expanded item, but has a default.\n \n```javascript\nimport { Modal, Blocks, Accordion } from 'slack-block-builder';\n\nexport default ({ faqs, expandedItems }) => Modal({ title: 'FAQ' })\n  .blocks(\n    Blocks.Section({ text: 'Hi! :wave: And welcome to the FAQ section! Take a look around and if you don\\'t find what you need, feel free to open an issue on GitHub.'}),\n    Blocks.Divider(),\n    Accordion({\n      items: faqs,\n      expandedItems: expandedItems || [], // In this case, the value is [1]\n      collapseOnExpand: true,\n      titleText: ({ item }) => `*${item.question}*`,\n      actionId: ({ expandedItems }) => JSON.stringify({ action: 'render-faqs', expandedItems }),\n      blocksForExpanded: ({ item }) => [\n       Blocks.Section({ text: `${item.answer}` }),\n      ],\n    }).getBlocks())\n  .close('Done')\n  .buildToJSON();\n```\n\nThe code above renders the modal below. And be sure to check out the full documentation on the **Block Builder** doc site for more information.\n\n![An example of using Block Builder for Modals](docs/resources/images/accordion-modal-example.png)\n\n[**View Example on Slack Block Kit Builder Website**](https://app.slack.com/block-kit-builder#%7B%22title%22:%7B%22type%22:%22plain_text%22,%22text%22:%22FAQ%22%7D,%22blocks%22:%5B%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22Hi!%20:wave::skin-tone-4:%20And%20welcome%20to%20the%20FAQ%20section!%20Take%20a%20look%20around%20and%20if%20you%20don't%20find%20what%20you%20need,%20feel%20free%20to%20open%20an%20issue%20on%20GitHub.%22%7D,%22type%22:%22section%22%7D,%7B%22type%22:%22divider%22%7D,%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22*Why%20should%20I%20adopt%20Block%20Builder?*%22%7D,%22accessory%22:%7B%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22More%22%7D,%22action_id%22:%22%7B%5C%22action%5C%22:%5C%22render-faqs%5C%22,%5C%22expandedItems%5C%22:%5B0%5D%7D%22,%22type%22:%22button%22%7D,%22type%22:%22section%22%7D,%7B%22type%22:%22divider%22%7D,%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22*How%20do%20I%20use%20the%20%60Accordion%60%20component?*%22%7D,%22accessory%22:%7B%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22Close%22%7D,%22action_id%22:%22%7B%5C%22action%5C%22:%5C%22render-faqs%5C%22,%5C%22expandedItems%5C%22:%5B%5D%7D%22,%22type%22:%22button%22%7D,%22type%22:%22section%22%7D,%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22It's%20actually%20_really_%20easy!%20All%20you%20have%20to%20do%20is%20pass%20in%20the%20items%20you%20want%20to%20show%20up%20in%20the%20UI,%20a%20function%20that%20captures%20the%20expanded%20items%20in%20the%20%60actionId%60,%20and%20a%20function%20that%20builds%20out%20the%20right%20UI%20when%20an%20item%20is%20expanded.%5Cn%5CnThat's%20it,%20so%20go%20give%20it%20a%20try!%20%20:raised_hands::skin-tone-4:%22%7D,%22type%22:%22section%22%7D,%7B%22type%22:%22divider%22%7D,%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22*What%20other%20features%20are%20in%20the%20pipeline?*%22%7D,%22accessory%22:%7B%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22More%22%7D,%22action_id%22:%22%7B%5C%22action%5C%22:%5C%22render-faqs%5C%22,%5C%22expandedItems%5C%22:%5B2%5D%7D%22,%22type%22:%22button%22%7D,%22type%22:%22section%22%7D,%7B%22type%22:%22divider%22%7D,%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22*Do%20you%20work%20for%20Slack?*%22%7D,%22accessory%22:%7B%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22More%22%7D,%22action_id%22:%22%7B%5C%22action%5C%22:%5C%22render-faqs%5C%22,%5C%22expandedItems%5C%22:%5B3%5D%7D%22,%22type%22:%22button%22%7D,%22type%22:%22section%22%7D,%7B%22type%22:%22divider%22%7D,%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22*What%20can%20I%20do%20to%20help?*%22%7D,%22accessory%22:%7B%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22More%22%7D,%22action_id%22:%22%7B%5C%22action%5C%22:%5C%22render-faqs%5C%22,%5C%22expandedItems%5C%22:%5B4%5D%7D%22,%22type%22:%22button%22%7D,%22type%22:%22section%22%7D%5D,%22close%22:%7B%22type%22:%22plain_text%22,%22text%22:%22Done%22%7D,%22type%22:%22modal%22%7D)\n\n### Utility Functions\n\nThe `Utilities` object contains various utility functions for creating UI. Currently, there are two:\n\n`BlockCollection()` – Accepts multiple arguments or an array of blocks and returns them in an array, in their built state.\n\n`AttachmentCollection()` – Accepts multiple arguments or an array of attachments and returns them in an array, in their built state.\n\nThese two functions are useful when you wish to keep surface or view configuration separate from UI representation.\n\nAn example using Slack's `WebClient` from their [SDK for Node.js](https://github.com/slackapi/node-slack-sdk):\n\n```javascript\nimport { BlockCollection, AttachmentCollection, Blocks } from 'slack-block-builder';\nimport { WebClient } from '@slack/web-api';\n\nconst client = new WebClient(process.env.SLACK_TOKEN);\n\nclient.chat.postMessage({\n  channel: 'ABCDEFG',\n  text: 'Hello, my dear, sweet world!',\n  blocks: BlockCollection( /* Pass in blocks */ ),\n  attachments: AttachmentCollection( /* Pass in attachments */ ),\n})\n.then((response) => console.log(response))\n.catch((error) => console.log(error));\n```\n\nAnother example where you might find `BlockCollection()` helpful is when [unfurling links in messages](https://api.slack.com/reference/messaging/link-unfurling):\n\n```javascript\nimport { BlockCollection, Blocks } from 'slack-block-builder';\nimport { WebClient } from '@slack/web-api';\n\nconst client = new WebClient(process.env.SLACK_TOKEN);\n\nconst unfurl = ({ channel, ts, url }) => client.chat.unfurl({\n  channel,\n  ts,\n  unfurls: { [url]: BlockCollection( /* Pass in blocks */ ) },\n})\n.then((response) => console.log(response))\n.catch((error) => console.log(error));\n```\n\n### Markdown Helpers\n\nOften you'll find that you need to format text in your messages and modals. *Block Builder* has helper functions available to simply that process. They are available both as members of the `Md` object and as top-level imports. You can find the full list of functions on the [Block Builder doc site](https://blockbuilder.dev):\n\n``` javascript\nimport { Message, Blocks, Md } from 'slack-block-builder';\n\nexport default ({ channel, user }) => {\n  const slashCommands = ['/schedule', '/cancel', '/remind', '/help'];\n\n  return Message({ channel, text: 'Alas, my friend.' })\n    .blocks(\n      Blocks.Section({ text: `:wave: Hi there, ${Md.user(user)}!` }),\n      Blocks.Section({ text: `${Md.italic('Sorry')}, I didn't get that. Why don't you try out some of my slash commands?` }),\n      Blocks.Section({ text: `Here are some of the things that I can do:` }),\n      Blocks.Section()\n        .text(Md.listBullet(slashCommands\n          .map((item) => Md.codeInline(item)))))\n    .asUser()\n    .buildToObject();\n};\n```\n\n[**View Example on Slack Block Kit Builder Website**](https://app.slack.com/block-kit-builder/#%7B%22blocks%22:%5B%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22:wave:%20Hi%20there,%20%3C@U03N067AL%3E%21%22%7D,%22type%22:%22section%22%7D,%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22_Sorry_,%20I%20didn%27t%20get%20that.%20Why%20don%27t%20you%20try%20out%20some%20of%20my%20slash%20commands?%22%7D,%22type%22:%22section%22%7D,%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22Here%20are%20some%20of%20the%20things%20that%20I%20can%20do:%22%7D,%22type%22:%22section%22%7D,%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22%E2%80%A2%20%60/schedule%60%5Cn%E2%80%A2%20%60/cancel%60%5Cn%E2%80%A2%20%60/remind%60%5Cn%E2%80%A2%20%60/help%60%22%7D,%22type%22:%22section%22%7D%5D%7D)\n \n## :link: &nbsp; Other Useful Slack-Related Projects\n\n[Bolt for JavaScript](https://github.com/SlackAPI/bolt) – A simple framework for building [Slack](https://slack.com) apps, developed by [Slack](https://slack.com) themselves.\n\n[Node Slack SDK](https://github.com/slackapi/node-slack-sdk) – A great and powerful SDK for building [Slack](https://slack.com) Apps from the ground up.\n\n## :fire: &nbsp; Acknowledgements\n \n<img src=\"https://github.com/korywka.png\" alt=\"@korywka\" width=\"24\" height=\"24\" valign=\"bottom\" /> Taras Neporozhniy ([@korywka](https://github.com/korywka)) - For help and ideas along the way!\n\n<img src=\"https://cdn.dribbble.com/users/683635/avatars/normal/ee2c7c826bfe244b573d145376fe0b5a.png?1510328842\" alt=\"@ft502\" width=\"24\" height=\"24\" valign=\"bottom\" /> Alexey Chernyshov ([@ft502](https://dribbble.com/ft502) on Dribbble) - For such a beautiful logo!\n\n<img src=\"https://github.com/slackhq.png\" alt=\"@slackhq\" width=\"24\" height=\"24\" valign=\"bottom\" /> SlackHQ ([@slackhq](https://github.com/slackhq)) - For such a wonderful product and API!\n\n## :black_nib: &nbsp; Author\n\n<img src=\"https://github.com/raycharius.png\" alt=\"@raycharius\" width=\"24\" height=\"24\" valign=\"bottom\" /> Ray East ([@raycharius](https://github.com/raycharius)) - Huge Fan of Slack and **Block Builder** Maintainer\n","readmeFilename":"README.md","gitHead":"6da00fd723beaab6b5204e24034d28cdd8c8970d","_id":"slack-block-builder@2.2.0-beta.2","_nodeVersion":"14.1.0","_npmVersion":"6.14.4","dist":{"integrity":"sha512-ay0lCLxUH9S1RASamrLMg6LM/AfRMkJFTpcAtMCD9rmcOSrP+LNKQ3z6PzFBtvM4jv/VnbPCZwjWf522h1LfTQ==","shasum":"06972e0fd20b0731620faa697bc48fff757d44f8","tarball":"https://registry.npmjs.org/slack-block-builder/-/slack-block-builder-2.2.0-beta.2.tgz","fileCount":176,"unpackedSize":294783,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCROxTR9ahHchnj5jiaP6H59FeAgoEgu+XqQTwlJz6IPAIhAJgae5nAxIP1o0lySEPFPtnpxww5wUsOfThMKsqtrSLc"}]},"_npmUser":{"name":"raycharius","email":"raydeast@gmail.com"},"directories":{},"maintainers":[{"name":"bravecow","email":"neporozhniy@gmail.com"},{"name":"raycharius","email":"raydeast@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/slack-block-builder_2.2.0-beta.2_1633271828306_0.44346617465709537"},"_hasShrinkwrap":false},"2.2.0":{"name":"slack-block-builder","version":"2.2.0","description":"Maintainable code for interactive Slack messages, modals, home tabs, and workflow steps. A must-have for the Slack Block Kit framework.","author":{"name":"Ray East","url":"https://github.com/raycharius"},"repository":{"type":"git","url":"git+https://github.com/raycharius/slack-block-builder.git"},"homepage":"https://blockbuilder.dev","bugs":{"url":"https://github.com/raycharius/slack-block-builder/issues"},"main":"./dist/index.js","types":"./dist/index.d.ts","license":"MIT","keywords":["slack","interactive-messages","block-actions","bot","slack-bot","modal","block","kit","swiftui","bot","modal","messages","message-builder","block-builder","slack-block-builder","block-kit","blocks","botkit","bolt","slack-bolt"],"scripts":{"src:build":"tsc -p ./tsconfig.json","src:lint":"eslint 'src/**/*.ts' --fix","docs:build":"tsc -p ./tsconfig.docs.json","docs:lint":"eslint 'docs-generator/**/*.ts' --fix","docs:serve":"docsify serve ./docs","predocs:generate":"npm run docs:build","docs:generate":"node docs-generator-dist/index.js","docs:local":"docsify serve docs --port 3000","tests:lint":"eslint 'tests/**/*.ts' --fix","tests:coverage":"codecov","clean":"shx rm -rf ./dist ./coverage ./docs-generator-dist","test":"jest --coverage","build":"npm run src:build","lint":"eslint 'src/**/*.ts' 'tests/**/*.ts' 'docs-generator/**/*.ts'","lint:fix":"eslint 'src/**/*.ts' 'tests/**/*.ts' 'docs-generator/**/*.ts' --fix","madge":"npx madge --circular --warning --extensions ts ./"},"devDependencies":{"@types/jest":"^26.0.22","@typescript-eslint/eslint-plugin":"^4.20.0","@typescript-eslint/parser":"^4.20.0","codecov":"^3.8.1","docsify-cli":"^4.4.3","docsify-server-renderer":"^4.12.1","docsify-tabs":"^1.4.4","eslint":"^6.8.0","eslint-config-airbnb-base":"^14.1.0","eslint-config-airbnb-typescript":"^12.3.1","eslint-plugin-import":"^2.22.1","eslint-plugin-jsx-a11y":"^6.4.1","eslint-plugin-react":"^7.23.1","eslint-plugin-react-hooks":"^4.2.0","jest":"^26.6.3","jest-environment-jsdom":"^26.6.2","madge":"^4.0.2","mustache":"^4.2.0","prettier-eslint-cli":"^5.0.0","shx":"^0.3.3","ts-jest":"^26.5.4","ts-node":"^8.10.2","typescript":"^4.2.3"},"gitHead":"515cc19011938111038767120d5faa736009a5fa","_id":"slack-block-builder@2.2.0","_nodeVersion":"14.1.0","_npmVersion":"6.14.4","dist":{"integrity":"sha512-oxmLTBi747WLFZtMEXvibTkvvRQjOCjQnpb0EScZlXU5VUJbKzDXmneQlr97JtIkyAOc2xJVcsMMrlMJnvSXkA==","shasum":"40519485d1902c7b593c557a6a1c672387213075","tarball":"https://registry.npmjs.org/slack-block-builder/-/slack-block-builder-2.2.0.tgz","fileCount":176,"unpackedSize":295214,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIFU053zFa2fkF/901zD/5KPBYF7clnx5YcHLmakdDEBLAiAbqIKnGCb1rebChkbwnNohlCFD1TVeFEIP6u9tbRyRaQ=="}]},"_npmUser":{"name":"raycharius","email":"raydeast@gmail.com"},"directories":{},"maintainers":[{"name":"bravecow","email":"neporozhniy@gmail.com"},{"name":"raycharius","email":"raydeast@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/slack-block-builder_2.2.0_1633275016286_0.36181246727600835"},"_hasShrinkwrap":false},"2.3.0":{"name":"slack-block-builder","version":"2.3.0","description":"Maintainable code for interactive Slack messages, modals, home tabs, and workflow steps. A must-have for the Slack Block Kit framework.","author":{"name":"Ray East","url":"https://github.com/raycharius"},"repository":{"type":"git","url":"git+https://github.com/raycharius/slack-block-builder.git"},"homepage":"https://blockbuilder.dev","bugs":{"url":"https://github.com/raycharius/slack-block-builder/issues"},"main":"./dist/index.js","types":"./dist/index.d.ts","license":"MIT","keywords":["slack","interactive-messages","block-actions","bot","slack-bot","modal","block","kit","swiftui","bot","modal","messages","message-builder","block-builder","slack-block-builder","block-kit","blocks","botkit","bolt","slack-bolt"],"scripts":{"src:build":"tsc -p ./tsconfig.json","src:lint":"eslint 'src/**/*.ts' --fix","docs:build":"tsc -p ./tsconfig.docs.json","docs:lint":"eslint 'docs-generator/**/*.ts' --fix","docs:serve":"docsify serve ./docs","predocs:generate":"npm run docs:build","docs:generate":"node docs-generator-dist/index.js","docs:local":"docsify serve docs --port 3000","tests:lint":"eslint 'tests/**/*.ts' --fix","tests:coverage":"codecov","clean":"shx rm -rf ./dist ./coverage ./docs-generator-dist","test":"jest --coverage","build":"npm run src:build","lint":"eslint 'src/**/*.ts' 'tests/**/*.ts' 'docs-generator/**/*.ts'","lint:fix":"eslint 'src/**/*.ts' 'tests/**/*.ts' 'docs-generator/**/*.ts' --fix","madge":"npx madge --circular --warning --extensions ts ./"},"devDependencies":{"@types/jest":"^26.0.22","@typescript-eslint/eslint-plugin":"^4.20.0","@typescript-eslint/parser":"^4.20.0","codecov":"^3.8.1","docsify-cli":"^4.4.3","docsify-server-renderer":"^4.12.1","docsify-tabs":"^1.4.4","eslint":"^6.8.0","eslint-config-airbnb-base":"^14.1.0","eslint-config-airbnb-typescript":"^12.3.1","eslint-plugin-import":"^2.22.1","eslint-plugin-jsx-a11y":"^6.4.1","eslint-plugin-react":"^7.23.1","eslint-plugin-react-hooks":"^4.2.0","jest":"^26.6.3","jest-environment-jsdom":"^26.6.2","madge":"^4.0.2","mustache":"^4.2.0","prettier-eslint-cli":"^5.0.0","shx":"^0.3.3","ts-jest":"^26.5.4","ts-node":"^8.10.2","typescript":"^4.2.3"},"gitHead":"6be486817dd578445812133f6bf474288000baea","_id":"slack-block-builder@2.3.0","_nodeVersion":"14.1.0","_npmVersion":"6.14.4","dist":{"integrity":"sha512-gmH4Ow7X7E8odc9qHZJKAgcpm2OPeT3DNsb3a6G41L/0rmHxafQtINpwd45CqKyClD9qwVTWnAEe+lXmzXljJg==","shasum":"1a5881b19bdf4bb7321e15c1a9c214d4a6259b00","tarball":"https://registry.npmjs.org/slack-block-builder/-/slack-block-builder-2.3.0.tgz","fileCount":178,"unpackedSize":296077,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBSkrzYF0IHsNgAro+4g9gL3fQZrKFxifWUWLw4Ws2bPAiB0m1Knd4wXIAIPIpF+GU4wzi2rTbDt3rLYrcmOAnEYFQ=="}]},"_npmUser":{"name":"raycharius","email":"raydeast@gmail.com"},"directories":{},"maintainers":[{"name":"bravecow","email":"neporozhniy@gmail.com"},{"name":"raycharius","email":"raydeast@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/slack-block-builder_2.3.0_1635883913689_0.7695789436887768"},"_hasShrinkwrap":false},"2.3.1":{"name":"slack-block-builder","version":"2.3.1","description":"Maintainable code for interactive Slack messages, modals, home tabs, and workflow steps. A must-have for the Slack Block Kit framework.","author":{"name":"Ray East","url":"https://github.com/raycharius"},"repository":{"type":"git","url":"git+https://github.com/raycharius/slack-block-builder.git"},"homepage":"https://blockbuilder.dev","bugs":{"url":"https://github.com/raycharius/slack-block-builder/issues"},"main":"./dist/index.js","types":"./dist/index.d.ts","license":"MIT","keywords":["slack","interactive-messages","block-actions","bot","slack-bot","modal","block","kit","swiftui","bot","modal","messages","message-builder","block-builder","slack-block-builder","block-kit","blocks","botkit","bolt","slack-bolt"],"scripts":{"src:build":"tsc -p ./tsconfig.json","src:lint":"eslint 'src/**/*.ts' --fix","docs:build":"tsc -p ./tsconfig.docs.json","docs:lint":"eslint 'docs-generator/**/*.ts' --fix","docs:serve":"docsify serve ./docs","predocs:generate":"npm run docs:build","docs:generate":"node docs-generator-dist/index.js","docs:local":"docsify serve docs --port 3000","tests:lint":"eslint 'tests/**/*.ts' --fix","tests:coverage":"codecov","clean":"shx rm -rf ./dist ./coverage ./docs-generator-dist","test":"jest --coverage","build":"npm run src:build","lint":"eslint 'src/**/*.ts' 'tests/**/*.ts' 'docs-generator/**/*.ts'","lint:fix":"eslint 'src/**/*.ts' 'tests/**/*.ts' 'docs-generator/**/*.ts' --fix","madge":"npx madge --circular --warning --extensions ts ./"},"devDependencies":{"@types/jest":"^26.0.22","@typescript-eslint/eslint-plugin":"^4.20.0","@typescript-eslint/parser":"^4.20.0","codecov":"^3.8.1","docsify-cli":"^4.4.3","docsify-server-renderer":"^4.12.1","docsify-tabs":"^1.4.4","eslint":"^6.8.0","eslint-config-airbnb-base":"^14.1.0","eslint-config-airbnb-typescript":"^12.3.1","eslint-plugin-import":"^2.22.1","eslint-plugin-jsx-a11y":"^6.4.1","eslint-plugin-react":"^7.23.1","eslint-plugin-react-hooks":"^4.2.0","jest":"^26.6.3","jest-environment-jsdom":"^26.6.2","madge":"^4.0.2","mustache":"^4.2.0","prettier-eslint-cli":"^5.0.0","shx":"^0.3.3","ts-jest":"^26.5.4","ts-node":"^8.10.2","typescript":"^4.2.3"},"gitHead":"c532493a80320811f7eac695a0a2194b9185586d","_id":"slack-block-builder@2.3.1","_nodeVersion":"14.1.0","_npmVersion":"6.14.4","dist":{"integrity":"sha512-6Zcn0F5GsbC9HPAvm4V2GLXsG4T2C9reuPzx8cOxUl5UDAIyIwj1O4bYSzgyMHfHIHP/F9Xjc128l6XQbLwcIg==","shasum":"0d98be3a8ddfd7f0679be7fcc092113d0a97890d","tarball":"https://registry.npmjs.org/slack-block-builder/-/slack-block-builder-2.3.1.tgz","fileCount":178,"unpackedSize":295829,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBgEjtZ9W/VB1nmrGNg2kjtmqdm/uOpvk5G9u9uRGmqjAiEA38mbD7RRJ1k+2RtD2ZWam+jufHEP+cof/oXbMS7te54="}]},"_npmUser":{"name":"raycharius","email":"raydeast@gmail.com"},"directories":{},"maintainers":[{"name":"bravecow","email":"neporozhniy@gmail.com"},{"name":"raycharius","email":"raydeast@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/slack-block-builder_2.3.1_1636808062216_0.631958867114573"},"_hasShrinkwrap":false},"2.4.0":{"name":"slack-block-builder","version":"2.4.0","description":"Maintainable code for interactive Slack messages, modals, home tabs, and workflow steps. A must-have for the Slack Block Kit framework.","author":{"name":"Ray East","url":"https://github.com/raycharius"},"repository":{"type":"git","url":"git+https://github.com/raycharius/slack-block-builder.git"},"homepage":"https://blockbuilder.dev","bugs":{"url":"https://github.com/raycharius/slack-block-builder/issues"},"main":"./dist/index.js","types":"./dist/index.d.ts","license":"MIT","keywords":["slack","interactive-messages","block-actions","bot","slack-bot","modal","block","kit","swiftui","bot","modal","messages","message-builder","block-builder","slack-block-builder","block-kit","blocks","botkit","bolt","slack-bolt"],"scripts":{"src:build":"tsc -p ./tsconfig.json","src:lint":"eslint 'src/**/*.ts' --fix","docs:build":"tsc -p ./tsconfig.docs.json","docs:lint":"eslint 'docs-generator/**/*.ts' --fix","docs:serve":"docsify serve ./docs","predocs:generate":"npm run docs:build","docs:generate":"node docs-generator-dist/index.js","docs:local":"docsify serve docs --port 3000","tests:lint":"eslint 'tests/**/*.ts' --fix","tests:coverage":"codecov","clean":"shx rm -rf ./dist ./coverage ./docs-generator-dist","test":"jest --coverage","build":"npm run src:build","lint":"eslint 'src/**/*.ts' 'tests/**/*.ts' 'docs-generator/**/*.ts'","lint:fix":"eslint 'src/**/*.ts' 'tests/**/*.ts' 'docs-generator/**/*.ts' --fix","madge":"npx madge --circular --warning --extensions ts ./"},"devDependencies":{"@types/jest":"^26.0.22","@typescript-eslint/eslint-plugin":"^4.20.0","@typescript-eslint/parser":"^4.20.0","codecov":"^3.8.1","docsify-cli":"^4.4.3","docsify-server-renderer":"^4.12.1","docsify-tabs":"^1.4.4","eslint":"^6.8.0","eslint-config-airbnb-base":"^14.1.0","eslint-config-airbnb-typescript":"^12.3.1","eslint-plugin-import":"^2.22.1","eslint-plugin-jsx-a11y":"^6.4.1","eslint-plugin-react":"^7.23.1","eslint-plugin-react-hooks":"^4.2.0","jest":"^26.6.3","jest-environment-jsdom":"^26.6.2","madge":"^4.0.2","mustache":"^4.2.0","prettier-eslint-cli":"^5.0.0","shx":"^0.3.3","ts-jest":"^26.5.4","ts-node":"^8.10.2","typescript":"^4.2.3"},"gitHead":"1fed766c9d80d605739b0ec190ca44b43d2e7479","_id":"slack-block-builder@2.4.0","_nodeVersion":"14.1.0","_npmVersion":"6.14.4","dist":{"integrity":"sha512-VXxyWmu1YXbz1I+2ZY7/fPkZFTfwOsTtPuJNO9MSMBsU0DiKbghSuO6rX3De4hE4655pnUFpnShs3zblLVt8TA==","shasum":"326be24890ca7c73118b2a9a185dcd5b3d2d8118","tarball":"https://registry.npmjs.org/slack-block-builder/-/slack-block-builder-2.4.0.tgz","fileCount":180,"unpackedSize":302517,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhpp3vCRA9TVsSAnZWagAAMCIP/2FN87lKFc5EWpnnnhGu\naUu7xk2jn3XQmzjzk/QZ0B41P1VdmRhPLP5yH98601LSk9UOEmqVlmn6UXbS\nmOaKNGvzdOsBOE6m6ExV6VjxcJCThTF8AYtOqOF0na/8wPe2MLeVOX6sZRJ4\nWh0LRStaAULt8l0M4SUG2lumdu7pLukbSsXn/zvjOUYaOswzlAOmYCxoZCKd\nvVEEvQiXY//JyWqNoIojJcYeYHezALiBSbIGZR2KxPPJjFN5SdOGhhGSIzFm\nKIThiuqrJupcv6hlcTi7LRbt83hQxAfgIk5TDxp+F/M1BRadnxl86ZnS20p5\ngpKuinqkKCeoyEGHaMChvKzB809gqJDeNPKZ9LPVZH5og9bq1m3rA5nmVrJh\ngdqRgXznN25UKgwDitB3tQAlaIC61Lhd+PIGAOToh4/dm4/tbpSumjmYIpLD\na+jWZO1x6bxBrAnVxRNhybEcf7KXLEXnfnC/5y1k+O3soLmNBpJL5th4XRrL\ngwanfgA4EdVmjUQqWCCqCTKZt0I3qWFovs0O3EkWr7O8ehkzKrzD2ZZgSoYA\nVuF/yyDajsBwNFJa2pdwgyPuKOCxZtVdKJK8NR5b0UUdUqY9N7TXHbO2ZqwF\n6vfD8mi6G3nl3fOwUS4KWKK3hHps+UeixcN3pn/VR0j1Dlqo6Qbu9B6eTnc/\nF7EG\r\n=OPbE\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAumpTcUB66o6EFMqF9Th8gXPiEgSrg9oVX+V2Wf/BhBAiEAwIrukytwB08dF+F1IpporaknahY0RmseSE9+0yYVx74="}]},"_npmUser":{"name":"raycharius","email":"raydeast@gmail.com"},"directories":{},"maintainers":[{"name":"bravecow","email":"neporozhniy@gmail.com"},{"name":"raycharius","email":"raydeast@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/slack-block-builder_2.4.0_1638309358984_0.8339715114284492"},"_hasShrinkwrap":false,"deprecated":"Fixed critical issue"},"2.4.1-beta.0":{"name":"slack-block-builder","version":"2.4.1-beta.0","description":"Maintainable code for interactive Slack messages, modals, home tabs, and workflow steps. A must-have for the Slack Block Kit framework.","author":{"name":"Ray East","url":"https://github.com/raycharius"},"repository":{"type":"git","url":"git+https://github.com/raycharius/slack-block-builder.git"},"homepage":"https://blockbuilder.dev","bugs":{"url":"https://github.com/raycharius/slack-block-builder/issues"},"main":"./dist/index.js","types":"./dist/index.d.ts","license":"MIT","keywords":["slack","interactive-messages","block-actions","bot","slack-bot","modal","block","kit","swiftui","bot","modal","messages","message-builder","block-builder","slack-block-builder","block-kit","blocks","botkit","bolt","slack-bolt"],"scripts":{"src:build":"tsc -p ./tsconfig.json","src:lint":"eslint 'src/**/*.ts' --fix","docs:build":"tsc -p ./tsconfig.docs.json","docs:lint":"eslint 'docs-generator/**/*.ts' --fix","docs:serve":"docsify serve ./docs","predocs:generate":"npm run docs:build","docs:generate":"node docs-generator-dist/index.js","docs:local":"docsify serve docs --port 3000","tests:lint":"eslint 'tests/**/*.ts' --fix","tests:coverage":"codecov","clean":"shx rm -rf ./dist ./coverage ./docs-generator-dist","test":"jest --coverage","build":"npm run src:build","lint":"eslint 'src/**/*.ts' 'tests/**/*.ts' 'docs-generator/**/*.ts'","lint:fix":"eslint 'src/**/*.ts' 'tests/**/*.ts' 'docs-generator/**/*.ts' --fix","madge":"npx madge --circular --warning --extensions ts ./"},"devDependencies":{"@types/jest":"^26.0.22","@typescript-eslint/eslint-plugin":"^4.20.0","@typescript-eslint/parser":"^4.20.0","codecov":"^3.8.1","docsify-cli":"^4.4.3","docsify-server-renderer":"^4.12.1","docsify-tabs":"^1.4.4","eslint":"^6.8.0","eslint-config-airbnb-base":"^14.1.0","eslint-config-airbnb-typescript":"^12.3.1","eslint-plugin-import":"^2.22.1","eslint-plugin-jsx-a11y":"^6.4.1","eslint-plugin-react":"^7.23.1","eslint-plugin-react-hooks":"^4.2.0","jest":"^26.6.3","jest-environment-jsdom":"^26.6.2","madge":"^4.0.2","mustache":"^4.2.0","prettier-eslint-cli":"^5.0.0","shx":"^0.3.3","ts-jest":"^26.5.4","ts-node":"^8.10.2","typescript":"^4.2.3"},"readme":"<p align=\"center\">\n    <img src=\"https://raw.githubusercontent.com/raycharius/slack-block-builder/master/docs/resources/images/logo-horizontal.png\" alt=\"Logo\" width=\"600px\">\n</p>\n\n<p align=\"center\">\n    <h3 align=\"center\">Maintainable code for Slack interactive messages, modals, and home tabs.</h3>\n</p>\n\n<p align=\"center\">\n    Lightweight, zero-dependency library for declaratively building Slack Block Kit UI.\n    <br />\n    <br />\n    <a href=\"https://blockbuilder.dev\" target=\"_blank\"><strong>View the Docs »</strong></a>\n    <br />\n    <br />\n    <a href=\"#space_invader--usage\">Quick Start Guide</a>\n    ·\n    <a href=\"https://github.com/raycharius/slack-block-builder/issues\">Request Feature</a>\n    ·\n    <a href=\"https://github.com/raycharius/slack-block-builder/issues\">Report Bug</a>\n  </p>\n</p>\n\n![An example of using Block Builder](docs/resources/images/block-builder-hero-image.png)\n\n***\n\n[![npm](https://img.shields.io/npm/v/slack-block-builder?color=bright-green)](https://www.npmjs.com/package/slack-block-builder)\n![NPM](https://img.shields.io/npm/l/slack-block-builder?color=bright-green)\n[![codecov](https://codecov.io/gh/raycharius/slack-block-builder/branch/master/graph/badge.svg)](https://codecov.io/gh/raycharius/slack-block-builder)\n\n**Block Builder** helps you keep your Slack app code for UI maintainable, testable, and reusable. It has a declarative, chainable syntax inspired by [SwiftUI](https://developer.apple.com/documentation/swiftui) and is built for better UI architecture.\n\n### :zap: &nbsp; Features\n\n* Declarative [SwiftUI](https://developer.apple.com/xcode/swiftui/) inspired syntax.\n* Commonly-used UI components, such as a `Paginator` and `Accordion`.\n* Inline conditional helper functions for declaratively appending or omitting UI content.\n* The ability to build more complex flows using loops and conditionals.\n* A `printPreviewURL()` method that outputs a link to preview your UI on Slack's [Block Kit Builder website](https://app.slack.com/block-kit-builder) for easier prototyping.\n* A set of helper functions for formatting text with Slack's markdown standard.\n* In-depth [doc site](https://blockbuilder.dev) at [https://blockbuilder.dev](https://blockbuilder.dev).\n* [Support](#block-kit-support-and-reference) for all current Slack Block Kit objects.\n* A great TypeScript experience.\n* Extensive JSDoc hints with explanations, validation rules, and quick links to full documentation.\n* Zero dependencies.\n\n### :gift: &nbsp; Benefits\n\n* Write three times less code.\n* Build more sophisticated, elegant flows.\n* Design better UI architecture for your Slack apps.\n* Focus more on code in your IDE than on studying the [Slack API docs](https://api.slack.com/).\n* Easily integrate localizations into your app.\n\n### :busts_in_silhouette: &nbsp; Join The Community\n\nFeedback – love it! Aside from GitHub Issues, there's a Slack channel available in the Slack Community workspace to discuss **Block Builder** – we'll see you there! :raised_hands:\n\n* **Slack Community** – [\\#block-builder](https://slackcommunity.com)\n\n### :floppy_disk: &nbsp; Installation \n\n**Block Builder** requires Node.js 12 or higher, and, when using TypeScript, TypeScript 3.8 or higher.\n\n#### Using NPM: \n\n``` bash\nnpm install --save slack-block-builder\n```\n\n#### Using Yarn: \n\n``` bash\nyarn add slack-block-builder\n```\n\n### :space_invader: &nbsp; Usage\n\nFor full documentation, make sure you head over to [https://blockbuilder.dev](https://blockbuilder.dev).\n\n\n### Importing\n\nThe functions for creating objects can be both imported directly or through an object that groups them by category.\n\n```javascript\n// Importing exposed groups of objects\n\nimport { Surfaces, Blocks, Elements, Bits, Utilities } from 'slack-block-builder';\n\n// Importing objects top-level\n\nimport { Modal, Section, Actions, Button } from 'slack-block-builder';\n```\n\nThe same goes for importing Slack markdown helper functions:\n\n```javascript\n// Importing the Md object\n\nimport { Surfaces, Blocks, Md } from 'slack-block-builder';\n\n// Importing the functions top-level\n\nimport { Modal, Section, bold, link } from 'slack-block-builder';\n```\n\n### Object Breakdown\n\n`Surfaces` – Contains functions for creating modals, messages, home tabs, and workflow steps. \n\n`Blocks` – Layout blocks used to organize the UI.\n\n`Elements` – UI elements that are used to capture user interaction.\n\n`Bits` – These are composition objects and other bits and pieces from Slack's docs. Included are `Attachment`, `Options`, `OptionGroup`, and `ConfirmationDialog`. They felt like they were deserving of their own category.\n\n`Utilities` – A group of utility functions. See [Utility Functions](#utility-functions).\n\n`Md` – Helper functions for formatting text with Slack's markdown. See [Markdown Helpers](#markdown-helpers).\n\n### Block Kit Support and Reference\n\nBelow is a list of supported objects and how to access them in **Block Builder**:\n\n| **Name**             | **Type**           | **Support**                    | **Accessed Via**                      \n|----------------------|--------------------|--------------------------------|-----------------------------------------\n| Home Tab             | Surface            | :white_check_mark:             | `Surfaces.HomeTab()`                       \n| Message              | Surface            | :white_check_mark:             | `Surfaces.Message()`                       \n| Modal                | Surface            | :white_check_mark:             | `Surfaces.Modal()`                         \n| Workflow Step        | Surface            | :white_check_mark:             | `Surfaces.WorkflowStep()`                         \n| Actions              | Block              | :white_check_mark:             | `Blocks.Actions()`                \n| Context              | Block              | :white_check_mark:             | `Blocks.Context()`                \n| Divider              | Block              | :white_check_mark:             | `Blocks.Divider()`                \n| File                 | Block              | :white_check_mark:             | `Blocks.File()`\n| Header               | Block              | :white_check_mark:             | `Blocks.Header()`\n| Image                | Block              | :white_check_mark:             | `Blocks.Image()`                  \n| Input                | Block              | :white_check_mark:             | `Blocks.Input()`                  \n| Section              | Block              | :white_check_mark:             | `Blocks.Section()`                \n| Button               | Element            | :white_check_mark:️             | `Elements.Button()`               \n| Checkboxes           | Element            | :white_check_mark:             | `Elements.Checkboxes()`           \n| Date Picker          | Element            | :white_check_mark:             | `Elements.DatePicker()`\n| Time Picker          | Element            | :white_check_mark:             | `Elements.TimePicker()`           \n| Image                | Element            | :white_check_mark:             | `Elements.Img()`                  \n| Overflow Menu        | Element            | :white_check_mark:             | `Elements.OverflowMenu()`         \n| Radio Buttons        | Element            | :white_check_mark:             | `Elements.RadioButtons()`         \n| Plain-Text Input     | Element            | :white_check_mark:             | `Elements.TextInput()`            \n| Select Menus         | Element            | :white_check_mark:             | `Elements.[Type]Select()`          \n| Multi-Select Menus   | Element            | :white_check_mark:             | `Elements.[Type]MultiSelect()`     \n| Option               | Composition Object | :white_check_mark:             | `Bits.Option()`                   \n| Confirm Dialog       | Composition Object | :white_check_mark:             | `Bits.ConfirmationDialog()`       \n| Option Group         | Composition Object | :white_check_mark:             | `Bits.OptionGroup()`\n| Attachment           | Legacy Feature     | :white_check_mark:             | `Bits.Attachment()`              \n\n### Creating a Simple Interactive Message\n\nLet's take a look at how to compose an interactive message. Even though [Slack](https://slack.com) now has modals, these have always been the basis for [Slack](https://slack.com) apps.\n\nFunctions that return Block Kit objects have setter methods for all of the properties, but also support parameters that are passed into the constructor for properties with primitive types.\n\n```javascript\nimport { Message, Blocks, Elements } from 'slack-block-builder';\n\nexport default ({ channel, dangerLevel }) =>\n  Message()\n    .channel(channel)\n    .text('Alas, my friend.')\n    .blocks(\n      Blocks.Section()\n        .text('One does not simply walk into Slack and click a button.'),\n      Blocks.Section()\n        .text('At least that\\'s what my friend Slackomir said :crossed_swords:'),\n      Blocks.Divider(),\n      Blocks.Actions()\n        .elements(\n          Elements.Button()\n            .text('Sure One Does')\n            .actionId('gotClicked')\n            .danger(dangerLevel > 42), // Optional argument, defaults to 'true'\n          Elements.Button()\n            .text('One Does Not')\n            .actionId('scaredyCat')\n            .primary()))\n    .asUser()\n    .buildToJSON();\n```\n\nAnd now an example with using both the setter methods and passing parameters into the functions at initiation:\n\n```javascript\nimport { Message, Blocks, Elements } from 'slack-block-builder';\n\nexport default ({ channel, dangerLevel }) =>\n  Message({ channel, text: 'Alas, my friend.' })\n    .blocks(\n      Blocks.Section({ text: 'One does not simply walk into Slack and click a button.' }),\n      Blocks.Section({ text: 'At least that\\'s what my friend Slackomir said :crossed_swords:' }),\n      Blocks.Divider(),\n      Blocks.Actions()\n        .elements(\n          Elements.Button({ text: 'Sure One Does', actionId: 'gotClicked' })\n            .danger(dangerLevel > 42), // Optional argument, defaults to 'true'\n          Elements.Button({ text: 'One Does Not', actionId: 'scaredyCat' })\n            .primary()))\n    .asUser()\n    .buildToJSON();\n```\n\nBoth of these examples render the message below. And the best part? It only took 15 lines of code, as opposed to the 44 lines of JSON generated as a result. \n\n![An example of using Block Builder for Messages](docs/resources/images/simple-message-example.png)\n\n[**View Example on Slack Block Kit Builder Website**](https://app.slack.com/block-kit-builder#%7B%22blocks%22:%5B%7B%22type%22:%22section%22,%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22One%20does%20not%20simply%20walk%20into%20Slack%20and%20click%20a%20button.%22%7D%7D,%7B%22type%22:%22section%22,%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22At%20least%20that's%20what%20my%20friend%20Slackomir%20said%20:crossed_swords:%22%7D%7D,%7B%22type%22:%22divider%22%7D,%7B%22type%22:%22actions%22,%22elements%22:%5B%7B%22type%22:%22button%22,%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22Sure%20One%20Does%22%7D,%22action_id%22:%22gotClicked%22,%22style%22:%22danger%22%7D,%7B%22type%22:%22button%22,%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22One%20Does%20Not%22%7D,%22action_id%22:%22scaredyCat%22,%22style%22:%22primary%22%7D%5D%7D%5D%7D)\n\n### Creating a Simple Modal\n\nLet's take a look at how modals are created. Here we'll also take a look at working with Bits and with loops, by adding options with the `Array.map()` method. \n\n```javascript\nimport { Modal, Blocks, Elements, Bits, setIfTruthy } from 'slack-block-builder';\n\nexport default ({ menuOptions, selected }) =>\n  Modal({ title: 'PizzaMate', submit: 'Get Fed' })\n    .blocks(\n      Blocks.Section({ text: 'Hey there, colleague!' }),\n      Blocks.Section({ text: 'Hurray for corporate pizza! Let\\'s get you fed and happy :pizza:' }),\n      Blocks.Input({ label: 'What can we call you?' })\n        .element(\n          Elements.TextInput({ placeholder: 'Hi, my name is... (What?!) (Who?!)' })\n            .actionId('name')),\n      Blocks.Input({ label: 'Which floor are you on?' })\n        .element(\n          Elements.TextInput({ placeholder: 'HQ – Fifth Floor' })\n            .actionId('floor')),\n      Blocks.Input({ label: 'What\\'ll you have?' })\n        .element(\n          Elements.StaticSelect({ placeholder: 'Choose your favorite...' })\n            .actionId('item')\n            .options(menuOptions\n              .map((item) => Bits.Option({ text: item.name, value: item.id })))\n            .initialOption(setIfTruthy(selected, Bits.Option({ text: selected.name, value: selected.id })))))\n    .buildToJSON();\n```\n\nBoth of these examples render the modal below. \n\n![An example of using Block Builder for Modals](docs/resources/images/simple-modal-example.png)\n\n[**View Example on Slack Block Kit Builder Website**](https://app.slack.com/block-kit-builder#%7B%22type%22:%22modal%22,%22title%22:%7B%22type%22:%22plain_text%22,%22text%22:%22PizzaMate%22%7D,%22blocks%22:%5B%7B%22type%22:%22section%22,%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22Hey%20there,%20colleague!%22%7D%7D,%7B%22type%22:%22section%22,%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22Hurray%20for%20corporate%20pizza!%20Let's%20get%20you%20fed%20and%20happy%20:pizza:%22%7D%7D,%7B%22type%22:%22input%22,%22label%22:%7B%22type%22:%22plain_text%22,%22text%22:%22What%20can%20we%20call%20you?%22%7D,%22element%22:%7B%22type%22:%22plain_text_input%22,%22action_id%22:%22name%22,%22placeholder%22:%7B%22type%22:%22plain_text%22,%22text%22:%22Hi,%20my%20name%20is...%20(What?!)%20(Who?!)%22%7D%7D%7D,%7B%22type%22:%22input%22,%22label%22:%7B%22type%22:%22plain_text%22,%22text%22:%22Which%20floor%20are%20you%20on?%22%7D,%22element%22:%7B%22type%22:%22plain_text_input%22,%22action_id%22:%22floor%22,%22placeholder%22:%7B%22type%22:%22plain_text%22,%22text%22:%22HQ%20–%20Fifth%20Floor%22%7D%7D%7D,%7B%22type%22:%22input%22,%22label%22:%7B%22type%22:%22plain_text%22,%22text%22:%22What'll%20you%20have?%22%7D,%22element%22:%7B%22type%22:%22static_select%22,%22placeholder%22:%7B%22type%22:%22plain_text%22,%22text%22:%22Choose%20your%20favorite...%22%7D,%22action_id%22:%22item%22,%22options%22:%5B%7B%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22:cheese_wedge:%20With%20Cheeze%22%7D,%22value%22:%22012%22%7D,%7B%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22:fish:%20With%20Anchovies%22%7D,%22value%22:%22013%22%7D,%7B%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22:cookie:%20With%20Scooby%20Snacks%22%7D,%22value%22:%22014%22%7D,%7B%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22:beer:%20I%20Prefer%20Steak%20and%20Beer%22%7D,%22value%22:%22015%22%7D%5D%7D%7D%5D,%22submit%22:%7B%22type%22:%22plain_text%22,%22text%22:%22Get%20Fed%22%7D%7D)\n\n### Paginator Component\n\n**Block Builder** provides a `Paginator` component that assists in producing paginated UI. It allows you to dictate the UI to build for each items passed in and provides to the `actionId` all of the data (`page`, `perPage`, `totalPages`, `offset`, `totalItems` ) you need to produce the right page when a user clicks the Next or Previous buttons.\n\nNote that there is a [demo app available](https://github.com/raycharius/slack-block-builder-demo) that demonstrates how to use components.  \n\nThe `Paginator` component supports optional customizations, such as:  \n\n`nextButtonText` – Used to pass in custom text for the Next button, but has a default.\n\n`previousButtonText` – Used to pass in custom text for the Next button, but has a default.\n\n`pageCountText` – Used to pass in custom text for the page count, accepts a function and passes the function an object with `page` and `totalPages` properties.\n\n```javascript\nimport { Modal, Blocks, Elements, Paginator } from 'slack-block-builder';\n\nexport default ({ tasks, totalTasks, page, perPage }) => Modal({ title: 'Open Tasks' })\n  .blocks(\n    Blocks.Section({ text: 'Hi! :wave: And welcome to the FAQ section! Take a look around and if you don\\'t find what you need, feel free to open an issue on GitHub.' }),\n    Blocks.Section({ text: `You currently have *${totalTasks} open task(s)*:` }),\n    Paginator({\n      perPage,\n      items: tasks,\n      totalItems: totalTasks,\n      page: page || 1,\n      actionId: ({ page, offset }) => JSON.stringify({ action: 'render-tasks', page, offset }),\n      blocksForEach: ({ item }) => [\n        Blocks.Divider(),\n        Blocks.Section({ text: `*${item.title}*` })\n          .accessory(\n            Elements.Button({ text: 'View Details' })\n              .actionId('view-details')\n              .value(item.id.toString())),\n        Blocks.Section({ text: `*Due Date:* ${getDate(item.dueDate)}` }),\n      ],\n    }).getBlocks())\n  .close('Done')\n  .buildToJSON();\n``` \n\nThe code above renders the modal below. And be sure to check out the full documentation on the [**Block Builder** doc site](https://www.blockbuilder.dev/#/components/paginator) for more information.\n\n![An example of using Block Builder for Modals](docs/resources/images/paginator-modal-example.png)\n\n[**View Example on Slack Block Kit Builder Website**](https://app.slack.com/block-kit-builder/#%7B%22title%22:%7B%22type%22:%22plain_text%22,%22text%22:%22Open%20Tasks%22%7D,%22blocks%22:%5B%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22Hello!%20:wave::skin-tone-4:%20%20Below%20you%20can%20find%20all%20of%20your%20open%20tasks.%22%7D,%22type%22:%22section%22%7D,%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22You%20currently%20have%20*58%20open%20task(s)*:%22%7D,%22type%22:%22section%22%7D,%7B%22type%22:%22divider%22%7D,%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22*Set%20Up%20Webhook%20Monitoring*%22%7D,%22accessory%22:%7B%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22View%20Details%22%7D,%22action_id%22:%22view-details%22,%22value%22:%225%22,%22type%22:%22button%22%7D,%22type%22:%22section%22%7D,%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22*Due%20Date:*%20%3C!date%5E1633392000%5E%7Bdate%7D%7C2021-10-05%3E%22%7D,%22type%22:%22section%22%7D,%7B%22type%22:%22divider%22%7D,%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22*Refactor%20Payment%20Service*%22%7D,%22accessory%22:%7B%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22View%20Details%22%7D,%22action_id%22:%22view-details%22,%22value%22:%223%22,%22type%22:%22button%22%7D,%22type%22:%22section%22%7D,%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22*Due%20Date:*%20%3C!date%5E1635292800%5E%7Bdate%7D%7C2021-10-27%3E%22%7D,%22type%22:%22section%22%7D,%7B%22type%22:%22divider%22%7D,%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22*Finalize%20JumboCode%20Documentation*%22%7D,%22accessory%22:%7B%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22View%20Details%22%7D,%22action_id%22:%22view-details%22,%22value%22:%224%22,%22type%22:%22button%22%7D,%22type%22:%22section%22%7D,%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22*Due%20Date:*%20%3C!date%5E1635465600%5E%7Bdate%7D%7C2021-10-29%3E%22%7D,%22type%22:%22section%22%7D,%7B%22elements%22:%5B%7B%22type%22:%22mrkdwn%22,%22text%22:%22Page%208%20of%2020%22%7D%5D,%22type%22:%22context%22%7D,%7B%22type%22:%22divider%22%7D,%7B%22elements%22:%5B%7B%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22Previous%22%7D,%22action_id%22:%22%7B%5C%22action%5C%22:%5C%22render-tasks%5C%22,%5C%22page%5C%22:7,%5C%22offset%5C%22:18%7D%22,%22type%22:%22button%22%7D,%7B%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22Next%22%7D,%22action_id%22:%22%7B%5C%22action%5C%22:%5C%22render-tasks%5C%22,%5C%22page%5C%22:9,%5C%22offset%5C%22:24%7D%22,%22type%22:%22button%22%7D%5D,%22type%22:%22actions%22%7D%5D,%22close%22:%7B%22type%22:%22plain_text%22,%22text%22:%22Done%22%7D,%22type%22:%22modal%22%7D)\n\n### Accordion Component\n\nUsing the `Accordion` component, you can easily create a customizable accordion for your Slack app. It not only assists in building a suitable UI, but also calculates the next state and gives you access to it in the `actionId` of the buttons in the accordion, so that you can pass that back to your app's backend and use it to render the next state.\n\nNote that there is a [demo app available](https://github.com/raycharius/slack-block-builder-demo) that demonstrates how to use components.\n\nThe `Accordion` component supports optional customizations, such as: \n\n`collapseOnExpand` – Dictates whether or not multiple items can be expanded at once. When set to true, only one item will be expanded at any given time.\n\n`expandButtonText` – Used to pass in custom text for the button that expands an item, but has a default.\n\n`collapseButtonText` – Used to pass in custom text for the button that collapses an expanded item, but has a default.\n \n```javascript\nimport { Modal, Blocks, Accordion } from 'slack-block-builder';\n\nexport default ({ faqs, expandedItems }) => Modal({ title: 'FAQ' })\n  .blocks(\n    Blocks.Section({ text: 'Hi! :wave: And welcome to the FAQ section! Take a look around and if you don\\'t find what you need, feel free to open an issue on GitHub.'}),\n    Blocks.Divider(),\n    Accordion({\n      items: faqs,\n      expandedItems: expandedItems || [], // In this case, the value is [1]\n      collapseOnExpand: true,\n      titleText: ({ item }) => `*${item.question}*`,\n      actionId: ({ expandedItems }) => JSON.stringify({ action: 'render-faqs', expandedItems }),\n      blocksForExpanded: ({ item }) => [\n       Blocks.Section({ text: `${item.answer}` }),\n      ],\n    }).getBlocks())\n  .close('Done')\n  .buildToJSON();\n```\n\nThe code above renders the modal below. And be sure to check out the full documentation on the [**Block Builder** doc site](https://www.blockbuilder.dev/#/components/accordion) for more information.\n\n![An example of using Block Builder for Modals](docs/resources/images/accordion-modal-example.png)\n\n[**View Example on Slack Block Kit Builder Website**](https://app.slack.com/block-kit-builder#%7B%22title%22:%7B%22type%22:%22plain_text%22,%22text%22:%22FAQ%22%7D,%22blocks%22:%5B%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22Hi!%20:wave::skin-tone-4:%20And%20welcome%20to%20the%20FAQ%20section!%20Take%20a%20look%20around%20and%20if%20you%20don't%20find%20what%20you%20need,%20feel%20free%20to%20open%20an%20issue%20on%20GitHub.%22%7D,%22type%22:%22section%22%7D,%7B%22type%22:%22divider%22%7D,%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22*Why%20should%20I%20adopt%20Block%20Builder?*%22%7D,%22accessory%22:%7B%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22More%22%7D,%22action_id%22:%22%7B%5C%22action%5C%22:%5C%22render-faqs%5C%22,%5C%22expandedItems%5C%22:%5B0%5D%7D%22,%22type%22:%22button%22%7D,%22type%22:%22section%22%7D,%7B%22type%22:%22divider%22%7D,%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22*How%20do%20I%20use%20the%20%60Accordion%60%20component?*%22%7D,%22accessory%22:%7B%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22Close%22%7D,%22action_id%22:%22%7B%5C%22action%5C%22:%5C%22render-faqs%5C%22,%5C%22expandedItems%5C%22:%5B%5D%7D%22,%22type%22:%22button%22%7D,%22type%22:%22section%22%7D,%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22It's%20actually%20_really_%20easy!%20All%20you%20have%20to%20do%20is%20pass%20in%20the%20items%20you%20want%20to%20show%20up%20in%20the%20UI,%20a%20function%20that%20captures%20the%20expanded%20items%20in%20the%20%60actionId%60,%20and%20a%20function%20that%20builds%20out%20the%20right%20UI%20when%20an%20item%20is%20expanded.%5Cn%5CnThat's%20it,%20so%20go%20give%20it%20a%20try!%20%20:raised_hands::skin-tone-4:%22%7D,%22type%22:%22section%22%7D,%7B%22type%22:%22divider%22%7D,%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22*What%20other%20features%20are%20in%20the%20pipeline?*%22%7D,%22accessory%22:%7B%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22More%22%7D,%22action_id%22:%22%7B%5C%22action%5C%22:%5C%22render-faqs%5C%22,%5C%22expandedItems%5C%22:%5B2%5D%7D%22,%22type%22:%22button%22%7D,%22type%22:%22section%22%7D,%7B%22type%22:%22divider%22%7D,%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22*Do%20you%20work%20for%20Slack?*%22%7D,%22accessory%22:%7B%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22More%22%7D,%22action_id%22:%22%7B%5C%22action%5C%22:%5C%22render-faqs%5C%22,%5C%22expandedItems%5C%22:%5B3%5D%7D%22,%22type%22:%22button%22%7D,%22type%22:%22section%22%7D,%7B%22type%22:%22divider%22%7D,%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22*What%20can%20I%20do%20to%20help?*%22%7D,%22accessory%22:%7B%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22More%22%7D,%22action_id%22:%22%7B%5C%22action%5C%22:%5C%22render-faqs%5C%22,%5C%22expandedItems%5C%22:%5B4%5D%7D%22,%22type%22:%22button%22%7D,%22type%22:%22section%22%7D%5D,%22close%22:%7B%22type%22:%22plain_text%22,%22text%22:%22Done%22%7D,%22type%22:%22modal%22%7D)\n\n### Utility Functions\n\nThe `Utilities` object contains various utility functions for creating UI. Currently, there are two:\n\n`BlockCollection()` – Accepts multiple arguments or an array of blocks and returns them in an array, in their built state.\n\n`AttachmentCollection()` – Accepts multiple arguments or an array of attachments and returns them in an array, in their built state.\n\nThese two functions are useful when you wish to keep surface or view configuration separate from UI representation.\n\nAn example using Slack's `WebClient` from their [SDK for Node.js](https://github.com/slackapi/node-slack-sdk):\n\n```javascript\nimport { BlockCollection, AttachmentCollection, Blocks } from 'slack-block-builder';\nimport { WebClient } from '@slack/web-api';\n\nconst client = new WebClient(process.env.SLACK_TOKEN);\n\nclient.chat.postMessage({\n  channel: 'ABCDEFG',\n  text: 'Hello, my dear, sweet world!',\n  blocks: BlockCollection( /* Pass in blocks */ ),\n  attachments: AttachmentCollection( /* Pass in attachments */ ),\n})\n.then((response) => console.log(response))\n.catch((error) => console.log(error));\n```\n\nAnother example where you might find `BlockCollection()` helpful is when [unfurling links in messages](https://api.slack.com/reference/messaging/link-unfurling):\n\n```javascript\nimport { BlockCollection, Blocks } from 'slack-block-builder';\nimport { WebClient } from '@slack/web-api';\n\nconst client = new WebClient(process.env.SLACK_TOKEN);\n\nconst unfurl = ({ channel, ts, url }) => client.chat.unfurl({\n  channel,\n  ts,\n  unfurls: { [url]: BlockCollection( /* Pass in blocks */ ) },\n})\n.then((response) => console.log(response))\n.catch((error) => console.log(error));\n```\n\n### Working With Inline Conditionals\n\nThere are a few helper functions available to make it easy to work with inline conditionals within your UI source code.\n\nThey can be imported separately:\n\n```javascript\nimport { setIfTruthy, omitIfTruthy, setIfFalsy, omitIfFalsy } from 'slack-block-builder';\n```\n\nOr as a part of the `conditionals` object:\n\n```javascript\nimport { conditionals } from 'slack-block-builder';\n```\n\nEach function accepts to arguments – the first being a value that is evaluated whether it is either `null`, `undefined`, or `false`, and the second being the value to set or omit:\n\n```javascript\nimport { Modal, Blocks, Elements, Bits, setIfTruthy } from 'slack-block-builder';\n\nexport default ({ groups, selectedGroup, selectedGroupMembers }) => Modal()\n  .title('Edit Groups')\n  .callbackId('submit-edit-groups')\n  .blocks(\n    Blocks.Section({ text: 'Hello! Need to edit some groups?'}),\n    Blocks.Input({ label: 'Select a group to get started' })\n      .dispatchAction()\n      .element(\n        Elements.StaticSelect({ placeholder: 'Select a group...' })\n          .actionId('selectedGroup')\n          .options(groups\n            .map(({ name, id }) => Bits.Option({ text: name, value: id })))),\n    setIfTruthy(selectedGroup, [\n      Blocks.Input({ label: 'Current group members' })\n        .element(\n          Elements.UserMultiSelect({ placeholder: 'Select members...' })\n            .actionId('groupMembers')\n            .initialUsers(selectedGroupMembers))\n    ]))\n  .submit(setIfTruthy(selectedGroup, 'Save Changes'))\n  .buildToJSON();\n```\n\nThese functions essentially return either the value passed into as the second argument or `undefined`, depending on the condition. Please note that falsy is defined as `null`, `undefined`, or `false`. To avoid side effects, values such as `0` or `''` are not considered to be falsy.\n\n### Markdown Helpers\n\nOften you'll find that you need to format text in your messages and modals. *Block Builder* has helper functions available to simply that process. They are available both as members of the `Md` object and as top-level imports. You can find the full list of functions on the [Block Builder doc site](https://blockbuilder.dev):\n\n``` javascript\nimport { Message, Blocks, Md } from 'slack-block-builder';\n\nexport default ({ channel, user }) => {\n  const slashCommands = ['/schedule', '/cancel', '/remind', '/help'];\n\n  return Message({ channel, text: 'Alas, my friend.' })\n    .blocks(\n      Blocks.Section({ text: `:wave: Hi there, ${Md.user(user)}!` }),\n      Blocks.Section({ text: `${Md.italic('Sorry')}, I didn't get that. Why don't you try out some of my slash commands?` }),\n      Blocks.Section({ text: `Here are some of the things that I can do:` }),\n      Blocks.Section()\n        .text(Md.listBullet(slashCommands\n          .map((item) => Md.codeInline(item)))))\n    .asUser()\n    .buildToObject();\n};\n```\n\n[**View Example on Slack Block Kit Builder Website**](https://app.slack.com/block-kit-builder/#%7B%22blocks%22:%5B%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22:wave:%20Hi%20there,%20%3C@U03N067AL%3E%21%22%7D,%22type%22:%22section%22%7D,%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22_Sorry_,%20I%20didn%27t%20get%20that.%20Why%20don%27t%20you%20try%20out%20some%20of%20my%20slash%20commands?%22%7D,%22type%22:%22section%22%7D,%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22Here%20are%20some%20of%20the%20things%20that%20I%20can%20do:%22%7D,%22type%22:%22section%22%7D,%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22%E2%80%A2%20%60/schedule%60%5Cn%E2%80%A2%20%60/cancel%60%5Cn%E2%80%A2%20%60/remind%60%5Cn%E2%80%A2%20%60/help%60%22%7D,%22type%22:%22section%22%7D%5D%7D)\n \n## :link: &nbsp; Other Useful Slack-Related Projects\n\n[Bolt for JavaScript](https://github.com/SlackAPI/bolt) – A simple framework for building [Slack](https://slack.com) apps, developed by [Slack](https://slack.com) themselves.\n\n[Node Slack SDK](https://github.com/slackapi/node-slack-sdk) – A great and powerful SDK for building [Slack](https://slack.com) Apps from the ground up.\n\n## :fire: &nbsp; Acknowledgements\n \n<img src=\"https://github.com/korywka.png\" alt=\"@korywka\" width=\"24\" height=\"24\" valign=\"bottom\" /> Taras Neporozhniy ([@korywka](https://github.com/korywka)) - For help and ideas along the way!\n\n<img src=\"https://cdn.dribbble.com/users/683635/avatars/normal/ee2c7c826bfe244b573d145376fe0b5a.png?1510328842\" alt=\"@ft502\" width=\"24\" height=\"24\" valign=\"bottom\" /> Alexey Chernyshov ([@ft502](https://dribbble.com/ft502) on Dribbble) - For such a beautiful logo!\n\n<img src=\"https://github.com/slackhq.png\" alt=\"@slackhq\" width=\"24\" height=\"24\" valign=\"bottom\" /> SlackHQ ([@slackhq](https://github.com/slackhq)) - For such a wonderful product and API!\n\n## :black_nib: &nbsp; Author\n\n<img src=\"https://github.com/raycharius.png\" alt=\"@raycharius\" width=\"24\" height=\"24\" valign=\"bottom\" /> Ray East ([@raycharius](https://github.com/raycharius)) - Huge Fan of Slack and **Block Builder** Maintainer\n","readmeFilename":"README.md","gitHead":"1fed766c9d80d605739b0ec190ca44b43d2e7479","_id":"slack-block-builder@2.4.1-beta.0","_nodeVersion":"14.1.0","_npmVersion":"6.14.4","dist":{"integrity":"sha512-sd3s7CJHZxhFfyv5+plKRm4AM1Nw0fUEBSAf76cloIhz508K7oAy1qMatNw7gvFzYz45tR5LgtmizKUHTM8JmQ==","shasum":"ee0614e17a687c838d1ef6fd31abf0e8967726d5","tarball":"https://registry.npmjs.org/slack-block-builder/-/slack-block-builder-2.4.1-beta.0.tgz","fileCount":180,"unpackedSize":302524,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhp2EyCRA9TVsSAnZWagAAiosP+wfHdCcV9s6Wx+BEHPNw\n/S22fTtSAa+mPVue8VE3gJYS5rTvp/kipdv5YFOeJErAds9YepObbf7NxD7g\np/XW/ZbsY/QKekuLXd2kIWJ37dPyyQADYtj4WMj1BHiyUrxkO4FMgwq53yl5\nPyPYXgbadg300MAyD2cwU8XLGeFayKglJ4DIYkis8/gDLQth7H4J17nW3KQ+\nVcQd9JQPuSJC7uuPK86p0A8+PAiJdyIC9MWIXMqewC3w15EhpL40cMRv7l2B\nPtKgXFgQVpaGfBKz+95vjUR6B3BzO1rQKeWNSSg1HqH28hfR762FHWB3OLAF\nLBx1tZZyVm3lHcThjwbYtfoVhpcDGzXt0oqrYzvJX2Iktq3ozM2lxejNbx9/\ncRsP1wvAcrx2egFrF439Fy3vuQQQsH83gNWadZkGpu/unZaIA8651UQuy2xt\nREQSGcglHNes5+IhNcCm8T0Gg5lio3BwAVuW0/qPy8lyq9WEFxX0t7H8gjpJ\nE0EYw2n7K9UXmEJpG5i2IhW4n+tyIkdq8eksTXs4pHsJ0uMAFnTfuXmrNNUu\nc27eoNqupoeWpTF/B0nd7slGccBilChFGc6pgtmxj4yq0V0EMpYldqDo1nU0\nvI22TEb4z1A6Azr2QN0kyck3eKrz/AqHSHzhjBafe3qrazqiPYMOCv/rwkfX\nMP7A\r\n=pejd\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC990be8Ah4aMFXFATFFFTK/WaMs/OiPvfM8cPslcOiCgIgU25zd9FADOQMSsdwkjLjB8i5aGl779WPS7fITBy+Z60="}]},"_npmUser":{"name":"raycharius","email":"raydeast@gmail.com"},"directories":{},"maintainers":[{"name":"bravecow","email":"neporozhniy@gmail.com"},{"name":"raycharius","email":"raydeast@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/slack-block-builder_2.4.1-beta.0_1638359345689_0.06906554266489806"},"_hasShrinkwrap":false},"2.4.1":{"name":"slack-block-builder","version":"2.4.1","description":"Maintainable code for interactive Slack messages, modals, home tabs, and workflow steps. A must-have for the Slack Block Kit framework.","author":{"name":"Ray East","url":"https://github.com/raycharius"},"repository":{"type":"git","url":"git+https://github.com/raycharius/slack-block-builder.git"},"homepage":"https://blockbuilder.dev","bugs":{"url":"https://github.com/raycharius/slack-block-builder/issues"},"main":"./dist/index.js","types":"./dist/index.d.ts","license":"MIT","keywords":["slack","interactive-messages","block-actions","bot","slack-bot","modal","block","kit","swiftui","bot","modal","messages","message-builder","block-builder","slack-block-builder","block-kit","blocks","botkit","bolt","slack-bolt"],"scripts":{"src:build":"tsc -p ./tsconfig.json","src:lint":"eslint 'src/**/*.ts' --fix","docs:build":"tsc -p ./tsconfig.docs.json","docs:lint":"eslint 'docs-generator/**/*.ts' --fix","docs:serve":"docsify serve ./docs","predocs:generate":"npm run docs:build","docs:generate":"node docs-generator-dist/index.js","docs:local":"docsify serve docs --port 3000","tests:lint":"eslint 'tests/**/*.ts' --fix","tests:coverage":"codecov","clean":"shx rm -rf ./dist ./coverage ./docs-generator-dist","test":"jest --coverage","build":"npm run src:build","lint":"eslint 'src/**/*.ts' 'tests/**/*.ts' 'docs-generator/**/*.ts'","lint:fix":"eslint 'src/**/*.ts' 'tests/**/*.ts' 'docs-generator/**/*.ts' --fix","madge":"npx madge --circular --warning --extensions ts ./"},"devDependencies":{"@types/jest":"^26.0.22","@typescript-eslint/eslint-plugin":"^4.20.0","@typescript-eslint/parser":"^4.20.0","codecov":"^3.8.1","docsify-cli":"^4.4.3","docsify-server-renderer":"^4.12.1","docsify-tabs":"^1.4.4","eslint":"^6.8.0","eslint-config-airbnb-base":"^14.1.0","eslint-config-airbnb-typescript":"^12.3.1","eslint-plugin-import":"^2.22.1","eslint-plugin-jsx-a11y":"^6.4.1","eslint-plugin-react":"^7.23.1","eslint-plugin-react-hooks":"^4.2.0","jest":"^26.6.3","jest-environment-jsdom":"^26.6.2","madge":"^4.0.2","mustache":"^4.2.0","prettier-eslint-cli":"^5.0.0","shx":"^0.3.3","ts-jest":"^26.5.4","ts-node":"^8.10.2","typescript":"^4.2.3"},"gitHead":"acb3606765b8ba02e29f0f5ba07624bac13229c2","_id":"slack-block-builder@2.4.1","_nodeVersion":"14.1.0","_npmVersion":"6.14.4","dist":{"integrity":"sha512-1EIVsx5pXqdc0qcC1qoEa1xmr9kByYzI+aZhZGBEX3pRTE4VLRmsRUeGg1nR2U4qXNrvB7fta2lGKnpfjSwZIw==","shasum":"b6120de6d9cd868cc0a509514262ab53c6ac1bd4","tarball":"https://registry.npmjs.org/slack-block-builder/-/slack-block-builder-2.4.1.tgz","fileCount":4,"unpackedSize":35480,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhp2NUCRA9TVsSAnZWagAAzqkP/R8Fpon+4jUXL2C8Qt53\nz44bDHhd2+MswuIR1nXMci3ztwC+IHt+af5VK2KHGqmwkr/jjTUpKyiumSTh\nmRQOsKJ7CfkbMvjU/HPO91+QT1/023kWaioKDYA8AD7RvJ3mX/Yl4M4h+qvr\nWca1ST7ZXrPkDlvmeffRF+Hmvld9mih+UwAYHxhVxj76KQS7zuTGK9YLCOXR\nbbei6hVpFSPjm+36dAKWJo5Q8CF8aJSKCB+980lMLI5WRccBLUZXiHjE/5+P\n0hHLruzJxnQa1BN2P89MYpws4HvpiObDJjrpGvY3jBzNmS1TcJSyH1H8hL96\n/lU61hn70RS32eASLEJkRT+LIUs3mSodWOgXtvHvpTmaIM0xwevWqwPh4uCM\nsFc8hX2/P8EBe5prjug2q4iexQ+pwJBG2CYdLvoXwwYhxfqkIjRQ6oispZHT\njSjUcZ4nKo6jc6lAtm+ZLWCF2bnD5Em34GD1ggN/VNNQmE0O+4+Y4FFMiI+2\ngc+cceri5RQEtC8JOUIMvoSt//CXLNJhidduiqb/GEYHURTYf9YJt1a8oJ3D\n+DGyfbNWqqxMjZ0bmnBQ3Z3KWZoxsmCBNgnJ8y+Ak6BUfNtO7TE4gsbuuyQl\nS3gj+PaUVAoCVkTah863gIuM519svf7cV8o78kHozHwOzePqadrXjrpKnWoC\naYuQ\r\n=n60B\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCvG218VuapCOaaw5XOOBtt1mUwX+p1XAyAa7jDXch2MQIhAJdc63ZQsUra8M8NtFL8H0YrlbcDstcH4vvkJAw6z5IC"}]},"_npmUser":{"name":"raycharius","email":"raydeast@gmail.com"},"directories":{},"maintainers":[{"name":"bravecow","email":"neporozhniy@gmail.com"},{"name":"raycharius","email":"raydeast@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/slack-block-builder_2.4.1_1638359892122_0.22387835078840745"},"_hasShrinkwrap":false,"deprecated":"Fixed critical issue"},"2.4.2":{"name":"slack-block-builder","version":"2.4.2","description":"Maintainable code for interactive Slack messages, modals, home tabs, and workflow steps. A must-have for the Slack Block Kit framework.","author":{"name":"Ray East","url":"https://github.com/raycharius"},"repository":{"type":"git","url":"git+https://github.com/raycharius/slack-block-builder.git"},"homepage":"https://blockbuilder.dev","bugs":{"url":"https://github.com/raycharius/slack-block-builder/issues"},"main":"./dist/index.js","types":"./dist/index.d.ts","license":"MIT","keywords":["slack","interactive-messages","block-actions","bot","slack-bot","modal","block","kit","swiftui","bot","modal","messages","message-builder","block-builder","slack-block-builder","block-kit","blocks","botkit","bolt","slack-bolt"],"scripts":{"src:build":"tsc -p ./tsconfig.json","src:lint":"eslint 'src/**/*.ts' --fix","docs:build":"tsc -p ./tsconfig.docs.json","docs:lint":"eslint 'docs-generator/**/*.ts' --fix","docs:serve":"docsify serve ./docs","predocs:generate":"npm run docs:build","docs:generate":"node docs-generator-dist/index.js","docs:local":"docsify serve docs --port 3000","tests:lint":"eslint 'tests/**/*.ts' --fix","tests:coverage":"codecov","clean":"shx rm -rf ./dist ./coverage ./docs-generator-dist","test":"jest --coverage","build":"npm run src:build","lint":"eslint 'src/**/*.ts' 'tests/**/*.ts' 'docs-generator/**/*.ts'","lint:fix":"eslint 'src/**/*.ts' 'tests/**/*.ts' 'docs-generator/**/*.ts' --fix","madge":"npx madge --circular --warning --extensions ts ./"},"devDependencies":{"@types/jest":"^26.0.22","@typescript-eslint/eslint-plugin":"^4.20.0","@typescript-eslint/parser":"^4.20.0","codecov":"^3.8.1","docsify-cli":"^4.4.3","docsify-server-renderer":"^4.12.1","docsify-tabs":"^1.4.4","eslint":"^6.8.0","eslint-config-airbnb-base":"^14.1.0","eslint-config-airbnb-typescript":"^12.3.1","eslint-plugin-import":"^2.22.1","eslint-plugin-jsx-a11y":"^6.4.1","eslint-plugin-react":"^7.23.1","eslint-plugin-react-hooks":"^4.2.0","jest":"^26.6.3","jest-environment-jsdom":"^26.6.2","madge":"^4.0.2","mustache":"^4.2.0","prettier-eslint-cli":"^5.0.0","shx":"^0.3.3","ts-jest":"^26.5.4","ts-node":"^8.10.2","typescript":"^4.2.3"},"gitHead":"acb3606765b8ba02e29f0f5ba07624bac13229c2","_id":"slack-block-builder@2.4.2","_nodeVersion":"14.1.0","_npmVersion":"6.14.4","dist":{"integrity":"sha512-VMcXwVpoJ5x3ZcZCsHXmP9XgP7O9x6qJ/OVfKGXrxdqixOUPku65aqQ597Sk+5gv/MUz4jCzSZcnj5Wy4j1LuA==","shasum":"e34984d4b7c0c5a51cd385b1e4a39239226ccd64","tarball":"https://registry.npmjs.org/slack-block-builder/-/slack-block-builder-2.4.2.tgz","fileCount":180,"unpackedSize":302517,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhp2RZCRA9TVsSAnZWagAAPWQP/iNoHwAZaPveK0znITTz\nmGV7x7e6SARA2GctRa2aOio+6rS3CE+uIjnUkJKYjLrIOX+HjSVOUc684iaB\n69p17VnKBfAhnNLDkpWi3lRB66afY2ilX699J7AmiIU9J4TqRanpJGUXL79l\nF4FsMhpTJuDX4T53r+a2H8iMCoLW1OGxQOMqhvPkQBT/vJ9SWG81K6ZXzahP\nyjar1qMlXgGaGDpKmBxPgbjh66b/1lNlXt5BdNPdrxsK6YZ+j66Ce0WpnzWS\nrUr3+LmuSHeg1MrwMSlTY7wf5N3EsWyDhYYbOD5jKbX/fGpg0GYTj9HFWeLc\ndoctxdXeTPPDe42j4q9A35a33uZ2PN+oeD9thcRrPNvRuBUQvMONqxqevjoO\nXnPVPvFGcZBBzLamWuN+edc9fXPXE143bbtoboe114VGGYi+TK56sI2EvkY3\nsfq2vX2fe42H9+9SKNZ0yBEoilgFMi/wW+HJoEaOSjBj0M8Y/WI+z+AuWDCE\nipCwkKCob3Sb6sJ9PCDdD9MiUsI96GufAeX6iteMKI8DV3KdcKbT61YQoMim\n/V99UWR5kLANY8s/e/BhQV0fWTsqNn/AOHhHmyQbyfIlvlO5cFWpPyTtl++A\n6lqoyZbQWAe39AKy1u2Pg0IT/8E3Yplov0NmKm7dGF36uERB6aIDCjTCHSaK\nRQjV\r\n=bij8\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICfN/HU0oZ6fEjkPcjG5Vyj+peVngdIM8pN6roaiED9WAiEAnIIE6Qa2EPV7BipLwFkFuU7s1pRBq54HhfhHn8RNd1o="}]},"_npmUser":{"name":"raycharius","email":"raydeast@gmail.com"},"directories":{},"maintainers":[{"name":"bravecow","email":"neporozhniy@gmail.com"},{"name":"raycharius","email":"raydeast@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/slack-block-builder_2.4.2_1638360153709_0.9148494986570934"},"_hasShrinkwrap":false},"2.5.0":{"name":"slack-block-builder","version":"2.5.0","description":"Maintainable code for interactive Slack messages, modals, home tabs, and workflow steps. A must-have for the Slack Block Kit framework.","author":{"name":"Ray East","url":"https://github.com/raycharius"},"repository":{"type":"git","url":"git+https://github.com/raycharius/slack-block-builder.git"},"homepage":"https://blockbuilder.dev","bugs":{"url":"https://github.com/raycharius/slack-block-builder/issues"},"main":"./dist/index.js","types":"./dist/index.d.ts","license":"MIT","keywords":["slack","interactive-messages","block-actions","bot","slack-bot","modal","block","kit","swiftui","bot","modal","messages","message-builder","block-builder","slack-block-builder","block-kit","blocks","botkit","bolt","slack-bolt"],"scripts":{"src:build":"tsc -p ./tsconfig.json","src:lint":"eslint 'src/**/*.ts' --fix","docs:build":"tsc -p ./tsconfig.docs.json","docs:lint":"eslint 'docs-generator/**/*.ts' --fix","docs:serve":"docsify serve ./docs","predocs:generate":"npm run docs:build","docs:generate":"node docs-generator-dist/index.js","docs:local":"docsify serve docs --port 3000","tests:lint":"eslint 'tests/**/*.ts' --fix","tests:coverage":"codecov","clean":"shx rm -rf ./dist ./coverage ./docs-generator-dist","test":"jest --coverage","build":"npm run src:build","lint":"eslint 'src/**/*.ts' 'tests/**/*.ts' 'docs-generator/**/*.ts'","lint:fix":"eslint 'src/**/*.ts' 'tests/**/*.ts' 'docs-generator/**/*.ts' --fix","madge":"npx madge --circular --warning --extensions ts ./"},"devDependencies":{"@types/jest":"^26.0.22","@typescript-eslint/eslint-plugin":"^4.20.0","@typescript-eslint/parser":"^4.20.0","codecov":"^3.8.1","docsify-cli":"^4.4.3","docsify-server-renderer":"^4.12.1","docsify-tabs":"^1.4.4","eslint":"^6.8.0","eslint-config-airbnb-base":"^14.1.0","eslint-config-airbnb-typescript":"^12.3.1","eslint-plugin-import":"^2.22.1","eslint-plugin-jsx-a11y":"^6.4.1","eslint-plugin-react":"^7.23.1","eslint-plugin-react-hooks":"^4.2.0","jest":"^26.6.3","jest-environment-jsdom":"^26.6.2","madge":"^4.0.2","mustache":"^4.2.0","prettier-eslint-cli":"^5.0.0","shx":"^0.3.3","ts-jest":"^26.5.4","ts-node":"^8.10.2","typescript":"^4.2.3"},"gitHead":"d18e885d7e76a653134db46cc05699bc124cae65","_id":"slack-block-builder@2.5.0","_nodeVersion":"14.1.0","_npmVersion":"6.14.4","dist":{"integrity":"sha512-Gekb6jSKmyZtYXFrMXN637/FttYiUFvcoDeKt5epcwTDggxQvtw/Q3aO5eR4JNe5UW2JoSGao+6GX3NZf2yceA==","shasum":"8ebcd33726bac0f6ee67711077ec66337d26d0a8","tarball":"https://registry.npmjs.org/slack-block-builder/-/slack-block-builder-2.5.0.tgz","fileCount":180,"unpackedSize":305868,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJh/jY0CRA9TVsSAnZWagAAlEgP/3K4lh0LrhMlxfkVt9dv\nYFJ8876g7iVmFhN4ezdRNiNDIK/MRGfr2BNuJ2IRll6AoDG7PVKubq34f5pF\npEHdecTTz8Qoque/6r6134dPy6/eTqfRny6e0ZPBoyjLzRMsODa4k34+R9VV\nv24iBh4pXIoEKZLjE6OebGhxLXxSgfDYak45eGOcLmULYwCqMChUzEtVFDTQ\nEaYwGFCuG8Tpn+nvcnE3QYQWRCYskF3qvjPPCzCtb2Z164N59JRDRU9gokkj\nA1QvnjOJVlsIvYEPlGbDkmWu6kuRkB0H3EiMw7kpe6qWShiGH8I7RKjNRL6+\n6RsoeUU/J35ANva7FvPhTiOs6VPLtwuHLe3mOJQNk2mVGjKoFpl5cjX9y5AZ\n6PiSnOBdEXeoNK7mOPngh2k8795WFJvj0z/3xM+0iMfFCIFLevGM9lLvvvuI\nksnekq7BQewKbsucuhaeR7rePjiObJM+J4CWpGme9ttwj3rt+LIhwqwitIUr\n+xS7A1ueBAxU1ubY0RV0qU8kkbLeKxR9qi3sTkMZJmlpgmiignaym7/QONXZ\nYQQ41zwsF3JivATDFZBAb9FqY3v8gZ5dSi6Y/iZpRWUp/hgRSqhqmhiIYFzz\nkS3htcHGz1xaSkw/+2tCix3Ym3hUSU7lpmRyllYEB55ZzJCN6g+LqDZbYoQV\nQnFI\r\n=aCh4\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCLSv5B66lTlubsyyiM2ErYaelETjUvIhzubF1MOO64qwIgVAh49OEXGBoqM1BkdgU6YncAVR8qXpItRFXjXRY+RP4="}]},"_npmUser":{"name":"raycharius","email":"raydeast@gmail.com"},"directories":{},"maintainers":[{"name":"bravecow","email":"neporozhniy@gmail.com"},{"name":"raycharius","email":"raydeast@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/slack-block-builder_2.5.0_1644049972234_0.6995215670204173"},"_hasShrinkwrap":false},"2.6.0":{"name":"slack-block-builder","version":"2.6.0","description":"Maintainable code for interactive Slack messages, modals, home tabs, and workflow steps. A must-have for the Slack Block Kit framework.","author":{"name":"Ray East","url":"https://github.com/raycharius"},"repository":{"type":"git","url":"git+https://github.com/raycharius/slack-block-builder.git"},"homepage":"https://blockbuilder.dev","bugs":{"url":"https://github.com/raycharius/slack-block-builder/issues"},"main":"./dist/index.js","types":"./dist/index.d.ts","license":"MIT","keywords":["slack","interactive-messages","block-actions","bot","slack-bot","modal","block","kit","swiftui","bot","modal","messages","message-builder","block-builder","slack-block-builder","block-kit","blocks","botkit","bolt","slack-bolt"],"scripts":{"src:build":"tsc -p ./tsconfig.json","src:lint":"eslint 'src/**/*.ts' --fix","docs:build":"tsc -p ./tsconfig.docs.json","docs:lint":"eslint 'docs-generator/**/*.ts' --fix","docs:serve":"docsify serve ./docs","predocs:generate":"npm run docs:build","docs:generate":"node docs-generator-dist/index.js","docs:local":"docsify serve docs --port 3000","tests:lint":"eslint 'tests/**/*.ts' --fix","tests:coverage":"codecov","clean":"shx rm -rf ./dist ./coverage ./docs-generator-dist","test":"jest --coverage","build":"npm run src:build","lint":"eslint 'src/**/*.ts' 'tests/**/*.ts' 'docs-generator/**/*.ts'","lint:fix":"eslint 'src/**/*.ts' 'tests/**/*.ts' 'docs-generator/**/*.ts' --fix","madge":"npx madge --circular --warning --extensions ts ./"},"devDependencies":{"@types/jest":"^26.0.22","@typescript-eslint/eslint-plugin":"^4.20.0","@typescript-eslint/parser":"^4.20.0","codecov":"^3.8.1","docsify-cli":"^4.4.3","docsify-server-renderer":"^4.12.1","docsify-tabs":"^1.4.4","eslint":"^6.8.0","eslint-config-airbnb-base":"^14.1.0","eslint-config-airbnb-typescript":"^12.3.1","eslint-plugin-import":"^2.22.1","eslint-plugin-jsx-a11y":"^6.4.1","eslint-plugin-react":"^7.23.1","eslint-plugin-react-hooks":"^4.2.0","jest":"^26.6.3","jest-environment-jsdom":"^26.6.2","madge":"^4.0.2","mustache":"^4.2.0","prettier-eslint-cli":"^5.0.0","shx":"^0.3.3","ts-jest":"^26.5.4","ts-node":"^8.10.2","typescript":"^4.2.3"},"gitHead":"2ea818ee7177aab2640c5dbffc43317b8fccbb26","_id":"slack-block-builder@2.6.0","_nodeVersion":"16.14.0","_npmVersion":"8.3.1","dist":{"integrity":"sha512-+a4Dpoz0EaP2ytS7N+DYmkww5j9oKx2LC6b2FTr/+fMUz5bS9xQCvdl45538zZYCpF0WgXOdZakJZZU7pDArXw==","shasum":"26dea0f29e1cadcd016857f86ffc8cf5579d03e2","tarball":"https://registry.npmjs.org/slack-block-builder/-/slack-block-builder-2.6.0.tgz","fileCount":181,"unpackedSize":318337,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHAuVD4CPlVtrNRAonVYTWDu1af+fISRnc1rPbm0vqE8AiBW8f59tocxQJCpDbw4na0F8REm03t+ZH5NDX+skVj41w=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJi1BKeACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoI6w/9HPWz+ynCvLhT/ZlP2LPu3/7L/c31BU1oV4sgALVo+94obvY5\r\niXMnKWyRF6eu70fM17liK+ZBrX7QeiojJ9CGRwrLpo4nbxQqISiqwvVydU3u\r\nMJTHRR9LiKQX4rW9yckq2ndR8q1qTR7c74Q9FWJy5sLq23ogqg8iGTYDx8vU\r\n7RBrl35tEgNlpAiUhYuMLUUseZ8h66zizRkA001b8XnAPxCmAwFrpAeN1UTL\r\n61bB8BJkwO07ckb9YIebh5ylH8xCk7UpFEFyv2nOKmfyyx3zfRpkxac3Hr8E\r\nE6OrNulxQMt2mvnJFYRuQdZFOUV8OCHqs/+rjyb6Ovl1P4eJETOQhTTAsg4q\r\n1SSMdHdNCtnUlW6vON1yGmPHjWRgWDMGtI0eMCXti38+WCHdw0efRjUktRa9\r\nh+SCnHYawP03+pQnV1AuSSoBPuhjlO5TrcWrhLRyRo/yBds/7vFlNfFKpc0t\r\n/0gZZ/SlliB6zGIbJVgPYpLp7KSVNAGBAs2PLvhGzIY6+gNq15VeJ9Pj/YPm\r\nXfDecHMGhh0uop8mwNkWpJ0o76lyu2eDd4ApZKM2at1WwzFsTdvN5WMAgHbK\r\nFQQ8tEkNdhxSbPzq49dSqStRaIog/9S256DnJiM3O305oDVMSPPjgW3hUJBb\r\nSvoQXyrNGyvjVhAGonlYYw5hPx1NEJOUkgo=\r\n=/OWG\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"raycharius","email":"raydeast@gmail.com"},"directories":{},"maintainers":[{"name":"bravecow","email":"neporozhniy@gmail.com"},{"name":"raycharius","email":"raydeast@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/slack-block-builder_2.6.0_1658065566615_0.07218512923894949"},"_hasShrinkwrap":false},"2.7.0":{"name":"slack-block-builder","version":"2.7.0","description":"Maintainable code for interactive Slack messages, modals, home tabs, and workflow steps. A must-have for the Slack Block Kit framework.","author":{"name":"Ray East","url":"https://github.com/raycharius"},"repository":{"type":"git","url":"git+https://github.com/raycharius/slack-block-builder.git"},"homepage":"https://blockbuilder.dev","bugs":{"url":"https://github.com/raycharius/slack-block-builder/issues"},"main":"./dist/index.js","types":"./dist/index.d.ts","license":"MIT","keywords":["slack","interactive-messages","block-actions","bot","slack-bot","modal","block","kit","swiftui","bot","modal","messages","message-builder","block-builder","slack-block-builder","block-kit","blocks","botkit","bolt","slack-bolt"],"scripts":{"src:build":"tsc -p ./tsconfig.json","src:lint":"eslint 'src/**/*.ts' --fix","docs:build":"tsc -p ./tsconfig.docs.json","docs:lint":"eslint 'docs-generator/**/*.ts' --fix","docs:serve":"docsify serve ./docs","predocs:generate":"npm run docs:build","docs:generate":"node docs-generator-dist/index.js","docs:local":"docsify serve docs --port 3000","tests:lint":"eslint 'tests/**/*.ts' --fix","tests:coverage":"codecov","clean":"shx rm -rf ./dist ./coverage ./docs-generator-dist","test":"jest --coverage","build":"npm run src:build","lint":"eslint 'src/**/*.ts' 'tests/**/*.ts' 'docs-generator/**/*.ts'","lint:fix":"eslint 'src/**/*.ts' 'tests/**/*.ts' 'docs-generator/**/*.ts' --fix","madge":"npx madge --circular --warning --extensions ts ./"},"devDependencies":{"@types/jest":"^26.0.22","@typescript-eslint/eslint-plugin":"^4.20.0","@typescript-eslint/parser":"^4.20.0","codecov":"^3.8.1","docsify-cli":"^4.4.3","docsify-server-renderer":"^4.12.1","docsify-tabs":"^1.4.4","eslint":"^6.8.0","eslint-config-airbnb-base":"^14.1.0","eslint-config-airbnb-typescript":"^12.3.1","eslint-plugin-import":"^2.22.1","eslint-plugin-jsx-a11y":"^6.4.1","eslint-plugin-react":"^7.23.1","eslint-plugin-react-hooks":"^4.2.0","jest":"^26.6.3","jest-environment-jsdom":"^26.6.2","madge":"^4.0.2","mustache":"^4.2.0","prettier-eslint-cli":"^5.0.0","shx":"^0.3.3","ts-jest":"^26.5.4","ts-node":"^8.10.2","typescript":"^4.2.3"},"gitHead":"68af5619ac91ec048d61b78d400075e0aebce523","_id":"slack-block-builder@2.7.0","_nodeVersion":"16.14.0","_npmVersion":"8.3.1","dist":{"integrity":"sha512-P41trJufCa+Va6G/gT++MVOuIOSLQIRB3kewczCQZ7zZbDcPPxyT3nUiZpCxV/+enq/LUnJlzB93WTqQX+ABRg==","shasum":"8822579c60214dec93dbad25e9c48e81f7c7fde9","tarball":"https://registry.npmjs.org/slack-block-builder/-/slack-block-builder-2.7.0.tgz","fileCount":189,"unpackedSize":339331,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDHgk3N8ErZufL1WD24WnPEZy0gcsAfdNW7uAwx3ZxcswIhAL9tFmnxxuXIOssf5hFK3nw28a7V3DR4axkgODL4JRcD"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjZ93tACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmocOA//Tn4BRcchthyL7oJbwGFTMFOx0O29E7CW/umjq/e6X/fxwGKO\r\n4wIT7gWpPE0AH4M2A7ZQcwqLkj78OYu4hhO7nzAi98YoXHeIByqUSbyFiAY0\r\nV5ZhwF15amphKBDa6CuJWm47UwFMmG1t+FFpMav384P/JTm/MEBcnCIKoP0H\r\ndZA0CC0MRRQnZDz3+rzf+wx4Eo+B5eaEiXE5pZow/EYslZN8FCWMCiNcvJm0\r\ns9jhisMP9ROjLemTiGGLS4CcQAyupB20u7dof8tyGjXkM/8dMiVqpvpuMWf3\r\ncu3+UFuiLIaW9oX613w+tD5VuRK0+d4oK9zukmTLdrFo0LhH9OfvudnwXevk\r\nIXHqwwgka+v0C0vqY3va3QuqQUPa1bdJv6H21/8KoRWhGmq2woYxBCoyTpp1\r\nusuFsLk0E3402jlAswFuIcqGiWrgmceAsu5hndgJmFAN19QjyLs75CoNavEb\r\nFJ4D8ZyTXfLS/Fev1gvcUT2qvpS94RsVhXU9n9m758rq4rLGetK9g6jLgEi4\r\ndIgZYmu+xE5Lu9rimurmCr194fwB7wll9dMMhrqURp9HymoG0Qxw0j8cVlih\r\nE6arQQ6ry4a1wOtvdrBLWSa7s4gt85ypB8IbpOavQGZ0+xNvaKZc9Ih8msjW\r\n4rkq23nrodPSTNIYIyPes9nrNVngpo020yQ=\r\n=FbQw\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"raycharius","email":"raydeast@gmail.com"},"directories":{},"maintainers":[{"name":"bravecow","email":"neporozhniy@gmail.com"},{"name":"raycharius","email":"raydeast@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/slack-block-builder_2.7.0_1667751405526_0.21962726763089235"},"_hasShrinkwrap":false},"2.7.1":{"name":"slack-block-builder","version":"2.7.1","description":"Maintainable code for interactive Slack messages, modals, home tabs, and workflow steps. A must-have for the Slack Block Kit framework.","author":{"name":"Ray East","url":"https://github.com/raycharius"},"repository":{"type":"git","url":"git+https://github.com/raycharius/slack-block-builder.git"},"homepage":"https://blockbuilder.dev","bugs":{"url":"https://github.com/raycharius/slack-block-builder/issues"},"main":"./dist/index.js","types":"./dist/index.d.ts","license":"MIT","keywords":["slack","interactive-messages","block-actions","bot","slack-bot","modal","block","kit","swiftui","bot","modal","messages","message-builder","block-builder","slack-block-builder","block-kit","blocks","botkit","bolt","slack-bolt"],"scripts":{"src:build":"tsc -p ./tsconfig.json","src:lint":"eslint 'src/**/*.ts' --fix","docs:build":"tsc -p ./tsconfig.docs.json","docs:lint":"eslint 'docs-generator/**/*.ts' --fix","docs:serve":"docsify serve ./docs","predocs:generate":"npm run docs:build","docs:generate":"node docs-generator-dist/index.js","docs:local":"docsify serve docs --port 3000","tests:lint":"eslint 'tests/**/*.ts' --fix","tests:coverage":"codecov","clean":"shx rm -rf ./dist ./coverage ./docs-generator-dist","test":"jest --coverage","build":"npm run src:build","lint":"eslint 'src/**/*.ts' 'tests/**/*.ts' 'docs-generator/**/*.ts'","lint:fix":"eslint 'src/**/*.ts' 'tests/**/*.ts' 'docs-generator/**/*.ts' --fix","madge":"npx madge --circular --warning --extensions ts ./"},"devDependencies":{"@types/jest":"^26.0.22","@typescript-eslint/eslint-plugin":"^4.20.0","@typescript-eslint/parser":"^4.20.0","codecov":"^3.8.1","docsify-cli":"^4.4.3","docsify-server-renderer":"^4.12.1","docsify-tabs":"^1.4.4","eslint":"^6.8.0","eslint-config-airbnb-base":"^14.1.0","eslint-config-airbnb-typescript":"^12.3.1","eslint-plugin-import":"^2.22.1","eslint-plugin-jsx-a11y":"^6.4.1","eslint-plugin-react":"^7.23.1","eslint-plugin-react-hooks":"^4.2.0","jest":"^26.6.3","jest-environment-jsdom":"^26.6.2","madge":"^4.0.2","mustache":"^4.2.0","prettier-eslint-cli":"^5.0.0","shx":"^0.3.3","ts-jest":"^26.5.4","ts-node":"^8.10.2","typescript":"^4.2.3"},"gitHead":"3bc6ecb67a2b60b28a8df17f96161f42ae28ac86","_id":"slack-block-builder@2.7.1","_nodeVersion":"16.14.0","_npmVersion":"8.3.1","dist":{"integrity":"sha512-xJ9fvO+ITr7m8qBg6sGAnoUZMEYtafL2xhRCHDvh5IVX/l5Ae81wKcW7pidljKHj/OAQLEUBAnYT5+smsWhxKg==","shasum":"77b2a55cad769de912932ed9cbc91ea350ec9d75","tarball":"https://registry.npmjs.org/slack-block-builder/-/slack-block-builder-2.7.1.tgz","fileCount":189,"unpackedSize":339550,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFZCYr4AW0sJ+6lB1d486QDMvliBiKl+Hic8FaTkfycAAiEAj9G/gQjXAqNFHFcfKHFjmB7Pc8UWlKDr5bpABwdFtNE="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjbkyFACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmq+rg//X6VNrcznvbZfUChYsuRbwNjycdHB/0qDoPEeQUn7e2+xJYlE\r\nQ8OqQcvBGzDi/ZNvM/C2kaNdY8lafvN2+AMULTluTxywOCE124GE765ikY6E\r\nbHa99fckNuthRBizdKlIPG945w8B0AR0uqekYelkwpfOzO5RmGP0HGTnTnEg\r\ny6cuIT8wNHxgoA5uDVi9/KtIclzj+wDN+7YraHSRZ+So5NDl64ZuaWWXHKCv\r\nivFRGFtfwxhXSIMB950XMVeQ+Qlk1owAM3N6y8V3Bz/1VT+nlxLgd54pzbgX\r\n2xhquZhk4R8J6+7xVUZFJDinDp5XGdEV2TcnFMqM3Kxk5Tggg6lfYUVCIqxX\r\np9FHncufUnB8oM2TFSBHeHVY0rU87hStnY6AGqO622MbSTg25OhfV57IkGPz\r\nCY6F/TyiOdsscpGItmHmSu6Y3S9w62S6GCwKAMVLg/DcNOPjD4imwUTda+oF\r\nGHnODmT5sRE7Xf6JrN0/nl26m9hd7+Iizb9T9LdYbu0ZLu6g0ePAWw055/EA\r\nidbvB/pDYL5TpJ6AeJuJYG6kSJvvFGSTqli/RooLjTJs3YLjIyaG7p1ndQqj\r\nz1WybwwStQmuxwetQHIoBAnOnJepojnGd7cNhxwnKMhakczrlZSUm9vH/sn2\r\ni2+K4bWnrgdXZ4D0WjVakNe0u7iwJ+oGHis=\r\n=gzKb\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"raycharius","email":"raydeast@gmail.com"},"directories":{},"maintainers":[{"name":"bravecow","email":"neporozhniy@gmail.com"},{"name":"raycharius","email":"raydeast@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/slack-block-builder_2.7.1_1668172933196_0.6486662729040089"},"_hasShrinkwrap":false},"2.7.2":{"name":"slack-block-builder","version":"2.7.2","description":"Maintainable code for interactive Slack messages, modals, home tabs, and workflow steps. A must-have for the Slack Block Kit framework.","author":{"name":"Ray East","url":"https://github.com/raycharius"},"repository":{"type":"git","url":"git+https://github.com/raycharius/slack-block-builder.git"},"homepage":"https://blockbuilder.dev","bugs":{"url":"https://github.com/raycharius/slack-block-builder/issues"},"main":"./dist/index.js","types":"./dist/index.d.ts","license":"MIT","keywords":["slack","interactive-messages","block-actions","bot","slack-bot","modal","block","kit","swiftui","bot","modal","messages","message-builder","block-builder","slack-block-builder","block-kit","blocks","botkit","bolt","slack-bolt"],"scripts":{"src:build":"tsc -p ./tsconfig.json","src:lint":"eslint 'src/**/*.ts' --fix","docs:build":"tsc -p ./tsconfig.docs.json","docs:lint":"eslint 'docs-generator/**/*.ts' --fix","docs:serve":"docsify serve ./docs","predocs:generate":"npm run docs:build","docs:generate":"node docs-generator-dist/index.js","docs:local":"docsify serve docs --port 3000","tests:lint":"eslint 'tests/**/*.ts' --fix","tests:coverage":"codecov","clean":"shx rm -rf ./dist ./coverage ./docs-generator-dist","test":"jest --coverage","build":"npm run src:build","lint":"eslint 'src/**/*.ts' 'tests/**/*.ts' 'docs-generator/**/*.ts'","lint:fix":"eslint 'src/**/*.ts' 'tests/**/*.ts' 'docs-generator/**/*.ts' --fix","madge":"npx madge --circular --warning --extensions ts ./"},"devDependencies":{"@types/jest":"^26.0.22","@typescript-eslint/eslint-plugin":"^4.20.0","@typescript-eslint/parser":"^4.20.0","codecov":"^3.8.1","docsify-cli":"^4.4.3","docsify-server-renderer":"^4.12.1","docsify-tabs":"^1.4.4","eslint":"^6.8.0","eslint-config-airbnb-base":"^14.1.0","eslint-config-airbnb-typescript":"^12.3.1","eslint-plugin-import":"^2.22.1","eslint-plugin-jsx-a11y":"^6.4.1","eslint-plugin-react":"^7.23.1","eslint-plugin-react-hooks":"^4.2.0","jest":"^26.6.3","jest-environment-jsdom":"^26.6.2","madge":"^4.0.2","mustache":"^4.2.0","prettier-eslint-cli":"^5.0.0","shx":"^0.3.3","ts-jest":"^26.5.4","ts-node":"^8.10.2","typescript":"^4.2.3"},"gitHead":"bdb89d73c6a24a2dae16b7c69f8c6d75da766370","_id":"slack-block-builder@2.7.2","_nodeVersion":"16.14.0","_npmVersion":"8.3.1","dist":{"integrity":"sha512-EhoXDveGZWrHL0+AKnm3wu8n9K9usMjJGlbYLLwMSq62J7Qv+a4lO1iJI+NmCE04dm37d/3OlGKxBVoASnynog==","shasum":"033a8c5066fc97a89199671cdefce2276d40ca9d","tarball":"https://registry.npmjs.org/slack-block-builder/-/slack-block-builder-2.7.2.tgz","fileCount":189,"unpackedSize":339613,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCvGPitwV76K0zDWeO4amZ2HTr6vN5AsDrJvml44uQckAIhAJBDstxLWvJ8YlMVLD7N5KnDa1TFNz03OemIPP2TJfCU"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjk3vPACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoNWg//RJSRH0jF/eNbStBPpOWHIsMhBwhuPixV15nhgF3nJMq/WBnF\r\nhkKv6Qk7DKU4YJa6MlEfsHOjv2gtSSBUvzyLkL/eCSvsdJ9n37fKkgBawxCI\r\n+uJ+AeviprkrBXKN1rpYbiFBGPG9/81QhqrZYd6KjCh5hznoqGT8r3LYP3Ig\r\nPHyFnQQZiqgW5Ll5nI4jI7rm8IlTopOy7NtYAJffP46B6wo4e+8FEiu8oH9P\r\n8blnOdts7MBiq4ZZbwS3nufpCxusJ68qPorRo071KXcg90Tb2NhYC+CuaQdE\r\nkf1xR13Zw48RkTdcaIB7NIedSudwqgeWywp4Pn5LOwUIM8/hTp6wLkJDqbdl\r\n7sQS/ZTwIOe2rVs2722x08fdHmrBMkHN0fRi3Jnhv2GjKGgYyR7VzNF3+dSE\r\nrXiCt3LPP6TNuPh4WucfebYNRQqIX3frU+qGqKbh1C2FasX1y3f07d/U8Rt9\r\n+KtTOAV1Ra4hO/dKX/EnQK0YeNTYMuDkUw4gZGz+Kjj8Teg3BlszYz8a+P9V\r\nFgi0cA6sRco4fxdPydX+st787iHnPBM/HhnfbqJnq0C94TBEJU08w2wKoey3\r\nNboB2q1wD0HvvVK6NS9kXUtRKkn8vYzBcb4qYqOyOAXcr2cPQ4aDORiCONLr\r\nbBHXLC7Zsye7TMQPHvmKriY9lrW6/KPrJ/Q=\r\n=IFRH\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"raycharius","email":"raydeast@gmail.com"},"directories":{},"maintainers":[{"name":"bravecow","email":"neporozhniy@gmail.com"},{"name":"raycharius","email":"raydeast@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/slack-block-builder_2.7.2_1670609871425_0.3724743730288951"},"_hasShrinkwrap":false},"2.8.0":{"name":"slack-block-builder","version":"2.8.0","description":"Maintainable code for interactive Slack messages, modals, home tabs, and workflow steps. A must-have for the Slack Block Kit framework.","author":{"name":"Ray East","url":"https://github.com/raycharius"},"repository":{"type":"git","url":"git+https://github.com/raycharius/slack-block-builder.git"},"homepage":"https://blockbuilder.dev","bugs":{"url":"https://github.com/raycharius/slack-block-builder/issues"},"main":"./dist/index.js","types":"./dist/index.d.ts","license":"MIT","keywords":["slack","interactive-messages","block-actions","bot","slack-bot","modal","block","kit","swiftui","bot","modal","messages","message-builder","block-builder","slack-block-builder","block-kit","blocks","botkit","bolt","slack-bolt"],"scripts":{"src:build":"tsc -p ./tsconfig.json","src:lint":"eslint 'src/**/*.ts' --fix","docs:build":"tsc -p ./tsconfig.docs.json","docs:lint":"eslint 'docs-generator/**/*.ts' --fix","docs:serve":"docsify serve ./docs","predocs:generate":"npm run docs:build","docs:generate":"node docs-generator-dist/index.js","docs:local":"docsify serve docs --port 3000","tests:lint":"eslint 'tests/**/*.ts' --fix","tests:coverage":"codecov","clean":"shx rm -rf ./dist ./coverage ./docs-generator-dist","test":"jest --coverage","build":"npm run src:build","lint":"eslint 'src/**/*.ts' 'tests/**/*.ts' 'docs-generator/**/*.ts'","lint:fix":"eslint 'src/**/*.ts' 'tests/**/*.ts' 'docs-generator/**/*.ts' --fix","madge":"npx madge --circular --warning --extensions ts ./"},"devDependencies":{"@types/jest":"^26.0.22","@typescript-eslint/eslint-plugin":"^4.20.0","@typescript-eslint/parser":"^4.20.0","codecov":"^3.8.1","docsify-cli":"^4.4.3","docsify-server-renderer":"^4.12.1","docsify-tabs":"^1.4.4","eslint":"^6.8.0","eslint-config-airbnb-base":"^14.1.0","eslint-config-airbnb-typescript":"^12.3.1","eslint-plugin-import":"^2.22.1","eslint-plugin-jsx-a11y":"^6.4.1","eslint-plugin-react":"^7.23.1","eslint-plugin-react-hooks":"^4.2.0","jest":"^26.6.3","jest-environment-jsdom":"^26.6.2","madge":"^4.0.2","mustache":"^4.2.0","prettier-eslint-cli":"^5.0.0","shx":"^0.3.3","ts-jest":"^26.5.4","ts-node":"^8.10.2","typescript":"^4.2.3"},"gitHead":"fac1baf4054ebfa5241d6065db54858f1522fe7d","_id":"slack-block-builder@2.8.0","_nodeVersion":"16.14.0","_npmVersion":"8.3.1","dist":{"integrity":"sha512-iisM+j99iKRuQFVfdWo0FiszDAl3r8Snq704oZH6C0RbDqvoVQStiptt6Y7kc6RX/5hSAqTqjhgvZ/di8cvaIA==","shasum":"895eea549b6aa8bd1a7a70dd6af8641ee7ec8dcf","tarball":"https://registry.npmjs.org/slack-block-builder/-/slack-block-builder-2.8.0.tgz","fileCount":191,"unpackedSize":346313,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCck03je9gvI0cTwHIC9sVcWVMnCtDDaroI3NOpLyY/xQIhAP+EE2cd/f/+h9S253ESOCuiohUVelI/HOh/ckEsuUuF"}]},"_npmUser":{"name":"raycharius","email":"raydeast@gmail.com"},"directories":{},"maintainers":[{"name":"bravecow","email":"neporozhniy@gmail.com"},{"name":"raycharius","email":"raydeast@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/slack-block-builder_2.8.0_1703278910482_0.8875818448834223"},"_hasShrinkwrap":false}},"time":{"created":"2020-06-09T13:56:19.381Z","0.1.0":"2020-06-09T13:56:19.502Z","modified":"2023-12-22T21:01:50.844Z","0.1.1":"2020-06-10T20:25:26.412Z","0.1.2":"2020-06-12T19:37:55.047Z","0.1.3":"2020-06-12T22:27:52.149Z","0.1.4":"2020-06-14T19:39:03.160Z","1.0.0":"2020-06-16T22:46:10.705Z","1.1.0":"2020-06-17T23:19:49.026Z","1.2.0":"2020-06-25T23:03:54.121Z","1.2.1":"2020-06-25T23:52:08.201Z","1.3.1":"2020-06-29T23:12:47.638Z","1.4.0":"2020-07-01T20:17:16.105Z","1.5.0":"2020-07-12T20:12:04.268Z","1.6.0":"2020-07-30T07:54:22.539Z","1.6.1":"2020-10-13T19:21:34.753Z","1.7.0":"2020-10-17T19:57:49.494Z","1.7.1":"2020-10-17T20:16:26.718Z","1.7.2":"2020-11-08T22:56:22.971Z","1.8.0":"2020-11-25T00:14:53.994Z","1.9.0":"2020-11-26T01:27:50.304Z","1.10.0":"2021-03-27T22:40:12.968Z","2.0.0-beta.0":"2021-05-16T21:35:24.140Z","2.0.0-beta.1":"2021-05-16T22:43:42.857Z","2.0.0-beta.2":"2021-05-20T15:06:29.761Z","2.0.0-beta.3":"2021-05-20T15:12:27.834Z","2.0.0-beta.4":"2021-05-28T21:27:37.794Z","2.0.0":"2021-06-10T19:31:31.030Z","2.0.1":"2021-06-10T19:34:59.516Z","2.1.0":"2021-07-24T12:13:54.903Z","2.1.1":"2021-08-30T20:35:15.755Z","2.1.2":"2021-09-20T14:06:22.049Z","2.2.0-beta.0":"2021-09-29T12:19:35.530Z","2.2.0-beta.1":"2021-09-29T19:02:39.490Z","2.2.0-beta.2":"2021-10-03T14:37:08.506Z","2.2.0":"2021-10-03T15:30:16.501Z","2.3.0":"2021-11-02T20:11:53.889Z","2.3.1":"2021-11-13T12:54:22.385Z","2.4.0":"2021-11-30T21:55:59.121Z","2.4.1-beta.0":"2021-12-01T11:49:06.027Z","2.4.1":"2021-12-01T11:58:12.333Z","2.4.2":"2021-12-01T12:02:33.904Z","2.5.0":"2022-02-05T08:32:52.396Z","2.6.0":"2022-07-17T13:46:06.860Z","2.7.0":"2022-11-06T16:16:45.750Z","2.7.1":"2022-11-11T13:22:13.451Z","2.7.2":"2022-12-09T18:17:51.585Z","2.8.0":"2023-12-22T21:01:50.654Z"},"maintainers":[{"name":"bravecow","email":"neporozhniy@gmail.com"},{"name":"raycharius","email":"raydeast@gmail.com"}],"description":"Maintainable code for interactive Slack messages, modals, home tabs, and workflow steps. A must-have for the Slack Block Kit framework.","homepage":"https://blockbuilder.dev","keywords":["slack","interactive-messages","block-actions","bot","slack-bot","modal","block","kit","swiftui","bot","modal","messages","message-builder","block-builder","slack-block-builder","block-kit","blocks","botkit","bolt","slack-bolt"],"repository":{"type":"git","url":"git+https://github.com/raycharius/slack-block-builder.git"},"author":{"name":"Ray East","url":"https://github.com/raycharius"},"bugs":{"url":"https://github.com/raycharius/slack-block-builder/issues"},"license":"MIT","readme":":information_source: **Block Builder** was built in Kyiv, Ukraine :ukraine: If it has saved you time as a developer and brought value to your projects and products, we would like to ask you to consider donating to **[Come Back Alive](https://savelife.in.ua/en/donate/)** to help Ukraine in its fight against Russian aggression. Every cent helps. :pray:\n\n***      \n\n<p align=\"center\">\n    <img src=\"https://raw.githubusercontent.com/raycharius/slack-block-builder/master/docs/resources/images/logo-horizontal.png\" alt=\"Logo\" width=\"600px\">\n</p>\n\n<p align=\"center\">\n    <h3 align=\"center\">Maintainable code for Slack interactive messages, modals, and home tabs.</h3>\n</p>\n\n<p align=\"center\">\n    Lightweight, zero-dependency library for declaratively building Slack Block Kit UI.\n    <br />\n    <br />\n    <a href=\"https://blockbuilder.dev\" target=\"_blank\"><strong>View the Docs »</strong></a>\n    <br />\n    <br />\n    <a href=\"#space_invader--usage\">Quick Start Guide</a>\n    ·\n    <a href=\"https://github.com/raycharius/slack-block-builder/issues\">Request Feature</a>\n    ·\n    <a href=\"https://github.com/raycharius/slack-block-builder/issues\">Report Bug</a>\n  </p>\n</p>\n\n![An example of using Block Builder](docs/resources/images/block-builder-hero-image.png)\n\n***\n\n[![npm](https://img.shields.io/npm/v/slack-block-builder?color=bright-green)](https://www.npmjs.com/package/slack-block-builder)\n![NPM](https://img.shields.io/npm/l/slack-block-builder?color=bright-green)\n[![codecov](https://codecov.io/gh/raycharius/slack-block-builder/branch/master/graph/badge.svg)](https://codecov.io/gh/raycharius/slack-block-builder)\n\n**Block Builder** helps you keep your Slack app code for UI maintainable, testable, and reusable. It has a declarative, chainable syntax inspired by [SwiftUI](https://developer.apple.com/documentation/swiftui) and is built for better UI architecture.\n\n### :zap: &nbsp; Features\n\n* Declarative [SwiftUI](https://developer.apple.com/xcode/swiftui/) inspired syntax.\n* Commonly-used UI components, such as a `Paginator` and `Accordion`.\n* Inline conditional helper functions for declaratively appending or omitting UI content.\n* The ability to build more complex flows using loops and conditionals.\n* A `printPreviewURL()` method that outputs a link to preview your UI on Slack's [Block Kit Builder website](https://app.slack.com/block-kit-builder) for easier prototyping.\n* A set of helper functions for formatting text with Slack's markdown standard.\n* In-depth [doc site](https://blockbuilder.dev) at [https://blockbuilder.dev](https://blockbuilder.dev).\n* [Support](#block-kit-support-and-reference) for all current Slack Block Kit objects.\n* A great TypeScript experience.\n* Extensive JSDoc hints with explanations, validation rules, and quick links to full documentation.\n* Zero dependencies.\n\n### :gift: &nbsp; Benefits\n\n* Write three times less code.\n* Build more sophisticated, elegant flows.\n* Design better UI architecture for your Slack apps.\n* Focus more on code in your IDE than on studying the [Slack API docs](https://api.slack.com/).\n* Easily integrate localizations into your app.\n\n### :busts_in_silhouette: &nbsp; Join The Community\n\nFeedback – love it! Aside from GitHub Issues, there's a Slack channel available in the Slack Community workspace to discuss **Block Builder** – we'll see you there! :raised_hands:\n\n* **Slack Community** – [\\#block-builder](https://slackcommunity.com)\n\n### :floppy_disk: &nbsp; Installation \n\n**Block Builder** requires Node.js 12 or higher, and, when using TypeScript, TypeScript 3.8 or higher.\n\n#### Using NPM: \n\n``` bash\nnpm install --save slack-block-builder\n```\n\n#### Using Yarn: \n\n``` bash\nyarn add slack-block-builder\n```\n\n### :space_invader: &nbsp; Usage\n\nFor full documentation, make sure you head over to [https://blockbuilder.dev](https://blockbuilder.dev).\n\n\n### Importing\n\nThe functions for creating objects can be both imported directly or through an object that groups them by category.\n\n```javascript\n// Importing exposed groups of objects\n\nimport { Surfaces, Blocks, Elements, Bits, Utilities } from 'slack-block-builder';\n\n// Importing objects top-level\n\nimport { Modal, Section, Actions, Button } from 'slack-block-builder';\n```\n\nThe same goes for importing Slack markdown helper functions:\n\n```javascript\n// Importing the Md object\n\nimport { Surfaces, Blocks, Md } from 'slack-block-builder';\n\n// Importing the functions top-level\n\nimport { Modal, Section, bold, link } from 'slack-block-builder';\n```\n\n### Object Breakdown\n\n`Surfaces` – Contains functions for creating modals, messages, home tabs, and workflow steps. \n\n`Blocks` – Layout blocks used to organize the UI.\n\n`Elements` – UI elements that are used to capture user interaction.\n\n`Bits` – These are composition objects and other bits and pieces from Slack's docs. Included are `Attachment`, `Options`, `OptionGroup`, and `ConfirmationDialog`. They felt like they were deserving of their own category.\n\n`Utilities` – A group of utility functions. See [Utility Functions](#utility-functions).\n\n`Md` – Helper functions for formatting text with Slack's markdown. See [Markdown Helpers](#markdown-helpers).\n\n### Block Kit Support and Reference\n\nBelow is a list of supported objects and how to access them in **Block Builder**:\n\n| **Name**           | **Type**           | **Support**                    | **Accessed Via**                      \n|--------------------|--------------------|--------------------------------|-----------------------------------------\n| Home Tab           | Surface            | :white_check_mark:             | `Surfaces.HomeTab()`                       \n| Message            | Surface            | :white_check_mark:             | `Surfaces.Message()`                       \n| Modal              | Surface            | :white_check_mark:             | `Surfaces.Modal()`                         \n| Workflow Step      | Surface            | :white_check_mark:             | `Surfaces.WorkflowStep()`                         \n| Actions            | Block              | :white_check_mark:             | `Blocks.Actions()`                \n| Context            | Block              | :white_check_mark:             | `Blocks.Context()`                \n| Divider            | Block              | :white_check_mark:             | `Blocks.Divider()`                \n| File               | Block              | :white_check_mark:             | `Blocks.File()`\n| Header             | Block              | :white_check_mark:             | `Blocks.Header()`\n| Image              | Block              | :white_check_mark:             | `Blocks.Image()`                  \n| Input              | Block              | :white_check_mark:             | `Blocks.Input()`                  \n| Section            | Block              | :white_check_mark:             | `Blocks.Section()`\n| Video              | Block              | :white_check_mark:             | `Blocks.Video()`                \n| Button             | Element            | :white_check_mark:️             | `Elements.Button()`               \n| Checkboxes         | Element            | :white_check_mark:             | `Elements.Checkboxes()`           \n| Date Picker        | Element            | :white_check_mark:             | `Elements.DatePicker()`\n| Date Time Picker   | Element            | :white_check_mark:             | `Elements.DateTimePicker()`\n| Email Input        | Element            | :white_check_mark:             | `Elements.EmailInput()`\n| File Input         | Element            | :white_check_mark:             | `Elements.FileInput()`\n| Time Picker        | Element            | :white_check_mark:             | `Elements.TimePicker()`           \n| Image              | Element            | :white_check_mark:             | `Elements.Img()`       \n| Number Input       | Element            | :white_check_mark:             | `Elements.NumberInput()`\n| Overflow Menu      | Element            | :white_check_mark:             | `Elements.OverflowMenu()`         \n| Radio Buttons      | Element            | :white_check_mark:             | `Elements.RadioButtons()`         \n| Plain-Text Input   | Element            | :white_check_mark:             | `Elements.TextInput()`            \n| Select Menus       | Element            | :white_check_mark:             | `Elements.[Type]Select()`          \n| Multi-Select Menus | Element            | :white_check_mark:             | `Elements.[Type]MultiSelect()`\n| URL Input          | Element            | :white_check_mark:             | `Elements.NumberInput()`\n| Option             | Composition Object | :white_check_mark:             | `Bits.Option()`                   \n| Confirm Dialog     | Composition Object | :white_check_mark:             | `Bits.ConfirmationDialog()`       \n| Option Group       | Composition Object | :white_check_mark:             | `Bits.OptionGroup()`\n| Attachment         | Legacy Feature     | :white_check_mark:             | `Bits.Attachment()`              \n\n### Creating a Simple Interactive Message\n\nLet's take a look at how to compose an interactive message. Even though [Slack](https://slack.com) now has modals, these have always been the basis for [Slack](https://slack.com) apps.\n\nFunctions that return Block Kit objects have setter methods for all of the properties, but also support parameters that are passed into the constructor for properties with primitive types.\n\n```javascript\nimport { Message, Blocks, Elements } from 'slack-block-builder';\n\nexport default ({ channel, dangerLevel }) =>\n  Message()\n    .channel(channel)\n    .text('Alas, my friend.')\n    .blocks(\n      Blocks.Section()\n        .text('One does not simply walk into Slack and click a button.'),\n      Blocks.Section()\n        .text('At least that\\'s what my friend Slackomir said :crossed_swords:'),\n      Blocks.Divider(),\n      Blocks.Actions()\n        .elements(\n          Elements.Button()\n            .text('Sure One Does')\n            .actionId('gotClicked')\n            .danger(dangerLevel > 42), // Optional argument, defaults to 'true'\n          Elements.Button()\n            .text('One Does Not')\n            .actionId('scaredyCat')\n            .primary()))\n    .asUser()\n    .buildToJSON();\n```\n\nAnd now an example with using both the setter methods and passing parameters into the functions at initiation:\n\n```javascript\nimport { Message, Blocks, Elements } from 'slack-block-builder';\n\nexport default ({ channel, dangerLevel }) =>\n  Message({ channel, text: 'Alas, my friend.' })\n    .blocks(\n      Blocks.Section({ text: 'One does not simply walk into Slack and click a button.' }),\n      Blocks.Section({ text: 'At least that\\'s what my friend Slackomir said :crossed_swords:' }),\n      Blocks.Divider(),\n      Blocks.Actions()\n        .elements(\n          Elements.Button({ text: 'Sure One Does', actionId: 'gotClicked' })\n            .danger(dangerLevel > 42), // Optional argument, defaults to 'true'\n          Elements.Button({ text: 'One Does Not', actionId: 'scaredyCat' })\n            .primary()))\n    .asUser()\n    .buildToJSON();\n```\n\nBoth of these examples render the message below. And the best part? It only took 15 lines of code, as opposed to the 44 lines of JSON generated as a result. \n\n![An example of using Block Builder for Messages](docs/resources/images/simple-message-example.png)\n\n[**View Example on Slack Block Kit Builder Website**](https://app.slack.com/block-kit-builder#%7B%22blocks%22:%5B%7B%22type%22:%22section%22,%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22One%20does%20not%20simply%20walk%20into%20Slack%20and%20click%20a%20button.%22%7D%7D,%7B%22type%22:%22section%22,%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22At%20least%20that's%20what%20my%20friend%20Slackomir%20said%20:crossed_swords:%22%7D%7D,%7B%22type%22:%22divider%22%7D,%7B%22type%22:%22actions%22,%22elements%22:%5B%7B%22type%22:%22button%22,%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22Sure%20One%20Does%22%7D,%22action_id%22:%22gotClicked%22,%22style%22:%22danger%22%7D,%7B%22type%22:%22button%22,%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22One%20Does%20Not%22%7D,%22action_id%22:%22scaredyCat%22,%22style%22:%22primary%22%7D%5D%7D%5D%7D)\n\n### Creating a Simple Modal\n\nLet's take a look at how modals are created. Here we'll also take a look at working with Bits and with loops, by adding options with the `Array.map()` method. \n\n```javascript\nimport { Modal, Blocks, Elements, Bits, setIfTruthy } from 'slack-block-builder';\n\nexport default ({ menuOptions, selected }) =>\n  Modal({ title: 'PizzaMate', submit: 'Get Fed' })\n    .blocks(\n      Blocks.Section({ text: 'Hey there, colleague!' }),\n      Blocks.Section({ text: 'Hurray for corporate pizza! Let\\'s get you fed and happy :pizza:' }),\n      Blocks.Input({ label: 'What can we call you?' })\n        .element(\n          Elements.TextInput({ placeholder: 'Hi, my name is... (What?!) (Who?!)' })\n            .actionId('name')),\n      Blocks.Input({ label: 'Which floor are you on?' })\n        .element(\n          Elements.TextInput({ placeholder: 'HQ – Fifth Floor' })\n            .actionId('floor')),\n      Blocks.Input({ label: 'What\\'ll you have?' })\n        .element(\n          Elements.StaticSelect({ placeholder: 'Choose your favorite...' })\n            .actionId('item')\n            .options(menuOptions\n              .map((item) => Bits.Option({ text: item.name, value: item.id })))\n            .initialOption(setIfTruthy(selected, Bits.Option({ text: selected.name, value: selected.id })))))\n    .buildToJSON();\n```\n\nBoth of these examples render the modal below. \n\n![An example of using Block Builder for Modals](docs/resources/images/simple-modal-example.png)\n\n[**View Example on Slack Block Kit Builder Website**](https://app.slack.com/block-kit-builder#%7B%22type%22:%22modal%22,%22title%22:%7B%22type%22:%22plain_text%22,%22text%22:%22PizzaMate%22%7D,%22blocks%22:%5B%7B%22type%22:%22section%22,%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22Hey%20there,%20colleague!%22%7D%7D,%7B%22type%22:%22section%22,%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22Hurray%20for%20corporate%20pizza!%20Let's%20get%20you%20fed%20and%20happy%20:pizza:%22%7D%7D,%7B%22type%22:%22input%22,%22label%22:%7B%22type%22:%22plain_text%22,%22text%22:%22What%20can%20we%20call%20you?%22%7D,%22element%22:%7B%22type%22:%22plain_text_input%22,%22action_id%22:%22name%22,%22placeholder%22:%7B%22type%22:%22plain_text%22,%22text%22:%22Hi,%20my%20name%20is...%20(What?!)%20(Who?!)%22%7D%7D%7D,%7B%22type%22:%22input%22,%22label%22:%7B%22type%22:%22plain_text%22,%22text%22:%22Which%20floor%20are%20you%20on?%22%7D,%22element%22:%7B%22type%22:%22plain_text_input%22,%22action_id%22:%22floor%22,%22placeholder%22:%7B%22type%22:%22plain_text%22,%22text%22:%22HQ%20–%20Fifth%20Floor%22%7D%7D%7D,%7B%22type%22:%22input%22,%22label%22:%7B%22type%22:%22plain_text%22,%22text%22:%22What'll%20you%20have?%22%7D,%22element%22:%7B%22type%22:%22static_select%22,%22placeholder%22:%7B%22type%22:%22plain_text%22,%22text%22:%22Choose%20your%20favorite...%22%7D,%22action_id%22:%22item%22,%22options%22:%5B%7B%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22:cheese_wedge:%20With%20Cheeze%22%7D,%22value%22:%22012%22%7D,%7B%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22:fish:%20With%20Anchovies%22%7D,%22value%22:%22013%22%7D,%7B%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22:cookie:%20With%20Scooby%20Snacks%22%7D,%22value%22:%22014%22%7D,%7B%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22:beer:%20I%20Prefer%20Steak%20and%20Beer%22%7D,%22value%22:%22015%22%7D%5D%7D%7D%5D,%22submit%22:%7B%22type%22:%22plain_text%22,%22text%22:%22Get%20Fed%22%7D%7D)\n\n### Paginator Component\n\n**Block Builder** provides a `Paginator` component that assists in producing paginated UI. It allows you to dictate the UI to build for each items passed in and provides to the `actionId` all of the data (`page`, `perPage`, `totalPages`, `offset`, `totalItems` ) you need to produce the right page when a user clicks the Next or Previous buttons.\n\nNote that there is a [demo app available](https://github.com/raycharius/slack-block-builder-demo) that demonstrates how to use components.  \n\nThe `Paginator` component supports optional customizations, such as:  \n\n`nextButtonText` – Used to pass in custom text for the Next button, but has a default.\n\n`previousButtonText` – Used to pass in custom text for the Next button, but has a default.\n\n`pageCountText` – Used to pass in custom text for the page count, accepts a function and passes the function an object with `page` and `totalPages` properties.\n\n```javascript\nimport { Modal, Blocks, Elements, Paginator } from 'slack-block-builder';\n\nexport default ({ tasks, totalTasks, page, perPage }) => Modal({ title: 'Open Tasks' })\n  .blocks(\n    Blocks.Section({ text: 'Hi! :wave: And welcome to the FAQ section! Take a look around and if you don\\'t find what you need, feel free to open an issue on GitHub.' }),\n    Blocks.Section({ text: `You currently have *${totalTasks} open task(s)*:` }),\n    Paginator({\n      perPage,\n      items: tasks,\n      totalItems: totalTasks,\n      page: page || 1,\n      actionId: ({ page, offset }) => JSON.stringify({ action: 'render-tasks', page, offset }),\n      blocksForEach: ({ item }) => [\n        Blocks.Divider(),\n        Blocks.Section({ text: `*${item.title}*` })\n          .accessory(\n            Elements.Button({ text: 'View Details' })\n              .actionId('view-details')\n              .value(item.id.toString())),\n        Blocks.Section({ text: `*Due Date:* ${getDate(item.dueDate)}` }),\n      ],\n    }).getBlocks())\n  .close('Done')\n  .buildToJSON();\n``` \n\nThe code above renders the modal below. And be sure to check out the full documentation on the [**Block Builder** doc site](https://www.blockbuilder.dev/#/components/paginator) for more information.\n\n![An example of using Block Builder for Modals](docs/resources/images/paginator-modal-example.png)\n\n[**View Example on Slack Block Kit Builder Website**](https://app.slack.com/block-kit-builder/#%7B%22title%22:%7B%22type%22:%22plain_text%22,%22text%22:%22Open%20Tasks%22%7D,%22blocks%22:%5B%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22Hello!%20:wave::skin-tone-4:%20%20Below%20you%20can%20find%20all%20of%20your%20open%20tasks.%22%7D,%22type%22:%22section%22%7D,%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22You%20currently%20have%20*58%20open%20task(s)*:%22%7D,%22type%22:%22section%22%7D,%7B%22type%22:%22divider%22%7D,%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22*Set%20Up%20Webhook%20Monitoring*%22%7D,%22accessory%22:%7B%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22View%20Details%22%7D,%22action_id%22:%22view-details%22,%22value%22:%225%22,%22type%22:%22button%22%7D,%22type%22:%22section%22%7D,%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22*Due%20Date:*%20%3C!date%5E1633392000%5E%7Bdate%7D%7C2021-10-05%3E%22%7D,%22type%22:%22section%22%7D,%7B%22type%22:%22divider%22%7D,%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22*Refactor%20Payment%20Service*%22%7D,%22accessory%22:%7B%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22View%20Details%22%7D,%22action_id%22:%22view-details%22,%22value%22:%223%22,%22type%22:%22button%22%7D,%22type%22:%22section%22%7D,%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22*Due%20Date:*%20%3C!date%5E1635292800%5E%7Bdate%7D%7C2021-10-27%3E%22%7D,%22type%22:%22section%22%7D,%7B%22type%22:%22divider%22%7D,%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22*Finalize%20JumboCode%20Documentation*%22%7D,%22accessory%22:%7B%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22View%20Details%22%7D,%22action_id%22:%22view-details%22,%22value%22:%224%22,%22type%22:%22button%22%7D,%22type%22:%22section%22%7D,%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22*Due%20Date:*%20%3C!date%5E1635465600%5E%7Bdate%7D%7C2021-10-29%3E%22%7D,%22type%22:%22section%22%7D,%7B%22elements%22:%5B%7B%22type%22:%22mrkdwn%22,%22text%22:%22Page%208%20of%2020%22%7D%5D,%22type%22:%22context%22%7D,%7B%22type%22:%22divider%22%7D,%7B%22elements%22:%5B%7B%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22Previous%22%7D,%22action_id%22:%22%7B%5C%22action%5C%22:%5C%22render-tasks%5C%22,%5C%22page%5C%22:7,%5C%22offset%5C%22:18%7D%22,%22type%22:%22button%22%7D,%7B%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22Next%22%7D,%22action_id%22:%22%7B%5C%22action%5C%22:%5C%22render-tasks%5C%22,%5C%22page%5C%22:9,%5C%22offset%5C%22:24%7D%22,%22type%22:%22button%22%7D%5D,%22type%22:%22actions%22%7D%5D,%22close%22:%7B%22type%22:%22plain_text%22,%22text%22:%22Done%22%7D,%22type%22:%22modal%22%7D)\n\n### Accordion Component\n\nUsing the `Accordion` component, you can easily create a customizable accordion for your Slack app. It not only assists in building a suitable UI, but also calculates the next state and gives you access to it in the `actionId` of the buttons in the accordion, so that you can pass that back to your app's backend and use it to render the next state.\n\nNote that there is a [demo app available](https://github.com/raycharius/slack-block-builder-demo) that demonstrates how to use components.\n\nThe `Accordion` component supports optional customizations, such as: \n\n`collapseOnExpand` – Dictates whether or not multiple items can be expanded at once. When set to true, only one item will be expanded at any given time.\n\n`expandButtonText` – Used to pass in custom text for the button that expands an item, but has a default.\n\n`collapseButtonText` – Used to pass in custom text for the button that collapses an expanded item, but has a default.\n\n`isExpandable` – Used to display or not the expand/collapse button for a given item.\n \n```javascript\nimport { Modal, Blocks, Accordion } from 'slack-block-builder';\n\nexport default ({ faqs, expandedItems }) => Modal({ title: 'FAQ' })\n  .blocks(\n    Blocks.Section({ text: 'Hi! :wave: And welcome to the FAQ section! Take a look around and if you don\\'t find what you need, feel free to open an issue on GitHub.'}),\n    Blocks.Divider(),\n    Accordion({\n      items: faqs,\n      expandedItems: expandedItems || [], // In this case, the value is [1]\n      collapseOnExpand: true,\n      titleText: ({ item }) => `*${item.question}*`,\n      actionId: ({ expandedItems }) => JSON.stringify({ action: 'render-faqs', expandedItems }),\n      blocksForExpanded: ({ item }) => [\n       Blocks.Section({ text: `${item.answer}` }),\n      ],\n    }).getBlocks())\n  .close('Done')\n  .buildToJSON();\n```\n\nThe code above renders the modal below. And be sure to check out the full documentation on the [**Block Builder** doc site](https://www.blockbuilder.dev/#/components/accordion) for more information.\n\n![An example of using Block Builder for Modals](docs/resources/images/accordion-modal-example.png)\n\n[**View Example on Slack Block Kit Builder Website**](https://app.slack.com/block-kit-builder#%7B%22title%22:%7B%22type%22:%22plain_text%22,%22text%22:%22FAQ%22%7D,%22blocks%22:%5B%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22Hi!%20:wave::skin-tone-4:%20And%20welcome%20to%20the%20FAQ%20section!%20Take%20a%20look%20around%20and%20if%20you%20don't%20find%20what%20you%20need,%20feel%20free%20to%20open%20an%20issue%20on%20GitHub.%22%7D,%22type%22:%22section%22%7D,%7B%22type%22:%22divider%22%7D,%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22*Why%20should%20I%20adopt%20Block%20Builder?*%22%7D,%22accessory%22:%7B%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22More%22%7D,%22action_id%22:%22%7B%5C%22action%5C%22:%5C%22render-faqs%5C%22,%5C%22expandedItems%5C%22:%5B0%5D%7D%22,%22type%22:%22button%22%7D,%22type%22:%22section%22%7D,%7B%22type%22:%22divider%22%7D,%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22*How%20do%20I%20use%20the%20%60Accordion%60%20component?*%22%7D,%22accessory%22:%7B%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22Close%22%7D,%22action_id%22:%22%7B%5C%22action%5C%22:%5C%22render-faqs%5C%22,%5C%22expandedItems%5C%22:%5B%5D%7D%22,%22type%22:%22button%22%7D,%22type%22:%22section%22%7D,%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22It's%20actually%20_really_%20easy!%20All%20you%20have%20to%20do%20is%20pass%20in%20the%20items%20you%20want%20to%20show%20up%20in%20the%20UI,%20a%20function%20that%20captures%20the%20expanded%20items%20in%20the%20%60actionId%60,%20and%20a%20function%20that%20builds%20out%20the%20right%20UI%20when%20an%20item%20is%20expanded.%5Cn%5CnThat's%20it,%20so%20go%20give%20it%20a%20try!%20%20:raised_hands::skin-tone-4:%22%7D,%22type%22:%22section%22%7D,%7B%22type%22:%22divider%22%7D,%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22*What%20other%20features%20are%20in%20the%20pipeline?*%22%7D,%22accessory%22:%7B%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22More%22%7D,%22action_id%22:%22%7B%5C%22action%5C%22:%5C%22render-faqs%5C%22,%5C%22expandedItems%5C%22:%5B2%5D%7D%22,%22type%22:%22button%22%7D,%22type%22:%22section%22%7D,%7B%22type%22:%22divider%22%7D,%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22*Do%20you%20work%20for%20Slack?*%22%7D,%22accessory%22:%7B%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22More%22%7D,%22action_id%22:%22%7B%5C%22action%5C%22:%5C%22render-faqs%5C%22,%5C%22expandedItems%5C%22:%5B3%5D%7D%22,%22type%22:%22button%22%7D,%22type%22:%22section%22%7D,%7B%22type%22:%22divider%22%7D,%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22*What%20can%20I%20do%20to%20help?*%22%7D,%22accessory%22:%7B%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22More%22%7D,%22action_id%22:%22%7B%5C%22action%5C%22:%5C%22render-faqs%5C%22,%5C%22expandedItems%5C%22:%5B4%5D%7D%22,%22type%22:%22button%22%7D,%22type%22:%22section%22%7D%5D,%22close%22:%7B%22type%22:%22plain_text%22,%22text%22:%22Done%22%7D,%22type%22:%22modal%22%7D)\n\n### Utility Functions\n\nThe `Utilities` object contains various utility functions for creating UI. Currently, there are two:\n\n`BlockCollection()` – Accepts multiple arguments or an array of blocks and returns them in an array, in their built state.\n\n`AttachmentCollection()` – Accepts multiple arguments or an array of attachments and returns them in an array, in their built state.\n\n`OptionCollection()` – Accepts multiple arguments or an array of options and returns them in an array, in their built state.\n\n`OptionGroupCollection()` – Accepts multiple arguments or an array of option groups and returns them in an array, in their built state.\n\nBoth `BlockCollection()` and `AttachmentCollection()` are useful when you wish to keep surface or view configuration separate from UI representation.\n\nAn example using Slack's `WebClient` from their [SDK for Node.js](https://github.com/slackapi/node-slack-sdk):\n\n```javascript\nimport { BlockCollection, AttachmentCollection, Blocks } from 'slack-block-builder';\nimport { WebClient } from '@slack/web-api';\n\nconst client = new WebClient(process.env.SLACK_TOKEN);\n\nclient.chat.postMessage({\n  channel: 'ABCDEFG',\n  text: 'Hello, my dear, sweet world!',\n  blocks: BlockCollection( /* Pass in blocks */ ),\n  attachments: AttachmentCollection( /* Pass in attachments */ ),\n})\n.then((response) => console.log(response))\n.catch((error) => console.log(error));\n```\n\nAnother example where you might find `BlockCollection()` helpful is when [unfurling links in messages](https://api.slack.com/reference/messaging/link-unfurling):\n\n```javascript\nimport { BlockCollection, Blocks } from 'slack-block-builder';\nimport { WebClient } from '@slack/web-api';\n\nconst client = new WebClient(process.env.SLACK_TOKEN);\n\nconst unfurl = ({ channel, ts, url }) => client.chat.unfurl({\n  channel,\n  ts,\n  unfurls: { [url]: BlockCollection( /* Pass in blocks */ ) },\n})\n.then((response) => console.log(response))\n.catch((error) => console.log(error));\n```\n\nBoth `OptionCollection()` and `OptionGroupCollection()` come in handy when returning an array of options or option groups for select menus with external data sources, as seen in [Slack's API docs](https://api.slack.com/reference/block-kit/block-elements#external_multi_select):\n\n```javascript\nreturn { options: OptionCollection( /* Pass in options */ ) };\n\n// Or:\n\nreturn { options: OptionGroupCollection( /* Pass in option groups */ ) };\n```\n\n### Working With Inline Conditionals\n\nThere are a few helper functions available to make it easy to work with inline conditionals within your UI source code.\n\nThey can be imported separately:\n\n```javascript\nimport { setIfTruthy, omitIfTruthy, setIfFalsy, omitIfFalsy } from 'slack-block-builder';\n```\n\nOr as a part of the `conditionals` object:\n\n```javascript\nimport { conditionals } from 'slack-block-builder';\n```\n\nEach function accepts two arguments – the first being a value that is evaluated whether it is either `null`, `undefined`, or `false`, and the second being the value to set or omit:\n\n```javascript\nimport { Modal, Blocks, Elements, Bits, setIfTruthy } from 'slack-block-builder';\n\nexport default ({ groups, selectedGroup, selectedGroupMembers }) => Modal()\n  .title('Edit Groups')\n  .callbackId('submit-edit-groups')\n  .blocks(\n    Blocks.Section({ text: 'Hello! Need to edit some groups?'}),\n    Blocks.Input({ label: 'Select a group to get started' })\n      .dispatchAction()\n      .element(\n        Elements.StaticSelect({ placeholder: 'Select a group...' })\n          .actionId('selectedGroup')\n          .options(groups\n            .map(({ name, id }) => Bits.Option({ text: name, value: id })))),\n    setIfTruthy(selectedGroup, [\n      Blocks.Input({ label: 'Current group members' })\n        .element(\n          Elements.UserMultiSelect({ placeholder: 'Select members...' })\n            .actionId('groupMembers')\n            .initialUsers(selectedGroupMembers))\n    ]))\n  .submit(setIfTruthy(selectedGroup, 'Save Changes'))\n  .buildToJSON();\n```\n\nThese functions essentially return either the value passed into as the second argument or `undefined`, depending on the condition. Please note that falsy is defined as `null`, `undefined`, or `false`. To avoid side effects, values such as `0` or `''` are not considered to be falsy.\n\n### Markdown Helpers\n\nOften you'll find that you need to format text in your messages and modals. *Block Builder* has helper functions available to simply that process. They are available both as members of the `Md` object and as top-level imports. You can find the full list of functions on the [Block Builder doc site](https://blockbuilder.dev):\n\n``` javascript\nimport { Message, Blocks, Md } from 'slack-block-builder';\n\nexport default ({ channel, user }) => {\n  const slashCommands = ['/schedule', '/cancel', '/remind', '/help'];\n\n  return Message({ channel, text: 'Alas, my friend.' })\n    .blocks(\n      Blocks.Section({ text: `:wave: Hi there, ${Md.user(user)}!` }),\n      Blocks.Section({ text: `${Md.italic('Sorry')}, I didn't get that. Why don't you try out some of my slash commands?` }),\n      Blocks.Section({ text: `Here are some of the things that I can do:` }),\n      Blocks.Section()\n        .text(Md.listBullet(slashCommands\n          .map((item) => Md.codeInline(item)))))\n    .asUser()\n    .buildToObject();\n};\n```\n\n[**View Example on Slack Block Kit Builder Website**](https://app.slack.com/block-kit-builder/#%7B%22blocks%22:%5B%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22:wave:%20Hi%20there,%20%3C@U03N067AL%3E%21%22%7D,%22type%22:%22section%22%7D,%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22_Sorry_,%20I%20didn%27t%20get%20that.%20Why%20don%27t%20you%20try%20out%20some%20of%20my%20slash%20commands?%22%7D,%22type%22:%22section%22%7D,%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22Here%20are%20some%20of%20the%20things%20that%20I%20can%20do:%22%7D,%22type%22:%22section%22%7D,%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22%E2%80%A2%20%60/schedule%60%5Cn%E2%80%A2%20%60/cancel%60%5Cn%E2%80%A2%20%60/remind%60%5Cn%E2%80%A2%20%60/help%60%22%7D,%22type%22:%22section%22%7D%5D%7D)\n \n## :link: &nbsp; Other Useful Slack-Related Projects\n\n[Bolt for JavaScript](https://github.com/SlackAPI/bolt) – A simple framework for building [Slack](https://slack.com) apps, developed by [Slack](https://slack.com) themselves.\n\n[Node Slack SDK](https://github.com/slackapi/node-slack-sdk) – A great and powerful SDK for building [Slack](https://slack.com) Apps from the ground up.\n\n## :fire: &nbsp; Acknowledgements\n \n<img src=\"https://github.com/korywka.png\" alt=\"@korywka\" width=\"24\" height=\"24\" valign=\"bottom\" /> Taras Neporozhniy ([@korywka](https://github.com/korywka)) - For help and ideas along the way!\n\n<img src=\"https://cdn.dribbble.com/users/683635/avatars/normal/ee2c7c826bfe244b573d145376fe0b5a.png?1510328842\" alt=\"@ft502\" width=\"24\" height=\"24\" valign=\"bottom\" /> Alexey Chernyshov ([@ft502](https://dribbble.com/ft502) on Dribbble) - For such a beautiful logo!\n\n<img src=\"https://github.com/slackhq.png\" alt=\"@slackhq\" width=\"24\" height=\"24\" valign=\"bottom\" /> SlackHQ ([@slackhq](https://github.com/slackhq)) - For such a wonderful product and API!\n\n## :black_nib: &nbsp; Author\n\n<img src=\"https://github.com/raycharius.png\" alt=\"@raycharius\" width=\"24\" height=\"24\" valign=\"bottom\" /> Ray East ([@raycharius](https://github.com/raycharius)) - Huge Fan of Slack and **Block Builder** Maintainer\n","readmeFilename":"README.md"}