@lifesg/react-design-system 3.5.0-canary.6 → 3.5.0-canary.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/accordion/types.d.ts +7 -1
- package/cjs/external/dompurify/dist/purify.es.js +2 -2
- package/cjs/external/dompurify/dist/purify.es.js.map +1 -1
- package/cjs/input-group/input-group-list-addon.js +1 -1
- package/cjs/input-group/input-group-list-addon.js.map +1 -1
- package/cjs/input-range-select/input-range-select.js +1 -1
- package/cjs/input-range-select/input-range-select.js.map +1 -1
- package/cjs/input-select/input-select.js +1 -1
- package/cjs/input-select/input-select.js.map +1 -1
- package/cjs/navbar/navbar-items.js +1 -1
- package/cjs/navbar/navbar-items.js.map +1 -1
- package/cjs/navbar/navbar-items.styles.js +1 -1
- package/cjs/navbar/navbar-items.styles.js.map +1 -1
- package/cjs/otp-verification/thumbnail/email-thumbnail.js.map +1 -1
- package/cjs/otp-verification/thumbnail/phone-thumbnail.js.map +1 -1
- package/cjs/shared/dropdown-list/dropdown-list.js +1 -1
- package/cjs/shared/dropdown-list/dropdown-list.js.map +1 -1
- package/cjs/sidenav/sidenav-item.js +1 -1
- package/cjs/sidenav/sidenav-item.js.map +1 -1
- package/cjs/tab/tab-context-provider.js +2 -0
- package/cjs/tab/tab-context-provider.js.map +1 -0
- package/cjs/tab/tab-context.js +1 -1
- package/cjs/tab/tab-context.js.map +1 -1
- package/cjs/tab/tab-item.js +1 -1
- package/cjs/tab/tab-item.js.map +1 -1
- package/cjs/tab/tab-link-chain.js +1 -1
- package/cjs/tab/tab-link-chain.js.map +1 -1
- package/cjs/tab/tab-list-item.js +2 -0
- package/cjs/tab/tab-list-item.js.map +1 -0
- package/cjs/tab/tab-list.js +2 -0
- package/cjs/tab/tab-list.js.map +1 -0
- package/cjs/tab/tab-panel.js +2 -0
- package/cjs/tab/tab-panel.js.map +1 -0
- package/cjs/tab/tab.js +1 -1
- package/cjs/tab/tab.js.map +1 -1
- package/external/dompurify/dist/purify.es.js +2 -2
- package/external/dompurify/dist/purify.es.js.map +1 -1
- package/input-group/input-group-list-addon.js +1 -1
- package/input-group/input-group-list-addon.js.map +1 -1
- package/input-multi-select/types.d.ts +1 -1
- package/input-range-select/input-range-select.d.ts +1 -1
- package/input-range-select/input-range-select.js +1 -1
- package/input-range-select/input-range-select.js.map +1 -1
- package/input-select/input-select.d.ts +1 -1
- package/input-select/input-select.js +1 -1
- package/input-select/input-select.js.map +1 -1
- package/link-list/internal-types.d.ts +3 -3
- package/navbar/navbar-items.js +1 -1
- package/navbar/navbar-items.js.map +1 -1
- package/navbar/navbar-items.styles.d.ts +8 -8
- package/navbar/navbar-items.styles.js +1 -1
- package/navbar/navbar-items.styles.js.map +1 -1
- package/otp-verification/thumbnail/email-thumbnail.js.map +1 -1
- package/otp-verification/thumbnail/phone-thumbnail.js.map +1 -1
- package/package.json +1 -1
- package/shared/dropdown-list/dropdown-list.js +1 -1
- package/shared/dropdown-list/dropdown-list.js.map +1 -1
- package/shared/dropdown-list/types.d.ts +4 -1
- package/sidenav/sidenav-item.js +1 -1
- package/sidenav/sidenav-item.js.map +1 -1
- package/tab/tab-context-provider.d.ts +5 -0
- package/tab/tab-context-provider.js +2 -0
- package/tab/tab-context-provider.js.map +1 -0
- package/tab/tab-context.d.ts +5 -0
- package/tab/tab-context.js +1 -1
- package/tab/tab-context.js.map +1 -1
- package/tab/tab-item.js +1 -1
- package/tab/tab-item.js.map +1 -1
- package/tab/tab-link-chain.js +1 -1
- package/tab/tab-link-chain.js.map +1 -1
- package/tab/tab-list-item.d.ts +5 -0
- package/tab/tab-list-item.js +2 -0
- package/tab/tab-list-item.js.map +1 -0
- package/tab/tab-list.d.ts +5 -0
- package/tab/tab-list.js +2 -0
- package/tab/tab-list.js.map +1 -0
- package/tab/tab-panel.d.ts +5 -0
- package/tab/tab-panel.js +2 -0
- package/tab/tab-panel.js.map +1 -0
- package/tab/tab.d.ts +31 -0
- package/tab/tab.js +1 -1
- package/tab/tab.js.map +1 -1
- package/tab/types.d.ts +83 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"email-thumbnail.js","sources":["../../../../src/otp-verification/thumbnail/email-thumbnail.tsx"],"sourcesContent":["import
|
|
1
|
+
{"version":3,"file":"email-thumbnail.js","sources":["../../../../src/otp-verification/thumbnail/email-thumbnail.tsx"],"sourcesContent":["import styled from \"styled-components\";\nimport { Colour } from \"../../theme\";\n\ninterface EmailThumbnailProps {\n width?: number;\n height?: number;\n className?: string;\n}\n\nconst StyledSvg = styled.svg`\n .background-circle {\n fill: ${Colour[\"bg-stronger\"]};\n }\n\n .primary-path {\n fill: ${Colour[\"icon-primary\"]};\n }\n\n .validation-icon {\n fill: ${Colour[\"bg-available\"]};\n }\n\n .accent-light-3 {\n fill: ${Colour[\"icon-primary-subtle\"]};\n }\n\n .accent-light-4 {\n fill: ${Colour[\"icon-primary-subtlest\"]};\n }\n`;\nexport const EmailThumbnail = ({\n width = 120,\n height = 120,\n className,\n}: EmailThumbnailProps) => {\n return (\n <StyledSvg\n width={width}\n height={height}\n viewBox=\"0 0 120 120\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n >\n <g clipPath=\"url(#clip0_email_icon)\">\n <circle cx=\"60\" cy=\"60\" r=\"60\" className=\"background-circle\" />\n <path\n d=\"M22.9744 60.2636L62.1602 72.5619C62.6183 72.7414 63.1075 72.7591 63.5596 72.638C64.0116 72.5169 64.4265 72.2569 64.7334 71.8724L92.5201 41.6289L52.1928 25.0006C51.2645 24.6309 50.2039 24.9151 49.5848 25.6994L22.9744 60.2636Z\"\n className=\"primary-path\"\n />\n <path\n d=\"M72.6935 18.8097L29.2275 30.4564C26.8325 31.0982 25.4042 33.5744 26.0465 35.9714L38.8689 83.8253C39.1907 85.026 40.4254 85.7396 41.6251 85.4182L89.4378 72.6068C90.6374 72.2854 91.3499 71.05 91.0282 69.8493L78.2058 21.9954C77.5635 19.5984 75.0929 18.1668 72.6935 18.8097Z\"\n fill=\"white\"\n />\n <path\n d=\"M64.7456 71.7935C64.4385 72.1773 64.0235 72.4369 63.5715 72.5581C63.1194 72.6792 62.6303 72.6618 62.1724 72.483L23 60.2346L33.4375 99.188C34.0777 101.577 36.5445 102.994 38.9439 102.352L99.7963 86.0462C102.196 85.4033 103.623 82.9425 102.983 80.5533L92.5457 41.5999L64.7456 71.7935Z\"\n className=\"accent-light-3\"\n />\n <path\n d=\"M99.8349 86.0769L38.9824 102.382C36.544 103.036 34.127 101.648 33.4768 99.2216C33.2926 98.5339 33.4491 97.7966 33.8965 97.2409L60.7012 66.8793C61.0084 66.4957 61.4233 66.2361 61.8754 66.115C62.3274 65.9939 62.8166 66.0112 63.2744 66.1898L101.669 79.0814C102.334 79.3389 102.838 79.8992 103.023 80.5869C103.673 83.0134 102.273 85.4235 99.8349 86.0769Z\"\n className=\"accent-light-4\"\n />\n <path\n d=\"M56.1874 49.1387L52.6167 47.0772C52.2767 46.8809 51.9109 46.8352 51.5193 46.9401C51.1288 47.0447 50.8354 47.2671 50.6391 47.6071C50.4263 47.9757 50.3723 48.3558 50.4772 48.7474C50.5819 49.1379 50.8155 49.4283 51.1781 49.6186L55.9386 52.3685C56.2844 52.5863 56.6531 52.6427 57.0447 52.5378C57.4352 52.4332 57.737 52.1971 57.9501 51.8295L63.423 42.35C63.6193 42.01 63.6666 41.65 63.5649 41.2703C63.4628 40.8894 63.2418 40.6009 62.9017 40.4045C62.5617 40.2082 62.1958 40.1625 61.8043 40.2674C61.4138 40.372 61.1204 40.5944 60.924 40.9344L56.1874 49.1387ZM61.0069 59.8842C59.152 60.3812 57.3145 60.4964 55.4942 60.2299C53.674 59.9633 51.9987 59.3883 50.4684 58.5048C48.9382 57.6213 47.6026 56.458 46.4616 55.0148C45.3206 53.5717 44.5017 51.9227 44.0046 50.0678C43.5076 48.2129 43.3924 46.3754 43.6589 44.5551C43.9255 42.7348 44.5005 41.0595 45.384 39.5293C46.2674 37.999 47.4308 36.6634 48.8739 35.5224C50.317 34.3814 51.966 33.5625 53.8208 33.0655C55.6757 32.5685 57.5132 32.4532 59.3335 32.7198C61.1537 32.9863 62.829 33.5613 64.3593 34.4448C65.8895 35.3283 67.2251 36.4917 68.3661 37.9348C69.5071 39.378 70.326 41.027 70.8231 42.8818C71.3201 44.7367 71.4353 46.5743 71.1688 48.3945C70.9023 50.2148 70.3272 51.8901 69.4438 53.4204C68.5603 54.9506 67.3969 56.2863 65.9538 57.4272C64.5107 58.5682 62.8617 59.3872 61.0069 59.8842Z\"\n className=\"validation-icon\"\n />\n </g>\n <defs>\n <clipPath id=\"clip0_email_icon\">\n <rect width=\"120\" height=\"120\" fill=\"white\" />\n </clipPath>\n </defs>\n </StyledSvg>\n );\n};\n"],"names":["StyledSvg","styled","svg","Colour","width","height","className","_jsxs","viewBox","fill","xmlns","children","clipPath","_jsx","cx","cy","r","d","id"],"mappings":"yLASA,MAAMA,OAAYC,QAAOC,GAAG;;gBAEZC,EAAAA,OAAO;;;;gBAIPA,EAAAA,OAAO;;;;gBAIPA,EAAAA,OAAO;;;;gBAIPA,EAAAA,OAAO;;;;gBAIPA,EAAAA,OAAO;;yBAGO,EAC1BC,QAAQ,IACRC,SAAS,IACTC,eAGIC,OAACP,EAAS,CACNI,MAAOA,EACPC,OAAQA,EACRG,QAAQ,cACRC,KAAK,OACLC,MAAM,6BACNJ,UAAWA,EAASK,SAAA,CAEpBJ,EAAAA,KAAA,IAAA,CAAGK,SAAS,yBAAwBD,SAAA,CAChCE,EAAAA,IAAA,SAAA,CAAQC,GAAG,KAAKC,GAAG,KAAKC,EAAE,KAAKV,UAAU,sBACzCO,EAAAA,IAAA,OAAA,CACII,EAAE,mOACFX,UAAU,iBAEdO,EAAAA,IAAA,OAAA,CACII,EAAE,iRACFR,KAAK,UAETI,EAAAA,IAAA,OAAA,CACII,EAAE,6RACFX,UAAU,mBAEdO,EAAAA,IAAA,OAAA,CACII,EAAE,iWACFX,UAAU,mBAEdO,EAAAA,IAAA,OAAA,CACII,EAAE,gzCACFX,UAAU,uBAGlBO,EAAAA,IAAA,OAAA,CAAAF,SACIE,EAAAA,IAAA,WAAA,CAAUK,GAAG,mBAAkBP,SAC3BE,EAAAA,IAAA,OAAA,CAAMT,MAAM,MAAMC,OAAO,MAAMI,KAAK"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"phone-thumbnail.js","sources":["../../../../src/otp-verification/thumbnail/phone-thumbnail.tsx"],"sourcesContent":["import
|
|
1
|
+
{"version":3,"file":"phone-thumbnail.js","sources":["../../../../src/otp-verification/thumbnail/phone-thumbnail.tsx"],"sourcesContent":["import styled from \"styled-components\";\nimport { Colour } from \"../../theme\";\n\ninterface PhoneThumbnailProps {\n width?: number;\n height?: number;\n className?: string;\n}\n\nconst StyledSvg = styled.svg`\n .background-circle {\n fill: ${Colour[\"bg-stronger\"]};\n }\n\n .primary-path {\n fill: ${Colour[\"icon-primary\"]};\n }\n\n .validation-icon {\n fill: ${Colour[\"bg-available\"]};\n }\n\n .accent-light {\n fill: ${Colour[\"bg-selected-stronger\"]};\n }\n`;\n\nexport const PhoneThumbnail = ({\n width = 120,\n height = 120,\n className,\n}: PhoneThumbnailProps) => {\n return (\n <StyledSvg\n width={width}\n height={height}\n viewBox=\"0 0 120 120\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n >\n <g clipPath=\"url(#clip0_phone_icon)\">\n <circle\n cx=\"60\"\n cy=\"60.5\"\n r=\"60\"\n className=\"background-circle\"\n />\n <path\n d=\"M85.7091 99.047L56.9789 106.705C51.6167 108.134 46.0606 104.916 44.6318 99.5553L27.1393 33.9319C25.9969 29.6444 27.8244 25.2332 31.3437 22.9073C32.2263 22.3231 33.2151 21.8712 34.2899 21.5845L34.4374 21.5449L40.7667 19.8586L56.4455 15.6787L56.4545 15.6763L63.02 13.9267C68.3822 12.497 73.9383 15.715 75.3671 21.0761L92.8596 86.6995C94.2888 92.0619 91.0712 97.6172 85.7091 99.047Z\"\n className=\"primary-path\"\n />\n <path\n d=\"M90.0893 85.5165L72.9593 22.8765C72.8393 22.4365 72.6893 22.0165 72.5093 21.6165C72.0993 20.6965 71.5393 19.8765 70.8693 19.1765C70.2493 18.5365 69.5393 17.9865 68.7593 17.5665C66.8993 16.5465 64.6593 16.2165 62.4593 16.8065L58.8593 17.8765C58.8593 17.8765 58.8693 17.9065 58.8793 17.9265C59.2793 19.4065 58.8293 20.8265 57.8893 21.0665L42.2093 25.2365C41.3193 25.4765 40.3093 24.5765 39.8593 23.2265L36.0693 24.2365C31.5193 25.4465 28.7793 30.1665 29.9993 34.7265L30.3093 35.8765L32.1393 42.7565L35.8493 56.6765L36.8693 60.5165L38.1493 65.3165L47.0793 97.5165C48.2893 102.067 53.0093 104.807 57.5693 103.587L83.9993 95.9965C88.5493 94.7865 91.2893 90.0665 90.0693 85.5065L90.0893 85.5165ZM38.6893 26.3265L34.8993 27.3365C34.5793 27.4265 34.2493 27.2265 34.1593 26.9065C34.0693 26.5865 34.2693 26.2565 34.5893 26.1665L38.3793 25.1565C38.6993 25.0665 39.0293 25.2665 39.1193 25.5865C39.2093 25.9065 39.0093 26.2365 38.6893 26.3265ZM65.6893 19.3265L61.8993 20.3365C61.5793 20.4265 61.2493 20.2265 61.1593 19.9065C61.0693 19.5865 61.2693 19.2565 61.5893 19.1665L65.3793 18.1565C65.6993 18.0665 66.0293 18.2665 66.1193 18.5865C66.2093 18.9065 66.0093 19.2365 65.6893 19.3265Z\"\n fill=\"white\"\n />\n <path\n d=\"M55.1766 48.5674L51.606 46.5059C51.2659 46.3096 50.9001 46.2639 50.5086 46.3688C50.1181 46.4734 49.8247 46.6958 49.6283 47.0358C49.4155 47.4045 49.3616 47.7846 49.4665 48.1761C49.5711 48.5666 49.8047 48.857 50.1673 49.0473L54.9279 51.7972C55.2737 52.015 55.6424 52.0715 56.0339 51.9665C56.4244 51.8619 56.7262 51.6258 56.9393 51.2583L62.4123 41.7787C62.6086 41.4387 62.6559 41.0788 62.5541 40.699C62.4521 40.3181 62.231 40.0296 61.891 39.8332C61.5509 39.6369 61.1851 39.5912 60.7935 39.6961C60.403 39.8007 60.1096 40.0231 59.9133 40.3631L55.1766 48.5674ZM59.9961 59.3129C58.1413 59.8099 56.3037 59.9251 54.4835 59.6586C52.6632 59.392 50.988 58.817 49.4577 57.9335C47.9274 57.05 46.5918 55.8867 45.4509 54.4435C44.3099 53.0004 43.4909 51.3514 42.9939 49.4965C42.4969 47.6417 42.3817 45.8041 42.6482 43.9838C42.9147 42.1635 43.4897 40.4882 44.3732 38.958C45.2567 37.4277 46.42 36.0921 47.8631 34.9511C49.3063 33.8102 50.9552 32.9912 52.8101 32.4942C54.6649 31.9972 56.5025 31.8819 58.3227 32.1485C60.143 32.415 61.8183 32.99 63.3485 33.8736C64.8788 34.7571 66.2144 35.9204 67.3554 37.3635C68.4963 38.8067 69.3153 40.4557 69.8123 42.3105C70.3093 44.1654 70.4246 46.003 70.158 47.8233C69.8915 49.6435 69.3165 51.3188 68.433 52.8491C67.5495 54.3794 66.3862 55.715 64.9431 56.8559C63.5 57.9969 61.851 58.8159 59.9961 59.3129Z\"\n className=\"validation-icon\"\n />\n <path\n d=\"M76.5801 68.8601C77.3501 68.6501 77.8201 67.8501 77.6101 67.0801C77.4001 66.3101 76.6001 65.8401 75.8301 66.0501L49.0801 73.1601C48.3101 73.3701 47.8401 74.1701 48.0501 74.9401C48.2601 75.7101 49.0601 76.1801 49.8301 75.9701L76.5801 68.8601Z\"\n className=\"accent-light\"\n />\n <path\n d=\"M78.5098 76.1402C79.2798 75.9302 79.7498 75.1302 79.5398 74.3602C79.3298 73.5902 78.5298 73.1202 77.7598 73.3302L51.0098 80.4402C50.2398 80.6502 49.7698 81.4502 49.9798 82.2202C50.1898 82.9902 50.9898 83.4602 51.7598 83.2502L78.5098 76.1402Z\"\n className=\"accent-light\"\n />\n <path\n d=\"M81.6702 82.3401C81.4602 81.5701 80.6602 81.1001 79.8902 81.3101L53.1402 88.4201C52.3702 88.6301 51.9002 89.4301 52.1102 90.2001C52.3202 90.9701 53.1202 91.4401 53.8902 91.2301L80.6402 84.1201C81.4102 83.9101 81.8802 83.1101 81.6702 82.3401Z\"\n className=\"accent-light\"\n />\n </g>\n <defs>\n <clipPath id=\"clip0_phone_icon\">\n <rect width=\"120\" height=\"120\" fill=\"white\" />\n </clipPath>\n </defs>\n </StyledSvg>\n );\n};\n"],"names":["StyledSvg","styled","svg","Colour","width","height","className","_jsxs","viewBox","fill","xmlns","children","clipPath","_jsx","cx","cy","r","d","id"],"mappings":"yLASA,MAAMA,OAAYC,QAAOC,GAAG;;gBAEZC,EAAAA,OAAO;;;;gBAIPA,EAAAA,OAAO;;;;gBAIPA,EAAAA,OAAO;;;;gBAIPA,EAAAA,OAAO;;yBAIO,EAC1BC,QAAQ,IACRC,SAAS,IACTC,eAGIC,OAACP,EAAS,CACNI,MAAOA,EACPC,OAAQA,EACRG,QAAQ,cACRC,KAAK,OACLC,MAAM,6BACNJ,UAAWA,EAASK,SAAA,CAEpBJ,EAAAA,KAAA,IAAA,CAAGK,SAAS,yBAAwBD,SAAA,CAChCE,EAAAA,IAAA,SAAA,CACIC,GAAG,KACHC,GAAG,OACHC,EAAE,KACFV,UAAU,sBAEdO,MAAA,OAAA,CACII,EAAE,8XACFX,UAAU,iBAEdO,EAAAA,IAAA,OAAA,CACII,EAAE,spCACFR,KAAK,UAETI,EAAAA,IAAA,OAAA,CACII,EAAE,0yCACFX,UAAU,oBAEdO,EAAAA,YACII,EAAE,oPACFX,UAAU,iBAEdO,EAAAA,IAAA,OAAA,CACII,EAAE,oPACFX,UAAU,iBAEdO,MAAA,OAAA,CACII,EAAE,oPACFX,UAAU,oBAGlBO,EAAAA,IAAA,OAAA,CAAAF,SACIE,EAAAA,IAAA,WAAA,CAAUK,GAAG,mBAAkBP,SAC3BE,MAAA,OAAA,CAAMT,MAAM,MAAMC,OAAO,MAAMI,KAAK"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var e=require("react/jsx-runtime"),t=require("../../external/lodash/find.js"),r=require("../../external/lodash/isEqual.js"),n=require("react"),l=require("react-virtuoso");require("../../util/calendar-helper.js"),require("../../util/date-helper.js"),require("../../util/date-input-helper.js");var i=require("../../util/merge-refs.js");require("../../util/simple-id-generator.js"),require("../../util/string-helper.js"),require("@react-aria/live-announcer");var s=require("../../util/use-event.js"),o=require("../../util/use-event-listener.js"),u=require("../../util/use-mount.js"),a=require("../../util/use-previous.js"),d=require("../accessibility/index.js"),c=require("../dropdown-wrapper/element-with-dropdown.js"),v=require("./dropdown-label.js"),f=require("./dropdown-list-state.js"),h=require("./dropdown-list.styles.js"),x=require("./dropdown-search.js"),p=require("./virtuoso-components.js");const m=n.forwardRef((({listItems:m,multiSelect:j,maxSelectable:b,selectedItems:g,disableItemFocus:I,itemsLoadState:C="success",itemTruncationType:L="end",itemMaxLines:w=2,labelDisplayType:S="inline",variant:q="default",listboxId:y,ariaLabel:T,matchElementWidth:D=!1,width:E,topScrollItem:R,onSelectItem:k,onSelectAll:$,onDismiss:A,onRetry:F,valueExtractor:P,listExtractor:M,
|
|
1
|
+
"use strict";var e=require("react/jsx-runtime"),t=require("../../external/lodash/find.js"),r=require("../../external/lodash/isEqual.js"),n=require("react"),l=require("react-virtuoso");require("../../util/calendar-helper.js"),require("../../util/date-helper.js"),require("../../util/date-input-helper.js");var i=require("../../util/merge-refs.js");require("../../util/simple-id-generator.js"),require("../../util/string-helper.js"),require("@react-aria/live-announcer");var s=require("../../util/use-event.js"),o=require("../../util/use-event-listener.js"),u=require("../../util/use-mount.js"),a=require("../../util/use-previous.js"),d=require("../accessibility/index.js"),c=require("../dropdown-wrapper/element-with-dropdown.js"),v=require("./dropdown-label.js"),f=require("./dropdown-list-state.js"),h=require("./dropdown-list.styles.js"),x=require("./dropdown-search.js"),p=require("./virtuoso-components.js");const m=n.forwardRef((({listItems:m,multiSelect:j,maxSelectable:b,selectedItems:g,disableItemFocus:I,itemsLoadState:C="success",itemTruncationType:L="end",itemMaxLines:w=2,labelDisplayType:S="inline",variant:q="default",listboxId:y,ariaLabel:T,matchElementWidth:D=!1,width:E,topScrollItem:R,onSelectItem:k,onSelectAll:$,onDismiss:A,onRetry:F,valueExtractor:P,listExtractor:M,isOptionDisabled:N,renderListItem:O,renderCustomCallToAction:V,enableSearch:B,hideNoResultsDisplay:_,noResultsDescription:U,customLabels:W,searchPlaceholder:H,searchFunction:z,onSearch:G},J)=>{const{noResultsLabel:K="No results found.",selectAllButtonLabel:Q="Select all",clearAllButtonLabel:X="Clear all"}=W||{},Y=(null==W?void 0:W.searchPlaceholder)||H||"Search",Z=(null==W?void 0:W.noResultsDescription)||U,{focusedIndex:ee,setFocusedIndex:te}=n.useContext(f.DropdownListStateContext),{elementWidth:re,setFloatingRef:ne,getFloatingProps:le,styles:ie}=c.useDropdownRender(),[se,oe]=n.useState(""),[ue,ae]=n.useState(null!=m?m:[]),de=a.useCompare(C),ce=u.useIsMounted(),ve=n.useRef(null),fe=n.useRef([]),he=n.useRef(null),xe=n.useRef(null),pe=!!b&&!!g&&(null==g?void 0:g.length)===b,me=e=>{const t=M?M(e):null==e?void 0:e.toString();return"object"==typeof t?{title:t.title,secondaryLabel:t.secondaryLabel}:{title:null!=t?t:""}},je=n.useCallback((e=>!!t.default(g,(t=>r.default(t,e)))),[g]),be=s.useEvent((()=>null==z?void 0:z(se))),ge=s.useEvent((()=>null==m?void 0:m.filter((e=>{const{title:t,secondaryLabel:r}=me(e),n=se.trim().toLowerCase();return t.toLowerCase().includes(n)||r&&r.toLowerCase().includes(n)})))),Ie=n.useCallback((e=>{var t,r;if(I)return;if(he.current)return te(-1),void setTimeout((()=>{var e;return null===(e=he.current)||void 0===e?void 0:e.focus()}),0);const n=null!=ue?ue:[];if(0===n.length)return;if(void 0!==(null==e?void 0:e.index)){const r=Math.max(0,Math.min(e.index,n.length-1));return null===(t=xe.current)||void 0===t||t.scrollToIndex({index:r,align:"center"}),te(r),void setTimeout((()=>{var e;return null===(e=fe.current[r])||void 0===e?void 0:e.focus()}),0)}const l=(null==e?void 0:e.preferSelected)?n.findIndex((e=>je(e))):-1,i=-1!==l?l:ee>=0&&ee<n.length?ee:0;null===(r=xe.current)||void 0===r||r.scrollToIndex({index:i,align:"center"}),te(i),setTimeout((()=>{var e;return null===(e=fe.current[i])||void 0===e?void 0:e.focus()}),0)}),[je,I,ue,ee,te]),Ce=(e,t)=>{const r=e+t;if(!N)return r>=0&&r<ue.length?r:-1;let n=r;for(;n>=0&&n<ue.length;){if(!N(ue[n]))return n;n+=t}return-1},Le=(e,t)=>{N&&N(e)||pe&&!je(e)||(te(t),null==k||k(e,(e=>P?P(e):e)(e)))},we=e=>{const t=e.target.value;oe(t),null==G||G()},Se=()=>{var e;oe(""),null===(e=he.current)||void 0===e||e.focus(),null==G||G()},qe=()=>null==F?void 0:F();o.useEventListener("keydown",(e=>{var t,r;switch(e.code){case"ArrowDown":{e.preventDefault();const r=Ce(ee,1);-1!==r&&(null===(t=fe.current[r])||void 0===t||t.focus(),te(r));break}case"ArrowUp":{e.preventDefault();const t=Ce(ee,-1);-1!==t?(null===(r=fe.current[t])||void 0===r||r.focus(),te(t)):he.current&&(he.current.focus(),te(-1));break}case"Space":case"Enter":document.activeElement===fe.current[ee]&&(e.preventDefault(),ue[ee]&&Le(ue[ee],ee))}})),n.useImperativeHandle(J,(()=>({refocus:Ie})),[Ie]),n.useEffect((()=>{var e;if(!R)return void(null===(e=xe.current)||void 0===e||e.scrollTo({top:0}));const t=setTimeout((()=>{if(!m)return;const e=m.indexOf(R);xe.current&&-1!==e&&(xe.current.scrollToIndex({index:e}),te(e))}),0);return()=>clearTimeout(t)}),[fe,m,te,R]),n.useEffect((()=>{I||ce&&de&&"success"===C&&he.current&&(te(-1),he.current.focus())}),[ce,de,C,te,I]),n.useEffect((()=>{var e;ae(null!==(e=""===se?m:z?be():ge())&&void 0!==e?e:[])}),[be,ge,m,z,se]),n.useEffect((()=>{var e,t,r;if(ce)return;if(I||!ue.length)return;const n=ue.findIndex((e=>je(e)));if(he.current)te(-1),setTimeout((()=>{var e;return null===(e=he.current)||void 0===e?void 0:e.focus()}),200);else if(ee>0)null===(e=xe.current)||void 0===e||e.scrollToIndex({index:ee,align:"center"}),setTimeout((()=>{var e;return null===(e=fe.current[ee])||void 0===e?void 0:e.focus()}),200);else if(-1!==n)null===(t=xe.current)||void 0===t||t.scrollToIndex({index:n,align:"center"}),te(n),setTimeout((()=>{var e;return null===(e=fe.current[n])||void 0===e?void 0:e.focus()}),200);else{const e=N?ue.findIndex((e=>!N(e))):0,t=-1!==e?e:0;null===(r=xe.current)||void 0===r||r.scrollToIndex({index:t}),te(t),setTimeout((()=>{var e;return null===(e=fe.current[t])||void 0===e?void 0:e.focus()}),200)}}),[je,I,ue,ee,ce,te,N]);const ye=t=>j?pe&&!t?e.jsx(h.CheckboxDisabledIndicator,{"aria-hidden":!0}):t?e.jsx(h.CheckboxSelectedIndicator,{"aria-hidden":!0}):e.jsx(h.CheckboxUnselectedIndicator,{"aria-hidden":!0}):t?e.jsx(h.SelectedIndicator,{"aria-hidden":!0}):e.jsx(h.UnselectedIndicator,{}),Te=(t,r,n)=>{const{title:l,secondaryLabel:i}=me(t);return e.jsx(v.DropdownLabel,{displayType:S,label:l,maxLines:w,selected:r,disabled:n,sublabel:i,truncationType:L,variant:q})},De=(t,r)=>{if(!F||"success"===C){const n=je(t),l=r===ee,i=!n&&pe||!!N&&N(t);return e.jsx(h.ListItem,{"aria-selected":n,"aria-disabled":i,"aria-posinset":r+1,"aria-setsize":null==ue?void 0:ue.length,"data-testid":"list-item",onClick:()=>Le(t,r),onMouseEnter:()=>(e=>te(e))(r),ref:e=>{fe.current[r]=e},role:"option",tabIndex:l?0:-1,$active:l,$selected:n,$disabled:i,children:O?O(t,{selected:n,disabled:i}):e.jsxs(e.Fragment,{children:[ye(n),Te(t,n,i)]})},((e,t)=>`item_${t}__${P?P(e):e}`)(t,r))}},Ee=()=>{if((B||z)&&"success"===C)return e.jsx(x.DropdownSearch,{ref:he,onChange:we,value:se,placeholder:Y,"data-testid":"search-input","aria-label":"Enter text to search",onClear:Se,variant:q})},Re=()=>{if(g&&j&&ue.length>0&&!se&&"success"===C)return e.jsx(h.SelectAllContainer,{children:e.jsx(h.SelectAllButton,{onClick:$,type:"button",$variant:q,children:b||0!==g.length?X:Q})})},ke=()=>{if(!_&&(se||!B)&&0===ue.length&&"success"===C)return e.jsxs(e.Fragment,{children:[e.jsxs(h.ResultStateContainer,{"data-testid":"list-no-results",children:[e.jsx(h.LabelIcon,{"data-testid":"no-result-icon"}),K]}),Z&&e.jsx(h.NoResultDescContainer,{"data-testid":"no-result-desc",children:Z})]})},$e=()=>{if(F&&"loading"===C)return e.jsxs(h.ResultStateContainer,{"data-testid":"list-loading",children:[e.jsx(h.Spinner,{}),"Loading..."]})},Ae=()=>{if(F&&"fail"===C)return e.jsxs(h.ResultStateContainer,{"data-testid":"list-fail",children:[e.jsx(h.LabelIcon,{"data-testid":"load-error-icon"}),"Failed to load. ",e.jsx(h.TryAgainButton,{onClick:qe,type:"button",$variant:q,children:"Try again."})]})},Fe=()=>{var t;const r="test"===process.env.NODE_ENV;return e.jsx(l.Virtuoso,Object.assign({ref:xe,style:{height:"100%"},data:ue,customScrollParent:null!==(t=ve.current)&&void 0!==t?t:void 0,itemContent:(e,t)=>De(t,e),components:{List:p.VirtuosoList,Item:p.VirtuosoItem},context:{listProps:{id:y,role:"listbox","aria-multiselectable":j},listItemProps:{role:"none"}}},r?{initialItemCount:ue.length}:{}),r?ue.length:void 0)};return e.jsxs(h.Container,Object.assign({"data-testid":"dropdown-container",ref:i.mergeRefs(ve,ne),style:ie},le(),{$width:D?re:void 0,$customWidth:E,$variant:q,children:[e.jsx(d.VisuallyHidden,{role:"status",children:T}),e.jsxs(h.List,{"data-testid":"dropdown-list",role:"group","aria-label":T,children:[Ee(),Re(),ke(),$e(),Ae(),Fe()]}),(()=>{if(V)return e.jsx("div",{"data-testid":"custom-cta",children:V(A,ue)})})()]}))}));exports.DropdownList=m;
|
|
2
2
|
//# sourceMappingURL=dropdown-list.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dropdown-list.js","sources":["../../../../src/shared/dropdown-list/dropdown-list.tsx"],"sourcesContent":["import find from \"lodash/find\";\nimport isEqual from \"lodash/isEqual\";\nimport React, {\n forwardRef,\n useCallback,\n useContext,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n} from \"react\";\nimport { Virtuoso, VirtuosoHandle } from \"react-virtuoso\";\nimport {\n mergeRefs,\n useCompare,\n useEvent,\n useEventListener,\n useIsMounted,\n} from \"../../util\";\nimport { VisuallyHidden } from \"../accessibility\";\nimport { useDropdownRender } from \"../dropdown-wrapper\";\nimport { DropdownLabel } from \"./dropdown-label\";\nimport { DropdownListStateContext } from \"./dropdown-list-state\";\nimport {\n CheckboxDisabledIndicator,\n CheckboxSelectedIndicator,\n CheckboxUnselectedIndicator,\n Container,\n LabelIcon,\n List,\n ListItem,\n NoResultDescContainer,\n ResultStateContainer,\n SelectAllButton,\n SelectAllContainer,\n SelectedIndicator,\n Spinner,\n TryAgainButton,\n UnselectedIndicator,\n} from \"./dropdown-list.styles\";\nimport { DropdownSearch } from \"./dropdown-search\";\nimport {\n DropdownListApi,\n DropdownListProps,\n ListItemDisplayProps,\n} from \"./types\";\nimport { VirtuosoItem, VirtuosoList } from \"./virtuoso-components\";\n\n/**\n * NOTE: This component is not directly exportable but forms part of a component\n */\nconst DropdownListInner = <T, V>(\n {\n listItems,\n multiSelect,\n maxSelectable,\n selectedItems,\n disableItemFocus,\n itemsLoadState = \"success\",\n itemTruncationType = \"end\",\n itemMaxLines = 2,\n labelDisplayType = \"inline\",\n variant = \"default\",\n listboxId,\n ariaLabel,\n matchElementWidth = false,\n width,\n topScrollItem,\n onSelectItem,\n onSelectAll,\n onDismiss,\n onRetry,\n /* DropdownDisplayProps */\n valueExtractor,\n listExtractor,\n renderListItem,\n renderCustomCallToAction,\n /* DropdownSearchProps */\n enableSearch,\n hideNoResultsDisplay,\n noResultsDescription: _noResultsDescription,\n customLabels,\n searchPlaceholder: _searchPlaceholder,\n searchFunction,\n onSearch,\n }: DropdownListProps<T, V>,\n ref: React.ForwardedRef<DropdownListApi>\n): JSX.Element => {\n // =========================================================================\n // CONST, REF, STATE\n // =========================================================================\n const {\n noResultsLabel = \"No results found.\",\n selectAllButtonLabel = \"Select all\",\n clearAllButtonLabel = \"Clear all\",\n } = customLabels || {};\n const searchPlaceholder =\n customLabels?.searchPlaceholder || _searchPlaceholder || \"Search\";\n const noResultsDescription =\n customLabels?.noResultsDescription || _noResultsDescription;\n const { focusedIndex, setFocusedIndex } = useContext(\n DropdownListStateContext\n );\n const { elementWidth, setFloatingRef, getFloatingProps, styles } =\n useDropdownRender();\n const [searchValue, setSearchValue] = useState<string>(\"\");\n const [displayListItems, setDisplayListItems] = useState(listItems ?? []);\n const itemsLoadStateChanged = useCompare(itemsLoadState);\n const mounted = useIsMounted();\n\n const nodeRef = useRef<HTMLDivElement | null>(null);\n const listItemRefs = useRef<(HTMLElement | null)[]>([]);\n const searchInputRef = useRef<HTMLInputElement>(null);\n const virtuosoRef = useRef<VirtuosoHandle>(null);\n\n const hasSelectedMax =\n !!maxSelectable &&\n !!selectedItems &&\n selectedItems?.length === maxSelectable;\n\n // =========================================================================\n // HELPER FUNCTIONS\n // =========================================================================\n const getValue = (item: T): V => {\n return valueExtractor ? valueExtractor(item) : (item as unknown as V);\n };\n\n const getItemKey = (item: T, index: number) => {\n const formattedValue = valueExtractor ? valueExtractor(item) : item;\n // This is needed as some items might have the same value\n return `item_${index}__${formattedValue}`;\n };\n\n const getOptionLabel = (item: T): ListItemDisplayProps => {\n const value = listExtractor ? listExtractor(item) : item?.toString();\n\n if (typeof value === \"object\") {\n return { title: value.title, secondaryLabel: value.secondaryLabel };\n }\n\n return { title: value ?? \"\" };\n };\n\n const checkListItemSelected = useCallback(\n (item: T): boolean => {\n return !!find(selectedItems, (arrItem) => {\n return isEqual(arrItem, item);\n });\n },\n [selectedItems]\n );\n\n const filterItemsByCustomSearch = useEvent(() => {\n return searchFunction?.(searchValue);\n });\n\n const filterItemsByLabel = useEvent(() => {\n return listItems?.filter((item) => {\n const { title, secondaryLabel } = getOptionLabel(item);\n const updatedSearchValue = searchValue.trim().toLowerCase();\n return (\n title.toLowerCase().includes(updatedSearchValue) ||\n (secondaryLabel &&\n secondaryLabel.toLowerCase().includes(updatedSearchValue))\n );\n });\n });\n\n const refocus = useCallback(\n (opts?: { index?: number; preferSelected?: boolean }) => {\n if (disableItemFocus) return;\n\n if (searchInputRef.current) {\n setFocusedIndex(-1);\n setTimeout(() => searchInputRef.current?.focus(), 0);\n return;\n }\n\n const items = displayListItems ?? [];\n if (items.length === 0) return;\n\n if (opts?.index !== undefined) {\n const forced = Math.max(\n 0,\n Math.min(opts.index, items.length - 1)\n );\n virtuosoRef.current?.scrollToIndex({\n index: forced,\n align: \"center\",\n });\n setFocusedIndex(forced);\n setTimeout(() => listItemRefs.current[forced]?.focus(), 0);\n\n return;\n }\n\n const selectedIndex = opts?.preferSelected\n ? items.findIndex((item) => checkListItemSelected(item))\n : -1;\n\n const nextIndex =\n selectedIndex !== -1\n ? selectedIndex\n : focusedIndex >= 0 && focusedIndex < items.length\n ? focusedIndex\n : 0;\n\n virtuosoRef.current?.scrollToIndex({\n index: nextIndex,\n align: \"center\",\n });\n setFocusedIndex(nextIndex);\n setTimeout(() => listItemRefs.current[nextIndex]?.focus(), 0);\n },\n [\n checkListItemSelected,\n disableItemFocus,\n displayListItems,\n focusedIndex,\n setFocusedIndex,\n ]\n );\n\n // =========================================================================\n // EVENT HANDLERS\n // =========================================================================\n const handleKeyboardPress = (event: KeyboardEvent) => {\n switch (event.code) {\n case \"ArrowDown\":\n event.preventDefault();\n // Cannot go further than last element\n if (focusedIndex < displayListItems.length - 1) {\n const upcomingIndex = focusedIndex + 1;\n listItemRefs.current[upcomingIndex]?.focus();\n setFocusedIndex(upcomingIndex);\n }\n break;\n case \"ArrowUp\":\n event.preventDefault();\n // Cannot go further than first element\n if (focusedIndex > 0) {\n const upcomingIndex = focusedIndex - 1;\n listItemRefs.current[upcomingIndex]?.focus();\n setFocusedIndex(upcomingIndex);\n } else if (focusedIndex === 0 && searchInputRef.current) {\n searchInputRef.current.focus();\n setFocusedIndex(-1);\n }\n break;\n case \"Space\":\n case \"Enter\":\n if (\n document.activeElement ===\n listItemRefs.current[focusedIndex]\n ) {\n event.preventDefault();\n if (displayListItems[focusedIndex]) {\n handleListItemClick(\n displayListItems[focusedIndex],\n focusedIndex\n );\n }\n }\n break;\n default:\n break;\n }\n };\n\n const handleListItemClick = (item: T, upcomingIndex: number) => {\n if (hasSelectedMax && !checkListItemSelected(item)) return;\n setFocusedIndex(upcomingIndex);\n onSelectItem?.(item, getValue(item));\n };\n\n const handleListItemHover = (index: number) => setFocusedIndex(index);\n\n const handleSearchInputChange = (\n event: React.ChangeEvent<HTMLInputElement>\n ) => {\n const value = event.target.value;\n setSearchValue(value);\n onSearch?.();\n };\n\n const handleOnClear = () => {\n setSearchValue(\"\");\n searchInputRef.current?.focus();\n onSearch?.();\n };\n\n const handleTryAgain = () => onRetry?.();\n\n // =========================================================================\n // EFFECTS\n // =========================================================================\n useEventListener(\"keydown\", handleKeyboardPress);\n useImperativeHandle(ref, () => ({ refocus }), [refocus]);\n\n useEffect(() => {\n if (!topScrollItem) {\n virtuosoRef.current?.scrollTo({ top: 0 });\n return;\n }\n // Delay to ensure render is complete\n const timer = setTimeout(() => {\n if (!listItems) return;\n\n const index = listItems.indexOf(topScrollItem);\n if (virtuosoRef.current && index !== -1) {\n virtuosoRef.current.scrollToIndex({ index });\n setFocusedIndex(index);\n }\n }, 0);\n\n return () => clearTimeout(timer);\n }, [listItemRefs, listItems, setFocusedIndex, topScrollItem]);\n\n useEffect(() => {\n if (disableItemFocus) return;\n\n // skip effect as dependency did not change\n if (!mounted || !itemsLoadStateChanged) return;\n\n // Reset focus when options are loaded\n if (itemsLoadState === \"success\") {\n if (searchInputRef.current) {\n setFocusedIndex(-1);\n searchInputRef.current.focus();\n }\n }\n }, [\n mounted,\n itemsLoadStateChanged,\n itemsLoadState,\n setFocusedIndex,\n disableItemFocus,\n ]);\n\n useEffect(() => {\n const filterItems = () => {\n if (searchValue === \"\") {\n return listItems;\n } else if (searchFunction) {\n return filterItemsByCustomSearch();\n } else {\n return filterItemsByLabel();\n }\n };\n\n setDisplayListItems(filterItems() ?? []);\n }, [\n filterItemsByCustomSearch,\n filterItemsByLabel,\n listItems,\n searchFunction,\n searchValue,\n ]);\n\n useEffect(() => {\n if (mounted) {\n // only run on mount\n return;\n }\n\n if (disableItemFocus || !listItems) return;\n\n const index = listItems.findIndex((item) =>\n checkListItemSelected(item)\n );\n\n // Focus search input if there is one\n if (searchInputRef.current) {\n setFocusedIndex(-1);\n setTimeout(() => searchInputRef.current?.focus(), 200); // Wait for animation\n } else if (focusedIndex > 0) {\n // Else focus on the specified element\n virtuosoRef.current?.scrollToIndex({\n index: focusedIndex,\n align: \"center\",\n });\n setTimeout(() => listItemRefs.current[focusedIndex]?.focus(), 200);\n } else if (index !== -1) {\n // Else focus on the selected element\n virtuosoRef.current?.scrollToIndex({ index, align: \"center\" });\n setFocusedIndex(index);\n setTimeout(() => listItemRefs.current[index]?.focus(), 200);\n } else {\n // Else focus on the first list item\n virtuosoRef.current?.scrollToIndex({ index: 0 });\n setFocusedIndex(0);\n setTimeout(() => listItemRefs.current[0]?.focus(), 200);\n }\n }, [\n checkListItemSelected,\n disableItemFocus,\n focusedIndex,\n listItems,\n mounted,\n setFocusedIndex,\n ]);\n\n // =========================================================================\n // RENDER FUNCTIONS\n // =========================================================================\n const renderListItemIcon = (selected: boolean) => {\n if (multiSelect) {\n if (hasSelectedMax && !selected) {\n return <CheckboxDisabledIndicator aria-hidden />;\n }\n\n return selected ? (\n <CheckboxSelectedIndicator aria-hidden />\n ) : (\n <CheckboxUnselectedIndicator aria-hidden />\n );\n }\n\n return selected ? (\n <SelectedIndicator aria-hidden />\n ) : (\n <UnselectedIndicator />\n );\n };\n\n const renderDropdownLabel = (item: T, selected: boolean) => {\n const { title, secondaryLabel } = getOptionLabel(item);\n\n return (\n <DropdownLabel\n displayType={labelDisplayType}\n label={title}\n maxLines={itemMaxLines}\n selected={selected}\n disabled={!selected && hasSelectedMax}\n sublabel={secondaryLabel}\n truncationType={itemTruncationType}\n variant={variant}\n />\n );\n };\n\n const renderItem = (item: T, index: number) => {\n if (!onRetry || itemsLoadState === \"success\") {\n const selected = checkListItemSelected(item);\n const active = index === focusedIndex;\n return (\n <ListItem\n aria-selected={selected}\n aria-disabled={!selected && hasSelectedMax}\n aria-posinset={index + 1}\n aria-setsize={displayListItems?.length}\n data-testid=\"list-item\"\n key={getItemKey(item, index)}\n onClick={() => handleListItemClick(item, index)}\n onMouseEnter={() => handleListItemHover(index)}\n ref={(element) => {\n listItemRefs.current[index] = element;\n }}\n role=\"option\"\n tabIndex={active ? 0 : -1}\n $active={active}\n $selected={selected}\n $disabled={!selected && hasSelectedMax}\n >\n {renderListItem ? (\n renderListItem(item, { selected })\n ) : (\n <>\n {renderListItemIcon(selected)}\n {renderDropdownLabel(item, selected)}\n </>\n )}\n </ListItem>\n );\n }\n };\n\n const renderSearchInput = () => {\n if ((enableSearch || searchFunction) && itemsLoadState === \"success\") {\n return (\n <DropdownSearch\n ref={searchInputRef}\n onChange={handleSearchInputChange}\n value={searchValue}\n placeholder={searchPlaceholder}\n data-testid=\"search-input\"\n aria-label=\"Enter text to search\"\n onClear={handleOnClear}\n variant={variant}\n />\n );\n }\n };\n\n const renderSelectAll = () => {\n if (\n selectedItems &&\n multiSelect &&\n displayListItems.length > 0 &&\n !searchValue &&\n itemsLoadState === \"success\"\n ) {\n return (\n <SelectAllContainer>\n <SelectAllButton\n onClick={onSelectAll}\n type=\"button\"\n $variant={variant}\n >\n {maxSelectable || selectedItems.length !== 0\n ? clearAllButtonLabel\n : selectAllButtonLabel}\n </SelectAllButton>\n </SelectAllContainer>\n );\n }\n };\n\n const renderNoResults = () => {\n if (\n !hideNoResultsDisplay &&\n (searchValue || !enableSearch) &&\n displayListItems.length === 0 &&\n itemsLoadState === \"success\"\n ) {\n return (\n <>\n <ResultStateContainer data-testid=\"list-no-results\">\n <LabelIcon data-testid=\"no-result-icon\" />\n {noResultsLabel}\n </ResultStateContainer>\n {noResultsDescription && (\n <NoResultDescContainer data-testid=\"no-result-desc\">\n {noResultsDescription}\n </NoResultDescContainer>\n )}\n </>\n );\n }\n };\n\n const renderLoading = () => {\n if (onRetry && itemsLoadState === \"loading\") {\n return (\n <ResultStateContainer data-testid=\"list-loading\">\n <Spinner />\n Loading...\n </ResultStateContainer>\n );\n }\n };\n\n const renderTryAgain = () => {\n if (onRetry && itemsLoadState === \"fail\") {\n return (\n <ResultStateContainer data-testid=\"list-fail\">\n <LabelIcon data-testid=\"load-error-icon\" />\n Failed to load. \n <TryAgainButton\n onClick={handleTryAgain}\n type=\"button\"\n $variant={variant}\n >\n Try again.\n </TryAgainButton>\n </ResultStateContainer>\n );\n }\n };\n\n const renderVirtualisedList = () => {\n const isTestEnv = process.env.NODE_ENV === \"test\";\n\n return (\n <Virtuoso\n ref={virtuosoRef}\n style={{ height: \"100%\" }}\n data={displayListItems}\n customScrollParent={nodeRef.current ?? undefined}\n itemContent={(index, item) => renderItem(item, index)}\n components={{\n List: VirtuosoList,\n Item: VirtuosoItem,\n }}\n context={{\n listProps: {\n id: listboxId,\n role: \"listbox\",\n \"aria-multiselectable\": multiSelect,\n },\n listItemProps: {\n role: \"none\",\n },\n }}\n // disable virtualisation in tests\n // https://github.com/petyosi/react-virtuoso/issues/26#issuecomment-1040316576\n // explicitly set the `key` prop to avoid React warning\n key={isTestEnv ? displayListItems.length : undefined}\n // omit the `initialItemCount` prop to resolve NaN error\n {...(isTestEnv\n ? {\n initialItemCount: displayListItems.length,\n }\n : {})}\n />\n );\n };\n\n const renderList = () => {\n return (\n <List\n data-testid=\"dropdown-list\"\n role=\"group\"\n aria-label={ariaLabel}\n >\n {renderSearchInput()}\n {renderSelectAll()}\n {renderNoResults()}\n {renderLoading()}\n {renderTryAgain()}\n {renderVirtualisedList()}\n </List>\n );\n };\n\n const renderBottomCta = () => {\n if (!renderCustomCallToAction) {\n return;\n }\n\n // FIXME: implement onDismiss handling\n return (\n <div data-testid=\"custom-cta\">\n {renderCustomCallToAction(onDismiss as any, displayListItems)}\n </div>\n );\n };\n\n return (\n <Container\n data-testid=\"dropdown-container\"\n ref={mergeRefs(nodeRef, setFloatingRef)}\n style={styles}\n {...getFloatingProps()}\n $width={matchElementWidth ? elementWidth : undefined}\n $customWidth={width}\n $variant={variant}\n >\n <VisuallyHidden role=\"status\">{ariaLabel}</VisuallyHidden>\n {renderList()}\n {renderBottomCta()}\n </Container>\n );\n};\n\nexport const DropdownList = forwardRef(DropdownListInner);\n"],"names":["DropdownList","forwardRef","listItems","multiSelect","maxSelectable","selectedItems","disableItemFocus","itemsLoadState","itemTruncationType","itemMaxLines","labelDisplayType","variant","listboxId","ariaLabel","matchElementWidth","width","topScrollItem","onSelectItem","onSelectAll","onDismiss","onRetry","valueExtractor","listExtractor","renderListItem","renderCustomCallToAction","enableSearch","hideNoResultsDisplay","noResultsDescription","_noResultsDescription","customLabels","searchPlaceholder","_searchPlaceholder","searchFunction","onSearch","ref","noResultsLabel","selectAllButtonLabel","clearAllButtonLabel","focusedIndex","setFocusedIndex","useContext","DropdownListStateContext","elementWidth","setFloatingRef","getFloatingProps","styles","useDropdownRender","searchValue","setSearchValue","useState","displayListItems","setDisplayListItems","itemsLoadStateChanged","useCompare","mounted","useIsMounted","nodeRef","useRef","listItemRefs","searchInputRef","virtuosoRef","hasSelectedMax","length","getOptionLabel","item","value","toString","title","secondaryLabel","checkListItemSelected","useCallback","find","arrItem","isEqual","filterItemsByCustomSearch","useEvent","filterItemsByLabel","filter","updatedSearchValue","trim","toLowerCase","includes","refocus","opts","current","setTimeout","_a","focus","items","undefined","index","forced","Math","max","min","scrollToIndex","align","selectedIndex","preferSelected","findIndex","nextIndex","_b","handleListItemClick","upcomingIndex","getValue","handleSearchInputChange","event","target","handleOnClear","handleTryAgain","useEventListener","code","preventDefault","document","activeElement","useImperativeHandle","useEffect","scrollTo","top","timer","indexOf","clearTimeout","_c","renderListItemIcon","selected","_jsx","CheckboxDisabledIndicator","CheckboxSelectedIndicator","CheckboxUnselectedIndicator","SelectedIndicator","UnselectedIndicator","renderDropdownLabel","DropdownLabel","displayType","label","maxLines","disabled","sublabel","truncationType","renderItem","active","ListItem","onClick","onMouseEnter","handleListItemHover","element","role","tabIndex","$active","$selected","$disabled","children","_jsxs","_Fragment","getItemKey","renderSearchInput","DropdownSearch","onChange","placeholder","onClear","renderSelectAll","SelectAllContainer","SelectAllButton","type","$variant","renderNoResults","ResultStateContainer","LabelIcon","NoResultDescContainer","renderLoading","Spinner","renderTryAgain","TryAgainButton","renderVirtualisedList","isTestEnv","process","env","NODE_ENV","Virtuoso","Object","assign","style","height","data","customScrollParent","itemContent","components","List","VirtuosoList","Item","VirtuosoItem","context","listProps","id","listItemProps","initialItemCount","Container","mergeRefs","$width","$customWidth","VisuallyHidden","renderBottomCta"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"dropdown-list.js","sources":["../../../../src/shared/dropdown-list/dropdown-list.tsx"],"sourcesContent":["import find from \"lodash/find\";\nimport isEqual from \"lodash/isEqual\";\nimport React, {\n forwardRef,\n useCallback,\n useContext,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n} from \"react\";\nimport { Virtuoso, VirtuosoHandle } from \"react-virtuoso\";\nimport {\n mergeRefs,\n useCompare,\n useEvent,\n useEventListener,\n useIsMounted,\n} from \"../../util\";\nimport { VisuallyHidden } from \"../accessibility\";\nimport { useDropdownRender } from \"../dropdown-wrapper\";\nimport { DropdownLabel } from \"./dropdown-label\";\nimport { DropdownListStateContext } from \"./dropdown-list-state\";\nimport {\n CheckboxDisabledIndicator,\n CheckboxSelectedIndicator,\n CheckboxUnselectedIndicator,\n Container,\n LabelIcon,\n List,\n ListItem,\n NoResultDescContainer,\n ResultStateContainer,\n SelectAllButton,\n SelectAllContainer,\n SelectedIndicator,\n Spinner,\n TryAgainButton,\n UnselectedIndicator,\n} from \"./dropdown-list.styles\";\nimport { DropdownSearch } from \"./dropdown-search\";\nimport {\n DropdownListApi,\n DropdownListProps,\n ListItemDisplayProps,\n} from \"./types\";\nimport { VirtuosoItem, VirtuosoList } from \"./virtuoso-components\";\n\n/**\n * NOTE: This component is not directly exportable but forms part of a component\n */\nconst DropdownListInner = <T, V>(\n {\n listItems,\n multiSelect,\n maxSelectable,\n selectedItems,\n disableItemFocus,\n itemsLoadState = \"success\",\n itemTruncationType = \"end\",\n itemMaxLines = 2,\n labelDisplayType = \"inline\",\n variant = \"default\",\n listboxId,\n ariaLabel,\n matchElementWidth = false,\n width,\n topScrollItem,\n onSelectItem,\n onSelectAll,\n onDismiss,\n onRetry,\n /* DropdownDisplayProps */\n valueExtractor,\n listExtractor,\n isOptionDisabled,\n renderListItem,\n renderCustomCallToAction,\n /* DropdownSearchProps */\n enableSearch,\n hideNoResultsDisplay,\n noResultsDescription: _noResultsDescription,\n customLabels,\n searchPlaceholder: _searchPlaceholder,\n searchFunction,\n onSearch,\n }: DropdownListProps<T, V>,\n ref: React.ForwardedRef<DropdownListApi>\n): JSX.Element => {\n // =========================================================================\n // CONST, REF, STATE\n // =========================================================================\n const {\n noResultsLabel = \"No results found.\",\n selectAllButtonLabel = \"Select all\",\n clearAllButtonLabel = \"Clear all\",\n } = customLabels || {};\n const searchPlaceholder =\n customLabels?.searchPlaceholder || _searchPlaceholder || \"Search\";\n const noResultsDescription =\n customLabels?.noResultsDescription || _noResultsDescription;\n const { focusedIndex, setFocusedIndex } = useContext(\n DropdownListStateContext\n );\n const { elementWidth, setFloatingRef, getFloatingProps, styles } =\n useDropdownRender();\n const [searchValue, setSearchValue] = useState<string>(\"\");\n const [displayListItems, setDisplayListItems] = useState(listItems ?? []);\n const itemsLoadStateChanged = useCompare(itemsLoadState);\n const mounted = useIsMounted();\n\n const nodeRef = useRef<HTMLDivElement | null>(null);\n const listItemRefs = useRef<(HTMLElement | null)[]>([]);\n const searchInputRef = useRef<HTMLInputElement>(null);\n const virtuosoRef = useRef<VirtuosoHandle>(null);\n\n const hasSelectedMax =\n !!maxSelectable &&\n !!selectedItems &&\n selectedItems?.length === maxSelectable;\n\n // =========================================================================\n // HELPER FUNCTIONS\n // =========================================================================\n const getValue = (item: T): V => {\n return valueExtractor ? valueExtractor(item) : (item as unknown as V);\n };\n\n const getItemKey = (item: T, index: number) => {\n const formattedValue = valueExtractor ? valueExtractor(item) : item;\n // This is needed as some items might have the same value\n return `item_${index}__${formattedValue}`;\n };\n\n const getOptionLabel = (item: T): ListItemDisplayProps => {\n const value = listExtractor ? listExtractor(item) : item?.toString();\n\n if (typeof value === \"object\") {\n return { title: value.title, secondaryLabel: value.secondaryLabel };\n }\n\n return { title: value ?? \"\" };\n };\n\n const checkListItemSelected = useCallback(\n (item: T): boolean => {\n return !!find(selectedItems, (arrItem) => {\n return isEqual(arrItem, item);\n });\n },\n [selectedItems]\n );\n\n const filterItemsByCustomSearch = useEvent(() => {\n return searchFunction?.(searchValue);\n });\n\n const filterItemsByLabel = useEvent(() => {\n return listItems?.filter((item) => {\n const { title, secondaryLabel } = getOptionLabel(item);\n const updatedSearchValue = searchValue.trim().toLowerCase();\n return (\n title.toLowerCase().includes(updatedSearchValue) ||\n (secondaryLabel &&\n secondaryLabel.toLowerCase().includes(updatedSearchValue))\n );\n });\n });\n\n const refocus = useCallback(\n (opts?: { index?: number; preferSelected?: boolean }) => {\n if (disableItemFocus) return;\n\n if (searchInputRef.current) {\n setFocusedIndex(-1);\n setTimeout(() => searchInputRef.current?.focus(), 0);\n return;\n }\n\n const items = displayListItems ?? [];\n if (items.length === 0) return;\n\n if (opts?.index !== undefined) {\n const forced = Math.max(\n 0,\n Math.min(opts.index, items.length - 1)\n );\n virtuosoRef.current?.scrollToIndex({\n index: forced,\n align: \"center\",\n });\n setFocusedIndex(forced);\n setTimeout(() => listItemRefs.current[forced]?.focus(), 0);\n\n return;\n }\n\n const selectedIndex = opts?.preferSelected\n ? items.findIndex((item) => checkListItemSelected(item))\n : -1;\n\n const nextIndex =\n selectedIndex !== -1\n ? selectedIndex\n : focusedIndex >= 0 && focusedIndex < items.length\n ? focusedIndex\n : 0;\n\n virtuosoRef.current?.scrollToIndex({\n index: nextIndex,\n align: \"center\",\n });\n setFocusedIndex(nextIndex);\n setTimeout(() => listItemRefs.current[nextIndex]?.focus(), 0);\n },\n [\n checkListItemSelected,\n disableItemFocus,\n displayListItems,\n focusedIndex,\n setFocusedIndex,\n ]\n );\n\n // =========================================================================\n // EVENT HANDLERS\n // =========================================================================\n const findNextEnabledIndex = (\n startIndex: number,\n direction: 1 | -1\n ): number => {\n const nextIndex = startIndex + direction;\n if (!isOptionDisabled) {\n return nextIndex >= 0 && nextIndex < displayListItems.length\n ? nextIndex\n : -1;\n }\n let index = nextIndex;\n while (index >= 0 && index < displayListItems.length) {\n if (!isOptionDisabled(displayListItems[index])) {\n return index;\n }\n index += direction;\n }\n return -1;\n };\n\n const handleKeyboardPress = (event: KeyboardEvent) => {\n switch (event.code) {\n case \"ArrowDown\": {\n event.preventDefault();\n const nextIndex = findNextEnabledIndex(focusedIndex, 1);\n if (nextIndex !== -1) {\n listItemRefs.current[nextIndex]?.focus();\n setFocusedIndex(nextIndex);\n }\n break;\n }\n case \"ArrowUp\": {\n event.preventDefault();\n const prevIndex = findNextEnabledIndex(focusedIndex, -1);\n if (prevIndex !== -1) {\n listItemRefs.current[prevIndex]?.focus();\n setFocusedIndex(prevIndex);\n } else if (searchInputRef.current) {\n searchInputRef.current.focus();\n setFocusedIndex(-1);\n }\n break;\n }\n case \"Space\":\n case \"Enter\":\n if (\n document.activeElement ===\n listItemRefs.current[focusedIndex]\n ) {\n event.preventDefault();\n if (displayListItems[focusedIndex]) {\n handleListItemClick(\n displayListItems[focusedIndex],\n focusedIndex\n );\n }\n }\n break;\n default:\n break;\n }\n };\n\n const handleListItemClick = (item: T, upcomingIndex: number) => {\n if (isOptionDisabled && isOptionDisabled(item)) return;\n if (hasSelectedMax && !checkListItemSelected(item)) return;\n setFocusedIndex(upcomingIndex);\n onSelectItem?.(item, getValue(item));\n };\n\n const handleListItemHover = (index: number) => setFocusedIndex(index);\n\n const handleSearchInputChange = (\n event: React.ChangeEvent<HTMLInputElement>\n ) => {\n const value = event.target.value;\n setSearchValue(value);\n onSearch?.();\n };\n\n const handleOnClear = () => {\n setSearchValue(\"\");\n searchInputRef.current?.focus();\n onSearch?.();\n };\n\n const handleTryAgain = () => onRetry?.();\n\n // =========================================================================\n // EFFECTS\n // =========================================================================\n useEventListener(\"keydown\", handleKeyboardPress);\n useImperativeHandle(ref, () => ({ refocus }), [refocus]);\n\n useEffect(() => {\n if (!topScrollItem) {\n virtuosoRef.current?.scrollTo({ top: 0 });\n return;\n }\n // Delay to ensure render is complete\n const timer = setTimeout(() => {\n if (!listItems) return;\n\n const index = listItems.indexOf(topScrollItem);\n if (virtuosoRef.current && index !== -1) {\n virtuosoRef.current.scrollToIndex({ index });\n setFocusedIndex(index);\n }\n }, 0);\n\n return () => clearTimeout(timer);\n }, [listItemRefs, listItems, setFocusedIndex, topScrollItem]);\n\n useEffect(() => {\n if (disableItemFocus) return;\n\n // skip effect as dependency did not change\n if (!mounted || !itemsLoadStateChanged) return;\n\n // Reset focus when options are loaded\n if (itemsLoadState === \"success\") {\n if (searchInputRef.current) {\n setFocusedIndex(-1);\n searchInputRef.current.focus();\n }\n }\n }, [\n mounted,\n itemsLoadStateChanged,\n itemsLoadState,\n setFocusedIndex,\n disableItemFocus,\n ]);\n\n useEffect(() => {\n const filterItems = () => {\n if (searchValue === \"\") {\n return listItems;\n } else if (searchFunction) {\n return filterItemsByCustomSearch();\n } else {\n return filterItemsByLabel();\n }\n };\n\n setDisplayListItems(filterItems() ?? []);\n }, [\n filterItemsByCustomSearch,\n filterItemsByLabel,\n listItems,\n searchFunction,\n searchValue,\n ]);\n\n useEffect(() => {\n if (mounted) {\n // only run on mount\n return;\n }\n\n if (disableItemFocus || !displayListItems.length) return;\n\n const index = displayListItems.findIndex((item) =>\n checkListItemSelected(item)\n );\n\n // Focus search input if there is one\n if (searchInputRef.current) {\n setFocusedIndex(-1);\n setTimeout(() => searchInputRef.current?.focus(), 200); // Wait for animation\n } else if (focusedIndex > 0) {\n // Else focus on the specified element\n virtuosoRef.current?.scrollToIndex({\n index: focusedIndex,\n align: \"center\",\n });\n setTimeout(() => listItemRefs.current[focusedIndex]?.focus(), 200);\n } else if (index !== -1) {\n // Else focus on the selected element\n virtuosoRef.current?.scrollToIndex({ index, align: \"center\" });\n setFocusedIndex(index);\n setTimeout(() => listItemRefs.current[index]?.focus(), 200);\n } else {\n const firstEnabled = isOptionDisabled\n ? displayListItems.findIndex((item) => !isOptionDisabled(item))\n : 0;\n const startIndex = firstEnabled !== -1 ? firstEnabled : 0;\n virtuosoRef.current?.scrollToIndex({ index: startIndex });\n setFocusedIndex(startIndex);\n setTimeout(() => listItemRefs.current[startIndex]?.focus(), 200);\n }\n }, [\n checkListItemSelected,\n disableItemFocus,\n displayListItems,\n focusedIndex,\n mounted,\n setFocusedIndex,\n isOptionDisabled,\n ]);\n\n // =========================================================================\n // RENDER FUNCTIONS\n // =========================================================================\n const renderListItemIcon = (selected: boolean) => {\n if (multiSelect) {\n if (hasSelectedMax && !selected) {\n return <CheckboxDisabledIndicator aria-hidden />;\n }\n\n return selected ? (\n <CheckboxSelectedIndicator aria-hidden />\n ) : (\n <CheckboxUnselectedIndicator aria-hidden />\n );\n }\n\n return selected ? (\n <SelectedIndicator aria-hidden />\n ) : (\n <UnselectedIndicator />\n );\n };\n\n const renderDropdownLabel = (\n item: T,\n selected: boolean,\n disabled: boolean\n ) => {\n const { title, secondaryLabel } = getOptionLabel(item);\n\n return (\n <DropdownLabel\n displayType={labelDisplayType}\n label={title}\n maxLines={itemMaxLines}\n selected={selected}\n disabled={disabled}\n sublabel={secondaryLabel}\n truncationType={itemTruncationType}\n variant={variant}\n />\n );\n };\n\n const renderItem = (item: T, index: number) => {\n if (!onRetry || itemsLoadState === \"success\") {\n const selected = checkListItemSelected(item);\n const active = index === focusedIndex;\n const disabled =\n (!selected && hasSelectedMax) ||\n (!!isOptionDisabled && isOptionDisabled(item));\n return (\n <ListItem\n aria-selected={selected}\n aria-disabled={disabled}\n aria-posinset={index + 1}\n aria-setsize={displayListItems?.length}\n data-testid=\"list-item\"\n key={getItemKey(item, index)}\n onClick={() => handleListItemClick(item, index)}\n onMouseEnter={() => handleListItemHover(index)}\n ref={(element) => {\n listItemRefs.current[index] = element;\n }}\n role=\"option\"\n tabIndex={active ? 0 : -1}\n $active={active}\n $selected={selected}\n $disabled={disabled}\n >\n {renderListItem ? (\n renderListItem(item, { selected, disabled })\n ) : (\n <>\n {renderListItemIcon(selected)}\n {renderDropdownLabel(item, selected, disabled)}\n </>\n )}\n </ListItem>\n );\n }\n };\n\n const renderSearchInput = () => {\n if ((enableSearch || searchFunction) && itemsLoadState === \"success\") {\n return (\n <DropdownSearch\n ref={searchInputRef}\n onChange={handleSearchInputChange}\n value={searchValue}\n placeholder={searchPlaceholder}\n data-testid=\"search-input\"\n aria-label=\"Enter text to search\"\n onClear={handleOnClear}\n variant={variant}\n />\n );\n }\n };\n\n const renderSelectAll = () => {\n if (\n selectedItems &&\n multiSelect &&\n displayListItems.length > 0 &&\n !searchValue &&\n itemsLoadState === \"success\"\n ) {\n return (\n <SelectAllContainer>\n <SelectAllButton\n onClick={onSelectAll}\n type=\"button\"\n $variant={variant}\n >\n {maxSelectable || selectedItems.length !== 0\n ? clearAllButtonLabel\n : selectAllButtonLabel}\n </SelectAllButton>\n </SelectAllContainer>\n );\n }\n };\n\n const renderNoResults = () => {\n if (\n !hideNoResultsDisplay &&\n (searchValue || !enableSearch) &&\n displayListItems.length === 0 &&\n itemsLoadState === \"success\"\n ) {\n return (\n <>\n <ResultStateContainer data-testid=\"list-no-results\">\n <LabelIcon data-testid=\"no-result-icon\" />\n {noResultsLabel}\n </ResultStateContainer>\n {noResultsDescription && (\n <NoResultDescContainer data-testid=\"no-result-desc\">\n {noResultsDescription}\n </NoResultDescContainer>\n )}\n </>\n );\n }\n };\n\n const renderLoading = () => {\n if (onRetry && itemsLoadState === \"loading\") {\n return (\n <ResultStateContainer data-testid=\"list-loading\">\n <Spinner />\n Loading...\n </ResultStateContainer>\n );\n }\n };\n\n const renderTryAgain = () => {\n if (onRetry && itemsLoadState === \"fail\") {\n return (\n <ResultStateContainer data-testid=\"list-fail\">\n <LabelIcon data-testid=\"load-error-icon\" />\n Failed to load. \n <TryAgainButton\n onClick={handleTryAgain}\n type=\"button\"\n $variant={variant}\n >\n Try again.\n </TryAgainButton>\n </ResultStateContainer>\n );\n }\n };\n\n const renderVirtualisedList = () => {\n const isTestEnv = process.env.NODE_ENV === \"test\";\n\n return (\n <Virtuoso\n ref={virtuosoRef}\n style={{ height: \"100%\" }}\n data={displayListItems}\n customScrollParent={nodeRef.current ?? undefined}\n itemContent={(index, item) => renderItem(item, index)}\n components={{\n List: VirtuosoList,\n Item: VirtuosoItem,\n }}\n context={{\n listProps: {\n id: listboxId,\n role: \"listbox\",\n \"aria-multiselectable\": multiSelect,\n },\n listItemProps: {\n role: \"none\",\n },\n }}\n // disable virtualisation in tests\n // https://github.com/petyosi/react-virtuoso/issues/26#issuecomment-1040316576\n // explicitly set the `key` prop to avoid React warning\n key={isTestEnv ? displayListItems.length : undefined}\n // omit the `initialItemCount` prop to resolve NaN error\n {...(isTestEnv\n ? {\n initialItemCount: displayListItems.length,\n }\n : {})}\n />\n );\n };\n\n const renderList = () => {\n return (\n <List\n data-testid=\"dropdown-list\"\n role=\"group\"\n aria-label={ariaLabel}\n >\n {renderSearchInput()}\n {renderSelectAll()}\n {renderNoResults()}\n {renderLoading()}\n {renderTryAgain()}\n {renderVirtualisedList()}\n </List>\n );\n };\n\n const renderBottomCta = () => {\n if (!renderCustomCallToAction) {\n return;\n }\n\n // FIXME: implement onDismiss handling\n return (\n <div data-testid=\"custom-cta\">\n {renderCustomCallToAction(onDismiss as any, displayListItems)}\n </div>\n );\n };\n\n return (\n <Container\n data-testid=\"dropdown-container\"\n ref={mergeRefs(nodeRef, setFloatingRef)}\n style={styles}\n {...getFloatingProps()}\n $width={matchElementWidth ? elementWidth : undefined}\n $customWidth={width}\n $variant={variant}\n >\n <VisuallyHidden role=\"status\">{ariaLabel}</VisuallyHidden>\n {renderList()}\n {renderBottomCta()}\n </Container>\n );\n};\n\nexport const DropdownList = forwardRef(DropdownListInner);\n"],"names":["DropdownList","forwardRef","listItems","multiSelect","maxSelectable","selectedItems","disableItemFocus","itemsLoadState","itemTruncationType","itemMaxLines","labelDisplayType","variant","listboxId","ariaLabel","matchElementWidth","width","topScrollItem","onSelectItem","onSelectAll","onDismiss","onRetry","valueExtractor","listExtractor","isOptionDisabled","renderListItem","renderCustomCallToAction","enableSearch","hideNoResultsDisplay","noResultsDescription","_noResultsDescription","customLabels","searchPlaceholder","_searchPlaceholder","searchFunction","onSearch","ref","noResultsLabel","selectAllButtonLabel","clearAllButtonLabel","focusedIndex","setFocusedIndex","useContext","DropdownListStateContext","elementWidth","setFloatingRef","getFloatingProps","styles","useDropdownRender","searchValue","setSearchValue","useState","displayListItems","setDisplayListItems","itemsLoadStateChanged","useCompare","mounted","useIsMounted","nodeRef","useRef","listItemRefs","searchInputRef","virtuosoRef","hasSelectedMax","length","getOptionLabel","item","value","toString","title","secondaryLabel","checkListItemSelected","useCallback","find","arrItem","isEqual","filterItemsByCustomSearch","useEvent","filterItemsByLabel","filter","updatedSearchValue","trim","toLowerCase","includes","refocus","opts","current","setTimeout","_a","focus","items","undefined","index","forced","Math","max","min","scrollToIndex","align","selectedIndex","preferSelected","findIndex","nextIndex","_b","findNextEnabledIndex","startIndex","direction","handleListItemClick","upcomingIndex","getValue","handleSearchInputChange","event","target","handleOnClear","handleTryAgain","useEventListener","code","preventDefault","prevIndex","document","activeElement","useImperativeHandle","useEffect","scrollTo","top","timer","indexOf","clearTimeout","firstEnabled","_c","renderListItemIcon","selected","_jsx","CheckboxDisabledIndicator","CheckboxSelectedIndicator","CheckboxUnselectedIndicator","SelectedIndicator","UnselectedIndicator","renderDropdownLabel","disabled","DropdownLabel","displayType","label","maxLines","sublabel","truncationType","renderItem","active","ListItem","onClick","onMouseEnter","handleListItemHover","element","role","tabIndex","$active","$selected","$disabled","children","_jsxs","_Fragment","getItemKey","renderSearchInput","DropdownSearch","onChange","placeholder","onClear","renderSelectAll","SelectAllContainer","SelectAllButton","type","$variant","renderNoResults","ResultStateContainer","LabelIcon","NoResultDescContainer","renderLoading","Spinner","renderTryAgain","TryAgainButton","renderVirtualisedList","isTestEnv","process","env","NODE_ENV","Virtuoso","Object","assign","style","height","data","customScrollParent","itemContent","components","List","VirtuosoList","Item","VirtuosoItem","context","listProps","id","listItemProps","initialItemCount","Container","mergeRefs","$width","$customWidth","VisuallyHidden","renderBottomCta"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var e=require("../_virtual/_tslib.js"),t=require("react/jsx-runtime"),n=require("@floating-ui/react"),i=require("react"),r=require("./sidenav-context.js"),s=require("./sidenav-item.styles.js"),o=require("../external/react-resize-detector/build/index.esm.js");exports.SidenavItem=l=>{var{children:a,icon:c,title:d,onClick:u,selected:h}=l,g=e.__rest(l,["children","icon","title","onClick","selected"]);const{internalId:m,menuRef:f,currentItem:x,previouslySelectedItemId:I,selectedItem:p,setCurrentItem:v,setPreviouslySelectedItemId:j,setSelectedItem:y}=i.useContext(r.SidenavContext),C=g.id||d.toLowerCase().replaceAll(" ","-"),S=`${m}-drawer`,w=!!p&&p.itemId===C,R=!!x&&x.itemId===C,[b,q]=i.useState(!1),[F,P]=i.useState(null),[k,D]=i.useState(null),{floatingStyles:M,refs:O,context:$}=n.useFloating({open:b,onOpenChange:(e,t,n)=>{e?(f.current&&O.setPositionReference(f.current),a&&q(!0),"click"===n?G():"focus"!==n&&"hover"!==n||J()):(q(!1),K())},placement:"right",middleware:[n.size({apply({elements:e}){const t=e.reference.getBoundingClientRect().height,n=`${Math.max(0,t)}px`;e.floating.style.height=n}})],elements:{reference:F,floating:k}}),z=n.useClick($,{toggle:!1,stickIfOpen:!1}),_=n.useHover($,{handleClose:n.safePolygon()}),T=n.useFocus($,{visibleOnly:!1}),B=n.useDismiss($,{enabled:!!a}),{getReferenceProps:L,getFloatingProps:A}=n.useInteractions([z,T,_,B]),{isMounted:E,styles:H}=n.useTransitionStyles($);i.useEffect((()=>{h&&y({itemId:C,content:void 0})}),[C,h,y]),o.useResizeDetector({onResize:()=>{O.setPositionReference(f.current)},targetRef:f,refreshMode:"throttle",refreshRate:300});const G=()=>{j((()=>{if(a&&p)return I||p.itemId})()),v({itemId:C,content:a}),y({itemId:C,content:a}),u&&!a&&u(C)},J=()=>{v({itemId:C,content:a})},K=()=>{v((e=>{if((null==e?void 0:e.itemId)!==C)return e}))},N=a?{"aria-controls":S,"aria-haspopup":!0,"aria-expanded":R&&!!x.content||w&&!!p.content}:{};return t.jsxs(s.Container,{children:[t.jsxs(s.DefaultButton,Object.assign({type:"button",ref:P,"aria-current":w?"page":void 0},N,g,{$highlight:w||R},L(),{onMouseLeave:()=>{b&&v(void 0)},children:[t.jsx(s.IconContainer,{"aria-hidden":!0,children:c}),t.jsx(s.TitleText,{inline:!0,children:d})]})),E&&t.jsx(n.FloatingPortal,{children:t.jsx(n.FloatingFocusManager,{context:$,modal:!1,initialFocus:-1,children:t.jsx("div",Object.assign({id:S,"data-testid":"sidenav-drawer",ref:D,style:M},A(),{children:t.jsx(s.DesktopDrawer,{style:H,$showDrawer:b,$showShadow:R||w&&!x,children:a})}))})})]})};
|
|
1
|
+
"use strict";var e=require("../_virtual/_tslib.js"),t=require("react/jsx-runtime"),n=require("@floating-ui/react"),i=require("react"),r=require("./sidenav-context.js"),s=require("./sidenav-item.styles.js"),o=require("../external/react-resize-detector/build/index.esm.js");exports.SidenavItem=l=>{var{children:a,icon:c,title:d,onClick:u,selected:h}=l,g=e.__rest(l,["children","icon","title","onClick","selected"]);const{internalId:m,menuRef:f,currentItem:x,previouslySelectedItemId:I,selectedItem:p,setCurrentItem:v,setPreviouslySelectedItemId:j,setSelectedItem:y}=i.useContext(r.SidenavContext),C=g.id||d.toLowerCase().replaceAll(" ","-"),S=`${m}-drawer`,w=!!p&&p.itemId===C,R=!!x&&x.itemId===C,[b,q]=i.useState(!1),[F,P]=i.useState(null),[k,D]=i.useState(null),{floatingStyles:M,refs:O,context:$}=n.useFloating({open:b,onOpenChange:(e,t,n)=>{e?(f.current&&O.setPositionReference(f.current),a&&q(!0),"click"===n?G():"focus"!==n&&"hover"!==n||J()):(q(!1),K())},placement:"right",middleware:[n.size({apply({elements:e}){const t=e.reference.getBoundingClientRect().height,n=`${Math.max(0,t)}px`;e.floating.style.height=n}})],elements:{reference:F,floating:k}}),z=n.useClick($,{toggle:!1,stickIfOpen:!1}),_=n.useHover($,{handleClose:a?n.safePolygon():null}),T=n.useFocus($,{visibleOnly:!1}),B=n.useDismiss($,{enabled:!!a}),{getReferenceProps:L,getFloatingProps:A}=n.useInteractions([z,T,_,B]),{isMounted:E,styles:H}=n.useTransitionStyles($);i.useEffect((()=>{h&&y({itemId:C,content:void 0})}),[C,h,y]),o.useResizeDetector({onResize:()=>{O.setPositionReference(f.current)},targetRef:f,refreshMode:"throttle",refreshRate:300});const G=()=>{j((()=>{if(a&&p)return I||p.itemId})()),v({itemId:C,content:a}),y({itemId:C,content:a}),u&&!a&&u(C)},J=()=>{v({itemId:C,content:a})},K=()=>{v((e=>{if((null==e?void 0:e.itemId)!==C)return e}))},N=a?{"aria-controls":S,"aria-haspopup":!0,"aria-expanded":R&&!!x.content||w&&!!p.content}:{};return t.jsxs(s.Container,{children:[t.jsxs(s.DefaultButton,Object.assign({type:"button",ref:P,"aria-current":w?"page":void 0},N,g,{$highlight:w||R},L(),{onMouseLeave:()=>{b&&v(void 0)},children:[t.jsx(s.IconContainer,{"aria-hidden":!0,children:c}),t.jsx(s.TitleText,{inline:!0,children:d})]})),E&&t.jsx(n.FloatingPortal,{children:t.jsx(n.FloatingFocusManager,{context:$,modal:!1,initialFocus:-1,children:t.jsx("div",Object.assign({id:S,"data-testid":"sidenav-drawer",ref:D,style:M},A(),{children:t.jsx(s.DesktopDrawer,{style:H,$showDrawer:b,$showShadow:R||w&&!x,children:a})}))})})]})};
|
|
2
2
|
//# sourceMappingURL=sidenav-item.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sidenav-item.js","sources":["../../../src/sidenav/sidenav-item.tsx"],"sourcesContent":["import {\n FloatingFocusManager,\n FloatingPortal,\n OpenChangeReason,\n safePolygon,\n size,\n useClick,\n useDismiss,\n useFloating,\n useFocus,\n useHover,\n useInteractions,\n useTransitionStyles,\n} from \"@floating-ui/react\";\nimport { HTMLAttributes, useContext, useEffect, useState } from \"react\";\nimport { SidenavContext } from \"./sidenav-context\";\nimport {\n Container,\n DefaultButton,\n DesktopDrawer,\n IconContainer,\n TitleText,\n} from \"./sidenav-item.styles\";\nimport { SidenavItemProps } from \"./types\";\nimport { useResizeDetector } from \"react-resize-detector\";\n\nexport const SidenavItem = ({\n children,\n icon,\n title,\n onClick,\n selected,\n ...otherProps\n}: SidenavItemProps) => {\n // =========================================================================\n // CONST, STATE, REF\n // =========================================================================\n const {\n internalId,\n menuRef,\n currentItem,\n previouslySelectedItemId,\n selectedItem,\n setCurrentItem,\n setPreviouslySelectedItemId,\n setSelectedItem,\n } = useContext(SidenavContext);\n\n const id = otherProps.id || title.toLowerCase().replaceAll(\" \", \"-\");\n const drawerId = `${internalId}-drawer`;\n const isSelected = !!selectedItem && selectedItem.itemId === id;\n const isCurrent = !!currentItem && currentItem.itemId === id;\n const [isOpen, setIsOpen] = useState(false);\n\n const [anchorRef, setAnchorRef] = useState<HTMLButtonElement | null>(null);\n const [drawerRef, setDrawerRef] = useState<HTMLDivElement | null>(null);\n\n // =========================================================================\n // FLOATING UI\n // =========================================================================\n const { floatingStyles, refs, context } = useFloating({\n open: isOpen,\n onOpenChange: (open: boolean, _event, reason: OpenChangeReason) => {\n if (open) {\n if (menuRef.current) {\n refs.setPositionReference(menuRef.current);\n }\n\n if (children) {\n setIsOpen(true);\n }\n\n if (reason === \"click\") {\n handleSelect();\n } else if (reason === \"focus\" || reason === \"hover\") {\n handleHover();\n }\n } else {\n setIsOpen(false);\n handleDismiss();\n }\n },\n placement: \"right\",\n middleware: [\n size({\n apply({ elements }) {\n const height =\n elements.reference.getBoundingClientRect().height;\n const value = `${Math.max(0, height)}px`;\n\n elements.floating.style.height = value;\n },\n }),\n ],\n elements: {\n reference: anchorRef,\n floating: drawerRef,\n },\n });\n\n const click = useClick(context, {\n toggle: false,\n stickIfOpen: false,\n });\n const hover = useHover(context, {\n handleClose: safePolygon(),\n });\n const focus = useFocus(context, { visibleOnly: false });\n const dismiss = useDismiss(context, { enabled: !!children });\n\n const { getReferenceProps, getFloatingProps } = useInteractions([\n click,\n focus,\n hover,\n dismiss,\n ]);\n\n const { isMounted, styles } = useTransitionStyles(context);\n\n // =========================================================================\n // EFFECTS\n // =========================================================================\n useEffect(() => {\n if (selected) {\n setSelectedItem({ itemId: id, content: undefined });\n }\n }, [id, selected, setSelectedItem]);\n\n useResizeDetector({\n onResize: () => {\n // Sync the drawer height with menu height\n refs.setPositionReference(menuRef.current);\n },\n targetRef: menuRef,\n refreshMode: \"throttle\",\n refreshRate: 300,\n });\n\n // =========================================================================\n // HELPERS\n // =========================================================================\n const getPreviousSelectedItemId = (): string | undefined => {\n if (!children || !selectedItem) return undefined;\n if (previouslySelectedItemId) {\n return previouslySelectedItemId;\n }\n return selectedItem.itemId;\n };\n\n const handleSelect = () => {\n setPreviouslySelectedItemId(getPreviousSelectedItemId());\n setCurrentItem({ itemId: id, content: children });\n setSelectedItem({\n itemId: id,\n content: children,\n });\n if (onClick && !children) {\n onClick(id);\n }\n };\n\n const handleHover = () => {\n setCurrentItem({ itemId: id, content: children });\n };\n\n const handleMouseLeave = () => {\n if (isOpen) {\n setCurrentItem(undefined);\n }\n };\n\n const handleDismiss = () => {\n setCurrentItem((current) => {\n if (current?.itemId === id) {\n return undefined;\n }\n return current;\n });\n };\n\n // =========================================================================\n // RENDER FUNCTIONS\n // =========================================================================\n const ariaControlProps: HTMLAttributes<HTMLButtonElement> = children\n ? {\n \"aria-controls\": drawerId,\n \"aria-haspopup\": true,\n \"aria-expanded\":\n (isCurrent && !!currentItem.content) ||\n (isSelected && !!selectedItem.content),\n }\n : {};\n\n return (\n <Container>\n <DefaultButton\n type=\"button\"\n ref={setAnchorRef}\n aria-current={isSelected ? \"page\" : undefined}\n {...ariaControlProps}\n {...otherProps}\n $highlight={isSelected || isCurrent}\n {...getReferenceProps()}\n onMouseLeave={handleMouseLeave}\n >\n <IconContainer aria-hidden>{icon}</IconContainer>\n <TitleText inline>{title}</TitleText>\n </DefaultButton>\n {isMounted && (\n <FloatingPortal>\n <FloatingFocusManager\n context={context}\n modal={false}\n initialFocus={-1}\n >\n <div\n id={drawerId}\n data-testid=\"sidenav-drawer\"\n ref={setDrawerRef}\n style={floatingStyles}\n {...getFloatingProps()}\n >\n <DesktopDrawer\n style={styles}\n $showDrawer={isOpen}\n $showShadow={\n isCurrent || (isSelected && !currentItem)\n }\n >\n {children}\n </DesktopDrawer>\n </div>\n </FloatingFocusManager>\n </FloatingPortal>\n )}\n </Container>\n );\n};\n"],"names":["_a","children","icon","title","onClick","selected","otherProps","__rest","internalId","menuRef","currentItem","previouslySelectedItemId","selectedItem","setCurrentItem","setPreviouslySelectedItemId","setSelectedItem","useContext","SidenavContext","id","toLowerCase","replaceAll","drawerId","isSelected","itemId","isCurrent","isOpen","setIsOpen","useState","anchorRef","setAnchorRef","drawerRef","setDrawerRef","floatingStyles","refs","context","useFloating","open","onOpenChange","_event","reason","current","setPositionReference","handleSelect","handleHover","handleDismiss","placement","middleware","size","apply","elements","height","reference","getBoundingClientRect","value","Math","max","floating","style","click","useClick","toggle","stickIfOpen","hover","useHover","handleClose","safePolygon","focus","useFocus","visibleOnly","dismiss","useDismiss","enabled","getReferenceProps","getFloatingProps","useInteractions","isMounted","styles","useTransitionStyles","useEffect","content","undefined","useResizeDetector","onResize","targetRef","refreshMode","refreshRate","getPreviousSelectedItemId","ariaControlProps","_jsxs","Container","DefaultButton","Object","assign","type","ref","$highlight","onMouseLeave","_jsx","IconContainer","TitleText","inline","FloatingPortal","FloatingFocusManager","modal","initialFocus","DesktopDrawer","$showDrawer","$showShadow"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sidenav-item.js","sources":["../../../src/sidenav/sidenav-item.tsx"],"sourcesContent":["import {\n FloatingFocusManager,\n FloatingPortal,\n OpenChangeReason,\n safePolygon,\n size,\n useClick,\n useDismiss,\n useFloating,\n useFocus,\n useHover,\n useInteractions,\n useTransitionStyles,\n} from \"@floating-ui/react\";\nimport { HTMLAttributes, useContext, useEffect, useState } from \"react\";\nimport { SidenavContext } from \"./sidenav-context\";\nimport {\n Container,\n DefaultButton,\n DesktopDrawer,\n IconContainer,\n TitleText,\n} from \"./sidenav-item.styles\";\nimport { SidenavItemProps } from \"./types\";\nimport { useResizeDetector } from \"react-resize-detector\";\n\nexport const SidenavItem = ({\n children,\n icon,\n title,\n onClick,\n selected,\n ...otherProps\n}: SidenavItemProps) => {\n // =========================================================================\n // CONST, STATE, REF\n // =========================================================================\n const {\n internalId,\n menuRef,\n currentItem,\n previouslySelectedItemId,\n selectedItem,\n setCurrentItem,\n setPreviouslySelectedItemId,\n setSelectedItem,\n } = useContext(SidenavContext);\n\n const id = otherProps.id || title.toLowerCase().replaceAll(\" \", \"-\");\n const drawerId = `${internalId}-drawer`;\n const isSelected = !!selectedItem && selectedItem.itemId === id;\n const isCurrent = !!currentItem && currentItem.itemId === id;\n const [isOpen, setIsOpen] = useState(false);\n\n const [anchorRef, setAnchorRef] = useState<HTMLButtonElement | null>(null);\n const [drawerRef, setDrawerRef] = useState<HTMLDivElement | null>(null);\n\n // =========================================================================\n // FLOATING UI\n // =========================================================================\n const { floatingStyles, refs, context } = useFloating({\n open: isOpen,\n onOpenChange: (open: boolean, _event, reason: OpenChangeReason) => {\n if (open) {\n if (menuRef.current) {\n refs.setPositionReference(menuRef.current);\n }\n\n if (children) {\n setIsOpen(true);\n }\n\n if (reason === \"click\") {\n handleSelect();\n } else if (reason === \"focus\" || reason === \"hover\") {\n handleHover();\n }\n } else {\n setIsOpen(false);\n handleDismiss();\n }\n },\n placement: \"right\",\n middleware: [\n size({\n apply({ elements }) {\n const height =\n elements.reference.getBoundingClientRect().height;\n const value = `${Math.max(0, height)}px`;\n\n elements.floating.style.height = value;\n },\n }),\n ],\n elements: {\n reference: anchorRef,\n floating: drawerRef,\n },\n });\n\n const click = useClick(context, {\n toggle: false,\n stickIfOpen: false,\n });\n const hover = useHover(context, {\n handleClose: children ? safePolygon() : null,\n });\n const focus = useFocus(context, { visibleOnly: false });\n const dismiss = useDismiss(context, { enabled: !!children });\n\n const { getReferenceProps, getFloatingProps } = useInteractions([\n click,\n focus,\n hover,\n dismiss,\n ]);\n\n const { isMounted, styles } = useTransitionStyles(context);\n\n // =========================================================================\n // EFFECTS\n // =========================================================================\n useEffect(() => {\n if (selected) {\n setSelectedItem({ itemId: id, content: undefined });\n }\n }, [id, selected, setSelectedItem]);\n\n useResizeDetector({\n onResize: () => {\n // Sync the drawer height with menu height\n refs.setPositionReference(menuRef.current);\n },\n targetRef: menuRef,\n refreshMode: \"throttle\",\n refreshRate: 300,\n });\n\n // =========================================================================\n // HELPERS\n // =========================================================================\n const getPreviousSelectedItemId = (): string | undefined => {\n if (!children || !selectedItem) return undefined;\n if (previouslySelectedItemId) {\n return previouslySelectedItemId;\n }\n return selectedItem.itemId;\n };\n\n const handleSelect = () => {\n setPreviouslySelectedItemId(getPreviousSelectedItemId());\n setCurrentItem({ itemId: id, content: children });\n setSelectedItem({\n itemId: id,\n content: children,\n });\n if (onClick && !children) {\n onClick(id);\n }\n };\n\n const handleHover = () => {\n setCurrentItem({ itemId: id, content: children });\n };\n\n const handleMouseLeave = () => {\n if (isOpen) {\n setCurrentItem(undefined);\n }\n };\n\n const handleDismiss = () => {\n setCurrentItem((current) => {\n if (current?.itemId === id) {\n return undefined;\n }\n return current;\n });\n };\n\n // =========================================================================\n // RENDER FUNCTIONS\n // =========================================================================\n const ariaControlProps: HTMLAttributes<HTMLButtonElement> = children\n ? {\n \"aria-controls\": drawerId,\n \"aria-haspopup\": true,\n \"aria-expanded\":\n (isCurrent && !!currentItem.content) ||\n (isSelected && !!selectedItem.content),\n }\n : {};\n\n return (\n <Container>\n <DefaultButton\n type=\"button\"\n ref={setAnchorRef}\n aria-current={isSelected ? \"page\" : undefined}\n {...ariaControlProps}\n {...otherProps}\n $highlight={isSelected || isCurrent}\n {...getReferenceProps()}\n onMouseLeave={handleMouseLeave}\n >\n <IconContainer aria-hidden>{icon}</IconContainer>\n <TitleText inline>{title}</TitleText>\n </DefaultButton>\n {isMounted && (\n <FloatingPortal>\n <FloatingFocusManager\n context={context}\n modal={false}\n initialFocus={-1}\n >\n <div\n id={drawerId}\n data-testid=\"sidenav-drawer\"\n ref={setDrawerRef}\n style={floatingStyles}\n {...getFloatingProps()}\n >\n <DesktopDrawer\n style={styles}\n $showDrawer={isOpen}\n $showShadow={\n isCurrent || (isSelected && !currentItem)\n }\n >\n {children}\n </DesktopDrawer>\n </div>\n </FloatingFocusManager>\n </FloatingPortal>\n )}\n </Container>\n );\n};\n"],"names":["_a","children","icon","title","onClick","selected","otherProps","__rest","internalId","menuRef","currentItem","previouslySelectedItemId","selectedItem","setCurrentItem","setPreviouslySelectedItemId","setSelectedItem","useContext","SidenavContext","id","toLowerCase","replaceAll","drawerId","isSelected","itemId","isCurrent","isOpen","setIsOpen","useState","anchorRef","setAnchorRef","drawerRef","setDrawerRef","floatingStyles","refs","context","useFloating","open","onOpenChange","_event","reason","current","setPositionReference","handleSelect","handleHover","handleDismiss","placement","middleware","size","apply","elements","height","reference","getBoundingClientRect","value","Math","max","floating","style","click","useClick","toggle","stickIfOpen","hover","useHover","handleClose","safePolygon","focus","useFocus","visibleOnly","dismiss","useDismiss","enabled","getReferenceProps","getFloatingProps","useInteractions","isMounted","styles","useTransitionStyles","useEffect","content","undefined","useResizeDetector","onResize","targetRef","refreshMode","refreshRate","getPreviousSelectedItemId","ariaControlProps","_jsxs","Container","DefaultButton","Object","assign","type","ref","$highlight","onMouseLeave","_jsx","IconContainer","TitleText","inline","FloatingPortal","FloatingFocusManager","modal","initialFocus","DesktopDrawer","$showDrawer","$showShadow"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var e=require("react/jsx-runtime"),r=require("react");require("../util/calendar-helper.js"),require("../util/date-helper.js"),require("../util/date-input-helper.js");var t=require("../util/simple-id-generator.js");require("../util/string-helper.js"),require("@react-aria/live-announcer");var i=require("./tab-context.js");const n=({children:n,currentActive:u,initialActive:a=0,onTabClick:s})=>{const[l,c]=r.useState(null!=u?u:a),[o,d]=r.useState([]),v=t.useId(),b=r.useMemo((()=>({instanceId:v,tabLinks:o,currentActiveIndex:l,setCurrentActiveIndex:c,setTabLinks:d,controlledMode:"number"==typeof u,onTabClick:s,isContextProvided:!0})),[l,u,v,s,o]);return r.useEffect((()=>{"number"==typeof u&&c(u)}),[u]),e.jsx(i.TabContext.Provider,{value:b,children:n})};n.displayName="Tab.Context",exports.TabContextProvider=n;
|
|
2
|
+
//# sourceMappingURL=tab-context-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tab-context-provider.js","sources":["../../../src/tab/tab-context-provider.tsx"],"sourcesContent":["import { useEffect, useMemo, useState } from \"react\";\n\nimport { useId } from \"../util\";\nimport type { TabLinkProps } from \"./tab-context\";\nimport { TabContext } from \"./tab-context\";\nimport type { TabContextProps } from \"./types\";\n\nexport const TabContextProvider = ({\n children,\n currentActive: currentActiveIndex,\n initialActive = 0,\n onTabClick,\n}: TabContextProps) => {\n // =========================================================================\n // CONST, STATE, REFS\n // =========================================================================\n const [currentActive, setCurrentActive] = useState<number>(\n currentActiveIndex ?? initialActive\n );\n const [tabLinks, setTabLinks] = useState<TabLinkProps[]>([]);\n const instanceId = useId();\n\n const tabContextValue = useMemo(\n () => ({\n instanceId,\n tabLinks,\n currentActiveIndex: currentActive,\n setCurrentActiveIndex: setCurrentActive,\n setTabLinks,\n controlledMode: typeof currentActiveIndex === \"number\",\n onTabClick,\n isContextProvided: true,\n }),\n [currentActive, currentActiveIndex, instanceId, onTabClick, tabLinks]\n );\n\n // =========================================================================\n // EFFECTS\n // =========================================================================\n useEffect(() => {\n if (typeof currentActiveIndex === \"number\") {\n setCurrentActive(currentActiveIndex);\n }\n }, [currentActiveIndex]);\n\n // =========================================================================\n // RENDER FUNCTIONS\n // =========================================================================\n return (\n <TabContext.Provider value={tabContextValue}>\n {children}\n </TabContext.Provider>\n );\n};\n\nTabContextProvider.displayName = \"Tab.Context\";\n"],"names":["TabContextProvider","children","currentActive","currentActiveIndex","initialActive","onTabClick","setCurrentActive","useState","tabLinks","setTabLinks","instanceId","useId","tabContextValue","useMemo","setCurrentActiveIndex","controlledMode","isContextProvided","useEffect","_jsx","TabContext","Provider","value","displayName"],"mappings":"+UAOO,MAAMA,EAAqB,EAC9BC,WACAC,cAAeC,EACfC,gBAAgB,EAChBC,iBAKA,MAAOH,EAAeI,GAAoBC,WACtCJ,QAAAA,EAAsBC,IAEnBI,EAAUC,GAAeF,EAAAA,SAAyB,IACnDG,EAAaC,EAAAA,QAEbC,EAAkBC,EAAAA,SACpB,KAAA,CACIH,aACAF,WACAL,mBAAoBD,EACpBY,sBAAuBR,EACvBG,cACAM,eAA8C,iBAAvBZ,EACvBE,aACAW,mBAAmB,KAEvB,CAACd,EAAeC,EAAoBO,EAAYL,EAAYG,IAehE,OATAS,EAAAA,WAAU,KAC4B,iBAAvBd,GACPG,EAAiBH,EACrB,GACD,CAACA,IAMAe,EAAAA,IAACC,EAAAA,WAAWC,SAAQ,CAACC,MAAOT,EAAeX,SACtCA,GACiB,EAI9BD,EAAmBsB,YAAc"}
|
package/cjs/tab/tab-context.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";function
|
|
1
|
+
"use strict";function e(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}const t=()=>{},n=e(require("react")).default.createContext({instanceId:"",currentActiveIndex:0,tabLinks:[],setCurrentActiveIndex:t,setTabLinks:t,controlledMode:!1,isContextProvided:!1});exports.TabContext=n,exports.noop=t;
|
|
2
2
|
//# sourceMappingURL=tab-context.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tab-context.js","sources":["../../../src/tab/tab-context.tsx"],"sourcesContent":["import React, { Dispatch, SetStateAction } from \"react\";\nimport { TabItemProps } from \"./types\";\n\nexport type TabLinkProps = Pick<TabItemProps, \"title\" | \"width\" | \"titleAddon\">;\n\ninterface TabContextProps {\n currentActiveIndex: number;\n tabLinks: TabLinkProps[];\n setCurrentActiveIndex: Dispatch<SetStateAction<number>>;\n}\n\nexport const noop = () => {\n // does nothing\n};\n\n// =============================================================================\n// CONTEXT\n// =============================================================================\nexport const TabContext = React.createContext<TabContextProps>({\n currentActiveIndex: 0,\n tabLinks: [],\n setCurrentActiveIndex: noop,\n});\n"],"names":["noop","TabContext","React","createContext","currentActiveIndex","tabLinks","setCurrentActiveIndex"],"mappings":"
|
|
1
|
+
{"version":3,"file":"tab-context.js","sources":["../../../src/tab/tab-context.tsx"],"sourcesContent":["import React, { Dispatch, SetStateAction } from \"react\";\nimport { TabItemProps } from \"./types\";\n\nexport type TabLinkProps = Pick<TabItemProps, \"title\" | \"width\" | \"titleAddon\">;\n\ninterface TabContextProps {\n instanceId: string;\n currentActiveIndex: number;\n tabLinks: TabLinkProps[];\n setCurrentActiveIndex: Dispatch<SetStateAction<number>>;\n setTabLinks: (links: TabLinkProps[]) => void;\n controlledMode: boolean;\n onTabClick?: ((title: string, index: number) => void) | undefined;\n isContextProvided: boolean;\n}\n\nexport const noop = () => {\n // does nothing\n};\n\n// =============================================================================\n// CONTEXT\n// =============================================================================\nexport const TabContext = React.createContext<TabContextProps>({\n instanceId: \"\",\n currentActiveIndex: 0,\n tabLinks: [],\n setCurrentActiveIndex: noop,\n setTabLinks: noop,\n controlledMode: false,\n isContextProvided: false,\n});\n"],"names":["noop","TabContext","React","createContext","instanceId","currentActiveIndex","tabLinks","setCurrentActiveIndex","setTabLinks","controlledMode","isContextProvided"],"mappings":"qFAgBO,MAAMA,EAAO,OAOPC,sBAAaC,QAAMC,cAA+B,CAC3DC,WAAY,GACZC,mBAAoB,EACpBC,SAAU,GACVC,sBAAuBP,EACvBQ,YAAaR,EACbS,gBAAgB,EAChBC,mBAAmB"}
|
package/cjs/tab/tab-item.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var e=require("../_virtual/_tslib.js"),t=require("react/jsx-runtime"),r=require("react"),n=require("./tab-context.js");const i=i=>{var{index:a,children:s,titleAddon:d}=i,
|
|
1
|
+
"use strict";var e=require("../_virtual/_tslib.js"),t=require("react/jsx-runtime"),r=require("react"),n=require("./tab-context.js");const i=i=>{var{index:a,children:s,titleAddon:d}=i,l=e.__rest(i,["index","children","titleAddon"]);const{currentActiveIndex:c,instanceId:b}=r.useContext(n.TabContext);return c===a?t.jsx("div",Object.assign({role:"tabpanel","aria-labelledby":`${b}-tab-${a}`,tabIndex:0},l,{children:s})):null};i.displayName="Tab.Item",exports.TabItem=i;
|
|
2
2
|
//# sourceMappingURL=tab-item.js.map
|
package/cjs/tab/tab-item.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tab-item.js","sources":["../../../src/tab/tab-item.tsx"],"sourcesContent":["import { useContext } from \"react\";\nimport { TabItemProps } from \"./types\";\nimport { TabContext } from \"./tab-context\";\n\nexport interface TabItemComponentProps extends TabItemProps {\n index?: number | undefined; // injected\n}\n\nexport const TabItem = ({\n index,\n children,\n titleAddon: _titleAddon, // destructure so it doesn't get passed into the dom\n ...otherProps\n}: TabItemComponentProps) => {\n // =========================================================================\n // CONST, STATE, REFS\n // =========================================================================\n const { currentActiveIndex } = useContext(TabContext);\n\n // =========================================================================\n // RENDER FUNCTIONS\n // =========================================================================\n return currentActiveIndex === index ? (\n <div
|
|
1
|
+
{"version":3,"file":"tab-item.js","sources":["../../../src/tab/tab-item.tsx"],"sourcesContent":["import { useContext } from \"react\";\nimport { TabItemProps } from \"./types\";\nimport { TabContext } from \"./tab-context\";\n\nexport interface TabItemComponentProps extends TabItemProps {\n index?: number | undefined; // injected\n}\n\nexport const TabItem = ({\n index,\n children,\n titleAddon: _titleAddon, // destructure so it doesn't get passed into the dom\n ...otherProps\n}: TabItemComponentProps) => {\n // =========================================================================\n // CONST, STATE, REFS\n // =========================================================================\n const { currentActiveIndex, instanceId } = useContext(TabContext);\n\n // =========================================================================\n // RENDER FUNCTIONS\n // =========================================================================\n return currentActiveIndex === index ? (\n <div\n role=\"tabpanel\"\n aria-labelledby={`${instanceId}-tab-${index}`}\n tabIndex={0}\n {...otherProps}\n >\n {children}\n </div>\n ) : null;\n};\n\nTabItem.displayName = \"Tab.Item\";\n"],"names":["TabItem","_a","index","children","titleAddon","_titleAddon","otherProps","__rest","currentActiveIndex","instanceId","useContext","TabContext","_jsx","Object","assign","role","tabIndex","displayName"],"mappings":"oIAQO,MAAMA,EAAWC,QAAAC,MACpBA,EAAKC,SACLA,EACAC,WAAYC,GAAWJ,EACpBK,EAAUC,EAAAA,OAAAN,EAJO,mCASpB,MAAMO,mBAAEA,EAAkBC,WAAEA,GAAeC,EAAAA,WAAWC,EAAAA,YAKtD,OAAOH,IAAuBN,EAC1BU,EAAAA,IAAA,MAAAC,OAAAC,OAAA,CACIC,KAAK,WAAU,kBACE,GAAGN,SAAkBP,IACtCc,SAAU,GACNV,EAAU,CAAAH,SAEbA,KAEL,IAAI,EAGZH,EAAQiB,YAAc"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var e=require("react/jsx-runtime"),t=require("react"),n=require("../external/react-responsive/dist/react-responsive.js"),r=require("styled-components"),i=require("../theme/index.js"),l=require("./tab-context.js"),o=require("./tab-link-chain.style.js");exports.TabLinkChain=({controlledMode:a,"data-testid":s,onTabClick:d,fullWidthIndicatorLine:
|
|
1
|
+
"use strict";var e=require("react/jsx-runtime"),t=require("react"),n=require("../external/react-responsive/dist/react-responsive.js"),r=require("styled-components"),i=require("../theme/index.js"),l=require("./tab-context.js"),o=require("./tab-link-chain.style.js");exports.TabLinkChain=({controlledMode:a,"data-testid":s,onTabClick:d,fullWidthIndicatorLine:c,fadeColor:u})=>{const{setCurrentActiveIndex:h,currentActiveIndex:x,tabLinks:p,instanceId:f}=t.useContext(l.TabContext),C=t.useContext(r.ThemeContext),v=i.Breakpoint["md-max"]({theme:C}),b=n.reactResponsiveExports.useMediaQuery({maxWidth:v}),m=i.Breakpoint["lg-max"]({theme:C}),g=t.useRef(null),j=t.useRef([]),k=t.useRef(null),$=e=>t=>{t.preventDefault(),t.stopPropagation(),a||h(e),d&&d(p[e].title,e)},L=e=>b&&e.length>20?`${e.substring(0,20)}...`:e;return e.jsx(o.CustomFadeWrapper,{onResize:({content:e,wrapper:t})=>{e&&t&&window.innerWidth<=m&&g.current&&k.current&&(e.scrollLeft=g.current.getBoundingClientRect().left-k.current.getBoundingClientRect().left)},"data-testid":s,fadeColor:u,children:e.jsx(o.Chain,{role:"tablist",$fullWidthIndicatorLine:c,ref:k,children:p.map((({title:t,width:n,titleAddon:r},i)=>{const l=x===i;return e.jsx(o.ChainItem,{role:"none",$active:l,ref:l?g:null,$width:n,children:e.jsxs(o.ChainLink,{role:"none",onClick:$(i),"data-testid":`${s}-link-${i}`,$reversed:"left"===(null==r?void 0:r.position),children:[e.jsxs(o.LabelContainer,{role:"none",children:[e.jsx(o.Label,{$active:l,onClick:$(i),"aria-hidden":"true",children:L(t)}),e.jsx(o.BoldLabel,{role:"tab",id:`${f}-tab-${i}`,type:"button","aria-selected":l,tabIndex:l?0:-1,onKeyDown:e=>((e,t)=>{var n;let r=t;"ArrowRight"===e.key?(r=(t+1)%p.length,e.preventDefault()):"ArrowLeft"===e.key&&(r=(t-1+p.length)%p.length,e.preventDefault()),null===(n=j.current[r])||void 0===n||n.focus()})(e,i),ref:e=>j.current[i]=e,$active:l,children:L(t)})]}),null==r?void 0:r.content]})},i)}))})})};
|
|
2
2
|
//# sourceMappingURL=tab-link-chain.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tab-link-chain.js","sources":["../../../src/tab/tab-link-chain.tsx"],"sourcesContent":["import { useContext, useRef } from \"react\";\nimport { useMediaQuery } from \"react-responsive\";\nimport { ThemeContext } from \"styled-components\";\nimport { ResizeCallbackParams } from \"../shared/fade-wrapper\";\nimport { Breakpoint } from \"../theme\";\nimport { TabContext } from \"./tab-context\";\nimport {\n BoldLabel,\n Chain,\n ChainItem,\n ChainLink,\n CustomFadeWrapper,\n Label,\n LabelContainer,\n} from \"./tab-link-chain.style\";\nimport { TabProps } from \"./types\";\n\ninterface Props\n extends Pick<\n TabProps,\n \"fullWidthIndicatorLine\" | \"onTabClick\" | \"data-testid\" | \"fadeColor\"\n > {\n controlledMode?: boolean | undefined;\n}\n\nexport const TabLinkChain = ({\n controlledMode,\n \"data-testid\": testId,\n onTabClick,\n fullWidthIndicatorLine,\n fadeColor,\n}: Props) => {\n // =========================================================================\n // CONST, STATE, REFS\n // =========================================================================\n const { setCurrentActiveIndex, currentActiveIndex, tabLinks } =\n useContext(TabContext);\n\n const theme = useContext(ThemeContext);\n const mobileBreakpoint = Breakpoint[\"md-max\"]({ theme });\n\n const isMobile = useMediaQuery({\n maxWidth: mobileBreakpoint,\n });\n\n const tabletBreakpoint = Breakpoint[\"lg-max\"]({ theme });\n\n const activeLinkRef = useRef<HTMLLIElement>(null);\n const chainLinkRefs = useRef<(HTMLButtonElement | null)[]>([]);\n const chainRef = useRef<HTMLUListElement | null>(null);\n\n // =========================================================================\n // EVENT HANDLERS\n // =========================================================================\n const handleChainLinkClick =\n (index: number) =>\n (event: React.MouseEvent<HTMLButtonElement | HTMLDivElement>) => {\n event.preventDefault();\n event.stopPropagation();\n if (!controlledMode) {\n setCurrentActiveIndex(index);\n }\n\n if (onTabClick) {\n onTabClick(tabLinks[index].title, index);\n }\n };\n\n const handleResize = ({ content, wrapper }: ResizeCallbackParams) => {\n if (\n content &&\n wrapper &&\n window.innerWidth <= tabletBreakpoint &&\n activeLinkRef.current &&\n chainRef.current\n ) {\n content.scrollLeft =\n activeLinkRef.current.getBoundingClientRect().left -\n chainRef.current.getBoundingClientRect().left;\n }\n };\n\n const handleKeyDown = (e: React.KeyboardEvent, index: number) => {\n let nextIndex = index;\n if (e.key === \"ArrowRight\") {\n nextIndex = (index + 1) % tabLinks.length;\n e.preventDefault();\n } else if (e.key === \"ArrowLeft\") {\n nextIndex = (index - 1 + tabLinks.length) % tabLinks.length;\n e.preventDefault();\n }\n\n chainLinkRefs.current[nextIndex]?.focus();\n };\n\n // =========================================================================\n // HELPER FUNCTIONS\n // =========================================================================\n const truncateText = (value: string) => {\n if (isMobile) {\n return value.length > 20 ? `${value.substring(0, 20)}...` : value;\n }\n\n return value;\n };\n\n // =========================================================================\n // RENDER FUNCTIONS\n // =========================================================================\n return (\n <CustomFadeWrapper\n onResize={handleResize}\n data-testid={testId}\n fadeColor={fadeColor}\n >\n <Chain\n role=\"tablist\"\n $fullWidthIndicatorLine={fullWidthIndicatorLine}\n ref={chainRef}\n >\n {tabLinks.map(({ title, width, titleAddon }, index) => {\n const isActive = currentActiveIndex === index;\n\n return (\n <ChainItem\n key={index}\n role=\"none\"\n $active={isActive}\n ref={isActive ? activeLinkRef : null}\n $width={width}\n >\n <ChainLink\n role=\"none\"\n onClick={handleChainLinkClick(index)}\n data-testid={`${testId}-link-${index}`}\n $reversed={titleAddon?.position === \"left\"}\n >\n <LabelContainer role=\"none\">\n <Label\n $active={isActive}\n onClick={handleChainLinkClick(index)}\n aria-hidden=\"true\"\n >\n {truncateText(title)}\n </Label>\n <BoldLabel\n role=\"tab\"\n type=\"button\"\n aria-selected={isActive}\n tabIndex={isActive ? 0 : -1}\n onKeyDown={(e) =>\n handleKeyDown(e, index)\n }\n ref={(el) =>\n (chainLinkRefs.current[index] = el)\n }\n $active={isActive}\n >\n {truncateText(title)}\n </BoldLabel>\n </LabelContainer>\n {titleAddon?.content}\n </ChainLink>\n </ChainItem>\n );\n })}\n </Chain>\n </CustomFadeWrapper>\n );\n};\n"],"names":["controlledMode","testId","onTabClick","fullWidthIndicatorLine","fadeColor","setCurrentActiveIndex","currentActiveIndex","tabLinks","useContext","TabContext","theme","ThemeContext","mobileBreakpoint","Breakpoint","isMobile","useMediaQuery","maxWidth","tabletBreakpoint","activeLinkRef","useRef","chainLinkRefs","chainRef","handleChainLinkClick","index","event","preventDefault","stopPropagation","title","truncateText","value","length","substring","_jsx","CustomFadeWrapper","onResize","content","wrapper","window","innerWidth","current","scrollLeft","getBoundingClientRect","left","children","Chain","role","$fullWidthIndicatorLine","ref","map","width","titleAddon","isActive","ChainItem","$active","
|
|
1
|
+
{"version":3,"file":"tab-link-chain.js","sources":["../../../src/tab/tab-link-chain.tsx"],"sourcesContent":["import { useContext, useRef } from \"react\";\nimport { useMediaQuery } from \"react-responsive\";\nimport { ThemeContext } from \"styled-components\";\nimport { ResizeCallbackParams } from \"../shared/fade-wrapper\";\nimport { Breakpoint } from \"../theme\";\nimport { TabContext } from \"./tab-context\";\nimport {\n BoldLabel,\n Chain,\n ChainItem,\n ChainLink,\n CustomFadeWrapper,\n Label,\n LabelContainer,\n} from \"./tab-link-chain.style\";\nimport { TabProps } from \"./types\";\n\ninterface Props\n extends Pick<\n TabProps,\n \"fullWidthIndicatorLine\" | \"onTabClick\" | \"data-testid\" | \"fadeColor\"\n > {\n controlledMode?: boolean | undefined;\n}\n\nexport const TabLinkChain = ({\n controlledMode,\n \"data-testid\": testId,\n onTabClick,\n fullWidthIndicatorLine,\n fadeColor,\n}: Props) => {\n // =========================================================================\n // CONST, STATE, REFS\n // =========================================================================\n const { setCurrentActiveIndex, currentActiveIndex, tabLinks, instanceId } =\n useContext(TabContext);\n\n const theme = useContext(ThemeContext);\n const mobileBreakpoint = Breakpoint[\"md-max\"]({ theme });\n\n const isMobile = useMediaQuery({\n maxWidth: mobileBreakpoint,\n });\n\n const tabletBreakpoint = Breakpoint[\"lg-max\"]({ theme });\n\n const activeLinkRef = useRef<HTMLLIElement>(null);\n const chainLinkRefs = useRef<(HTMLButtonElement | null)[]>([]);\n const chainRef = useRef<HTMLUListElement | null>(null);\n\n // =========================================================================\n // EVENT HANDLERS\n // =========================================================================\n const handleChainLinkClick =\n (index: number) =>\n (event: React.MouseEvent<HTMLButtonElement | HTMLDivElement>) => {\n event.preventDefault();\n event.stopPropagation();\n if (!controlledMode) {\n setCurrentActiveIndex(index);\n }\n\n if (onTabClick) {\n onTabClick(tabLinks[index].title, index);\n }\n };\n\n const handleResize = ({ content, wrapper }: ResizeCallbackParams) => {\n if (\n content &&\n wrapper &&\n window.innerWidth <= tabletBreakpoint &&\n activeLinkRef.current &&\n chainRef.current\n ) {\n content.scrollLeft =\n activeLinkRef.current.getBoundingClientRect().left -\n chainRef.current.getBoundingClientRect().left;\n }\n };\n\n const handleKeyDown = (e: React.KeyboardEvent, index: number) => {\n let nextIndex = index;\n if (e.key === \"ArrowRight\") {\n nextIndex = (index + 1) % tabLinks.length;\n e.preventDefault();\n } else if (e.key === \"ArrowLeft\") {\n nextIndex = (index - 1 + tabLinks.length) % tabLinks.length;\n e.preventDefault();\n }\n\n chainLinkRefs.current[nextIndex]?.focus();\n };\n\n // =========================================================================\n // HELPER FUNCTIONS\n // =========================================================================\n const truncateText = (value: string) => {\n if (isMobile) {\n return value.length > 20 ? `${value.substring(0, 20)}...` : value;\n }\n\n return value;\n };\n\n // =========================================================================\n // RENDER FUNCTIONS\n // =========================================================================\n return (\n <CustomFadeWrapper\n onResize={handleResize}\n data-testid={testId}\n fadeColor={fadeColor}\n >\n <Chain\n role=\"tablist\"\n $fullWidthIndicatorLine={fullWidthIndicatorLine}\n ref={chainRef}\n >\n {tabLinks.map(({ title, width, titleAddon }, index) => {\n const isActive = currentActiveIndex === index;\n\n return (\n <ChainItem\n key={index}\n role=\"none\"\n $active={isActive}\n ref={isActive ? activeLinkRef : null}\n $width={width}\n >\n <ChainLink\n role=\"none\"\n onClick={handleChainLinkClick(index)}\n data-testid={`${testId}-link-${index}`}\n $reversed={titleAddon?.position === \"left\"}\n >\n <LabelContainer role=\"none\">\n <Label\n $active={isActive}\n onClick={handleChainLinkClick(index)}\n aria-hidden=\"true\"\n >\n {truncateText(title)}\n </Label>\n <BoldLabel\n role=\"tab\"\n id={`${instanceId}-tab-${index}`}\n type=\"button\"\n aria-selected={isActive}\n tabIndex={isActive ? 0 : -1}\n onKeyDown={(e) =>\n handleKeyDown(e, index)\n }\n ref={(el) =>\n (chainLinkRefs.current[index] = el)\n }\n $active={isActive}\n >\n {truncateText(title)}\n </BoldLabel>\n </LabelContainer>\n {titleAddon?.content}\n </ChainLink>\n </ChainItem>\n );\n })}\n </Chain>\n </CustomFadeWrapper>\n );\n};\n"],"names":["controlledMode","testId","onTabClick","fullWidthIndicatorLine","fadeColor","setCurrentActiveIndex","currentActiveIndex","tabLinks","instanceId","useContext","TabContext","theme","ThemeContext","mobileBreakpoint","Breakpoint","isMobile","useMediaQuery","maxWidth","tabletBreakpoint","activeLinkRef","useRef","chainLinkRefs","chainRef","handleChainLinkClick","index","event","preventDefault","stopPropagation","title","truncateText","value","length","substring","_jsx","CustomFadeWrapper","onResize","content","wrapper","window","innerWidth","current","scrollLeft","getBoundingClientRect","left","children","Chain","role","$fullWidthIndicatorLine","ref","map","width","titleAddon","isActive","ChainItem","$active","_jsxs","ChainLink","onClick","position","LabelContainer","Label","BoldLabel","id","type","tabIndex","onKeyDown","e","nextIndex","key","_a","focus","handleKeyDown","el"],"mappings":"8RAyB4B,EACxBA,iBACA,cAAeC,EACfC,aACAC,yBACAC,gBAKA,MAAMC,sBAAEA,EAAqBC,mBAAEA,EAAkBC,SAAEA,EAAQC,WAAEA,GACzDC,EAAAA,WAAWC,cAETC,EAAQF,EAAAA,WAAWG,gBACnBC,EAAmBC,EAAAA,WAAW,UAAU,CAAEH,UAE1CI,EAAWC,EAAAA,uBAAAA,cAAc,CAC3BC,SAAUJ,IAGRK,EAAmBJ,EAAAA,WAAW,UAAU,CAAEH,UAE1CQ,EAAgBC,EAAAA,OAAsB,MACtCC,EAAgBD,EAAAA,OAAqC,IACrDE,EAAWF,EAAAA,OAAgC,MAK3CG,EACDC,GACAC,IACGA,EAAMC,iBACND,EAAME,kBACD3B,GACDK,EAAsBmB,GAGtBtB,GACAA,EAAWK,EAASiB,GAAOI,MAAOJ,EACtC,EAiCFK,EAAgBC,GACdf,GACOe,EAAMC,OAAS,GAAK,GAAGD,EAAME,UAAU,EAAG,SAG9CF,EAMX,OACIG,EAAAA,IAACC,EAAAA,mBACGC,SA3Ca,EAAGC,UAASC,cAEzBD,GACAC,GACAC,OAAOC,YAAcrB,GACrBC,EAAcqB,SACdlB,EAASkB,UAETJ,EAAQK,WACJtB,EAAcqB,QAAQE,wBAAwBC,KAC9CrB,EAASkB,QAAQE,wBAAwBC,KACjD,EAgC0B,cACT1C,EACbG,UAAWA,EAASwC,SAEpBX,EAAAA,IAACY,EAAAA,MAAK,CACFC,KAAK,UAASC,wBACW5C,EACzB6C,IAAK1B,WAEJf,EAAS0C,KAAI,EAAGrB,QAAOsB,QAAOC,cAAc3B,KACzC,MAAM4B,EAAW9C,IAAuBkB,EAExC,OACIS,MAACoB,EAAAA,UAAS,CAENP,KAAK,OAAMQ,QACFF,EACTJ,IAAKI,EAAWjC,EAAgB,YACxB+B,EAAKN,SAEbW,EAAAA,KAACC,EAAAA,UAAS,CACNV,KAAK,OACLW,QAASlC,EAAqBC,GAAM,cACvB,GAAGvB,UAAeuB,cACK,UAAzB2B,eAAAA,EAAYO,UAAmBd,SAAA,CAE1CW,EAAAA,KAACI,EAAAA,eAAc,CAACb,KAAK,OAAMF,SAAA,CACvBX,EAAAA,IAAC2B,EAAAA,eACYR,EACTK,QAASlC,EAAqBC,GAAM,cACxB,gBAEXK,EAAaD,KAElBK,EAAAA,IAAC4B,EAAAA,UAAS,CACNf,KAAK,MACLgB,GAAI,GAAGtD,SAAkBgB,IACzBuC,KAAK,SAAQ,gBACEX,EACfY,SAAUZ,EAAW,GAAI,EACzBa,UAAYC,GArE1B,EAACA,EAAwB1C,WAC3C,IAAI2C,EAAY3C,EACF,eAAV0C,EAAEE,KACFD,GAAa3C,EAAQ,GAAKjB,EAASwB,OACnCmC,EAAExC,kBACe,cAAVwC,EAAEE,MACTD,GAAa3C,EAAQ,EAAIjB,EAASwB,QAAUxB,EAASwB,OACrDmC,EAAExC,kBAG0B,QAAhC2C,EAAAhD,EAAcmB,QAAQ2B,UAAU,IAAAE,GAAAA,EAAEC,OAAO,EA4DLC,CAAcL,EAAG1C,GAErBwB,IAAMwB,GACDnD,EAAcmB,QAAQhB,GAASgD,EAAGlB,QAE9BF,EAAQR,SAEhBf,EAAaD,QAGrBuB,aAAU,EAAVA,EAAYf,YArCZZ,EAuCG,OAIR"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tab-list-item.js","sources":["../../../src/tab/tab-list-item.tsx"],"sourcesContent":["import type { TabListItemProps } from \"./types\";\n\n// Declarative slot component — props are consumed by Tab.TabList, not rendered\nexport const TabListItem = (_props: TabListItemProps) => null;\n\nTabListItem.displayName = \"Tab.TabListItem\";\n"],"names":["TabListItem","_props","displayName"],"mappings":"aAGO,MAAMA,EAAeC,GAA6B,KAEzDD,EAAYE,YAAc"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var e=require("react/jsx-runtime"),t=require("react");require("../util/calendar-helper.js"),require("../util/date-helper.js"),require("../util/date-input-helper.js"),require("../util/simple-id-generator.js"),require("../util/string-helper.js"),require("@react-aria/live-announcer");var r=require("../util/use-isomorphic-layout-effect.js"),i=require("./tab-context.js"),o=require("./tab-link-chain.js");const a=({children:a,fullWidthIndicatorLine:n,fadeColor:s,"data-testid":l})=>{const{setTabLinks:d,controlledMode:u,onTabClick:c,isContextProvided:p}=t.useContext(i.TabContext),b=t.useMemo((()=>t.Children.toArray(a).filter(Boolean).map((({props:e})=>({title:e.title,width:e.width,titleAddon:e.titleAddon})))),[a]);return r.useIsomorphicLayoutEffect((()=>{d(b)}),[d,b]),t.useEffect((()=>{"production"===process.env.NODE_ENV||p||console.error("Tab.TabList must be rendered inside Tab.Context.")}),[p]),e.jsx(o.TabLinkChain,{controlledMode:u,onTabClick:c,"data-testid":l,fullWidthIndicatorLine:n,fadeColor:s})};a.displayName="Tab.TabList",exports.TabList=a;
|
|
2
|
+
//# sourceMappingURL=tab-list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tab-list.js","sources":["../../../src/tab/tab-list.tsx"],"sourcesContent":["import type { ReactElement } from \"react\";\nimport { Children, useContext, useEffect, useMemo } from \"react\";\n\nimport { useIsomorphicLayoutEffect } from \"../util\";\nimport type { TabLinkProps } from \"./tab-context\";\nimport { TabContext } from \"./tab-context\";\nimport { TabLinkChain } from \"./tab-link-chain\";\nimport type { TabListItemProps, TabListProps } from \"./types\";\n\nexport const TabList = ({\n children,\n fullWidthIndicatorLine,\n fadeColor,\n \"data-testid\": testId,\n}: TabListProps) => {\n // =========================================================================\n // CONST, STATE, REFS\n // =========================================================================\n const { setTabLinks, controlledMode, onTabClick, isContextProvided } =\n useContext(TabContext);\n\n const tabLinks = useMemo(() => {\n return (\n Children.toArray(children).filter(\n Boolean\n ) as ReactElement<TabListItemProps>[]\n ).map(({ props }) => ({\n title: props.title,\n width: props.width,\n titleAddon: props.titleAddon,\n })) as TabLinkProps[];\n }, [children]);\n\n // =========================================================================\n // EFFECTS\n // =========================================================================\n useIsomorphicLayoutEffect(() => {\n setTabLinks(tabLinks);\n }, [setTabLinks, tabLinks]);\n\n useEffect(() => {\n if (process.env.NODE_ENV !== \"production\" && !isContextProvided) {\n console.error(\"Tab.TabList must be rendered inside Tab.Context.\");\n }\n }, [isContextProvided]);\n\n // =========================================================================\n // RENDER FUNCTIONS\n // =========================================================================\n return (\n <TabLinkChain\n controlledMode={controlledMode}\n onTabClick={onTabClick}\n data-testid={testId}\n fullWidthIndicatorLine={fullWidthIndicatorLine}\n fadeColor={fadeColor}\n />\n );\n};\n\nTabList.displayName = \"Tab.TabList\";\n"],"names":["TabList","children","fullWidthIndicatorLine","fadeColor","testId","setTabLinks","controlledMode","onTabClick","isContextProvided","useContext","TabContext","tabLinks","useMemo","Children","toArray","filter","Boolean","map","props","title","width","titleAddon","useIsomorphicLayoutEffect","useEffect","process","env","NODE_ENV","console","error","_jsx","TabLinkChain","displayName"],"mappings":"+ZASO,MAAMA,EAAU,EACnBC,WACAC,yBACAC,YACA,cAAeC,MAKf,MAAMC,YAAEA,EAAWC,eAAEA,EAAcC,WAAEA,EAAUC,kBAAEA,GAC7CC,EAAAA,WAAWC,cAETC,EAAWC,EAAAA,SAAQ,IAEjBC,EAAAA,SAASC,QAAQb,GAAUc,OACvBC,SAENC,KAAI,EAAGC,YAAO,CACZC,MAAOD,EAAMC,MACbC,MAAOF,EAAME,MACbC,WAAYH,EAAMG,gBAEvB,CAACpB,IAkBJ,OAbAqB,EAAAA,2BAA0B,KACtBjB,EAAYM,EAAS,GACtB,CAACN,EAAaM,IAEjBY,EAAAA,WAAU,KACuB,eAAzBC,QAAQC,IAAIC,UAA8BlB,GAC1CmB,QAAQC,MAAM,mDAClB,GACD,CAACpB,IAMAqB,EAAAA,IAACC,EAAAA,aAAY,CACTxB,eAAgBA,EAChBC,WAAYA,gBACCH,EACbF,uBAAwBA,EACxBC,UAAWA,GACb,EAIVH,EAAQ+B,YAAc"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var e=require("../_virtual/_tslib.js"),r=require("react/jsx-runtime"),t=require("react"),n=require("./tab-context.js");const a=a=>{var{index:i,children:s}=a,c=e.__rest(a,["index","children"]);const{currentActiveIndex:d,isContextProvided:l,instanceId:o}=t.useContext(n.TabContext);return t.useEffect((()=>{"production"===process.env.NODE_ENV||l||console.error("Tab.Panel must be rendered inside Tab.Context.")}),[l]),d===i?r.jsx("div",Object.assign({role:"tabpanel","aria-labelledby":`${o}-tab-${i}`,tabIndex:0},c,{children:s})):null};a.displayName="Tab.Panel",exports.TabPanel=a;
|
|
2
|
+
//# sourceMappingURL=tab-panel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tab-panel.js","sources":["../../../src/tab/tab-panel.tsx"],"sourcesContent":["import { useContext, useEffect } from \"react\";\n\nimport { TabContext } from \"./tab-context\";\nimport type { TabPanelProps } from \"./types\";\n\nexport const TabPanel = ({ index, children, ...otherProps }: TabPanelProps) => {\n const { currentActiveIndex, isContextProvided, instanceId } =\n useContext(TabContext);\n\n useEffect(() => {\n if (process.env.NODE_ENV !== \"production\" && !isContextProvided) {\n console.error(\"Tab.Panel must be rendered inside Tab.Context.\");\n }\n }, [isContextProvided]);\n\n return currentActiveIndex === index ? (\n <div\n role=\"tabpanel\"\n aria-labelledby={`${instanceId}-tab-${index}`}\n tabIndex={0}\n {...otherProps}\n >\n {children}\n </div>\n ) : null;\n};\n\nTabPanel.displayName = \"Tab.Panel\";\n"],"names":["TabPanel","_a","index","children","otherProps","__rest","currentActiveIndex","isContextProvided","instanceId","useContext","TabContext","useEffect","process","env","NODE_ENV","console","error","_jsx","Object","assign","role","tabIndex","displayName"],"mappings":"oIAKO,MAAMA,EAAYC,QAAAC,MAAEA,EAAKC,SAAEA,GAAQF,EAAKG,EAAUC,EAAAA,OAAAJ,EAAhC,sBACrB,MAAMK,mBAAEA,EAAkBC,kBAAEA,EAAiBC,WAAEA,GAC3CC,EAAAA,WAAWC,EAAAA,YAQf,OANAC,EAAAA,WAAU,KACuB,eAAzBC,QAAQC,IAAIC,UAA8BP,GAC1CQ,QAAQC,MAAM,iDAClB,GACD,CAACT,IAEGD,IAAuBJ,EAC1Be,EAAAA,IAAA,MAAAC,OAAAC,OAAA,CACIC,KAAK,WAAU,kBACE,GAAGZ,SAAkBN,IACtCmB,SAAU,GACNjB,EAAU,CAAAD,SAEbA,KAEL,IAAI,EAGZH,EAASsB,YAAc"}
|
package/cjs/tab/tab.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var e=require("../_virtual/_tslib.js"),t=require("react/jsx-runtime"),i=require("react"),
|
|
1
|
+
"use strict";var e=require("../_virtual/_tslib.js"),t=require("react/jsx-runtime"),r=require("react");require("../util/calendar-helper.js"),require("../util/date-helper.js"),require("../util/date-input-helper.js");var i=require("../util/simple-id-generator.js");require("../util/string-helper.js"),require("@react-aria/live-announcer");var a=require("./tab-context.js"),n=require("./tab-context-provider.js"),s=require("./tab-item.js"),l=require("./tab-link-chain.js"),o=require("./tab-list.js"),d=require("./tab-list-item.js"),u=require("./tab-panel.js"),c=require("./tab.style.js");const b=n=>{var{children:s,currentActive:o,initialActive:d=0,onTabClick:u,"data-testid":b,fullWidthIndicatorLine:p,fadeColor:j}=n,h=e.__rest(n,["children","currentActive","initialActive","onTabClick","data-testid","fullWidthIndicatorLine","fadeColor"]);const[m,q]=r.useState(o||d),v=i.useId(),T=r.useMemo((()=>r.Children.toArray(s).filter(Boolean).map((e=>({title:e.props.title,width:e.props.width,titleAddon:e.props.titleAddon})))),[s]),C=r.useMemo((()=>({instanceId:v,tabLinks:T,currentActiveIndex:m,setCurrentActiveIndex:q,setTabLinks:a.noop,controlledMode:"number"==typeof o,onTabClick:u,isContextProvided:!0})),[m,o,v,u,T]);r.useEffect((()=>{"number"==typeof o&&q(o)}),[o]);return t.jsx(c.Wrapper,Object.assign({"data-testid":b},h,{children:t.jsxs(a.TabContext.Provider,{value:C,children:[t.jsx(l.TabLinkChain,{controlledMode:"number"==typeof o,onTabClick:u,"data-testid":`${b}-tabs`,fullWidthIndicatorLine:p,fadeColor:j}),r.Children.toArray(s).filter(Boolean).map(((e,t)=>r.cloneElement(e,{key:t,index:t})))]})}))};b.displayName="Tab";const p=Object.assign(b,{Item:s.TabItem,Context:n.TabContextProvider,TabList:o.TabList,TabListItem:d.TabListItem,Panel:u.TabPanel});exports.Tab=p;
|
|
2
2
|
//# sourceMappingURL=tab.js.map
|