@purpur/library 9.10.0 → 9.10.1
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/CHANGELOG.json +18 -0
- package/CHANGELOG.md +10 -1
- package/dist/LICENSE.txt +40 -0
- package/dist/{RichText-D4vznH1B.mjs → RichText-2_z57EYi.mjs} +2 -2
- package/dist/{RichText-D4vznH1B.mjs.map → RichText-2_z57EYi.mjs.map} +1 -1
- package/dist/{RichText-BAVZadzi.js → RichText-IejAKqm2.js} +2 -2
- package/dist/{RichText-BAVZadzi.js.map → RichText-IejAKqm2.js.map} +1 -1
- package/dist/{autocomplete-CmLzmWp4.mjs → autocomplete-C6AqdYaZ.mjs} +2 -2
- package/dist/{autocomplete-CmLzmWp4.mjs.map → autocomplete-C6AqdYaZ.mjs.map} +1 -1
- package/dist/{autocomplete-BX1KDZqL.js → autocomplete-yrPbF5gq.js} +2 -2
- package/dist/{autocomplete-BX1KDZqL.js.map → autocomplete-yrPbF5gq.js.map} +1 -1
- package/dist/autocomplete.cjs.js +1 -1
- package/dist/autocomplete.es.js +1 -1
- package/dist/button-DZgtrGqN.js +2 -0
- package/dist/{button-DmybVApa.js.map → button-DZgtrGqN.js.map} +1 -1
- package/dist/button-EVRfctR8.mjs +109 -0
- package/dist/{button-4-yWOgtD.mjs.map → button-EVRfctR8.mjs.map} +1 -1
- package/dist/button.cjs.js +1 -1
- package/dist/button.es.js +1 -1
- package/dist/{calendar-Cru-p6gC.mjs → calendar-CTWhxuS4.mjs} +2 -2
- package/dist/{calendar-Cru-p6gC.mjs.map → calendar-CTWhxuS4.mjs.map} +1 -1
- package/dist/{calendar-DDR8CQYo.js → calendar-Cwzqytai.js} +2 -2
- package/dist/{calendar-DDR8CQYo.js.map → calendar-Cwzqytai.js.map} +1 -1
- package/dist/calendar.cjs.js +1 -1
- package/dist/calendar.es.js +1 -1
- package/dist/{carousel-BIKcwvYz.mjs → carousel-DiKGSL-7.mjs} +2 -2
- package/dist/{carousel-BIKcwvYz.mjs.map → carousel-DiKGSL-7.mjs.map} +1 -1
- package/dist/{carousel-DnSaLDZf.js → carousel-Dz_bUGo4.js} +2 -2
- package/dist/{carousel-DnSaLDZf.js.map → carousel-Dz_bUGo4.js.map} +1 -1
- package/dist/carousel.cjs.js +1 -1
- package/dist/carousel.es.js +1 -1
- package/dist/{chat-field-CVF4DooY.mjs → chat-field-8cKqYcKi.mjs} +2 -2
- package/dist/{chat-field-CVF4DooY.mjs.map → chat-field-8cKqYcKi.mjs.map} +1 -1
- package/dist/{chat-field-Wjvh2J6C.js → chat-field-B2jmpVNr.js} +2 -2
- package/dist/{chat-field-Wjvh2J6C.js.map → chat-field-B2jmpVNr.js.map} +1 -1
- package/dist/chat-field.cjs.js +1 -1
- package/dist/chat-field.es.js +1 -1
- package/dist/{comparison-table-D1evE0ri.mjs → comparison-table-CmtSOUfK.mjs} +2 -2
- package/dist/{comparison-table-D1evE0ri.mjs.map → comparison-table-CmtSOUfK.mjs.map} +1 -1
- package/dist/{comparison-table-Dtqxz8vL.js → comparison-table-N5G3k2kr.js} +2 -2
- package/dist/{comparison-table-Dtqxz8vL.js.map → comparison-table-N5G3k2kr.js.map} +1 -1
- package/dist/comparison-table.cjs.js +1 -1
- package/dist/comparison-table.es.js +1 -1
- package/dist/components/accordion/src/accordion-item.d.ts +2 -2
- package/dist/components/accordion/src/accordion.d.ts +2 -2
- package/dist/components/avatar/src/avatar.d.ts +1 -1
- package/dist/components/button/src/button.d.ts +5 -5
- package/dist/components/card/src/card-badge.d.ts +1 -1
- package/dist/components/card/src/card-cta.d.ts +1 -1
- package/dist/components/card/src/card-heading.d.ts +1 -1
- package/dist/components/card/src/card-media-layout.d.ts +1 -1
- package/dist/components/card/src/card-media.d.ts +1 -1
- package/dist/components/checkbox/src/checkbox.d.ts +1 -1
- package/dist/components/comparison-table/src/components/OptionCard/option-card.d.ts +1 -1
- package/dist/components/content-block/src/content-block.d.ts +2 -2
- package/dist/components/counter-badge/src/counter-badge.d.ts +1 -1
- package/dist/components/country-flag-icon/src/country-flag-icon.d.ts +1 -1
- package/dist/components/date-field/src/date-field.d.ts +1 -1
- package/dist/components/date-picker/src/date-picker.d.ts +4 -4
- package/dist/components/dismissable-chip-group/src/dismissable-chip-group-item.d.ts +1 -1
- package/dist/components/dismissable-chip-group/src/dismissable-chip-group.d.ts +2 -2
- package/dist/components/drawer/src/drawer-content.d.ts +2 -2
- package/dist/components/drawer/src/drawer-frame.d.ts +1 -1
- package/dist/components/drawer/src/drawer-trigger.d.ts +1 -1
- package/dist/components/field-error-text/src/field-error-text.d.ts +2 -2
- package/dist/components/field-helper-text/src/field-helper-text.d.ts +1 -1
- package/dist/components/footer/src/footer-navigation.d.ts +1 -1
- package/dist/components/footer/src/footer-social-link.d.ts +3 -3
- package/dist/components/footer/src/footer.d.ts +3 -3
- package/dist/components/grid/src/grid.item.d.ts +1 -1
- package/dist/components/heading/src/heading.d.ts +2 -2
- package/dist/components/hero-banner/src/hero-banner-actions.d.ts +1 -1
- package/dist/components/hero-banner/src/hero-banner-media.d.ts +1 -1
- package/dist/components/hero-banner/src/hero-banner-types.d.ts +2 -2
- package/dist/components/illustrative-icon/src/static-illustrative-icon.d.ts +2 -2
- package/dist/components/listbox/src/listbox-item.d.ts +1 -1
- package/dist/components/listbox/src/listbox.d.ts +1 -1
- package/dist/components/logo/src/logo.types.d.ts +1 -1
- package/dist/components/notification-banner/src/notification-banner.d.ts +2 -2
- package/dist/components/pagination/src/pagination-page-selector.d.ts +2 -2
- package/dist/components/pagination/src/pagination-page-size-selector.d.ts +2 -2
- package/dist/components/pagination/src/pagination-pages.d.ts +2 -2
- package/dist/components/pagination/src/use-page-options.hook.d.ts +2 -2
- package/dist/components/pagination/src/use-page-size-options.hook.d.ts +2 -2
- package/dist/components/paragraph/src/paragraph.d.ts +1 -1
- package/dist/components/password-field/src/password-strength-indicator.d.ts +2 -2
- package/dist/components/password-field/src/password-strength.d.ts +2 -2
- package/dist/components/popover/src/popover-button.d.ts +2 -2
- package/dist/components/product-card/src/product-card.d.ts +1 -1
- package/dist/components/promotion-card/src/promotion-card.d.ts +1 -1
- package/dist/components/quantity-selector/src/quantity-selector.d.ts +1 -1
- package/dist/components/radio-button-group/src/radio-button-group-root.d.ts +1 -1
- package/dist/components/radio-card-group/src/radio-card-group.d.ts +2 -2
- package/dist/components/search-field/src/search-field-autocomplete.d.ts +1 -1
- package/dist/components/search-field/src/search-field-base.d.ts +1 -1
- package/dist/components/search-field/src/search-field.d.ts +6 -6
- package/dist/components/select/src/select.d.ts +1 -1
- package/dist/components/spacer/src/spacer.d.ts +2 -2
- package/dist/components/spinner/src/spinner.d.ts +1 -1
- package/dist/components/stepper/src/stepper-content.d.ts +1 -1
- package/dist/components/stepper/src/stepper.d.ts +2 -2
- package/dist/components/table/src/cell-types/button-group-cell.d.ts +1 -1
- package/dist/components/table/src/empty-table.d.ts +2 -2
- package/dist/components/table/src/table-content.d.ts +2 -2
- package/dist/components/table/src/table.d.ts +1 -1
- package/dist/components/table/src/test-utils/table-data.d.ts +3 -3
- package/dist/components/tabs/src/tab-content.d.ts +1 -1
- package/dist/components/text-area/src/text-area.d.ts +1 -1
- package/dist/components/text-spacing/src/text-spacing.d.ts +1 -1
- package/dist/components/toggle/src/toggle.d.ts +1 -1
- package/dist/{date-field-DVp_RMNm.mjs → date-field-ChYx0N2j.mjs} +2 -2
- package/dist/{date-field-DVp_RMNm.mjs.map → date-field-ChYx0N2j.mjs.map} +1 -1
- package/dist/{date-field-hA79n6mP.js → date-field-CwZ64buh.js} +2 -2
- package/dist/{date-field-hA79n6mP.js.map → date-field-CwZ64buh.js.map} +1 -1
- package/dist/date-field.cjs.js +1 -1
- package/dist/date-field.es.js +1 -1
- package/dist/{date-picker-Dzoo_hhQ.js → date-picker-BWMKTOq6.js} +2 -2
- package/dist/{date-picker-Dzoo_hhQ.js.map → date-picker-BWMKTOq6.js.map} +1 -1
- package/dist/{date-picker-B8ta-Q8V.mjs → date-picker-CTyqgBRB.mjs} +5 -5
- package/dist/{date-picker-B8ta-Q8V.mjs.map → date-picker-CTyqgBRB.mjs.map} +1 -1
- package/dist/date-picker.cjs.js +1 -1
- package/dist/date-picker.es.js +1 -1
- package/dist/{date-range-field-Dqqgj41u.js → date-range-field-CvzOl-eC.js} +2 -2
- package/dist/{date-range-field-Dqqgj41u.js.map → date-range-field-CvzOl-eC.js.map} +1 -1
- package/dist/{date-range-field-BZUjfftV.mjs → date-range-field-DDr-qEGX.mjs} +2 -2
- package/dist/{date-range-field-BZUjfftV.mjs.map → date-range-field-DDr-qEGX.mjs.map} +1 -1
- package/dist/date-range-field.cjs.js +1 -1
- package/dist/date-range-field.es.js +1 -1
- package/dist/{drawer-DyLQfvEh.js → drawer-BnqxUIPM.js} +2 -2
- package/dist/{drawer-DyLQfvEh.js.map → drawer-BnqxUIPM.js.map} +1 -1
- package/dist/{drawer-cIUx6WSZ.mjs → drawer-Cnk2OKgi.mjs} +2 -2
- package/dist/{drawer-cIUx6WSZ.mjs.map → drawer-Cnk2OKgi.mjs.map} +1 -1
- package/dist/drawer.cjs.js +1 -1
- package/dist/drawer.es.js +1 -1
- package/dist/{footer-Cn1-zG1v.js → footer-B8rzVSrZ.js} +2 -2
- package/dist/{footer-Cn1-zG1v.js.map → footer-B8rzVSrZ.js.map} +1 -1
- package/dist/{footer-D-2b7UIB.mjs → footer-D5YkHmCo.mjs} +2 -2
- package/dist/{footer-D-2b7UIB.mjs.map → footer-D5YkHmCo.mjs.map} +1 -1
- package/dist/footer.cjs.js +1 -1
- package/dist/footer.es.js +1 -1
- package/dist/{hero-banner-n9K-Jsdz.mjs → hero-banner-BXRArPWP.mjs} +2 -2
- package/dist/{hero-banner-n9K-Jsdz.mjs.map → hero-banner-BXRArPWP.mjs.map} +1 -1
- package/dist/{hero-banner--v-ezYMr.js → hero-banner-CW7DIEZe.js} +2 -2
- package/dist/{hero-banner--v-ezYMr.js.map → hero-banner-CW7DIEZe.js.map} +1 -1
- package/dist/hero-banner.cjs.js +1 -1
- package/dist/hero-banner.es.js +1 -1
- package/dist/libraries/library/src/library.d.ts +1 -0
- package/dist/libraries/library/src/library.d.ts.map +1 -1
- package/dist/libraries/library/src/password-field.d.ts +6 -2
- package/dist/libraries/library/src/password-field.d.ts.map +1 -1
- package/dist/libraries/library/src/radio-button-group.d.ts +1 -1
- package/dist/libraries/library/src/radio-card-group.d.ts +1 -1
- package/dist/libraries/library/src/spinner.d.ts +1 -1
- package/dist/libraries/library/src/stepper.d.ts +1 -1
- package/dist/libraries/library/src/tooltip.d.ts +1 -1
- package/dist/libraries/library/src/visually-hidden.d.ts +1 -1
- package/dist/libraries/theme/src/ThemeProvider.d.ts +2 -2
- package/dist/library.cjs.js +1 -1
- package/dist/library.es.js +546 -543
- package/dist/library.es.js.map +1 -1
- package/dist/link-Dzqd0QuD.js +2 -0
- package/dist/{link-DhWVrkTz.js.map → link-Dzqd0QuD.js.map} +1 -1
- package/dist/link-ccCdDvBc.mjs +72 -0
- package/dist/{link-DY5WLpyc.mjs.map → link-ccCdDvBc.mjs.map} +1 -1
- package/dist/link.cjs.js +1 -1
- package/dist/link.es.js +1 -1
- package/dist/main-B501z9Ql.js +2 -0
- package/dist/main-B501z9Ql.js.map +1 -0
- package/dist/main-L71Sqg3s.mjs +1016 -0
- package/dist/main-L71Sqg3s.mjs.map +1 -0
- package/dist/{modal-Bu1Zv5Ic.mjs → modal-BuUQrUYJ.mjs} +2 -2
- package/dist/{modal-Bu1Zv5Ic.mjs.map → modal-BuUQrUYJ.mjs.map} +1 -1
- package/dist/{modal-D0Qxrvx5.js → modal-CnC4Zyjk.js} +2 -2
- package/dist/{modal-D0Qxrvx5.js.map → modal-CnC4Zyjk.js.map} +1 -1
- package/dist/modal.cjs.js +1 -1
- package/dist/modal.es.js +1 -1
- package/dist/{notification-DiVdy6E_.mjs → notification-C3f3N1K1.mjs} +2 -2
- package/dist/{notification-DiVdy6E_.mjs.map → notification-C3f3N1K1.mjs.map} +1 -1
- package/dist/{notification-D2oClkX2.js → notification-CeoAXDXq.js} +2 -2
- package/dist/{notification-D2oClkX2.js.map → notification-CeoAXDXq.js.map} +1 -1
- package/dist/{notification-banner-CZTQZ5Le.mjs → notification-banner-BvAy8dlg.mjs} +2 -2
- package/dist/{notification-banner-CZTQZ5Le.mjs.map → notification-banner-BvAy8dlg.mjs.map} +1 -1
- package/dist/{notification-banner-BxHwTFnH.js → notification-banner-DUe4fT1r.js} +2 -2
- package/dist/{notification-banner-BxHwTFnH.js.map → notification-banner-DUe4fT1r.js.map} +1 -1
- package/dist/notification-banner.cjs.js +1 -1
- package/dist/notification-banner.es.js +1 -1
- package/dist/notification.cjs.js +1 -1
- package/dist/notification.es.js +1 -1
- package/dist/password-field-BjKdBoIK.js +2 -0
- package/dist/password-field-BjKdBoIK.js.map +1 -0
- package/dist/password-field-C_E4563x.mjs +200 -0
- package/dist/password-field-C_E4563x.mjs.map +1 -0
- package/dist/password-field.cjs.js +2 -0
- package/dist/password-field.cjs.js.map +1 -0
- package/dist/password-field.es.js +6 -0
- package/dist/password-field.es.js.map +1 -0
- package/dist/{popover-CY75TnbA.js → popover-4phnhJLj.js} +2 -2
- package/dist/{popover-CY75TnbA.js.map → popover-4phnhJLj.js.map} +1 -1
- package/dist/{popover-wiiwtqWE.mjs → popover-DhObSx97.mjs} +2 -2
- package/dist/{popover-wiiwtqWE.mjs.map → popover-DhObSx97.mjs.map} +1 -1
- package/dist/popover.cjs.js +1 -1
- package/dist/popover.es.js +1 -1
- package/dist/purpur.css +1 -1
- package/dist/{quantity-selector-BEYMDsBM.js → quantity-selector-Ds7d4MnV.js} +2 -2
- package/dist/{quantity-selector-BEYMDsBM.js.map → quantity-selector-Ds7d4MnV.js.map} +1 -1
- package/dist/{quantity-selector-Cp-e5xKJ.mjs → quantity-selector-DwkKKmFy.mjs} +3 -3
- package/dist/{quantity-selector-Cp-e5xKJ.mjs.map → quantity-selector-DwkKKmFy.mjs.map} +1 -1
- package/dist/quantity-selector.cjs.js +1 -1
- package/dist/quantity-selector.es.js +1 -1
- package/dist/rich-text.cjs.js +1 -1
- package/dist/rich-text.es.js +1 -1
- package/dist/{search-field-afhtC6q5.mjs → search-field-BTqVE1-l.mjs} +3 -3
- package/dist/{search-field-afhtC6q5.mjs.map → search-field-BTqVE1-l.mjs.map} +1 -1
- package/dist/{search-field-WJBtiK0K.js → search-field-DkJrwzJB.js} +2 -2
- package/dist/{search-field-WJBtiK0K.js.map → search-field-DkJrwzJB.js.map} +1 -1
- package/dist/search-field.cjs.js +1 -1
- package/dist/search-field.es.js +1 -1
- package/dist/{stepper-VDiR2I8F.js → stepper-5rQ3cK18.js} +2 -2
- package/dist/{stepper-VDiR2I8F.js.map → stepper-5rQ3cK18.js.map} +1 -1
- package/dist/{stepper-20s8dnPA.mjs → stepper-B3p9r3gv.mjs} +3 -3
- package/dist/{stepper-20s8dnPA.mjs.map → stepper-B3p9r3gv.mjs.map} +1 -1
- package/dist/stepper.cjs.js +1 -1
- package/dist/stepper.es.js +1 -1
- package/dist/{table-B5ZitZoL.js → table-BIyaTsOh.js} +2 -2
- package/dist/{table-B5ZitZoL.js.map → table-BIyaTsOh.js.map} +1 -1
- package/dist/{table-CNIL-60s.mjs → table-BtymEUG4.mjs} +6 -6
- package/dist/{table-CNIL-60s.mjs.map → table-BtymEUG4.mjs.map} +1 -1
- package/dist/table.cjs.js +1 -1
- package/dist/table.es.js +1 -1
- package/dist/{text-field-D0e-cRbG.mjs → text-field-C9LX7LBf.mjs} +2 -2
- package/dist/{text-field-D0e-cRbG.mjs.map → text-field-C9LX7LBf.mjs.map} +1 -1
- package/dist/{text-field-VW8ObP83.js → text-field-CS0PT5T6.js} +2 -2
- package/dist/{text-field-VW8ObP83.js.map → text-field-CS0PT5T6.js.map} +1 -1
- package/dist/text-field.cjs.js +1 -1
- package/dist/text-field.es.js +1 -1
- package/dist/{tooltip-B-11qk-0.js → tooltip-COFCRUKv.js} +2 -2
- package/dist/{tooltip-B-11qk-0.js.map → tooltip-COFCRUKv.js.map} +1 -1
- package/dist/{tooltip-DngYHn5W.mjs → tooltip-FH9R2MAA.mjs} +2 -2
- package/dist/{tooltip-DngYHn5W.mjs.map → tooltip-FH9R2MAA.mjs.map} +1 -1
- package/dist/tooltip.cjs.js +1 -1
- package/dist/tooltip.es.js +1 -1
- package/package.json +24 -29
- package/scripts/generate.mts +1 -4
- package/src/aliases.ts +4 -0
- package/src/entries.js +1 -0
- package/src/library.ts +1 -1
- package/src/password-field.ts +0 -1
- package/dist/button-4-yWOgtD.mjs +0 -109
- package/dist/button-DmybVApa.js +0 -2
- package/dist/link-DY5WLpyc.mjs +0 -72
- package/dist/link-DhWVrkTz.js +0 -2
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";const n=require("react/jsx-runtime"),q=require("react"),U=require("./spinner-tKunS_o-.js"),X=require("./text-field-
|
|
2
|
-
//# sourceMappingURL=quantity-selector-
|
|
1
|
+
"use strict";const n=require("react/jsx-runtime"),q=require("react"),U=require("./spinner-tKunS_o-.js"),X=require("./text-field-CS0PT5T6.js"),B=require("./bind-DeUYJ6m9.js"),Z=require("./button-DZgtrGqN.js"),J=require("./minus.es-DtXArdKK.js"),K=require("./icon-DNHpBTHs-faYHqTXU.js"),L={"purpur-quantity-selector":"_purpur-quantity-selector_1hglo_1","purpur-quantity-selector--full-width":"_purpur-quantity-selector--full-width_1hglo_25","purpur-quantity-selector--loading":"_purpur-quantity-selector--loading_1hglo_31","purpur-quantity-selector--no-gap":"_purpur-quantity-selector--no-gap_1hglo_34","purpur-quantity-selector--no-gap-disabled-left":"_purpur-quantity-selector--no-gap-disabled-left_1hglo_39","purpur-quantity-selector--no-gap-disabled-right":"_purpur-quantity-selector--no-gap-disabled-right_1hglo_43","purpur-quantity-selector--no-gap-disabled":"_purpur-quantity-selector--no-gap-disabled_1hglo_39","purpur-quantity-selector__spinner":"_purpur-quantity-selector__spinner_1hglo_50","purpur-quantity-selector__spinner--full-width":"_purpur-quantity-selector__spinner--full-width_1hglo_57","purpur-quantity-selector__spinner--separated":"_purpur-quantity-selector__spinner--separated_1hglo_61"},Y={name:"plus",svg:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor"><path fill-rule="evenodd" d="M12 4.1a.9.9 0 0 1 .9.9v6.1H19a.9.9 0 1 1 0 1.8h-6.1V19a.9.9 0 0 1-1.8 0v-6.1H5a.9.9 0 0 1 0-1.8h6.1V5a.9.9 0 0 1 .9-.9Z" clip-rule="evenodd"/></svg>',keywords:["plus"],category:"utility"},C=a=>n.jsx(K.b,{...a,svg:Y});C.displayName="IconPlus";const G={"purpur-quantity-selector-button":"_purpur-quantity-selector-button_qjlbs_1","purpur-quantity-selector-button--gap-left":"_purpur-quantity-selector-button--gap-left_qjlbs_4","purpur-quantity-selector-button--gap-right":"_purpur-quantity-selector-button--gap-right_qjlbs_7","purpur-quantity-selector-button--no-gap-right":"_purpur-quantity-selector-button--no-gap-right_qjlbs_10","purpur-quantity-selector-button--no-gap-left":"_purpur-quantity-selector-button--no-gap-left_qjlbs_13"},W=B.c.bind(G),b="purpur-quantity-selector-button",T=({["data-testid"]:a,["aria-label"]:f,disabled:s,hasGap:o,variant:p,buttonType:e,onClick:x})=>{const d=W(b,{[`${b}--gap-left`]:o&&e==="decrement",[`${b}--gap-right`]:o&&e==="increment",[`${b}--no-gap-left`]:!o&&e==="decrement",[`${b}--no-gap-right`]:!o&&e==="increment"});return n.jsx(Z.Button,{"data-testid":a,className:d,size:"sm",type:"submit",variant:p,onClick:()=>x(e),iconOnly:!0,"aria-label":f??"",disabled:s,tabIndex:-1,children:e==="increment"?n.jsx(C,{size:"xs"}):n.jsx(J.e,{size:"xs"})})},V=B.c.bind(L),tt=["attached","separated"],et=["primary","secondary"],r="purpur-quantity-selector",D=q.forwardRef(({["data-testid"]:a,className:f,variant:s,buttonVariant:o,onChange:p,value:e,defaultValue:x,fullWidth:d,disabled:F,loading:$,minValue:R,maxValue:E,ariaLabelDecrement:k,ariaLabelIncrement:z,...H},Q)=>{const[M,w]=q.useState(x??0),[v,j]=q.useState(M),u=e!==void 0,l=u?e:v,S=t=>a?`${a}-${t}`:void 0,i=F||$,y=Math.max(R??0,0),m=E??Number.MAX_SAFE_INTEGER,_=l===m,g=l===y;q.useEffect(()=>{u&&w(e)},[e,u]),q.useEffect(()=>{if(!u){const t=setTimeout(()=>{w(v)},300);return()=>clearTimeout(t)}},[v,u,p]);const O=V(f,r,{[`${r}--no-gap`]:s==="attached"&&!i&&!g&&!_,[`${r}--no-gap-disabled-left`]:s==="attached"&&!i&&!_&&g,[`${r}--no-gap-disabled-right`]:s==="attached"&&!i&&!g&&_,[`${r}--no-gap-disabled`]:s==="attached"&&(i||_&&g),[`${r}--full-width`]:d,[`${r}--loading`]:$}),A=t=>{if(!/^[0-9]*$/.test(t.target.value))return;const h=+t.target.value;h<y||h>m||(u||j(h),p(h))},I=t=>{const c=t==="increment"?l+1:l-1;c<0||(u||j(c),p(c))},N=t=>{const c=t==="increment"&&_||t==="decrement"&&g;return n.jsx(T,{"data-testid":S("button-"+t),variant:o,buttonType:t,hasGap:s==="separated",onClick:I,disabled:i||c,"aria-label":t==="increment"?z:k})},P=n.jsxs(n.Fragment,{children:[$&&n.jsx("div",{className:V(`${r}__spinner`,{[`${r}__spinner--full-width`]:d,[`${r}__spinner--separated`]:!d&&s==="separated"}),children:n.jsx(U.Spinner,{disabled:i,size:"xs","data-testid":S("spinner")},"spinner")}),N("decrement")]});return n.jsx(X.TextField,{value:l,type:"number",ref:Q,className:O,"data-testid":a,onChange:A,beforeField:P,afterField:N("increment"),disabled:i,min:y,max:m,role:"spinbutton","aria-valuenow":l,"aria-valuemax":m,"aria-valuemin":y,...H})});D.displayName="QuantitySelector";exports.QuantitySelector=D;exports.quantitySelectorButtonVariants=et;exports.quantitySelectorVariants=tt;
|
|
2
|
+
//# sourceMappingURL=quantity-selector-Ds7d4MnV.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quantity-selector-BEYMDsBM.js","sources":["../../../components/icon/dist/components/plus.es.js","../../../components/quantity-selector/src/quantity-selector-button.tsx","../../../components/quantity-selector/src/quantity-selector.tsx"],"sourcesContent":["import { jsx as s } from \"react/jsx-runtime\";\nimport { I as l } from \"../icon-DNHpBTHs.mjs\";\nconst e = {\n name: \"plus\",\n svg: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path fill-rule=\"evenodd\" d=\"M12 4.1a.9.9 0 0 1 .9.9v6.1H19a.9.9 0 1 1 0 1.8h-6.1V19a.9.9 0 0 1-1.8 0v-6.1H5a.9.9 0 0 1 0-1.8h6.1V5a.9.9 0 0 1 .9-.9Z\" clip-rule=\"evenodd\"/></svg>',\n keywords: [\"plus\"],\n category: \"utility\"\n}, r = (o) => /* @__PURE__ */ s(l, { ...o, svg: e });\nr.displayName = \"IconPlus\";\nexport {\n r as IconPlus\n};\n//# sourceMappingURL=plus.es.js.map\n","import React from \"react\";\nimport { Button } from \"@purpur/button\";\nimport { IconMinus } from \"@purpur/icon/minus\";\nimport { IconPlus } from \"@purpur/icon/plus\";\nimport c from \"classnames/bind\";\n\nimport styles from \"./quantity-selector-button.module.scss\";\n\ntype variant = \"primary\" | \"secondary\";\ntype buttonType = \"increment\" | \"decrement\";\n\ntype QuantitySelectorButtonProps = {\n [\"data-testid\"]?: string;\n [\"aria-label\"]?: string;\n disabled?: boolean;\n hasGap: boolean;\n variant: variant;\n buttonType: buttonType;\n onClick: (buttonType: buttonType) => void;\n};\n\nconst cx = c.bind(styles);\nconst rootClassName = \"purpur-quantity-selector-button\";\n\nexport const QuantitySelectorButton = ({\n [\"data-testid\"]: dataTestid,\n [\"aria-label\"]: ariaLabel,\n disabled,\n hasGap,\n variant,\n buttonType,\n onClick,\n}: QuantitySelectorButtonProps) => {\n const classes = cx(rootClassName, {\n [`${rootClassName}--gap-left`]: hasGap && buttonType === \"decrement\",\n [`${rootClassName}--gap-right`]: hasGap && buttonType === \"increment\",\n [`${rootClassName}--no-gap-left`]: !hasGap && buttonType === \"decrement\",\n [`${rootClassName}--no-gap-right`]: !hasGap && buttonType === \"increment\",\n });\n\n return (\n <Button\n data-testid={dataTestid}\n className={classes}\n size=\"sm\"\n type=\"submit\"\n variant={variant}\n onClick={() => onClick(buttonType)}\n iconOnly={true}\n aria-label={ariaLabel ?? \"\"}\n disabled={disabled}\n tabIndex={-1}\n >\n {buttonType === \"increment\" ? <IconPlus size=\"xs\" /> : <IconMinus size=\"xs\" />}\n </Button>\n );\n};\n","import React, { type ChangeEvent, forwardRef, useEffect, useState } from \"react\";\nimport type { BaseProps } from \"@purpur/common-types\";\nimport { Spinner } from \"@purpur/spinner\";\nimport { TextField } from \"@purpur/text-field\";\nimport c from \"classnames/bind\";\n\nimport styles from \"./quantity-selector.module.scss\";\nimport { QuantitySelectorButton } from \"./quantity-selector-button\";\n\nconst cx = c.bind(styles);\n\nexport const quantitySelectorVariants = [\"attached\", \"separated\"] as const;\nexport const quantitySelectorButtonVariants = [\"primary\", \"secondary\"] as const;\n\ntype Variant = (typeof quantitySelectorVariants)[number];\ntype ButtonVariant = (typeof quantitySelectorButtonVariants)[number];\n\nexport type QuantitySelectorProps = Omit<BaseProps<\"input\">, \"onChange\" | \"type\"> & {\n variant: Variant;\n buttonVariant: ButtonVariant;\n onChange: (value: number) => void;\n defaultValue?: number;\n ariaLabelIncrement?: string;\n ariaLabelDecrement?: string;\n /**\n * Used when the component is controlled\n */\n value?: number;\n minValue?: number;\n maxValue?: number;\n label?: string;\n errorText?: string;\n fullWidth?: boolean;\n disabled?: boolean;\n loading?: boolean;\n};\n\nconst rootClassName = \"purpur-quantity-selector\";\n\nexport const QuantitySelector = forwardRef<HTMLInputElement, QuantitySelectorProps>(\n (\n {\n [\"data-testid\"]: dataTestId,\n className,\n variant,\n buttonVariant,\n onChange,\n value: controlledValue,\n defaultValue,\n fullWidth,\n disabled,\n loading,\n minValue,\n maxValue,\n ariaLabelDecrement,\n ariaLabelIncrement,\n ...props\n },\n ref\n ) => {\n const [uncontrolledValue, setUncontrolledValue] = useState(defaultValue ?? 0);\n const [debouncedValue, setDebouncedValue] = useState(uncontrolledValue);\n const isControlled = controlledValue !== undefined;\n const value = isControlled ? controlledValue : debouncedValue;\n\n const getTestId = (name: string) => (dataTestId ? `${dataTestId}-${name}` : undefined);\n const isDisabled = disabled || loading;\n const min = Math.max(minValue ?? 0, 0);\n const max = maxValue ?? Number.MAX_SAFE_INTEGER;\n const incrementDisabled = value === max;\n const decrementDisabled = value === min;\n\n useEffect(() => {\n if (isControlled) {\n setUncontrolledValue(controlledValue);\n }\n }, [controlledValue, isControlled]);\n\n useEffect(() => {\n if (!isControlled) {\n const timer = setTimeout(() => {\n setUncontrolledValue(debouncedValue);\n }, 300);\n\n return () => clearTimeout(timer);\n }\n return;\n }, [debouncedValue, isControlled, onChange]);\n\n const classes = cx(className, rootClassName, {\n [`${rootClassName}--no-gap`]:\n variant === \"attached\" && !isDisabled && !decrementDisabled && !incrementDisabled,\n [`${rootClassName}--no-gap-disabled-left`]:\n variant === \"attached\" && !isDisabled && !incrementDisabled && decrementDisabled,\n [`${rootClassName}--no-gap-disabled-right`]:\n variant === \"attached\" && !isDisabled && !decrementDisabled && incrementDisabled,\n [`${rootClassName}--no-gap-disabled`]:\n variant === \"attached\" && (isDisabled || (incrementDisabled && decrementDisabled)),\n [`${rootClassName}--full-width`]: fullWidth,\n [`${rootClassName}--loading`]: loading,\n });\n\n const handleOnChange = (e: ChangeEvent<HTMLInputElement>) => {\n const numericRegex = /^[0-9]*$/;\n if (!numericRegex.test(e.target.value)) {\n return;\n }\n const val = +e.target.value;\n if (val < min || val > max) {\n return;\n }\n\n if (!isControlled) {\n setDebouncedValue(val);\n }\n onChange(val);\n };\n\n const handleOnClick = (adjustmentType: \"increment\" | \"decrement\") => {\n const adjustedValue = adjustmentType === \"increment\" ? value + 1 : value - 1;\n if (adjustedValue < 0) {\n return;\n }\n\n if (!isControlled) {\n setDebouncedValue(adjustedValue);\n }\n onChange(adjustedValue);\n };\n\n const adjustmentButton = (adjustmentType: \"increment\" | \"decrement\") => {\n const buttonDisabled =\n (adjustmentType === \"increment\" && incrementDisabled) ||\n (adjustmentType === \"decrement\" && decrementDisabled);\n\n return (\n <QuantitySelectorButton\n data-testid={getTestId(\"button-\" + adjustmentType)}\n variant={buttonVariant}\n buttonType={adjustmentType}\n hasGap={variant === \"separated\"}\n onClick={handleOnClick}\n disabled={isDisabled || buttonDisabled}\n aria-label={adjustmentType === \"increment\" ? ariaLabelIncrement : ariaLabelDecrement}\n />\n );\n };\n\n const beforeField = (\n <>\n {loading && (\n <div\n className={cx(`${rootClassName}__spinner`, {\n [`${rootClassName}__spinner--full-width`]: fullWidth,\n [`${rootClassName}__spinner--separated`]: !fullWidth && variant === \"separated\",\n })}\n >\n <Spinner\n key=\"spinner\"\n disabled={isDisabled}\n size=\"xs\"\n data-testid={getTestId(\"spinner\")}\n />\n </div>\n )}\n {adjustmentButton(\"decrement\")}\n </>\n );\n\n return (\n <TextField\n value={value}\n type=\"number\"\n ref={ref}\n className={classes}\n data-testid={dataTestId}\n onChange={handleOnChange}\n beforeField={beforeField}\n afterField={adjustmentButton(\"increment\")}\n disabled={isDisabled}\n min={min}\n max={max}\n role=\"spinbutton\"\n aria-valuenow={value}\n aria-valuemax={max}\n aria-valuemin={min}\n {...props}\n />\n );\n }\n);\n\nQuantitySelector.displayName = \"QuantitySelector\";\n"],"names":["e","r","o","s","l","cx","c","styles","rootClassName","QuantitySelectorButton","dataTestid","ariaLabel","disabled","hasGap","variant","buttonType","onClick","classes","jsx","Button","IconPlus","IconMinus","quantitySelectorVariants","quantitySelectorButtonVariants","QuantitySelector","forwardRef","dataTestId","className","buttonVariant","onChange","controlledValue","defaultValue","fullWidth","loading","minValue","maxValue","ariaLabelDecrement","ariaLabelIncrement","props","ref","uncontrolledValue","setUncontrolledValue","useState","debouncedValue","setDebouncedValue","isControlled","value","getTestId","name","isDisabled","min","max","incrementDisabled","decrementDisabled","useEffect","timer","handleOnChange","val","handleOnClick","adjustmentType","adjustedValue","adjustmentButton","buttonDisabled","beforeField","jsxs","Fragment","Spinner","TextField"],"mappings":"0rCAEMA,EAAI,CACR,KAAM,OACN,IAAK,qQACL,SAAU,CAAC,MAAM,EACjB,SAAU,SACZ,EAAGC,EAAKC,GAAsBC,MAAEC,EAAAA,EAAG,CAAE,GAAGF,EAAG,IAAKF,EAAG,EACnDC,EAAE,YAAc,wfCaVI,EAAKC,EAAAA,EAAE,KAAKC,CAAM,EAClBC,EAAgB,kCAETC,EAAyB,CAAC,CACrC,CAAC,eAAgBC,EACjB,CAAC,cAAeC,EAChB,SAAAC,EACA,OAAAC,EACA,QAAAC,EACA,WAAAC,EACA,QAAAC,CACF,IAAmC,CACjC,MAAMC,EAAUZ,EAAGG,EAAe,CAChC,CAAC,GAAGA,CAAa,YAAY,EAAGK,GAAUE,IAAe,YACzD,CAAC,GAAGP,CAAa,aAAa,EAAGK,GAAUE,IAAe,YAC1D,CAAC,GAAGP,CAAa,eAAe,EAAG,CAACK,GAAUE,IAAe,YAC7D,CAAC,GAAGP,CAAa,gBAAgB,EAAG,CAACK,GAAUE,IAAe,WAAA,CAC/D,EAED,OACEG,EAAAA,IAACC,EAAAA,OAAA,CACC,cAAaT,EACb,UAAWO,EACX,KAAK,KACL,KAAK,SACL,QAAAH,EACA,QAAS,IAAME,EAAQD,CAAU,EACjC,SAAU,GACV,aAAYJ,GAAa,GACzB,SAAAC,EACA,SAAU,GAET,SAAAG,IAAe,YAAcG,EAAAA,IAACE,EAAA,CAAS,KAAK,KAAK,EAAKF,EAAAA,IAACG,EAAAA,EAAA,CAAU,KAAK,IAAA,CAAK,CAAA,CAAA,CAGlF,EC/CMhB,EAAKC,EAAAA,EAAE,KAAKC,CAAM,EAEXe,GAA2B,CAAC,WAAY,WAAW,EACnDC,GAAiC,CAAC,UAAW,WAAW,EAyB/Df,EAAgB,2BAETgB,EAAmBC,EAAAA,WAC9B,CACE,CACE,CAAC,eAAgBC,EACjB,UAAAC,EACA,QAAAb,EACA,cAAAc,EACA,SAAAC,EACA,MAAOC,EACP,aAAAC,EACA,UAAAC,EACA,SAAApB,EACA,QAAAqB,EACA,SAAAC,EACA,SAAAC,EACA,mBAAAC,EACA,mBAAAC,EACA,GAAGC,CAAA,EAELC,IACG,CACH,KAAM,CAACC,EAAmBC,CAAoB,EAAIC,EAAAA,SAASX,GAAgB,CAAC,EACtE,CAACY,EAAgBC,CAAiB,EAAIF,EAAAA,SAASF,CAAiB,EAChEK,EAAef,IAAoB,OACnCgB,EAAQD,EAAef,EAAkBa,EAEzCI,EAAaC,GAAkBtB,EAAa,GAAGA,CAAU,IAAIsB,CAAI,GAAK,OACtEC,EAAarC,GAAYqB,EACzBiB,EAAM,KAAK,IAAIhB,GAAY,EAAG,CAAC,EAC/BiB,EAAMhB,GAAY,OAAO,iBACzBiB,EAAoBN,IAAUK,EAC9BE,EAAoBP,IAAUI,EAEpCI,EAAAA,UAAU,IAAM,CACVT,GACFJ,EAAqBX,CAAe,CAExC,EAAG,CAACA,EAAiBe,CAAY,CAAC,EAElCS,EAAAA,UAAU,IAAM,CACd,GAAI,CAACT,EAAc,CACjB,MAAMU,EAAQ,WAAW,IAAM,CAC7Bd,EAAqBE,CAAc,CACrC,EAAG,GAAG,EAEN,MAAO,IAAM,aAAaY,CAAK,CACjC,CAEF,EAAG,CAACZ,EAAgBE,EAAchB,CAAQ,CAAC,EAE3C,MAAMZ,EAAUZ,EAAGsB,EAAWnB,EAAe,CAC3C,CAAC,GAAGA,CAAa,UAAU,EACzBM,IAAY,YAAc,CAACmC,GAAc,CAACI,GAAqB,CAACD,EAClE,CAAC,GAAG5C,CAAa,wBAAwB,EACvCM,IAAY,YAAc,CAACmC,GAAc,CAACG,GAAqBC,EACjE,CAAC,GAAG7C,CAAa,yBAAyB,EACxCM,IAAY,YAAc,CAACmC,GAAc,CAACI,GAAqBD,EACjE,CAAC,GAAG5C,CAAa,mBAAmB,EAClCM,IAAY,aAAemC,GAAeG,GAAqBC,GACjE,CAAC,GAAG7C,CAAa,cAAc,EAAGwB,EAClC,CAAC,GAAGxB,CAAa,WAAW,EAAGyB,CAAA,CAChC,EAEKuB,EAAkBxD,GAAqC,CAE3D,GAAI,CADiB,WACH,KAAKA,EAAE,OAAO,KAAK,EACnC,OAEF,MAAMyD,EAAM,CAACzD,EAAE,OAAO,MAClByD,EAAMP,GAAOO,EAAMN,IAIlBN,GACHD,EAAkBa,CAAG,EAEvB5B,EAAS4B,CAAG,EACd,EAEMC,EAAiBC,GAA8C,CACnE,MAAMC,EAAgBD,IAAmB,YAAcb,EAAQ,EAAIA,EAAQ,EACvEc,EAAgB,IAIff,GACHD,EAAkBgB,CAAa,EAEjC/B,EAAS+B,CAAa,EACxB,EAEMC,EAAoBF,GAA8C,CACtE,MAAMG,EACHH,IAAmB,aAAeP,GAClCO,IAAmB,aAAeN,EAErC,OACEnC,EAAAA,IAACT,EAAA,CACC,cAAasC,EAAU,UAAYY,CAAc,EACjD,QAAS/B,EACT,WAAY+B,EACZ,OAAQ7C,IAAY,YACpB,QAAS4C,EACT,SAAUT,GAAca,EACxB,aAAYH,IAAmB,YAActB,EAAqBD,CAAA,CAAA,CAGxE,EAEM2B,EACJC,EAAAA,KAAAC,EAAAA,SAAA,CACG,SAAA,CAAAhC,GACCf,EAAAA,IAAC,MAAA,CACC,UAAWb,EAAG,GAAGG,CAAa,YAAa,CACzC,CAAC,GAAGA,CAAa,uBAAuB,EAAGwB,EAC3C,CAAC,GAAGxB,CAAa,sBAAsB,EAAG,CAACwB,GAAalB,IAAY,WAAA,CACrE,EAED,SAAAI,EAAAA,IAACgD,EAAAA,QAAA,CAEC,SAAUjB,EACV,KAAK,KACL,cAAaF,EAAU,SAAS,CAAA,EAH5B,SAAA,CAIN,CAAA,EAGHc,EAAiB,WAAW,CAAA,EAC/B,EAGF,OACE3C,EAAAA,IAACiD,EAAAA,UAAA,CACC,MAAArB,EACA,KAAK,SACL,IAAAP,EACA,UAAWtB,EACX,cAAaS,EACb,SAAU8B,EACV,YAAAO,EACA,WAAYF,EAAiB,WAAW,EACxC,SAAUZ,EACV,IAAAC,EACA,IAAAC,EACA,KAAK,aACL,gBAAeL,EACf,gBAAeK,EACf,gBAAeD,EACd,GAAGZ,CAAA,CAAA,CAGV,CACF,EAEAd,EAAiB,YAAc"}
|
|
1
|
+
{"version":3,"file":"quantity-selector-Ds7d4MnV.js","sources":["../../../components/icon/dist/components/plus.es.js","../../../components/quantity-selector/src/quantity-selector-button.tsx","../../../components/quantity-selector/src/quantity-selector.tsx"],"sourcesContent":["import { jsx as s } from \"react/jsx-runtime\";\nimport { I as l } from \"../icon-DNHpBTHs.mjs\";\nconst e = {\n name: \"plus\",\n svg: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path fill-rule=\"evenodd\" d=\"M12 4.1a.9.9 0 0 1 .9.9v6.1H19a.9.9 0 1 1 0 1.8h-6.1V19a.9.9 0 0 1-1.8 0v-6.1H5a.9.9 0 0 1 0-1.8h6.1V5a.9.9 0 0 1 .9-.9Z\" clip-rule=\"evenodd\"/></svg>',\n keywords: [\"plus\"],\n category: \"utility\"\n}, r = (o) => /* @__PURE__ */ s(l, { ...o, svg: e });\nr.displayName = \"IconPlus\";\nexport {\n r as IconPlus\n};\n//# sourceMappingURL=plus.es.js.map\n","import React from \"react\";\nimport { Button } from \"@purpur/button\";\nimport { IconMinus } from \"@purpur/icon/minus\";\nimport { IconPlus } from \"@purpur/icon/plus\";\nimport c from \"classnames/bind\";\n\nimport styles from \"./quantity-selector-button.module.scss\";\n\ntype variant = \"primary\" | \"secondary\";\ntype buttonType = \"increment\" | \"decrement\";\n\ntype QuantitySelectorButtonProps = {\n [\"data-testid\"]?: string;\n [\"aria-label\"]?: string;\n disabled?: boolean;\n hasGap: boolean;\n variant: variant;\n buttonType: buttonType;\n onClick: (buttonType: buttonType) => void;\n};\n\nconst cx = c.bind(styles);\nconst rootClassName = \"purpur-quantity-selector-button\";\n\nexport const QuantitySelectorButton = ({\n [\"data-testid\"]: dataTestid,\n [\"aria-label\"]: ariaLabel,\n disabled,\n hasGap,\n variant,\n buttonType,\n onClick,\n}: QuantitySelectorButtonProps) => {\n const classes = cx(rootClassName, {\n [`${rootClassName}--gap-left`]: hasGap && buttonType === \"decrement\",\n [`${rootClassName}--gap-right`]: hasGap && buttonType === \"increment\",\n [`${rootClassName}--no-gap-left`]: !hasGap && buttonType === \"decrement\",\n [`${rootClassName}--no-gap-right`]: !hasGap && buttonType === \"increment\",\n });\n\n return (\n <Button\n data-testid={dataTestid}\n className={classes}\n size=\"sm\"\n type=\"submit\"\n variant={variant}\n onClick={() => onClick(buttonType)}\n iconOnly={true}\n aria-label={ariaLabel ?? \"\"}\n disabled={disabled}\n tabIndex={-1}\n >\n {buttonType === \"increment\" ? <IconPlus size=\"xs\" /> : <IconMinus size=\"xs\" />}\n </Button>\n );\n};\n","import React, { type ChangeEvent, forwardRef, useEffect, useState } from \"react\";\nimport type { BaseProps } from \"@purpur/common-types\";\nimport { Spinner } from \"@purpur/spinner\";\nimport { TextField } from \"@purpur/text-field\";\nimport c from \"classnames/bind\";\n\nimport styles from \"./quantity-selector.module.scss\";\nimport { QuantitySelectorButton } from \"./quantity-selector-button\";\n\nconst cx = c.bind(styles);\n\nexport const quantitySelectorVariants = [\"attached\", \"separated\"] as const;\nexport const quantitySelectorButtonVariants = [\"primary\", \"secondary\"] as const;\n\ntype Variant = (typeof quantitySelectorVariants)[number];\ntype ButtonVariant = (typeof quantitySelectorButtonVariants)[number];\n\nexport type QuantitySelectorProps = Omit<BaseProps<\"input\">, \"onChange\" | \"type\"> & {\n variant: Variant;\n buttonVariant: ButtonVariant;\n onChange: (value: number) => void;\n defaultValue?: number;\n ariaLabelIncrement?: string;\n ariaLabelDecrement?: string;\n /**\n * Used when the component is controlled\n */\n value?: number;\n minValue?: number;\n maxValue?: number;\n label?: string;\n errorText?: string;\n fullWidth?: boolean;\n disabled?: boolean;\n loading?: boolean;\n};\n\nconst rootClassName = \"purpur-quantity-selector\";\n\nexport const QuantitySelector = forwardRef<HTMLInputElement, QuantitySelectorProps>(\n (\n {\n [\"data-testid\"]: dataTestId,\n className,\n variant,\n buttonVariant,\n onChange,\n value: controlledValue,\n defaultValue,\n fullWidth,\n disabled,\n loading,\n minValue,\n maxValue,\n ariaLabelDecrement,\n ariaLabelIncrement,\n ...props\n },\n ref\n ) => {\n const [uncontrolledValue, setUncontrolledValue] = useState(defaultValue ?? 0);\n const [debouncedValue, setDebouncedValue] = useState(uncontrolledValue);\n const isControlled = controlledValue !== undefined;\n const value = isControlled ? controlledValue : debouncedValue;\n\n const getTestId = (name: string) => (dataTestId ? `${dataTestId}-${name}` : undefined);\n const isDisabled = disabled || loading;\n const min = Math.max(minValue ?? 0, 0);\n const max = maxValue ?? Number.MAX_SAFE_INTEGER;\n const incrementDisabled = value === max;\n const decrementDisabled = value === min;\n\n useEffect(() => {\n if (isControlled) {\n setUncontrolledValue(controlledValue);\n }\n }, [controlledValue, isControlled]);\n\n useEffect(() => {\n if (!isControlled) {\n const timer = setTimeout(() => {\n setUncontrolledValue(debouncedValue);\n }, 300);\n\n return () => clearTimeout(timer);\n }\n return;\n }, [debouncedValue, isControlled, onChange]);\n\n const classes = cx(className, rootClassName, {\n [`${rootClassName}--no-gap`]:\n variant === \"attached\" && !isDisabled && !decrementDisabled && !incrementDisabled,\n [`${rootClassName}--no-gap-disabled-left`]:\n variant === \"attached\" && !isDisabled && !incrementDisabled && decrementDisabled,\n [`${rootClassName}--no-gap-disabled-right`]:\n variant === \"attached\" && !isDisabled && !decrementDisabled && incrementDisabled,\n [`${rootClassName}--no-gap-disabled`]:\n variant === \"attached\" && (isDisabled || (incrementDisabled && decrementDisabled)),\n [`${rootClassName}--full-width`]: fullWidth,\n [`${rootClassName}--loading`]: loading,\n });\n\n const handleOnChange = (e: ChangeEvent<HTMLInputElement>) => {\n const numericRegex = /^[0-9]*$/;\n if (!numericRegex.test(e.target.value)) {\n return;\n }\n const val = +e.target.value;\n if (val < min || val > max) {\n return;\n }\n\n if (!isControlled) {\n setDebouncedValue(val);\n }\n onChange(val);\n };\n\n const handleOnClick = (adjustmentType: \"increment\" | \"decrement\") => {\n const adjustedValue = adjustmentType === \"increment\" ? value + 1 : value - 1;\n if (adjustedValue < 0) {\n return;\n }\n\n if (!isControlled) {\n setDebouncedValue(adjustedValue);\n }\n onChange(adjustedValue);\n };\n\n const adjustmentButton = (adjustmentType: \"increment\" | \"decrement\") => {\n const buttonDisabled =\n (adjustmentType === \"increment\" && incrementDisabled) ||\n (adjustmentType === \"decrement\" && decrementDisabled);\n\n return (\n <QuantitySelectorButton\n data-testid={getTestId(\"button-\" + adjustmentType)}\n variant={buttonVariant}\n buttonType={adjustmentType}\n hasGap={variant === \"separated\"}\n onClick={handleOnClick}\n disabled={isDisabled || buttonDisabled}\n aria-label={adjustmentType === \"increment\" ? ariaLabelIncrement : ariaLabelDecrement}\n />\n );\n };\n\n const beforeField = (\n <>\n {loading && (\n <div\n className={cx(`${rootClassName}__spinner`, {\n [`${rootClassName}__spinner--full-width`]: fullWidth,\n [`${rootClassName}__spinner--separated`]: !fullWidth && variant === \"separated\",\n })}\n >\n <Spinner\n key=\"spinner\"\n disabled={isDisabled}\n size=\"xs\"\n data-testid={getTestId(\"spinner\")}\n />\n </div>\n )}\n {adjustmentButton(\"decrement\")}\n </>\n );\n\n return (\n <TextField\n value={value}\n type=\"number\"\n ref={ref}\n className={classes}\n data-testid={dataTestId}\n onChange={handleOnChange}\n beforeField={beforeField}\n afterField={adjustmentButton(\"increment\")}\n disabled={isDisabled}\n min={min}\n max={max}\n role=\"spinbutton\"\n aria-valuenow={value}\n aria-valuemax={max}\n aria-valuemin={min}\n {...props}\n />\n );\n }\n);\n\nQuantitySelector.displayName = \"QuantitySelector\";\n"],"names":["e","r","o","s","l","cx","c","styles","rootClassName","QuantitySelectorButton","dataTestid","ariaLabel","disabled","hasGap","variant","buttonType","onClick","classes","jsx","Button","IconPlus","IconMinus","quantitySelectorVariants","quantitySelectorButtonVariants","QuantitySelector","forwardRef","dataTestId","className","buttonVariant","onChange","controlledValue","defaultValue","fullWidth","loading","minValue","maxValue","ariaLabelDecrement","ariaLabelIncrement","props","ref","uncontrolledValue","setUncontrolledValue","useState","debouncedValue","setDebouncedValue","isControlled","value","getTestId","name","isDisabled","min","max","incrementDisabled","decrementDisabled","useEffect","timer","handleOnChange","val","handleOnClick","adjustmentType","adjustedValue","adjustmentButton","buttonDisabled","beforeField","jsxs","Fragment","Spinner","TextField"],"mappings":"0rCAEMA,EAAI,CACR,KAAM,OACN,IAAK,qQACL,SAAU,CAAC,MAAM,EACjB,SAAU,SACZ,EAAGC,EAAKC,GAAsBC,MAAEC,EAAAA,EAAG,CAAE,GAAGF,EAAG,IAAKF,EAAG,EACnDC,EAAE,YAAc,wfCaVI,EAAKC,EAAAA,EAAE,KAAKC,CAAM,EAClBC,EAAgB,kCAETC,EAAyB,CAAC,CACrC,CAAC,eAAgBC,EACjB,CAAC,cAAeC,EAChB,SAAAC,EACA,OAAAC,EACA,QAAAC,EACA,WAAAC,EACA,QAAAC,CACF,IAAmC,CACjC,MAAMC,EAAUZ,EAAGG,EAAe,CAChC,CAAC,GAAGA,CAAa,YAAY,EAAGK,GAAUE,IAAe,YACzD,CAAC,GAAGP,CAAa,aAAa,EAAGK,GAAUE,IAAe,YAC1D,CAAC,GAAGP,CAAa,eAAe,EAAG,CAACK,GAAUE,IAAe,YAC7D,CAAC,GAAGP,CAAa,gBAAgB,EAAG,CAACK,GAAUE,IAAe,WAAA,CAC/D,EAED,OACEG,EAAAA,IAACC,EAAAA,OAAA,CACC,cAAaT,EACb,UAAWO,EACX,KAAK,KACL,KAAK,SACL,QAAAH,EACA,QAAS,IAAME,EAAQD,CAAU,EACjC,SAAU,GACV,aAAYJ,GAAa,GACzB,SAAAC,EACA,SAAU,GAET,SAAAG,IAAe,YAAcG,EAAAA,IAACE,EAAA,CAAS,KAAK,KAAK,EAAKF,EAAAA,IAACG,EAAAA,EAAA,CAAU,KAAK,IAAA,CAAK,CAAA,CAAA,CAGlF,EC/CMhB,EAAKC,EAAAA,EAAE,KAAKC,CAAM,EAEXe,GAA2B,CAAC,WAAY,WAAW,EACnDC,GAAiC,CAAC,UAAW,WAAW,EAyB/Df,EAAgB,2BAETgB,EAAmBC,EAAAA,WAC9B,CACE,CACE,CAAC,eAAgBC,EACjB,UAAAC,EACA,QAAAb,EACA,cAAAc,EACA,SAAAC,EACA,MAAOC,EACP,aAAAC,EACA,UAAAC,EACA,SAAApB,EACA,QAAAqB,EACA,SAAAC,EACA,SAAAC,EACA,mBAAAC,EACA,mBAAAC,EACA,GAAGC,CAAA,EAELC,IACG,CACH,KAAM,CAACC,EAAmBC,CAAoB,EAAIC,EAAAA,SAASX,GAAgB,CAAC,EACtE,CAACY,EAAgBC,CAAiB,EAAIF,EAAAA,SAASF,CAAiB,EAChEK,EAAef,IAAoB,OACnCgB,EAAQD,EAAef,EAAkBa,EAEzCI,EAAaC,GAAkBtB,EAAa,GAAGA,CAAU,IAAIsB,CAAI,GAAK,OACtEC,EAAarC,GAAYqB,EACzBiB,EAAM,KAAK,IAAIhB,GAAY,EAAG,CAAC,EAC/BiB,EAAMhB,GAAY,OAAO,iBACzBiB,EAAoBN,IAAUK,EAC9BE,EAAoBP,IAAUI,EAEpCI,EAAAA,UAAU,IAAM,CACVT,GACFJ,EAAqBX,CAAe,CAExC,EAAG,CAACA,EAAiBe,CAAY,CAAC,EAElCS,EAAAA,UAAU,IAAM,CACd,GAAI,CAACT,EAAc,CACjB,MAAMU,EAAQ,WAAW,IAAM,CAC7Bd,EAAqBE,CAAc,CACrC,EAAG,GAAG,EAEN,MAAO,IAAM,aAAaY,CAAK,CACjC,CAEF,EAAG,CAACZ,EAAgBE,EAAchB,CAAQ,CAAC,EAE3C,MAAMZ,EAAUZ,EAAGsB,EAAWnB,EAAe,CAC3C,CAAC,GAAGA,CAAa,UAAU,EACzBM,IAAY,YAAc,CAACmC,GAAc,CAACI,GAAqB,CAACD,EAClE,CAAC,GAAG5C,CAAa,wBAAwB,EACvCM,IAAY,YAAc,CAACmC,GAAc,CAACG,GAAqBC,EACjE,CAAC,GAAG7C,CAAa,yBAAyB,EACxCM,IAAY,YAAc,CAACmC,GAAc,CAACI,GAAqBD,EACjE,CAAC,GAAG5C,CAAa,mBAAmB,EAClCM,IAAY,aAAemC,GAAeG,GAAqBC,GACjE,CAAC,GAAG7C,CAAa,cAAc,EAAGwB,EAClC,CAAC,GAAGxB,CAAa,WAAW,EAAGyB,CAAA,CAChC,EAEKuB,EAAkBxD,GAAqC,CAE3D,GAAI,CADiB,WACH,KAAKA,EAAE,OAAO,KAAK,EACnC,OAEF,MAAMyD,EAAM,CAACzD,EAAE,OAAO,MAClByD,EAAMP,GAAOO,EAAMN,IAIlBN,GACHD,EAAkBa,CAAG,EAEvB5B,EAAS4B,CAAG,EACd,EAEMC,EAAiBC,GAA8C,CACnE,MAAMC,EAAgBD,IAAmB,YAAcb,EAAQ,EAAIA,EAAQ,EACvEc,EAAgB,IAIff,GACHD,EAAkBgB,CAAa,EAEjC/B,EAAS+B,CAAa,EACxB,EAEMC,EAAoBF,GAA8C,CACtE,MAAMG,EACHH,IAAmB,aAAeP,GAClCO,IAAmB,aAAeN,EAErC,OACEnC,EAAAA,IAACT,EAAA,CACC,cAAasC,EAAU,UAAYY,CAAc,EACjD,QAAS/B,EACT,WAAY+B,EACZ,OAAQ7C,IAAY,YACpB,QAAS4C,EACT,SAAUT,GAAca,EACxB,aAAYH,IAAmB,YAActB,EAAqBD,CAAA,CAAA,CAGxE,EAEM2B,EACJC,EAAAA,KAAAC,EAAAA,SAAA,CACG,SAAA,CAAAhC,GACCf,EAAAA,IAAC,MAAA,CACC,UAAWb,EAAG,GAAGG,CAAa,YAAa,CACzC,CAAC,GAAGA,CAAa,uBAAuB,EAAGwB,EAC3C,CAAC,GAAGxB,CAAa,sBAAsB,EAAG,CAACwB,GAAalB,IAAY,WAAA,CACrE,EAED,SAAAI,EAAAA,IAACgD,EAAAA,QAAA,CAEC,SAAUjB,EACV,KAAK,KACL,cAAaF,EAAU,SAAS,CAAA,EAH5B,SAAA,CAIN,CAAA,EAGHc,EAAiB,WAAW,CAAA,EAC/B,EAGF,OACE3C,EAAAA,IAACiD,EAAAA,UAAA,CACC,MAAArB,EACA,KAAK,SACL,IAAAP,EACA,UAAWtB,EACX,cAAaS,EACb,SAAU8B,EACV,YAAAO,EACA,WAAYF,EAAiB,WAAW,EACxC,SAAUZ,EACV,IAAAC,EACA,IAAAC,EACA,KAAK,aACL,gBAAeL,EACf,gBAAeK,EACf,gBAAeD,EACd,GAAGZ,CAAA,CAAA,CAGV,CACF,EAEAd,EAAiB,YAAc"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { jsx as a, jsxs as U, Fragment as X } from "react/jsx-runtime";
|
|
2
2
|
import { forwardRef as Z, useState as C, useEffect as V } from "react";
|
|
3
3
|
import { a as J } from "./spinner-DRQN6YdK.mjs";
|
|
4
|
-
import { T as K } from "./text-field-
|
|
4
|
+
import { T as K } from "./text-field-C9LX7LBf.mjs";
|
|
5
5
|
import { c as B } from "./bind-CU-R61T-.mjs";
|
|
6
|
-
import { b as L } from "./button-
|
|
6
|
+
import { b as L } from "./button-EVRfctR8.mjs";
|
|
7
7
|
import { e as Y } from "./minus.es-BK9qA9iJ.mjs";
|
|
8
8
|
import { b as G } from "./icon-DNHpBTHs-JfI8WyiR.mjs";
|
|
9
9
|
const W = {
|
|
@@ -169,4 +169,4 @@ export {
|
|
|
169
169
|
dt as a,
|
|
170
170
|
_t as q
|
|
171
171
|
};
|
|
172
|
-
//# sourceMappingURL=quantity-selector-
|
|
172
|
+
//# sourceMappingURL=quantity-selector-DwkKKmFy.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quantity-selector-Cp-e5xKJ.mjs","sources":["../../../components/icon/dist/components/plus.es.js","../../../components/quantity-selector/src/quantity-selector-button.tsx","../../../components/quantity-selector/src/quantity-selector.tsx"],"sourcesContent":["import { jsx as s } from \"react/jsx-runtime\";\nimport { I as l } from \"../icon-DNHpBTHs.mjs\";\nconst e = {\n name: \"plus\",\n svg: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path fill-rule=\"evenodd\" d=\"M12 4.1a.9.9 0 0 1 .9.9v6.1H19a.9.9 0 1 1 0 1.8h-6.1V19a.9.9 0 0 1-1.8 0v-6.1H5a.9.9 0 0 1 0-1.8h6.1V5a.9.9 0 0 1 .9-.9Z\" clip-rule=\"evenodd\"/></svg>',\n keywords: [\"plus\"],\n category: \"utility\"\n}, r = (o) => /* @__PURE__ */ s(l, { ...o, svg: e });\nr.displayName = \"IconPlus\";\nexport {\n r as IconPlus\n};\n//# sourceMappingURL=plus.es.js.map\n","import React from \"react\";\nimport { Button } from \"@purpur/button\";\nimport { IconMinus } from \"@purpur/icon/minus\";\nimport { IconPlus } from \"@purpur/icon/plus\";\nimport c from \"classnames/bind\";\n\nimport styles from \"./quantity-selector-button.module.scss\";\n\ntype variant = \"primary\" | \"secondary\";\ntype buttonType = \"increment\" | \"decrement\";\n\ntype QuantitySelectorButtonProps = {\n [\"data-testid\"]?: string;\n [\"aria-label\"]?: string;\n disabled?: boolean;\n hasGap: boolean;\n variant: variant;\n buttonType: buttonType;\n onClick: (buttonType: buttonType) => void;\n};\n\nconst cx = c.bind(styles);\nconst rootClassName = \"purpur-quantity-selector-button\";\n\nexport const QuantitySelectorButton = ({\n [\"data-testid\"]: dataTestid,\n [\"aria-label\"]: ariaLabel,\n disabled,\n hasGap,\n variant,\n buttonType,\n onClick,\n}: QuantitySelectorButtonProps) => {\n const classes = cx(rootClassName, {\n [`${rootClassName}--gap-left`]: hasGap && buttonType === \"decrement\",\n [`${rootClassName}--gap-right`]: hasGap && buttonType === \"increment\",\n [`${rootClassName}--no-gap-left`]: !hasGap && buttonType === \"decrement\",\n [`${rootClassName}--no-gap-right`]: !hasGap && buttonType === \"increment\",\n });\n\n return (\n <Button\n data-testid={dataTestid}\n className={classes}\n size=\"sm\"\n type=\"submit\"\n variant={variant}\n onClick={() => onClick(buttonType)}\n iconOnly={true}\n aria-label={ariaLabel ?? \"\"}\n disabled={disabled}\n tabIndex={-1}\n >\n {buttonType === \"increment\" ? <IconPlus size=\"xs\" /> : <IconMinus size=\"xs\" />}\n </Button>\n );\n};\n","import React, { type ChangeEvent, forwardRef, useEffect, useState } from \"react\";\nimport type { BaseProps } from \"@purpur/common-types\";\nimport { Spinner } from \"@purpur/spinner\";\nimport { TextField } from \"@purpur/text-field\";\nimport c from \"classnames/bind\";\n\nimport styles from \"./quantity-selector.module.scss\";\nimport { QuantitySelectorButton } from \"./quantity-selector-button\";\n\nconst cx = c.bind(styles);\n\nexport const quantitySelectorVariants = [\"attached\", \"separated\"] as const;\nexport const quantitySelectorButtonVariants = [\"primary\", \"secondary\"] as const;\n\ntype Variant = (typeof quantitySelectorVariants)[number];\ntype ButtonVariant = (typeof quantitySelectorButtonVariants)[number];\n\nexport type QuantitySelectorProps = Omit<BaseProps<\"input\">, \"onChange\" | \"type\"> & {\n variant: Variant;\n buttonVariant: ButtonVariant;\n onChange: (value: number) => void;\n defaultValue?: number;\n ariaLabelIncrement?: string;\n ariaLabelDecrement?: string;\n /**\n * Used when the component is controlled\n */\n value?: number;\n minValue?: number;\n maxValue?: number;\n label?: string;\n errorText?: string;\n fullWidth?: boolean;\n disabled?: boolean;\n loading?: boolean;\n};\n\nconst rootClassName = \"purpur-quantity-selector\";\n\nexport const QuantitySelector = forwardRef<HTMLInputElement, QuantitySelectorProps>(\n (\n {\n [\"data-testid\"]: dataTestId,\n className,\n variant,\n buttonVariant,\n onChange,\n value: controlledValue,\n defaultValue,\n fullWidth,\n disabled,\n loading,\n minValue,\n maxValue,\n ariaLabelDecrement,\n ariaLabelIncrement,\n ...props\n },\n ref\n ) => {\n const [uncontrolledValue, setUncontrolledValue] = useState(defaultValue ?? 0);\n const [debouncedValue, setDebouncedValue] = useState(uncontrolledValue);\n const isControlled = controlledValue !== undefined;\n const value = isControlled ? controlledValue : debouncedValue;\n\n const getTestId = (name: string) => (dataTestId ? `${dataTestId}-${name}` : undefined);\n const isDisabled = disabled || loading;\n const min = Math.max(minValue ?? 0, 0);\n const max = maxValue ?? Number.MAX_SAFE_INTEGER;\n const incrementDisabled = value === max;\n const decrementDisabled = value === min;\n\n useEffect(() => {\n if (isControlled) {\n setUncontrolledValue(controlledValue);\n }\n }, [controlledValue, isControlled]);\n\n useEffect(() => {\n if (!isControlled) {\n const timer = setTimeout(() => {\n setUncontrolledValue(debouncedValue);\n }, 300);\n\n return () => clearTimeout(timer);\n }\n return;\n }, [debouncedValue, isControlled, onChange]);\n\n const classes = cx(className, rootClassName, {\n [`${rootClassName}--no-gap`]:\n variant === \"attached\" && !isDisabled && !decrementDisabled && !incrementDisabled,\n [`${rootClassName}--no-gap-disabled-left`]:\n variant === \"attached\" && !isDisabled && !incrementDisabled && decrementDisabled,\n [`${rootClassName}--no-gap-disabled-right`]:\n variant === \"attached\" && !isDisabled && !decrementDisabled && incrementDisabled,\n [`${rootClassName}--no-gap-disabled`]:\n variant === \"attached\" && (isDisabled || (incrementDisabled && decrementDisabled)),\n [`${rootClassName}--full-width`]: fullWidth,\n [`${rootClassName}--loading`]: loading,\n });\n\n const handleOnChange = (e: ChangeEvent<HTMLInputElement>) => {\n const numericRegex = /^[0-9]*$/;\n if (!numericRegex.test(e.target.value)) {\n return;\n }\n const val = +e.target.value;\n if (val < min || val > max) {\n return;\n }\n\n if (!isControlled) {\n setDebouncedValue(val);\n }\n onChange(val);\n };\n\n const handleOnClick = (adjustmentType: \"increment\" | \"decrement\") => {\n const adjustedValue = adjustmentType === \"increment\" ? value + 1 : value - 1;\n if (adjustedValue < 0) {\n return;\n }\n\n if (!isControlled) {\n setDebouncedValue(adjustedValue);\n }\n onChange(adjustedValue);\n };\n\n const adjustmentButton = (adjustmentType: \"increment\" | \"decrement\") => {\n const buttonDisabled =\n (adjustmentType === \"increment\" && incrementDisabled) ||\n (adjustmentType === \"decrement\" && decrementDisabled);\n\n return (\n <QuantitySelectorButton\n data-testid={getTestId(\"button-\" + adjustmentType)}\n variant={buttonVariant}\n buttonType={adjustmentType}\n hasGap={variant === \"separated\"}\n onClick={handleOnClick}\n disabled={isDisabled || buttonDisabled}\n aria-label={adjustmentType === \"increment\" ? ariaLabelIncrement : ariaLabelDecrement}\n />\n );\n };\n\n const beforeField = (\n <>\n {loading && (\n <div\n className={cx(`${rootClassName}__spinner`, {\n [`${rootClassName}__spinner--full-width`]: fullWidth,\n [`${rootClassName}__spinner--separated`]: !fullWidth && variant === \"separated\",\n })}\n >\n <Spinner\n key=\"spinner\"\n disabled={isDisabled}\n size=\"xs\"\n data-testid={getTestId(\"spinner\")}\n />\n </div>\n )}\n {adjustmentButton(\"decrement\")}\n </>\n );\n\n return (\n <TextField\n value={value}\n type=\"number\"\n ref={ref}\n className={classes}\n data-testid={dataTestId}\n onChange={handleOnChange}\n beforeField={beforeField}\n afterField={adjustmentButton(\"increment\")}\n disabled={isDisabled}\n min={min}\n max={max}\n role=\"spinbutton\"\n aria-valuenow={value}\n aria-valuemax={max}\n aria-valuemin={min}\n {...props}\n />\n );\n }\n);\n\nQuantitySelector.displayName = \"QuantitySelector\";\n"],"names":["e","r","o","s","l","cx","c","styles","rootClassName","QuantitySelectorButton","dataTestid","ariaLabel","disabled","hasGap","variant","buttonType","onClick","classes","jsx","Button","IconPlus","IconMinus","quantitySelectorVariants","quantitySelectorButtonVariants","QuantitySelector","forwardRef","dataTestId","className","buttonVariant","onChange","controlledValue","defaultValue","fullWidth","loading","minValue","maxValue","ariaLabelDecrement","ariaLabelIncrement","props","ref","uncontrolledValue","setUncontrolledValue","useState","debouncedValue","setDebouncedValue","isControlled","value","getTestId","name","isDisabled","min","max","incrementDisabled","decrementDisabled","useEffect","timer","handleOnChange","val","handleOnClick","adjustmentType","adjustedValue","adjustmentButton","buttonDisabled","beforeField","jsxs","Fragment","Spinner","TextField"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"quantity-selector-DwkKKmFy.mjs","sources":["../../../components/icon/dist/components/plus.es.js","../../../components/quantity-selector/src/quantity-selector-button.tsx","../../../components/quantity-selector/src/quantity-selector.tsx"],"sourcesContent":["import { jsx as s } from \"react/jsx-runtime\";\nimport { I as l } from \"../icon-DNHpBTHs.mjs\";\nconst e = {\n name: \"plus\",\n svg: '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"currentColor\"><path fill-rule=\"evenodd\" d=\"M12 4.1a.9.9 0 0 1 .9.9v6.1H19a.9.9 0 1 1 0 1.8h-6.1V19a.9.9 0 0 1-1.8 0v-6.1H5a.9.9 0 0 1 0-1.8h6.1V5a.9.9 0 0 1 .9-.9Z\" clip-rule=\"evenodd\"/></svg>',\n keywords: [\"plus\"],\n category: \"utility\"\n}, r = (o) => /* @__PURE__ */ s(l, { ...o, svg: e });\nr.displayName = \"IconPlus\";\nexport {\n r as IconPlus\n};\n//# sourceMappingURL=plus.es.js.map\n","import React from \"react\";\nimport { Button } from \"@purpur/button\";\nimport { IconMinus } from \"@purpur/icon/minus\";\nimport { IconPlus } from \"@purpur/icon/plus\";\nimport c from \"classnames/bind\";\n\nimport styles from \"./quantity-selector-button.module.scss\";\n\ntype variant = \"primary\" | \"secondary\";\ntype buttonType = \"increment\" | \"decrement\";\n\ntype QuantitySelectorButtonProps = {\n [\"data-testid\"]?: string;\n [\"aria-label\"]?: string;\n disabled?: boolean;\n hasGap: boolean;\n variant: variant;\n buttonType: buttonType;\n onClick: (buttonType: buttonType) => void;\n};\n\nconst cx = c.bind(styles);\nconst rootClassName = \"purpur-quantity-selector-button\";\n\nexport const QuantitySelectorButton = ({\n [\"data-testid\"]: dataTestid,\n [\"aria-label\"]: ariaLabel,\n disabled,\n hasGap,\n variant,\n buttonType,\n onClick,\n}: QuantitySelectorButtonProps) => {\n const classes = cx(rootClassName, {\n [`${rootClassName}--gap-left`]: hasGap && buttonType === \"decrement\",\n [`${rootClassName}--gap-right`]: hasGap && buttonType === \"increment\",\n [`${rootClassName}--no-gap-left`]: !hasGap && buttonType === \"decrement\",\n [`${rootClassName}--no-gap-right`]: !hasGap && buttonType === \"increment\",\n });\n\n return (\n <Button\n data-testid={dataTestid}\n className={classes}\n size=\"sm\"\n type=\"submit\"\n variant={variant}\n onClick={() => onClick(buttonType)}\n iconOnly={true}\n aria-label={ariaLabel ?? \"\"}\n disabled={disabled}\n tabIndex={-1}\n >\n {buttonType === \"increment\" ? <IconPlus size=\"xs\" /> : <IconMinus size=\"xs\" />}\n </Button>\n );\n};\n","import React, { type ChangeEvent, forwardRef, useEffect, useState } from \"react\";\nimport type { BaseProps } from \"@purpur/common-types\";\nimport { Spinner } from \"@purpur/spinner\";\nimport { TextField } from \"@purpur/text-field\";\nimport c from \"classnames/bind\";\n\nimport styles from \"./quantity-selector.module.scss\";\nimport { QuantitySelectorButton } from \"./quantity-selector-button\";\n\nconst cx = c.bind(styles);\n\nexport const quantitySelectorVariants = [\"attached\", \"separated\"] as const;\nexport const quantitySelectorButtonVariants = [\"primary\", \"secondary\"] as const;\n\ntype Variant = (typeof quantitySelectorVariants)[number];\ntype ButtonVariant = (typeof quantitySelectorButtonVariants)[number];\n\nexport type QuantitySelectorProps = Omit<BaseProps<\"input\">, \"onChange\" | \"type\"> & {\n variant: Variant;\n buttonVariant: ButtonVariant;\n onChange: (value: number) => void;\n defaultValue?: number;\n ariaLabelIncrement?: string;\n ariaLabelDecrement?: string;\n /**\n * Used when the component is controlled\n */\n value?: number;\n minValue?: number;\n maxValue?: number;\n label?: string;\n errorText?: string;\n fullWidth?: boolean;\n disabled?: boolean;\n loading?: boolean;\n};\n\nconst rootClassName = \"purpur-quantity-selector\";\n\nexport const QuantitySelector = forwardRef<HTMLInputElement, QuantitySelectorProps>(\n (\n {\n [\"data-testid\"]: dataTestId,\n className,\n variant,\n buttonVariant,\n onChange,\n value: controlledValue,\n defaultValue,\n fullWidth,\n disabled,\n loading,\n minValue,\n maxValue,\n ariaLabelDecrement,\n ariaLabelIncrement,\n ...props\n },\n ref\n ) => {\n const [uncontrolledValue, setUncontrolledValue] = useState(defaultValue ?? 0);\n const [debouncedValue, setDebouncedValue] = useState(uncontrolledValue);\n const isControlled = controlledValue !== undefined;\n const value = isControlled ? controlledValue : debouncedValue;\n\n const getTestId = (name: string) => (dataTestId ? `${dataTestId}-${name}` : undefined);\n const isDisabled = disabled || loading;\n const min = Math.max(minValue ?? 0, 0);\n const max = maxValue ?? Number.MAX_SAFE_INTEGER;\n const incrementDisabled = value === max;\n const decrementDisabled = value === min;\n\n useEffect(() => {\n if (isControlled) {\n setUncontrolledValue(controlledValue);\n }\n }, [controlledValue, isControlled]);\n\n useEffect(() => {\n if (!isControlled) {\n const timer = setTimeout(() => {\n setUncontrolledValue(debouncedValue);\n }, 300);\n\n return () => clearTimeout(timer);\n }\n return;\n }, [debouncedValue, isControlled, onChange]);\n\n const classes = cx(className, rootClassName, {\n [`${rootClassName}--no-gap`]:\n variant === \"attached\" && !isDisabled && !decrementDisabled && !incrementDisabled,\n [`${rootClassName}--no-gap-disabled-left`]:\n variant === \"attached\" && !isDisabled && !incrementDisabled && decrementDisabled,\n [`${rootClassName}--no-gap-disabled-right`]:\n variant === \"attached\" && !isDisabled && !decrementDisabled && incrementDisabled,\n [`${rootClassName}--no-gap-disabled`]:\n variant === \"attached\" && (isDisabled || (incrementDisabled && decrementDisabled)),\n [`${rootClassName}--full-width`]: fullWidth,\n [`${rootClassName}--loading`]: loading,\n });\n\n const handleOnChange = (e: ChangeEvent<HTMLInputElement>) => {\n const numericRegex = /^[0-9]*$/;\n if (!numericRegex.test(e.target.value)) {\n return;\n }\n const val = +e.target.value;\n if (val < min || val > max) {\n return;\n }\n\n if (!isControlled) {\n setDebouncedValue(val);\n }\n onChange(val);\n };\n\n const handleOnClick = (adjustmentType: \"increment\" | \"decrement\") => {\n const adjustedValue = adjustmentType === \"increment\" ? value + 1 : value - 1;\n if (adjustedValue < 0) {\n return;\n }\n\n if (!isControlled) {\n setDebouncedValue(adjustedValue);\n }\n onChange(adjustedValue);\n };\n\n const adjustmentButton = (adjustmentType: \"increment\" | \"decrement\") => {\n const buttonDisabled =\n (adjustmentType === \"increment\" && incrementDisabled) ||\n (adjustmentType === \"decrement\" && decrementDisabled);\n\n return (\n <QuantitySelectorButton\n data-testid={getTestId(\"button-\" + adjustmentType)}\n variant={buttonVariant}\n buttonType={adjustmentType}\n hasGap={variant === \"separated\"}\n onClick={handleOnClick}\n disabled={isDisabled || buttonDisabled}\n aria-label={adjustmentType === \"increment\" ? ariaLabelIncrement : ariaLabelDecrement}\n />\n );\n };\n\n const beforeField = (\n <>\n {loading && (\n <div\n className={cx(`${rootClassName}__spinner`, {\n [`${rootClassName}__spinner--full-width`]: fullWidth,\n [`${rootClassName}__spinner--separated`]: !fullWidth && variant === \"separated\",\n })}\n >\n <Spinner\n key=\"spinner\"\n disabled={isDisabled}\n size=\"xs\"\n data-testid={getTestId(\"spinner\")}\n />\n </div>\n )}\n {adjustmentButton(\"decrement\")}\n </>\n );\n\n return (\n <TextField\n value={value}\n type=\"number\"\n ref={ref}\n className={classes}\n data-testid={dataTestId}\n onChange={handleOnChange}\n beforeField={beforeField}\n afterField={adjustmentButton(\"increment\")}\n disabled={isDisabled}\n min={min}\n max={max}\n role=\"spinbutton\"\n aria-valuenow={value}\n aria-valuemax={max}\n aria-valuemin={min}\n {...props}\n />\n );\n }\n);\n\nQuantitySelector.displayName = \"QuantitySelector\";\n"],"names":["e","r","o","s","l","cx","c","styles","rootClassName","QuantitySelectorButton","dataTestid","ariaLabel","disabled","hasGap","variant","buttonType","onClick","classes","jsx","Button","IconPlus","IconMinus","quantitySelectorVariants","quantitySelectorButtonVariants","QuantitySelector","forwardRef","dataTestId","className","buttonVariant","onChange","controlledValue","defaultValue","fullWidth","loading","minValue","maxValue","ariaLabelDecrement","ariaLabelIncrement","props","ref","uncontrolledValue","setUncontrolledValue","useState","debouncedValue","setDebouncedValue","isControlled","value","getTestId","name","isDisabled","min","max","incrementDisabled","decrementDisabled","useEffect","timer","handleOnChange","val","handleOnClick","adjustmentType","adjustedValue","adjustmentButton","buttonDisabled","beforeField","jsxs","Fragment","Spinner","TextField"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("./quantity-selector-
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("./quantity-selector-Ds7d4MnV.js");exports.QuantitySelector=t.QuantitySelector;exports.quantitySelectorButtonVariants=t.quantitySelectorButtonVariants;exports.quantitySelectorVariants=t.quantitySelectorVariants;
|
|
2
2
|
//# sourceMappingURL=quantity-selector.cjs.js.map
|
package/dist/rich-text.cjs.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./RichText-
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./RichText-IejAKqm2.js");exports.RichText=e.RichText;exports.richToPlainText=e.richToPlainText;
|
|
2
2
|
//# sourceMappingURL=rich-text.cjs.js.map
|
package/dist/rich-text.es.js
CHANGED
|
@@ -4,8 +4,8 @@ import { L as S } from "./listbox-CtV-Vcmy.mjs";
|
|
|
4
4
|
import { t as M } from "./use-autocomplete.es-CKb0RHKG.mjs";
|
|
5
5
|
import { c as j } from "./bind-CU-R61T-.mjs";
|
|
6
6
|
import { s as D } from "./search.es-DoFKg2Hr.mjs";
|
|
7
|
-
import { T as C } from "./text-field-
|
|
8
|
-
import { b as F } from "./button-
|
|
7
|
+
import { T as C } from "./text-field-C9LX7LBf.mjs";
|
|
8
|
+
import { b as F } from "./button-EVRfctR8.mjs";
|
|
9
9
|
const L = {
|
|
10
10
|
"purpur-search-field": "_purpur-search-field_fgjyk_1",
|
|
11
11
|
"purpur-search-field--has-clear-button": "_purpur-search-field--has-clear-button_fgjyk_4",
|
|
@@ -181,4 +181,4 @@ export {
|
|
|
181
181
|
z as a,
|
|
182
182
|
ee as s
|
|
183
183
|
};
|
|
184
|
-
//# sourceMappingURL=search-field-
|
|
184
|
+
//# sourceMappingURL=search-field-BTqVE1-l.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-field-afhtC6q5.mjs","sources":["../../../components/search-field/src/search-field-button.tsx","../../../components/search-field/src/search-field-base.tsx","../../../components/search-field/src/search-field-autocomplete.tsx","../../../components/search-field/src/search-field.tsx"],"sourcesContent":["import React from \"react\";\nimport { Button } from \"@purpur/button\";\nimport { IconSearch } from \"@purpur/icon/search\";\nimport c from \"classnames/bind\";\n\nimport styles from \"./search-field-button.module.scss\";\n\ntype Props = {\n [\"data-testid\"]?: string;\n disabled?: boolean;\n iconOnly?: boolean;\n negative?: boolean;\n label: string;\n type?: \"submit\" | \"button\";\n onClick?: (event: React.MouseEvent<HTMLButtonElement>) => void;\n};\n\nconst cx = c.bind(styles);\nconst rootClassName = \"purpur-search-field-button\";\n\nexport const SearchFieldButton = ({\n [\"data-testid\"]: dataTestid,\n disabled,\n iconOnly,\n negative,\n label,\n type = \"submit\",\n onClick,\n}: Props) => {\n const buttonProps = {\n className: cx(rootClassName, {\n [`${rootClassName}--icon-only`]: iconOnly,\n }),\n disabled,\n [\"data-testid\"]: dataTestid,\n negative,\n onClick,\n };\n\n if (iconOnly) {\n return (\n <Button {...buttonProps} aria-label={label} iconOnly size=\"sm\" type={type} variant=\"primary\">\n <IconSearch size=\"xs\" />\n </Button>\n );\n }\n\n return (\n <Button {...buttonProps} size=\"sm\" type={type} variant=\"primary\">\n {label}\n </Button>\n );\n};\n","import React, {\n type ChangeEvent,\n type CSSProperties,\n forwardRef,\n type RefObject,\n type SubmitEvent,\n} from \"react\";\nimport { IconSearch } from \"@purpur/icon/search\";\nimport { TextField, type TextFieldProps } from \"@purpur/text-field\";\nimport { type AutocompleteOption } from \"@purpur/use-autocomplete\";\nimport c from \"classnames/bind\";\n\nimport styles from \"./search-field.module.scss\";\nimport { SearchFieldButton } from \"./search-field-button\";\n\nexport const searchFieldVariants = [\"button-attached\", \"no-button\"] as const;\n\ntype Variant = (typeof searchFieldVariants)[number];\n\ntype DefaultProps = {\n [\"data-testid\"]?: string;\n clearButtonAriaLabel: string;\n disabled?: boolean;\n /**\n * Will display only a search icon in the search button if `true`.\n * */\n iconOnlySearchButton?: boolean;\n negative?: boolean;\n onChange?: (e: ChangeEvent<HTMLInputElement>) => void;\n /**\n * Event handler called when the clear button is clicked.\n * */\n onClear: () => void;\n /**\n * Event handler called when the search is triggered.\n * */\n onSearch?: (event?: React.SyntheticEvent) => void;\n /**\n * Controls how the search field handles submission.\n * - `\"form\"` (default): Renders a `<form>` element and submits via form submission.\n * - `\"manual\"`: Renders a `<div>` instead of a `<form>` element.\n * Use this when the component is nested inside another form.\n * */\n submitBehavior?: \"form\" | \"manual\";\n /**\n * The label text (or `aria-label` if `iconOnlySearchButton` is `true`) of the search button.\n * */\n searchButtonLabel?: string;\n variant: Variant;\n formRef?: RefObject<HTMLFormElement>;\n};\n\ntype TextSearchButton = {\n iconOnlySearchButton?: false;\n searchButtonLabel: string;\n variant: \"button-attached\";\n};\n\ntype IconOnlySearchButton = {\n iconOnlySearchButton: true;\n searchButtonLabel: string;\n variant: \"button-attached\";\n};\n\ntype NoButton = {\n searchButtonLabel?: never;\n variant: \"no-button\";\n};\n\nexport type SearchFieldBaseProps = DefaultProps &\n (TextSearchButton | IconOnlySearchButton | NoButton) &\n Omit<TextFieldProps, \"startAdornment\" | \"endAdornment\" | \"afterField\" | \"onChange\" | \"variant\">;\n\ntype SearchFieldBaseInternalProps = SearchFieldBaseProps & {\n wrapperStyle?: CSSProperties;\n};\n\ntype SearchFieldAutocompleteSharedProps = {\n /**\n * Called when the user selects a suggestion.\n */\n onSelectSuggestion?: (option: AutocompleteOption) => void;\n /**\n * Open the suggestions listbox when the input receives focus.\n */\n openSuggestionsOnFocus?: boolean;\n /**\n * Maximum height of the suggestions listbox. A number is interpreted as px.\n */\n suggestionsMaxHeight?: string | number;\n};\n\ntype SearchFieldWithoutAutocomplete = SearchFieldAutocompleteSharedProps & {\n suggestions?: never;\n suggestionsLabel?: never;\n};\n\ntype SearchFieldWithAutocomplete = SearchFieldAutocompleteSharedProps & {\n /**\n * The list of suggestions to display in a listbox below the field.\n * No filtering is applied — pass the already-correct (pre-filtered) list.\n * If autocomplete should stay enabled while there are temporarily no matches,\n * pass an empty array instead of `undefined` or `null`. Changing this prop\n * from an absent value to an array switches between the regular and\n * autocomplete variants, which causes a re-render, drops input focus, and\n * hides the listbox.\n */\n suggestions: AutocompleteOption[];\n /**\n * Accessible label for the suggestions listbox.\n */\n suggestionsLabel: string;\n};\n\nexport type SearchFieldAutocompleteEnhancements =\n | SearchFieldWithoutAutocomplete\n | SearchFieldWithAutocomplete;\n\nconst cx = c.bind(styles);\nconst rootClassName = \"purpur-search-field\";\n\nexport const SearchFieldBase = forwardRef<HTMLInputElement, SearchFieldBaseInternalProps>(\n (\n {\n [\"data-testid\"]: dataTestId,\n className,\n clearButtonAriaLabel,\n disabled,\n submitBehavior = \"form\",\n iconOnlySearchButton,\n negative = false,\n onClear,\n onSearch,\n searchButtonLabel,\n variant,\n formRef,\n wrapperStyle,\n ...props\n },\n ref\n ) => {\n const getTestId = (name: string) => (dataTestId ? `${dataTestId}-${name}` : undefined);\n const hasValue =\n typeof props.value === \"number\" ? props.value !== undefined : props.value?.length;\n const hasClearButton = hasValue && !disabled && !props.readOnly && !props.loading;\n const isManualSubmit = submitBehavior === \"manual\";\n\n const classes = cx(className, rootClassName, {\n [`${rootClassName}--no-gap`]: variant === \"button-attached\",\n [`${rootClassName}--has-clear-button`]: hasClearButton,\n });\n\n const textFieldProps: TextFieldProps = {\n ref,\n className: classes,\n clearButtonAriaLabel,\n disabled,\n negative,\n onClear,\n startAdornment: !iconOnlySearchButton ? (\n <IconSearch\n size=\"xs\"\n className={cx(`${rootClassName}__search-icon`, {\n [`${rootClassName}__search-icon--negative`]: negative,\n })}\n key=\"1\"\n />\n ) : null,\n \"data-testid\": getTestId(\"text-field\"),\n type: \"search\" as const,\n ...props,\n };\n\n const searchButton =\n variant !== \"no-button\" ? (\n <SearchFieldButton\n type={isManualSubmit ? \"button\" : \"submit\"}\n onClick={isManualSubmit ? (event) => onSearch?.(event) : undefined}\n disabled={disabled}\n iconOnly={iconOnlySearchButton}\n negative={negative}\n label={searchButtonLabel}\n data-testid={getTestId(\"button\")}\n />\n ) : null;\n\n if (isManualSubmit) {\n const handleKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {\n props.onKeyDown?.(event);\n\n if (event.key === \"Enter\" && !event.defaultPrevented) {\n event.preventDefault();\n onSearch?.(event);\n }\n };\n\n return (\n <div\n className={cx(`${rootClassName}__wrapper`)}\n data-testid={dataTestId}\n style={wrapperStyle}\n >\n <TextField {...textFieldProps} onKeyDown={handleKeyDown} afterField={searchButton} />\n </div>\n );\n }\n\n return (\n <form\n ref={formRef}\n className={cx(`${rootClassName}__wrapper`)}\n data-testid={dataTestId}\n style={wrapperStyle}\n onSubmit={(e: SubmitEvent<HTMLFormElement>) => {\n e.preventDefault();\n onSearch?.(e);\n }}\n >\n <TextField {...textFieldProps} afterField={searchButton} />\n </form>\n );\n }\n);\n\nSearchFieldBase.displayName = \"SearchFieldBase\";\n","import React, { forwardRef, useId } from \"react\";\nimport { Listbox } from \"@purpur/listbox\";\nimport { type AutocompleteOption, useAutocomplete } from \"@purpur/use-autocomplete\";\nimport c from \"classnames/bind\";\n\nimport styles from \"./search-field.module.scss\";\nimport {\n type SearchFieldAutocompleteEnhancements,\n SearchFieldBase,\n type SearchFieldBaseProps,\n} from \"./search-field-base\";\n\nconst cx = c.bind(styles);\nconst rootClassName = \"purpur-search-field\";\n\nexport type SearchFieldAutocompleteProps = SearchFieldBaseProps &\n Extract<SearchFieldAutocompleteEnhancements, { suggestions: AutocompleteOption[] }>;\n\nexport const SearchFieldAutocomplete = forwardRef<HTMLInputElement, SearchFieldAutocompleteProps>(\n (\n {\n suggestions,\n suggestionsLabel,\n onSelectSuggestion,\n openSuggestionsOnFocus,\n suggestionsMaxHeight,\n ...searchFieldProps\n },\n ref\n ) => {\n const randomId = useId();\n const inputId = (searchFieldProps.id as string | undefined) ?? randomId;\n const autocomplete = useAutocomplete({\n id: inputId,\n options: suggestions,\n listboxLabel: suggestionsLabel,\n disabled: searchFieldProps.disabled,\n negative: searchFieldProps.negative,\n readOnly: searchFieldProps.readOnly,\n openOnFocus: openSuggestionsOnFocus,\n listboxMaxHeight: suggestionsMaxHeight,\n onSelect: onSelectSuggestion,\n [\"data-testid\"]: searchFieldProps[\"data-testid\"],\n });\n\n const setInputRef = (node: HTMLInputElement | null) => {\n (autocomplete.inputRef as React.MutableRefObject<HTMLInputElement | null>).current = node;\n if (typeof ref === \"function\") ref(node);\n else if (ref) (ref as React.MutableRefObject<HTMLInputElement | null>).current = node;\n };\n\n const handleInputChange: React.ChangeEventHandler<HTMLInputElement> = (event) => {\n searchFieldProps.onChange?.(event);\n if (!autocomplete.isOpen) {\n autocomplete.openListbox();\n }\n };\n return (\n <div\n ref={autocomplete.rootRef as React.RefObject<HTMLDivElement>}\n className={cx(`${rootClassName}__autocomplete-root`)}\n >\n <SearchFieldBase\n ref={setInputRef}\n {...searchFieldProps}\n onChange={handleInputChange}\n id={inputId}\n wrapperStyle={autocomplete.anchorStyle}\n {...autocomplete.inputProps}\n />\n {autocomplete.isOpen && (\n <Listbox {...autocomplete.listboxProps} className={cx(`${rootClassName}__listbox`)}>\n {suggestions.map((option, index) => {\n const { key, ...listboxItemProps } = autocomplete.getListboxItemProps(option, index);\n\n return (\n <Listbox.Item key={key} {...listboxItemProps}>\n {option.label}\n </Listbox.Item>\n );\n })}\n </Listbox>\n )}\n </div>\n );\n }\n);\n\nSearchFieldAutocomplete.displayName = \"SearchFieldAutocomplete\";\n","import React, { forwardRef } from \"react\";\n\nimport { SearchFieldAutocomplete } from \"./search-field-autocomplete\";\nimport {\n type SearchFieldAutocompleteEnhancements,\n SearchFieldBase,\n type SearchFieldBaseProps,\n searchFieldVariants,\n} from \"./search-field-base\";\n\nexport { searchFieldVariants };\n\nexport type SearchFieldProps = SearchFieldBaseProps & SearchFieldAutocompleteEnhancements;\n\nexport const SearchField = forwardRef<HTMLInputElement, SearchFieldProps>((props, ref) => {\n if (props.suggestions) {\n return <SearchFieldAutocomplete ref={ref} {...props} />;\n }\n\n return <SearchFieldBase ref={ref} {...props} />;\n});\n\nSearchField.displayName = \"SearchField\";\n\nexport {\n SearchFieldAutocomplete,\n type SearchFieldAutocompleteProps,\n} from \"./search-field-autocomplete\";\n"],"names":["cx","c","styles","rootClassName","SearchFieldButton","dataTestid","disabled","iconOnly","negative","label","type","onClick","buttonProps","Button","IconSearch","jsx","searchFieldVariants","SearchFieldBase","forwardRef","dataTestId","className","clearButtonAriaLabel","submitBehavior","iconOnlySearchButton","onClear","onSearch","searchButtonLabel","variant","formRef","wrapperStyle","props","ref","getTestId","name","hasClearButton","isManualSubmit","classes","textFieldProps","searchButton","event","handleKeyDown","TextField","e","SearchFieldAutocomplete","suggestions","suggestionsLabel","onSelectSuggestion","openSuggestionsOnFocus","suggestionsMaxHeight","searchFieldProps","randomId","useId","inputId","autocomplete","useAutocomplete","setInputRef","node","handleInputChange","jsxs","Listbox","option","index","key","listboxItemProps","SearchField"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"search-field-BTqVE1-l.mjs","sources":["../../../components/search-field/src/search-field-button.tsx","../../../components/search-field/src/search-field-base.tsx","../../../components/search-field/src/search-field-autocomplete.tsx","../../../components/search-field/src/search-field.tsx"],"sourcesContent":["import React from \"react\";\nimport { Button } from \"@purpur/button\";\nimport { IconSearch } from \"@purpur/icon/search\";\nimport c from \"classnames/bind\";\n\nimport styles from \"./search-field-button.module.scss\";\n\ntype Props = {\n [\"data-testid\"]?: string;\n disabled?: boolean;\n iconOnly?: boolean;\n negative?: boolean;\n label: string;\n type?: \"submit\" | \"button\";\n onClick?: (event: React.MouseEvent<HTMLButtonElement>) => void;\n};\n\nconst cx = c.bind(styles);\nconst rootClassName = \"purpur-search-field-button\";\n\nexport const SearchFieldButton = ({\n [\"data-testid\"]: dataTestid,\n disabled,\n iconOnly,\n negative,\n label,\n type = \"submit\",\n onClick,\n}: Props) => {\n const buttonProps = {\n className: cx(rootClassName, {\n [`${rootClassName}--icon-only`]: iconOnly,\n }),\n disabled,\n [\"data-testid\"]: dataTestid,\n negative,\n onClick,\n };\n\n if (iconOnly) {\n return (\n <Button {...buttonProps} aria-label={label} iconOnly size=\"sm\" type={type} variant=\"primary\">\n <IconSearch size=\"xs\" />\n </Button>\n );\n }\n\n return (\n <Button {...buttonProps} size=\"sm\" type={type} variant=\"primary\">\n {label}\n </Button>\n );\n};\n","import React, {\n type ChangeEvent,\n type CSSProperties,\n forwardRef,\n type RefObject,\n type SubmitEvent,\n} from \"react\";\nimport { IconSearch } from \"@purpur/icon/search\";\nimport { TextField, type TextFieldProps } from \"@purpur/text-field\";\nimport { type AutocompleteOption } from \"@purpur/use-autocomplete\";\nimport c from \"classnames/bind\";\n\nimport styles from \"./search-field.module.scss\";\nimport { SearchFieldButton } from \"./search-field-button\";\n\nexport const searchFieldVariants = [\"button-attached\", \"no-button\"] as const;\n\ntype Variant = (typeof searchFieldVariants)[number];\n\ntype DefaultProps = {\n [\"data-testid\"]?: string;\n clearButtonAriaLabel: string;\n disabled?: boolean;\n /**\n * Will display only a search icon in the search button if `true`.\n * */\n iconOnlySearchButton?: boolean;\n negative?: boolean;\n onChange?: (e: ChangeEvent<HTMLInputElement>) => void;\n /**\n * Event handler called when the clear button is clicked.\n * */\n onClear: () => void;\n /**\n * Event handler called when the search is triggered.\n * */\n onSearch?: (event?: React.SyntheticEvent) => void;\n /**\n * Controls how the search field handles submission.\n * - `\"form\"` (default): Renders a `<form>` element and submits via form submission.\n * - `\"manual\"`: Renders a `<div>` instead of a `<form>` element.\n * Use this when the component is nested inside another form.\n * */\n submitBehavior?: \"form\" | \"manual\";\n /**\n * The label text (or `aria-label` if `iconOnlySearchButton` is `true`) of the search button.\n * */\n searchButtonLabel?: string;\n variant: Variant;\n formRef?: RefObject<HTMLFormElement>;\n};\n\ntype TextSearchButton = {\n iconOnlySearchButton?: false;\n searchButtonLabel: string;\n variant: \"button-attached\";\n};\n\ntype IconOnlySearchButton = {\n iconOnlySearchButton: true;\n searchButtonLabel: string;\n variant: \"button-attached\";\n};\n\ntype NoButton = {\n searchButtonLabel?: never;\n variant: \"no-button\";\n};\n\nexport type SearchFieldBaseProps = DefaultProps &\n (TextSearchButton | IconOnlySearchButton | NoButton) &\n Omit<TextFieldProps, \"startAdornment\" | \"endAdornment\" | \"afterField\" | \"onChange\" | \"variant\">;\n\ntype SearchFieldBaseInternalProps = SearchFieldBaseProps & {\n wrapperStyle?: CSSProperties;\n};\n\ntype SearchFieldAutocompleteSharedProps = {\n /**\n * Called when the user selects a suggestion.\n */\n onSelectSuggestion?: (option: AutocompleteOption) => void;\n /**\n * Open the suggestions listbox when the input receives focus.\n */\n openSuggestionsOnFocus?: boolean;\n /**\n * Maximum height of the suggestions listbox. A number is interpreted as px.\n */\n suggestionsMaxHeight?: string | number;\n};\n\ntype SearchFieldWithoutAutocomplete = SearchFieldAutocompleteSharedProps & {\n suggestions?: never;\n suggestionsLabel?: never;\n};\n\ntype SearchFieldWithAutocomplete = SearchFieldAutocompleteSharedProps & {\n /**\n * The list of suggestions to display in a listbox below the field.\n * No filtering is applied — pass the already-correct (pre-filtered) list.\n * If autocomplete should stay enabled while there are temporarily no matches,\n * pass an empty array instead of `undefined` or `null`. Changing this prop\n * from an absent value to an array switches between the regular and\n * autocomplete variants, which causes a re-render, drops input focus, and\n * hides the listbox.\n */\n suggestions: AutocompleteOption[];\n /**\n * Accessible label for the suggestions listbox.\n */\n suggestionsLabel: string;\n};\n\nexport type SearchFieldAutocompleteEnhancements =\n | SearchFieldWithoutAutocomplete\n | SearchFieldWithAutocomplete;\n\nconst cx = c.bind(styles);\nconst rootClassName = \"purpur-search-field\";\n\nexport const SearchFieldBase = forwardRef<HTMLInputElement, SearchFieldBaseInternalProps>(\n (\n {\n [\"data-testid\"]: dataTestId,\n className,\n clearButtonAriaLabel,\n disabled,\n submitBehavior = \"form\",\n iconOnlySearchButton,\n negative = false,\n onClear,\n onSearch,\n searchButtonLabel,\n variant,\n formRef,\n wrapperStyle,\n ...props\n },\n ref\n ) => {\n const getTestId = (name: string) => (dataTestId ? `${dataTestId}-${name}` : undefined);\n const hasValue =\n typeof props.value === \"number\" ? props.value !== undefined : props.value?.length;\n const hasClearButton = hasValue && !disabled && !props.readOnly && !props.loading;\n const isManualSubmit = submitBehavior === \"manual\";\n\n const classes = cx(className, rootClassName, {\n [`${rootClassName}--no-gap`]: variant === \"button-attached\",\n [`${rootClassName}--has-clear-button`]: hasClearButton,\n });\n\n const textFieldProps: TextFieldProps = {\n ref,\n className: classes,\n clearButtonAriaLabel,\n disabled,\n negative,\n onClear,\n startAdornment: !iconOnlySearchButton ? (\n <IconSearch\n size=\"xs\"\n className={cx(`${rootClassName}__search-icon`, {\n [`${rootClassName}__search-icon--negative`]: negative,\n })}\n key=\"1\"\n />\n ) : null,\n \"data-testid\": getTestId(\"text-field\"),\n type: \"search\" as const,\n ...props,\n };\n\n const searchButton =\n variant !== \"no-button\" ? (\n <SearchFieldButton\n type={isManualSubmit ? \"button\" : \"submit\"}\n onClick={isManualSubmit ? (event) => onSearch?.(event) : undefined}\n disabled={disabled}\n iconOnly={iconOnlySearchButton}\n negative={negative}\n label={searchButtonLabel}\n data-testid={getTestId(\"button\")}\n />\n ) : null;\n\n if (isManualSubmit) {\n const handleKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {\n props.onKeyDown?.(event);\n\n if (event.key === \"Enter\" && !event.defaultPrevented) {\n event.preventDefault();\n onSearch?.(event);\n }\n };\n\n return (\n <div\n className={cx(`${rootClassName}__wrapper`)}\n data-testid={dataTestId}\n style={wrapperStyle}\n >\n <TextField {...textFieldProps} onKeyDown={handleKeyDown} afterField={searchButton} />\n </div>\n );\n }\n\n return (\n <form\n ref={formRef}\n className={cx(`${rootClassName}__wrapper`)}\n data-testid={dataTestId}\n style={wrapperStyle}\n onSubmit={(e: SubmitEvent<HTMLFormElement>) => {\n e.preventDefault();\n onSearch?.(e);\n }}\n >\n <TextField {...textFieldProps} afterField={searchButton} />\n </form>\n );\n }\n);\n\nSearchFieldBase.displayName = \"SearchFieldBase\";\n","import React, { forwardRef, useId } from \"react\";\nimport { Listbox } from \"@purpur/listbox\";\nimport { type AutocompleteOption, useAutocomplete } from \"@purpur/use-autocomplete\";\nimport c from \"classnames/bind\";\n\nimport styles from \"./search-field.module.scss\";\nimport {\n type SearchFieldAutocompleteEnhancements,\n SearchFieldBase,\n type SearchFieldBaseProps,\n} from \"./search-field-base\";\n\nconst cx = c.bind(styles);\nconst rootClassName = \"purpur-search-field\";\n\nexport type SearchFieldAutocompleteProps = SearchFieldBaseProps &\n Extract<SearchFieldAutocompleteEnhancements, { suggestions: AutocompleteOption[] }>;\n\nexport const SearchFieldAutocomplete = forwardRef<HTMLInputElement, SearchFieldAutocompleteProps>(\n (\n {\n suggestions,\n suggestionsLabel,\n onSelectSuggestion,\n openSuggestionsOnFocus,\n suggestionsMaxHeight,\n ...searchFieldProps\n },\n ref\n ) => {\n const randomId = useId();\n const inputId = (searchFieldProps.id as string | undefined) ?? randomId;\n const autocomplete = useAutocomplete({\n id: inputId,\n options: suggestions,\n listboxLabel: suggestionsLabel,\n disabled: searchFieldProps.disabled,\n negative: searchFieldProps.negative,\n readOnly: searchFieldProps.readOnly,\n openOnFocus: openSuggestionsOnFocus,\n listboxMaxHeight: suggestionsMaxHeight,\n onSelect: onSelectSuggestion,\n [\"data-testid\"]: searchFieldProps[\"data-testid\"],\n });\n\n const setInputRef = (node: HTMLInputElement | null) => {\n (autocomplete.inputRef as React.MutableRefObject<HTMLInputElement | null>).current = node;\n if (typeof ref === \"function\") ref(node);\n else if (ref) (ref as React.MutableRefObject<HTMLInputElement | null>).current = node;\n };\n\n const handleInputChange: React.ChangeEventHandler<HTMLInputElement> = (event) => {\n searchFieldProps.onChange?.(event);\n if (!autocomplete.isOpen) {\n autocomplete.openListbox();\n }\n };\n return (\n <div\n ref={autocomplete.rootRef as React.RefObject<HTMLDivElement>}\n className={cx(`${rootClassName}__autocomplete-root`)}\n >\n <SearchFieldBase\n ref={setInputRef}\n {...searchFieldProps}\n onChange={handleInputChange}\n id={inputId}\n wrapperStyle={autocomplete.anchorStyle}\n {...autocomplete.inputProps}\n />\n {autocomplete.isOpen && (\n <Listbox {...autocomplete.listboxProps} className={cx(`${rootClassName}__listbox`)}>\n {suggestions.map((option, index) => {\n const { key, ...listboxItemProps } = autocomplete.getListboxItemProps(option, index);\n\n return (\n <Listbox.Item key={key} {...listboxItemProps}>\n {option.label}\n </Listbox.Item>\n );\n })}\n </Listbox>\n )}\n </div>\n );\n }\n);\n\nSearchFieldAutocomplete.displayName = \"SearchFieldAutocomplete\";\n","import React, { forwardRef } from \"react\";\n\nimport { SearchFieldAutocomplete } from \"./search-field-autocomplete\";\nimport {\n type SearchFieldAutocompleteEnhancements,\n SearchFieldBase,\n type SearchFieldBaseProps,\n searchFieldVariants,\n} from \"./search-field-base\";\n\nexport { searchFieldVariants };\n\nexport type SearchFieldProps = SearchFieldBaseProps & SearchFieldAutocompleteEnhancements;\n\nexport const SearchField = forwardRef<HTMLInputElement, SearchFieldProps>((props, ref) => {\n if (props.suggestions) {\n return <SearchFieldAutocomplete ref={ref} {...props} />;\n }\n\n return <SearchFieldBase ref={ref} {...props} />;\n});\n\nSearchField.displayName = \"SearchField\";\n\nexport {\n SearchFieldAutocomplete,\n type SearchFieldAutocompleteProps,\n} from \"./search-field-autocomplete\";\n"],"names":["cx","c","styles","rootClassName","SearchFieldButton","dataTestid","disabled","iconOnly","negative","label","type","onClick","buttonProps","Button","IconSearch","jsx","searchFieldVariants","SearchFieldBase","forwardRef","dataTestId","className","clearButtonAriaLabel","submitBehavior","iconOnlySearchButton","onClear","onSearch","searchButtonLabel","variant","formRef","wrapperStyle","props","ref","getTestId","name","hasClearButton","isManualSubmit","classes","textFieldProps","searchButton","event","handleKeyDown","TextField","e","SearchFieldAutocomplete","suggestions","suggestionsLabel","onSelectSuggestion","openSuggestionsOnFocus","suggestionsMaxHeight","searchFieldProps","randomId","useId","inputId","autocomplete","useAutocomplete","setInputRef","node","handleInputChange","jsxs","Listbox","option","index","key","listboxItemProps","SearchField"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;GAiBMA,IAAKC,EAAE,KAAKC,CAAM,GAClBC,IAAgB,8BAETC,IAAoB,CAAC;AAAA,EAChC,CAAC,gBAAgBC;AAAA,EACjB,UAAAC;AAAA,EACA,UAAAC;AAAA,EACA,UAAAC;AAAA,EACA,OAAAC;AAAA,EACA,MAAAC,IAAO;AAAA,EACP,SAAAC;AACF,MAAa;AACX,QAAMC,IAAc;AAAA,IAClB,WAAWZ,EAAGG,GAAe;AAAA,MAC3B,CAAC,GAAGA,CAAa,aAAa,GAAGI;AAAA,IAAA,CAClC;AAAA,IACD,UAAAD;AAAA,IACC,eAAgBD;AAAA,IACjB,UAAAG;AAAA,IACA,SAAAG;AAAA,EAAA;AAGF,SAAIJ,sBAECM,GAAA,EAAQ,GAAGD,GAAa,cAAYH,GAAO,UAAQ,IAAC,MAAK,MAAK,MAAAC,GAAY,SAAQ,WACjF,4BAACI,GAAA,EAAW,MAAK,MAAK,GACxB,IAKF,gBAAAC,EAACF,KAAQ,GAAGD,GAAa,MAAK,MAAK,MAAAF,GAAY,SAAQ,WACpD,UAAAD,EAAA,CACH;AAEJ,GCrCaO,KAAsB,CAAC,mBAAmB,WAAW,GAuG5DhB,IAAKC,EAAE,KAAKC,CAAM,GAClBC,IAAgB,uBAETc,IAAkBC;AAAA,EAC7B,CACE;AAAA,IACE,CAAC,gBAAgBC;AAAA,IACjB,WAAAC;AAAA,IACA,sBAAAC;AAAA,IACA,UAAAf;AAAA,IACA,gBAAAgB,IAAiB;AAAA,IACjB,sBAAAC;AAAA,IACA,UAAAf,IAAW;AAAA,IACX,SAAAgB;AAAA,IACA,UAAAC;AAAA,IACA,mBAAAC;AAAA,IACA,SAAAC;AAAA,IACA,SAAAC;AAAA,IACA,cAAAC;AAAA,IACA,GAAGC;AAAA,EAAA,GAELC,MACG;AACH,UAAMC,IAAY,CAACC,MAAkBd,IAAa,GAAGA,CAAU,IAAIc,CAAI,KAAK,QAGtEC,KADJ,OAAOJ,EAAM,SAAU,WAAWA,EAAM,UAAU,SAAYA,EAAM,OAAO,WAC1C,CAACxB,KAAY,CAACwB,EAAM,YAAY,CAACA,EAAM,SACpEK,IAAiBb,MAAmB,UAEpCc,IAAUpC,EAAGoB,GAAWjB,GAAe;AAAA,MAC3C,CAAC,GAAGA,CAAa,UAAU,GAAGwB,MAAY;AAAA,MAC1C,CAAC,GAAGxB,CAAa,oBAAoB,GAAG+B;AAAA,IAAA,CACzC,GAEKG,IAAiC;AAAA,MACrC,KAAAN;AAAA,MACA,WAAWK;AAAA,MACX,sBAAAf;AAAA,MACA,UAAAf;AAAA,MACA,UAAAE;AAAA,MACA,SAAAgB;AAAA,MACA,gBAAiBD,IAQb,OAPF,gBAAAR;AAAA,QAACD;AAAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAWd,EAAG,GAAGG,CAAa,iBAAiB;AAAA,YAC7C,CAAC,GAAGA,CAAa,yBAAyB,GAAGK;AAAA,UAAA,CAC9C;AAAA,QAAA;AAAA,QACG;AAAA,MAAA;AAAA,MAGR,eAAewB,EAAU,YAAY;AAAA,MACrC,MAAM;AAAA,MACN,GAAGF;AAAA,IAAA,GAGCQ,IACJX,MAAY,cACV,gBAAAZ;AAAA,MAACX;AAAA,MAAA;AAAA,QACC,MAAM+B,IAAiB,WAAW;AAAA,QAClC,SAASA,IAAiB,CAACI,MAAUd,IAAWc,CAAK,IAAI;AAAA,QACzD,UAAAjC;AAAA,QACA,UAAUiB;AAAA,QACV,UAAAf;AAAA,QACA,OAAOkB;AAAA,QACP,eAAaM,EAAU,QAAQ;AAAA,MAAA;AAAA,IAAA,IAE/B;AAEN,QAAIG,GAAgB;AAClB,YAAMK,IAAgB,CAACD,MAAiD;AACtE,QAAAT,EAAM,YAAYS,CAAK,GAEnBA,EAAM,QAAQ,WAAW,CAACA,EAAM,qBAClCA,EAAM,eAAA,GACNd,IAAWc,CAAK;AAAA,MAEpB;AAEA,aACE,gBAAAxB;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAWf,EAAG,GAAGG,CAAa,WAAW;AAAA,UACzC,eAAagB;AAAA,UACb,OAAOU;AAAA,UAEP,4BAACY,GAAA,EAAW,GAAGJ,GAAgB,WAAWG,GAAe,YAAYF,EAAA,CAAc;AAAA,QAAA;AAAA,MAAA;AAAA,IAGzF;AAEA,WACE,gBAAAvB;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAKa;AAAA,QACL,WAAW5B,EAAG,GAAGG,CAAa,WAAW;AAAA,QACzC,eAAagB;AAAA,QACb,OAAOU;AAAA,QACP,UAAU,CAACa,MAAoC;AAC7C,UAAAA,EAAE,eAAA,GACFjB,IAAWiB,CAAC;AAAA,QACd;AAAA,QAEA,UAAA,gBAAA3B,EAAC0B,GAAA,EAAW,GAAGJ,GAAgB,YAAYC,EAAA,CAAc;AAAA,MAAA;AAAA,IAAA;AAAA,EAG/D;AACF;AAEArB,EAAgB,cAAc;ACpN9B,MAAMjB,IAAKC,EAAE,KAAKC,CAAM,GAClBC,IAAgB,uBAKTwC,IAA0BzB;AAAA,EACrC,CACE;AAAA,IACE,aAAA0B;AAAA,IACA,kBAAAC;AAAA,IACA,oBAAAC;AAAA,IACA,wBAAAC;AAAA,IACA,sBAAAC;AAAA,IACA,GAAGC;AAAA,EAAA,GAELlB,MACG;AACH,UAAMmB,IAAWC,EAAA,GACXC,IAAWH,EAAiB,MAA6BC,GACzDG,IAAeC,EAAgB;AAAA,MACnC,IAAIF;AAAA,MACJ,SAASR;AAAA,MACT,cAAcC;AAAA,MACd,UAAUI,EAAiB;AAAA,MAC3B,UAAUA,EAAiB;AAAA,MAC3B,UAAUA,EAAiB;AAAA,MAC3B,aAAaF;AAAA,MACb,kBAAkBC;AAAA,MAClB,UAAUF;AAAA,MACT,eAAgBG,EAAiB,aAAa;AAAA,IAAA,CAChD,GAEKM,IAAc,CAACC,MAAkC;AACpD,MAAAH,EAAa,SAA6D,UAAUG,GACjF,OAAOzB,KAAQ,aAAYA,EAAIyB,CAAI,IAC9BzB,MAAMA,EAAwD,UAAUyB;AAAA,IACnF,GAEMC,IAAgE,CAAClB,MAAU;AAC/E,MAAAU,EAAiB,WAAWV,CAAK,GAC5Bc,EAAa,UAChBA,EAAa,YAAA;AAAA,IAEjB;AACA,WACE,gBAAAK;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAKL,EAAa;AAAA,QAClB,WAAWrD,EAAG,GAAGG,CAAa,qBAAqB;AAAA,QAEnD,UAAA;AAAA,UAAA,gBAAAY;AAAA,YAACE;AAAA,YAAA;AAAA,cACC,KAAKsC;AAAA,cACJ,GAAGN;AAAA,cACJ,UAAUQ;AAAA,cACV,IAAIL;AAAA,cACJ,cAAcC,EAAa;AAAA,cAC1B,GAAGA,EAAa;AAAA,YAAA;AAAA,UAAA;AAAA,UAElBA,EAAa,UACZ,gBAAAtC,EAAC4C,GAAA,EAAS,GAAGN,EAAa,cAAc,WAAWrD,EAAG,GAAGG,CAAa,WAAW,GAC9E,YAAY,IAAI,CAACyD,GAAQC,MAAU;AAClC,kBAAM,EAAE,KAAAC,GAAK,GAAGC,EAAA,IAAqBV,EAAa,oBAAoBO,GAAQC,CAAK;AAEnF,mBACE,gBAAA9C,EAAC4C,EAAQ,MAAR,EAAwB,GAAGI,GACzB,UAAAH,EAAO,SADSE,CAEnB;AAAA,UAEJ,CAAC,EAAA,CACH;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAIR;AACF;AAEAnB,EAAwB,cAAc;AC1E/B,MAAMqB,IAAc9C,EAA+C,CAACY,GAAOC,MAC5ED,EAAM,cACD,gBAAAf,EAAC4B,GAAA,EAAwB,KAAAZ,GAAW,GAAGD,EAAA,CAAO,IAGhD,gBAAAf,EAACE,GAAA,EAAgB,KAAAc,GAAW,GAAGD,EAAA,CAAO,CAC9C;AAEDkC,EAAY,cAAc;"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";const e=require("react/jsx-runtime"),y=require("react"),S=require("./listbox-lXO21cJV.js"),V=require("./use-autocomplete.es-BwAzMcau.js"),k=require("./bind-DeUYJ6m9.js"),O=require("./search.es-Cg2amJSR.js"),q=require("./text-field-
|
|
2
|
-
//# sourceMappingURL=search-field-
|
|
1
|
+
"use strict";const e=require("react/jsx-runtime"),y=require("react"),S=require("./listbox-lXO21cJV.js"),V=require("./use-autocomplete.es-BwAzMcau.js"),k=require("./bind-DeUYJ6m9.js"),O=require("./search.es-Cg2amJSR.js"),q=require("./text-field-CS0PT5T6.js"),C=require("./button-DZgtrGqN.js"),A={"purpur-search-field":"_purpur-search-field_fgjyk_1","purpur-search-field--has-clear-button":"_purpur-search-field--has-clear-button_fgjyk_4","purpur-search-field--no-gap":"_purpur-search-field--no-gap_fgjyk_13","purpur-search-field__wrapper":"_purpur-search-field__wrapper_fgjyk_17","purpur-search-field__wrapper--gap":"_purpur-search-field__wrapper--gap_fgjyk_20","purpur-search-field__search-icon":"_purpur-search-field__search-icon_fgjyk_24","purpur-search-field__close-icon":"_purpur-search-field__close-icon_fgjyk_24","purpur-search-field__search-icon--negative":"_purpur-search-field__search-icon--negative_fgjyk_27","purpur-search-field__close-icon--negative":"_purpur-search-field__close-icon--negative_fgjyk_27","purpur-search-field__autocomplete-root":"_purpur-search-field__autocomplete-root_fgjyk_30","purpur-search-field__listbox":"_purpur-search-field__listbox_fgjyk_34"},K={"purpur-search-field-button":"_purpur-search-field-button_c16yo_1","purpur-search-field-button--icon-only":"_purpur-search-field-button--icon-only_c16yo_1"},M=k.c.bind(K),R="purpur-search-field-button",E=({["data-testid"]:t,disabled:o,iconOnly:d,negative:u,label:p,type:r="submit",onClick:n})=>{const _={className:M(R,{[`${R}--icon-only`]:d}),disabled:o,"data-testid":t,negative:u,onClick:n};return d?e.jsx(C.Button,{..._,"aria-label":p,iconOnly:!0,size:"sm",type:r,variant:"primary",children:e.jsx(O.s,{size:"xs"})}):e.jsx(C.Button,{..._,size:"sm",type:r,variant:"primary",children:p})},H=["button-attached","no-button"],x=k.c.bind(A),l="purpur-search-field",v=y.forwardRef(({["data-testid"]:t,className:o,clearButtonAriaLabel:d,disabled:u,submitBehavior:p="form",iconOnlySearchButton:r,negative:n=!1,onClear:_,onSearch:f,searchButtonLabel:s,variant:b,formRef:g,wrapperStyle:a,...i},j)=>{const m=c=>t?`${t}-${c}`:void 0,L=(typeof i.value=="number"?i.value!==void 0:i.value?.length)&&!u&&!i.readOnly&&!i.loading,$=p==="manual",z=x(o,l,{[`${l}--no-gap`]:b==="button-attached",[`${l}--has-clear-button`]:L}),w={ref:j,className:z,clearButtonAriaLabel:d,disabled:u,negative:n,onClear:_,startAdornment:r?null:e.jsx(O.s,{size:"xs",className:x(`${l}__search-icon`,{[`${l}__search-icon--negative`]:n})},"1"),"data-testid":m("text-field"),type:"search",...i},F=b!=="no-button"?e.jsx(E,{type:$?"button":"submit",onClick:$?c=>f?.(c):void 0,disabled:u,iconOnly:r,negative:n,label:s,"data-testid":m("button")}):null;if($){const c=h=>{i.onKeyDown?.(h),h.key==="Enter"&&!h.defaultPrevented&&(h.preventDefault(),f?.(h))};return e.jsx("div",{className:x(`${l}__wrapper`),"data-testid":t,style:a,children:e.jsx(q.TextField,{...w,onKeyDown:c,afterField:F})})}return e.jsx("form",{ref:g,className:x(`${l}__wrapper`),"data-testid":t,style:a,onSubmit:c=>{c.preventDefault(),f?.(c)},children:e.jsx(q.TextField,{...w,afterField:F})})});v.displayName="SearchFieldBase";const B=k.c.bind(A),I="purpur-search-field",N=y.forwardRef(({suggestions:t,suggestionsLabel:o,onSelectSuggestion:d,openSuggestionsOnFocus:u,suggestionsMaxHeight:p,...r},n)=>{const _=y.useId(),f=r.id??_,s=V.te({id:f,options:t,listboxLabel:o,disabled:r.disabled,negative:r.negative,readOnly:r.readOnly,openOnFocus:u,listboxMaxHeight:p,onSelect:d,"data-testid":r["data-testid"]}),b=a=>{s.inputRef.current=a,typeof n=="function"?n(a):n&&(n.current=a)},g=a=>{r.onChange?.(a),s.isOpen||s.openListbox()};return e.jsxs("div",{ref:s.rootRef,className:B(`${I}__autocomplete-root`),children:[e.jsx(v,{ref:b,...r,onChange:g,id:f,wrapperStyle:s.anchorStyle,...s.inputProps}),s.isOpen&&e.jsx(S.Listbox,{...s.listboxProps,className:B(`${I}__listbox`),children:t.map((a,i)=>{const{key:j,...m}=s.getListboxItemProps(a,i);return e.jsx(S.Listbox.Item,{...m,children:a.label},j)})})]})});N.displayName="SearchFieldAutocomplete";const D=y.forwardRef((t,o)=>t.suggestions?e.jsx(N,{ref:o,...t}):e.jsx(v,{ref:o,...t}));D.displayName="SearchField";exports.SearchField=D;exports.SearchFieldAutocomplete=N;exports.searchFieldVariants=H;
|
|
2
|
+
//# sourceMappingURL=search-field-DkJrwzJB.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-field-WJBtiK0K.js","sources":["../../../components/search-field/src/search-field-button.tsx","../../../components/search-field/src/search-field-base.tsx","../../../components/search-field/src/search-field-autocomplete.tsx","../../../components/search-field/src/search-field.tsx"],"sourcesContent":["import React from \"react\";\nimport { Button } from \"@purpur/button\";\nimport { IconSearch } from \"@purpur/icon/search\";\nimport c from \"classnames/bind\";\n\nimport styles from \"./search-field-button.module.scss\";\n\ntype Props = {\n [\"data-testid\"]?: string;\n disabled?: boolean;\n iconOnly?: boolean;\n negative?: boolean;\n label: string;\n type?: \"submit\" | \"button\";\n onClick?: (event: React.MouseEvent<HTMLButtonElement>) => void;\n};\n\nconst cx = c.bind(styles);\nconst rootClassName = \"purpur-search-field-button\";\n\nexport const SearchFieldButton = ({\n [\"data-testid\"]: dataTestid,\n disabled,\n iconOnly,\n negative,\n label,\n type = \"submit\",\n onClick,\n}: Props) => {\n const buttonProps = {\n className: cx(rootClassName, {\n [`${rootClassName}--icon-only`]: iconOnly,\n }),\n disabled,\n [\"data-testid\"]: dataTestid,\n negative,\n onClick,\n };\n\n if (iconOnly) {\n return (\n <Button {...buttonProps} aria-label={label} iconOnly size=\"sm\" type={type} variant=\"primary\">\n <IconSearch size=\"xs\" />\n </Button>\n );\n }\n\n return (\n <Button {...buttonProps} size=\"sm\" type={type} variant=\"primary\">\n {label}\n </Button>\n );\n};\n","import React, {\n type ChangeEvent,\n type CSSProperties,\n forwardRef,\n type RefObject,\n type SubmitEvent,\n} from \"react\";\nimport { IconSearch } from \"@purpur/icon/search\";\nimport { TextField, type TextFieldProps } from \"@purpur/text-field\";\nimport { type AutocompleteOption } from \"@purpur/use-autocomplete\";\nimport c from \"classnames/bind\";\n\nimport styles from \"./search-field.module.scss\";\nimport { SearchFieldButton } from \"./search-field-button\";\n\nexport const searchFieldVariants = [\"button-attached\", \"no-button\"] as const;\n\ntype Variant = (typeof searchFieldVariants)[number];\n\ntype DefaultProps = {\n [\"data-testid\"]?: string;\n clearButtonAriaLabel: string;\n disabled?: boolean;\n /**\n * Will display only a search icon in the search button if `true`.\n * */\n iconOnlySearchButton?: boolean;\n negative?: boolean;\n onChange?: (e: ChangeEvent<HTMLInputElement>) => void;\n /**\n * Event handler called when the clear button is clicked.\n * */\n onClear: () => void;\n /**\n * Event handler called when the search is triggered.\n * */\n onSearch?: (event?: React.SyntheticEvent) => void;\n /**\n * Controls how the search field handles submission.\n * - `\"form\"` (default): Renders a `<form>` element and submits via form submission.\n * - `\"manual\"`: Renders a `<div>` instead of a `<form>` element.\n * Use this when the component is nested inside another form.\n * */\n submitBehavior?: \"form\" | \"manual\";\n /**\n * The label text (or `aria-label` if `iconOnlySearchButton` is `true`) of the search button.\n * */\n searchButtonLabel?: string;\n variant: Variant;\n formRef?: RefObject<HTMLFormElement>;\n};\n\ntype TextSearchButton = {\n iconOnlySearchButton?: false;\n searchButtonLabel: string;\n variant: \"button-attached\";\n};\n\ntype IconOnlySearchButton = {\n iconOnlySearchButton: true;\n searchButtonLabel: string;\n variant: \"button-attached\";\n};\n\ntype NoButton = {\n searchButtonLabel?: never;\n variant: \"no-button\";\n};\n\nexport type SearchFieldBaseProps = DefaultProps &\n (TextSearchButton | IconOnlySearchButton | NoButton) &\n Omit<TextFieldProps, \"startAdornment\" | \"endAdornment\" | \"afterField\" | \"onChange\" | \"variant\">;\n\ntype SearchFieldBaseInternalProps = SearchFieldBaseProps & {\n wrapperStyle?: CSSProperties;\n};\n\ntype SearchFieldAutocompleteSharedProps = {\n /**\n * Called when the user selects a suggestion.\n */\n onSelectSuggestion?: (option: AutocompleteOption) => void;\n /**\n * Open the suggestions listbox when the input receives focus.\n */\n openSuggestionsOnFocus?: boolean;\n /**\n * Maximum height of the suggestions listbox. A number is interpreted as px.\n */\n suggestionsMaxHeight?: string | number;\n};\n\ntype SearchFieldWithoutAutocomplete = SearchFieldAutocompleteSharedProps & {\n suggestions?: never;\n suggestionsLabel?: never;\n};\n\ntype SearchFieldWithAutocomplete = SearchFieldAutocompleteSharedProps & {\n /**\n * The list of suggestions to display in a listbox below the field.\n * No filtering is applied — pass the already-correct (pre-filtered) list.\n * If autocomplete should stay enabled while there are temporarily no matches,\n * pass an empty array instead of `undefined` or `null`. Changing this prop\n * from an absent value to an array switches between the regular and\n * autocomplete variants, which causes a re-render, drops input focus, and\n * hides the listbox.\n */\n suggestions: AutocompleteOption[];\n /**\n * Accessible label for the suggestions listbox.\n */\n suggestionsLabel: string;\n};\n\nexport type SearchFieldAutocompleteEnhancements =\n | SearchFieldWithoutAutocomplete\n | SearchFieldWithAutocomplete;\n\nconst cx = c.bind(styles);\nconst rootClassName = \"purpur-search-field\";\n\nexport const SearchFieldBase = forwardRef<HTMLInputElement, SearchFieldBaseInternalProps>(\n (\n {\n [\"data-testid\"]: dataTestId,\n className,\n clearButtonAriaLabel,\n disabled,\n submitBehavior = \"form\",\n iconOnlySearchButton,\n negative = false,\n onClear,\n onSearch,\n searchButtonLabel,\n variant,\n formRef,\n wrapperStyle,\n ...props\n },\n ref\n ) => {\n const getTestId = (name: string) => (dataTestId ? `${dataTestId}-${name}` : undefined);\n const hasValue =\n typeof props.value === \"number\" ? props.value !== undefined : props.value?.length;\n const hasClearButton = hasValue && !disabled && !props.readOnly && !props.loading;\n const isManualSubmit = submitBehavior === \"manual\";\n\n const classes = cx(className, rootClassName, {\n [`${rootClassName}--no-gap`]: variant === \"button-attached\",\n [`${rootClassName}--has-clear-button`]: hasClearButton,\n });\n\n const textFieldProps: TextFieldProps = {\n ref,\n className: classes,\n clearButtonAriaLabel,\n disabled,\n negative,\n onClear,\n startAdornment: !iconOnlySearchButton ? (\n <IconSearch\n size=\"xs\"\n className={cx(`${rootClassName}__search-icon`, {\n [`${rootClassName}__search-icon--negative`]: negative,\n })}\n key=\"1\"\n />\n ) : null,\n \"data-testid\": getTestId(\"text-field\"),\n type: \"search\" as const,\n ...props,\n };\n\n const searchButton =\n variant !== \"no-button\" ? (\n <SearchFieldButton\n type={isManualSubmit ? \"button\" : \"submit\"}\n onClick={isManualSubmit ? (event) => onSearch?.(event) : undefined}\n disabled={disabled}\n iconOnly={iconOnlySearchButton}\n negative={negative}\n label={searchButtonLabel}\n data-testid={getTestId(\"button\")}\n />\n ) : null;\n\n if (isManualSubmit) {\n const handleKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {\n props.onKeyDown?.(event);\n\n if (event.key === \"Enter\" && !event.defaultPrevented) {\n event.preventDefault();\n onSearch?.(event);\n }\n };\n\n return (\n <div\n className={cx(`${rootClassName}__wrapper`)}\n data-testid={dataTestId}\n style={wrapperStyle}\n >\n <TextField {...textFieldProps} onKeyDown={handleKeyDown} afterField={searchButton} />\n </div>\n );\n }\n\n return (\n <form\n ref={formRef}\n className={cx(`${rootClassName}__wrapper`)}\n data-testid={dataTestId}\n style={wrapperStyle}\n onSubmit={(e: SubmitEvent<HTMLFormElement>) => {\n e.preventDefault();\n onSearch?.(e);\n }}\n >\n <TextField {...textFieldProps} afterField={searchButton} />\n </form>\n );\n }\n);\n\nSearchFieldBase.displayName = \"SearchFieldBase\";\n","import React, { forwardRef, useId } from \"react\";\nimport { Listbox } from \"@purpur/listbox\";\nimport { type AutocompleteOption, useAutocomplete } from \"@purpur/use-autocomplete\";\nimport c from \"classnames/bind\";\n\nimport styles from \"./search-field.module.scss\";\nimport {\n type SearchFieldAutocompleteEnhancements,\n SearchFieldBase,\n type SearchFieldBaseProps,\n} from \"./search-field-base\";\n\nconst cx = c.bind(styles);\nconst rootClassName = \"purpur-search-field\";\n\nexport type SearchFieldAutocompleteProps = SearchFieldBaseProps &\n Extract<SearchFieldAutocompleteEnhancements, { suggestions: AutocompleteOption[] }>;\n\nexport const SearchFieldAutocomplete = forwardRef<HTMLInputElement, SearchFieldAutocompleteProps>(\n (\n {\n suggestions,\n suggestionsLabel,\n onSelectSuggestion,\n openSuggestionsOnFocus,\n suggestionsMaxHeight,\n ...searchFieldProps\n },\n ref\n ) => {\n const randomId = useId();\n const inputId = (searchFieldProps.id as string | undefined) ?? randomId;\n const autocomplete = useAutocomplete({\n id: inputId,\n options: suggestions,\n listboxLabel: suggestionsLabel,\n disabled: searchFieldProps.disabled,\n negative: searchFieldProps.negative,\n readOnly: searchFieldProps.readOnly,\n openOnFocus: openSuggestionsOnFocus,\n listboxMaxHeight: suggestionsMaxHeight,\n onSelect: onSelectSuggestion,\n [\"data-testid\"]: searchFieldProps[\"data-testid\"],\n });\n\n const setInputRef = (node: HTMLInputElement | null) => {\n (autocomplete.inputRef as React.MutableRefObject<HTMLInputElement | null>).current = node;\n if (typeof ref === \"function\") ref(node);\n else if (ref) (ref as React.MutableRefObject<HTMLInputElement | null>).current = node;\n };\n\n const handleInputChange: React.ChangeEventHandler<HTMLInputElement> = (event) => {\n searchFieldProps.onChange?.(event);\n if (!autocomplete.isOpen) {\n autocomplete.openListbox();\n }\n };\n return (\n <div\n ref={autocomplete.rootRef as React.RefObject<HTMLDivElement>}\n className={cx(`${rootClassName}__autocomplete-root`)}\n >\n <SearchFieldBase\n ref={setInputRef}\n {...searchFieldProps}\n onChange={handleInputChange}\n id={inputId}\n wrapperStyle={autocomplete.anchorStyle}\n {...autocomplete.inputProps}\n />\n {autocomplete.isOpen && (\n <Listbox {...autocomplete.listboxProps} className={cx(`${rootClassName}__listbox`)}>\n {suggestions.map((option, index) => {\n const { key, ...listboxItemProps } = autocomplete.getListboxItemProps(option, index);\n\n return (\n <Listbox.Item key={key} {...listboxItemProps}>\n {option.label}\n </Listbox.Item>\n );\n })}\n </Listbox>\n )}\n </div>\n );\n }\n);\n\nSearchFieldAutocomplete.displayName = \"SearchFieldAutocomplete\";\n","import React, { forwardRef } from \"react\";\n\nimport { SearchFieldAutocomplete } from \"./search-field-autocomplete\";\nimport {\n type SearchFieldAutocompleteEnhancements,\n SearchFieldBase,\n type SearchFieldBaseProps,\n searchFieldVariants,\n} from \"./search-field-base\";\n\nexport { searchFieldVariants };\n\nexport type SearchFieldProps = SearchFieldBaseProps & SearchFieldAutocompleteEnhancements;\n\nexport const SearchField = forwardRef<HTMLInputElement, SearchFieldProps>((props, ref) => {\n if (props.suggestions) {\n return <SearchFieldAutocomplete ref={ref} {...props} />;\n }\n\n return <SearchFieldBase ref={ref} {...props} />;\n});\n\nSearchField.displayName = \"SearchField\";\n\nexport {\n SearchFieldAutocomplete,\n type SearchFieldAutocompleteProps,\n} from \"./search-field-autocomplete\";\n"],"names":["cx","c","styles","rootClassName","SearchFieldButton","dataTestid","disabled","iconOnly","negative","label","type","onClick","buttonProps","Button","IconSearch","jsx","searchFieldVariants","SearchFieldBase","forwardRef","dataTestId","className","clearButtonAriaLabel","submitBehavior","iconOnlySearchButton","onClear","onSearch","searchButtonLabel","variant","formRef","wrapperStyle","props","ref","getTestId","name","hasClearButton","isManualSubmit","classes","textFieldProps","searchButton","event","handleKeyDown","TextField","e","SearchFieldAutocomplete","suggestions","suggestionsLabel","onSelectSuggestion","openSuggestionsOnFocus","suggestionsMaxHeight","searchFieldProps","randomId","useId","inputId","autocomplete","useAutocomplete","setInputRef","node","handleInputChange","jsxs","Listbox","option","index","key","listboxItemProps","SearchField"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"search-field-DkJrwzJB.js","sources":["../../../components/search-field/src/search-field-button.tsx","../../../components/search-field/src/search-field-base.tsx","../../../components/search-field/src/search-field-autocomplete.tsx","../../../components/search-field/src/search-field.tsx"],"sourcesContent":["import React from \"react\";\nimport { Button } from \"@purpur/button\";\nimport { IconSearch } from \"@purpur/icon/search\";\nimport c from \"classnames/bind\";\n\nimport styles from \"./search-field-button.module.scss\";\n\ntype Props = {\n [\"data-testid\"]?: string;\n disabled?: boolean;\n iconOnly?: boolean;\n negative?: boolean;\n label: string;\n type?: \"submit\" | \"button\";\n onClick?: (event: React.MouseEvent<HTMLButtonElement>) => void;\n};\n\nconst cx = c.bind(styles);\nconst rootClassName = \"purpur-search-field-button\";\n\nexport const SearchFieldButton = ({\n [\"data-testid\"]: dataTestid,\n disabled,\n iconOnly,\n negative,\n label,\n type = \"submit\",\n onClick,\n}: Props) => {\n const buttonProps = {\n className: cx(rootClassName, {\n [`${rootClassName}--icon-only`]: iconOnly,\n }),\n disabled,\n [\"data-testid\"]: dataTestid,\n negative,\n onClick,\n };\n\n if (iconOnly) {\n return (\n <Button {...buttonProps} aria-label={label} iconOnly size=\"sm\" type={type} variant=\"primary\">\n <IconSearch size=\"xs\" />\n </Button>\n );\n }\n\n return (\n <Button {...buttonProps} size=\"sm\" type={type} variant=\"primary\">\n {label}\n </Button>\n );\n};\n","import React, {\n type ChangeEvent,\n type CSSProperties,\n forwardRef,\n type RefObject,\n type SubmitEvent,\n} from \"react\";\nimport { IconSearch } from \"@purpur/icon/search\";\nimport { TextField, type TextFieldProps } from \"@purpur/text-field\";\nimport { type AutocompleteOption } from \"@purpur/use-autocomplete\";\nimport c from \"classnames/bind\";\n\nimport styles from \"./search-field.module.scss\";\nimport { SearchFieldButton } from \"./search-field-button\";\n\nexport const searchFieldVariants = [\"button-attached\", \"no-button\"] as const;\n\ntype Variant = (typeof searchFieldVariants)[number];\n\ntype DefaultProps = {\n [\"data-testid\"]?: string;\n clearButtonAriaLabel: string;\n disabled?: boolean;\n /**\n * Will display only a search icon in the search button if `true`.\n * */\n iconOnlySearchButton?: boolean;\n negative?: boolean;\n onChange?: (e: ChangeEvent<HTMLInputElement>) => void;\n /**\n * Event handler called when the clear button is clicked.\n * */\n onClear: () => void;\n /**\n * Event handler called when the search is triggered.\n * */\n onSearch?: (event?: React.SyntheticEvent) => void;\n /**\n * Controls how the search field handles submission.\n * - `\"form\"` (default): Renders a `<form>` element and submits via form submission.\n * - `\"manual\"`: Renders a `<div>` instead of a `<form>` element.\n * Use this when the component is nested inside another form.\n * */\n submitBehavior?: \"form\" | \"manual\";\n /**\n * The label text (or `aria-label` if `iconOnlySearchButton` is `true`) of the search button.\n * */\n searchButtonLabel?: string;\n variant: Variant;\n formRef?: RefObject<HTMLFormElement>;\n};\n\ntype TextSearchButton = {\n iconOnlySearchButton?: false;\n searchButtonLabel: string;\n variant: \"button-attached\";\n};\n\ntype IconOnlySearchButton = {\n iconOnlySearchButton: true;\n searchButtonLabel: string;\n variant: \"button-attached\";\n};\n\ntype NoButton = {\n searchButtonLabel?: never;\n variant: \"no-button\";\n};\n\nexport type SearchFieldBaseProps = DefaultProps &\n (TextSearchButton | IconOnlySearchButton | NoButton) &\n Omit<TextFieldProps, \"startAdornment\" | \"endAdornment\" | \"afterField\" | \"onChange\" | \"variant\">;\n\ntype SearchFieldBaseInternalProps = SearchFieldBaseProps & {\n wrapperStyle?: CSSProperties;\n};\n\ntype SearchFieldAutocompleteSharedProps = {\n /**\n * Called when the user selects a suggestion.\n */\n onSelectSuggestion?: (option: AutocompleteOption) => void;\n /**\n * Open the suggestions listbox when the input receives focus.\n */\n openSuggestionsOnFocus?: boolean;\n /**\n * Maximum height of the suggestions listbox. A number is interpreted as px.\n */\n suggestionsMaxHeight?: string | number;\n};\n\ntype SearchFieldWithoutAutocomplete = SearchFieldAutocompleteSharedProps & {\n suggestions?: never;\n suggestionsLabel?: never;\n};\n\ntype SearchFieldWithAutocomplete = SearchFieldAutocompleteSharedProps & {\n /**\n * The list of suggestions to display in a listbox below the field.\n * No filtering is applied — pass the already-correct (pre-filtered) list.\n * If autocomplete should stay enabled while there are temporarily no matches,\n * pass an empty array instead of `undefined` or `null`. Changing this prop\n * from an absent value to an array switches between the regular and\n * autocomplete variants, which causes a re-render, drops input focus, and\n * hides the listbox.\n */\n suggestions: AutocompleteOption[];\n /**\n * Accessible label for the suggestions listbox.\n */\n suggestionsLabel: string;\n};\n\nexport type SearchFieldAutocompleteEnhancements =\n | SearchFieldWithoutAutocomplete\n | SearchFieldWithAutocomplete;\n\nconst cx = c.bind(styles);\nconst rootClassName = \"purpur-search-field\";\n\nexport const SearchFieldBase = forwardRef<HTMLInputElement, SearchFieldBaseInternalProps>(\n (\n {\n [\"data-testid\"]: dataTestId,\n className,\n clearButtonAriaLabel,\n disabled,\n submitBehavior = \"form\",\n iconOnlySearchButton,\n negative = false,\n onClear,\n onSearch,\n searchButtonLabel,\n variant,\n formRef,\n wrapperStyle,\n ...props\n },\n ref\n ) => {\n const getTestId = (name: string) => (dataTestId ? `${dataTestId}-${name}` : undefined);\n const hasValue =\n typeof props.value === \"number\" ? props.value !== undefined : props.value?.length;\n const hasClearButton = hasValue && !disabled && !props.readOnly && !props.loading;\n const isManualSubmit = submitBehavior === \"manual\";\n\n const classes = cx(className, rootClassName, {\n [`${rootClassName}--no-gap`]: variant === \"button-attached\",\n [`${rootClassName}--has-clear-button`]: hasClearButton,\n });\n\n const textFieldProps: TextFieldProps = {\n ref,\n className: classes,\n clearButtonAriaLabel,\n disabled,\n negative,\n onClear,\n startAdornment: !iconOnlySearchButton ? (\n <IconSearch\n size=\"xs\"\n className={cx(`${rootClassName}__search-icon`, {\n [`${rootClassName}__search-icon--negative`]: negative,\n })}\n key=\"1\"\n />\n ) : null,\n \"data-testid\": getTestId(\"text-field\"),\n type: \"search\" as const,\n ...props,\n };\n\n const searchButton =\n variant !== \"no-button\" ? (\n <SearchFieldButton\n type={isManualSubmit ? \"button\" : \"submit\"}\n onClick={isManualSubmit ? (event) => onSearch?.(event) : undefined}\n disabled={disabled}\n iconOnly={iconOnlySearchButton}\n negative={negative}\n label={searchButtonLabel}\n data-testid={getTestId(\"button\")}\n />\n ) : null;\n\n if (isManualSubmit) {\n const handleKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {\n props.onKeyDown?.(event);\n\n if (event.key === \"Enter\" && !event.defaultPrevented) {\n event.preventDefault();\n onSearch?.(event);\n }\n };\n\n return (\n <div\n className={cx(`${rootClassName}__wrapper`)}\n data-testid={dataTestId}\n style={wrapperStyle}\n >\n <TextField {...textFieldProps} onKeyDown={handleKeyDown} afterField={searchButton} />\n </div>\n );\n }\n\n return (\n <form\n ref={formRef}\n className={cx(`${rootClassName}__wrapper`)}\n data-testid={dataTestId}\n style={wrapperStyle}\n onSubmit={(e: SubmitEvent<HTMLFormElement>) => {\n e.preventDefault();\n onSearch?.(e);\n }}\n >\n <TextField {...textFieldProps} afterField={searchButton} />\n </form>\n );\n }\n);\n\nSearchFieldBase.displayName = \"SearchFieldBase\";\n","import React, { forwardRef, useId } from \"react\";\nimport { Listbox } from \"@purpur/listbox\";\nimport { type AutocompleteOption, useAutocomplete } from \"@purpur/use-autocomplete\";\nimport c from \"classnames/bind\";\n\nimport styles from \"./search-field.module.scss\";\nimport {\n type SearchFieldAutocompleteEnhancements,\n SearchFieldBase,\n type SearchFieldBaseProps,\n} from \"./search-field-base\";\n\nconst cx = c.bind(styles);\nconst rootClassName = \"purpur-search-field\";\n\nexport type SearchFieldAutocompleteProps = SearchFieldBaseProps &\n Extract<SearchFieldAutocompleteEnhancements, { suggestions: AutocompleteOption[] }>;\n\nexport const SearchFieldAutocomplete = forwardRef<HTMLInputElement, SearchFieldAutocompleteProps>(\n (\n {\n suggestions,\n suggestionsLabel,\n onSelectSuggestion,\n openSuggestionsOnFocus,\n suggestionsMaxHeight,\n ...searchFieldProps\n },\n ref\n ) => {\n const randomId = useId();\n const inputId = (searchFieldProps.id as string | undefined) ?? randomId;\n const autocomplete = useAutocomplete({\n id: inputId,\n options: suggestions,\n listboxLabel: suggestionsLabel,\n disabled: searchFieldProps.disabled,\n negative: searchFieldProps.negative,\n readOnly: searchFieldProps.readOnly,\n openOnFocus: openSuggestionsOnFocus,\n listboxMaxHeight: suggestionsMaxHeight,\n onSelect: onSelectSuggestion,\n [\"data-testid\"]: searchFieldProps[\"data-testid\"],\n });\n\n const setInputRef = (node: HTMLInputElement | null) => {\n (autocomplete.inputRef as React.MutableRefObject<HTMLInputElement | null>).current = node;\n if (typeof ref === \"function\") ref(node);\n else if (ref) (ref as React.MutableRefObject<HTMLInputElement | null>).current = node;\n };\n\n const handleInputChange: React.ChangeEventHandler<HTMLInputElement> = (event) => {\n searchFieldProps.onChange?.(event);\n if (!autocomplete.isOpen) {\n autocomplete.openListbox();\n }\n };\n return (\n <div\n ref={autocomplete.rootRef as React.RefObject<HTMLDivElement>}\n className={cx(`${rootClassName}__autocomplete-root`)}\n >\n <SearchFieldBase\n ref={setInputRef}\n {...searchFieldProps}\n onChange={handleInputChange}\n id={inputId}\n wrapperStyle={autocomplete.anchorStyle}\n {...autocomplete.inputProps}\n />\n {autocomplete.isOpen && (\n <Listbox {...autocomplete.listboxProps} className={cx(`${rootClassName}__listbox`)}>\n {suggestions.map((option, index) => {\n const { key, ...listboxItemProps } = autocomplete.getListboxItemProps(option, index);\n\n return (\n <Listbox.Item key={key} {...listboxItemProps}>\n {option.label}\n </Listbox.Item>\n );\n })}\n </Listbox>\n )}\n </div>\n );\n }\n);\n\nSearchFieldAutocomplete.displayName = \"SearchFieldAutocomplete\";\n","import React, { forwardRef } from \"react\";\n\nimport { SearchFieldAutocomplete } from \"./search-field-autocomplete\";\nimport {\n type SearchFieldAutocompleteEnhancements,\n SearchFieldBase,\n type SearchFieldBaseProps,\n searchFieldVariants,\n} from \"./search-field-base\";\n\nexport { searchFieldVariants };\n\nexport type SearchFieldProps = SearchFieldBaseProps & SearchFieldAutocompleteEnhancements;\n\nexport const SearchField = forwardRef<HTMLInputElement, SearchFieldProps>((props, ref) => {\n if (props.suggestions) {\n return <SearchFieldAutocomplete ref={ref} {...props} />;\n }\n\n return <SearchFieldBase ref={ref} {...props} />;\n});\n\nSearchField.displayName = \"SearchField\";\n\nexport {\n SearchFieldAutocomplete,\n type SearchFieldAutocompleteProps,\n} from \"./search-field-autocomplete\";\n"],"names":["cx","c","styles","rootClassName","SearchFieldButton","dataTestid","disabled","iconOnly","negative","label","type","onClick","buttonProps","Button","IconSearch","jsx","searchFieldVariants","SearchFieldBase","forwardRef","dataTestId","className","clearButtonAriaLabel","submitBehavior","iconOnlySearchButton","onClear","onSearch","searchButtonLabel","variant","formRef","wrapperStyle","props","ref","getTestId","name","hasClearButton","isManualSubmit","classes","textFieldProps","searchButton","event","handleKeyDown","TextField","e","SearchFieldAutocomplete","suggestions","suggestionsLabel","onSelectSuggestion","openSuggestionsOnFocus","suggestionsMaxHeight","searchFieldProps","randomId","useId","inputId","autocomplete","useAutocomplete","setInputRef","node","handleInputChange","jsxs","Listbox","option","index","key","listboxItemProps","SearchField"],"mappings":"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"}
|
package/dist/search-field.cjs.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./search-field-
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./search-field-DkJrwzJB.js");exports.SearchField=e.SearchField;exports.SearchFieldAutocomplete=e.SearchFieldAutocomplete;exports.searchFieldVariants=e.searchFieldVariants;
|
|
2
2
|
//# sourceMappingURL=search-field.cjs.js.map
|
package/dist/search-field.es.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";const e=require("react/jsx-runtime"),l=require("react"),N=require("./button-
|
|
2
|
-
//# sourceMappingURL=stepper-
|
|
1
|
+
"use strict";const e=require("react/jsx-runtime"),l=require("react"),N=require("./button-DZgtrGqN.js"),M=require("./chevron-left.es-B0vPg5XM.js"),W=require("./chevron-right.es-Bv376M3o.js"),I=require("./index-BVmlsxuF.js"),x=require("./index-CoR7YA3H.js"),T=require("./bind-DeUYJ6m9.js"),J=require("./tooltip-COFCRUKv.js"),K=require("./checkmark.es-lYntWFA3.js"),Q={PRIMARY:"primary"},L={SMALL_SCREEN:"small-screen",LARGE_SCREEN:"large-screen",ALWAYS:"always"},X={"purpur-stepper__nav-container":"_purpur-stepper__nav-container_1rouo_1","purpur-stepper__nav":"_purpur-stepper__nav_1rouo_1","purpur-stepper":"_purpur-stepper_1rouo_1","purpur-stepper__scroll-button":"_purpur-stepper__scroll-button_1rouo_7","purpur-stepper__scroll-button--left":"_purpur-stepper__scroll-button--left_1rouo_18","purpur-stepper__scroll-button--right":"_purpur-stepper__scroll-button--right_1rouo_21","purpur-stepper__scroll-button-icon":"_purpur-stepper__scroll-button-icon_1rouo_24","purpur-stepper__hidden":"_purpur-stepper__hidden_1rouo_27"},Z={"purpur-stepper-container":"_purpur-stepper-container_162zw_1","purpur-stepper-container__inner--align-with-grid":"_purpur-stepper-container__inner--align-with-grid_162zw_5","purpur-stepper-container--primary":"_purpur-stepper-container--primary_162zw_18","purpur-stepper-container--secondary":"_purpur-stepper-container--secondary_162zw_21"},O=T.c.bind(Z),j="purpur-stepper-container",ee=({["data-testid"]:t="purpur-stepper-container",children:r,className:s,alignWithGrid:n,variant:i,...p})=>{const m=O(s,j,{[`${j}--${i}`]:i,[`${j}--align-with-grid`]:n});return e.jsx("div",{className:m,"data-testid":t,...p,children:e.jsx("div",{className:O(`${j}__inner`,{[`${j}__inner--align-with-grid`]:n}),children:r})})},te=l.forwardRef(({children:t,...r},s)=>{const{finished:n,...i}=r;return e.jsx("div",{...i,ref:s,children:t})}),re=t=>!!t&&l.isValidElement(t)&&!!t.props.label,se={"purpur-stepper-button":"_purpur-stepper-button_162is_1","purpur-stepper-button__trigger-outline":"_purpur-stepper-button__trigger-outline_162is_21","purpur-stepper-button--first":"_purpur-stepper-button--first_162is_33","purpur-stepper-button--current":"_purpur-stepper-button--current_162is_33","purpur-stepper-button--middle":"_purpur-stepper-button--middle_162is_38","purpur-stepper-button--last":"_purpur-stepper-button--last_162is_48","purpur-stepper-button--visibility-small-screen":"_purpur-stepper-button--visibility-small-screen_162is_58","purpur-stepper-button--visibility-large-screen":"_purpur-stepper-button--visibility-large-screen_162is_66","purpur-stepper-button__icon":"_purpur-stepper-button__icon_162is_90","purpur-stepper-button__step-number":"_purpur-stepper-button__step-number_162is_100","purpur-stepper-button__step-number--current":"_purpur-stepper-button__step-number--current_162is_111","purpur-stepper-button__step-number--disabled":"_purpur-stepper-button__step-number--disabled_162is_115","purpur-stepper-button__step-label":"_purpur-stepper-button__step-label_162is_120","arrow-forward":"_arrow-forward_162is_124","purpur-stepper-button--primary":"_purpur-stepper-button--primary_162is_136","purpur-stepper-button--disabled":"_purpur-stepper-button--disabled_162is_139","purpur-stepper-button--secondary":"_purpur-stepper-button--secondary_162is_145","arrow-tail":"_arrow-tail_162is_155","sr-only--lg-down":"_sr-only--lg-down_162is_174"},w=T.c.bind(se),d="purpur-stepper-button",ne=({["data-testid"]:t,current:r,disabled:s,stepNumber:n})=>e.jsx("div",{"data-testid":t,className:w([`${d}__step-number`,{[`${d}__step-number--current`]:r},{[`${d}__step-number--disabled`]:s}]),children:n}),A=l.forwardRef(({className:t,["data-testid"]:r,variant:s,step:n,indexOfLastItem:i,index:p,currentStepIndex:m,whenToBeVisible:f,handleStepChange:u,handleStepFocus:a,completedStepLabel:o,..._},b)=>{const $=p===0?"first":p===i?"last":"middle",g=p===m;return e.jsx(I.Item,{asChild:!0,children:e.jsx(N.Button,{..._,ref:b,className:w(t,d,`${d}--${$}`,`${d}--${s}`,`${d}--visibility-${f}`,{[`${d}--current`]:g},{[`${d}--disabled`]:n.disabled},{"arrow-tail":$!=="first"},{"arrow-forward":$!=="last"}),id:`stepper-trigger-button-${p}`,variant:N.BUTTON_VARIANT.TERTIARY_PURPLE,"data-testid":`${r}-step-trigger-item-${p}`,disabled:n.disabled,"aria-current":g&&"step","aria-label":n.finished&&!g?[n.label,o].filter(Boolean).join(", "):void 0,onClick:E=>u(E,p),onFocus:a,children:e.jsxs("span",{className:w(`${d}__trigger-outline`),children:[n.finished&&!g?e.jsx(K.a,{className:w(`${d}__icon`),"data-testid":`${r}-step-finished-icon`,size:"sm"}):e.jsx(ne,{"data-testid":`${r}-step-number`,current:g,disabled:n.disabled,stepNumber:p+1}),e.jsx("span",{className:w(`${d}__step-label`,{"sr-only--lg-down":!g}),children:n.label})]})})})}),pe={"purpur-stepper-nav-items__list":"_purpur-stepper-nav-items__list_lgkh0_1","purpur-stepper-nav-items__list-item":"_purpur-stepper-nav-items__list-item_lgkh0_7","purpur-stepper-nav-items__list-item--current":"_purpur-stepper-nav-items__list-item--current_lgkh0_25","purpur-stepper-nav-items__tooltip-content":"_purpur-stepper-nav-items__tooltip-content_lgkh0_31","purpur-stepper-nav-items__tooltip-trigger-item-container":"_purpur-stepper-nav-items__tooltip-trigger-item-container_lgkh0_34"},C=T.c.bind(pe),y="purpur-stepper-nav-items",oe=l.forwardRef(({["data-testid"]:t,variant:r,handleStepChange:s,handleStepFocus:n,steps:i,firstStepRef:p,lastStepRef:m,currentStepIndex:f,completedStepLabel:u},a)=>{const o=i.map((_,b)=>{const $=e.jsx("span",{className:C(`${y}__tooltip-trigger-item-container`),children:e.jsx(A,{"data-testid":`${t}-disabled-sm`,variant:r,step:_,indexOfLastItem:i.length-1,index:b,currentStepIndex:f,whenToBeVisible:L.SMALL_SCREEN,completedStepLabel:u,handleStepChange:s,handleStepFocus:n})});return e.jsx("li",{className:C(`${y}__list-item`,{[`${y}__list-item--current`]:b===f}),ref:b===0?p:b===i.length-1?m:null,children:_.disabled?e.jsxs(e.Fragment,{children:[e.jsx(J.Tooltip,{contentClassName:C(`${y}__tooltip-content`),triggerElement:$,children:_.label}),e.jsx(A,{"data-testid":`${t}-disabled-lg`,variant:r,step:_,indexOfLastItem:i.length-1,index:b,currentStepIndex:f,whenToBeVisible:L.LARGE_SCREEN,completedStepLabel:u,handleStepChange:s,handleStepFocus:n})]}):e.jsx(A,{"data-testid":t,variant:r,step:_,indexOfLastItem:i.length-1,index:b,currentStepIndex:f,whenToBeVisible:L.ALWAYS,completedStepLabel:u,handleStepChange:s,handleStepFocus:n})},_.label)});return e.jsx(I.Root,{loop:!1,dir:"ltr",children:e.jsx("ol",{ref:a,className:C(`${y}__list`),children:o})})}),ie=t=>{const r=l.useRef(!0),s=l.useRef(null);return l.useEffect(()=>{!r.current&&s.current!==null&&s.current.focus(),r.current=!1},[t]),{contentRef:s}},S={LEFT:"left",RIGHT:"right"},le=()=>{const t=l.useRef(null),r=l.useRef(null),s=l.useRef(null),[n,i]=l.useState(!1),[p,m]=l.useState(!1),f=u=>{if(!t.current)return;const a=t.current,o=a.clientWidth,_=a.scrollLeft;u===S.LEFT&&a.scroll({behavior:"smooth",left:_-o/2}),u===S.RIGHT&&a.scroll({behavior:"smooth",left:_+o/2})};return l.useEffect(()=>{if(r.current&&s.current&&t.current){const u=new IntersectionObserver(a=>{for(const o of a){if(o.target===r.current){o.isIntersecting?i(!1):i(!0);continue}o.target===s.current&&(o.isIntersecting?m(!1):m(!0))}},{root:t.current,threshold:.95});return u.observe(r.current),u.observe(s.current),()=>u.disconnect()}},[r,s,t]),{scrollContainer:t,firstStepRef:r,lastStepRef:s,displayLeftScrollButton:n,displayRightScrollButton:p,handleHorizontalScroll:f}},R=T.c.bind(X),c="purpur-stepper",B=({["aria-label"]:t,["data-testid"]:r,children:s,className:n,completedStepLabel:i,currentStepIndex:p=0,onStepChange:m,alignWithGrid:f=!1,leftScrollButtonAriaLabel:u,rightScrollButtonAriaLabel:a,variant:o=Q.PRIMARY,..._})=>{const b=l.Children.toArray(s).filter(re),$=l.Children.map(b,h=>{const{disabled:v,finished:D,label:G}=h.props;return{disabled:v??!1,finished:D??!1,label:G}}),{contentRef:g}=ie(p),{scrollContainer:E,firstStepRef:q,lastStepRef:z,displayLeftScrollButton:P,displayRightScrollButton:Y,handleHorizontalScroll:V}=le(),U=R([n,c,{[`${c}--${o}`]:o}]),k=h=>{h.target.scrollIntoView({behavior:"smooth",block:"nearest",inline:"center"})},F=(h,v)=>{h.preventDefault(),k(h),m(v)},H=h=>{k(h)};return e.jsxs("div",{className:U,..._,children:[e.jsx(ee,{variant:o,alignWithGrid:f,children:e.jsxs("div",{className:R(`${c}__nav-container`),children:[e.jsxs(x.Root,{children:[e.jsx(x.Viewport,{ref:E,children:e.jsx("div",{"aria-label":t,"data-testid":r,className:R([`${c}__nav`,{[`${c}__nav--${o}`]:o}]),children:e.jsx(I.Root,{loop:!1,dir:"ltr",children:e.jsx(oe,{"data-testid":r,variant:o,firstStepRef:q,lastStepRef:z,steps:$,currentStepIndex:p,handleStepChange:F,handleStepFocus:H,completedStepLabel:i})})})}),e.jsx(x.Scrollbar,{orientation:"horizontal",children:e.jsx(x.Thumb,{})})]}),P&&e.jsx(N.Button,{"aria-label":u,className:R([`${c}__scroll-button`,`${c}__scroll-button--left`]),variant:N.BUTTON_VARIANT.TERTIARY_PURPLE,tabIndex:-1,iconOnly:!0,onClick:()=>{V(S.LEFT)},children:e.jsx(M.l,{className:R(`${c}__scroll-button-icon`),size:"md"})}),Y&&e.jsx(N.Button,{"aria-label":a,className:R([`${c}__scroll-button`,`${c}__scroll-button--right`]),variant:N.BUTTON_VARIANT.TERTIARY_PURPLE,tabIndex:-1,iconOnly:!0,onClick:()=>{V(S.RIGHT)},children:e.jsx(W.n,{className:R(`${c}__scroll-button-icon`),size:"md"})})]})}),e.jsx("div",{tabIndex:-1,"aria-labelledby":`stepper-trigger-button-${p}`,ref:g,style:{outline:"none"},children:e.jsx("div",{"aria-live":"polite",children:l.Children.map(b,(h,v)=>e.jsx("div",{className:R({[`${c}__hidden`]:v!==p}),hidden:v!==p,children:h}))})})]})};B.Content=te;B.displayName="Stepper";exports.Stepper=B;
|
|
2
|
+
//# sourceMappingURL=stepper-5rQ3cK18.js.map
|