@superad/ui 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +42 -0
- package/es/Button/Button.d.mts +7 -0
- package/es/Button/Button.mjs +29 -0
- package/es/Button/Button.mjs.map +1 -0
- package/es/Button/index.d.mts +3 -0
- package/es/Button/index.d.ts +1 -0
- package/es/Button/index.js +1 -0
- package/es/Button/index.mjs +2 -0
- package/es/Button/style.mjs +33 -0
- package/es/Button/style.mjs.map +1 -0
- package/es/Button/type.d.mts +21 -0
- package/es/ConfigProvider/index.d.mts +9 -0
- package/es/ConfigProvider/index.d.ts +1 -0
- package/es/ConfigProvider/index.js +1 -0
- package/es/ConfigProvider/index.mjs +82 -0
- package/es/ConfigProvider/index.mjs.map +1 -0
- package/es/ConfigProvider/type.d.mts +24 -0
- package/es/DraggablePanel/DraggablePanel.d.mts +6 -0
- package/es/DraggablePanel/DraggablePanel.mjs +104 -0
- package/es/DraggablePanel/DraggablePanel.mjs.map +1 -0
- package/es/DraggablePanel/index.d.mts +3 -0
- package/es/DraggablePanel/index.d.ts +1 -0
- package/es/DraggablePanel/index.js +1 -0
- package/es/DraggablePanel/index.mjs +3 -0
- package/es/DraggablePanel/style.mjs +86 -0
- package/es/DraggablePanel/style.mjs.map +1 -0
- package/es/DraggablePanel/type.d.mts +27 -0
- package/es/Flex/Center.d.mts +7 -0
- package/es/Flex/Center.mjs +14 -0
- package/es/Flex/Center.mjs.map +1 -0
- package/es/Flex/FlexBasic.d.mts +6 -0
- package/es/Flex/FlexBasic.mjs +46 -0
- package/es/Flex/FlexBasic.mjs.map +1 -0
- package/es/Flex/Flexbox.d.mts +2 -0
- package/es/Flex/index.d.mts +5 -0
- package/es/Flex/index.d.ts +1 -0
- package/es/Flex/index.js +1 -0
- package/es/Flex/index.mjs +3 -0
- package/es/Flex/type.d.mts +35 -0
- package/es/Flex/utils.mjs +24 -0
- package/es/Flex/utils.mjs.map +1 -0
- package/es/FontLoader/index.d.mts +9 -0
- package/es/FontLoader/index.d.ts +1 -0
- package/es/FontLoader/index.js +1 -0
- package/es/FontLoader/index.mjs +23 -0
- package/es/FontLoader/index.mjs.map +1 -0
- package/es/GlobalFocusRing/index.d.mts +6 -0
- package/es/GlobalFocusRing/index.d.ts +1 -0
- package/es/GlobalFocusRing/index.js +1 -0
- package/es/GlobalFocusRing/index.mjs +204 -0
- package/es/GlobalFocusRing/index.mjs.map +1 -0
- package/es/GlobalFocusRing/style.mjs +35 -0
- package/es/GlobalFocusRing/style.mjs.map +1 -0
- package/es/Provider.d.mts +5 -0
- package/es/Table/canvas/canvasPalette.mjs +11 -0
- package/es/Table/canvas/canvasPalette.mjs.map +1 -0
- package/es/Table/canvas/chipPainters.mjs +408 -0
- package/es/Table/canvas/chipPainters.mjs.map +1 -0
- package/es/Table/canvas/controlPainters.mjs +193 -0
- package/es/Table/canvas/controlPainters.mjs.map +1 -0
- package/es/Table/canvas/groupTitle.mjs +181 -0
- package/es/Table/canvas/groupTitle.mjs.map +1 -0
- package/es/Table/canvas/paintUtils.mjs +70 -0
- package/es/Table/canvas/paintUtils.mjs.map +1 -0
- package/es/Table/canvas/rowSeries.mjs +130 -0
- package/es/Table/canvas/rowSeries.mjs.map +1 -0
- package/es/Table/canvas/textPainters.mjs +97 -0
- package/es/Table/canvas/textPainters.mjs.map +1 -0
- package/es/Table/canvas/theme.d.mts +14 -0
- package/es/Table/canvas/theme.mjs +276 -0
- package/es/Table/canvas/theme.mjs.map +1 -0
- package/es/Table/core/cellValue.d.mts +1 -0
- package/es/Table/core/cellValue.mjs +240 -0
- package/es/Table/core/cellValue.mjs.map +1 -0
- package/es/Table/core/rowSelection.mjs +138 -0
- package/es/Table/core/rowSelection.mjs.map +1 -0
- package/es/Table/core/size.mjs +60 -0
- package/es/Table/core/size.mjs.map +1 -0
- package/es/Table/core/tableI18n.d.mts +11 -0
- package/es/Table/core/tableI18n.mjs +123 -0
- package/es/Table/core/tableI18n.mjs.map +1 -0
- package/es/Table/core/tagTone.mjs +245 -0
- package/es/Table/core/tagTone.mjs.map +1 -0
- package/es/Table/core/zIndex.mjs +7 -0
- package/es/Table/core/zIndex.mjs.map +1 -0
- package/es/Table/index.d.mts +6 -0
- package/es/Table/index.d.ts +1 -0
- package/es/Table/index.js +1 -0
- package/es/Table/index.mjs +6 -0
- package/es/Table/react/Table.d.mts +9 -0
- package/es/Table/react/Table.mjs +407 -0
- package/es/Table/react/Table.mjs.map +1 -0
- package/es/Table/react/TableColumnSettings.mjs +65 -0
- package/es/Table/react/TableColumnSettings.mjs.map +1 -0
- package/es/Table/react/a11y.mjs +72 -0
- package/es/Table/react/a11y.mjs.map +1 -0
- package/es/Table/react/editors/base.mjs +427 -0
- package/es/Table/react/editors/base.mjs.map +1 -0
- package/es/Table/react/editors/inline.mjs +225 -0
- package/es/Table/react/editors/inline.mjs.map +1 -0
- package/es/Table/react/editors/picker.mjs +368 -0
- package/es/Table/react/editors/picker.mjs.map +1 -0
- package/es/Table/react/overlayChips.mjs +50 -0
- package/es/Table/react/overlayChips.mjs.map +1 -0
- package/es/Table/react/sameRenderInputs.mjs +50 -0
- package/es/Table/react/sameRenderInputs.mjs.map +1 -0
- package/es/Table/react/style.mjs +650 -0
- package/es/Table/react/style.mjs.map +1 -0
- package/es/Table/react/useTableCellEvents.mjs +32 -0
- package/es/Table/react/useTableCellEvents.mjs.map +1 -0
- package/es/Table/react/useTableColumnSettings.mjs +107 -0
- package/es/Table/react/useTableColumnSettings.mjs.map +1 -0
- package/es/Table/react/useTableEditorSync.mjs +41 -0
- package/es/Table/react/useTableEditorSync.mjs.map +1 -0
- package/es/Table/react/useTableHoverHint.mjs +62 -0
- package/es/Table/react/useTableHoverHint.mjs.map +1 -0
- package/es/Table/react/useTableKeyboard.mjs +41 -0
- package/es/Table/react/useTableKeyboard.mjs.map +1 -0
- package/es/Table/react/useTableRenderState.mjs +194 -0
- package/es/Table/react/useTableRenderState.mjs.map +1 -0
- package/es/Table/react/useTableScroll.mjs +33 -0
- package/es/Table/react/useTableScroll.mjs.map +1 -0
- package/es/Table/react/useTableSelectionInfo.mjs +48 -0
- package/es/Table/react/useTableSelectionInfo.mjs.map +1 -0
- package/es/Table/react/useTableVTableEvents.mjs +132 -0
- package/es/Table/react/useTableVTableEvents.mjs.map +1 -0
- package/es/Table/type.d.mts +279 -0
- package/es/Table/type.mjs +34 -0
- package/es/Table/type.mjs.map +1 -0
- package/es/Table/vtable/columns.d.mts +17 -0
- package/es/Table/vtable/columns.mjs +381 -0
- package/es/Table/vtable/columns.mjs.map +1 -0
- package/es/Table/vtable/frozenShadow.mjs +27 -0
- package/es/Table/vtable/frozenShadow.mjs.map +1 -0
- package/es/Table/vtable/interaction.mjs +175 -0
- package/es/Table/vtable/interaction.mjs.map +1 -0
- package/es/Table/vtable/option.d.mts +39 -0
- package/es/Table/vtable/option.mjs +232 -0
- package/es/Table/vtable/option.mjs.map +1 -0
- package/es/Table/vtable/seriesSelection.mjs +374 -0
- package/es/Table/vtable/seriesSelection.mjs.map +1 -0
- package/es/Table/vtable/vtableAdapter.mjs +96 -0
- package/es/Table/vtable/vtableAdapter.mjs.map +1 -0
- package/es/ThemeProvider/AppElementContext.d.mts +5 -0
- package/es/ThemeProvider/AppElementContext.mjs +10 -0
- package/es/ThemeProvider/AppElementContext.mjs.map +1 -0
- package/es/ThemeProvider/ConfigProvider.mjs +29 -0
- package/es/ThemeProvider/ConfigProvider.mjs.map +1 -0
- package/es/ThemeProvider/GlobalStyle/antdOverride.mjs +73 -0
- package/es/ThemeProvider/GlobalStyle/antdOverride.mjs.map +1 -0
- package/es/ThemeProvider/GlobalStyle/essential.mjs +50 -0
- package/es/ThemeProvider/GlobalStyle/essential.mjs.map +1 -0
- package/es/ThemeProvider/GlobalStyle/global.mjs +90 -0
- package/es/ThemeProvider/GlobalStyle/global.mjs.map +1 -0
- package/es/ThemeProvider/GlobalStyle/index.mjs +14 -0
- package/es/ThemeProvider/GlobalStyle/index.mjs.map +1 -0
- package/es/ThemeProvider/Meta.d.mts +7 -0
- package/es/ThemeProvider/Meta.mjs +48 -0
- package/es/ThemeProvider/Meta.mjs.map +1 -0
- package/es/ThemeProvider/ThemeProvider.d.mts +6 -0
- package/es/ThemeProvider/ThemeProvider.mjs +89 -0
- package/es/ThemeProvider/ThemeProvider.mjs.map +1 -0
- package/es/ThemeProvider/constants.d.mts +5 -0
- package/es/ThemeProvider/constants.mjs +6 -0
- package/es/ThemeProvider/constants.mjs.map +1 -0
- package/es/ThemeProvider/index.d.mts +6 -0
- package/es/ThemeProvider/index.d.ts +1 -0
- package/es/ThemeProvider/index.js +1 -0
- package/es/ThemeProvider/index.mjs +5 -0
- package/es/ThemeProvider/type.d.mts +48 -0
- package/es/_virtual/_rolldown/runtime.mjs +13 -0
- package/es/color/colors/blue.d.mts +6 -0
- package/es/color/colors/blue.mjs +67 -0
- package/es/color/colors/blue.mjs.map +1 -0
- package/es/color/colors/cyan.d.mts +6 -0
- package/es/color/colors/cyan.mjs +67 -0
- package/es/color/colors/cyan.mjs.map +1 -0
- package/es/color/colors/geekblue.d.mts +6 -0
- package/es/color/colors/geekblue.mjs +67 -0
- package/es/color/colors/geekblue.mjs.map +1 -0
- package/es/color/colors/gold.d.mts +6 -0
- package/es/color/colors/gold.mjs +67 -0
- package/es/color/colors/gold.mjs.map +1 -0
- package/es/color/colors/gray.d.mts +6 -0
- package/es/color/colors/gray.mjs +67 -0
- package/es/color/colors/gray.mjs.map +1 -0
- package/es/color/colors/green.d.mts +6 -0
- package/es/color/colors/green.mjs +67 -0
- package/es/color/colors/green.mjs.map +1 -0
- package/es/color/colors/index.d.mts +22 -0
- package/es/color/colors/index.mjs +35 -0
- package/es/color/colors/index.mjs.map +1 -0
- package/es/color/colors/lime.d.mts +6 -0
- package/es/color/colors/lime.mjs +67 -0
- package/es/color/colors/lime.mjs.map +1 -0
- package/es/color/colors/magenta.d.mts +6 -0
- package/es/color/colors/magenta.mjs +67 -0
- package/es/color/colors/magenta.mjs.map +1 -0
- package/es/color/colors/orange.d.mts +6 -0
- package/es/color/colors/orange.mjs +67 -0
- package/es/color/colors/orange.mjs.map +1 -0
- package/es/color/colors/primary.d.mts +6 -0
- package/es/color/colors/primary.mjs +67 -0
- package/es/color/colors/primary.mjs.map +1 -0
- package/es/color/colors/purple.d.mts +6 -0
- package/es/color/colors/purple.mjs +67 -0
- package/es/color/colors/purple.mjs.map +1 -0
- package/es/color/colors/red.d.mts +6 -0
- package/es/color/colors/red.mjs +67 -0
- package/es/color/colors/red.mjs.map +1 -0
- package/es/color/colors/volcano.d.mts +6 -0
- package/es/color/colors/volcano.mjs +67 -0
- package/es/color/colors/volcano.mjs.map +1 -0
- package/es/color/colors/yellow.d.mts +6 -0
- package/es/color/colors/yellow.mjs +67 -0
- package/es/color/colors/yellow.mjs.map +1 -0
- package/es/color/index.d.mts +23 -0
- package/es/color/index.d.ts +1 -0
- package/es/color/index.js +1 -0
- package/es/color/index.mjs +22 -0
- package/es/color/neutrals/index.d.mts +13 -0
- package/es/color/neutrals/index.mjs +17 -0
- package/es/color/neutrals/index.mjs.map +1 -0
- package/es/color/neutrals/mauve.d.mts +6 -0
- package/es/color/neutrals/mauve.mjs +67 -0
- package/es/color/neutrals/mauve.mjs.map +1 -0
- package/es/color/neutrals/olive.d.mts +6 -0
- package/es/color/neutrals/olive.mjs +67 -0
- package/es/color/neutrals/olive.mjs.map +1 -0
- package/es/color/neutrals/sage.d.mts +6 -0
- package/es/color/neutrals/sage.mjs +67 -0
- package/es/color/neutrals/sage.mjs.map +1 -0
- package/es/color/neutrals/sand.d.mts +6 -0
- package/es/color/neutrals/sand.mjs +67 -0
- package/es/color/neutrals/sand.mjs.map +1 -0
- package/es/color/neutrals/slate.d.mts +6 -0
- package/es/color/neutrals/slate.mjs +67 -0
- package/es/color/neutrals/slate.mjs.map +1 -0
- package/es/color/types.d.mts +16 -0
- package/es/eslint/index.d.mts +26 -0
- package/es/eslint/index.d.ts +1 -0
- package/es/eslint/index.js +1 -0
- package/es/eslint/index.mjs +11 -0
- package/es/eslint/index.mjs.map +1 -0
- package/es/hooks/useIsClient.d.mts +8 -0
- package/es/hooks/useIsClient.mjs +13 -0
- package/es/hooks/useIsClient.mjs.map +1 -0
- package/es/i18n/context.d.mts +7 -0
- package/es/i18n/context.mjs +16 -0
- package/es/i18n/context.mjs.map +1 -0
- package/es/i18n/index.d.mts +6 -0
- package/es/i18n/index.d.ts +1 -0
- package/es/i18n/index.js +1 -0
- package/es/i18n/index.mjs +5 -0
- package/es/i18n/resources/en/common.d.mts +35 -0
- package/es/i18n/resources/en/common.mjs +36 -0
- package/es/i18n/resources/en/common.mjs.map +1 -0
- package/es/i18n/resources/en/index.d.mts +7 -0
- package/es/i18n/resources/en/index.mjs +8 -0
- package/es/i18n/resources/en/index.mjs.map +1 -0
- package/es/i18n/resources/zhCn/common.d.mts +35 -0
- package/es/i18n/resources/zhCn/common.mjs +36 -0
- package/es/i18n/resources/zhCn/common.mjs.map +1 -0
- package/es/i18n/resources/zhCn/index.d.mts +7 -0
- package/es/i18n/resources/zhCn/index.mjs +8 -0
- package/es/i18n/resources/zhCn/index.mjs.map +1 -0
- package/es/i18n/types.d.mts +22 -0
- package/es/i18n/useTranslation.d.mts +12 -0
- package/es/i18n/useTranslation.mjs +22 -0
- package/es/i18n/useTranslation.mjs.map +1 -0
- package/es/index.d.mts +43 -0
- package/es/index.mjs +26 -0
- package/es/storybook/StoryBook/StoryBook.d.mts +7 -0
- package/es/storybook/StoryBook/StoryBook.mjs +52 -0
- package/es/storybook/StoryBook/StoryBook.mjs.map +1 -0
- package/es/storybook/StoryBook/index.d.mts +3 -0
- package/es/storybook/StoryBook/style.mjs +97 -0
- package/es/storybook/StoryBook/style.mjs.map +1 -0
- package/es/storybook/StoryBook/type.d.mts +13 -0
- package/es/storybook/index.d.mts +4 -0
- package/es/storybook/index.d.ts +1 -0
- package/es/storybook/index.js +1 -0
- package/es/storybook/index.mjs +2 -0
- package/es/styles/classNames.d.mts +11 -0
- package/es/styles/classNames.mjs +12 -0
- package/es/styles/classNames.mjs.map +1 -0
- package/es/styles/customTheme.d.mts +36 -0
- package/es/styles/customTheme.mjs +71 -0
- package/es/styles/customTheme.mjs.map +1 -0
- package/es/styles/index.d.mts +6 -0
- package/es/styles/index.d.ts +1 -0
- package/es/styles/index.js +1 -0
- package/es/styles/index.mjs +6 -0
- package/es/styles/theme/algorithms/darkAlgorithm.mjs +18 -0
- package/es/styles/theme/algorithms/darkAlgorithm.mjs.map +1 -0
- package/es/styles/theme/algorithms/lightAlgorithm.mjs +18 -0
- package/es/styles/theme/algorithms/lightAlgorithm.mjs.map +1 -0
- package/es/styles/theme/algorithms/resolveScales.mjs +25 -0
- package/es/styles/theme/algorithms/resolveScales.mjs.map +1 -0
- package/es/styles/theme/antdTheme.mjs +31 -0
- package/es/styles/theme/antdTheme.mjs.map +1 -0
- package/es/styles/theme/customStylish.d.mts +7 -0
- package/es/styles/theme/customStylish.mjs +158 -0
- package/es/styles/theme/customStylish.mjs.map +1 -0
- package/es/styles/theme/customStylishStatic.d.mts +6 -0
- package/es/styles/theme/customStylishStatic.mjs +156 -0
- package/es/styles/theme/customStylishStatic.mjs.map +1 -0
- package/es/styles/theme/customToken.d.mts +7 -0
- package/es/styles/theme/customToken.mjs +127 -0
- package/es/styles/theme/customToken.mjs.map +1 -0
- package/es/styles/theme/generateColorPalette.d.mts +16 -0
- package/es/styles/theme/generateColorPalette.mjs +170 -0
- package/es/styles/theme/generateColorPalette.mjs.map +1 -0
- package/es/styles/theme/token/base.mjs +64 -0
- package/es/styles/theme/token/base.mjs.map +1 -0
- package/es/styles/theme/token/dark.mjs +37 -0
- package/es/styles/theme/token/dark.mjs.map +1 -0
- package/es/styles/theme/token/light.mjs +37 -0
- package/es/styles/theme/token/light.mjs.map +1 -0
- package/es/types/customStylish.d.mts +28 -0
- package/es/types/customToken.d.mts +34 -0
- package/es/types/customToken.mjs +32 -0
- package/es/types/customToken.mjs.map +1 -0
- package/es/types/index.d.mts +15 -0
- package/es/types/index.d.ts +1 -0
- package/es/types/index.js +1 -0
- package/es/types/index.mjs +2 -0
- package/es/utils/composeEventHandlers.d.mts +5 -0
- package/es/utils/composeEventHandlers.mjs +10 -0
- package/es/utils/composeEventHandlers.mjs.map +1 -0
- package/es/utils/copyToClipboard.d.mts +5 -0
- package/es/utils/copyToClipboard.mjs +28 -0
- package/es/utils/copyToClipboard.mjs.map +1 -0
- package/es/utils/dom.d.mts +15 -0
- package/es/utils/dom.mjs +16 -0
- package/es/utils/dom.mjs.map +1 -0
- package/es/utils/genCdnUrl.d.mts +12 -0
- package/es/utils/genCdnUrl.mjs +17 -0
- package/es/utils/genCdnUrl.mjs.map +1 -0
- package/es/utils/safeReadableColor.mjs +6 -0
- package/es/utils/safeReadableColor.mjs.map +1 -0
- package/package.json +96 -0
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { getCssValue, getFlexDirection, isHorizontal, isSpaceDistribution } from "./utils.mjs";
|
|
3
|
+
import { jsx } from "react/jsx-runtime";
|
|
4
|
+
import { memo } from "react";
|
|
5
|
+
//#region src/Flex/FlexBasic.tsx
|
|
6
|
+
const BASE_CLASS = "superad-flex";
|
|
7
|
+
const FlexBasic = ({ visible, flex, gap, direction, horizontal, align, justify, distribution, height, width, allowShrink, padding, paddingInline, paddingBlock, prefixCls, as: Container = "div", className, style, children, wrap, ref, ...props }) => {
|
|
8
|
+
const justifyContent = justify || distribution;
|
|
9
|
+
const resolvedWidth = isHorizontal(direction, horizontal) && !width && isSpaceDistribution(justifyContent) ? "100%" : getCssValue(width);
|
|
10
|
+
const cssVarEntries = [
|
|
11
|
+
["--superad-flex", flex === void 0 ? void 0 : String(flex)],
|
|
12
|
+
["--superad-flex-direction", direction || horizontal ? getFlexDirection(direction, horizontal) : void 0],
|
|
13
|
+
["--superad-flex-wrap", wrap],
|
|
14
|
+
["--superad-flex-justify", justifyContent],
|
|
15
|
+
["--superad-flex-align", align],
|
|
16
|
+
["--superad-flex-width", resolvedWidth],
|
|
17
|
+
["--superad-flex-height", getCssValue(height)],
|
|
18
|
+
["--superad-flex-padding", getCssValue(padding)],
|
|
19
|
+
["--superad-flex-padding-inline", getCssValue(paddingInline)],
|
|
20
|
+
["--superad-flex-padding-block", getCssValue(paddingBlock)],
|
|
21
|
+
["--superad-flex-gap", getCssValue(gap)]
|
|
22
|
+
];
|
|
23
|
+
const mergedStyle = {
|
|
24
|
+
...Object.fromEntries(cssVarEntries.filter(([, value]) => value !== void 0)),
|
|
25
|
+
...allowShrink ? { minWidth: 0 } : {},
|
|
26
|
+
...style
|
|
27
|
+
};
|
|
28
|
+
const mergedClassName = [
|
|
29
|
+
BASE_CLASS,
|
|
30
|
+
visible === false ? `${BASE_CLASS}--hidden` : void 0,
|
|
31
|
+
prefixCls ? `${prefixCls}-flex` : void 0,
|
|
32
|
+
className
|
|
33
|
+
].filter(Boolean).join(" ");
|
|
34
|
+
return /* @__PURE__ */ jsx(Container, {
|
|
35
|
+
ref,
|
|
36
|
+
...props,
|
|
37
|
+
className: mergedClassName,
|
|
38
|
+
style: mergedStyle,
|
|
39
|
+
children
|
|
40
|
+
});
|
|
41
|
+
};
|
|
42
|
+
var FlexBasic_default = memo(FlexBasic);
|
|
43
|
+
//#endregion
|
|
44
|
+
export { FlexBasic_default as default };
|
|
45
|
+
|
|
46
|
+
//# sourceMappingURL=FlexBasic.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FlexBasic.mjs","names":[],"sources":["../../src/Flex/FlexBasic.tsx"],"sourcesContent":["'use client';\n\nimport { type CSSProperties, type ElementType, type FC, memo } from 'react';\n\nimport type { FlexBasicProps } from './type';\nimport { getCssValue, getFlexDirection, isHorizontal, isSpaceDistribution } from './utils';\n\nconst BASE_CLASS = 'superad-flex';\n\nconst FlexBasic: FC<FlexBasicProps> = ({\n visible,\n flex,\n gap,\n direction,\n horizontal,\n align,\n justify,\n distribution,\n height,\n width,\n allowShrink,\n padding,\n paddingInline,\n paddingBlock,\n prefixCls,\n as: Container = 'div' as ElementType,\n className,\n style,\n children,\n wrap,\n ref,\n ...props\n}) => {\n const justifyContent = justify || distribution;\n\n // 横向 + 空间均分时,容器必须撑满整行,均分才生效\n const resolvedWidth =\n isHorizontal(direction, horizontal) && !width && isSpaceDistribution(justifyContent)\n ? '100%'\n : getCssValue(width);\n\n const cssVarEntries: Array<[string, string | number | undefined]> = [\n ['--superad-flex', flex === undefined ? undefined : String(flex)],\n [\n '--superad-flex-direction',\n direction || horizontal ? getFlexDirection(direction, horizontal) : undefined,\n ],\n ['--superad-flex-wrap', wrap],\n ['--superad-flex-justify', justifyContent],\n ['--superad-flex-align', align],\n ['--superad-flex-width', resolvedWidth],\n ['--superad-flex-height', getCssValue(height)],\n ['--superad-flex-padding', getCssValue(padding)],\n ['--superad-flex-padding-inline', getCssValue(paddingInline)],\n ['--superad-flex-padding-block', getCssValue(paddingBlock)],\n ['--superad-flex-gap', getCssValue(gap)],\n ];\n\n const mergedStyle: CSSProperties = {\n ...Object.fromEntries(cssVarEntries.filter(([, value]) => value !== undefined)),\n ...(allowShrink ? { minWidth: 0 } : {}),\n ...style,\n } as CSSProperties;\n\n const mergedClassName = [\n BASE_CLASS,\n visible === false ? `${BASE_CLASS}--hidden` : undefined,\n prefixCls ? `${prefixCls}-flex` : undefined,\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n return (\n <Container ref={ref} {...props} className={mergedClassName} style={mergedStyle}>\n {children}\n </Container>\n );\n};\n\nexport default memo(FlexBasic);\n"],"mappings":";;;;;AAOA,MAAM,aAAa;AAEnB,MAAM,aAAiC,EACrC,SACA,MACA,KACA,WACA,YACA,OACA,SACA,cACA,QACA,OACA,aACA,SACA,eACA,cACA,WACA,IAAI,YAAY,OAChB,WACA,OACA,UACA,MACA,KACA,GAAG,YACC;CACJ,MAAM,iBAAiB,WAAW;CAGlC,MAAM,gBACJ,aAAa,WAAW,UAAU,KAAK,CAAC,SAAS,oBAAoB,cAAc,IAC/E,SACA,YAAY,KAAK;CAEvB,MAAM,gBAA8D;EAClE,CAAC,kBAAkB,SAAS,KAAA,IAAY,KAAA,IAAY,OAAO,IAAI,CAAC;EAChE,CACE,4BACA,aAAa,aAAa,iBAAiB,WAAW,UAAU,IAAI,KAAA,CACtE;EACA,CAAC,uBAAuB,IAAI;EAC5B,CAAC,0BAA0B,cAAc;EACzC,CAAC,wBAAwB,KAAK;EAC9B,CAAC,wBAAwB,aAAa;EACtC,CAAC,yBAAyB,YAAY,MAAM,CAAC;EAC7C,CAAC,0BAA0B,YAAY,OAAO,CAAC;EAC/C,CAAC,iCAAiC,YAAY,aAAa,CAAC;EAC5D,CAAC,gCAAgC,YAAY,YAAY,CAAC;EAC1D,CAAC,sBAAsB,YAAY,GAAG,CAAC;CACzC;CAEA,MAAM,cAA6B;EACjC,GAAG,OAAO,YAAY,cAAc,QAAQ,GAAG,WAAW,UAAU,KAAA,CAAS,CAAC;EAC9E,GAAI,cAAc,EAAE,UAAU,EAAE,IAAI,CAAC;EACrC,GAAG;CACL;CAEA,MAAM,kBAAkB;EACtB;EACA,YAAY,QAAQ,GAAG,WAAW,YAAY,KAAA;EAC9C,YAAY,GAAG,UAAU,SAAS,KAAA;EAClC;CACF,CAAC,CACE,OAAO,OAAO,CAAC,CACf,KAAK,GAAG;CAEX,OACE,oBAAC,WAAD;EAAgB;EAAK,GAAI;EAAO,WAAW;EAAiB,OAAO;EAChE;CACQ,CAAA;AAEf;AAEA,IAAA,oBAAe,KAAK,SAAS"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { CenterProps, ContentPosition, FlexBasicProps, FlexDirection, FlexboxProps } from "./type.mjs";
|
|
2
|
+
import Center from "./Center.mjs";
|
|
3
|
+
import _default from "./FlexBasic.mjs";
|
|
4
|
+
import "./Flexbox.mjs";
|
|
5
|
+
export { Center, type CenterProps, type ContentPosition, _default as FlexBasic, type FlexBasicProps, type FlexDirection, _default as Flexbox, type FlexboxProps };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './index.d.mts';
|
package/es/Flex/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './index.mjs';
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { CSSProperties, DOMAttributes, ElementType, HTMLAttributes, ReactNode, Ref } from "react";
|
|
2
|
+
//#region src/Flex/type.d.ts
|
|
3
|
+
type ContentPosition = 'center' | 'end' | 'flex-end' | 'flex-start' | 'start' | 'stretch' | 'baseline';
|
|
4
|
+
type FlexDirection = 'vertical' | 'vertical-reverse' | 'horizontal' | 'horizontal-reverse';
|
|
5
|
+
type DivProps = DOMAttributes<HTMLDivElement> & HTMLAttributes<HTMLDivElement>;
|
|
6
|
+
type CommonSpaceNumber = 2 | 4 | 8 | 12 | 16 | 24;
|
|
7
|
+
interface IFlexbox {
|
|
8
|
+
align?: ContentPosition;
|
|
9
|
+
allowShrink?: boolean;
|
|
10
|
+
as?: ElementType;
|
|
11
|
+
children?: ReactNode;
|
|
12
|
+
className?: string;
|
|
13
|
+
direction?: FlexDirection;
|
|
14
|
+
distribution?: CSSProperties['justifyContent'];
|
|
15
|
+
flex?: number | string;
|
|
16
|
+
gap?: CommonSpaceNumber | number | string;
|
|
17
|
+
height?: number | string;
|
|
18
|
+
horizontal?: boolean;
|
|
19
|
+
justify?: CSSProperties['justifyContent'];
|
|
20
|
+
padding?: string | number | CommonSpaceNumber;
|
|
21
|
+
paddingBlock?: string | number;
|
|
22
|
+
paddingInline?: string | number;
|
|
23
|
+
prefixCls?: string;
|
|
24
|
+
ref?: Ref<HTMLElement>;
|
|
25
|
+
style?: CSSProperties;
|
|
26
|
+
visible?: boolean;
|
|
27
|
+
width?: number | string;
|
|
28
|
+
wrap?: CSSProperties['flexWrap'];
|
|
29
|
+
}
|
|
30
|
+
interface FlexBasicProps extends IFlexbox, DivProps {}
|
|
31
|
+
type FlexboxProps = FlexBasicProps;
|
|
32
|
+
type CenterProps = Omit<FlexBasicProps, 'distribution' | 'direction' | 'align'>;
|
|
33
|
+
//#endregion
|
|
34
|
+
export { CenterProps, CommonSpaceNumber, ContentPosition, DivProps, FlexBasicProps, FlexDirection, FlexboxProps, IFlexbox };
|
|
35
|
+
//# sourceMappingURL=type.d.mts.map
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
//#region src/Flex/utils.ts
|
|
2
|
+
const DIRECTION_TO_CSS = {
|
|
3
|
+
"horizontal": "row",
|
|
4
|
+
"horizontal-reverse": "row-reverse",
|
|
5
|
+
"vertical": "column",
|
|
6
|
+
"vertical-reverse": "column-reverse"
|
|
7
|
+
};
|
|
8
|
+
const getFlexDirection = (direction, isHorizontal) => {
|
|
9
|
+
if (isHorizontal) return "row";
|
|
10
|
+
return DIRECTION_TO_CSS[direction ?? "vertical"];
|
|
11
|
+
};
|
|
12
|
+
const SPACE_DISTRIBUTIONS = /* @__PURE__ */ new Set([
|
|
13
|
+
"space-between",
|
|
14
|
+
"space-around",
|
|
15
|
+
"space-evenly"
|
|
16
|
+
]);
|
|
17
|
+
const isSpaceDistribution = (distribution) => distribution ? SPACE_DISTRIBUTIONS.has(distribution) : void 0;
|
|
18
|
+
const isHorizontal = (direction, isHorizontalMode) => getFlexDirection(direction, isHorizontalMode) === "row";
|
|
19
|
+
/** 数字一律按 px 处理,字符串原样透传。 */
|
|
20
|
+
const getCssValue = (value) => typeof value === "number" ? `${value}px` : value;
|
|
21
|
+
//#endregion
|
|
22
|
+
export { getCssValue, getFlexDirection, isHorizontal, isSpaceDistribution };
|
|
23
|
+
|
|
24
|
+
//# sourceMappingURL=utils.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.mjs","names":[],"sources":["../../src/Flex/utils.ts"],"sourcesContent":["import type { FlexDirection } from './type';\n\nconst DEFAULT_PREFIX = 'superad';\n\nexport const getPrefix = (prefixCls?: string) => prefixCls || DEFAULT_PREFIX;\n\nconst DIRECTION_TO_CSS: Record<FlexDirection, string> = {\n 'horizontal': 'row',\n 'horizontal-reverse': 'row-reverse',\n 'vertical': 'column',\n 'vertical-reverse': 'column-reverse',\n};\n\nexport const getFlexDirection = (direction?: FlexDirection, isHorizontal?: boolean) => {\n if (isHorizontal) return 'row';\n return DIRECTION_TO_CSS[direction ?? 'vertical'];\n};\n\nconst SPACE_DISTRIBUTIONS = new Set(['space-between', 'space-around', 'space-evenly']);\n\nexport const isSpaceDistribution = (distribution?: string) =>\n distribution ? SPACE_DISTRIBUTIONS.has(distribution) : undefined;\n\nexport const isHorizontal = (direction?: FlexDirection, isHorizontalMode?: boolean) =>\n getFlexDirection(direction, isHorizontalMode) === 'row';\n\nexport const isVertical = (direction?: FlexDirection, isHorizontalMode?: boolean) =>\n getFlexDirection(direction, isHorizontalMode) === 'column';\n\n/** 数字一律按 px 处理,字符串原样透传。 */\nexport const getCssValue = (value: string | number | undefined) =>\n typeof value === 'number' ? `${value}px` : value;\n"],"mappings":";AAMA,MAAM,mBAAkD;CACtD,cAAc;CACd,sBAAsB;CACtB,YAAY;CACZ,oBAAoB;AACtB;AAEA,MAAa,oBAAoB,WAA2B,iBAA2B;CACrF,IAAI,cAAc,OAAO;CACzB,OAAO,iBAAiB,aAAa;AACvC;AAEA,MAAM,sCAAsB,IAAI,IAAI;CAAC;CAAiB;CAAgB;AAAc,CAAC;AAErF,MAAa,uBAAuB,iBAClC,eAAe,oBAAoB,IAAI,YAAY,IAAI,KAAA;AAEzD,MAAa,gBAAgB,WAA2B,qBACtD,iBAAiB,WAAW,gBAAgB,MAAM;;AAMpD,MAAa,eAAe,UAC1B,OAAO,UAAU,WAAW,GAAG,MAAM,MAAM"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
//#region src/FontLoader/index.d.ts
|
|
2
|
+
interface FontLoaderProps {
|
|
3
|
+
url: string;
|
|
4
|
+
}
|
|
5
|
+
/** 以 <link rel="stylesheet"> 方式挂载一份字体资源,随组件卸载移除。 */
|
|
6
|
+
declare const FontLoader: import("react").NamedExoticComponent<FontLoaderProps>;
|
|
7
|
+
//#endregion
|
|
8
|
+
export { FontLoaderProps, FontLoader as default };
|
|
9
|
+
//# sourceMappingURL=index.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './index.d.mts';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './index.mjs';
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { memo, useEffect } from "react";
|
|
3
|
+
//#region src/FontLoader/index.tsx
|
|
4
|
+
/** 以 <link rel="stylesheet"> 方式挂载一份字体资源,随组件卸载移除。 */
|
|
5
|
+
const FontLoader = memo(({ url }) => {
|
|
6
|
+
useEffect(() => {
|
|
7
|
+
const link = document.createElement("link");
|
|
8
|
+
link.rel = "stylesheet";
|
|
9
|
+
link.href = url;
|
|
10
|
+
link.onerror = () => console.error(`Failed to load font from ${url}`);
|
|
11
|
+
document.head.append(link);
|
|
12
|
+
return () => {
|
|
13
|
+
link.onerror = null;
|
|
14
|
+
link.remove();
|
|
15
|
+
};
|
|
16
|
+
}, [url]);
|
|
17
|
+
return null;
|
|
18
|
+
});
|
|
19
|
+
FontLoader.displayName = "FontLoader";
|
|
20
|
+
//#endregion
|
|
21
|
+
export { FontLoader as default };
|
|
22
|
+
|
|
23
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../../src/FontLoader/index.tsx"],"sourcesContent":["'use client';\n\nimport { memo, useEffect } from 'react';\n\nexport interface FontLoaderProps {\n url: string;\n}\n\n/** 以 <link rel=\"stylesheet\"> 方式挂载一份字体资源,随组件卸载移除。 */\nconst FontLoader = memo<FontLoaderProps>(({ url }) => {\n useEffect(() => {\n const link = document.createElement('link');\n link.rel = 'stylesheet';\n link.href = url;\n link.onerror = () => console.error(`Failed to load font from ${url}`);\n document.head.append(link);\n\n return () => {\n link.onerror = null;\n link.remove();\n };\n }, [url]);\n\n return null;\n});\n\nFontLoader.displayName = 'FontLoader';\n\nexport default FontLoader;\n"],"mappings":";;;;AASA,MAAM,aAAa,MAAuB,EAAE,UAAU;CACpD,gBAAgB;EACd,MAAM,OAAO,SAAS,cAAc,MAAM;EAC1C,KAAK,MAAM;EACX,KAAK,OAAO;EACZ,KAAK,gBAAgB,QAAQ,MAAM,4BAA4B,KAAK;EACpE,SAAS,KAAK,OAAO,IAAI;EAEzB,aAAa;GACX,KAAK,UAAU;GACf,KAAK,OAAO;EACd;CACF,GAAG,CAAC,GAAG,CAAC;CAER,OAAO;AACT,CAAC;AAED,WAAW,cAAc"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './index.d.mts';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './index.mjs';
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
import { globalFocusRingCSS } from "./style.mjs";
|
|
2
|
+
//#region src/GlobalFocusRing/index.ts
|
|
3
|
+
const RING_ATTRIBUTE = "data-superad-global-focus-ring";
|
|
4
|
+
const MANAGED_ATTRIBUTE = "data-superad-focus-ring";
|
|
5
|
+
const OPT_OUT_SELECTOR = "[data-superad-focus-ring=\"off\"]";
|
|
6
|
+
const ANCHOR_NAME = "--superad-global-focus";
|
|
7
|
+
const FALLBACK_RING_COLOR = "#1677ff";
|
|
8
|
+
/** 这些 input 类型本身是可点按控件,需要焦点环;文本类输入不需要。 */
|
|
9
|
+
const RING_INPUT_TYPES = /* @__PURE__ */ new Set([
|
|
10
|
+
"button",
|
|
11
|
+
"submit",
|
|
12
|
+
"reset",
|
|
13
|
+
"image",
|
|
14
|
+
"checkbox",
|
|
15
|
+
"radio",
|
|
16
|
+
"range",
|
|
17
|
+
"color",
|
|
18
|
+
"file"
|
|
19
|
+
]);
|
|
20
|
+
/** 当前环境是否支持锚点定位 + popover 这套实现。 */
|
|
21
|
+
const isSupported = (doc) => {
|
|
22
|
+
const win = doc.defaultView;
|
|
23
|
+
return Boolean(win?.CSS?.supports("top", "anchor(top)") && win.CSS.supports("position-visibility", "anchors-visible") && "showPopover" in doc.createElement("div"));
|
|
24
|
+
};
|
|
25
|
+
/** 该元素是否值得挂焦点环。 */
|
|
26
|
+
const isRingTarget = (element, doc) => {
|
|
27
|
+
if (!element || element === doc.body) return false;
|
|
28
|
+
if (element.namespaceURI !== "http://www.w3.org/1999/xhtml") return false;
|
|
29
|
+
if (element.shadowRoot) return false;
|
|
30
|
+
if (element.closest(OPT_OUT_SELECTOR)) return false;
|
|
31
|
+
if (element.matches("textarea")) return false;
|
|
32
|
+
if (element.isContentEditable) return false;
|
|
33
|
+
if (element.matches("input") && !RING_INPUT_TYPES.has(element.type)) return false;
|
|
34
|
+
return element.matches(":focus-visible");
|
|
35
|
+
};
|
|
36
|
+
/** 单个文档内的焦点环控制器:一个 ring 元素跟随当前 :focus-visible 元素。 */
|
|
37
|
+
var FocusRingController = class FocusRingController {
|
|
38
|
+
constructor(doc) {
|
|
39
|
+
this.frame = 0;
|
|
40
|
+
this.disposed = false;
|
|
41
|
+
this.dispose = () => {
|
|
42
|
+
this.disposed = true;
|
|
43
|
+
this.win.cancelAnimationFrame(this.frame);
|
|
44
|
+
this.observer.disconnect();
|
|
45
|
+
this.doc.removeEventListener("focusin", this.handleFocusIn, true);
|
|
46
|
+
this.doc.removeEventListener("focusout", this.schedule, true);
|
|
47
|
+
this.doc.removeEventListener("keydown", this.schedule, true);
|
|
48
|
+
this.doc.removeEventListener("pointerdown", this.schedule, true);
|
|
49
|
+
this.win.removeEventListener("blur", this.handleWindowBlur);
|
|
50
|
+
this.win.removeEventListener("focus", this.schedule);
|
|
51
|
+
this.clear();
|
|
52
|
+
this.ring.remove();
|
|
53
|
+
this.sheet.remove();
|
|
54
|
+
};
|
|
55
|
+
this.handleFocusIn = () => this.win.queueMicrotask(() => this.sync());
|
|
56
|
+
this.handleWindowBlur = () => {
|
|
57
|
+
this.win.cancelAnimationFrame(this.frame);
|
|
58
|
+
this.frame = 0;
|
|
59
|
+
if (this.ring.matches(":popover-open")) this.ring.hidePopover();
|
|
60
|
+
};
|
|
61
|
+
this.schedule = () => {
|
|
62
|
+
if (this.frame) return;
|
|
63
|
+
this.frame = this.win.requestAnimationFrame(() => {
|
|
64
|
+
this.frame = 0;
|
|
65
|
+
this.sync();
|
|
66
|
+
});
|
|
67
|
+
};
|
|
68
|
+
this.syncNow = () => this.sync();
|
|
69
|
+
this.clear = () => {
|
|
70
|
+
if (this.ring.matches(":popover-open")) this.ring.hidePopover();
|
|
71
|
+
this.restoreTarget?.();
|
|
72
|
+
this.restoreTarget = void 0;
|
|
73
|
+
this.target = void 0;
|
|
74
|
+
};
|
|
75
|
+
this.sync = () => {
|
|
76
|
+
if (this.disposed) return;
|
|
77
|
+
const next = this.doc.activeElement;
|
|
78
|
+
if (next === this.target && next?.matches(":focus-visible") && next.isConnected && this.ring.matches(":popover-open")) return;
|
|
79
|
+
this.clear();
|
|
80
|
+
if (!isRingTarget(next, this.doc)) return;
|
|
81
|
+
const element = next;
|
|
82
|
+
const ringParent = this.resolveRingParent(element);
|
|
83
|
+
const moved = this.ring.parentElement !== ringParent;
|
|
84
|
+
if (moved) ringParent.append(this.ring);
|
|
85
|
+
const computed = this.win.getComputedStyle(element);
|
|
86
|
+
const borderRadius = computed.borderRadius;
|
|
87
|
+
const color = computed.getPropertyValue("--superad-focus-ring-color").trim() || computed.getPropertyValue("--ant-color-info").trim() || FALLBACK_RING_COLOR;
|
|
88
|
+
const styleChanged = this.ring.style.borderRadius !== borderRadius || this.ring.style.getPropertyValue("--superad-focus-ring-color") !== color;
|
|
89
|
+
if (styleChanged) {
|
|
90
|
+
this.ring.style.borderRadius = borderRadius;
|
|
91
|
+
this.ring.style.setProperty("--superad-focus-ring-color", color);
|
|
92
|
+
}
|
|
93
|
+
if (moved || styleChanged) {
|
|
94
|
+
this.schedule();
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
const saved = ["anchor-name", "outline"].map((property) => ({
|
|
98
|
+
priority: element.style.getPropertyPriority(property),
|
|
99
|
+
property,
|
|
100
|
+
value: element.style.getPropertyValue(property)
|
|
101
|
+
}));
|
|
102
|
+
const oldMarker = element.getAttribute(MANAGED_ATTRIBUTE);
|
|
103
|
+
const existingAnchor = computed.getPropertyValue("anchor-name").trim();
|
|
104
|
+
const assignedAnchor = existingAnchor && existingAnchor !== "none" ? `${existingAnchor}, ${ANCHOR_NAME}` : ANCHOR_NAME;
|
|
105
|
+
element.style.setProperty("anchor-name", assignedAnchor, "important");
|
|
106
|
+
this.restoreTarget = () => FocusRingController.restoreInlineStyles(element, saved, assignedAnchor, oldMarker);
|
|
107
|
+
const rect = element.getBoundingClientRect();
|
|
108
|
+
if (!(element.getClientRects().length === 1 && Boolean(rect.width) && Boolean(rect.height) && computed.visibility === "visible")) {
|
|
109
|
+
this.clear();
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
try {
|
|
113
|
+
this.ring.showPopover();
|
|
114
|
+
const bounds = this.ring.getBoundingClientRect();
|
|
115
|
+
if (Math.max(...[
|
|
116
|
+
"top",
|
|
117
|
+
"right",
|
|
118
|
+
"bottom",
|
|
119
|
+
"left"
|
|
120
|
+
].map((edge) => Math.abs(bounds[edge] - rect[edge]))) > 1) {
|
|
121
|
+
this.clear();
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
element.style.setProperty("outline", "none", "important");
|
|
125
|
+
element.setAttribute(MANAGED_ATTRIBUTE, "managed");
|
|
126
|
+
this.target = element;
|
|
127
|
+
} catch {
|
|
128
|
+
this.clear();
|
|
129
|
+
}
|
|
130
|
+
};
|
|
131
|
+
this.doc = doc;
|
|
132
|
+
this.win = doc.defaultView;
|
|
133
|
+
this.sheet = doc.createElement("style");
|
|
134
|
+
this.sheet.textContent = globalFocusRingCSS;
|
|
135
|
+
this.ring = doc.createElement("div");
|
|
136
|
+
this.ring.setAttribute(RING_ATTRIBUTE, "");
|
|
137
|
+
this.ring.setAttribute("aria-hidden", "true");
|
|
138
|
+
this.ring.setAttribute("popover", "manual");
|
|
139
|
+
doc.head.append(this.sheet);
|
|
140
|
+
doc.body.append(this.ring);
|
|
141
|
+
this.observer = new MutationObserver(() => {
|
|
142
|
+
if (this.target && !this.target.isConnected) this.clear();
|
|
143
|
+
});
|
|
144
|
+
this.observer.observe(doc.body, {
|
|
145
|
+
childList: true,
|
|
146
|
+
subtree: true
|
|
147
|
+
});
|
|
148
|
+
doc.addEventListener("focusin", this.handleFocusIn, true);
|
|
149
|
+
doc.addEventListener("focusout", this.schedule, true);
|
|
150
|
+
doc.addEventListener("keydown", this.schedule, true);
|
|
151
|
+
doc.addEventListener("pointerdown", this.schedule, true);
|
|
152
|
+
this.win.addEventListener("blur", this.handleWindowBlur);
|
|
153
|
+
this.win.addEventListener("focus", this.schedule);
|
|
154
|
+
}
|
|
155
|
+
/** 找到 ring 应该挂的父节点:向上跳过 contain: none 的祖先。 */
|
|
156
|
+
resolveRingParent(element) {
|
|
157
|
+
let scope = element.parentElement;
|
|
158
|
+
while (scope && this.win.getComputedStyle(scope).contain === "none") scope = scope.parentElement;
|
|
159
|
+
return scope || this.doc.body;
|
|
160
|
+
}
|
|
161
|
+
/** 把目标元素的内联样式/标记改回去,仅当值仍是我们写入的那个。 */
|
|
162
|
+
static restoreInlineStyles(element, saved, assignedAnchor, oldMarker) {
|
|
163
|
+
for (const { property, value, priority } of saved) {
|
|
164
|
+
const assigned = property === "anchor-name" ? assignedAnchor : "none";
|
|
165
|
+
if (element.style.getPropertyValue(property) !== assigned) continue;
|
|
166
|
+
if (value) element.style.setProperty(property, value, priority);
|
|
167
|
+
else element.style.removeProperty(property);
|
|
168
|
+
}
|
|
169
|
+
if (element.getAttribute(MANAGED_ATTRIBUTE) === "managed") {
|
|
170
|
+
if (oldMarker === null) element.removeAttribute(MANAGED_ATTRIBUTE);
|
|
171
|
+
else element.setAttribute(MANAGED_ATTRIBUTE, oldMarker);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
};
|
|
175
|
+
const installations = /* @__PURE__ */ new WeakMap();
|
|
176
|
+
/** 每个 document 安装一次;返回的释放函数对嵌套 Provider 与 Strict Mode 安全。 */
|
|
177
|
+
const installGlobalFocusRing = (doc = document) => {
|
|
178
|
+
const existing = installations.get(doc);
|
|
179
|
+
if (existing) {
|
|
180
|
+
existing.users += 1;
|
|
181
|
+
let released = false;
|
|
182
|
+
return () => {
|
|
183
|
+
if (released) return;
|
|
184
|
+
released = true;
|
|
185
|
+
existing.users -= 1;
|
|
186
|
+
if (existing.users === 0) {
|
|
187
|
+
existing.controller.dispose();
|
|
188
|
+
installations.delete(doc);
|
|
189
|
+
}
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
if (!isSupported(doc) || !doc.body) return () => {};
|
|
193
|
+
const controller = new FocusRingController(doc);
|
|
194
|
+
installations.set(doc, {
|
|
195
|
+
controller,
|
|
196
|
+
users: 0
|
|
197
|
+
});
|
|
198
|
+
controller.syncNow();
|
|
199
|
+
return installGlobalFocusRing(doc);
|
|
200
|
+
};
|
|
201
|
+
//#endregion
|
|
202
|
+
export { installGlobalFocusRing };
|
|
203
|
+
|
|
204
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../../src/GlobalFocusRing/index.ts"],"sourcesContent":["import { globalFocusRingCSS } from './style';\n\nconst RING_ATTRIBUTE = 'data-superad-global-focus-ring';\nconst MANAGED_ATTRIBUTE = 'data-superad-focus-ring';\nconst OPT_OUT_SELECTOR = '[data-superad-focus-ring=\"off\"]';\nconst ANCHOR_NAME = '--superad-global-focus';\nconst FALLBACK_RING_COLOR = '#1677ff';\n\n/** 这些 input 类型本身是可点按控件,需要焦点环;文本类输入不需要。 */\nconst RING_INPUT_TYPES = new Set([\n 'button',\n 'submit',\n 'reset',\n 'image',\n 'checkbox',\n 'radio',\n 'range',\n 'color',\n 'file',\n]);\n\n/** 当前环境是否支持锚点定位 + popover 这套实现。 */\nconst isSupported = (doc: Document): boolean => {\n const win = doc.defaultView;\n return Boolean(\n win?.CSS?.supports('top', 'anchor(top)') &&\n win.CSS.supports('position-visibility', 'anchors-visible') &&\n 'showPopover' in doc.createElement('div'),\n );\n};\n\n/** 该元素是否值得挂焦点环。 */\nconst isRingTarget = (element: Element | null, doc: Document): element is HTMLElement => {\n if (!element || element === doc.body) return false;\n if (element.namespaceURI !== 'http://www.w3.org/1999/xhtml') return false;\n if (element.shadowRoot) return false;\n if (element.closest(OPT_OUT_SELECTOR)) return false;\n if (element.matches('textarea')) return false;\n if ((element as HTMLElement).isContentEditable) return false;\n if (element.matches('input') && !RING_INPUT_TYPES.has((element as HTMLInputElement).type))\n return false;\n return element.matches(':focus-visible');\n};\n\ninterface InlineStyleSnapshot {\n priority: string;\n property: string;\n value: string;\n}\n\n/** 单个文档内的焦点环控制器:一个 ring 元素跟随当前 :focus-visible 元素。 */\nclass FocusRingController {\n private readonly doc: Document;\n private readonly win: Window;\n private readonly sheet: HTMLStyleElement;\n private readonly ring: HTMLDivElement;\n\n private target?: HTMLElement;\n private restoreTarget?: () => void;\n private frame = 0;\n private disposed = false;\n private readonly observer: MutationObserver;\n\n constructor(doc: Document) {\n this.doc = doc;\n this.win = doc.defaultView!;\n\n this.sheet = doc.createElement('style');\n this.sheet.textContent = globalFocusRingCSS;\n this.ring = doc.createElement('div');\n this.ring.setAttribute(RING_ATTRIBUTE, '');\n this.ring.setAttribute('aria-hidden', 'true');\n this.ring.setAttribute('popover', 'manual');\n doc.head.append(this.sheet);\n doc.body.append(this.ring);\n\n this.observer = new MutationObserver(() => {\n if (this.target && !this.target.isConnected) this.clear();\n });\n this.observer.observe(doc.body, { childList: true, subtree: true });\n\n doc.addEventListener('focusin', this.handleFocusIn, true);\n doc.addEventListener('focusout', this.schedule, true);\n doc.addEventListener('keydown', this.schedule, true);\n doc.addEventListener('pointerdown', this.schedule, true);\n this.win.addEventListener('blur', this.handleWindowBlur);\n this.win.addEventListener('focus', this.schedule);\n }\n\n dispose = () => {\n this.disposed = true;\n this.win.cancelAnimationFrame(this.frame);\n this.observer.disconnect();\n this.doc.removeEventListener('focusin', this.handleFocusIn, true);\n this.doc.removeEventListener('focusout', this.schedule, true);\n this.doc.removeEventListener('keydown', this.schedule, true);\n this.doc.removeEventListener('pointerdown', this.schedule, true);\n this.win.removeEventListener('blur', this.handleWindowBlur);\n this.win.removeEventListener('focus', this.schedule);\n this.clear();\n this.ring.remove();\n this.sheet.remove();\n };\n\n private handleFocusIn = () => this.win.queueMicrotask(() => this.sync());\n\n private handleWindowBlur = () => {\n this.win.cancelAnimationFrame(this.frame);\n this.frame = 0;\n if (this.ring.matches(':popover-open')) this.ring.hidePopover();\n };\n\n private schedule = () => {\n if (this.frame) return;\n this.frame = this.win.requestAnimationFrame(() => {\n this.frame = 0;\n this.sync();\n });\n };\n\n /** 安装后立即对齐一次当前焦点。 */\n syncNow = () => this.sync();\n\n private clear = () => {\n if (this.ring.matches(':popover-open')) this.ring.hidePopover();\n this.restoreTarget?.();\n this.restoreTarget = undefined;\n this.target = undefined;\n };\n\n /** 找到 ring 应该挂的父节点:向上跳过 contain: none 的祖先。 */\n private resolveRingParent(element: HTMLElement): HTMLElement {\n let scope = element.parentElement;\n while (scope && this.win.getComputedStyle(scope).contain === 'none')\n scope = scope.parentElement;\n return scope || this.doc.body;\n }\n\n /** 把目标元素的内联样式/标记改回去,仅当值仍是我们写入的那个。 */\n private static restoreInlineStyles(\n element: HTMLElement,\n saved: InlineStyleSnapshot[],\n assignedAnchor: string,\n oldMarker: string | null,\n ) {\n for (const { property, value, priority } of saved) {\n const assigned = property === 'anchor-name' ? assignedAnchor : 'none';\n if (element.style.getPropertyValue(property) !== assigned) continue;\n if (value) element.style.setProperty(property, value, priority);\n else element.style.removeProperty(property);\n }\n if (element.getAttribute(MANAGED_ATTRIBUTE) === 'managed') {\n if (oldMarker === null) element.removeAttribute(MANAGED_ATTRIBUTE);\n else element.setAttribute(MANAGED_ATTRIBUTE, oldMarker);\n }\n }\n\n private sync = () => {\n if (this.disposed) return;\n const next = this.doc.activeElement;\n\n const alreadyShowing =\n next === this.target &&\n next?.matches(':focus-visible') &&\n next.isConnected &&\n this.ring.matches(':popover-open');\n if (alreadyShowing) return;\n\n this.clear();\n if (!isRingTarget(next, this.doc)) return;\n\n const element = next;\n const ringParent = this.resolveRingParent(element);\n const moved = this.ring.parentElement !== ringParent;\n if (moved) ringParent.append(this.ring);\n\n const computed = this.win.getComputedStyle(element);\n const borderRadius = computed.borderRadius;\n const color =\n computed.getPropertyValue('--superad-focus-ring-color').trim() ||\n computed.getPropertyValue('--ant-color-info').trim() ||\n FALLBACK_RING_COLOR;\n const styleChanged =\n this.ring.style.borderRadius !== borderRadius ||\n this.ring.style.getPropertyValue('--superad-focus-ring-color') !== color;\n if (styleChanged) {\n this.ring.style.borderRadius = borderRadius;\n this.ring.style.setProperty('--superad-focus-ring-color', color);\n }\n // 刚移动或刚改样式时锚点还没生效,下一帧再同步\n if (moved || styleChanged) {\n this.schedule();\n return;\n }\n\n const saved: InlineStyleSnapshot[] = ['anchor-name', 'outline'].map((property) => ({\n priority: element.style.getPropertyPriority(property),\n property,\n value: element.style.getPropertyValue(property),\n }));\n const oldMarker = element.getAttribute(MANAGED_ATTRIBUTE);\n const existingAnchor = computed.getPropertyValue('anchor-name').trim();\n const assignedAnchor =\n existingAnchor && existingAnchor !== 'none'\n ? `${existingAnchor}, ${ANCHOR_NAME}`\n : ANCHOR_NAME;\n element.style.setProperty('anchor-name', assignedAnchor, 'important');\n\n this.restoreTarget = () =>\n FocusRingController.restoreInlineStyles(element, saved, assignedAnchor, oldMarker);\n\n const rect = element.getBoundingClientRect();\n const hasUsableBox =\n element.getClientRects().length === 1 &&\n Boolean(rect.width) &&\n Boolean(rect.height) &&\n computed.visibility === 'visible';\n if (!hasUsableBox) {\n this.clear();\n return;\n }\n\n try {\n this.ring.showPopover();\n const bounds = this.ring.getBoundingClientRect();\n const maxEdgeDelta = Math.max(\n ...(['top', 'right', 'bottom', 'left'] as const).map((edge) =>\n Math.abs(bounds[edge] - rect[edge]),\n ),\n );\n // 锚点没对齐(比如目标在 transform 容器里)就放弃,不显示错位的环\n if (maxEdgeDelta > 1) {\n this.clear();\n return;\n }\n element.style.setProperty('outline', 'none', 'important');\n element.setAttribute(MANAGED_ATTRIBUTE, 'managed');\n this.target = element;\n } catch {\n this.clear();\n }\n };\n}\n\nconst installations = new WeakMap<Document, { controller: FocusRingController; users: number }>();\n\n/** 每个 document 安装一次;返回的释放函数对嵌套 Provider 与 Strict Mode 安全。 */\nexport const installGlobalFocusRing = (doc: Document = document): (() => void) => {\n const existing = installations.get(doc);\n if (existing) {\n existing.users += 1;\n let released = false;\n return () => {\n if (released) return;\n released = true;\n existing.users -= 1;\n if (existing.users === 0) {\n existing.controller.dispose();\n installations.delete(doc);\n }\n };\n }\n\n if (!isSupported(doc) || !doc.body) return () => {};\n\n const controller = new FocusRingController(doc);\n installations.set(doc, { controller, users: 0 });\n controller.syncNow();\n // 走一遍上面的引用计数分支,拿到释放函数\n return installGlobalFocusRing(doc);\n};\n"],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
//#region src/GlobalFocusRing/style.ts
|
|
2
|
+
const focusRingColor = (color) => `color-mix(in srgb, ${color} 90%, transparent)`;
|
|
3
|
+
const globalFocusRingCSS = `
|
|
4
|
+
[data-superad-global-focus-ring] {
|
|
5
|
+
all: initial;
|
|
6
|
+
position: fixed;
|
|
7
|
+
position-anchor: --superad-global-focus;
|
|
8
|
+
top: anchor(top);
|
|
9
|
+
right: anchor(right);
|
|
10
|
+
bottom: anchor(bottom);
|
|
11
|
+
left: anchor(left);
|
|
12
|
+
position-visibility: anchors-visible;
|
|
13
|
+
pointer-events: none;
|
|
14
|
+
border-radius: inherit;
|
|
15
|
+
outline: 2px solid ${focusRingColor("var(--superad-focus-ring-color)")};
|
|
16
|
+
outline-offset: 2px;
|
|
17
|
+
animation: superad-global-focus-in 200ms cubic-bezier(0.22, 1, 0.36, 1);
|
|
18
|
+
}
|
|
19
|
+
[data-superad-global-focus-ring]:not(:popover-open) { display: none; }
|
|
20
|
+
[data-superad-global-focus-ring]::backdrop { background: transparent; pointer-events: none; }
|
|
21
|
+
@keyframes superad-global-focus-in {
|
|
22
|
+
from { opacity: 0.25; outline-offset: 5px; }
|
|
23
|
+
to { opacity: 1; outline-offset: 2px; }
|
|
24
|
+
}
|
|
25
|
+
@media (prefers-reduced-motion: reduce) {
|
|
26
|
+
[data-superad-global-focus-ring] { animation: none; }
|
|
27
|
+
}
|
|
28
|
+
@media (forced-colors: active) {
|
|
29
|
+
[data-superad-global-focus-ring] { outline-color: CanvasText; animation: none; }
|
|
30
|
+
}
|
|
31
|
+
`;
|
|
32
|
+
//#endregion
|
|
33
|
+
export { focusRingColor, globalFocusRingCSS };
|
|
34
|
+
|
|
35
|
+
//# sourceMappingURL=style.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"style.mjs","names":[],"sources":["../../src/GlobalFocusRing/style.ts"],"sourcesContent":["export const focusRingColor = (color: string) => `color-mix(in srgb, ${color} 90%, transparent)`;\n\nexport const globalFocusRingCSS = `\n[data-superad-global-focus-ring] {\n all: initial;\n position: fixed;\n position-anchor: --superad-global-focus;\n top: anchor(top);\n right: anchor(right);\n bottom: anchor(bottom);\n left: anchor(left);\n position-visibility: anchors-visible;\n pointer-events: none;\n border-radius: inherit;\n outline: 2px solid ${focusRingColor('var(--superad-focus-ring-color)')};\n outline-offset: 2px;\n animation: superad-global-focus-in 200ms cubic-bezier(0.22, 1, 0.36, 1);\n}\n[data-superad-global-focus-ring]:not(:popover-open) { display: none; }\n[data-superad-global-focus-ring]::backdrop { background: transparent; pointer-events: none; }\n@keyframes superad-global-focus-in {\n from { opacity: 0.25; outline-offset: 5px; }\n to { opacity: 1; outline-offset: 2px; }\n}\n@media (prefers-reduced-motion: reduce) {\n [data-superad-global-focus-ring] { animation: none; }\n}\n@media (forced-colors: active) {\n [data-superad-global-focus-ring] { outline-color: CanvasText; animation: none; }\n}\n`;\n"],"mappings":";AAAA,MAAa,kBAAkB,UAAkB,sBAAsB,MAAM;AAE7E,MAAa,qBAAqB;;;;;;;;;;;;uBAYX,eAAe,iCAAiC,EAAE"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { I18nProviderProps } from "./i18n/types.mjs";
|
|
2
|
+
import { useI18n } from "./ConfigProvider/index.mjs";
|
|
3
|
+
import { I18nProvider } from "./i18n/context.mjs";
|
|
4
|
+
import { useTranslation } from "./i18n/useTranslation.mjs";
|
|
5
|
+
export { I18nProvider, type I18nProviderProps, I18nProvider as SuperadUIProvider, useTranslation };
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { TABLE_CHROME, resolveTableCanvasPalette } from "./theme.mjs";
|
|
3
|
+
//#region src/Table/canvas/canvasPalette.ts
|
|
4
|
+
const getCanvasPalette = (table) => ({
|
|
5
|
+
...TABLE_CHROME,
|
|
6
|
+
...table?.__superadPalette ?? table?.options?.customConfig?.__superadPalette ?? resolveTableCanvasPalette()
|
|
7
|
+
});
|
|
8
|
+
//#endregion
|
|
9
|
+
export { getCanvasPalette };
|
|
10
|
+
|
|
11
|
+
//# sourceMappingURL=canvasPalette.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvasPalette.mjs","names":["TABLE_CHROME_BASE"],"sources":["../../../src/Table/canvas/canvasPalette.ts"],"sourcesContent":["'use client';\n\nimport {\n resolveTableCanvasPalette,\n TABLE_CHROME as TABLE_CHROME_BASE,\n type TableCanvasPalette,\n} from './theme';\n\nexport type CanvasPalette = TableCanvasPalette & { paddingX: number };\n\nexport const getCanvasPalette = (table?: any): CanvasPalette => ({\n ...TABLE_CHROME_BASE,\n ...(table?.__superadPalette ??\n table?.options?.customConfig?.__superadPalette ??\n resolveTableCanvasPalette()),\n});\n"],"mappings":";;;AAUA,MAAa,oBAAoB,WAAgC;CAC/D,GAAGA;CACH,GAAI,OAAO,oBACT,OAAO,SAAS,cAAc,oBAC9B,0BAA0B;AAC9B"}
|