@kosmeo-ui/react 0.1.0
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/LICENSE +202 -0
- package/README.md +86 -0
- package/dist/components/buttons/button/index.d.ts +40 -0
- package/dist/components/buttons/button/index.d.ts.map +1 -0
- package/dist/components/buttons/button/index.js +11 -0
- package/dist/components/buttons/button/index.js.map +1 -0
- package/dist/components/buttons/button/styles.css +193 -0
- package/dist/components/buttons/iconButton/index.d.ts +10 -0
- package/dist/components/buttons/iconButton/index.d.ts.map +1 -0
- package/dist/components/buttons/iconButton/index.js +10 -0
- package/dist/components/buttons/iconButton/index.js.map +1 -0
- package/dist/components/buttons/iconButton/styles.css +14 -0
- package/dist/components/buttons/rowActions/index.d.ts +12 -0
- package/dist/components/buttons/rowActions/index.d.ts.map +1 -0
- package/dist/components/buttons/rowActions/index.js +13 -0
- package/dist/components/buttons/rowActions/index.js.map +1 -0
- package/dist/components/buttons/rowActions/styles.css +27 -0
- package/dist/components/data-display/addressBlock/index.d.ts +26 -0
- package/dist/components/data-display/addressBlock/index.d.ts.map +1 -0
- package/dist/components/data-display/addressBlock/index.js +13 -0
- package/dist/components/data-display/addressBlock/index.js.map +1 -0
- package/dist/components/data-display/addressBlock/styles.css +41 -0
- package/dist/components/data-display/colorSwatch/index.d.ts +12 -0
- package/dist/components/data-display/colorSwatch/index.d.ts.map +1 -0
- package/dist/components/data-display/colorSwatch/index.js +8 -0
- package/dist/components/data-display/colorSwatch/index.js.map +1 -0
- package/dist/components/data-display/colorSwatch/styles.css +25 -0
- package/dist/components/data-display/dataTable/index.d.ts +28 -0
- package/dist/components/data-display/dataTable/index.d.ts.map +1 -0
- package/dist/components/data-display/dataTable/index.js +84 -0
- package/dist/components/data-display/dataTable/index.js.map +1 -0
- package/dist/components/data-display/dataTable/styles.css +54 -0
- package/dist/components/data-display/dataTable/types.d.ts +68 -0
- package/dist/components/data-display/dataTable/types.d.ts.map +1 -0
- package/dist/components/data-display/dataTable/types.js +2 -0
- package/dist/components/data-display/dataTable/types.js.map +1 -0
- package/dist/components/data-display/dataTable/utils/parseDataKey.d.ts +3 -0
- package/dist/components/data-display/dataTable/utils/parseDataKey.d.ts.map +1 -0
- package/dist/components/data-display/dataTable/utils/parseDataKey.js +44 -0
- package/dist/components/data-display/dataTable/utils/parseDataKey.js.map +1 -0
- package/dist/components/data-display/imagePreview/index.d.ts +13 -0
- package/dist/components/data-display/imagePreview/index.d.ts.map +1 -0
- package/dist/components/data-display/imagePreview/index.js +10 -0
- package/dist/components/data-display/imagePreview/index.js.map +1 -0
- package/dist/components/data-display/imagePreview/styles.css +52 -0
- package/dist/components/data-display/infiniteScroll/filters/index.d.ts +11 -0
- package/dist/components/data-display/infiniteScroll/filters/index.d.ts.map +1 -0
- package/dist/components/data-display/infiniteScroll/filters/index.js +30 -0
- package/dist/components/data-display/infiniteScroll/filters/index.js.map +1 -0
- package/dist/components/data-display/infiniteScroll/filters/listFilter.d.ts +9 -0
- package/dist/components/data-display/infiniteScroll/filters/listFilter.d.ts.map +1 -0
- package/dist/components/data-display/infiniteScroll/filters/listFilter.js +40 -0
- package/dist/components/data-display/infiniteScroll/filters/listFilter.js.map +1 -0
- package/dist/components/data-display/infiniteScroll/filters/rangeFilter.d.ts +9 -0
- package/dist/components/data-display/infiniteScroll/filters/rangeFilter.d.ts.map +1 -0
- package/dist/components/data-display/infiniteScroll/filters/rangeFilter.js +126 -0
- package/dist/components/data-display/infiniteScroll/filters/rangeFilter.js.map +1 -0
- package/dist/components/data-display/infiniteScroll/filters/searchFilter.d.ts +9 -0
- package/dist/components/data-display/infiniteScroll/filters/searchFilter.d.ts.map +1 -0
- package/dist/components/data-display/infiniteScroll/filters/searchFilter.js +41 -0
- package/dist/components/data-display/infiniteScroll/filters/searchFilter.js.map +1 -0
- package/dist/components/data-display/infiniteScroll/filters/selectFilter.d.ts +9 -0
- package/dist/components/data-display/infiniteScroll/filters/selectFilter.d.ts.map +1 -0
- package/dist/components/data-display/infiniteScroll/filters/selectFilter.js +53 -0
- package/dist/components/data-display/infiniteScroll/filters/selectFilter.js.map +1 -0
- package/dist/components/data-display/infiniteScroll/filters/styles.css +48 -0
- package/dist/components/data-display/infiniteScroll/header/deleteButton.d.ts +10 -0
- package/dist/components/data-display/infiniteScroll/header/deleteButton.d.ts.map +1 -0
- package/dist/components/data-display/infiniteScroll/header/deleteButton.js +29 -0
- package/dist/components/data-display/infiniteScroll/header/deleteButton.js.map +1 -0
- package/dist/components/data-display/infiniteScroll/header/index.d.ts +22 -0
- package/dist/components/data-display/infiniteScroll/header/index.d.ts.map +1 -0
- package/dist/components/data-display/infiniteScroll/header/index.js +15 -0
- package/dist/components/data-display/infiniteScroll/header/index.js.map +1 -0
- package/dist/components/data-display/infiniteScroll/header/limit.d.ts +9 -0
- package/dist/components/data-display/infiniteScroll/header/limit.d.ts.map +1 -0
- package/dist/components/data-display/infiniteScroll/header/limit.js +34 -0
- package/dist/components/data-display/infiniteScroll/header/limit.js.map +1 -0
- package/dist/components/data-display/infiniteScroll/header/sortBy.d.ts +9 -0
- package/dist/components/data-display/infiniteScroll/header/sortBy.d.ts.map +1 -0
- package/dist/components/data-display/infiniteScroll/header/sortBy.js +24 -0
- package/dist/components/data-display/infiniteScroll/header/sortBy.js.map +1 -0
- package/dist/components/data-display/infiniteScroll/header/sortDirection.d.ts +9 -0
- package/dist/components/data-display/infiniteScroll/header/sortDirection.d.ts.map +1 -0
- package/dist/components/data-display/infiniteScroll/header/sortDirection.js +19 -0
- package/dist/components/data-display/infiniteScroll/header/sortDirection.js.map +1 -0
- package/dist/components/data-display/infiniteScroll/header/styles.css +64 -0
- package/dist/components/data-display/infiniteScroll/index.d.ts +57 -0
- package/dist/components/data-display/infiniteScroll/index.d.ts.map +1 -0
- package/dist/components/data-display/infiniteScroll/index.js +190 -0
- package/dist/components/data-display/infiniteScroll/index.js.map +1 -0
- package/dist/components/data-display/infiniteScroll/styles.css +37 -0
- package/dist/components/data-display/infiniteScroll/table/index.d.ts +16 -0
- package/dist/components/data-display/infiniteScroll/table/index.d.ts.map +1 -0
- package/dist/components/data-display/infiniteScroll/table/index.js +15 -0
- package/dist/components/data-display/infiniteScroll/table/index.js.map +1 -0
- package/dist/components/data-display/infiniteScroll/tags/index.d.ts +9 -0
- package/dist/components/data-display/infiniteScroll/tags/index.d.ts.map +1 -0
- package/dist/components/data-display/infiniteScroll/tags/index.js +43 -0
- package/dist/components/data-display/infiniteScroll/tags/index.js.map +1 -0
- package/dist/components/data-display/infiniteScroll/tags/listFilterTag.d.ts +10 -0
- package/dist/components/data-display/infiniteScroll/tags/listFilterTag.d.ts.map +1 -0
- package/dist/components/data-display/infiniteScroll/tags/listFilterTag.js +82 -0
- package/dist/components/data-display/infiniteScroll/tags/listFilterTag.js.map +1 -0
- package/dist/components/data-display/infiniteScroll/tags/rangeFilterTag.d.ts +11 -0
- package/dist/components/data-display/infiniteScroll/tags/rangeFilterTag.d.ts.map +1 -0
- package/dist/components/data-display/infiniteScroll/tags/rangeFilterTag.js +54 -0
- package/dist/components/data-display/infiniteScroll/tags/rangeFilterTag.js.map +1 -0
- package/dist/components/data-display/infiniteScroll/tags/searchFilterTag.d.ts +10 -0
- package/dist/components/data-display/infiniteScroll/tags/searchFilterTag.d.ts.map +1 -0
- package/dist/components/data-display/infiniteScroll/tags/searchFilterTag.js +22 -0
- package/dist/components/data-display/infiniteScroll/tags/searchFilterTag.js.map +1 -0
- package/dist/components/data-display/infiniteScroll/tags/selectFilterTag.d.ts +11 -0
- package/dist/components/data-display/infiniteScroll/tags/selectFilterTag.d.ts.map +1 -0
- package/dist/components/data-display/infiniteScroll/tags/selectFilterTag.js +26 -0
- package/dist/components/data-display/infiniteScroll/tags/selectFilterTag.js.map +1 -0
- package/dist/components/data-display/infiniteScroll/tags/styles.css +65 -0
- package/dist/components/data-display/infiniteScroll/types.d.ts +87 -0
- package/dist/components/data-display/infiniteScroll/types.d.ts.map +1 -0
- package/dist/components/data-display/infiniteScroll/types.js +2 -0
- package/dist/components/data-display/infiniteScroll/types.js.map +1 -0
- package/dist/components/data-display/infiniteScroll/utils/generateQueryString.d.ts +12 -0
- package/dist/components/data-display/infiniteScroll/utils/generateQueryString.d.ts.map +1 -0
- package/dist/components/data-display/infiniteScroll/utils/generateQueryString.js +49 -0
- package/dist/components/data-display/infiniteScroll/utils/generateQueryString.js.map +1 -0
- package/dist/components/data-display/infiniteScroll/utils/hasPendingChanges.d.ts +15 -0
- package/dist/components/data-display/infiniteScroll/utils/hasPendingChanges.d.ts.map +1 -0
- package/dist/components/data-display/infiniteScroll/utils/hasPendingChanges.js +87 -0
- package/dist/components/data-display/infiniteScroll/utils/hasPendingChanges.js.map +1 -0
- package/dist/components/data-display/listCard/index.d.ts +13 -0
- package/dist/components/data-display/listCard/index.d.ts.map +1 -0
- package/dist/components/data-display/listCard/index.js +9 -0
- package/dist/components/data-display/listCard/index.js.map +1 -0
- package/dist/components/data-display/listCard/styles.css +48 -0
- package/dist/components/data-display/listRow/index.d.ts +10 -0
- package/dist/components/data-display/listRow/index.d.ts.map +1 -0
- package/dist/components/data-display/listRow/index.js +8 -0
- package/dist/components/data-display/listRow/index.js.map +1 -0
- package/dist/components/data-display/listRow/styles.css +22 -0
- package/dist/components/data-display/recoveryCodeGrid/index.d.ts +11 -0
- package/dist/components/data-display/recoveryCodeGrid/index.d.ts.map +1 -0
- package/dist/components/data-display/recoveryCodeGrid/index.js +8 -0
- package/dist/components/data-display/recoveryCodeGrid/index.js.map +1 -0
- package/dist/components/data-display/recoveryCodeGrid/styles.css +47 -0
- package/dist/components/data-display/secretDisplay/index.d.ts +19 -0
- package/dist/components/data-display/secretDisplay/index.d.ts.map +1 -0
- package/dist/components/data-display/secretDisplay/index.js +24 -0
- package/dist/components/data-display/secretDisplay/index.js.map +1 -0
- package/dist/components/data-display/secretDisplay/styles.css +24 -0
- package/dist/components/data-display/statCard/index.d.ts +22 -0
- package/dist/components/data-display/statCard/index.d.ts.map +1 -0
- package/dist/components/data-display/statCard/index.js +24 -0
- package/dist/components/data-display/statCard/index.js.map +1 -0
- package/dist/components/data-display/statCard/styles.css +96 -0
- package/dist/components/data-display/summaryRow/index.d.ts +12 -0
- package/dist/components/data-display/summaryRow/index.d.ts.map +1 -0
- package/dist/components/data-display/summaryRow/index.js +8 -0
- package/dist/components/data-display/summaryRow/index.js.map +1 -0
- package/dist/components/data-display/summaryRow/styles.css +26 -0
- package/dist/components/data-display/table/index.d.ts +37 -0
- package/dist/components/data-display/table/index.d.ts.map +1 -0
- package/dist/components/data-display/table/index.js +50 -0
- package/dist/components/data-display/table/index.js.map +1 -0
- package/dist/components/data-display/table/styles.css +61 -0
- package/dist/components/data-display/tagCard/index.d.ts +10 -0
- package/dist/components/data-display/tagCard/index.d.ts.map +1 -0
- package/dist/components/data-display/tagCard/index.js +12 -0
- package/dist/components/data-display/tagCard/index.js.map +1 -0
- package/dist/components/data-display/tagCard/styles.css +14 -0
- package/dist/components/feedback/alert/index.d.ts +17 -0
- package/dist/components/feedback/alert/index.d.ts.map +1 -0
- package/dist/components/feedback/alert/index.js +26 -0
- package/dist/components/feedback/alert/index.js.map +1 -0
- package/dist/components/feedback/alert/styles.css +88 -0
- package/dist/components/feedback/badge/index.d.ts +23 -0
- package/dist/components/feedback/badge/index.d.ts.map +1 -0
- package/dist/components/feedback/badge/index.js +33 -0
- package/dist/components/feedback/badge/index.js.map +1 -0
- package/dist/components/feedback/badge/styles.css +162 -0
- package/dist/components/feedback/badge/utils.d.ts +6 -0
- package/dist/components/feedback/badge/utils.d.ts.map +1 -0
- package/dist/components/feedback/badge/utils.js +17 -0
- package/dist/components/feedback/badge/utils.js.map +1 -0
- package/dist/components/feedback/emptyState/index.d.ts +13 -0
- package/dist/components/feedback/emptyState/index.d.ts.map +1 -0
- package/dist/components/feedback/emptyState/index.js +8 -0
- package/dist/components/feedback/emptyState/index.js.map +1 -0
- package/dist/components/feedback/emptyState/styles.css +32 -0
- package/dist/components/feedback/loadingOverlay/index.d.ts +12 -0
- package/dist/components/feedback/loadingOverlay/index.d.ts.map +1 -0
- package/dist/components/feedback/loadingOverlay/index.js +30 -0
- package/dist/components/feedback/loadingOverlay/index.js.map +1 -0
- package/dist/components/feedback/loadingOverlay/styles.css +48 -0
- package/dist/components/feedback/progressBar/index.d.ts +11 -0
- package/dist/components/feedback/progressBar/index.d.ts.map +1 -0
- package/dist/components/feedback/progressBar/index.js +11 -0
- package/dist/components/feedback/progressBar/index.js.map +1 -0
- package/dist/components/feedback/progressBar/styles.css +42 -0
- package/dist/components/feedback/spinner/index.d.ts +7 -0
- package/dist/components/feedback/spinner/index.d.ts.map +1 -0
- package/dist/components/feedback/spinner/index.js +9 -0
- package/dist/components/feedback/spinner/index.js.map +1 -0
- package/dist/components/feedback/spinner/styles.css +64 -0
- package/dist/components/feedback/tooltip/index.d.ts +32 -0
- package/dist/components/feedback/tooltip/index.d.ts.map +1 -0
- package/dist/components/feedback/tooltip/index.js +37 -0
- package/dist/components/feedback/tooltip/index.js.map +1 -0
- package/dist/components/feedback/tooltip/styles.css +84 -0
- package/dist/components/forms/detailField/index.d.ts +11 -0
- package/dist/components/forms/detailField/index.d.ts.map +1 -0
- package/dist/components/forms/detailField/index.js +8 -0
- package/dist/components/forms/detailField/index.js.map +1 -0
- package/dist/components/forms/detailField/styles.css +27 -0
- package/dist/components/forms/fieldShell/index.d.ts +24 -0
- package/dist/components/forms/fieldShell/index.d.ts.map +1 -0
- package/dist/components/forms/fieldShell/index.js +8 -0
- package/dist/components/forms/fieldShell/index.js.map +1 -0
- package/dist/components/forms/fieldShell/styles.css +38 -0
- package/dist/components/forms/form/index.d.ts +11 -0
- package/dist/components/forms/form/index.d.ts.map +1 -0
- package/dist/components/forms/form/index.js +56 -0
- package/dist/components/forms/form/index.js.map +1 -0
- package/dist/components/forms/form/styles.css +27 -0
- package/dist/components/forms/formActions/formError.d.ts +7 -0
- package/dist/components/forms/formActions/formError.d.ts.map +1 -0
- package/dist/components/forms/formActions/formError.js +7 -0
- package/dist/components/forms/formActions/formError.js.map +1 -0
- package/dist/components/forms/formActions/index.d.ts +14 -0
- package/dist/components/forms/formActions/index.d.ts.map +1 -0
- package/dist/components/forms/formActions/index.js +8 -0
- package/dist/components/forms/formActions/index.js.map +1 -0
- package/dist/components/forms/formActions/styles.css +50 -0
- package/dist/components/forms/formGrid/index.d.ts +10 -0
- package/dist/components/forms/formGrid/index.d.ts.map +1 -0
- package/dist/components/forms/formGrid/index.js +8 -0
- package/dist/components/forms/formGrid/index.js.map +1 -0
- package/dist/components/forms/formGrid/styles.css +41 -0
- package/dist/components/forms/infoRow/index.d.ts +11 -0
- package/dist/components/forms/infoRow/index.d.ts.map +1 -0
- package/dist/components/forms/infoRow/index.js +8 -0
- package/dist/components/forms/infoRow/index.js.map +1 -0
- package/dist/components/forms/infoRow/styles.css +38 -0
- package/dist/components/forms/optionsGroup/index.d.ts +11 -0
- package/dist/components/forms/optionsGroup/index.d.ts.map +1 -0
- package/dist/components/forms/optionsGroup/index.js +8 -0
- package/dist/components/forms/optionsGroup/index.js.map +1 -0
- package/dist/components/forms/optionsGroup/styles.css +34 -0
- package/dist/components/forms/requiredAsterisk/index.d.ts +4 -0
- package/dist/components/forms/requiredAsterisk/index.d.ts.map +1 -0
- package/dist/components/forms/requiredAsterisk/index.js +6 -0
- package/dist/components/forms/requiredAsterisk/index.js.map +1 -0
- package/dist/components/forms/requiredAsterisk/styles.css +3 -0
- package/dist/components/index.d.ts +93 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/index.js +65 -0
- package/dist/components/index.js.map +1 -0
- package/dist/components/inputs/checkbox/index.d.ts +17 -0
- package/dist/components/inputs/checkbox/index.d.ts.map +1 -0
- package/dist/components/inputs/checkbox/index.js +11 -0
- package/dist/components/inputs/checkbox/index.js.map +1 -0
- package/dist/components/inputs/checkbox/styles.css +48 -0
- package/dist/components/inputs/checkboxGroup/index.d.ts +17 -0
- package/dist/components/inputs/checkboxGroup/index.d.ts.map +1 -0
- package/dist/components/inputs/checkboxGroup/index.js +16 -0
- package/dist/components/inputs/checkboxGroup/index.js.map +1 -0
- package/dist/components/inputs/colorPicker/index.d.ts +16 -0
- package/dist/components/inputs/colorPicker/index.d.ts.map +1 -0
- package/dist/components/inputs/colorPicker/index.js +20 -0
- package/dist/components/inputs/colorPicker/index.js.map +1 -0
- package/dist/components/inputs/colorPicker/styles.css +52 -0
- package/dist/components/inputs/dateInput/index.d.ts +31 -0
- package/dist/components/inputs/dateInput/index.d.ts.map +1 -0
- package/dist/components/inputs/dateInput/index.js +18 -0
- package/dist/components/inputs/dateInput/index.js.map +1 -0
- package/dist/components/inputs/dateInput/styles.css +22 -0
- package/dist/components/inputs/dateInput/utils.d.ts +5 -0
- package/dist/components/inputs/dateInput/utils.d.ts.map +1 -0
- package/dist/components/inputs/dateInput/utils.js +30 -0
- package/dist/components/inputs/dateInput/utils.js.map +1 -0
- package/dist/components/inputs/dropdown/index.d.ts +18 -0
- package/dist/components/inputs/dropdown/index.d.ts.map +1 -0
- package/dist/components/inputs/dropdown/index.js +30 -0
- package/dist/components/inputs/dropdown/index.js.map +1 -0
- package/dist/components/inputs/dropdown/styles.css +46 -0
- package/dist/components/inputs/dropdownArrowButton/index.d.ts +10 -0
- package/dist/components/inputs/dropdownArrowButton/index.d.ts.map +1 -0
- package/dist/components/inputs/dropdownArrowButton/index.js +10 -0
- package/dist/components/inputs/dropdownArrowButton/index.js.map +1 -0
- package/dist/components/inputs/dropdownArrowButton/styles.css +47 -0
- package/dist/components/inputs/fileDropZone/index.d.ts +16 -0
- package/dist/components/inputs/fileDropZone/index.d.ts.map +1 -0
- package/dist/components/inputs/fileDropZone/index.js +66 -0
- package/dist/components/inputs/fileDropZone/index.js.map +1 -0
- package/dist/components/inputs/fileDropZone/styles.css +43 -0
- package/dist/components/inputs/fileUpload/index.d.ts +61 -0
- package/dist/components/inputs/fileUpload/index.d.ts.map +1 -0
- package/dist/components/inputs/fileUpload/index.js +92 -0
- package/dist/components/inputs/fileUpload/index.js.map +1 -0
- package/dist/components/inputs/fileUpload/styles.css +104 -0
- package/dist/components/inputs/input/index.d.ts +62 -0
- package/dist/components/inputs/input/index.d.ts.map +1 -0
- package/dist/components/inputs/input/index.js +33 -0
- package/dist/components/inputs/input/index.js.map +1 -0
- package/dist/components/inputs/input/styles.css +152 -0
- package/dist/components/inputs/languageSelect/index.d.ts +18 -0
- package/dist/components/inputs/languageSelect/index.d.ts.map +1 -0
- package/dist/components/inputs/languageSelect/index.js +40 -0
- package/dist/components/inputs/languageSelect/index.js.map +1 -0
- package/dist/components/inputs/multiSelect/dropDown.d.ts +16 -0
- package/dist/components/inputs/multiSelect/dropDown.d.ts.map +1 -0
- package/dist/components/inputs/multiSelect/dropDown.js +31 -0
- package/dist/components/inputs/multiSelect/dropDown.js.map +1 -0
- package/dist/components/inputs/multiSelect/index.d.ts +39 -0
- package/dist/components/inputs/multiSelect/index.d.ts.map +1 -0
- package/dist/components/inputs/multiSelect/index.js +134 -0
- package/dist/components/inputs/multiSelect/index.js.map +1 -0
- package/dist/components/inputs/multiSelect/styles.css +265 -0
- package/dist/components/inputs/phoneInput/index.d.ts +25 -0
- package/dist/components/inputs/phoneInput/index.d.ts.map +1 -0
- package/dist/components/inputs/phoneInput/index.js +120 -0
- package/dist/components/inputs/phoneInput/index.js.map +1 -0
- package/dist/components/inputs/phoneInput/styles.css +118 -0
- package/dist/components/inputs/radioGroup/index.d.ts +17 -0
- package/dist/components/inputs/radioGroup/index.d.ts.map +1 -0
- package/dist/components/inputs/radioGroup/index.js +9 -0
- package/dist/components/inputs/radioGroup/index.js.map +1 -0
- package/dist/components/inputs/richTextEditor/index.d.ts +29 -0
- package/dist/components/inputs/richTextEditor/index.d.ts.map +1 -0
- package/dist/components/inputs/richTextEditor/index.js +115 -0
- package/dist/components/inputs/richTextEditor/index.js.map +1 -0
- package/dist/components/inputs/richTextEditor/styles.css +184 -0
- package/dist/components/inputs/searchList/index.d.ts +38 -0
- package/dist/components/inputs/searchList/index.d.ts.map +1 -0
- package/dist/components/inputs/searchList/index.js +148 -0
- package/dist/components/inputs/searchList/index.js.map +1 -0
- package/dist/components/inputs/searchList/styles.css +114 -0
- package/dist/components/inputs/searchSelect/index.d.ts +26 -0
- package/dist/components/inputs/searchSelect/index.d.ts.map +1 -0
- package/dist/components/inputs/searchSelect/index.js +82 -0
- package/dist/components/inputs/searchSelect/index.js.map +1 -0
- package/dist/components/inputs/select/index.d.ts +31 -0
- package/dist/components/inputs/select/index.d.ts.map +1 -0
- package/dist/components/inputs/select/index.js +35 -0
- package/dist/components/inputs/select/index.js.map +1 -0
- package/dist/components/inputs/select/styles.css +66 -0
- package/dist/components/inputs/switch/index.d.ts +14 -0
- package/dist/components/inputs/switch/index.d.ts.map +1 -0
- package/dist/components/inputs/switch/index.js +10 -0
- package/dist/components/inputs/switch/index.js.map +1 -0
- package/dist/components/inputs/switch/styles.css +116 -0
- package/dist/components/inputs/textArea/index.d.ts +43 -0
- package/dist/components/inputs/textArea/index.d.ts.map +1 -0
- package/dist/components/inputs/textArea/index.js +47 -0
- package/dist/components/inputs/textArea/index.js.map +1 -0
- package/dist/components/inputs/textArea/styles.css +55 -0
- package/dist/components/inputs/typeahead/index.d.ts +65 -0
- package/dist/components/inputs/typeahead/index.d.ts.map +1 -0
- package/dist/components/inputs/typeahead/index.js +232 -0
- package/dist/components/inputs/typeahead/index.js.map +1 -0
- package/dist/components/inputs/typeahead/styles.css +86 -0
- package/dist/components/layout/authPage/index.d.ts +14 -0
- package/dist/components/layout/authPage/index.d.ts.map +1 -0
- package/dist/components/layout/authPage/index.js +8 -0
- package/dist/components/layout/authPage/index.js.map +1 -0
- package/dist/components/layout/authPage/styles.css +63 -0
- package/dist/components/layout/borderedSection/index.d.ts +18 -0
- package/dist/components/layout/borderedSection/index.d.ts.map +1 -0
- package/dist/components/layout/borderedSection/index.js +17 -0
- package/dist/components/layout/borderedSection/index.js.map +1 -0
- package/dist/components/layout/borderedSection/styles.css +46 -0
- package/dist/components/layout/card/index.d.ts +29 -0
- package/dist/components/layout/card/index.d.ts.map +1 -0
- package/dist/components/layout/card/index.js +25 -0
- package/dist/components/layout/card/index.js.map +1 -0
- package/dist/components/layout/card/styles.css +160 -0
- package/dist/components/layout/centered/index.d.ts +5 -0
- package/dist/components/layout/centered/index.d.ts.map +1 -0
- package/dist/components/layout/centered/index.js +8 -0
- package/dist/components/layout/centered/index.js.map +1 -0
- package/dist/components/layout/centered/styles.css +9 -0
- package/dist/components/layout/col/index.d.ts +21 -0
- package/dist/components/layout/col/index.d.ts.map +1 -0
- package/dist/components/layout/col/index.js +20 -0
- package/dist/components/layout/col/index.js.map +1 -0
- package/dist/components/layout/col/styles.css +27 -0
- package/dist/components/layout/page/index.d.ts +20 -0
- package/dist/components/layout/page/index.d.ts.map +1 -0
- package/dist/components/layout/page/index.js +22 -0
- package/dist/components/layout/page/index.js.map +1 -0
- package/dist/components/layout/page/styles.css +53 -0
- package/dist/components/layout/row/index.d.ts +19 -0
- package/dist/components/layout/row/index.d.ts.map +1 -0
- package/dist/components/layout/row/index.js +19 -0
- package/dist/components/layout/row/index.js.map +1 -0
- package/dist/components/layout/row/styles.css +33 -0
- package/dist/components/layout/sectionHeader/index.d.ts +26 -0
- package/dist/components/layout/sectionHeader/index.d.ts.map +1 -0
- package/dist/components/layout/sectionHeader/index.js +19 -0
- package/dist/components/layout/sectionHeader/index.js.map +1 -0
- package/dist/components/layout/sectionHeader/styles.css +116 -0
- package/dist/components/navigation/breadcrumbs/index.d.ts +21 -0
- package/dist/components/navigation/breadcrumbs/index.d.ts.map +1 -0
- package/dist/components/navigation/breadcrumbs/index.js +9 -0
- package/dist/components/navigation/breadcrumbs/index.js.map +1 -0
- package/dist/components/navigation/breadcrumbs/styles.css +42 -0
- package/dist/components/navigation/sidebar/index.d.ts +23 -0
- package/dist/components/navigation/sidebar/index.d.ts.map +1 -0
- package/dist/components/navigation/sidebar/index.js +17 -0
- package/dist/components/navigation/sidebar/index.js.map +1 -0
- package/dist/components/navigation/sidebar/styles.css +57 -0
- package/dist/components/navigation/stepper/index.d.ts +21 -0
- package/dist/components/navigation/stepper/index.d.ts.map +1 -0
- package/dist/components/navigation/stepper/index.js +25 -0
- package/dist/components/navigation/stepper/index.js.map +1 -0
- package/dist/components/navigation/stepper/styles.css +101 -0
- package/dist/components/navigation/tabButton/index.d.ts +11 -0
- package/dist/components/navigation/tabButton/index.d.ts.map +1 -0
- package/dist/components/navigation/tabButton/index.js +17 -0
- package/dist/components/navigation/tabButton/index.js.map +1 -0
- package/dist/components/navigation/tabButton/styles.css +148 -0
- package/dist/components/navigation/tabs/index.d.ts +18 -0
- package/dist/components/navigation/tabs/index.d.ts.map +1 -0
- package/dist/components/navigation/tabs/index.js +9 -0
- package/dist/components/navigation/tabs/index.js.map +1 -0
- package/dist/components/navigation/tabs/styles.css +46 -0
- package/dist/components/overlays/confirmationModal/index.d.ts +13 -0
- package/dist/components/overlays/confirmationModal/index.d.ts.map +1 -0
- package/dist/components/overlays/confirmationModal/index.js +12 -0
- package/dist/components/overlays/confirmationModal/index.js.map +1 -0
- package/dist/components/overlays/modal/index.d.ts +22 -0
- package/dist/components/overlays/modal/index.d.ts.map +1 -0
- package/dist/components/overlays/modal/index.js +43 -0
- package/dist/components/overlays/modal/index.js.map +1 -0
- package/dist/components/overlays/modal/styles.css +137 -0
- package/dist/components/overlays/portal/index.d.ts +10 -0
- package/dist/components/overlays/portal/index.d.ts.map +1 -0
- package/dist/components/overlays/portal/index.js +10 -0
- package/dist/components/overlays/portal/index.js.map +1 -0
- package/dist/components/types.d.ts +34 -0
- package/dist/components/types.d.ts.map +1 -0
- package/dist/components/types.js +2 -0
- package/dist/components/types.js.map +1 -0
- package/dist/hooks/index.d.ts +11 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +11 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/useDebouncedValue.d.ts +7 -0
- package/dist/hooks/useDebouncedValue.d.ts.map +1 -0
- package/dist/hooks/useDebouncedValue.js +16 -0
- package/dist/hooks/useDebouncedValue.js.map +1 -0
- package/dist/hooks/useFloatingPosition.d.ts +32 -0
- package/dist/hooks/useFloatingPosition.d.ts.map +1 -0
- package/dist/hooks/useFloatingPosition.js +69 -0
- package/dist/hooks/useFloatingPosition.js.map +1 -0
- package/dist/hooks/useFocusTrap.d.ts +9 -0
- package/dist/hooks/useFocusTrap.d.ts.map +1 -0
- package/dist/hooks/useFocusTrap.js +51 -0
- package/dist/hooks/useFocusTrap.js.map +1 -0
- package/dist/hooks/useInfinite.d.ts +28 -0
- package/dist/hooks/useInfinite.d.ts.map +1 -0
- package/dist/hooks/useInfinite.js +95 -0
- package/dist/hooks/useInfinite.js.map +1 -0
- package/dist/hooks/useInfiniteArchivableCursor.d.ts +31 -0
- package/dist/hooks/useInfiniteArchivableCursor.d.ts.map +1 -0
- package/dist/hooks/useInfiniteArchivableCursor.js +95 -0
- package/dist/hooks/useInfiniteArchivableCursor.js.map +1 -0
- package/dist/hooks/useInfiniteCursor.d.ts +27 -0
- package/dist/hooks/useInfiniteCursor.d.ts.map +1 -0
- package/dist/hooks/useInfiniteCursor.js +81 -0
- package/dist/hooks/useInfiniteCursor.js.map +1 -0
- package/dist/hooks/useListKeyboard.d.ts +19 -0
- package/dist/hooks/useListKeyboard.d.ts.map +1 -0
- package/dist/hooks/useListKeyboard.js +45 -0
- package/dist/hooks/useListKeyboard.js.map +1 -0
- package/dist/hooks/useLocalStorage.d.ts +8 -0
- package/dist/hooks/useLocalStorage.d.ts.map +1 -0
- package/dist/hooks/useLocalStorage.js +68 -0
- package/dist/hooks/useLocalStorage.js.map +1 -0
- package/dist/hooks/useOutsideClick.d.ts +9 -0
- package/dist/hooks/useOutsideClick.d.ts.map +1 -0
- package/dist/hooks/useOutsideClick.js +23 -0
- package/dist/hooks/useOutsideClick.js.map +1 -0
- package/dist/hooks/useScrollIntoView.d.ts +9 -0
- package/dist/hooks/useScrollIntoView.d.ts.map +1 -0
- package/dist/hooks/useScrollIntoView.js +19 -0
- package/dist/hooks/useScrollIntoView.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/styles.css +386 -0
- package/package.json +80 -0
- package/src/components/buttons/button/index.tsx +82 -0
- package/src/components/buttons/button/styles.css +193 -0
- package/src/components/buttons/iconButton/index.tsx +23 -0
- package/src/components/buttons/iconButton/styles.css +14 -0
- package/src/components/buttons/rowActions/index.tsx +27 -0
- package/src/components/buttons/rowActions/styles.css +27 -0
- package/src/components/data-display/addressBlock/index.tsx +71 -0
- package/src/components/data-display/addressBlock/styles.css +41 -0
- package/src/components/data-display/colorSwatch/index.tsx +33 -0
- package/src/components/data-display/colorSwatch/styles.css +25 -0
- package/src/components/data-display/dataTable/index.tsx +206 -0
- package/src/components/data-display/dataTable/styles.css +54 -0
- package/src/components/data-display/dataTable/types.ts +71 -0
- package/src/components/data-display/dataTable/utils/parseDataKey.ts +39 -0
- package/src/components/data-display/imagePreview/index.tsx +42 -0
- package/src/components/data-display/imagePreview/styles.css +52 -0
- package/src/components/data-display/infiniteScroll/filters/index.tsx +77 -0
- package/src/components/data-display/infiniteScroll/filters/listFilter.tsx +83 -0
- package/src/components/data-display/infiniteScroll/filters/rangeFilter.tsx +168 -0
- package/src/components/data-display/infiniteScroll/filters/searchFilter.tsx +83 -0
- package/src/components/data-display/infiniteScroll/filters/selectFilter.tsx +104 -0
- package/src/components/data-display/infiniteScroll/filters/styles.css +48 -0
- package/src/components/data-display/infiniteScroll/header/deleteButton.tsx +58 -0
- package/src/components/data-display/infiniteScroll/header/index.tsx +109 -0
- package/src/components/data-display/infiniteScroll/header/limit.tsx +68 -0
- package/src/components/data-display/infiniteScroll/header/sortBy.tsx +56 -0
- package/src/components/data-display/infiniteScroll/header/sortDirection.tsx +60 -0
- package/src/components/data-display/infiniteScroll/header/styles.css +64 -0
- package/src/components/data-display/infiniteScroll/index.tsx +394 -0
- package/src/components/data-display/infiniteScroll/styles.css +37 -0
- package/src/components/data-display/infiniteScroll/table/index.tsx +56 -0
- package/src/components/data-display/infiniteScroll/tags/index.tsx +82 -0
- package/src/components/data-display/infiniteScroll/tags/listFilterTag.tsx +165 -0
- package/src/components/data-display/infiniteScroll/tags/rangeFilterTag.tsx +77 -0
- package/src/components/data-display/infiniteScroll/tags/searchFilterTag.tsx +41 -0
- package/src/components/data-display/infiniteScroll/tags/selectFilterTag.tsx +46 -0
- package/src/components/data-display/infiniteScroll/tags/styles.css +65 -0
- package/src/components/data-display/infiniteScroll/types.ts +125 -0
- package/src/components/data-display/infiniteScroll/utils/generateQueryString.ts +75 -0
- package/src/components/data-display/infiniteScroll/utils/hasPendingChanges.ts +113 -0
- package/src/components/data-display/listCard/index.tsx +42 -0
- package/src/components/data-display/listCard/styles.css +48 -0
- package/src/components/data-display/listRow/index.tsx +21 -0
- package/src/components/data-display/listRow/styles.css +22 -0
- package/src/components/data-display/recoveryCodeGrid/index.tsx +32 -0
- package/src/components/data-display/recoveryCodeGrid/styles.css +47 -0
- package/src/components/data-display/secretDisplay/index.tsx +79 -0
- package/src/components/data-display/secretDisplay/styles.css +24 -0
- package/src/components/data-display/statCard/index.tsx +93 -0
- package/src/components/data-display/statCard/styles.css +96 -0
- package/src/components/data-display/summaryRow/index.tsx +28 -0
- package/src/components/data-display/summaryRow/styles.css +26 -0
- package/src/components/data-display/table/index.tsx +155 -0
- package/src/components/data-display/table/styles.css +61 -0
- package/src/components/data-display/tagCard/index.tsx +39 -0
- package/src/components/data-display/tagCard/styles.css +14 -0
- package/src/components/feedback/alert/index.tsx +69 -0
- package/src/components/feedback/alert/styles.css +88 -0
- package/src/components/feedback/badge/index.tsx +104 -0
- package/src/components/feedback/badge/styles.css +162 -0
- package/src/components/feedback/badge/utils.ts +14 -0
- package/src/components/feedback/emptyState/index.tsx +32 -0
- package/src/components/feedback/emptyState/styles.css +32 -0
- package/src/components/feedback/loadingOverlay/index.tsx +49 -0
- package/src/components/feedback/loadingOverlay/styles.css +48 -0
- package/src/components/feedback/progressBar/index.tsx +34 -0
- package/src/components/feedback/progressBar/styles.css +42 -0
- package/src/components/feedback/spinner/index.tsx +23 -0
- package/src/components/feedback/spinner/styles.css +64 -0
- package/src/components/feedback/tooltip/index.tsx +101 -0
- package/src/components/feedback/tooltip/styles.css +84 -0
- package/src/components/forms/detailField/index.tsx +25 -0
- package/src/components/forms/detailField/styles.css +27 -0
- package/src/components/forms/fieldShell/index.tsx +66 -0
- package/src/components/forms/fieldShell/styles.css +38 -0
- package/src/components/forms/form/index.tsx +81 -0
- package/src/components/forms/form/styles.css +27 -0
- package/src/components/forms/formActions/formError.tsx +17 -0
- package/src/components/forms/formActions/index.tsx +30 -0
- package/src/components/forms/formActions/styles.css +50 -0
- package/src/components/forms/formGrid/index.tsx +22 -0
- package/src/components/forms/formGrid/styles.css +41 -0
- package/src/components/forms/infoRow/index.tsx +22 -0
- package/src/components/forms/infoRow/styles.css +38 -0
- package/src/components/forms/optionsGroup/index.tsx +26 -0
- package/src/components/forms/optionsGroup/styles.css +34 -0
- package/src/components/forms/requiredAsterisk/index.tsx +9 -0
- package/src/components/forms/requiredAsterisk/styles.css +3 -0
- package/src/components/index.ts +139 -0
- package/src/components/inputs/checkbox/index.tsx +54 -0
- package/src/components/inputs/checkbox/styles.css +48 -0
- package/src/components/inputs/checkboxGroup/index.tsx +50 -0
- package/src/components/inputs/colorPicker/index.tsx +77 -0
- package/src/components/inputs/colorPicker/styles.css +52 -0
- package/src/components/inputs/dateInput/index.tsx +158 -0
- package/src/components/inputs/dateInput/styles.css +22 -0
- package/src/components/inputs/dateInput/utils.ts +33 -0
- package/src/components/inputs/dropdown/index.tsx +86 -0
- package/src/components/inputs/dropdown/styles.css +46 -0
- package/src/components/inputs/dropdownArrowButton/index.tsx +37 -0
- package/src/components/inputs/dropdownArrowButton/styles.css +47 -0
- package/src/components/inputs/fileDropZone/index.tsx +122 -0
- package/src/components/inputs/fileDropZone/styles.css +43 -0
- package/src/components/inputs/fileUpload/index.tsx +292 -0
- package/src/components/inputs/fileUpload/styles.css +104 -0
- package/src/components/inputs/input/index.tsx +186 -0
- package/src/components/inputs/input/styles.css +152 -0
- package/src/components/inputs/languageSelect/index.tsx +77 -0
- package/src/components/inputs/multiSelect/dropDown.tsx +114 -0
- package/src/components/inputs/multiSelect/index.tsx +250 -0
- package/src/components/inputs/multiSelect/styles.css +265 -0
- package/src/components/inputs/phoneInput/index.tsx +237 -0
- package/src/components/inputs/phoneInput/styles.css +118 -0
- package/src/components/inputs/radioGroup/index.tsx +43 -0
- package/src/components/inputs/richTextEditor/index.tsx +266 -0
- package/src/components/inputs/richTextEditor/styles.css +184 -0
- package/src/components/inputs/searchList/index.tsx +296 -0
- package/src/components/inputs/searchList/styles.css +114 -0
- package/src/components/inputs/searchSelect/index.tsx +176 -0
- package/src/components/inputs/select/index.tsx +102 -0
- package/src/components/inputs/select/styles.css +66 -0
- package/src/components/inputs/switch/index.tsx +56 -0
- package/src/components/inputs/switch/styles.css +116 -0
- package/src/components/inputs/textArea/index.tsx +137 -0
- package/src/components/inputs/textArea/styles.css +55 -0
- package/src/components/inputs/typeahead/index.tsx +368 -0
- package/src/components/inputs/typeahead/styles.css +86 -0
- package/src/components/layout/authPage/index.tsx +37 -0
- package/src/components/layout/authPage/styles.css +63 -0
- package/src/components/layout/borderedSection/index.tsx +55 -0
- package/src/components/layout/borderedSection/styles.css +46 -0
- package/src/components/layout/card/index.tsx +96 -0
- package/src/components/layout/card/styles.css +160 -0
- package/src/components/layout/centered/index.tsx +10 -0
- package/src/components/layout/centered/styles.css +9 -0
- package/src/components/layout/col/index.tsx +43 -0
- package/src/components/layout/col/styles.css +27 -0
- package/src/components/layout/page/index.tsx +56 -0
- package/src/components/layout/page/styles.css +53 -0
- package/src/components/layout/row/index.tsx +40 -0
- package/src/components/layout/row/styles.css +33 -0
- package/src/components/layout/sectionHeader/index.tsx +77 -0
- package/src/components/layout/sectionHeader/styles.css +116 -0
- package/src/components/navigation/breadcrumbs/index.tsx +48 -0
- package/src/components/navigation/breadcrumbs/styles.css +42 -0
- package/src/components/navigation/sidebar/index.tsx +59 -0
- package/src/components/navigation/sidebar/styles.css +57 -0
- package/src/components/navigation/stepper/index.tsx +71 -0
- package/src/components/navigation/stepper/styles.css +101 -0
- package/src/components/navigation/tabButton/index.tsx +43 -0
- package/src/components/navigation/tabButton/styles.css +148 -0
- package/src/components/navigation/tabs/index.tsx +49 -0
- package/src/components/navigation/tabs/styles.css +46 -0
- package/src/components/overlays/confirmationModal/index.tsx +48 -0
- package/src/components/overlays/modal/index.tsx +89 -0
- package/src/components/overlays/modal/styles.css +137 -0
- package/src/components/overlays/portal/index.tsx +18 -0
- package/src/components/types.ts +46 -0
- package/src/css.d.ts +1 -0
- package/src/hooks/index.ts +17 -0
- package/src/hooks/useDebouncedValue.ts +20 -0
- package/src/hooks/useFloatingPosition.ts +110 -0
- package/src/hooks/useFocusTrap.ts +56 -0
- package/src/hooks/useInfinite.ts +151 -0
- package/src/hooks/useInfiniteArchivableCursor.ts +143 -0
- package/src/hooks/useInfiniteCursor.ts +125 -0
- package/src/hooks/useListKeyboard.ts +68 -0
- package/src/hooks/useLocalStorage.tsx +92 -0
- package/src/hooks/useOutsideClick.ts +27 -0
- package/src/hooks/useScrollIntoView.ts +24 -0
- package/src/index.ts +13 -0
- package/src/styles.css +386 -0
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useEffect, useState } from "react";
|
|
3
|
+
/**
|
|
4
|
+
* Returns `value` after it has remained unchanged for `delay` milliseconds.
|
|
5
|
+
* Resets the timer on every change.
|
|
6
|
+
*/
|
|
7
|
+
const useDebouncedValue = (value, delay) => {
|
|
8
|
+
const [debounced, setDebounced] = useState(value);
|
|
9
|
+
useEffect(() => {
|
|
10
|
+
const id = setTimeout(() => setDebounced(value), delay);
|
|
11
|
+
return () => clearTimeout(id);
|
|
12
|
+
}, [value, delay]);
|
|
13
|
+
return debounced;
|
|
14
|
+
};
|
|
15
|
+
export default useDebouncedValue;
|
|
16
|
+
//# sourceMappingURL=useDebouncedValue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useDebouncedValue.js","sourceRoot":"","sources":["../../src/hooks/useDebouncedValue.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAE5C;;;GAGG;AACH,MAAM,iBAAiB,GAAG,CAAI,KAAQ,EAAE,KAAa,EAAK,EAAE;IAC1D,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAElD,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC;QACxD,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;IAChC,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;IAEnB,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AAEF,eAAe,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { RefObject } from "react";
|
|
2
|
+
export type FloatingSide = "below" | "top" | "bottom" | "left" | "right";
|
|
3
|
+
export interface FloatingPosition {
|
|
4
|
+
top: number;
|
|
5
|
+
left: number;
|
|
6
|
+
width: number;
|
|
7
|
+
}
|
|
8
|
+
interface UseFloatingPositionOptions {
|
|
9
|
+
isOpen: boolean;
|
|
10
|
+
/** Placement relative to the anchor. `below` matches anchor width (default). */
|
|
11
|
+
side?: FloatingSide;
|
|
12
|
+
/** Ref to the floating element — required for `top`/`bottom`/`left`/`right`. */
|
|
13
|
+
floatingRef?: RefObject<HTMLElement | null>;
|
|
14
|
+
/** Distance in px between anchor and floating element (ignored for `below`). */
|
|
15
|
+
offset?: number;
|
|
16
|
+
/** Clamp position inside the viewport. */
|
|
17
|
+
clampViewport?: boolean;
|
|
18
|
+
/** Padding from viewport edges when clamping. */
|
|
19
|
+
padding?: number;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Tracks the screen position of a floating element anchored to a trigger.
|
|
23
|
+
* Supports anchored-below dropdowns and side-positioned tooltips/popovers
|
|
24
|
+
* with optional viewport clamping. Updates on scroll/resize while `isOpen`.
|
|
25
|
+
*/
|
|
26
|
+
declare const useFloatingPosition: ({ isOpen, side, floatingRef, offset, clampViewport, padding, }: UseFloatingPositionOptions) => {
|
|
27
|
+
anchorRef: RefObject<HTMLDivElement | null>;
|
|
28
|
+
position: FloatingPosition | null;
|
|
29
|
+
update: () => void;
|
|
30
|
+
};
|
|
31
|
+
export default useFloatingPosition;
|
|
32
|
+
//# sourceMappingURL=useFloatingPosition.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useFloatingPosition.d.ts","sourceRoot":"","sources":["../../src/hooks/useFloatingPosition.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAA4C,MAAM,OAAO,CAAC;AAE5E,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC;AAEzE,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,UAAU,0BAA0B;IAClC,MAAM,EAAE,OAAO,CAAC;IAChB,gFAAgF;IAChF,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,gFAAgF;IAChF,WAAW,CAAC,EAAE,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IAC5C,gFAAgF;IAChF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,0CAA0C;IAC1C,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,iDAAiD;IACjD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;GAIG;AACH,QAAA,MAAM,mBAAmB,GAAI,gEAO1B,0BAA0B;;;;CAqE5B,CAAC;AAEF,eAAe,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useCallback, useEffect, useRef, useState } from "react";
|
|
3
|
+
/**
|
|
4
|
+
* Tracks the screen position of a floating element anchored to a trigger.
|
|
5
|
+
* Supports anchored-below dropdowns and side-positioned tooltips/popovers
|
|
6
|
+
* with optional viewport clamping. Updates on scroll/resize while `isOpen`.
|
|
7
|
+
*/
|
|
8
|
+
const useFloatingPosition = ({ isOpen, side = "below", floatingRef, offset = 0, clampViewport = false, padding = 8, }) => {
|
|
9
|
+
const anchorRef = useRef(null);
|
|
10
|
+
const [position, setPosition] = useState(null);
|
|
11
|
+
const update = useCallback(() => {
|
|
12
|
+
const anchor = anchorRef.current;
|
|
13
|
+
if (!anchor)
|
|
14
|
+
return;
|
|
15
|
+
const a = anchor.getBoundingClientRect();
|
|
16
|
+
const f = floatingRef?.current?.getBoundingClientRect();
|
|
17
|
+
let top = 0;
|
|
18
|
+
let left = 0;
|
|
19
|
+
if (side === "below") {
|
|
20
|
+
top = a.bottom;
|
|
21
|
+
left = a.left;
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
if (!f)
|
|
25
|
+
return;
|
|
26
|
+
const centerX = a.left + (a.width - f.width) / 2;
|
|
27
|
+
const centerY = a.top + (a.height - f.height) / 2;
|
|
28
|
+
switch (side) {
|
|
29
|
+
case "top":
|
|
30
|
+
top = a.top - f.height - offset;
|
|
31
|
+
left = centerX;
|
|
32
|
+
break;
|
|
33
|
+
case "bottom":
|
|
34
|
+
top = a.bottom + offset;
|
|
35
|
+
left = centerX;
|
|
36
|
+
break;
|
|
37
|
+
case "left":
|
|
38
|
+
top = centerY;
|
|
39
|
+
left = a.left - f.width - offset;
|
|
40
|
+
break;
|
|
41
|
+
case "right":
|
|
42
|
+
top = centerY;
|
|
43
|
+
left = a.right + offset;
|
|
44
|
+
break;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
if (clampViewport && f) {
|
|
48
|
+
left = Math.max(padding, Math.min(left, window.innerWidth - f.width - padding));
|
|
49
|
+
top = Math.max(padding, Math.min(top, window.innerHeight - f.height - padding));
|
|
50
|
+
}
|
|
51
|
+
setPosition({ top, left, width: a.width });
|
|
52
|
+
}, [side, offset, clampViewport, padding, floatingRef]);
|
|
53
|
+
useEffect(() => {
|
|
54
|
+
if (!isOpen) {
|
|
55
|
+
setPosition(null);
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
update();
|
|
59
|
+
window.addEventListener("scroll", update, true);
|
|
60
|
+
window.addEventListener("resize", update);
|
|
61
|
+
return () => {
|
|
62
|
+
window.removeEventListener("scroll", update, true);
|
|
63
|
+
window.removeEventListener("resize", update);
|
|
64
|
+
};
|
|
65
|
+
}, [isOpen, update]);
|
|
66
|
+
return { anchorRef, position, update };
|
|
67
|
+
};
|
|
68
|
+
export default useFloatingPosition;
|
|
69
|
+
//# sourceMappingURL=useFloatingPosition.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useFloatingPosition.js","sourceRoot":"","sources":["../../src/hooks/useFloatingPosition.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { RefObject } from "react";
|
|
2
|
+
/**
|
|
3
|
+
* Traps Tab focus inside `containerRef` while `enabled`. Focuses the first
|
|
4
|
+
* focusable element on activation and restores the previously focused element
|
|
5
|
+
* on deactivation.
|
|
6
|
+
*/
|
|
7
|
+
declare const useFocusTrap: (containerRef: RefObject<HTMLElement | null>, enabled: boolean) => void;
|
|
8
|
+
export default useFocusTrap;
|
|
9
|
+
//# sourceMappingURL=useFocusTrap.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useFocusTrap.d.ts","sourceRoot":"","sources":["../../src/hooks/useFocusTrap.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAa,MAAM,OAAO,CAAC;AAW7C;;;;GAIG;AACH,QAAA,MAAM,YAAY,GAChB,cAAc,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,EAC3C,SAAS,OAAO,SAiCjB,CAAC;AAEF,eAAe,YAAY,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useEffect } from "react";
|
|
3
|
+
const FOCUSABLE_SELECTOR = [
|
|
4
|
+
"button:not([disabled])",
|
|
5
|
+
"[href]",
|
|
6
|
+
"input:not([disabled])",
|
|
7
|
+
"select:not([disabled])",
|
|
8
|
+
"textarea:not([disabled])",
|
|
9
|
+
'[tabindex]:not([tabindex="-1"])',
|
|
10
|
+
].join(",");
|
|
11
|
+
/**
|
|
12
|
+
* Traps Tab focus inside `containerRef` while `enabled`. Focuses the first
|
|
13
|
+
* focusable element on activation and restores the previously focused element
|
|
14
|
+
* on deactivation.
|
|
15
|
+
*/
|
|
16
|
+
const useFocusTrap = (containerRef, enabled) => {
|
|
17
|
+
useEffect(() => {
|
|
18
|
+
if (!enabled)
|
|
19
|
+
return;
|
|
20
|
+
const container = containerRef.current;
|
|
21
|
+
if (!container)
|
|
22
|
+
return;
|
|
23
|
+
const prevActive = document.activeElement;
|
|
24
|
+
const getFocusables = () => Array.from(container.querySelectorAll(FOCUSABLE_SELECTOR));
|
|
25
|
+
getFocusables()[0]?.focus();
|
|
26
|
+
const handleKey = (e) => {
|
|
27
|
+
if (e.key !== "Tab")
|
|
28
|
+
return;
|
|
29
|
+
const list = getFocusables();
|
|
30
|
+
if (list.length === 0)
|
|
31
|
+
return;
|
|
32
|
+
const first = list[0];
|
|
33
|
+
const last = list[list.length - 1];
|
|
34
|
+
if (e.shiftKey && document.activeElement === first) {
|
|
35
|
+
e.preventDefault();
|
|
36
|
+
last.focus();
|
|
37
|
+
}
|
|
38
|
+
else if (!e.shiftKey && document.activeElement === last) {
|
|
39
|
+
e.preventDefault();
|
|
40
|
+
first.focus();
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
document.addEventListener("keydown", handleKey);
|
|
44
|
+
return () => {
|
|
45
|
+
document.removeEventListener("keydown", handleKey);
|
|
46
|
+
prevActive?.focus?.();
|
|
47
|
+
};
|
|
48
|
+
}, [enabled, containerRef]);
|
|
49
|
+
};
|
|
50
|
+
export default useFocusTrap;
|
|
51
|
+
//# sourceMappingURL=useFocusTrap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useFocusTrap.js","sourceRoot":"","sources":["../../src/hooks/useFocusTrap.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAa,SAAS,EAAE,MAAM,OAAO,CAAC;AAE7C,MAAM,kBAAkB,GAAG;IACzB,wBAAwB;IACxB,QAAQ;IACR,uBAAuB;IACvB,wBAAwB;IACxB,0BAA0B;IAC1B,iCAAiC;CAClC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAEZ;;;;GAIG;AACH,MAAM,YAAY,GAAG,CACnB,YAA2C,EAC3C,OAAgB,EAChB,EAAE;IACF,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,OAAO;YAAE,OAAO;QACrB,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO,CAAC;QACvC,IAAI,CAAC,SAAS;YAAE,OAAO;QAEvB,MAAM,UAAU,GAAG,QAAQ,CAAC,aAAmC,CAAC;QAChE,MAAM,aAAa,GAAG,GAAG,EAAE,CACzB,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAc,kBAAkB,CAAC,CAAC,CAAC;QAE1E,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;QAE5B,MAAM,SAAS,GAAG,CAAC,CAAgB,EAAE,EAAE;YACrC,IAAI,CAAC,CAAC,GAAG,KAAK,KAAK;gBAAE,OAAO;YAC5B,MAAM,IAAI,GAAG,aAAa,EAAE,CAAC;YAC7B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO;YAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YACtB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACnC,IAAI,CAAC,CAAC,QAAQ,IAAI,QAAQ,CAAC,aAAa,KAAK,KAAK,EAAE,CAAC;gBACnD,CAAC,CAAC,cAAc,EAAE,CAAC;gBACnB,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,CAAC;iBAAM,IAAI,CAAC,CAAC,CAAC,QAAQ,IAAI,QAAQ,CAAC,aAAa,KAAK,IAAI,EAAE,CAAC;gBAC1D,CAAC,CAAC,cAAc,EAAE,CAAC;gBACnB,KAAK,CAAC,KAAK,EAAE,CAAC;YAChB,CAAC;QACH,CAAC,CAAC;QACF,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAChD,OAAO,GAAG,EAAE;YACV,QAAQ,CAAC,mBAAmB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;YACnD,UAAU,EAAE,KAAK,EAAE,EAAE,CAAC;QACxB,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC;AAC9B,CAAC,CAAC;AAEF,eAAe,YAAY,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { AxiosInstance } from "axios";
|
|
2
|
+
interface UseInfiniteOptions {
|
|
3
|
+
axiosInstance: AxiosInstance;
|
|
4
|
+
/** The API endpoint to fetch from (e.g., "/buckets/my-bucket/objects") */
|
|
5
|
+
endpoint: string;
|
|
6
|
+
/** The query key for React Query caching */
|
|
7
|
+
queryKey: string;
|
|
8
|
+
/** Organization ID to scope cache keys (prevents stale cross-org data) */
|
|
9
|
+
orgId?: string | null;
|
|
10
|
+
/** Initial limit (default: 10) */
|
|
11
|
+
initialLimit?: number;
|
|
12
|
+
/** Whether or not the query should be enabled */
|
|
13
|
+
enabled?: boolean;
|
|
14
|
+
}
|
|
15
|
+
export interface UseInfiniteReturn<T> {
|
|
16
|
+
data: T[];
|
|
17
|
+
hasMore: boolean;
|
|
18
|
+
isLoading: boolean;
|
|
19
|
+
isReloading: boolean;
|
|
20
|
+
total: number;
|
|
21
|
+
onQueryChange: (queryString: string) => void;
|
|
22
|
+
reload: () => void;
|
|
23
|
+
}
|
|
24
|
+
declare const useInfinite: <T extends {
|
|
25
|
+
id: number | string;
|
|
26
|
+
}>(options: UseInfiniteOptions) => UseInfiniteReturn<T>;
|
|
27
|
+
export default useInfinite;
|
|
28
|
+
//# sourceMappingURL=useInfinite.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useInfinite.d.ts","sourceRoot":"","sources":["../../src/hooks/useInfinite.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAQtC,UAAU,kBAAkB;IAC1B,aAAa,EAAE,aAAa,CAAC;IAC7B,0EAA0E;IAC1E,QAAQ,EAAE,MAAM,CAAC;IACjB,4CAA4C;IAC5C,QAAQ,EAAE,MAAM,CAAC;IACjB,0EAA0E;IAC1E,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,kCAAkC;IAClC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iDAAiD;IACjD,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB,CAAC,CAAC;IAClC,IAAI,EAAE,CAAC,EAAE,CAAC;IACV,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,EAAE,OAAO,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C,MAAM,EAAE,MAAM,IAAI,CAAC;CACpB;AAED,QAAA,MAAM,WAAW,GAAI,CAAC,SAAS;IAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,EACpD,SAAS,kBAAkB,KAC1B,iBAAiB,CAAC,CAAC,CA8GrB,CAAC;AAEF,eAAe,WAAW,CAAC"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useCallback, useEffect, useRef, useState } from "react";
|
|
3
|
+
import { useQuery } from "@tanstack/react-query";
|
|
4
|
+
const useInfinite = (options) => {
|
|
5
|
+
const { axiosInstance, endpoint, queryKey, orgId, initialLimit = 10, } = options;
|
|
6
|
+
const [queryString, setQueryString] = useState(`limit=${initialLimit}&offset=0`);
|
|
7
|
+
const [allData, setAllData] = useState([]);
|
|
8
|
+
const [reloadKey, setReloadKey] = useState(0);
|
|
9
|
+
const isNextPageRef = useRef(false);
|
|
10
|
+
const lastQueryStringRef = useRef(queryString);
|
|
11
|
+
const queryStringRef = useRef(queryString);
|
|
12
|
+
// Keep ref in sync with state
|
|
13
|
+
queryStringRef.current = queryString;
|
|
14
|
+
const queryFn = async () => {
|
|
15
|
+
const res = await axiosInstance.get(`${endpoint}?${queryString}`);
|
|
16
|
+
return res.data;
|
|
17
|
+
};
|
|
18
|
+
const query = useQuery({
|
|
19
|
+
queryKey: [`${queryKey}-infinite`, orgId ?? null, queryString, reloadKey],
|
|
20
|
+
queryFn,
|
|
21
|
+
staleTime: 0,
|
|
22
|
+
gcTime: 0,
|
|
23
|
+
});
|
|
24
|
+
// Handle query change from InfiniteScroll
|
|
25
|
+
const handleQueryChange = useCallback((newQueryString) => {
|
|
26
|
+
// Prevent unnecessary updates if query string hasn't changed
|
|
27
|
+
if (newQueryString === lastQueryStringRef.current)
|
|
28
|
+
return;
|
|
29
|
+
lastQueryStringRef.current = newQueryString;
|
|
30
|
+
const params = new URLSearchParams(newQueryString);
|
|
31
|
+
const offset = parseInt(params.get("offset") || "0", 10);
|
|
32
|
+
if (offset === 0) {
|
|
33
|
+
// Fresh fetch - reset data only if we have data
|
|
34
|
+
setAllData((prev) => (prev.length > 0 ? [] : prev));
|
|
35
|
+
isNextPageRef.current = false;
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
// Next page fetch
|
|
39
|
+
isNextPageRef.current = true;
|
|
40
|
+
}
|
|
41
|
+
setQueryString(newQueryString);
|
|
42
|
+
}, []);
|
|
43
|
+
// Reload from the beginning (reset offset to 0)
|
|
44
|
+
const reload = useCallback(() => {
|
|
45
|
+
const params = new URLSearchParams(queryStringRef.current);
|
|
46
|
+
params.set("offset", "0");
|
|
47
|
+
const newQueryString = params.toString();
|
|
48
|
+
// Force update even if query string is the same
|
|
49
|
+
lastQueryStringRef.current = "";
|
|
50
|
+
isNextPageRef.current = false;
|
|
51
|
+
setAllData([]);
|
|
52
|
+
setReloadKey((k) => k + 1);
|
|
53
|
+
setQueryString(newQueryString);
|
|
54
|
+
}, []);
|
|
55
|
+
// Merge data when query succeeds
|
|
56
|
+
useEffect(() => {
|
|
57
|
+
if (!query.data)
|
|
58
|
+
return;
|
|
59
|
+
const newData = query.data.data;
|
|
60
|
+
if (!newData)
|
|
61
|
+
return;
|
|
62
|
+
if (isNextPageRef.current) {
|
|
63
|
+
// Append new data for next page
|
|
64
|
+
setAllData((prev) => {
|
|
65
|
+
const existingIds = new Set(prev.map((item) => item.id));
|
|
66
|
+
const uniqueNewData = newData.filter((item) => !existingIds.has(item.id));
|
|
67
|
+
if (uniqueNewData.length === 0)
|
|
68
|
+
return prev;
|
|
69
|
+
return [...prev, ...uniqueNewData];
|
|
70
|
+
});
|
|
71
|
+
isNextPageRef.current = false;
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
// Replace data for fresh fetch - only update if different
|
|
75
|
+
setAllData((prev) => {
|
|
76
|
+
if (prev.length === newData.length &&
|
|
77
|
+
prev.every((item, i) => item.id === newData[i]?.id)) {
|
|
78
|
+
return prev;
|
|
79
|
+
}
|
|
80
|
+
return newData;
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
}, [query.data]);
|
|
84
|
+
return {
|
|
85
|
+
data: allData,
|
|
86
|
+
hasMore: query.data?.hasMore ?? true,
|
|
87
|
+
isLoading: query.isLoading,
|
|
88
|
+
isReloading: query.isFetching && allData.length > 0,
|
|
89
|
+
total: query.data?.total ?? 0,
|
|
90
|
+
onQueryChange: handleQueryChange,
|
|
91
|
+
reload,
|
|
92
|
+
};
|
|
93
|
+
};
|
|
94
|
+
export default useInfinite;
|
|
95
|
+
//# sourceMappingURL=useInfinite.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useInfinite.js","sourceRoot":"","sources":["../../src/hooks/useInfinite.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { UseInfiniteReturn } from "./useInfinite.js";
|
|
2
|
+
import type { AxiosInstance } from "axios";
|
|
3
|
+
interface UseInfiniteArchivableCursorOptions {
|
|
4
|
+
axiosInstance: AxiosInstance;
|
|
5
|
+
/** API endpoint to fetch from (e.g., "/v1/projects"). */
|
|
6
|
+
endpoint: string;
|
|
7
|
+
/**
|
|
8
|
+
* Query key stem. A string keys the list under `${queryKey}-infinite`; an
|
|
9
|
+
* array keys it under `[...queryKey, "infinite"]`, for apps that invalidate
|
|
10
|
+
* by a multi-segment prefix.
|
|
11
|
+
*/
|
|
12
|
+
queryKey: string | (string | null)[];
|
|
13
|
+
/** Organization ID to scope cache keys (prevents stale cross-org data). */
|
|
14
|
+
orgId?: string | null;
|
|
15
|
+
/** Initial page size (default: 10). */
|
|
16
|
+
initialLimit?: number;
|
|
17
|
+
enabled?: boolean;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Cursor-paginated list hook for archivable resources.
|
|
21
|
+
* It behaves like `useInfiniteCursor` — same `-infinite` query
|
|
22
|
+
* key and `UseInfiniteReturn` shape, so existing prefix-matched invalidations
|
|
23
|
+
* keep working — but lifts the "Archived" menu filter out of the generic
|
|
24
|
+
* `filter[...]` bag: InfiniteScroll emits it as `filter[includeArchived]`,
|
|
25
|
+
* whereas the backend reads a top-level `includeArchived` flag.
|
|
26
|
+
*/
|
|
27
|
+
declare const useInfiniteArchivableCursor: <T extends {
|
|
28
|
+
id: number | string;
|
|
29
|
+
}>(options: UseInfiniteArchivableCursorOptions) => UseInfiniteReturn<T>;
|
|
30
|
+
export default useInfiniteArchivableCursor;
|
|
31
|
+
//# sourceMappingURL=useInfiniteArchivableCursor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useInfiniteArchivableCursor.d.ts","sourceRoot":"","sources":["../../src/hooks/useInfiniteArchivableCursor.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAE1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAS3C,UAAU,kCAAkC;IAC1C,aAAa,EAAE,aAAa,CAAC;IAC7B,yDAAyD;IACzD,QAAQ,EAAE,MAAM,CAAC;IACjB;;;;OAIG;IACH,QAAQ,EAAE,MAAM,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC;IACrC,2EAA2E;IAC3E,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,uCAAuC;IACvC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;;;;;GAOG;AACH,QAAA,MAAM,2BAA2B,GAAI,CAAC,SAAS;IAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,EACpE,SAAS,kCAAkC,KAC1C,iBAAiB,CAAC,CAAC,CAmGrB,CAAC;AAEF,eAAe,2BAA2B,CAAC"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useCallback, useEffect, useRef, useState } from "react";
|
|
3
|
+
import { useInfiniteQuery } from "@tanstack/react-query";
|
|
4
|
+
/**
|
|
5
|
+
* Cursor-paginated list hook for archivable resources.
|
|
6
|
+
* It behaves like `useInfiniteCursor` — same `-infinite` query
|
|
7
|
+
* key and `UseInfiniteReturn` shape, so existing prefix-matched invalidations
|
|
8
|
+
* keep working — but lifts the "Archived" menu filter out of the generic
|
|
9
|
+
* `filter[...]` bag: InfiniteScroll emits it as `filter[includeArchived]`,
|
|
10
|
+
* whereas the backend reads a top-level `includeArchived` flag.
|
|
11
|
+
*/
|
|
12
|
+
const useInfiniteArchivableCursor = (options) => {
|
|
13
|
+
const { axiosInstance, endpoint, queryKey, orgId, initialLimit = 10, enabled = true, } = options;
|
|
14
|
+
const [queryString, setQueryString] = useState(`limit=${initialLimit}`);
|
|
15
|
+
const lastQueryRef = useRef(queryString);
|
|
16
|
+
// An array stem nests "infinite" as its own segment so prefix invalidations
|
|
17
|
+
// like `["projects", projectId]` still match; a string keeps the legacy
|
|
18
|
+
// `${queryKey}-infinite` stem.
|
|
19
|
+
const infiniteKey = Array.isArray(queryKey)
|
|
20
|
+
? [...queryKey, "infinite", orgId ?? null, queryString]
|
|
21
|
+
: [`${queryKey}-infinite`, orgId ?? null, queryString];
|
|
22
|
+
const query = useInfiniteQuery({
|
|
23
|
+
queryKey: infiniteKey,
|
|
24
|
+
enabled,
|
|
25
|
+
initialPageParam: undefined,
|
|
26
|
+
getNextPageParam: (last) => last.hasMore && last.nextCursor ? last.nextCursor : undefined,
|
|
27
|
+
queryFn: async ({ pageParam }) => {
|
|
28
|
+
const params = new URLSearchParams(queryString);
|
|
29
|
+
// Cursor mode never uses offset — strip it if a caller leaks one in.
|
|
30
|
+
params.delete("offset");
|
|
31
|
+
// The "Archived" menu filter arrives as `filter[includeArchived]`, but the
|
|
32
|
+
// backend reads it as a top-level flag (not a filter clause). Lift it out
|
|
33
|
+
// so the default — flag absent — excludes archived rows.
|
|
34
|
+
const archived = params.get("filter[includeArchived]");
|
|
35
|
+
params.delete("filter[includeArchived]");
|
|
36
|
+
params.delete("filter[includeArchived_op]");
|
|
37
|
+
if (archived === "true")
|
|
38
|
+
params.set("includeArchived", "true");
|
|
39
|
+
if (pageParam)
|
|
40
|
+
params.set("cursor", pageParam);
|
|
41
|
+
const res = await axiosInstance.get(`${endpoint}?${params.toString()}`);
|
|
42
|
+
return res.data;
|
|
43
|
+
},
|
|
44
|
+
staleTime: 0,
|
|
45
|
+
gcTime: 0,
|
|
46
|
+
});
|
|
47
|
+
const queryRef = useRef(query);
|
|
48
|
+
queryRef.current = query;
|
|
49
|
+
const onQueryChange = useCallback((newQueryString) => {
|
|
50
|
+
const params = new URLSearchParams(newQueryString);
|
|
51
|
+
params.delete("offset");
|
|
52
|
+
const normalized = params.toString();
|
|
53
|
+
// Same filter/sort? InfiniteScroll is asking for the next page. The offset
|
|
54
|
+
// value it passes is meaningless for cursor mode — just fetch the next page.
|
|
55
|
+
if (normalized === lastQueryRef.current) {
|
|
56
|
+
const q = queryRef.current;
|
|
57
|
+
if (q.hasNextPage && !q.isFetchingNextPage)
|
|
58
|
+
q.fetchNextPage();
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
lastQueryRef.current = normalized;
|
|
62
|
+
setQueryString(normalized);
|
|
63
|
+
}, []);
|
|
64
|
+
const reload = useCallback(() => {
|
|
65
|
+
queryRef.current.refetch();
|
|
66
|
+
}, []);
|
|
67
|
+
const [allData, setAllData] = useState([]);
|
|
68
|
+
useEffect(() => {
|
|
69
|
+
const pages = query.data?.pages ?? [];
|
|
70
|
+
const flat = pages.flatMap((p) => p.data);
|
|
71
|
+
// Dedup defensively — composite cursors on merged proxies can yield repeats.
|
|
72
|
+
const seen = new Set();
|
|
73
|
+
const unique = [];
|
|
74
|
+
for (const item of flat) {
|
|
75
|
+
if (!seen.has(item.id)) {
|
|
76
|
+
seen.add(item.id);
|
|
77
|
+
unique.push(item);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
setAllData(unique);
|
|
81
|
+
}, [query.data]);
|
|
82
|
+
const lastPage = query.data?.pages[query.data.pages.length - 1];
|
|
83
|
+
const hasMore = lastPage?.hasMore ?? query.hasNextPage ?? false;
|
|
84
|
+
return {
|
|
85
|
+
data: allData,
|
|
86
|
+
hasMore,
|
|
87
|
+
isLoading: query.isLoading,
|
|
88
|
+
isReloading: query.isRefetching && allData.length > 0,
|
|
89
|
+
total: 0,
|
|
90
|
+
onQueryChange,
|
|
91
|
+
reload,
|
|
92
|
+
};
|
|
93
|
+
};
|
|
94
|
+
export default useInfiniteArchivableCursor;
|
|
95
|
+
//# sourceMappingURL=useInfiniteArchivableCursor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useInfiniteArchivableCursor.js","sourceRoot":"","sources":["../../src/hooks/useInfiniteArchivableCursor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { UseInfiniteReturn } from "./useInfinite.js";
|
|
2
|
+
import { AxiosInstance } from "axios";
|
|
3
|
+
interface UseInfiniteCursorOptions {
|
|
4
|
+
axiosInstance: AxiosInstance;
|
|
5
|
+
/** API endpoint to fetch from (e.g., "/v1/projects"). */
|
|
6
|
+
endpoint: string;
|
|
7
|
+
/** Query key for React Query caching. */
|
|
8
|
+
queryKey: string;
|
|
9
|
+
/** Organization ID to scope cache keys (prevents stale cross-org data). */
|
|
10
|
+
orgId?: string | null;
|
|
11
|
+
/** Initial page size (default: 10). */
|
|
12
|
+
initialLimit?: number;
|
|
13
|
+
enabled?: boolean;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Cursor-paginated counterpart to `useInfinite`. Returns the same
|
|
17
|
+
* `UseInfiniteReturn` shape so it's a drop-in replacement for callers that
|
|
18
|
+
* have migrated their backend list endpoint to cursor pagination
|
|
19
|
+
* (`{ data, hasMore, limit, nextCursor }`).
|
|
20
|
+
*
|
|
21
|
+
* `total` is always 0 — cursor endpoints intentionally do not expose `COUNT(*)`.
|
|
22
|
+
*/
|
|
23
|
+
declare const useInfiniteCursor: <T extends {
|
|
24
|
+
id: number | string;
|
|
25
|
+
}>(options: UseInfiniteCursorOptions) => UseInfiniteReturn<T>;
|
|
26
|
+
export default useInfiniteCursor;
|
|
27
|
+
//# sourceMappingURL=useInfiniteCursor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useInfiniteCursor.d.ts","sourceRoot":"","sources":["../../src/hooks/useInfiniteCursor.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAE1D,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAStC,UAAU,wBAAwB;IAChC,aAAa,EAAE,aAAa,CAAC;IAC7B,yDAAyD;IACzD,QAAQ,EAAE,MAAM,CAAC;IACjB,yCAAyC;IACzC,QAAQ,EAAE,MAAM,CAAC;IACjB,2EAA2E;IAC3E,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,uCAAuC;IACvC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;;;;;GAOG;AACH,QAAA,MAAM,iBAAiB,GAAI,CAAC,SAAS;IAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,EAC1D,SAAS,wBAAwB,KAChC,iBAAiB,CAAC,CAAC,CAqFrB,CAAC;AAEF,eAAe,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useCallback, useEffect, useRef, useState } from "react";
|
|
3
|
+
import { useInfiniteQuery } from "@tanstack/react-query";
|
|
4
|
+
/**
|
|
5
|
+
* Cursor-paginated counterpart to `useInfinite`. Returns the same
|
|
6
|
+
* `UseInfiniteReturn` shape so it's a drop-in replacement for callers that
|
|
7
|
+
* have migrated their backend list endpoint to cursor pagination
|
|
8
|
+
* (`{ data, hasMore, limit, nextCursor }`).
|
|
9
|
+
*
|
|
10
|
+
* `total` is always 0 — cursor endpoints intentionally do not expose `COUNT(*)`.
|
|
11
|
+
*/
|
|
12
|
+
const useInfiniteCursor = (options) => {
|
|
13
|
+
const { axiosInstance, endpoint, queryKey, orgId, initialLimit = 10, enabled = true, } = options;
|
|
14
|
+
const [queryString, setQueryString] = useState(`limit=${initialLimit}`);
|
|
15
|
+
const lastQueryRef = useRef(queryString);
|
|
16
|
+
const query = useInfiniteQuery({
|
|
17
|
+
queryKey: [`${queryKey}-infinite`, orgId ?? null, queryString],
|
|
18
|
+
enabled,
|
|
19
|
+
initialPageParam: undefined,
|
|
20
|
+
getNextPageParam: (last) => last.hasMore && last.nextCursor ? last.nextCursor : undefined,
|
|
21
|
+
queryFn: async ({ pageParam }) => {
|
|
22
|
+
const params = new URLSearchParams(queryString);
|
|
23
|
+
// Cursor mode never uses offset — strip it if a caller leaks one in.
|
|
24
|
+
params.delete("offset");
|
|
25
|
+
if (pageParam)
|
|
26
|
+
params.set("cursor", pageParam);
|
|
27
|
+
const res = await axiosInstance.get(`${endpoint}?${params.toString()}`);
|
|
28
|
+
return res.data;
|
|
29
|
+
},
|
|
30
|
+
staleTime: 0,
|
|
31
|
+
gcTime: 0,
|
|
32
|
+
});
|
|
33
|
+
const queryRef = useRef(query);
|
|
34
|
+
queryRef.current = query;
|
|
35
|
+
const onQueryChange = useCallback((newQueryString) => {
|
|
36
|
+
const params = new URLSearchParams(newQueryString);
|
|
37
|
+
params.delete("offset");
|
|
38
|
+
const normalized = params.toString();
|
|
39
|
+
// Same filter/sort? InfiniteScroll is asking for the next page. The offset
|
|
40
|
+
// value it passes is meaningless for cursor mode — just trigger fetchNextPage.
|
|
41
|
+
if (normalized === lastQueryRef.current) {
|
|
42
|
+
const q = queryRef.current;
|
|
43
|
+
if (q.hasNextPage && !q.isFetchingNextPage)
|
|
44
|
+
q.fetchNextPage();
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
lastQueryRef.current = normalized;
|
|
48
|
+
setQueryString(normalized);
|
|
49
|
+
}, []);
|
|
50
|
+
const reload = useCallback(() => {
|
|
51
|
+
queryRef.current.refetch();
|
|
52
|
+
}, []);
|
|
53
|
+
const [allData, setAllData] = useState([]);
|
|
54
|
+
useEffect(() => {
|
|
55
|
+
const pages = query.data?.pages ?? [];
|
|
56
|
+
const flat = pages.flatMap((p) => p.data);
|
|
57
|
+
// Dedup defensively — composite cursors on merged proxies can yield repeats.
|
|
58
|
+
const seen = new Set();
|
|
59
|
+
const unique = [];
|
|
60
|
+
for (const item of flat) {
|
|
61
|
+
if (!seen.has(item.id)) {
|
|
62
|
+
seen.add(item.id);
|
|
63
|
+
unique.push(item);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
setAllData(unique);
|
|
67
|
+
}, [query.data]);
|
|
68
|
+
const lastPage = query.data?.pages[query.data.pages.length - 1];
|
|
69
|
+
const hasMore = lastPage?.hasMore ?? query.hasNextPage ?? false;
|
|
70
|
+
return {
|
|
71
|
+
data: allData,
|
|
72
|
+
hasMore,
|
|
73
|
+
isLoading: query.isLoading,
|
|
74
|
+
isReloading: query.isRefetching && allData.length > 0,
|
|
75
|
+
total: 0,
|
|
76
|
+
onQueryChange,
|
|
77
|
+
reload,
|
|
78
|
+
};
|
|
79
|
+
};
|
|
80
|
+
export default useInfiniteCursor;
|
|
81
|
+
//# sourceMappingURL=useInfiniteCursor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useInfiniteCursor.js","sourceRoot":"","sources":["../../src/hooks/useInfiniteCursor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Dispatch, KeyboardEvent, SetStateAction } from "react";
|
|
2
|
+
interface UseListKeyboardOptions {
|
|
3
|
+
isOpen: boolean;
|
|
4
|
+
length: number;
|
|
5
|
+
highlightedIndex: number;
|
|
6
|
+
setHighlightedIndex: Dispatch<SetStateAction<number>>;
|
|
7
|
+
onSelect: (index: number) => void;
|
|
8
|
+
onClose: () => void;
|
|
9
|
+
/** If true, Tab selects highlighted (or first) option. */
|
|
10
|
+
selectOnTab?: boolean;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Returns a keydown handler that drives arrow-key list navigation,
|
|
14
|
+
* Enter to select, Escape to close, and optional Tab-to-select.
|
|
15
|
+
* Shared by Typeahead and SearchList.
|
|
16
|
+
*/
|
|
17
|
+
declare const useListKeyboard: ({ isOpen, length, highlightedIndex, setHighlightedIndex, onSelect, onClose, selectOnTab, }: UseListKeyboardOptions) => (e: KeyboardEvent<HTMLElement>) => void;
|
|
18
|
+
export default useListKeyboard;
|
|
19
|
+
//# sourceMappingURL=useListKeyboard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useListKeyboard.d.ts","sourceRoot":"","sources":["../../src/hooks/useListKeyboard.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,cAAc,EAAe,MAAM,OAAO,CAAC;AAE7E,UAAU,sBAAsB;IAC9B,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,EAAE,MAAM,CAAC;IACzB,mBAAmB,EAAE,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC;IACtD,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,0DAA0D;IAC1D,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED;;;;GAIG;AACH,QAAA,MAAM,eAAe,GAAI,4FAQtB,sBAAsB,SAEjB,aAAa,CAAC,WAAW,CAAC,SAmC/B,CAAC;AAEJ,eAAe,eAAe,CAAC"}
|