@gcsa/console-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/dist/ConsoleHeader.d.ts +9 -0
- package/dist/ConsoleHeader.js +21 -0
- package/dist/ConsoleHeader.js.map +1 -0
- package/dist/ConsolePage.d.ts +8 -0
- package/dist/ConsolePage.js +14 -0
- package/dist/ConsolePage.js.map +1 -0
- package/dist/ConsoleShell.d.ts +23 -0
- package/dist/ConsoleShell.js +133 -0
- package/dist/ConsoleShell.js.map +1 -0
- package/dist/ConsoleSidebar.d.ts +11 -0
- package/dist/ConsoleSidebar.js +52 -0
- package/dist/ConsoleSidebar.js.map +1 -0
- package/dist/GcsaAlert.d.ts +9 -0
- package/dist/GcsaAlert.js +24 -0
- package/dist/GcsaAlert.js.map +1 -0
- package/dist/GcsaAutoComplete.d.ts +15 -0
- package/dist/GcsaAutoComplete.js +106 -0
- package/dist/GcsaAutoComplete.js.map +1 -0
- package/dist/GcsaAvatar.d.ts +8 -0
- package/dist/GcsaAvatar.js +13 -0
- package/dist/GcsaAvatar.js.map +1 -0
- package/dist/GcsaBadge.d.ts +7 -0
- package/dist/GcsaBadge.js +8 -0
- package/dist/GcsaBadge.js.map +1 -0
- package/dist/GcsaBrandMark.d.ts +4 -0
- package/dist/GcsaBrandMark.js +21 -0
- package/dist/GcsaBrandMark.js.map +1 -0
- package/dist/GcsaBreadcrumb.d.ts +9 -0
- package/dist/GcsaBreadcrumb.js +20 -0
- package/dist/GcsaBreadcrumb.js.map +1 -0
- package/dist/GcsaButton.d.ts +8 -0
- package/dist/GcsaButton.js +38 -0
- package/dist/GcsaButton.js.map +1 -0
- package/dist/GcsaCalendar.d.ts +11 -0
- package/dist/GcsaCalendar.js +35 -0
- package/dist/GcsaCalendar.js.map +1 -0
- package/dist/GcsaCard.d.ts +8 -0
- package/dist/GcsaCard.js +11 -0
- package/dist/GcsaCard.js.map +1 -0
- package/dist/GcsaCascader.d.ts +14 -0
- package/dist/GcsaCascader.js +91 -0
- package/dist/GcsaCascader.js.map +1 -0
- package/dist/GcsaChatPanel.d.ts +43 -0
- package/dist/GcsaChatPanel.js +180 -0
- package/dist/GcsaChatPanel.js.map +1 -0
- package/dist/GcsaCheckbox.d.ts +11 -0
- package/dist/GcsaCheckbox.js +45 -0
- package/dist/GcsaCheckbox.js.map +1 -0
- package/dist/GcsaCollapse.d.ts +16 -0
- package/dist/GcsaCollapse.js +20 -0
- package/dist/GcsaCollapse.js.map +1 -0
- package/dist/GcsaConfigProvider.d.ts +13 -0
- package/dist/GcsaConfigProvider.js +68 -0
- package/dist/GcsaConfigProvider.js.map +1 -0
- package/dist/GcsaDataTable.d.ts +119 -0
- package/dist/GcsaDataTable.js +508 -0
- package/dist/GcsaDataTable.js.map +1 -0
- package/dist/GcsaDatePicker.d.ts +16 -0
- package/dist/GcsaDatePicker.js +211 -0
- package/dist/GcsaDatePicker.js.map +1 -0
- package/dist/GcsaDateRangePicker.d.ts +17 -0
- package/dist/GcsaDateRangePicker.js +222 -0
- package/dist/GcsaDateRangePicker.js.map +1 -0
- package/dist/GcsaDateTimePicker.d.ts +13 -0
- package/dist/GcsaDateTimePicker.js +300 -0
- package/dist/GcsaDateTimePicker.js.map +1 -0
- package/dist/GcsaDescriptions.d.ts +9 -0
- package/dist/GcsaDescriptions.js +11 -0
- package/dist/GcsaDescriptions.js.map +1 -0
- package/dist/GcsaDivider.d.ts +4 -0
- package/dist/GcsaDivider.js +8 -0
- package/dist/GcsaDivider.js.map +1 -0
- package/dist/GcsaDrawer.d.ts +15 -0
- package/dist/GcsaDrawer.js +68 -0
- package/dist/GcsaDrawer.js.map +1 -0
- package/dist/GcsaDropdown.d.ts +20 -0
- package/dist/GcsaDropdown.js +46 -0
- package/dist/GcsaDropdown.js.map +1 -0
- package/dist/GcsaEmpty.d.ts +9 -0
- package/dist/GcsaEmpty.js +16 -0
- package/dist/GcsaEmpty.js.map +1 -0
- package/dist/GcsaField.d.ts +11 -0
- package/dist/GcsaField.js +26 -0
- package/dist/GcsaField.js.map +1 -0
- package/dist/GcsaForm.d.ts +13 -0
- package/dist/GcsaForm.js +60 -0
- package/dist/GcsaForm.js.map +1 -0
- package/dist/GcsaFormField.d.ts +16 -0
- package/dist/GcsaFormField.js +39 -0
- package/dist/GcsaFormField.js.map +1 -0
- package/dist/GcsaIcon.d.ts +7 -0
- package/dist/GcsaIcon.js +17 -0
- package/dist/GcsaIcon.js.map +1 -0
- package/dist/GcsaImagePreview.d.ts +8 -0
- package/dist/GcsaImagePreview.js +18 -0
- package/dist/GcsaImagePreview.js.map +1 -0
- package/dist/GcsaInput.d.ts +13 -0
- package/dist/GcsaInput.js +76 -0
- package/dist/GcsaInput.js.map +1 -0
- package/dist/GcsaInputGroup.d.ts +11 -0
- package/dist/GcsaInputGroup.js +27 -0
- package/dist/GcsaInputGroup.js.map +1 -0
- package/dist/GcsaInputNumber.d.ts +18 -0
- package/dist/GcsaInputNumber.js +108 -0
- package/dist/GcsaInputNumber.js.map +1 -0
- package/dist/GcsaLoading.d.ts +24 -0
- package/dist/GcsaLoading.js +101 -0
- package/dist/GcsaLoading.js.map +1 -0
- package/dist/GcsaLoadingMask.d.ts +8 -0
- package/dist/GcsaLoadingMask.js +39 -0
- package/dist/GcsaLoadingMask.js.map +1 -0
- package/dist/GcsaMarkdownRenderer.d.ts +6 -0
- package/dist/GcsaMarkdownRenderer.js +32 -0
- package/dist/GcsaMarkdownRenderer.js.map +1 -0
- package/dist/GcsaMenu.d.ts +16 -0
- package/dist/GcsaMenu.js +241 -0
- package/dist/GcsaMenu.js.map +1 -0
- package/dist/GcsaModal.d.ts +10 -0
- package/dist/GcsaModal.js +45 -0
- package/dist/GcsaModal.js.map +1 -0
- package/dist/GcsaMultiSelect.d.ts +23 -0
- package/dist/GcsaMultiSelect.js +149 -0
- package/dist/GcsaMultiSelect.js.map +1 -0
- package/dist/GcsaPagination.d.ts +17 -0
- package/dist/GcsaPagination.js +108 -0
- package/dist/GcsaPagination.js.map +1 -0
- package/dist/GcsaPopconfirm.d.ts +18 -0
- package/dist/GcsaPopconfirm.js +68 -0
- package/dist/GcsaPopconfirm.js.map +1 -0
- package/dist/GcsaPopover.d.ts +30 -0
- package/dist/GcsaPopover.js +65 -0
- package/dist/GcsaPopover.js.map +1 -0
- package/dist/GcsaPopoverClose.d.ts +6 -0
- package/dist/GcsaPopoverClose.js +9 -0
- package/dist/GcsaPopoverClose.js.map +1 -0
- package/dist/GcsaProgress.d.ts +5 -0
- package/dist/GcsaProgress.js +18 -0
- package/dist/GcsaProgress.js.map +1 -0
- package/dist/GcsaRadioGroup.d.ts +9 -0
- package/dist/GcsaRadioGroup.js +37 -0
- package/dist/GcsaRadioGroup.js.map +1 -0
- package/dist/GcsaResult.d.ts +9 -0
- package/dist/GcsaResult.js +14 -0
- package/dist/GcsaResult.js.map +1 -0
- package/dist/GcsaRow.d.ts +7 -0
- package/dist/GcsaRow.js +8 -0
- package/dist/GcsaRow.js.map +1 -0
- package/dist/GcsaSelect.d.ts +20 -0
- package/dist/GcsaSelect.js +117 -0
- package/dist/GcsaSelect.js.map +1 -0
- package/dist/GcsaSkeleton.d.ts +6 -0
- package/dist/GcsaSkeleton.js +19 -0
- package/dist/GcsaSkeleton.js.map +1 -0
- package/dist/GcsaSpace.d.ts +7 -0
- package/dist/GcsaSpace.js +14 -0
- package/dist/GcsaSpace.js.map +1 -0
- package/dist/GcsaSpin.d.ts +7 -0
- package/dist/GcsaSpin.js +16 -0
- package/dist/GcsaSpin.js.map +1 -0
- package/dist/GcsaStatistic.d.ts +8 -0
- package/dist/GcsaStatistic.js +11 -0
- package/dist/GcsaStatistic.js.map +1 -0
- package/dist/GcsaSteps.d.ts +10 -0
- package/dist/GcsaSteps.js +54 -0
- package/dist/GcsaSteps.js.map +1 -0
- package/dist/GcsaSwitch.d.ts +11 -0
- package/dist/GcsaSwitch.js +36 -0
- package/dist/GcsaSwitch.js.map +1 -0
- package/dist/GcsaTabs.d.ts +15 -0
- package/dist/GcsaTabs.js +39 -0
- package/dist/GcsaTabs.js.map +1 -0
- package/dist/GcsaTag.d.ts +7 -0
- package/dist/GcsaTag.js +9 -0
- package/dist/GcsaTag.js.map +1 -0
- package/dist/GcsaTextarea.d.ts +13 -0
- package/dist/GcsaTextarea.js +76 -0
- package/dist/GcsaTextarea.js.map +1 -0
- package/dist/GcsaTimePicker.d.ts +12 -0
- package/dist/GcsaTimePicker.js +221 -0
- package/dist/GcsaTimePicker.js.map +1 -0
- package/dist/GcsaTimeline.d.ts +5 -0
- package/dist/GcsaTimeline.js +19 -0
- package/dist/GcsaTimeline.js.map +1 -0
- package/dist/GcsaToastStack.d.ts +11 -0
- package/dist/GcsaToastStack.js +45 -0
- package/dist/GcsaToastStack.js.map +1 -0
- package/dist/GcsaTooltip.d.ts +17 -0
- package/dist/GcsaTooltip.js +43 -0
- package/dist/GcsaTooltip.js.map +1 -0
- package/dist/GcsaTransfer.d.ts +11 -0
- package/dist/GcsaTransfer.js +95 -0
- package/dist/GcsaTransfer.js.map +1 -0
- package/dist/GcsaTree.d.ts +17 -0
- package/dist/GcsaTree.js +38 -0
- package/dist/GcsaTree.js.map +1 -0
- package/dist/GcsaTypography.d.ts +8 -0
- package/dist/GcsaTypography.js +14 -0
- package/dist/GcsaTypography.js.map +1 -0
- package/dist/GcsaUpload.d.ts +24 -0
- package/dist/GcsaUpload.js +146 -0
- package/dist/GcsaUpload.js.map +1 -0
- package/dist/hooks/gcsaFormTypes.d.ts +7 -0
- package/dist/hooks/useDocumentThemeSync.d.ts +3 -0
- package/dist/hooks/useDocumentThemeSync.js +7 -0
- package/dist/hooks/useDocumentThemeSync.js.map +1 -0
- package/dist/hooks/useGcsaComponentSize.d.ts +5 -0
- package/dist/hooks/useGcsaComponentSize.js +21 -0
- package/dist/hooks/useGcsaComponentSize.js.map +1 -0
- package/dist/hooks/useGcsaFormField.d.ts +26 -0
- package/dist/hooks/useGcsaFormField.js +47 -0
- package/dist/hooks/useGcsaFormField.js.map +1 -0
- package/dist/hooks/useGcsaFormSchema.d.ts +7 -0
- package/dist/hooks/useGcsaFormSchema.js +6 -0
- package/dist/hooks/useGcsaFormSchema.js.map +1 -0
- package/dist/hooks/useGcsaLocale.d.ts +4 -0
- package/dist/hooks/useGcsaLocale.js +15 -0
- package/dist/hooks/useGcsaLocale.js.map +1 -0
- package/dist/hooks/useGcsaPopupZIndex.d.ts +6 -0
- package/dist/hooks/useGcsaPopupZIndex.js +18 -0
- package/dist/hooks/useGcsaPopupZIndex.js.map +1 -0
- package/dist/hooks/useGcsaTextCount.d.ts +16 -0
- package/dist/hooks/useGcsaTextCount.js +16 -0
- package/dist/hooks/useGcsaTextCount.js.map +1 -0
- package/dist/hooks/useGcsaTheme.d.ts +7 -0
- package/dist/hooks/useGcsaTheme.js +19 -0
- package/dist/hooks/useGcsaTheme.js.map +1 -0
- package/dist/hooks/useGcsaZIndex.d.ts +13 -0
- package/dist/hooks/useGcsaZIndex.js +37 -0
- package/dist/hooks/useGcsaZIndex.js.map +1 -0
- package/dist/hooks/useMessage.d.ts +6 -0
- package/dist/hooks/useOverlayZIndex.d.ts +8 -0
- package/dist/hooks/useOverlayZIndex.js +14 -0
- package/dist/hooks/useOverlayZIndex.js.map +1 -0
- package/dist/hooks/usePreventHiddenInputScroll.d.ts +13 -0
- package/dist/hooks/usePreventHiddenInputScroll.js +124 -0
- package/dist/hooks/usePreventHiddenInputScroll.js.map +1 -0
- package/dist/icons/iconNames.d.ts +7 -0
- package/dist/icons/iconNames.js +24 -0
- package/dist/icons/iconNames.js.map +1 -0
- package/dist/icons/index.d.ts +2 -0
- package/dist/icons/registry.d.ts +3 -0
- package/dist/icons/registry.js +58 -0
- package/dist/icons/registry.js.map +1 -0
- package/dist/icons/svg/alert.svg.js +9 -0
- package/dist/icons/svg/alert.svg.js.map +1 -0
- package/dist/icons/svg/assets.svg.js +9 -0
- package/dist/icons/svg/assets.svg.js.map +1 -0
- package/dist/icons/svg/chat.svg.js +8 -0
- package/dist/icons/svg/chat.svg.js.map +1 -0
- package/dist/icons/svg/check.svg.js +8 -0
- package/dist/icons/svg/check.svg.js.map +1 -0
- package/dist/icons/svg/chevron-down.svg.js +8 -0
- package/dist/icons/svg/chevron-down.svg.js.map +1 -0
- package/dist/icons/svg/chevron-left.svg.js +8 -0
- package/dist/icons/svg/chevron-left.svg.js.map +1 -0
- package/dist/icons/svg/chevron-right.svg.js +8 -0
- package/dist/icons/svg/chevron-right.svg.js.map +1 -0
- package/dist/icons/svg/chevron-up.svg.js +8 -0
- package/dist/icons/svg/chevron-up.svg.js.map +1 -0
- package/dist/icons/svg/close.svg.js +6 -0
- package/dist/icons/svg/close.svg.js.map +1 -0
- package/dist/icons/svg/dashboard.svg.js +8 -0
- package/dist/icons/svg/dashboard.svg.js.map +1 -0
- package/dist/icons/svg/menu.svg.js +8 -0
- package/dist/icons/svg/menu.svg.js.map +1 -0
- package/dist/icons/svg/plus.svg.js +6 -0
- package/dist/icons/svg/plus.svg.js.map +1 -0
- package/dist/icons/svg/result-empty.svg.js +6 -0
- package/dist/icons/svg/result-empty.svg.js.map +1 -0
- package/dist/icons/svg/settings.svg.js +8 -0
- package/dist/icons/svg/settings.svg.js.map +1 -0
- package/dist/icons/svg/users.svg.js +11 -0
- package/dist/icons/svg/users.svg.js.map +1 -0
- package/dist/index.d.ts +151 -0
- package/dist/index.js +166 -0
- package/dist/index.js.map +1 -0
- package/dist/style.css +8028 -0
- package/dist/utils/gcsaDateValue.d.ts +25 -0
- package/dist/utils/gcsaDateValue.js +60 -0
- package/dist/utils/gcsaDateValue.js.map +1 -0
- package/dist/utils/gcsaTableColumns.d.ts +19 -0
- package/dist/utils/gcsaTableColumns.js +43 -0
- package/dist/utils/gcsaTableColumns.js.map +1 -0
- package/dist/utils/preserveDrawerScroll.d.ts +2 -0
- package/dist/utils/preserveDrawerScroll.js +13 -0
- package/dist/utils/preserveDrawerScroll.js.map +1 -0
- package/dist/utils/zodValidators.d.ts +21 -0
- package/dist/utils/zodValidators.js +35 -0
- package/dist/utils/zodValidators.js.map +1 -0
- package/package.json +58 -0
- package/src/ConsoleHeader.tsx +24 -0
- package/src/ConsolePage.tsx +22 -0
- package/src/ConsoleShell.tsx +248 -0
- package/src/ConsoleSidebar.tsx +61 -0
- package/src/GcsaAlert.tsx +29 -0
- package/src/GcsaAutoComplete.tsx +163 -0
- package/src/GcsaAvatar.tsx +21 -0
- package/src/GcsaBadge.tsx +15 -0
- package/src/GcsaBrandMark.tsx +18 -0
- package/src/GcsaBreadcrumb.tsx +35 -0
- package/src/GcsaButton.tsx +44 -0
- package/src/GcsaCalendar.tsx +14 -0
- package/src/GcsaCard.tsx +21 -0
- package/src/GcsaCascader.tsx +121 -0
- package/src/GcsaChatPanel.tsx +320 -0
- package/src/GcsaCheckbox.tsx +55 -0
- package/src/GcsaCollapse.tsx +23 -0
- package/src/GcsaConfigProvider.tsx +121 -0
- package/src/GcsaDataTable.tsx +779 -0
- package/src/GcsaDatePicker.tsx +284 -0
- package/src/GcsaDateRangePicker.tsx +310 -0
- package/src/GcsaDateTimePicker.tsx +407 -0
- package/src/GcsaDescriptions.tsx +22 -0
- package/src/GcsaDivider.tsx +7 -0
- package/src/GcsaDrawer.tsx +87 -0
- package/src/GcsaDropdown.tsx +84 -0
- package/src/GcsaEmpty.tsx +27 -0
- package/src/GcsaField.tsx +50 -0
- package/src/GcsaForm.tsx +82 -0
- package/src/GcsaFormField.tsx +67 -0
- package/src/GcsaIcon.tsx +21 -0
- package/src/GcsaImagePreview.tsx +30 -0
- package/src/GcsaInput.tsx +87 -0
- package/src/GcsaInputGroup.tsx +32 -0
- package/src/GcsaInputNumber.tsx +155 -0
- package/src/GcsaLoading.ts +206 -0
- package/src/GcsaLoadingMask.tsx +53 -0
- package/src/GcsaMarkdownRenderer.tsx +40 -0
- package/src/GcsaMenu.tsx +340 -0
- package/src/GcsaModal.tsx +68 -0
- package/src/GcsaMultiSelect.tsx +246 -0
- package/src/GcsaPagination.tsx +194 -0
- package/src/GcsaPopconfirm.tsx +104 -0
- package/src/GcsaPopover.tsx +131 -0
- package/src/GcsaPopoverClose.tsx +11 -0
- package/src/GcsaProgress.tsx +18 -0
- package/src/GcsaRadioGroup.tsx +42 -0
- package/src/GcsaResult.tsx +23 -0
- package/src/GcsaRow.tsx +13 -0
- package/src/GcsaSelect.tsx +186 -0
- package/src/GcsaSkeleton.tsx +19 -0
- package/src/GcsaSpace.tsx +17 -0
- package/src/GcsaSpin.tsx +25 -0
- package/src/GcsaStatistic.tsx +17 -0
- package/src/GcsaSteps.tsx +73 -0
- package/src/GcsaSwitch.tsx +45 -0
- package/src/GcsaTabs.tsx +53 -0
- package/src/GcsaTag.tsx +16 -0
- package/src/GcsaTextarea.tsx +87 -0
- package/src/GcsaTimePicker.tsx +298 -0
- package/src/GcsaTimeline.tsx +27 -0
- package/src/GcsaToastStack.tsx +67 -0
- package/src/GcsaTooltip.tsx +75 -0
- package/src/GcsaTransfer.tsx +129 -0
- package/src/GcsaTree.tsx +43 -0
- package/src/GcsaTypography.tsx +24 -0
- package/src/GcsaUpload.tsx +206 -0
- package/src/hooks/gcsaFormTypes.ts +23 -0
- package/src/hooks/useDocumentThemeSync.ts +6 -0
- package/src/hooks/useGcsaComponentSize.ts +24 -0
- package/src/hooks/useGcsaFormField.ts +49 -0
- package/src/hooks/useGcsaFormSchema.ts +6 -0
- package/src/hooks/useGcsaLocale.ts +16 -0
- package/src/hooks/useGcsaPopupZIndex.ts +23 -0
- package/src/hooks/useGcsaTextCount.ts +44 -0
- package/src/hooks/useGcsaTheme.ts +19 -0
- package/src/hooks/useGcsaZIndex.ts +60 -0
- package/src/hooks/useMessage.ts +7 -0
- package/src/hooks/useOverlayZIndex.ts +23 -0
- package/src/hooks/usePreventHiddenInputScroll.ts +233 -0
- package/src/icons/iconNames.ts +27 -0
- package/src/icons/index.ts +8 -0
- package/src/icons/registry.ts +38 -0
- package/src/icons/svg/alert.svg +4 -0
- package/src/icons/svg/assets.svg +4 -0
- package/src/icons/svg/chat.svg +3 -0
- package/src/icons/svg/check.svg +3 -0
- package/src/icons/svg/chevron-down.svg +3 -0
- package/src/icons/svg/chevron-left.svg +3 -0
- package/src/icons/svg/chevron-right.svg +3 -0
- package/src/icons/svg/chevron-up.svg +3 -0
- package/src/icons/svg/close.svg +1 -0
- package/src/icons/svg/dashboard.svg +3 -0
- package/src/icons/svg/menu.svg +3 -0
- package/src/icons/svg/plus.svg +1 -0
- package/src/icons/svg/result-empty.svg +1 -0
- package/src/icons/svg/settings.svg +3 -0
- package/src/icons/svg/users.svg +6 -0
- package/src/index.ts +166 -0
- package/src/utils/gcsaDateValue.ts +99 -0
- package/src/utils/gcsaTableColumns.ts +97 -0
- package/src/utils/preserveDrawerScroll.ts +20 -0
- package/src/utils/zodValidators.ts +45 -0
- package/src/vite-env.d.ts +6 -0
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
import { useRef, useState } from 'react';
|
|
2
|
+
import { GcsaIcon } from './GcsaIcon';
|
|
3
|
+
import { useGcsaLocaleMessages } from './hooks/useGcsaLocale';
|
|
4
|
+
|
|
5
|
+
export type GcsaUploadProps = {
|
|
6
|
+
files?: File[];
|
|
7
|
+
accept?: string;
|
|
8
|
+
multiple?: boolean;
|
|
9
|
+
disabled?: boolean;
|
|
10
|
+
buttonLabel?: string;
|
|
11
|
+
hint?: string;
|
|
12
|
+
maxCount?: number;
|
|
13
|
+
maxSize?: number;
|
|
14
|
+
drag?: boolean;
|
|
15
|
+
directory?: boolean;
|
|
16
|
+
dragLabel?: string;
|
|
17
|
+
uploadingLabel?: string;
|
|
18
|
+
uploadErrorLabel?: string;
|
|
19
|
+
upload?: (file: File, onProgress?: (percent: number) => void) => Promise<void> | void;
|
|
20
|
+
retryLabel?: string;
|
|
21
|
+
onProgress?: (file: File, percent: number) => void;
|
|
22
|
+
onUploadStart?: (file: File) => void;
|
|
23
|
+
onUploadSuccess?: (file: File) => void;
|
|
24
|
+
onUploadError?: (file: File, error: unknown) => void;
|
|
25
|
+
className?: string;
|
|
26
|
+
onFilesChange?: (files: File[]) => void;
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
export function GcsaUpload({
|
|
30
|
+
files = [],
|
|
31
|
+
accept,
|
|
32
|
+
multiple = false,
|
|
33
|
+
disabled,
|
|
34
|
+
buttonLabel,
|
|
35
|
+
hint,
|
|
36
|
+
maxCount,
|
|
37
|
+
className,
|
|
38
|
+
onFilesChange,
|
|
39
|
+
maxSize,
|
|
40
|
+
drag = false,
|
|
41
|
+
directory = false,
|
|
42
|
+
dragLabel,
|
|
43
|
+
uploadingLabel,
|
|
44
|
+
uploadErrorLabel,
|
|
45
|
+
upload,
|
|
46
|
+
retryLabel,
|
|
47
|
+
onProgress,
|
|
48
|
+
onUploadStart,
|
|
49
|
+
onUploadSuccess,
|
|
50
|
+
onUploadError
|
|
51
|
+
}: GcsaUploadProps) {
|
|
52
|
+
const messages = useGcsaLocaleMessages();
|
|
53
|
+
const resolvedButtonLabel = buttonLabel ?? messages.uploadSelectFile;
|
|
54
|
+
const resolvedDragLabel = dragLabel ?? messages.uploadDragHint;
|
|
55
|
+
const resolvedUploadingLabel = uploadingLabel ?? messages.uploadUploading;
|
|
56
|
+
const resolvedUploadErrorLabel = uploadErrorLabel ?? messages.uploadFailed;
|
|
57
|
+
const resolvedRetryLabel = retryLabel ?? messages.uploadRetry;
|
|
58
|
+
const resolvedHint = hint || (drag ? resolvedDragLabel : undefined);
|
|
59
|
+
const inputRef = useRef<HTMLInputElement | null>(null);
|
|
60
|
+
const [dragging, setDragging] = useState(false);
|
|
61
|
+
const [statuses, setStatuses] = useState<Map<File, 'uploading' | 'success' | 'error'>>(new Map());
|
|
62
|
+
const [progress, setProgress] = useState<Map<File, number>>(new Map());
|
|
63
|
+
|
|
64
|
+
function openPicker() {
|
|
65
|
+
inputRef.current?.click();
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function onNativeChange(event: React.ChangeEvent<HTMLInputElement>) {
|
|
69
|
+
const picked = Array.from(event.target.files ?? []);
|
|
70
|
+
event.target.value = '';
|
|
71
|
+
if (!picked.length) return;
|
|
72
|
+
|
|
73
|
+
acceptFiles(picked);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function acceptFiles(picked: File[]) {
|
|
77
|
+
const valid = maxSize == null ? picked : picked.filter(file => file.size <= maxSize);
|
|
78
|
+
let next = multiple ? [...files, ...valid] : valid.slice(0, 1);
|
|
79
|
+
if (maxCount != null) next = next.slice(0, maxCount);
|
|
80
|
+
onFilesChange?.(next);
|
|
81
|
+
if (upload) next.filter(file => valid.includes(file)).forEach(uploadFile);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
function onDragEnter(event: React.DragEvent<HTMLDivElement>) {
|
|
85
|
+
event.preventDefault();
|
|
86
|
+
if (!drag || disabled) return;
|
|
87
|
+
setDragging(true);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
function onDrop(event: React.DragEvent<HTMLDivElement>) {
|
|
91
|
+
event.preventDefault();
|
|
92
|
+
setDragging(false);
|
|
93
|
+
if (!drag || disabled) return;
|
|
94
|
+
acceptFiles(Array.from(event.dataTransfer.files));
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
async function uploadFile(file: File) {
|
|
98
|
+
if (!upload) return;
|
|
99
|
+
setStatuses(current => new Map(current).set(file, 'uploading'));
|
|
100
|
+
setProgress(current => new Map(current).set(file, 0));
|
|
101
|
+
onUploadStart?.(file);
|
|
102
|
+
try {
|
|
103
|
+
await upload(file, percent => {
|
|
104
|
+
const next = Math.max(0, Math.min(100, Math.round(percent)));
|
|
105
|
+
setProgress(current => new Map(current).set(file, next));
|
|
106
|
+
onProgress?.(file, next);
|
|
107
|
+
});
|
|
108
|
+
setStatuses(current => new Map(current).set(file, 'success'));
|
|
109
|
+
setProgress(current => new Map(current).set(file, 100));
|
|
110
|
+
onUploadSuccess?.(file);
|
|
111
|
+
} catch (error) {
|
|
112
|
+
setStatuses(current => new Map(current).set(file, 'error'));
|
|
113
|
+
onUploadError?.(file, error);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
function removeAt(index: number) {
|
|
118
|
+
onFilesChange?.(files.filter((_, i) => i !== index));
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
function formatSize(bytes: number): string {
|
|
122
|
+
if (bytes < 1024) return `${bytes} B`;
|
|
123
|
+
if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;
|
|
124
|
+
return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
return (
|
|
128
|
+
<div
|
|
129
|
+
className={`gcsa-upload${disabled ? ' gcsa-upload--disabled' : ''}${dragging ? ' gcsa-upload--dragging' : ''}${className ? ` ${className}` : ''}`}
|
|
130
|
+
>
|
|
131
|
+
<input
|
|
132
|
+
ref={inputRef}
|
|
133
|
+
type="file"
|
|
134
|
+
className="gcsa-upload__native"
|
|
135
|
+
accept={accept}
|
|
136
|
+
multiple={multiple}
|
|
137
|
+
{...(directory ? { webkitdirectory: '' } : {})}
|
|
138
|
+
disabled={disabled}
|
|
139
|
+
onChange={onNativeChange}
|
|
140
|
+
/>
|
|
141
|
+
<div
|
|
142
|
+
className="gcsa-upload__dropzone"
|
|
143
|
+
role="button"
|
|
144
|
+
tabIndex={0}
|
|
145
|
+
onClick={openPicker}
|
|
146
|
+
onKeyDown={event => {
|
|
147
|
+
if (event.key === 'Enter' || event.key === ' ') openPicker();
|
|
148
|
+
}}
|
|
149
|
+
onDragEnter={onDragEnter}
|
|
150
|
+
onDragOver={onDragEnter}
|
|
151
|
+
onDragLeave={() => setDragging(false)}
|
|
152
|
+
onDrop={onDrop}
|
|
153
|
+
>
|
|
154
|
+
<span className="gcsa-upload__icon" aria-hidden="true">
|
|
155
|
+
<GcsaIcon name="plus" />
|
|
156
|
+
</span>
|
|
157
|
+
<span className="gcsa-upload__title">{resolvedButtonLabel}</span>
|
|
158
|
+
{resolvedHint ? <p className="gcsa-upload__hint">{resolvedHint}</p> : null}
|
|
159
|
+
</div>
|
|
160
|
+
{files.length > 0 ? (
|
|
161
|
+
<ul className="gcsa-upload__list">
|
|
162
|
+
{files.map((file, index) => (
|
|
163
|
+
<li key={`${file.name}-${index}`} className="gcsa-upload__item">
|
|
164
|
+
<span className="gcsa-upload__name">{file.name}</span>
|
|
165
|
+
<span className="gcsa-upload__size">{formatSize(file.size)}</span>
|
|
166
|
+
{statuses.get(file) === 'uploading' ? (
|
|
167
|
+
<span className="gcsa-upload__status" role="status">
|
|
168
|
+
{resolvedUploadingLabel} {progress.get(file) ?? 0}%
|
|
169
|
+
</span>
|
|
170
|
+
) : null}
|
|
171
|
+
{statuses.get(file) === 'error' ? (
|
|
172
|
+
<span className="gcsa-upload__status gcsa-upload__status--error" role="alert">
|
|
173
|
+
{resolvedUploadErrorLabel}
|
|
174
|
+
</span>
|
|
175
|
+
) : null}
|
|
176
|
+
{statuses.get(file) === 'uploading' ? (
|
|
177
|
+
<div className="gcsa-upload__progress" aria-hidden="true">
|
|
178
|
+
<span style={{ width: `${progress.get(file) ?? 0}%` }} />
|
|
179
|
+
</div>
|
|
180
|
+
) : null}
|
|
181
|
+
{statuses.get(file) === 'error' ? (
|
|
182
|
+
<button
|
|
183
|
+
type="button"
|
|
184
|
+
className="gcsa-upload__retry gcsa-focus-ring"
|
|
185
|
+
disabled={disabled}
|
|
186
|
+
onClick={() => uploadFile(file)}
|
|
187
|
+
>
|
|
188
|
+
{resolvedRetryLabel}
|
|
189
|
+
</button>
|
|
190
|
+
) : null}
|
|
191
|
+
<button
|
|
192
|
+
type="button"
|
|
193
|
+
className="gcsa-upload__remove gcsa-focus-ring"
|
|
194
|
+
disabled={disabled}
|
|
195
|
+
aria-label={messages.uploadRemoveFile}
|
|
196
|
+
onClick={() => removeAt(index)}
|
|
197
|
+
>
|
|
198
|
+
{messages.remove}
|
|
199
|
+
</button>
|
|
200
|
+
</li>
|
|
201
|
+
))}
|
|
202
|
+
</ul>
|
|
203
|
+
) : null}
|
|
204
|
+
</div>
|
|
205
|
+
);
|
|
206
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { ReactFormExtendedApi } from '@tanstack/react-form';
|
|
2
|
+
|
|
3
|
+
export type GcsaFormValues = Record<string, unknown>;
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Form instance used by GcsaForm / GcsaFormField.
|
|
7
|
+
* Validator generics are relaxed so schema-backed forms remain assignable.
|
|
8
|
+
*/
|
|
9
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
10
|
+
export type GcsaFormApi = ReactFormExtendedApi<
|
|
11
|
+
GcsaFormValues,
|
|
12
|
+
any,
|
|
13
|
+
any,
|
|
14
|
+
any,
|
|
15
|
+
any,
|
|
16
|
+
any,
|
|
17
|
+
any,
|
|
18
|
+
any,
|
|
19
|
+
any,
|
|
20
|
+
any,
|
|
21
|
+
any,
|
|
22
|
+
any
|
|
23
|
+
>;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { createContext } from 'react';
|
|
2
|
+
|
|
3
|
+
/** Docs / app may provide this to restore document theme after ConfigProvider unmounts. */
|
|
4
|
+
export const GcsaRestoreDocumentThemeContext = createContext<(() => void) | null>(null);
|
|
5
|
+
|
|
6
|
+
export const GCSA_RESTORE_DOCUMENT_THEME_KEY = Symbol('gcsa-restore-document-theme');
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { createContext, useContext } from 'react';
|
|
2
|
+
import {
|
|
3
|
+
GCSA_DEFAULT_COMPONENT_SIZE,
|
|
4
|
+
resolveGcsaButtonSize,
|
|
5
|
+
resolveGcsaComponentSize,
|
|
6
|
+
type GcsaButtonSize,
|
|
7
|
+
type GcsaComponentSize
|
|
8
|
+
} from '@gcsa/console-core';
|
|
9
|
+
|
|
10
|
+
export const GcsaComponentSizeContext = createContext<GcsaComponentSize>(GCSA_DEFAULT_COMPONENT_SIZE);
|
|
11
|
+
|
|
12
|
+
export function useGcsaComponentSizeConfig(): GcsaComponentSize {
|
|
13
|
+
return useContext(GcsaComponentSizeContext);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export function useGcsaComponentSize(propSize?: GcsaComponentSize): GcsaComponentSize {
|
|
17
|
+
const configSize = useGcsaComponentSizeConfig();
|
|
18
|
+
return resolveGcsaComponentSize(propSize, configSize);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export function useGcsaButtonSize(propSize?: GcsaButtonSize): GcsaButtonSize {
|
|
22
|
+
const configSize = useGcsaComponentSizeConfig();
|
|
23
|
+
return resolveGcsaButtonSize(propSize, configSize);
|
|
24
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { FieldApi } from '@tanstack/react-form';
|
|
2
|
+
|
|
3
|
+
/** TanStack FieldApi with relaxed generics for field binding helpers. */
|
|
4
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
5
|
+
export type GcsaAnyFieldApi = FieldApi<any, any, any, any, any, any, any, any, any, any, any, any, any, any, any, any, any, any, any, any, any, any, any>;
|
|
6
|
+
|
|
7
|
+
export function gcsaTextFieldBindings(field: GcsaAnyFieldApi) {
|
|
8
|
+
const error = field.state.meta.errors[0];
|
|
9
|
+
return {
|
|
10
|
+
value: (field.state.value as string) ?? '',
|
|
11
|
+
invalid: Boolean(error),
|
|
12
|
+
onBlur: () => field.handleBlur(),
|
|
13
|
+
onChange: (value: string) => field.handleChange(value)
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export function gcsaBooleanFieldBindings(field: GcsaAnyFieldApi) {
|
|
18
|
+
return {
|
|
19
|
+
checked: Boolean(field.state.value),
|
|
20
|
+
onCheckedChange: (value: boolean) => field.handleChange(value)
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export function gcsaRadioFieldBindings(field: GcsaAnyFieldApi) {
|
|
25
|
+
const error = field.state.meta.errors[0];
|
|
26
|
+
return {
|
|
27
|
+
value: (field.state.value as string) ?? '',
|
|
28
|
+
invalid: Boolean(error),
|
|
29
|
+
onValueChange: (value: string) => field.handleChange(value)
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export function gcsaNumberFieldBindings(field: GcsaAnyFieldApi) {
|
|
34
|
+
const error = field.state.meta.errors[0];
|
|
35
|
+
return {
|
|
36
|
+
value: field.state.value as number | null,
|
|
37
|
+
invalid: Boolean(error),
|
|
38
|
+
onBlur: () => field.handleBlur(),
|
|
39
|
+
onValueChange: (value: number | null) => field.handleChange(value)
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export function gcsaFieldError(field: GcsaAnyFieldApi) {
|
|
44
|
+
return field.state.meta.errors[0] as string | undefined;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export function gcsaFieldInvalid(field: GcsaAnyFieldApi) {
|
|
48
|
+
return field.state.meta.errors.length > 0;
|
|
49
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { createContext, useContext } from 'react';
|
|
2
|
+
import {
|
|
3
|
+
GCSA_DEFAULT_LOCALE,
|
|
4
|
+
getGcsaLocaleMessages,
|
|
5
|
+
type GcsaConsoleLocale
|
|
6
|
+
} from '@gcsa/console-core';
|
|
7
|
+
|
|
8
|
+
export const GcsaLocaleContext = createContext<GcsaConsoleLocale>(GCSA_DEFAULT_LOCALE);
|
|
9
|
+
|
|
10
|
+
export function useGcsaLocale(): GcsaConsoleLocale {
|
|
11
|
+
return useContext(GcsaLocaleContext);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export function useGcsaLocaleMessages() {
|
|
15
|
+
return getGcsaLocaleMessages(useGcsaLocale());
|
|
16
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { useCallback, useState } from 'react';
|
|
2
|
+
import { useGcsaZIndex } from './useGcsaZIndex';
|
|
3
|
+
|
|
4
|
+
/** Select / Dropdown / Popover 等:打开时领取高于当前 overlay 的 z-index */
|
|
5
|
+
export function useGcsaPopupZIndex() {
|
|
6
|
+
const { nextZIndex } = useGcsaZIndex();
|
|
7
|
+
const [zIndex, setZIndex] = useState<number>();
|
|
8
|
+
|
|
9
|
+
const claimZIndex = useCallback(() => {
|
|
10
|
+
const next = nextZIndex();
|
|
11
|
+
setZIndex(next);
|
|
12
|
+
return next;
|
|
13
|
+
}, [nextZIndex]);
|
|
14
|
+
|
|
15
|
+
const onOpenChange = useCallback(
|
|
16
|
+
(open: boolean) => {
|
|
17
|
+
if (open) claimZIndex();
|
|
18
|
+
},
|
|
19
|
+
[claimZIndex]
|
|
20
|
+
);
|
|
21
|
+
|
|
22
|
+
return { zIndex, claimZIndex, onOpenChange };
|
|
23
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { useMemo } from 'react';
|
|
2
|
+
|
|
3
|
+
export type GcsaTextCountFormatter = (info: {
|
|
4
|
+
value: string;
|
|
5
|
+
count: number;
|
|
6
|
+
maxLength?: number;
|
|
7
|
+
}) => string;
|
|
8
|
+
|
|
9
|
+
export function useGcsaTextCount(options: {
|
|
10
|
+
modelValue: string;
|
|
11
|
+
maxLength?: number;
|
|
12
|
+
showCount?: boolean;
|
|
13
|
+
formatter?: GcsaTextCountFormatter;
|
|
14
|
+
}) {
|
|
15
|
+
const showCounter = useMemo(() => {
|
|
16
|
+
const max = options.maxLength;
|
|
17
|
+
const explicit = options.showCount;
|
|
18
|
+
|
|
19
|
+
if (explicit === true) return true;
|
|
20
|
+
if (explicit === false) return false;
|
|
21
|
+
return max != null;
|
|
22
|
+
}, [options.maxLength, options.showCount]);
|
|
23
|
+
|
|
24
|
+
const count = options.modelValue?.length ?? 0;
|
|
25
|
+
|
|
26
|
+
const countText = useMemo(() => {
|
|
27
|
+
const value = options.modelValue ?? '';
|
|
28
|
+
const max = options.maxLength;
|
|
29
|
+
|
|
30
|
+
if (options.formatter) {
|
|
31
|
+
return options.formatter({ value, count, maxLength: max });
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
if (max != null) {
|
|
35
|
+
return `${count}/${max}`;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
return String(count);
|
|
39
|
+
}, [options.modelValue, options.formatter, options.maxLength, count]);
|
|
40
|
+
|
|
41
|
+
const isNearLimit = options.maxLength != null && count >= options.maxLength * 0.9;
|
|
42
|
+
|
|
43
|
+
return { showCounter, count, countText, isNearLimit };
|
|
44
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { createContext, useContext } from 'react';
|
|
2
|
+
import type { GcsaConsoleTheme } from '@gcsa/console-core';
|
|
3
|
+
import type { GcsaMessageApi } from './useMessage';
|
|
4
|
+
|
|
5
|
+
export const GcsaMessageContext = createContext<GcsaMessageApi | null>(null);
|
|
6
|
+
export const GcsaThemeContext = createContext<GcsaConsoleTheme>('dark');
|
|
7
|
+
export const GcsaConfigProviderContext = createContext(false);
|
|
8
|
+
|
|
9
|
+
export function useGcsaMessage(): GcsaMessageApi {
|
|
10
|
+
const api = useContext(GcsaMessageContext);
|
|
11
|
+
if (!api) {
|
|
12
|
+
throw new Error('useGcsaMessage must be used within GcsaConfigProvider');
|
|
13
|
+
}
|
|
14
|
+
return api;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export function useGcsaTheme(): GcsaConsoleTheme {
|
|
18
|
+
return useContext(GcsaThemeContext);
|
|
19
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { createContext, useCallback, useContext } from 'react';
|
|
2
|
+
|
|
3
|
+
export type GcsaZIndexApi = {
|
|
4
|
+
next: () => number;
|
|
5
|
+
};
|
|
6
|
+
|
|
7
|
+
export const GcsaZIndexContext = createContext<GcsaZIndexApi | null>(null);
|
|
8
|
+
|
|
9
|
+
const FALLBACK_INITIAL = 2000;
|
|
10
|
+
const FALLBACK_TOAST = 1300;
|
|
11
|
+
const Z_INDEX_STEP = 2;
|
|
12
|
+
|
|
13
|
+
function readCssZIndex(token: string, fallback: number): number {
|
|
14
|
+
if (typeof document === 'undefined') return fallback;
|
|
15
|
+
const raw = getComputedStyle(document.documentElement).getPropertyValue(token).trim();
|
|
16
|
+
const parsed = Number.parseInt(raw, 10);
|
|
17
|
+
return Number.isFinite(parsed) ? parsed : fallback;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export function readToastZIndex(): number {
|
|
21
|
+
const toast = readCssZIndex('--gcsa-z-toast', Number.NaN);
|
|
22
|
+
const overlay = readCssZIndex('--z-overlay-toast', Number.NaN);
|
|
23
|
+
const candidates = [toast, overlay, FALLBACK_TOAST].filter(value => Number.isFinite(value));
|
|
24
|
+
return Math.max(...candidates);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function readInitialZIndex(): number {
|
|
28
|
+
if (typeof document === 'undefined') return FALLBACK_INITIAL;
|
|
29
|
+
const root = document.documentElement;
|
|
30
|
+
const initial = getComputedStyle(root).getPropertyValue('--gcsa-z-index-initial').trim();
|
|
31
|
+
const parsedInitial = Number.parseInt(initial, 10);
|
|
32
|
+
if (Number.isFinite(parsedInitial)) return parsedInitial;
|
|
33
|
+
const modal = getComputedStyle(root).getPropertyValue('--gcsa-z-modal').trim();
|
|
34
|
+
const parsedModal = Number.parseInt(modal, 10);
|
|
35
|
+
return Number.isFinite(parsedModal) ? parsedModal : FALLBACK_INITIAL;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export function createGcsaZIndexApi(initial?: number): GcsaZIndexApi {
|
|
39
|
+
let current = initial ?? readInitialZIndex();
|
|
40
|
+
return {
|
|
41
|
+
next() {
|
|
42
|
+
current += Z_INDEX_STEP;
|
|
43
|
+
return current;
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* 与 Vue `useGcsaZIndex` 同职责:从 ConfigProvider 的共享计数器领取下一层 z-index。
|
|
50
|
+
* `nextZIndex` 引用稳定,避免 overlay 在每次父级重渲染时重复抢占层级。
|
|
51
|
+
*/
|
|
52
|
+
export function useGcsaZIndex() {
|
|
53
|
+
const api = useContext(GcsaZIndexContext);
|
|
54
|
+
|
|
55
|
+
const nextZIndex = useCallback(() => {
|
|
56
|
+
return api?.next() ?? FALLBACK_INITIAL + Z_INDEX_STEP;
|
|
57
|
+
}, [api]);
|
|
58
|
+
|
|
59
|
+
return { nextZIndex };
|
|
60
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { useEffect, useRef, useState } from 'react';
|
|
2
|
+
import { useGcsaZIndex } from './useGcsaZIndex';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Modal / Drawer:仅在 open 变为 true 时分配 backdrop + positioner 两层 z-index(与 Vue watch(open) 一致)。
|
|
6
|
+
* 打开期间父组件重渲染不得再次 claim,否则会盖住内部后打开的 Select/Dropdown。
|
|
7
|
+
*/
|
|
8
|
+
export function useGcsaOverlayZIndex(open: boolean) {
|
|
9
|
+
const { nextZIndex } = useGcsaZIndex();
|
|
10
|
+
const nextZIndexRef = useRef(nextZIndex);
|
|
11
|
+
nextZIndexRef.current = nextZIndex;
|
|
12
|
+
|
|
13
|
+
const [backdropZ, setBackdropZ] = useState<number>();
|
|
14
|
+
const [positionerZ, setPositionerZ] = useState<number>();
|
|
15
|
+
|
|
16
|
+
useEffect(() => {
|
|
17
|
+
if (!open) return;
|
|
18
|
+
setBackdropZ(nextZIndexRef.current());
|
|
19
|
+
setPositionerZ(nextZIndexRef.current());
|
|
20
|
+
}, [open]);
|
|
21
|
+
|
|
22
|
+
return { backdropZ, positionerZ };
|
|
23
|
+
}
|