@kosmeo-ui/react 0.2.0 → 1.0.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/README.md +3 -1
- package/dist/components/buttons/button/styles.css +43 -43
- package/dist/components/buttons/rowActions/index.d.ts.map +1 -1
- package/dist/components/buttons/rowActions/index.js +2 -1
- package/dist/components/buttons/rowActions/index.js.map +1 -1
- package/dist/components/data-display/addressBlock/styles.css +2 -2
- package/dist/components/data-display/colorSwatch/index.d.ts +1 -1
- package/dist/components/data-display/colorSwatch/index.d.ts.map +1 -1
- package/dist/components/data-display/colorSwatch/index.js +1 -1
- package/dist/components/data-display/colorSwatch/index.js.map +1 -1
- package/dist/components/data-display/colorSwatch/styles.css +1 -1
- package/dist/components/data-display/dataTable/index.d.ts.map +1 -1
- package/dist/components/data-display/dataTable/index.js +7 -3
- package/dist/components/data-display/dataTable/index.js.map +1 -1
- package/dist/components/data-display/dataTable/styles.css +3 -2
- package/dist/components/data-display/dataTable/utils/parseDataKey.d.ts +8 -1
- package/dist/components/data-display/dataTable/utils/parseDataKey.d.ts.map +1 -1
- package/dist/components/data-display/dataTable/utils/parseDataKey.js +13 -41
- package/dist/components/data-display/dataTable/utils/parseDataKey.js.map +1 -1
- package/dist/components/data-display/imagePreview/styles.css +2 -2
- package/dist/components/data-display/infiniteScroll/filters/index.d.ts +4 -0
- package/dist/components/data-display/infiniteScroll/filters/index.d.ts.map +1 -1
- package/dist/components/data-display/infiniteScroll/filters/index.js +12 -2
- package/dist/components/data-display/infiniteScroll/filters/index.js.map +1 -1
- package/dist/components/data-display/infiniteScroll/filters/listFilter.d.ts.map +1 -1
- package/dist/components/data-display/infiniteScroll/filters/listFilter.js +1 -1
- package/dist/components/data-display/infiniteScroll/filters/listFilter.js.map +1 -1
- package/dist/components/data-display/infiniteScroll/filters/rangeFilter.d.ts +6 -0
- package/dist/components/data-display/infiniteScroll/filters/rangeFilter.d.ts.map +1 -1
- package/dist/components/data-display/infiniteScroll/filters/rangeFilter.js +55 -46
- package/dist/components/data-display/infiniteScroll/filters/rangeFilter.js.map +1 -1
- package/dist/components/data-display/infiniteScroll/filters/selectFilter.d.ts.map +1 -1
- package/dist/components/data-display/infiniteScroll/filters/selectFilter.js +3 -5
- package/dist/components/data-display/infiniteScroll/filters/selectFilter.js.map +1 -1
- package/dist/components/data-display/infiniteScroll/filters/styles.css +30 -1
- package/dist/components/data-display/infiniteScroll/header/limit.d.ts.map +1 -1
- package/dist/components/data-display/infiniteScroll/header/limit.js +1 -1
- package/dist/components/data-display/infiniteScroll/header/limit.js.map +1 -1
- package/dist/components/data-display/infiniteScroll/header/sortBy.d.ts.map +1 -1
- package/dist/components/data-display/infiniteScroll/header/sortBy.js +1 -1
- package/dist/components/data-display/infiniteScroll/header/sortBy.js.map +1 -1
- package/dist/components/data-display/infiniteScroll/header/sortDirection.d.ts.map +1 -1
- package/dist/components/data-display/infiniteScroll/header/sortDirection.js +1 -1
- package/dist/components/data-display/infiniteScroll/header/sortDirection.js.map +1 -1
- package/dist/components/data-display/infiniteScroll/index.d.ts +8 -0
- package/dist/components/data-display/infiniteScroll/index.d.ts.map +1 -1
- package/dist/components/data-display/infiniteScroll/index.js +41 -23
- package/dist/components/data-display/infiniteScroll/index.js.map +1 -1
- package/dist/components/data-display/infiniteScroll/styles.css +2 -2
- package/dist/components/data-display/infiniteScroll/tags/index.d.ts.map +1 -1
- package/dist/components/data-display/infiniteScroll/tags/index.js +6 -5
- package/dist/components/data-display/infiniteScroll/tags/index.js.map +1 -1
- package/dist/components/data-display/infiniteScroll/tags/listFilterTag.d.ts.map +1 -1
- package/dist/components/data-display/infiniteScroll/tags/listFilterTag.js +6 -6
- package/dist/components/data-display/infiniteScroll/tags/listFilterTag.js.map +1 -1
- package/dist/components/data-display/infiniteScroll/tags/rangeFilterTag.d.ts.map +1 -1
- package/dist/components/data-display/infiniteScroll/tags/rangeFilterTag.js +3 -5
- package/dist/components/data-display/infiniteScroll/tags/rangeFilterTag.js.map +1 -1
- package/dist/components/data-display/infiniteScroll/utils/generateQueryString.d.ts +6 -0
- package/dist/components/data-display/infiniteScroll/utils/generateQueryString.d.ts.map +1 -1
- package/dist/components/data-display/infiniteScroll/utils/generateQueryString.js +24 -12
- package/dist/components/data-display/infiniteScroll/utils/generateQueryString.js.map +1 -1
- package/dist/components/data-display/infiniteScroll/utils/hasPendingChanges.d.ts +11 -1
- package/dist/components/data-display/infiniteScroll/utils/hasPendingChanges.d.ts.map +1 -1
- package/dist/components/data-display/infiniteScroll/utils/hasPendingChanges.js +37 -18
- package/dist/components/data-display/infiniteScroll/utils/hasPendingChanges.js.map +1 -1
- package/dist/components/data-display/listCard/styles.css +3 -3
- package/dist/components/data-display/listRow/styles.css +2 -2
- package/dist/components/data-display/recoveryCodeGrid/styles.css +3 -3
- package/dist/components/data-display/secretDisplay/styles.css +4 -4
- package/dist/components/data-display/statCard/styles.css +12 -12
- package/dist/components/data-display/summaryRow/styles.css +4 -4
- package/dist/components/data-display/table/index.d.ts.map +1 -1
- package/dist/components/data-display/table/index.js +2 -2
- package/dist/components/data-display/table/index.js.map +1 -1
- package/dist/components/data-display/table/styles.css +10 -10
- package/dist/components/data-display/tableFilters/index.d.ts +30 -0
- package/dist/components/data-display/tableFilters/index.d.ts.map +1 -0
- package/dist/components/data-display/tableFilters/index.js +67 -0
- package/dist/components/data-display/tableFilters/index.js.map +1 -0
- package/dist/components/data-display/tagCard/index.d.ts.map +1 -1
- package/dist/components/data-display/tagCard/index.js +1 -1
- package/dist/components/data-display/tagCard/index.js.map +1 -1
- package/dist/components/data-display/tagCard/styles.css +1 -1
- package/dist/components/feedback/alert/styles.css +15 -15
- package/dist/components/feedback/badge/index.d.ts.map +1 -1
- package/dist/components/feedback/badge/index.js +14 -8
- package/dist/components/feedback/badge/index.js.map +1 -1
- package/dist/components/feedback/badge/styles.css +44 -46
- package/dist/components/feedback/emptyState/styles.css +2 -2
- package/dist/components/feedback/loadingOverlay/styles.css +1 -1
- package/dist/components/feedback/progressBar/styles.css +11 -11
- package/dist/components/feedback/spinner/styles.css +14 -11
- package/dist/components/feedback/tooltip/styles.css +9 -7
- package/dist/components/forms/detailField/styles.css +1 -1
- package/dist/components/forms/fieldShell/index.d.ts +3 -1
- package/dist/components/forms/fieldShell/index.d.ts.map +1 -1
- package/dist/components/forms/fieldShell/index.js +1 -1
- package/dist/components/forms/fieldShell/index.js.map +1 -1
- package/dist/components/forms/fieldShell/styles.css +5 -5
- package/dist/components/forms/form/styles.css +6 -6
- package/dist/components/forms/formActions/styles.css +4 -4
- package/dist/components/forms/formGrid/styles.css +32 -0
- package/dist/components/forms/infoRow/styles.css +2 -2
- package/dist/components/forms/optionsGroup/index.d.ts +3 -1
- package/dist/components/forms/optionsGroup/index.d.ts.map +1 -1
- package/dist/components/forms/optionsGroup/index.js +5 -1
- package/dist/components/forms/optionsGroup/index.js.map +1 -1
- package/dist/components/forms/optionsGroup/styles.css +1 -1
- package/dist/components/forms/requiredAsterisk/index.d.ts.map +1 -1
- package/dist/components/forms/requiredAsterisk/index.js +3 -2
- package/dist/components/forms/requiredAsterisk/index.js.map +1 -1
- package/dist/components/forms/requiredAsterisk/styles.css +1 -1
- package/dist/components/index.d.ts +2 -0
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +1 -0
- package/dist/components/index.js.map +1 -1
- package/dist/components/inputs/checkbox/index.d.ts.map +1 -1
- package/dist/components/inputs/checkbox/index.js +3 -1
- package/dist/components/inputs/checkbox/index.js.map +1 -1
- package/dist/components/inputs/checkbox/styles.css +4 -4
- package/dist/components/inputs/colorPicker/index.d.ts.map +1 -1
- package/dist/components/inputs/colorPicker/index.js +3 -1
- package/dist/components/inputs/colorPicker/index.js.map +1 -1
- package/dist/components/inputs/colorPicker/styles.css +3 -3
- package/dist/components/inputs/dateInput/index.d.ts +3 -3
- package/dist/components/inputs/dateInput/index.d.ts.map +1 -1
- package/dist/components/inputs/dateInput/index.js +2 -2
- package/dist/components/inputs/dateInput/index.js.map +1 -1
- package/dist/components/inputs/dateInput/styles.css +5 -5
- package/dist/components/inputs/dateInput/utils.d.ts +0 -1
- package/dist/components/inputs/dateInput/utils.d.ts.map +1 -1
- package/dist/components/inputs/dateInput/utils.js +13 -8
- package/dist/components/inputs/dateInput/utils.js.map +1 -1
- package/dist/components/inputs/dropdown/index.js +1 -1
- package/dist/components/inputs/dropdown/index.js.map +1 -1
- package/dist/components/inputs/dropdown/styles.css +2 -2
- package/dist/components/inputs/dropdownArrowButton/styles.css +7 -5
- package/dist/components/inputs/fileDropZone/index.d.ts.map +1 -1
- package/dist/components/inputs/fileDropZone/index.js +3 -2
- package/dist/components/inputs/fileDropZone/index.js.map +1 -1
- package/dist/components/inputs/fileDropZone/styles.css +12 -12
- package/dist/components/inputs/fileUpload/index.d.ts.map +1 -1
- package/dist/components/inputs/fileUpload/index.js +11 -6
- package/dist/components/inputs/fileUpload/index.js.map +1 -1
- package/dist/components/inputs/fileUpload/styles.css +9 -9
- package/dist/components/inputs/input/index.d.ts +12 -0
- package/dist/components/inputs/input/index.d.ts.map +1 -1
- package/dist/components/inputs/input/index.js +4 -3
- package/dist/components/inputs/input/index.js.map +1 -1
- package/dist/components/inputs/input/styles.css +28 -28
- package/dist/components/inputs/languageSelect/index.d.ts.map +1 -1
- package/dist/components/inputs/languageSelect/index.js +15 -4
- package/dist/components/inputs/languageSelect/index.js.map +1 -1
- package/dist/components/inputs/multiSelect/dropDown.d.ts +7 -0
- package/dist/components/inputs/multiSelect/dropDown.d.ts.map +1 -1
- package/dist/components/inputs/multiSelect/dropDown.js +19 -12
- package/dist/components/inputs/multiSelect/dropDown.js.map +1 -1
- package/dist/components/inputs/multiSelect/index.d.ts.map +1 -1
- package/dist/components/inputs/multiSelect/index.js +49 -13
- package/dist/components/inputs/multiSelect/index.js.map +1 -1
- package/dist/components/inputs/multiSelect/styles.css +51 -43
- package/dist/components/inputs/multiSelect/utils.d.ts +7 -0
- package/dist/components/inputs/multiSelect/utils.d.ts.map +1 -0
- package/dist/components/inputs/multiSelect/utils.js +18 -0
- package/dist/components/inputs/multiSelect/utils.js.map +1 -0
- package/dist/components/inputs/phoneInput/index.d.ts.map +1 -1
- package/dist/components/inputs/phoneInput/index.js +11 -3
- package/dist/components/inputs/phoneInput/index.js.map +1 -1
- package/dist/components/inputs/phoneInput/styles.css +13 -13
- package/dist/components/inputs/radioGroup/index.d.ts.map +1 -1
- package/dist/components/inputs/radioGroup/index.js +1 -1
- package/dist/components/inputs/radioGroup/index.js.map +1 -1
- package/dist/components/inputs/richTextEditor/index.d.ts.map +1 -1
- package/dist/components/inputs/richTextEditor/index.js +21 -22
- package/dist/components/inputs/richTextEditor/index.js.map +1 -1
- package/dist/components/inputs/richTextEditor/styles.css +24 -24
- package/dist/components/inputs/searchList/index.d.ts +4 -1
- package/dist/components/inputs/searchList/index.d.ts.map +1 -1
- package/dist/components/inputs/searchList/index.js +46 -31
- package/dist/components/inputs/searchList/index.js.map +1 -1
- package/dist/components/inputs/searchList/styles.css +22 -22
- package/dist/components/inputs/searchSelect/index.d.ts.map +1 -1
- package/dist/components/inputs/searchSelect/index.js +8 -2
- package/dist/components/inputs/searchSelect/index.js.map +1 -1
- package/dist/components/inputs/select/index.js +3 -2
- package/dist/components/inputs/select/index.js.map +1 -1
- package/dist/components/inputs/select/styles.css +93 -15
- package/dist/components/inputs/switch/index.d.ts.map +1 -1
- package/dist/components/inputs/switch/index.js +3 -1
- package/dist/components/inputs/switch/index.js.map +1 -1
- package/dist/components/inputs/switch/styles.css +5 -5
- package/dist/components/inputs/textArea/index.d.ts.map +1 -1
- package/dist/components/inputs/textArea/index.js +3 -2
- package/dist/components/inputs/textArea/index.js.map +1 -1
- package/dist/components/inputs/textArea/styles.css +11 -11
- package/dist/components/inputs/typeahead/index.d.ts.map +1 -1
- package/dist/components/inputs/typeahead/index.js +21 -6
- package/dist/components/inputs/typeahead/index.js.map +1 -1
- package/dist/components/inputs/typeahead/styles.css +13 -13
- package/dist/components/layout/authPage/styles.css +6 -6
- package/dist/components/layout/borderedSection/styles.css +3 -3
- package/dist/components/layout/card/styles.css +31 -31
- package/dist/components/layout/col/styles.css +1 -1
- package/dist/components/layout/page/styles.css +25 -5
- package/dist/components/layout/sectionHeader/styles.css +3 -3
- package/dist/components/navigation/breadcrumbs/styles.css +7 -7
- package/dist/components/navigation/pagination/styles.css +15 -15
- package/dist/components/navigation/sidebar/styles.css +6 -6
- package/dist/components/navigation/stepper/styles.css +14 -14
- package/dist/components/navigation/tabButton/styles.css +59 -59
- package/dist/components/navigation/tabs/styles.css +5 -5
- package/dist/components/overlays/modal/styles.css +19 -19
- package/dist/hooks/useInfinite.d.ts +3 -1
- package/dist/hooks/useInfinite.d.ts.map +1 -1
- package/dist/hooks/useInfinite.js +4 -2
- package/dist/hooks/useInfinite.js.map +1 -1
- package/dist/hooks/useInfiniteArchivableCursor.d.ts +1 -1
- package/dist/hooks/useInfiniteArchivableCursor.d.ts.map +1 -1
- package/dist/hooks/useInfiniteArchivableCursor.js +11 -4
- package/dist/hooks/useInfiniteArchivableCursor.js.map +1 -1
- package/dist/hooks/useInfiniteCursor.d.ts +1 -1
- package/dist/hooks/useInfiniteCursor.d.ts.map +1 -1
- package/dist/hooks/useInfiniteCursor.js +11 -4
- package/dist/hooks/useInfiniteCursor.js.map +1 -1
- package/dist/styles.css +142 -127
- package/package.json +15 -4
- package/src/components/buttons/button/styles.css +43 -43
- package/src/components/buttons/rowActions/index.tsx +6 -1
- package/src/components/data-display/addressBlock/styles.css +2 -2
- package/src/components/data-display/colorSwatch/index.tsx +2 -2
- package/src/components/data-display/colorSwatch/styles.css +1 -1
- package/src/components/data-display/dataTable/index.tsx +6 -3
- package/src/components/data-display/dataTable/styles.css +3 -2
- package/src/components/data-display/dataTable/utils/parseDataKey.ts +18 -36
- package/src/components/data-display/imagePreview/styles.css +2 -2
- package/src/components/data-display/infiniteScroll/filters/index.tsx +18 -1
- package/src/components/data-display/infiniteScroll/filters/listFilter.tsx +1 -0
- package/src/components/data-display/infiniteScroll/filters/rangeFilter.tsx +77 -33
- package/src/components/data-display/infiniteScroll/filters/selectFilter.tsx +11 -17
- package/src/components/data-display/infiniteScroll/filters/styles.css +30 -1
- package/src/components/data-display/infiniteScroll/header/limit.tsx +1 -0
- package/src/components/data-display/infiniteScroll/header/sortBy.tsx +1 -0
- package/src/components/data-display/infiniteScroll/header/sortDirection.tsx +1 -0
- package/src/components/data-display/infiniteScroll/index.tsx +75 -29
- package/src/components/data-display/infiniteScroll/styles.css +2 -2
- package/src/components/data-display/infiniteScroll/tags/index.tsx +6 -5
- package/src/components/data-display/infiniteScroll/tags/listFilterTag.tsx +20 -13
- package/src/components/data-display/infiniteScroll/tags/rangeFilterTag.tsx +4 -3
- package/src/components/data-display/infiniteScroll/utils/generateQueryString.ts +28 -13
- package/src/components/data-display/infiniteScroll/utils/hasPendingChanges.ts +48 -16
- package/src/components/data-display/listCard/styles.css +3 -3
- package/src/components/data-display/listRow/styles.css +2 -2
- package/src/components/data-display/recoveryCodeGrid/styles.css +3 -3
- package/src/components/data-display/secretDisplay/styles.css +4 -4
- package/src/components/data-display/statCard/styles.css +12 -12
- package/src/components/data-display/summaryRow/styles.css +4 -4
- package/src/components/data-display/table/index.tsx +2 -2
- package/src/components/data-display/table/styles.css +10 -10
- package/src/components/data-display/tableFilters/index.tsx +147 -0
- package/src/components/data-display/tagCard/index.tsx +3 -2
- package/src/components/data-display/tagCard/styles.css +1 -1
- package/src/components/feedback/alert/styles.css +15 -15
- package/src/components/feedback/badge/index.tsx +36 -16
- package/src/components/feedback/badge/styles.css +44 -46
- package/src/components/feedback/emptyState/styles.css +2 -2
- package/src/components/feedback/loadingOverlay/styles.css +1 -1
- package/src/components/feedback/progressBar/styles.css +11 -11
- package/src/components/feedback/spinner/styles.css +14 -11
- package/src/components/feedback/tooltip/styles.css +9 -7
- package/src/components/forms/detailField/styles.css +1 -1
- package/src/components/forms/fieldShell/index.tsx +4 -1
- package/src/components/forms/fieldShell/styles.css +5 -5
- package/src/components/forms/form/styles.css +6 -6
- package/src/components/forms/formActions/styles.css +4 -4
- package/src/components/forms/formGrid/styles.css +32 -0
- package/src/components/forms/infoRow/styles.css +2 -2
- package/src/components/forms/optionsGroup/index.tsx +31 -12
- package/src/components/forms/optionsGroup/styles.css +1 -1
- package/src/components/forms/requiredAsterisk/index.tsx +5 -1
- package/src/components/forms/requiredAsterisk/styles.css +1 -1
- package/src/components/index.ts +2 -0
- package/src/components/inputs/checkbox/index.tsx +3 -2
- package/src/components/inputs/checkbox/styles.css +4 -4
- package/src/components/inputs/colorPicker/index.tsx +5 -2
- package/src/components/inputs/colorPicker/styles.css +3 -3
- package/src/components/inputs/dateInput/index.tsx +4 -5
- package/src/components/inputs/dateInput/styles.css +5 -5
- package/src/components/inputs/dateInput/utils.ts +12 -8
- package/src/components/inputs/dropdown/index.tsx +1 -1
- package/src/components/inputs/dropdown/styles.css +2 -2
- package/src/components/inputs/dropdownArrowButton/styles.css +7 -5
- package/src/components/inputs/fileDropZone/index.tsx +4 -3
- package/src/components/inputs/fileDropZone/styles.css +12 -12
- package/src/components/inputs/fileUpload/index.tsx +33 -23
- package/src/components/inputs/fileUpload/styles.css +9 -9
- package/src/components/inputs/input/index.tsx +21 -3
- package/src/components/inputs/input/styles.css +28 -28
- package/src/components/inputs/languageSelect/index.tsx +19 -4
- package/src/components/inputs/multiSelect/dropDown.tsx +83 -35
- package/src/components/inputs/multiSelect/index.tsx +87 -30
- package/src/components/inputs/multiSelect/styles.css +51 -43
- package/src/components/inputs/multiSelect/utils.ts +18 -0
- package/src/components/inputs/phoneInput/index.tsx +10 -2
- package/src/components/inputs/phoneInput/styles.css +13 -13
- package/src/components/inputs/radioGroup/index.tsx +2 -1
- package/src/components/inputs/richTextEditor/index.tsx +42 -44
- package/src/components/inputs/richTextEditor/styles.css +24 -24
- package/src/components/inputs/searchList/index.tsx +121 -109
- package/src/components/inputs/searchList/styles.css +22 -22
- package/src/components/inputs/searchSelect/index.tsx +8 -2
- package/src/components/inputs/select/index.tsx +3 -3
- package/src/components/inputs/select/styles.css +93 -15
- package/src/components/inputs/switch/index.tsx +3 -2
- package/src/components/inputs/switch/styles.css +5 -5
- package/src/components/inputs/textArea/index.tsx +3 -3
- package/src/components/inputs/textArea/styles.css +11 -11
- package/src/components/inputs/typeahead/index.tsx +84 -54
- package/src/components/inputs/typeahead/styles.css +13 -13
- package/src/components/layout/authPage/styles.css +6 -6
- package/src/components/layout/borderedSection/styles.css +3 -3
- package/src/components/layout/card/styles.css +31 -31
- package/src/components/layout/col/styles.css +1 -1
- package/src/components/layout/page/styles.css +25 -5
- package/src/components/layout/sectionHeader/styles.css +3 -3
- package/src/components/navigation/breadcrumbs/styles.css +7 -7
- package/src/components/navigation/pagination/styles.css +15 -15
- package/src/components/navigation/sidebar/styles.css +6 -6
- package/src/components/navigation/stepper/styles.css +14 -14
- package/src/components/navigation/tabButton/styles.css +59 -59
- package/src/components/navigation/tabs/styles.css +5 -5
- package/src/components/overlays/modal/styles.css +19 -19
- package/src/hooks/useInfinite.ts +7 -3
- package/src/hooks/useInfiniteArchivableCursor.ts +11 -4
- package/src/hooks/useInfiniteCursor.ts +11 -4
- package/src/styles.css +142 -127
|
@@ -1,10 +1,13 @@
|
|
|
1
|
+
/* An empty box, so as a flex item it would shrink to fit a short or narrow
|
|
2
|
+
container (an oval while a page is still laying out). */
|
|
1
3
|
.k-spinner {
|
|
2
4
|
border-radius: 50%;
|
|
3
5
|
display: inline-block;
|
|
4
|
-
|
|
6
|
+
flex-shrink: 0;
|
|
7
|
+
animation: k-spin 0.8s linear infinite;
|
|
5
8
|
}
|
|
6
9
|
|
|
7
|
-
@keyframes spin {
|
|
10
|
+
@keyframes k-spin {
|
|
8
11
|
0% {
|
|
9
12
|
transform: rotate(0deg);
|
|
10
13
|
}
|
|
@@ -16,36 +19,36 @@
|
|
|
16
19
|
.k-spinner-lg {
|
|
17
20
|
height: 3.75rem;
|
|
18
21
|
width: 3.75rem;
|
|
19
|
-
border: 0.375rem solid var(--shadow-color);
|
|
22
|
+
border: 0.375rem solid var(--k-shadow-color);
|
|
20
23
|
}
|
|
21
24
|
|
|
22
25
|
.k-spinner-md {
|
|
23
26
|
height: 2.5rem;
|
|
24
27
|
width: 2.5rem;
|
|
25
|
-
border: 0.25rem solid var(--shadow-color);
|
|
28
|
+
border: 0.25rem solid var(--k-shadow-color);
|
|
26
29
|
}
|
|
27
30
|
|
|
28
31
|
.k-spinner-sm {
|
|
29
32
|
height: 1.25rem;
|
|
30
33
|
width: 1.25rem;
|
|
31
|
-
border: 0.125rem solid var(--shadow-color);
|
|
34
|
+
border: 0.125rem solid var(--k-shadow-color);
|
|
32
35
|
}
|
|
33
36
|
|
|
34
37
|
.k-spinner-primary {
|
|
35
|
-
border-left-color: var(--primary-color);
|
|
38
|
+
border-left-color: var(--k-primary-color);
|
|
36
39
|
}
|
|
37
40
|
.k-spinner-secondary {
|
|
38
|
-
border-left-color: var(--secondary-color);
|
|
41
|
+
border-left-color: var(--k-secondary-color);
|
|
39
42
|
}
|
|
40
43
|
.k-spinner-light {
|
|
41
|
-
border-left-color: var(--light-color);
|
|
44
|
+
border-left-color: var(--k-light-color);
|
|
42
45
|
}
|
|
43
46
|
.k-spinner-success {
|
|
44
|
-
border-left-color: var(--success-color);
|
|
47
|
+
border-left-color: var(--k-success-color);
|
|
45
48
|
}
|
|
46
49
|
.k-spinner-danger {
|
|
47
|
-
border-left-color: var(--danger-color);
|
|
50
|
+
border-left-color: var(--k-danger-color);
|
|
48
51
|
}
|
|
49
52
|
.k-spinner-warning {
|
|
50
|
-
border-left-color: var(--warning-color);
|
|
53
|
+
border-left-color: var(--k-warning-color);
|
|
51
54
|
}
|
|
@@ -33,11 +33,13 @@
|
|
|
33
33
|
|
|
34
34
|
.k-tooltip-content {
|
|
35
35
|
position: relative;
|
|
36
|
-
background-color: var(--text-color);
|
|
37
|
-
|
|
36
|
+
background-color: var(--k-text-color);
|
|
37
|
+
/* An inverted surface, so the text takes the page background, not a fixed
|
|
38
|
+
light color that disappears on the dark theme's light tooltip. */
|
|
39
|
+
color: var(--k-background-color);
|
|
38
40
|
padding: 0.5rem 0.75rem;
|
|
39
41
|
border-radius: 0.25rem;
|
|
40
|
-
font-size: var(--text-size-sm);
|
|
42
|
+
font-size: var(--k-text-size-sm);
|
|
41
43
|
white-space: normal;
|
|
42
44
|
max-width: 12.5rem;
|
|
43
45
|
text-align: center;
|
|
@@ -59,26 +61,26 @@
|
|
|
59
61
|
bottom: -0.625rem; /* Double the border-width to ensure visibility */
|
|
60
62
|
left: 50%;
|
|
61
63
|
transform: translateX(-50%);
|
|
62
|
-
border-color: var(--text-color) transparent transparent transparent;
|
|
64
|
+
border-color: var(--k-text-color) transparent transparent transparent;
|
|
63
65
|
}
|
|
64
66
|
|
|
65
67
|
.k-tooltip-bottom .k-tooltip-content::after {
|
|
66
68
|
top: -0.625rem; /* Double the border-width to ensure visibility */
|
|
67
69
|
left: 50%;
|
|
68
70
|
transform: translateX(-50%);
|
|
69
|
-
border-color: transparent transparent var(--text-color) transparent;
|
|
71
|
+
border-color: transparent transparent var(--k-text-color) transparent;
|
|
70
72
|
}
|
|
71
73
|
|
|
72
74
|
.k-tooltip-left .k-tooltip-content::after {
|
|
73
75
|
right: -0.625rem; /* Double the border-width to ensure visibility */
|
|
74
76
|
top: 50%;
|
|
75
77
|
transform: translateY(-50%);
|
|
76
|
-
border-color: transparent transparent transparent var(--text-color);
|
|
78
|
+
border-color: transparent transparent transparent var(--k-text-color);
|
|
77
79
|
}
|
|
78
80
|
|
|
79
81
|
.k-tooltip-right .k-tooltip-content::after {
|
|
80
82
|
left: -0.625rem; /* Double the border-width to ensure visibility */
|
|
81
83
|
top: 50%;
|
|
82
84
|
transform: translateY(-50%);
|
|
83
|
-
border-color: transparent var(--text-color) transparent transparent;
|
|
85
|
+
border-color: transparent var(--k-text-color) transparent transparent;
|
|
84
86
|
}
|
|
@@ -11,6 +11,8 @@ interface FieldShellProps {
|
|
|
11
11
|
required?: boolean;
|
|
12
12
|
/** `htmlFor` target id, used when label is a string. */
|
|
13
13
|
htmlFor?: string;
|
|
14
|
+
/** Id for the label element, for a control named with `aria-labelledby` (a `<label>` can't target a non-form element). */
|
|
15
|
+
labelId?: string;
|
|
14
16
|
/** Optional right-aligned annotation in the label row (e.g. char count). */
|
|
15
17
|
labelAside?: ReactNode;
|
|
16
18
|
/** Optional error message rendered below the input. */
|
|
@@ -28,6 +30,7 @@ const FieldShell = ({
|
|
|
28
30
|
label,
|
|
29
31
|
required,
|
|
30
32
|
htmlFor,
|
|
33
|
+
labelId,
|
|
31
34
|
labelAside,
|
|
32
35
|
error,
|
|
33
36
|
helperText,
|
|
@@ -38,7 +41,7 @@ const FieldShell = ({
|
|
|
38
41
|
{(label || labelAside) && (
|
|
39
42
|
<div className="k-field-shell-label-row">
|
|
40
43
|
{label && (
|
|
41
|
-
<label htmlFor={htmlFor} className="k-field-shell-label">
|
|
44
|
+
<label id={labelId} htmlFor={htmlFor} className="k-field-shell-label">
|
|
42
45
|
{typeof label === "string" ? (
|
|
43
46
|
<>
|
|
44
47
|
{label}
|
|
@@ -15,24 +15,24 @@
|
|
|
15
15
|
display: block;
|
|
16
16
|
font-size: 0.875rem;
|
|
17
17
|
font-weight: 500;
|
|
18
|
-
color: var(--text-color);
|
|
18
|
+
color: var(--k-text-color);
|
|
19
19
|
}
|
|
20
20
|
|
|
21
21
|
.k-field-shell-aside {
|
|
22
22
|
font-weight: 500;
|
|
23
|
-
font-size: var(--text-size-sm);
|
|
24
|
-
color: var(--text-color-secondary);
|
|
23
|
+
font-size: var(--k-text-size-sm);
|
|
24
|
+
color: var(--k-text-color-secondary);
|
|
25
25
|
margin-left: 0.5rem;
|
|
26
26
|
}
|
|
27
27
|
|
|
28
28
|
.k-field-shell-error {
|
|
29
29
|
margin-top: 0.25rem;
|
|
30
30
|
font-size: 0.8125rem;
|
|
31
|
-
color: var(--danger-color-text);
|
|
31
|
+
color: var(--k-danger-color-text);
|
|
32
32
|
}
|
|
33
33
|
|
|
34
34
|
.k-field-shell-helper {
|
|
35
35
|
margin-top: 0.25rem;
|
|
36
36
|
font-size: 0.8125rem;
|
|
37
|
-
color: var(--text-color-secondary);
|
|
37
|
+
color: var(--k-text-color-secondary);
|
|
38
38
|
}
|
|
@@ -9,19 +9,19 @@
|
|
|
9
9
|
}
|
|
10
10
|
|
|
11
11
|
.k-form-validating .k-input-invalid {
|
|
12
|
-
border-color: var(--danger-color);
|
|
12
|
+
border-color: var(--k-danger-color);
|
|
13
13
|
}
|
|
14
14
|
|
|
15
15
|
.k-form-validating .k-input-invalid:focus {
|
|
16
|
-
border-color: var(--danger-color);
|
|
17
|
-
box-shadow: 0 0 0 0.1875rem var(--shadow-color-hover);
|
|
16
|
+
border-color: var(--k-danger-color);
|
|
17
|
+
box-shadow: 0 0 0 0.1875rem var(--k-shadow-color-hover);
|
|
18
18
|
}
|
|
19
19
|
|
|
20
20
|
.k-form-validating .k-input-valid {
|
|
21
|
-
border-color: var(--success-color);
|
|
21
|
+
border-color: var(--k-success-color);
|
|
22
22
|
}
|
|
23
23
|
|
|
24
24
|
.k-form-validating .k-input-valid:focus {
|
|
25
|
-
border-color: var(--success-color);
|
|
26
|
-
box-shadow: 0 0 0 0.1875rem var(--shadow-color-hover);
|
|
25
|
+
border-color: var(--k-success-color);
|
|
26
|
+
box-shadow: 0 0 0 0.1875rem var(--k-shadow-color-hover);
|
|
27
27
|
}
|
|
@@ -39,11 +39,11 @@
|
|
|
39
39
|
.k-form-error {
|
|
40
40
|
background-color: color-mix(
|
|
41
41
|
in srgb,
|
|
42
|
-
var(--danger-color) 12%,
|
|
43
|
-
var(--background-color)
|
|
42
|
+
var(--k-danger-color) 12%,
|
|
43
|
+
var(--k-background-color)
|
|
44
44
|
);
|
|
45
|
-
color: var(--danger-color-text);
|
|
46
|
-
border: 0.0625rem solid var(--danger-color);
|
|
45
|
+
color: var(--k-danger-color-text);
|
|
46
|
+
border: 0.0625rem solid var(--k-danger-color);
|
|
47
47
|
border-radius: 0.375rem;
|
|
48
48
|
padding: 0.5rem 0.75rem;
|
|
49
49
|
font-size: 0.875rem;
|
|
@@ -39,3 +39,35 @@
|
|
|
39
39
|
grid-template-columns: 1fr;
|
|
40
40
|
}
|
|
41
41
|
}
|
|
42
|
+
|
|
43
|
+
/* Each item spans three rows (label, control, message) and fields share them
|
|
44
|
+
through subgrid, so controls in a row stay level when one label wraps or
|
|
45
|
+
one field shows helper or error text. Non-field items span the same three
|
|
46
|
+
rows so auto-placement stays one item per cell. */
|
|
47
|
+
.k-form-grid > * {
|
|
48
|
+
grid-row: span 3;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
.k-form-grid > .k-field-shell,
|
|
52
|
+
.k-form-grid > * > .k-field-shell,
|
|
53
|
+
.k-form-grid > :has(> .k-field-shell) {
|
|
54
|
+
display: grid;
|
|
55
|
+
grid-template-rows: subgrid;
|
|
56
|
+
grid-row: span 3;
|
|
57
|
+
row-gap: 0;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
:is(.k-form-grid > .k-field-shell, .k-form-grid > * > .k-field-shell) > * {
|
|
61
|
+
grid-row: 2;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
:is(.k-form-grid > .k-field-shell, .k-form-grid > * > .k-field-shell)
|
|
65
|
+
> .k-field-shell-label-row {
|
|
66
|
+
grid-row: 1;
|
|
67
|
+
align-self: end;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
:is(.k-form-grid > .k-field-shell, .k-form-grid > * > .k-field-shell)
|
|
71
|
+
> :is(.k-field-shell-error, .k-field-shell-helper) {
|
|
72
|
+
grid-row: 3;
|
|
73
|
+
}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
display: flex;
|
|
3
3
|
gap: 0.75rem;
|
|
4
4
|
padding: 0.5rem 0;
|
|
5
|
-
border-bottom: 0.0625rem solid var(--border-color);
|
|
5
|
+
border-bottom: 0.0625rem solid var(--k-border-color);
|
|
6
6
|
}
|
|
7
7
|
|
|
8
8
|
.k-info-row:last-child {
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
|
|
23
23
|
.k-info-row-label {
|
|
24
24
|
font-weight: 500;
|
|
25
|
-
color: var(--text-color-secondary);
|
|
25
|
+
color: var(--k-text-color-secondary);
|
|
26
26
|
}
|
|
27
27
|
|
|
28
28
|
.k-info-row-value {
|
|
@@ -1,26 +1,45 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
|
|
3
3
|
import MandatoryAsterisk from "../requiredAsterisk/index.js";
|
|
4
|
-
import { ReactNode } from "react";
|
|
4
|
+
import { ReactNode, useId } from "react";
|
|
5
5
|
import "./styles.css";
|
|
6
6
|
|
|
7
7
|
interface OptionsGroupProps {
|
|
8
8
|
label?: string;
|
|
9
9
|
required?: boolean;
|
|
10
|
+
/** `radiogroup` for radios; `group` (the default) for checkboxes. */
|
|
11
|
+
role?: "group" | "radiogroup";
|
|
10
12
|
children: ReactNode;
|
|
11
13
|
}
|
|
12
14
|
|
|
13
15
|
/** Internal shell for CheckboxGroup / RadioGroup — label + option list. */
|
|
14
|
-
const OptionsGroup = ({
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
<div
|
|
23
|
-
|
|
24
|
-
|
|
16
|
+
const OptionsGroup = ({
|
|
17
|
+
label,
|
|
18
|
+
required,
|
|
19
|
+
role = "group",
|
|
20
|
+
children,
|
|
21
|
+
}: OptionsGroupProps) => {
|
|
22
|
+
const labelId = useId();
|
|
23
|
+
return (
|
|
24
|
+
<div
|
|
25
|
+
className="k-options-group"
|
|
26
|
+
role={role}
|
|
27
|
+
aria-labelledby={label ? labelId : undefined}
|
|
28
|
+
aria-required={(role === "radiogroup" && required) || undefined}
|
|
29
|
+
>
|
|
30
|
+
{label && (
|
|
31
|
+
<label id={labelId} className="k-options-group-label">
|
|
32
|
+
{label}
|
|
33
|
+
{required && <MandatoryAsterisk />}
|
|
34
|
+
{/* ARIA can't mark a checkbox group required, so say it. */}
|
|
35
|
+
{required && role === "group" && (
|
|
36
|
+
<span className="k-sr-only"> (required)</span>
|
|
37
|
+
)}
|
|
38
|
+
</label>
|
|
39
|
+
)}
|
|
40
|
+
<div className="k-options-group-options">{children}</div>
|
|
41
|
+
</div>
|
|
42
|
+
);
|
|
43
|
+
};
|
|
25
44
|
|
|
26
45
|
export default OptionsGroup;
|
|
@@ -2,8 +2,12 @@
|
|
|
2
2
|
|
|
3
3
|
import "./styles.css";
|
|
4
4
|
|
|
5
|
+
// Hidden from assistive tech, which reads "required" from the field itself.
|
|
5
6
|
const MandatoryAsterisk = () => (
|
|
6
|
-
<span className="k-mandatory-asterisk"
|
|
7
|
+
<span className="k-mandatory-asterisk" aria-hidden="true">
|
|
8
|
+
{" "}
|
|
9
|
+
*
|
|
10
|
+
</span>
|
|
7
11
|
);
|
|
8
12
|
|
|
9
13
|
export default MandatoryAsterisk;
|
package/src/components/index.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export { default as RecoveryCodeGrid } from "./data-display/recoveryCodeGrid/index.js";
|
|
2
2
|
export { default as ConfirmationModal } from "./overlays/confirmationModal/index.js";
|
|
3
3
|
export { default as InfiniteScroll } from "./data-display/infiniteScroll/index.js";
|
|
4
|
+
export { default as TableFilters } from "./data-display/tableFilters/index.js";
|
|
4
5
|
export {
|
|
5
6
|
DateInput,
|
|
6
7
|
DateTimeInput,
|
|
@@ -122,6 +123,7 @@ export type {
|
|
|
122
123
|
AddressBlockAddress,
|
|
123
124
|
} from "./data-display/addressBlock/index.js";
|
|
124
125
|
export type { PaginationProps } from "./navigation/pagination/index.js";
|
|
126
|
+
export type { TableFiltersProps } from "./data-display/tableFilters/index.js";
|
|
125
127
|
export type {
|
|
126
128
|
StepperProps,
|
|
127
129
|
StepperStep,
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
|
|
3
3
|
import MandatoryAsterisk from "../../forms/requiredAsterisk/index.js";
|
|
4
|
+
import { useId } from "react";
|
|
4
5
|
import "./styles.css";
|
|
5
6
|
|
|
6
7
|
interface CheckboxProps {
|
|
@@ -30,8 +31,8 @@ const Checkbox = (props: CheckboxProps) => {
|
|
|
30
31
|
readOnly = false,
|
|
31
32
|
} = props;
|
|
32
33
|
|
|
33
|
-
const
|
|
34
|
-
|
|
34
|
+
const generatedId = useId();
|
|
35
|
+
const inputId = props.id || `checkbox-${generatedId}`;
|
|
35
36
|
|
|
36
37
|
// Browsers ignore `readonly` on checkboxes, so a click (or Space) is
|
|
37
38
|
// cancelled here instead; aria-readonly tells assistive tech why.
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
height: 1.25rem;
|
|
26
26
|
width: 1.25rem;
|
|
27
27
|
border-radius: 0.25rem;
|
|
28
|
-
border-color: var(--border-color);
|
|
28
|
+
border-color: var(--k-border-color);
|
|
29
29
|
}
|
|
30
30
|
|
|
31
31
|
.k-checkbox-label {
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
margin-bottom: 0.1rem;
|
|
34
34
|
font-size: 0.875rem;
|
|
35
35
|
font-weight: 500;
|
|
36
|
-
color: var(--text-color);
|
|
36
|
+
color: var(--k-text-color);
|
|
37
37
|
}
|
|
38
38
|
|
|
39
39
|
.k-checkbox[aria-readonly="true"] {
|
|
@@ -41,7 +41,7 @@
|
|
|
41
41
|
}
|
|
42
42
|
|
|
43
43
|
.k-checkbox-label:has(+ .k-checkbox[aria-readonly="true"]) {
|
|
44
|
-
color: var(--text-color-secondary);
|
|
44
|
+
color: var(--k-text-color-secondary);
|
|
45
45
|
}
|
|
46
46
|
|
|
47
47
|
.k-checkbox:disabled {
|
|
@@ -51,6 +51,6 @@
|
|
|
51
51
|
|
|
52
52
|
.k-checkbox:disabled + .k-checkbox-label,
|
|
53
53
|
.k-checkbox-label:has(+ .k-checkbox:disabled) {
|
|
54
|
-
color: var(--text-color-disabled);
|
|
54
|
+
color: var(--k-text-color-disabled);
|
|
55
55
|
cursor: not-allowed;
|
|
56
56
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
|
|
3
|
+
import { ChangeEvent, useId } from "react";
|
|
3
4
|
import Input from "../input/index.js";
|
|
4
|
-
import { ChangeEvent } from "react";
|
|
5
5
|
import "./styles.css";
|
|
6
6
|
|
|
7
7
|
export interface ColorPickerProps {
|
|
@@ -30,6 +30,7 @@ const ColorPicker = ({
|
|
|
30
30
|
required,
|
|
31
31
|
invalidMessage = DEFAULT_INVALID_MESSAGE,
|
|
32
32
|
}: ColorPickerProps) => {
|
|
33
|
+
const inputId = useId();
|
|
33
34
|
const trimmed = value.trim();
|
|
34
35
|
const isEmpty = trimmed === "";
|
|
35
36
|
const isValid = HEX_RE.test(trimmed);
|
|
@@ -46,7 +47,7 @@ const ColorPicker = ({
|
|
|
46
47
|
return (
|
|
47
48
|
<div className="k-color-picker">
|
|
48
49
|
{label && (
|
|
49
|
-
<label className="k-color-picker-label">
|
|
50
|
+
<label className="k-color-picker-label" htmlFor={inputId}>
|
|
50
51
|
{label}
|
|
51
52
|
{required && <span aria-hidden> *</span>}
|
|
52
53
|
</label>
|
|
@@ -61,9 +62,11 @@ const ColorPicker = ({
|
|
|
61
62
|
/>
|
|
62
63
|
<div className="k-color-picker-input">
|
|
63
64
|
<Input
|
|
65
|
+
id={inputId}
|
|
64
66
|
value={value}
|
|
65
67
|
onChange={(e) => onChange(e.target.value)}
|
|
66
68
|
placeholder={placeholder}
|
|
69
|
+
required={required}
|
|
67
70
|
/>
|
|
68
71
|
</div>
|
|
69
72
|
</div>
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
.k-color-picker-label {
|
|
8
8
|
font-size: 0.875rem;
|
|
9
9
|
font-weight: 500;
|
|
10
|
-
color: var(--text-color);
|
|
10
|
+
color: var(--k-text-color);
|
|
11
11
|
}
|
|
12
12
|
|
|
13
13
|
.k-color-picker-row {
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
-webkit-appearance: none;
|
|
22
22
|
width: 2.5rem;
|
|
23
23
|
height: 2.5rem;
|
|
24
|
-
border: 0.0625rem solid var(--border-color);
|
|
24
|
+
border: 0.0625rem solid var(--k-border-color);
|
|
25
25
|
border-radius: 0.375rem;
|
|
26
26
|
padding: 0;
|
|
27
27
|
cursor: pointer;
|
|
@@ -48,5 +48,5 @@
|
|
|
48
48
|
|
|
49
49
|
.k-color-picker-error {
|
|
50
50
|
font-size: 0.8125rem;
|
|
51
|
-
color: var(--danger-color-text);
|
|
51
|
+
color: var(--k-danger-color-text);
|
|
52
52
|
}
|
|
@@ -4,7 +4,6 @@ import FieldShell from "../../forms/fieldShell/index.js";
|
|
|
4
4
|
import { ChangeEvent, useId } from "react";
|
|
5
5
|
import "./styles.css";
|
|
6
6
|
import {
|
|
7
|
-
dateInputToIso,
|
|
8
7
|
dateTimeLocalToIso,
|
|
9
8
|
toDateInputValue,
|
|
10
9
|
toDateTimeLocalValue,
|
|
@@ -23,10 +22,10 @@ export interface DateInputBaseProps {
|
|
|
23
22
|
}
|
|
24
23
|
|
|
25
24
|
export interface DateInputProps extends DateInputBaseProps {
|
|
26
|
-
/** Accepts an ISO string or `Date`. Empty string and null both mean "no value". */
|
|
25
|
+
/** Accepts a `yyyy-mm-dd` date, an ISO string or `Date`. Empty string and null both mean "no value". */
|
|
27
26
|
value: string | Date | null;
|
|
28
|
-
/** Fires with
|
|
29
|
-
onChange: (
|
|
27
|
+
/** Fires with the picked calendar day as `yyyy-mm-dd`, or `null` when cleared. */
|
|
28
|
+
onChange: (date: string | null) => void;
|
|
30
29
|
}
|
|
31
30
|
|
|
32
31
|
export interface DateTimeInputProps extends DateInputBaseProps {
|
|
@@ -57,7 +56,7 @@ export const DateInput = ({
|
|
|
57
56
|
const fallbackId = useId();
|
|
58
57
|
const id = idProp ?? fallbackId;
|
|
59
58
|
const handle = (e: ChangeEvent<HTMLInputElement>) =>
|
|
60
|
-
onChange(
|
|
59
|
+
onChange(e.target.value || null);
|
|
61
60
|
return (
|
|
62
61
|
<FieldShell
|
|
63
62
|
label={label}
|
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
.k-date-input-field {
|
|
2
|
-
border: 0.0625rem solid var(--border-color);
|
|
2
|
+
border: 0.0625rem solid var(--k-border-color);
|
|
3
3
|
border-radius: 0.375rem;
|
|
4
4
|
padding: 0.5rem 0.625rem;
|
|
5
5
|
font-size: 0.9375rem;
|
|
6
|
-
background-color: var(--background-color);
|
|
7
|
-
color: var(--text-color);
|
|
6
|
+
background-color: var(--k-background-color);
|
|
7
|
+
color: var(--k-text-color);
|
|
8
8
|
width: 100%;
|
|
9
9
|
box-sizing: border-box;
|
|
10
10
|
}
|
|
11
11
|
|
|
12
12
|
.k-date-input-field:focus {
|
|
13
13
|
outline: none;
|
|
14
|
-
border-color: var(--primary-color);
|
|
14
|
+
border-color: var(--k-primary-color);
|
|
15
15
|
box-shadow: 0 0 0 0.125rem
|
|
16
|
-
color-mix(in srgb, var(--primary-color) 30%, transparent);
|
|
16
|
+
color-mix(in srgb, var(--k-primary-color) 30%, transparent);
|
|
17
17
|
}
|
|
18
18
|
|
|
19
19
|
.k-date-input-field:disabled {
|
|
@@ -1,10 +1,20 @@
|
|
|
1
1
|
const pad = (n: number) => n.toString().padStart(2, "0");
|
|
2
2
|
|
|
3
|
+
// `new Date("2024-01-05")` is UTC midnight, which is the previous day west of
|
|
4
|
+
// UTC; a date-only string means that calendar day locally.
|
|
5
|
+
const toDate = (value: string | Date): Date => {
|
|
6
|
+
if (value instanceof Date) return value;
|
|
7
|
+
const dateOnly = /^(\d{4})-(\d{2})-(\d{2})$/.exec(value);
|
|
8
|
+
if (!dateOnly) return new Date(value);
|
|
9
|
+
const [, y, m, d] = dateOnly.map(Number);
|
|
10
|
+
return new Date(y, m - 1, d);
|
|
11
|
+
};
|
|
12
|
+
|
|
3
13
|
export const toDateInputValue = (
|
|
4
14
|
value: string | Date | null | undefined
|
|
5
15
|
): string => {
|
|
6
16
|
if (value == null || value === "") return "";
|
|
7
|
-
const d =
|
|
17
|
+
const d = toDate(value);
|
|
8
18
|
if (Number.isNaN(d.getTime())) return "";
|
|
9
19
|
return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`;
|
|
10
20
|
};
|
|
@@ -13,19 +23,13 @@ export const toDateTimeLocalValue = (
|
|
|
13
23
|
value: string | Date | null | undefined
|
|
14
24
|
): string => {
|
|
15
25
|
if (value == null || value === "") return "";
|
|
16
|
-
const d =
|
|
26
|
+
const d = toDate(value);
|
|
17
27
|
if (Number.isNaN(d.getTime())) return "";
|
|
18
28
|
return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}T${pad(
|
|
19
29
|
d.getHours()
|
|
20
30
|
)}:${pad(d.getMinutes())}`;
|
|
21
31
|
};
|
|
22
32
|
|
|
23
|
-
export const dateInputToIso = (value: string): string | null => {
|
|
24
|
-
if (!value) return null;
|
|
25
|
-
const d = new Date(`${value}T00:00:00`);
|
|
26
|
-
return Number.isNaN(d.getTime()) ? null : d.toISOString();
|
|
27
|
-
};
|
|
28
|
-
|
|
29
33
|
export const dateTimeLocalToIso = (value: string): string | null => {
|
|
30
34
|
if (!value) return null;
|
|
31
35
|
const d = new Date(value);
|
|
@@ -46,7 +46,7 @@ const Dropdown = (props: DropdownProps) => {
|
|
|
46
46
|
setIsOpen(!isOpen);
|
|
47
47
|
};
|
|
48
48
|
|
|
49
|
-
useOutsideClick([dropdownRef], () => setIsOpen(false));
|
|
49
|
+
useOutsideClick([dropdownRef], () => setIsOpen(false), isOpen);
|
|
50
50
|
|
|
51
51
|
const label = (
|
|
52
52
|
<div className="k-dropdown-label-container">
|
|
@@ -7,9 +7,9 @@
|
|
|
7
7
|
.k-dropdown-menu {
|
|
8
8
|
position: absolute;
|
|
9
9
|
top: 100%;
|
|
10
|
-
background-color: var(--background-color);
|
|
10
|
+
background-color: var(--k-background-color);
|
|
11
11
|
border-radius: 0.5rem;
|
|
12
|
-
box-shadow: 0 0.375rem 1.25rem var(--shadow-color);
|
|
12
|
+
box-shadow: 0 0.375rem 1.25rem var(--k-shadow-color);
|
|
13
13
|
overflow: hidden;
|
|
14
14
|
transform: translateY(-0.625rem);
|
|
15
15
|
opacity: 0;
|
|
@@ -1,21 +1,26 @@
|
|
|
1
1
|
/* Generic dropdown arrow toggle — used by Input (dropDown), MultiSelect, etc. */
|
|
2
|
+
/* Spans the field's height and centers the chevron, however tall the field
|
|
3
|
+
grows (MultiSelect with chips). */
|
|
2
4
|
.k-dropdown-arrow {
|
|
3
5
|
position: absolute;
|
|
6
|
+
top: 0;
|
|
7
|
+
bottom: 0;
|
|
4
8
|
right: 0.75rem;
|
|
9
|
+
display: flex;
|
|
5
10
|
background: none;
|
|
6
11
|
border: none;
|
|
7
12
|
cursor: pointer;
|
|
8
13
|
padding: 0;
|
|
9
14
|
align-items: center;
|
|
10
15
|
justify-content: center;
|
|
11
|
-
color: var(--text-color-secondary);
|
|
16
|
+
color: var(--k-text-color-secondary);
|
|
12
17
|
transition:
|
|
13
18
|
color 0.2s ease-in-out,
|
|
14
19
|
transform 0.2s ease-in-out;
|
|
15
20
|
}
|
|
16
21
|
|
|
17
22
|
.k-dropdown-arrow:hover:not(:disabled) {
|
|
18
|
-
color: var(--primary-color-text);
|
|
23
|
+
color: var(--k-primary-color-text);
|
|
19
24
|
}
|
|
20
25
|
|
|
21
26
|
.k-dropdown-arrow:focus {
|
|
@@ -29,17 +34,14 @@
|
|
|
29
34
|
|
|
30
35
|
.k-dropdown-arrow-sm {
|
|
31
36
|
font-size: 0.75rem;
|
|
32
|
-
top: 0.5rem;
|
|
33
37
|
}
|
|
34
38
|
|
|
35
39
|
.k-dropdown-arrow-md {
|
|
36
40
|
font-size: 0.875rem;
|
|
37
|
-
top: 0.625rem;
|
|
38
41
|
}
|
|
39
42
|
|
|
40
43
|
.k-dropdown-arrow-lg {
|
|
41
44
|
font-size: 1rem;
|
|
42
|
-
top: 0.75rem;
|
|
43
45
|
}
|
|
44
46
|
|
|
45
47
|
.k-dropdown-arrow-open {
|