@alphacifer/slidev-addon-theme 0.0.9 → 0.0.11
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 +133 -75
- package/components/card/chevron-card/ChevronCard.vue +44 -32
- package/components/card/chevron-card/ChevronCardBadge.vue +14 -8
- package/components/card/chevron-card/ChevronCardContent.vue +15 -13
- package/components/card/chevron-card/style.css +12 -0
- package/components/card/{horiz-card/HorizCard.vue → horizontal-card/HorizontalCard.vue} +78 -85
- package/components/card/{horiz-card/HorizCardBadge.vue → horizontal-card/HorizontalCardBadge.vue} +15 -10
- package/components/card/{horiz-card/HorizCardContent.vue → horizontal-card/HorizontalCardContent.vue} +11 -11
- package/components/card/{horiz-card/HorizCardIcon.vue → horizontal-card/HorizontalCardIcon.vue} +24 -38
- package/components/card/horizontal-card/style.css +17 -0
- package/components/card/{vert-card/VertCard.vue → vertical-card/VerticalCard.vue} +80 -103
- package/components/card/{vert-card/VertCardBadge.vue → vertical-card/VerticalCardBadge.vue} +15 -10
- package/components/card/{vert-card/VertCardContent.vue → vertical-card/VerticalCardContent.vue} +13 -12
- package/components/card/{vert-card/VertCardIcon.vue → vertical-card/VerticalCardIcon.vue} +15 -33
- package/components/card/vertical-card/style.css +19 -0
- package/components/comparisons/arc-comparison/ArcComparison.vue +376 -80
- package/components/comparisons/arc-comparison/ArcComparisonBadge.vue +9 -4
- package/components/comparisons/arc-comparison/ArcComparisonContent.vue +9 -4
- package/components/comparisons/arc-comparison/ArcComparisonHeading.vue +9 -4
- package/components/comparisons/arc-comparison/ArcComparisonLeft.vue +39 -63
- package/components/comparisons/arc-comparison/ArcComparisonOrbit.vue +9 -8
- package/components/comparisons/arc-comparison/ArcComparisonRight.vue +39 -63
- package/components/comparisons/arc-comparison/style.css +27 -0
- package/components/comparisons/table-comparison/TableComparison.vue +17 -97
- package/components/comparisons/table-comparison/TableComparisonCell.vue +22 -20
- package/components/comparisons/table-comparison/{TableComparisonCol.vue → TableComparisonColumn.vue} +16 -14
- package/components/comparisons/table-comparison/{TableComparisonCols.vue → TableComparisonColumns.vue} +5 -8
- package/components/comparisons/table-comparison/TableComparisonRow.vue +10 -14
- package/components/comparisons/table-comparison/TableComparisonRows.vue +1 -4
- package/components/comparisons/table-comparison/style.css +15 -0
- package/components/core/Date.vue +2 -5
- package/components/core/QnA.vue +1 -1
- package/components/core/Quote.vue +3 -6
- package/components/core/ReflectedTitle.vue +2 -6
- package/components/core/Speaker.vue +5 -10
- package/components/core/TransitionHeading.vue +2 -5
- package/components/core/arc-orbit/ArcOrbit.vue +65 -84
- package/components/core/arc-orbit/ArcOrbitBadge.vue +9 -11
- package/components/core/arc-orbit/ArcOrbitCallout.vue +30 -32
- package/components/core/arc-orbit/ArcOrbitContent.vue +6 -12
- package/components/core/arc-orbit/ArcOrbitHeading.vue +13 -11
- package/components/core/arc-orbit/style.css +20 -0
- package/components/core/style.css +9 -0
- package/components/core/thanks/{ThanksContent.vue → SquareThanks.vue} +36 -31
- package/components/core/thanks/SquareThanksContent.vue +89 -0
- package/components/core/thanks/ThanksOutlineSquare.vue +2 -5
- package/components/core/thanks/ThanksSquare.vue +2 -5
- package/components/core/thanks/style.css +30 -0
- package/components/defense-in-depth/arc-defense-in-depth/ArcDefenseInDepth.vue +802 -0
- package/components/defense-in-depth/arc-defense-in-depth/ArcDefenseInDepthLayer.vue +240 -0
- package/components/defense-in-depth/arc-defense-in-depth/ArcDefenseInDepthLayerHeading.vue +96 -0
- package/components/defense-in-depth/arc-defense-in-depth/ArcDefenseInDepthLayerPart.vue +501 -0
- package/components/defense-in-depth/arc-defense-in-depth/ArcDefenseInDepthLayerSector.vue +162 -0
- package/components/defense-in-depth/arc-defense-in-depth/style.css +38 -0
- package/components/facets/tetrad/{rect-orbit-tetrad/RectOrbitTetrad.vue → rectangle-orbit-tetrad/RectangleOrbitTetrad.vue} +66 -63
- package/components/facets/tetrad/{rect-orbit-tetrad/RectOrbitTetradCallout.vue → rectangle-orbit-tetrad/RectangleOrbitTetradCallout.vue} +62 -48
- package/components/facets/tetrad/rectangle-orbit-tetrad/RectangleOrbitTetradCenter.vue +54 -0
- package/components/facets/tetrad/rectangle-orbit-tetrad/RectangleOrbitTetradContent.vue +44 -0
- package/components/facets/tetrad/rectangle-orbit-tetrad/RectangleOrbitTetradHeading.vue +27 -0
- package/components/facets/tetrad/{rect-orbit-tetrad/RectOrbitTetradIcon.vue → rectangle-orbit-tetrad/RectangleOrbitTetradIcon.vue} +23 -13
- package/components/facets/tetrad/rectangle-orbit-tetrad/style.css +22 -0
- package/components/facets/triad/arrow-triad/ArrowTriad.vue +99 -109
- package/components/facets/triad/arrow-triad/ArrowTriadCallout.vue +31 -59
- package/components/facets/triad/arrow-triad/ArrowTriadContent.vue +18 -13
- package/components/facets/triad/arrow-triad/ArrowTriadHeading.vue +20 -13
- package/components/facets/triad/arrow-triad/ArrowTriadIcon.vue +14 -9
- package/components/facets/triad/arrow-triad/style.css +15 -0
- package/components/facets/triad/gear-triad/GearTriad.vue +73 -64
- package/components/facets/triad/gear-triad/GearTriadCallout.vue +58 -53
- package/components/facets/triad/gear-triad/GearTriadCenter.vue +9 -4
- package/components/facets/triad/gear-triad/GearTriadContent.vue +21 -36
- package/components/facets/triad/gear-triad/GearTriadDetail.vue +92 -0
- package/components/facets/triad/gear-triad/GearTriadDetails.vue +169 -0
- package/components/facets/triad/gear-triad/GearTriadDetailsContent.vue +18 -0
- package/components/facets/triad/gear-triad/GearTriadDetailsHeading.vue +60 -0
- package/components/facets/triad/gear-triad/GearTriadHeading.vue +19 -13
- package/components/facets/triad/gear-triad/GearTriadIcon.vue +22 -9
- package/components/facets/triad/gear-triad/style.css +26 -0
- package/components/facets/triad/{hex-triad/HexTriad.vue → hexagon-triad/HexagonTriad.vue} +81 -63
- package/components/facets/triad/{hex-triad/HexTriadBadge.vue → hexagon-triad/HexagonTriadBadge.vue} +38 -12
- package/components/facets/triad/{hex-triad/HexTriadCallout.vue → hexagon-triad/HexagonTriadCallout.vue} +35 -31
- package/components/facets/triad/hexagon-triad/HexagonTriadCenterBadge.vue +74 -0
- package/components/facets/triad/hexagon-triad/HexagonTriadContent.vue +34 -0
- package/components/facets/triad/hexagon-triad/HexagonTriadHeading.vue +44 -0
- package/components/facets/triad/{hex-triad/HexTriadLayer.vue → hexagon-triad/HexagonTriadLayer.vue} +12 -4
- package/components/facets/triad/hexagon-triad/style.css +22 -0
- package/components/process/arc-arrow-process/ArcArrowProcess.vue +13 -35
- package/components/process/arc-arrow-process/ArcArrowProcessArrow.vue +20 -21
- package/components/process/arc-arrow-process/ArcArrowProcessCallout.vue +30 -71
- package/components/process/arc-arrow-process/ArcArrowProcessContent.vue +18 -13
- package/components/process/arc-arrow-process/ArcArrowProcessHeading.vue +18 -18
- package/components/process/arc-arrow-process/ArcArrowProcessIcon.vue +23 -11
- package/components/process/arc-arrow-process/style.css +20 -0
- package/components/pyramid/circular-pyramid/CircularPyramid.vue +276 -190
- package/components/pyramid/circular-pyramid/CircularPyramidStack.vue +83 -98
- package/components/pyramid/circular-pyramid/CircularPyramidStackContent.vue +136 -29
- package/components/pyramid/circular-pyramid/CircularPyramidStackHeading.vue +212 -0
- package/components/pyramid/circular-pyramid/style.css +26 -0
- package/components/pyramid/square-pyramid/SquarePyramid.vue +199 -83
- package/components/pyramid/square-pyramid/SquarePyramidStack.vue +87 -95
- package/components/pyramid/square-pyramid/SquarePyramidStackContent.vue +138 -27
- package/components/pyramid/square-pyramid/SquarePyramidStackHeading.vue +212 -0
- package/components/pyramid/square-pyramid/style.css +48 -0
- package/components/style.css +35 -0
- package/layouts/core/arc-toc.vue +40 -45
- package/layouts/core/bg-center.vue +7 -6
- package/layouts/core/style.css +17 -0
- package/layouts/shifting-heading/shifting-intro.vue +4 -13
- package/layouts/thanks/thanks.vue +5 -5
- package/package.json +8 -6
- package/style.css +17 -0
- package/uno.config.ts +1 -0
- package/utils/activateOnKeyboard.ts +14 -0
- package/utils/{chevronCard → card/chevron-card}/context.ts +1 -1
- package/utils/card/chevron-card/index.ts +1 -0
- package/utils/card/horizontal-card/context.ts +12 -0
- package/utils/{horizCard/createHorizCardGeometry.ts → card/horizontal-card/createHorizontalCardGeometry.ts} +10 -45
- package/utils/card/horizontal-card/index.ts +2 -0
- package/utils/card/vertical-card/context.ts +19 -0
- package/utils/{vertCard/createVertCardGeometry.ts → card/vertical-card/createVerticalCardGeometry.ts} +9 -130
- package/utils/card/vertical-card/index.ts +2 -0
- package/utils/colors.ts +93 -0
- package/utils/{arcComparison → comparisons/arc-comparison}/context.ts +0 -11
- package/utils/{arcComparison → comparisons/arc-comparison}/createArcComparisonGeometry.ts +1 -1
- package/utils/comparisons/arc-comparison/resolveArcComparisonItems.ts +33 -0
- package/utils/comparisons/table-comparison/constants.ts +47 -0
- package/utils/{tableComparison → comparisons/table-comparison}/context.ts +2 -2
- package/utils/{arcOrbit → core/arc-orbit}/resolveArcOrbitItems.ts +11 -15
- package/utils/defense-in-depth/arc-defense-in-depth/context.ts +113 -0
- package/utils/defense-in-depth/arc-defense-in-depth/createArcDefenseInDepthGeometry.ts +600 -0
- package/utils/defense-in-depth/arc-defense-in-depth/types.ts +144 -0
- package/utils/defense-in-depth/shared/colors.ts +51 -0
- package/utils/defense-in-depth/shared/constants.ts +22 -0
- package/utils/defense-in-depth/shared/types.ts +7 -0
- package/utils/facets/tetrad/rectangle-orbit-tetrad/context.ts +31 -0
- package/utils/{rectOrbitTetrad/createRectOrbitTetradGeometry.ts → facets/tetrad/rectangle-orbit-tetrad/createRectangleOrbitTetradGeometry.ts} +5 -104
- package/utils/facets/tetrad/rectangle-orbit-tetrad/index.ts +3 -0
- package/utils/{rectOrbitTetrad/resolveRectOrbitTetradItems.ts → facets/tetrad/rectangle-orbit-tetrad/resolveRectangleOrbitTetradItems.ts} +41 -49
- package/utils/{arrowTriad → facets/triad/arrow-triad}/resolveArrowTriadItems.ts +27 -28
- package/utils/{gearTriad → facets/triad/gear-triad}/context.ts +5 -5
- package/utils/{gearTriad → facets/triad/gear-triad}/createGearTriadGeometry.ts +2 -0
- package/utils/{gearTriad → facets/triad/gear-triad}/resolveGearTriadItems.ts +23 -24
- package/utils/facets/triad/hexagon-triad/context.ts +25 -0
- package/utils/{hexTriad/createHexTriadGeometry.ts → facets/triad/hexagon-triad/createHexagonTriadGeometry.ts} +11 -27
- package/utils/facets/triad/hexagon-triad/index.ts +3 -0
- package/utils/facets/triad/hexagon-triad/resolveHexagonTriadItems.ts +60 -0
- package/utils/{shiftingHeading → layouts/shifting-heading}/collectShiftingIntroNodes.ts +1 -0
- package/utils/layouts/table-of-contents/calculateTocCenterAlignmentOffset.ts +17 -0
- package/utils/{tableOfContents → layouts/table-of-contents}/calculateTocMarkerPositions.ts +0 -12
- package/utils/{tableOfContents → layouts/table-of-contents}/createTocConnectorPath.ts +11 -5
- package/utils/{mergeUno → merge-uno}/classifyVisual.ts +1 -1
- package/utils/{mergeUno → merge-uno}/collectClassNames.ts +9 -3
- package/utils/process/arc-arrow-process/resolveArcArrowProcessItems.ts +180 -0
- package/utils/pyramid/circular-pyramid/context.ts +1 -4
- package/utils/pyramid/circular-pyramid/createCircularPyramidGeometry.ts +6 -10
- package/utils/pyramid/shared/colors.ts +33 -83
- package/utils/pyramid/shared/constants.ts +3 -2
- package/utils/pyramid/shared/types.ts +0 -5
- package/utils/pyramid/square-pyramid/context.ts +1 -4
- package/utils/pyramid/square-pyramid/createSquarePyramidGeometry.ts +6 -10
- package/utils/useDiagramAutoScale.ts +64 -16
- package/utils/useMergedUnoAttrs.ts +9 -5
- package/components/card/chevron-card/ChevronCardHeading.vue +0 -39
- package/components/card/horiz-card/HorizCardHeading.vue +0 -47
- package/components/card/vert-card/VertCardHeading.vue +0 -68
- package/components/card/vert-card/VertCardTitle.vue +0 -76
- package/components/comparisons/arc-comparison/ArcComparisonContents.vue +0 -17
- package/components/comparisons/arc-comparison/ArcComparisonTitle.vue +0 -29
- package/components/core/arc-orbit/ArcOrbitContents.vue +0 -18
- package/components/core/arc-orbit/ArcOrbitTitle.vue +0 -50
- package/components/facets/tetrad/rect-orbit-tetrad/RectOrbitTetradCenter.vue +0 -53
- package/components/facets/tetrad/rect-orbit-tetrad/RectOrbitTetradContent.vue +0 -39
- package/components/facets/tetrad/rect-orbit-tetrad/RectOrbitTetradHeading.vue +0 -44
- package/components/facets/triad/gear-triad/GearTriadContents.vue +0 -111
- package/components/facets/triad/gear-triad/GearTriadDescription.vue +0 -38
- package/components/facets/triad/hex-triad/HexTriadCenterBadge.vue +0 -51
- package/components/facets/triad/hex-triad/HexTriadContent.vue +0 -20
- package/components/facets/triad/hex-triad/HexTriadHeading.vue +0 -28
- package/components/pyramid/circular-pyramid/CircularPyramidStackTitle.vue +0 -138
- package/components/pyramid/square-pyramid/SquarePyramidStackTitle.vue +0 -134
- package/layouts/core/table-of-contents.vue +0 -30
- package/utils/arcArrowProcess/resolveArcArrowProcessItems.ts +0 -189
- package/utils/arcComparison/resolveArcComparisonItems.ts +0 -102
- package/utils/chevronCard/createChevronCardGeometry.ts +0 -48
- package/utils/chevronCard/index.ts +0 -2
- package/utils/hexTriad/context.ts +0 -25
- package/utils/hexTriad/index.ts +0 -3
- package/utils/hexTriad/resolveHexTriadItems.ts +0 -63
- package/utils/horizCard/context.ts +0 -13
- package/utils/horizCard/index.ts +0 -2
- package/utils/pyramid/index.ts +0 -3
- package/utils/rectOrbitTetrad/context.ts +0 -31
- package/utils/rectOrbitTetrad/index.ts +0 -3
- package/utils/tableComparison/constants.ts +0 -72
- package/utils/tableOfContents/calculateTocCenterAlignmentOffset.ts +0 -11
- package/utils/vertCard/context.ts +0 -18
- package/utils/vertCard/index.ts +0 -2
- package/utils/{arcComparison → comparisons/arc-comparison}/index.ts +0 -0
- package/utils/{tableComparison → comparisons/table-comparison}/index.ts +0 -0
- package/utils/{arcOrbit → core/arc-orbit}/context.ts +0 -0
- package/utils/{arcOrbit → core/arc-orbit}/createArcOrbitGeometry.ts +0 -0
- package/utils/{arcOrbit → core/arc-orbit}/index.ts +0 -0
- package/utils/{arrowTriad → facets/triad/arrow-triad}/context.ts +0 -0
- package/utils/{arrowTriad → facets/triad/arrow-triad}/createArrowTriadGeometry.ts +0 -0
- package/utils/{arrowTriad → facets/triad/arrow-triad}/index.ts +0 -0
- package/utils/{gearTriad → facets/triad/gear-triad}/index.ts +0 -0
- package/utils/{tableOfContents → layouts/table-of-contents}/calculateUniformTocArticleWidth.ts +0 -0
- package/utils/{tableOfContents → layouts/table-of-contents}/createTocArcPath.ts +0 -0
- package/utils/{tableOfContents → layouts/table-of-contents}/index.ts +0 -0
- package/utils/{mergeUno → merge-uno}/classifyLayout.ts +0 -0
- package/utils/{mergeUno → merge-uno}/classifySimple.ts +0 -0
- package/utils/{mergeUno → merge-uno}/classifyTypography.ts +0 -0
- package/utils/{mergeUno → merge-uno}/classifyUtility.ts +0 -0
- package/utils/{mergeUno → merge-uno}/index.ts +0 -0
- package/utils/{mergeUno → merge-uno}/mergeClassValues.ts +0 -0
- package/utils/{mergeUno → merge-uno}/splitVariantScope.ts +1 -1
- package/utils/{mergeUno → merge-uno}/types.ts +0 -0
- package/utils/{arcArrowProcess → process/arc-arrow-process}/context.ts +1 -1
- /package/utils/{arcArrowProcess → process/arc-arrow-process}/createArcArrowProcessGeometry.ts +0 -0
- /package/utils/{arcArrowProcess → process/arc-arrow-process}/index.ts +0 -0
|
@@ -15,18 +15,17 @@ import {
|
|
|
15
15
|
DEFAULT_CIRCULAR_PYRAMID_COLOR,
|
|
16
16
|
DEFAULT_CIRCULAR_PYRAMID_STACK_COLORS,
|
|
17
17
|
} from '../../../utils/pyramid/circular-pyramid';
|
|
18
|
-
import
|
|
19
|
-
import
|
|
18
|
+
import { PYRAMID_DOT_GAP_PX } from '../../../utils/pyramid/shared';
|
|
19
|
+
import { useMergedUnoAttrs } from '../../../utils/useMergedUnoAttrs';
|
|
20
20
|
|
|
21
21
|
defineOptions({
|
|
22
22
|
name: 'CircularPyramidStack',
|
|
23
|
+
inheritAttrs: false,
|
|
23
24
|
});
|
|
24
25
|
|
|
25
26
|
export interface ICircularPyramidStackProps {
|
|
26
27
|
readonly index?: number;
|
|
27
28
|
readonly step?: string | number;
|
|
28
|
-
readonly title?: string;
|
|
29
|
-
readonly content?: string;
|
|
30
29
|
readonly color?: string;
|
|
31
30
|
readonly active?: boolean;
|
|
32
31
|
readonly connectorWidth?: number;
|
|
@@ -35,8 +34,6 @@ export interface ICircularPyramidStackProps {
|
|
|
35
34
|
const props = withDefaults(defineProps<ICircularPyramidStackProps>(), {
|
|
36
35
|
index: undefined,
|
|
37
36
|
step: undefined,
|
|
38
|
-
title: undefined,
|
|
39
|
-
content: undefined,
|
|
40
37
|
color: undefined,
|
|
41
38
|
active: undefined,
|
|
42
39
|
connectorWidth: undefined,
|
|
@@ -55,13 +52,16 @@ interface INamedComponent {
|
|
|
55
52
|
function hasComponentName(type: unknown, targetName: string): boolean {
|
|
56
53
|
if (typeof type === 'object' && type !== null) {
|
|
57
54
|
const comp = type as INamedComponent['type'];
|
|
55
|
+
|
|
58
56
|
return comp?.name === targetName || comp?.displayName === targetName;
|
|
59
57
|
}
|
|
58
|
+
|
|
60
59
|
return false;
|
|
61
60
|
}
|
|
62
61
|
|
|
63
62
|
function flattenVNodes(nodes: VNode[]): VNode[] {
|
|
64
63
|
const result: VNode[] = [];
|
|
64
|
+
|
|
65
65
|
for (const node of nodes) {
|
|
66
66
|
if (node.type === Fragment && Array.isArray(node.children)) {
|
|
67
67
|
result.push(...flattenVNodes(node.children as VNode[]));
|
|
@@ -69,6 +69,7 @@ function flattenVNodes(nodes: VNode[]): VNode[] {
|
|
|
69
69
|
result.push(node);
|
|
70
70
|
}
|
|
71
71
|
}
|
|
72
|
+
|
|
72
73
|
return result;
|
|
73
74
|
}
|
|
74
75
|
|
|
@@ -76,12 +77,13 @@ const defaultNodes = computed(() => {
|
|
|
76
77
|
if (!slots.default) {
|
|
77
78
|
return [];
|
|
78
79
|
}
|
|
80
|
+
|
|
79
81
|
return flattenVNodes(slots.default());
|
|
80
82
|
});
|
|
81
83
|
|
|
82
84
|
const slottedTitle = computed(() => {
|
|
83
85
|
return defaultNodes.value.find((node) =>
|
|
84
|
-
hasComponentName(node.type, '
|
|
86
|
+
hasComponentName(node.type, 'CircularPyramidStackHeading'),
|
|
85
87
|
);
|
|
86
88
|
});
|
|
87
89
|
|
|
@@ -107,6 +109,7 @@ const resolvedIndex = computed<number>(() => {
|
|
|
107
109
|
if (props.index !== undefined) {
|
|
108
110
|
return Number(props.index);
|
|
109
111
|
}
|
|
112
|
+
|
|
110
113
|
return registration?.index.value ?? 0;
|
|
111
114
|
});
|
|
112
115
|
|
|
@@ -114,9 +117,11 @@ const isActive = computed<boolean>(() => {
|
|
|
114
117
|
if (props.active !== undefined) {
|
|
115
118
|
return props.active;
|
|
116
119
|
}
|
|
120
|
+
|
|
117
121
|
if (!rootContext) {
|
|
118
122
|
return false;
|
|
119
123
|
}
|
|
124
|
+
|
|
120
125
|
return rootContext.activeIndex.value === resolvedIndex.value;
|
|
121
126
|
});
|
|
122
127
|
|
|
@@ -124,6 +129,7 @@ const resolvedStep = computed(() => {
|
|
|
124
129
|
if (props.step !== undefined) {
|
|
125
130
|
return props.step;
|
|
126
131
|
}
|
|
132
|
+
|
|
127
133
|
return String(resolvedIndex.value + 1).padStart(2, '0');
|
|
128
134
|
});
|
|
129
135
|
|
|
@@ -131,6 +137,7 @@ const layerGeometry = computed(() => {
|
|
|
131
137
|
if (!rootContext) {
|
|
132
138
|
return undefined;
|
|
133
139
|
}
|
|
140
|
+
|
|
134
141
|
return rootContext.geo.value.layers[resolvedIndex.value];
|
|
135
142
|
});
|
|
136
143
|
|
|
@@ -138,28 +145,25 @@ const posY = computed(() => {
|
|
|
138
145
|
if (!layerGeometry.value) {
|
|
139
146
|
return 0;
|
|
140
147
|
}
|
|
148
|
+
|
|
141
149
|
const geo = layerGeometry.value;
|
|
150
|
+
|
|
142
151
|
return (
|
|
143
152
|
geo.slabCenterY ??
|
|
144
153
|
Number((geo.cy + (geo.cylinderHeight ?? 0) / 2).toFixed(2))
|
|
145
154
|
);
|
|
146
155
|
});
|
|
147
156
|
|
|
148
|
-
const discRadiusX = computed(() => {
|
|
149
|
-
if (!layerGeometry.value) {
|
|
150
|
-
return 140;
|
|
151
|
-
}
|
|
152
|
-
return layerGeometry.value.rx;
|
|
153
|
-
});
|
|
154
|
-
|
|
155
157
|
const DOT_POSITION_X = 210;
|
|
156
158
|
|
|
157
159
|
const leftWidth = computed(() => {
|
|
158
160
|
if (layerGeometry.value) {
|
|
159
161
|
const rx = layerGeometry.value.rx;
|
|
160
162
|
const cx = 465;
|
|
161
|
-
|
|
163
|
+
|
|
164
|
+
return Math.max(180, Math.round(cx - rx - PYRAMID_DOT_GAP_PX));
|
|
162
165
|
}
|
|
166
|
+
|
|
163
167
|
return DOT_POSITION_X;
|
|
164
168
|
});
|
|
165
169
|
|
|
@@ -169,28 +173,30 @@ const rightWingWidth = computed(() => {
|
|
|
169
173
|
if (layerGeometry.value) {
|
|
170
174
|
const rx = layerGeometry.value.rx;
|
|
171
175
|
const cx = 465;
|
|
172
|
-
const dotRightX = cx + rx +
|
|
176
|
+
const dotRightX = cx + rx + PYRAMID_DOT_GAP_PX;
|
|
173
177
|
const containerW = 960;
|
|
178
|
+
|
|
174
179
|
return Math.max(rightWidth.value + 20, Math.round(containerW - dotRightX));
|
|
175
180
|
}
|
|
176
|
-
return rightWidth.value + 40;
|
|
177
|
-
});
|
|
178
181
|
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
);
|
|
182
|
+
return rightWidth.value + PYRAMID_DOT_GAP_PX;
|
|
183
|
+
});
|
|
182
184
|
|
|
183
185
|
const resolvedColor = computed<string>(() => {
|
|
184
186
|
if (effectiveColor.value) {
|
|
185
187
|
return effectiveColor.value;
|
|
186
188
|
}
|
|
189
|
+
|
|
190
|
+
const stackIndex =
|
|
191
|
+
Math.abs(resolvedIndex.value) %
|
|
192
|
+
DEFAULT_CIRCULAR_PYRAMID_STACK_COLORS.length;
|
|
193
|
+
const stackColor =
|
|
194
|
+
DEFAULT_CIRCULAR_PYRAMID_STACK_COLORS[stackIndex] ??
|
|
195
|
+
DEFAULT_CIRCULAR_PYRAMID_COLOR;
|
|
196
|
+
|
|
187
197
|
return (
|
|
188
198
|
rootContext?.getLayerColor(resolvedIndex.value) ??
|
|
189
|
-
|
|
190
|
-
Math.abs(resolvedIndex.value) %
|
|
191
|
-
DEFAULT_CIRCULAR_PYRAMID_STACK_COLORS.length
|
|
192
|
-
] ??
|
|
193
|
-
DEFAULT_CIRCULAR_PYRAMID_COLOR
|
|
199
|
+
`var(--alpha-circular-pyramid-stack-${stackIndex + 1}-color, ${stackColor})`
|
|
194
200
|
);
|
|
195
201
|
});
|
|
196
202
|
|
|
@@ -216,6 +222,10 @@ const connectorWidth = computed(() => {
|
|
|
216
222
|
return Math.max(20, rightWingWidth.value - rightWidth.value);
|
|
217
223
|
});
|
|
218
224
|
|
|
225
|
+
const stepIndex = computed(() => {
|
|
226
|
+
return resolvedIndex.value;
|
|
227
|
+
});
|
|
228
|
+
|
|
219
229
|
provide(CIRCULAR_PYRAMID_STACK_KEY, {
|
|
220
230
|
index: resolvedIndex,
|
|
221
231
|
isActive,
|
|
@@ -226,17 +236,23 @@ provide(CIRCULAR_PYRAMID_STACK_KEY, {
|
|
|
226
236
|
connectorWidth,
|
|
227
237
|
setActive: handleStackClick,
|
|
228
238
|
});
|
|
239
|
+
|
|
240
|
+
const { className, forwardedAttrs } = useMergedUnoAttrs(
|
|
241
|
+
'alpha-circular-pyramid-stack absolute inset-x-0 pointer-events-none select-none flex items-center justify-between',
|
|
242
|
+
);
|
|
229
243
|
</script>
|
|
230
244
|
|
|
231
245
|
<template>
|
|
232
246
|
<div
|
|
233
|
-
|
|
234
|
-
:class="
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
247
|
+
v-bind="forwardedAttrs()"
|
|
248
|
+
:class="
|
|
249
|
+
className([
|
|
250
|
+
isActive
|
|
251
|
+
? 'alpha-circular-pyramid-stack--active'
|
|
252
|
+
: 'alpha-circular-pyramid-stack--inactive',
|
|
253
|
+
`alpha-circular-pyramid-stack--${resolvedIndex}`,
|
|
254
|
+
])
|
|
255
|
+
"
|
|
240
256
|
:data-index="resolvedIndex"
|
|
241
257
|
:data-active="isActive"
|
|
242
258
|
:style="{
|
|
@@ -245,13 +261,17 @@ provide(CIRCULAR_PYRAMID_STACK_KEY, {
|
|
|
245
261
|
}"
|
|
246
262
|
>
|
|
247
263
|
<!-- Left Wing: Title Pill (150px) -->
|
|
248
|
-
<
|
|
249
|
-
|
|
264
|
+
<button
|
|
265
|
+
type="button"
|
|
266
|
+
class="alpha-circular-pyramid-stack__left shrink-0 flex items-center justify-start pointer-events-auto cursor-pointer bg-transparent border-0 p-0 m-0 appearance-none"
|
|
267
|
+
:disabled="!rootContext?.interactive.value"
|
|
268
|
+
:aria-label="`Select stage ${resolvedStep}`"
|
|
250
269
|
:class="[
|
|
251
270
|
`alpha-circular-pyramid-stack__left--${resolvedIndex}`,
|
|
252
271
|
{ 'alpha-circular-pyramid-stack--animated': rootContext?.animation.value },
|
|
253
272
|
]"
|
|
254
273
|
:style="{
|
|
274
|
+
'--wing-delay': `calc(var(--alpha-circular-pyramid-start-delay, 0ms) + ${460 + stepIndex * 320}ms)`,
|
|
255
275
|
width: `${leftWidth}px`,
|
|
256
276
|
minWidth: `${leftWidth}px`,
|
|
257
277
|
maxWidth: `${leftWidth}px`,
|
|
@@ -260,35 +280,28 @@ provide(CIRCULAR_PYRAMID_STACK_KEY, {
|
|
|
260
280
|
@click="handleStackClick"
|
|
261
281
|
>
|
|
262
282
|
<component :is="slottedTitle" v-if="slottedTitle" />
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
<!-- Right Wing: Dot + Connector + Content Card (40px from slab) -->
|
|
271
|
-
<div
|
|
272
|
-
class="alpha-circular-pyramid-stack__right flex-shrink-0 flex items-center justify-end pointer-events-auto cursor-pointer"
|
|
283
|
+
</button>
|
|
284
|
+
<!-- Right Wing: Dot + Connector + Content Card (10px from slab) -->
|
|
285
|
+
<button
|
|
286
|
+
type="button"
|
|
287
|
+
class="alpha-circular-pyramid-stack__right shrink-0 flex items-center justify-end pointer-events-auto cursor-pointer bg-transparent border-0 p-0 m-0 appearance-none"
|
|
288
|
+
:disabled="!rootContext?.interactive.value"
|
|
289
|
+
:aria-label="`Select stage ${resolvedStep}`"
|
|
273
290
|
:class="[
|
|
274
291
|
`alpha-circular-pyramid-stack__right--${resolvedIndex}`,
|
|
275
292
|
{ 'alpha-circular-pyramid-stack--animated': rootContext?.animation.value },
|
|
276
293
|
]"
|
|
277
294
|
:style="{
|
|
295
|
+
'--wing-delay': `calc(var(--alpha-circular-pyramid-start-delay, 0ms) + ${470 + stepIndex * 320}ms)`,
|
|
278
296
|
width: `${rightWingWidth}px`,
|
|
279
297
|
minWidth: `${rightWidth}px`,
|
|
280
298
|
maxWidth: `${rightWingWidth}px`,
|
|
281
|
-
marginRight: rightOffset ? `${rightOffset}px` : undefined,
|
|
282
299
|
opacity: !hasActiveStack || isActive ? 1 : 0.65,
|
|
283
300
|
}"
|
|
284
301
|
@click="handleStackClick"
|
|
285
302
|
>
|
|
286
303
|
<component :is="slottedContent" v-if="slottedContent" />
|
|
287
|
-
|
|
288
|
-
v-else
|
|
289
|
-
:content="props.content || 'Layer details and operational description.'"
|
|
290
|
-
/>
|
|
291
|
-
</div>
|
|
304
|
+
</button>
|
|
292
305
|
</div>
|
|
293
306
|
</template>
|
|
294
307
|
|
|
@@ -300,37 +313,24 @@ provide(CIRCULAR_PYRAMID_STACK_KEY, {
|
|
|
300
313
|
|
|
301
314
|
.alpha-circular-pyramid-stack__left,
|
|
302
315
|
.alpha-circular-pyramid-stack__right {
|
|
303
|
-
transition:
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
.alpha-circular-pyramid-stack--animated.alpha-circular-pyramid-stack__left--0 {
|
|
307
|
-
animation: alpha-pyramid-left-in 450ms cubic-bezier(0.16, 1, 0.3, 1) calc(var(--circular-pyramid-start-delay, 0ms) + 100ms) both;
|
|
308
|
-
}
|
|
309
|
-
|
|
310
|
-
.alpha-circular-pyramid-stack--animated.alpha-circular-pyramid-stack__left--1 {
|
|
311
|
-
animation: alpha-pyramid-left-in 450ms cubic-bezier(0.16, 1, 0.3, 1) calc(var(--circular-pyramid-start-delay, 0ms) + 180ms) both;
|
|
312
|
-
}
|
|
313
|
-
|
|
314
|
-
.alpha-circular-pyramid-stack--animated.alpha-circular-pyramid-stack__left--2 {
|
|
315
|
-
animation: alpha-pyramid-left-in 450ms cubic-bezier(0.16, 1, 0.3, 1) calc(var(--circular-pyramid-start-delay, 0ms) + 260ms) both;
|
|
316
|
-
}
|
|
317
|
-
|
|
318
|
-
.alpha-circular-pyramid-stack--animated.alpha-circular-pyramid-stack__left--3 {
|
|
319
|
-
animation: alpha-pyramid-left-in 450ms cubic-bezier(0.16, 1, 0.3, 1) calc(var(--circular-pyramid-start-delay, 0ms) + 340ms) both;
|
|
316
|
+
transition:
|
|
317
|
+
opacity 0.3s ease,
|
|
318
|
+
transform 0.3s ease;
|
|
320
319
|
}
|
|
321
320
|
|
|
322
|
-
.alpha-circular-pyramid-stack--animated.alpha-circular-pyramid-stack__left
|
|
323
|
-
animation: alpha-pyramid-left-in
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
321
|
+
.alpha-circular-pyramid-stack--animated .alpha-circular-pyramid-stack__left {
|
|
322
|
+
animation: alpha-pyramid-left-in 140ms cubic-bezier(0.16, 1, 0.3, 1)
|
|
323
|
+
var(
|
|
324
|
+
--wing-delay,
|
|
325
|
+
calc(var(--alpha-circular-pyramid-start-delay, 0ms) + 460ms)
|
|
326
|
+
)
|
|
327
|
+
both;
|
|
328
328
|
}
|
|
329
329
|
|
|
330
330
|
@keyframes alpha-pyramid-left-in {
|
|
331
331
|
0% {
|
|
332
332
|
opacity: 0;
|
|
333
|
-
transform: translateX(-
|
|
333
|
+
transform: translateX(-10px);
|
|
334
334
|
}
|
|
335
335
|
100% {
|
|
336
336
|
opacity: 1;
|
|
@@ -338,34 +338,19 @@ provide(CIRCULAR_PYRAMID_STACK_KEY, {
|
|
|
338
338
|
}
|
|
339
339
|
}
|
|
340
340
|
|
|
341
|
-
.alpha-circular-pyramid-stack--animated.alpha-circular-pyramid-stack__right
|
|
342
|
-
animation: alpha-pyramid-right-in
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
.alpha-circular-pyramid-stack--animated.alpha-circular-pyramid-stack__right--2 {
|
|
350
|
-
animation: alpha-pyramid-right-in 450ms cubic-bezier(0.16, 1, 0.3, 1) calc(var(--circular-pyramid-start-delay, 0ms) + 280ms) both;
|
|
351
|
-
}
|
|
352
|
-
|
|
353
|
-
.alpha-circular-pyramid-stack--animated.alpha-circular-pyramid-stack__right--3 {
|
|
354
|
-
animation: alpha-pyramid-right-in 450ms cubic-bezier(0.16, 1, 0.3, 1) calc(var(--circular-pyramid-start-delay, 0ms) + 360ms) both;
|
|
355
|
-
}
|
|
356
|
-
|
|
357
|
-
.alpha-circular-pyramid-stack--animated.alpha-circular-pyramid-stack__right--4 {
|
|
358
|
-
animation: alpha-pyramid-right-in 450ms cubic-bezier(0.16, 1, 0.3, 1) calc(var(--circular-pyramid-start-delay, 0ms) + 440ms) both;
|
|
359
|
-
}
|
|
360
|
-
|
|
361
|
-
.alpha-circular-pyramid-stack--animated.alpha-circular-pyramid-stack__right--5 {
|
|
362
|
-
animation: alpha-pyramid-right-in 450ms cubic-bezier(0.16, 1, 0.3, 1) calc(var(--circular-pyramid-start-delay, 0ms) + 520ms) both;
|
|
341
|
+
.alpha-circular-pyramid-stack--animated .alpha-circular-pyramid-stack__right {
|
|
342
|
+
animation: alpha-pyramid-right-in 140ms cubic-bezier(0.16, 1, 0.3, 1)
|
|
343
|
+
var(
|
|
344
|
+
--wing-delay,
|
|
345
|
+
calc(var(--alpha-circular-pyramid-start-delay, 0ms) + 470ms)
|
|
346
|
+
)
|
|
347
|
+
both;
|
|
363
348
|
}
|
|
364
349
|
|
|
365
350
|
@keyframes alpha-pyramid-right-in {
|
|
366
351
|
0% {
|
|
367
352
|
opacity: 0;
|
|
368
|
-
transform: translateX(
|
|
353
|
+
transform: translateX(10px);
|
|
369
354
|
}
|
|
370
355
|
100% {
|
|
371
356
|
opacity: 1;
|
|
@@ -6,19 +6,19 @@ import {
|
|
|
6
6
|
CIRCULAR_PYRAMID_STACK_KEY,
|
|
7
7
|
} from '../../../utils/pyramid/circular-pyramid';
|
|
8
8
|
import { createPyramidConnectorPath } from '../../../utils/pyramid/shared';
|
|
9
|
+
import { useMergedUnoAttrs } from '../../../utils/useMergedUnoAttrs';
|
|
9
10
|
|
|
10
11
|
defineOptions({
|
|
11
12
|
name: 'CircularPyramidStackContent',
|
|
13
|
+
inheritAttrs: false,
|
|
12
14
|
});
|
|
13
15
|
|
|
14
16
|
export interface ICircularPyramidStackContentProps {
|
|
15
|
-
readonly content?: string;
|
|
16
17
|
readonly color?: string;
|
|
17
18
|
readonly connectorWidth?: number;
|
|
18
19
|
}
|
|
19
20
|
|
|
20
21
|
const props = withDefaults(defineProps<ICircularPyramidStackContentProps>(), {
|
|
21
|
-
content: undefined,
|
|
22
22
|
color: undefined,
|
|
23
23
|
connectorWidth: undefined,
|
|
24
24
|
});
|
|
@@ -53,8 +53,12 @@ const isActive = computed(() => {
|
|
|
53
53
|
return stackContext?.isActive.value ?? false;
|
|
54
54
|
});
|
|
55
55
|
|
|
56
|
-
const
|
|
57
|
-
return rootContext?.
|
|
56
|
+
const isAnimated = computed(() => {
|
|
57
|
+
return rootContext?.animation.value ?? false;
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
const stepIndex = computed(() => {
|
|
61
|
+
return stackContext?.index.value ?? 0;
|
|
58
62
|
});
|
|
59
63
|
|
|
60
64
|
const contentWidth = computed(() => rootContext?.contentWidthPx.value ?? 240);
|
|
@@ -63,7 +67,9 @@ const deltaY = computed(() => {
|
|
|
63
67
|
if (stackContext?.deltaY?.value !== undefined) {
|
|
64
68
|
return stackContext.deltaY.value;
|
|
65
69
|
}
|
|
70
|
+
|
|
66
71
|
const idx = stackContext?.index.value ?? 0;
|
|
72
|
+
|
|
67
73
|
return rootContext?.getCardDeltaY?.(idx) ?? 0;
|
|
68
74
|
});
|
|
69
75
|
|
|
@@ -73,9 +79,11 @@ const connectorWidth = computed(() => {
|
|
|
73
79
|
if (props.connectorWidth !== undefined) {
|
|
74
80
|
return props.connectorWidth;
|
|
75
81
|
}
|
|
82
|
+
|
|
76
83
|
if (stackContext?.connectorWidth?.value !== undefined) {
|
|
77
84
|
return stackContext.connectorWidth.value;
|
|
78
85
|
}
|
|
86
|
+
|
|
79
87
|
return measuredConnectorWidth.value || 40;
|
|
80
88
|
});
|
|
81
89
|
|
|
@@ -94,9 +102,16 @@ const svgTop = computed(() => {
|
|
|
94
102
|
|
|
95
103
|
const connectorPath = computed(() => {
|
|
96
104
|
const w = connectorWidth.value;
|
|
105
|
+
|
|
97
106
|
return createPyramidConnectorPath(
|
|
98
|
-
{
|
|
99
|
-
|
|
107
|
+
{
|
|
108
|
+
x: 0,
|
|
109
|
+
y: 0,
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
x: w,
|
|
113
|
+
y: effectiveDeltaY.value,
|
|
114
|
+
},
|
|
100
115
|
);
|
|
101
116
|
});
|
|
102
117
|
|
|
@@ -105,31 +120,49 @@ const stackColor = computed(() => {
|
|
|
105
120
|
props.color ??
|
|
106
121
|
stackContext?.color?.value ??
|
|
107
122
|
rootContext?.color.value ??
|
|
108
|
-
'
|
|
123
|
+
'var(--alpha-circular-pyramid-stack-content-accent)'
|
|
109
124
|
);
|
|
110
125
|
});
|
|
126
|
+
|
|
127
|
+
const { className, forwardedAttrs } = useMergedUnoAttrs(() => [
|
|
128
|
+
'alpha-circular-pyramid-stack-content rounded-xl p-2 px-2.5 text-[10px] leading-snug transition-all duration-300 border select-none box-border shrink-0',
|
|
129
|
+
isActive.value
|
|
130
|
+
? 'alpha-circular-pyramid-stack-content--active bg-(--alpha-circular-pyramid-stack-content-border-active) text-(--alpha-circular-pyramid-stack-content-active)'
|
|
131
|
+
: 'alpha-circular-pyramid-stack-content--default bg-(--alpha-circular-pyramid-stack-content-border) text-(--alpha-circular-pyramid-stack-content)',
|
|
132
|
+
]);
|
|
111
133
|
</script>
|
|
112
134
|
|
|
113
135
|
<template>
|
|
114
|
-
<div
|
|
136
|
+
<div
|
|
137
|
+
class="alpha-circular-pyramid-stack-content-wrapper relative w-full flex items-center select-none overflow-visible"
|
|
138
|
+
:style="{
|
|
139
|
+
'--content-delay': `calc(var(--alpha-circular-pyramid-start-delay, 0ms) + ${470 + stepIndex * 320}ms)`,
|
|
140
|
+
}"
|
|
141
|
+
>
|
|
115
142
|
<!-- Scalable Line between Dot and Content Card (always at least 20px) -->
|
|
116
143
|
<div
|
|
117
144
|
ref="connectorRef"
|
|
118
|
-
class="alpha-circular-pyramid-stack-content__connector flex-1 flex items-center min-w-
|
|
145
|
+
class="alpha-circular-pyramid-stack-content__connector flex-1 flex items-center min-w-5 pointer-events-none relative overflow-visible h-0"
|
|
119
146
|
>
|
|
120
147
|
<div
|
|
121
|
-
class="alpha-circular-pyramid-stack-content__dot absolute left-0 top-0 -translate-x-1/2 -translate-y-1/2 w-1.5 h-1.5 rounded-full
|
|
148
|
+
class="alpha-circular-pyramid-stack-content__dot absolute left-0 top-0 -translate-x-1/2 -translate-y-1/2 w-1.5 h-1.5 rounded-full shrink-0 transition-all duration-300 pointer-events-auto"
|
|
149
|
+
:class="{
|
|
150
|
+
'alpha-circular-pyramid-stack-content__dot--animated': isAnimated,
|
|
151
|
+
}"
|
|
122
152
|
:style="{
|
|
123
153
|
backgroundColor: stackColor,
|
|
124
154
|
boxShadow: isActive
|
|
125
155
|
? `0 0 6px ${stackColor}`
|
|
126
|
-
: `0 0 2px ${stackColor}
|
|
156
|
+
: `0 0 2px color-mix(in srgb, ${stackColor} 50%, transparent)`,
|
|
127
157
|
}"
|
|
128
158
|
/>
|
|
129
159
|
<!-- Straight horizontal line when deltaY is 0 -->
|
|
130
160
|
<div
|
|
131
161
|
v-if="!effectiveDeltaY"
|
|
132
|
-
class="alpha-circular-pyramid-stack-content__line absolute left-0 top-0 w-full h-
|
|
162
|
+
class="alpha-circular-pyramid-stack-content__line absolute left-0 top-0 w-full h-px -translate-y-1/2 pointer-events-none transition-colors duration-300"
|
|
163
|
+
:class="{
|
|
164
|
+
'alpha-circular-pyramid-stack-content__line--animated': isAnimated,
|
|
165
|
+
}"
|
|
133
166
|
:style="{
|
|
134
167
|
backgroundColor: stackColor,
|
|
135
168
|
opacity: isActive ? 1 : 0.65,
|
|
@@ -137,6 +170,7 @@ const stackColor = computed(() => {
|
|
|
137
170
|
/>
|
|
138
171
|
<!-- Zigzag SVG connector when deltaY !== 0 -->
|
|
139
172
|
<svg
|
|
173
|
+
aria-hidden="true"
|
|
140
174
|
v-else
|
|
141
175
|
class="alpha-circular-pyramid-stack-content__line-svg absolute left-0 pointer-events-none overflow-visible"
|
|
142
176
|
:width="connectorWidth"
|
|
@@ -150,12 +184,16 @@ const stackColor = computed(() => {
|
|
|
150
184
|
>
|
|
151
185
|
<path
|
|
152
186
|
class="alpha-circular-pyramid-stack-content__line transition-all duration-300"
|
|
187
|
+
:class="{
|
|
188
|
+
'alpha-circular-pyramid-stack-content__line--svg-animated': isAnimated,
|
|
189
|
+
}"
|
|
153
190
|
:d="connectorPath"
|
|
154
191
|
fill="none"
|
|
155
192
|
:stroke="stackColor"
|
|
156
193
|
stroke-width="1.25"
|
|
157
194
|
stroke-linecap="round"
|
|
158
195
|
stroke-linejoin="round"
|
|
196
|
+
pathLength="1"
|
|
159
197
|
:style="{
|
|
160
198
|
opacity: isActive ? 1 : 0.65,
|
|
161
199
|
}"
|
|
@@ -164,35 +202,30 @@ const stackColor = computed(() => {
|
|
|
164
202
|
</div>
|
|
165
203
|
<!-- Content Card -->
|
|
166
204
|
<div
|
|
167
|
-
|
|
168
|
-
:class="
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
205
|
+
v-bind="forwardedAttrs()"
|
|
206
|
+
:class="
|
|
207
|
+
className({
|
|
208
|
+
'alpha-circular-pyramid-stack-content--animated': isAnimated,
|
|
209
|
+
})
|
|
210
|
+
"
|
|
173
211
|
:style="{
|
|
174
212
|
width: `${contentWidth}px`,
|
|
175
213
|
minWidth: `${contentWidth}px`,
|
|
176
214
|
maxWidth: `${contentWidth}px`,
|
|
177
215
|
boxSizing: 'border-box',
|
|
178
216
|
borderColor: stackColor,
|
|
179
|
-
backgroundColor: isActive
|
|
180
|
-
? 'rgba(255, 255, 255, 0.95)'
|
|
181
|
-
: 'rgba(255, 255, 255, 0.85)',
|
|
182
217
|
boxShadow: isActive
|
|
183
|
-
? `0 4px 14px ${stackColor}
|
|
218
|
+
? `0 4px 14px color-mix(in srgb, ${stackColor} 15%, transparent)`
|
|
184
219
|
: 'none',
|
|
220
|
+
'--card-transform': deltaY ? `translateY(${deltaY}px)` : 'none',
|
|
185
221
|
transform: deltaY ? `translateY(${deltaY}px)` : undefined,
|
|
186
222
|
}"
|
|
187
223
|
>
|
|
188
|
-
<
|
|
189
|
-
class="text-[10px]
|
|
190
|
-
:style="{
|
|
191
|
-
color: isActive ? '#0f172a' : '#475569',
|
|
192
|
-
}"
|
|
224
|
+
<p
|
|
225
|
+
class="text-[10px] transition-colors duration-300 wrap-break-word line-clamp-3"
|
|
193
226
|
>
|
|
194
|
-
<slot
|
|
195
|
-
</
|
|
227
|
+
<slot />
|
|
228
|
+
</p>
|
|
196
229
|
</div>
|
|
197
230
|
</div>
|
|
198
231
|
</template>
|
|
@@ -205,4 +238,78 @@ const stackColor = computed(() => {
|
|
|
205
238
|
.alpha-circular-pyramid-stack-content--active {
|
|
206
239
|
backdrop-filter: blur(8px);
|
|
207
240
|
}
|
|
241
|
+
|
|
242
|
+
.alpha-circular-pyramid-stack-content__dot--animated {
|
|
243
|
+
animation: alpha-pyramid-dot-pop 120ms cubic-bezier(0.16, 1, 0.3, 1)
|
|
244
|
+
var(--content-delay) both;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
@keyframes alpha-pyramid-dot-pop {
|
|
248
|
+
0% {
|
|
249
|
+
opacity: 0;
|
|
250
|
+
transform: translate(-50%, -50%) scale(0);
|
|
251
|
+
}
|
|
252
|
+
100% {
|
|
253
|
+
opacity: 1;
|
|
254
|
+
transform: translate(-50%, -50%) scale(1);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
.alpha-circular-pyramid-stack-content__line--animated {
|
|
259
|
+
transform-origin: left center;
|
|
260
|
+
animation: alpha-pyramid-line-draw 500ms cubic-bezier(0.4, 0, 0.2, 1)
|
|
261
|
+
calc(var(--content-delay) + 120ms) both;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
@keyframes alpha-pyramid-line-draw {
|
|
265
|
+
0% {
|
|
266
|
+
opacity: 0;
|
|
267
|
+
transform: translateY(-50%) scaleX(0);
|
|
268
|
+
}
|
|
269
|
+
2% {
|
|
270
|
+
opacity: 1;
|
|
271
|
+
transform: translateY(-50%) scaleX(0);
|
|
272
|
+
}
|
|
273
|
+
100% {
|
|
274
|
+
opacity: 1;
|
|
275
|
+
transform: translateY(-50%) scaleX(1);
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
.alpha-circular-pyramid-stack-content__line--svg-animated {
|
|
280
|
+
stroke-dasharray: 1;
|
|
281
|
+
animation: alpha-pyramid-svg-line-draw 500ms cubic-bezier(0.4, 0, 0.2, 1)
|
|
282
|
+
calc(var(--content-delay) + 120ms) both;
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
@keyframes alpha-pyramid-svg-line-draw {
|
|
286
|
+
0% {
|
|
287
|
+
opacity: 0;
|
|
288
|
+
stroke-dashoffset: 1;
|
|
289
|
+
}
|
|
290
|
+
2% {
|
|
291
|
+
opacity: 1;
|
|
292
|
+
stroke-dashoffset: 1;
|
|
293
|
+
}
|
|
294
|
+
100% {
|
|
295
|
+
opacity: 1;
|
|
296
|
+
stroke-dashoffset: 0;
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
.alpha-circular-pyramid-stack-content--animated {
|
|
301
|
+
animation: alpha-pyramid-card-in 240ms cubic-bezier(0.16, 1, 0.3, 1)
|
|
302
|
+
calc(var(--content-delay) + 380ms) both;
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
@keyframes alpha-pyramid-card-in {
|
|
306
|
+
0% {
|
|
307
|
+
opacity: 0;
|
|
308
|
+
transform: var(--card-transform, none) translateX(10px);
|
|
309
|
+
}
|
|
310
|
+
100% {
|
|
311
|
+
opacity: 1;
|
|
312
|
+
transform: var(--card-transform, none) translateX(0);
|
|
313
|
+
}
|
|
314
|
+
}
|
|
208
315
|
</style>
|