@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.
Files changed (220) hide show
  1. package/README.md +133 -75
  2. package/components/card/chevron-card/ChevronCard.vue +44 -32
  3. package/components/card/chevron-card/ChevronCardBadge.vue +14 -8
  4. package/components/card/chevron-card/ChevronCardContent.vue +15 -13
  5. package/components/card/chevron-card/style.css +12 -0
  6. package/components/card/{horiz-card/HorizCard.vue → horizontal-card/HorizontalCard.vue} +78 -85
  7. package/components/card/{horiz-card/HorizCardBadge.vue → horizontal-card/HorizontalCardBadge.vue} +15 -10
  8. package/components/card/{horiz-card/HorizCardContent.vue → horizontal-card/HorizontalCardContent.vue} +11 -11
  9. package/components/card/{horiz-card/HorizCardIcon.vue → horizontal-card/HorizontalCardIcon.vue} +24 -38
  10. package/components/card/horizontal-card/style.css +17 -0
  11. package/components/card/{vert-card/VertCard.vue → vertical-card/VerticalCard.vue} +80 -103
  12. package/components/card/{vert-card/VertCardBadge.vue → vertical-card/VerticalCardBadge.vue} +15 -10
  13. package/components/card/{vert-card/VertCardContent.vue → vertical-card/VerticalCardContent.vue} +13 -12
  14. package/components/card/{vert-card/VertCardIcon.vue → vertical-card/VerticalCardIcon.vue} +15 -33
  15. package/components/card/vertical-card/style.css +19 -0
  16. package/components/comparisons/arc-comparison/ArcComparison.vue +376 -80
  17. package/components/comparisons/arc-comparison/ArcComparisonBadge.vue +9 -4
  18. package/components/comparisons/arc-comparison/ArcComparisonContent.vue +9 -4
  19. package/components/comparisons/arc-comparison/ArcComparisonHeading.vue +9 -4
  20. package/components/comparisons/arc-comparison/ArcComparisonLeft.vue +39 -63
  21. package/components/comparisons/arc-comparison/ArcComparisonOrbit.vue +9 -8
  22. package/components/comparisons/arc-comparison/ArcComparisonRight.vue +39 -63
  23. package/components/comparisons/arc-comparison/style.css +27 -0
  24. package/components/comparisons/table-comparison/TableComparison.vue +17 -97
  25. package/components/comparisons/table-comparison/TableComparisonCell.vue +22 -20
  26. package/components/comparisons/table-comparison/{TableComparisonCol.vue → TableComparisonColumn.vue} +16 -14
  27. package/components/comparisons/table-comparison/{TableComparisonCols.vue → TableComparisonColumns.vue} +5 -8
  28. package/components/comparisons/table-comparison/TableComparisonRow.vue +10 -14
  29. package/components/comparisons/table-comparison/TableComparisonRows.vue +1 -4
  30. package/components/comparisons/table-comparison/style.css +15 -0
  31. package/components/core/Date.vue +2 -5
  32. package/components/core/QnA.vue +1 -1
  33. package/components/core/Quote.vue +3 -6
  34. package/components/core/ReflectedTitle.vue +2 -6
  35. package/components/core/Speaker.vue +5 -10
  36. package/components/core/TransitionHeading.vue +2 -5
  37. package/components/core/arc-orbit/ArcOrbit.vue +65 -84
  38. package/components/core/arc-orbit/ArcOrbitBadge.vue +9 -11
  39. package/components/core/arc-orbit/ArcOrbitCallout.vue +30 -32
  40. package/components/core/arc-orbit/ArcOrbitContent.vue +6 -12
  41. package/components/core/arc-orbit/ArcOrbitHeading.vue +13 -11
  42. package/components/core/arc-orbit/style.css +20 -0
  43. package/components/core/style.css +9 -0
  44. package/components/core/thanks/{ThanksContent.vue → SquareThanks.vue} +36 -31
  45. package/components/core/thanks/SquareThanksContent.vue +89 -0
  46. package/components/core/thanks/ThanksOutlineSquare.vue +2 -5
  47. package/components/core/thanks/ThanksSquare.vue +2 -5
  48. package/components/core/thanks/style.css +30 -0
  49. package/components/defense-in-depth/arc-defense-in-depth/ArcDefenseInDepth.vue +802 -0
  50. package/components/defense-in-depth/arc-defense-in-depth/ArcDefenseInDepthLayer.vue +240 -0
  51. package/components/defense-in-depth/arc-defense-in-depth/ArcDefenseInDepthLayerHeading.vue +96 -0
  52. package/components/defense-in-depth/arc-defense-in-depth/ArcDefenseInDepthLayerPart.vue +501 -0
  53. package/components/defense-in-depth/arc-defense-in-depth/ArcDefenseInDepthLayerSector.vue +162 -0
  54. package/components/defense-in-depth/arc-defense-in-depth/style.css +38 -0
  55. package/components/facets/tetrad/{rect-orbit-tetrad/RectOrbitTetrad.vue → rectangle-orbit-tetrad/RectangleOrbitTetrad.vue} +66 -63
  56. package/components/facets/tetrad/{rect-orbit-tetrad/RectOrbitTetradCallout.vue → rectangle-orbit-tetrad/RectangleOrbitTetradCallout.vue} +62 -48
  57. package/components/facets/tetrad/rectangle-orbit-tetrad/RectangleOrbitTetradCenter.vue +54 -0
  58. package/components/facets/tetrad/rectangle-orbit-tetrad/RectangleOrbitTetradContent.vue +44 -0
  59. package/components/facets/tetrad/rectangle-orbit-tetrad/RectangleOrbitTetradHeading.vue +27 -0
  60. package/components/facets/tetrad/{rect-orbit-tetrad/RectOrbitTetradIcon.vue → rectangle-orbit-tetrad/RectangleOrbitTetradIcon.vue} +23 -13
  61. package/components/facets/tetrad/rectangle-orbit-tetrad/style.css +22 -0
  62. package/components/facets/triad/arrow-triad/ArrowTriad.vue +99 -109
  63. package/components/facets/triad/arrow-triad/ArrowTriadCallout.vue +31 -59
  64. package/components/facets/triad/arrow-triad/ArrowTriadContent.vue +18 -13
  65. package/components/facets/triad/arrow-triad/ArrowTriadHeading.vue +20 -13
  66. package/components/facets/triad/arrow-triad/ArrowTriadIcon.vue +14 -9
  67. package/components/facets/triad/arrow-triad/style.css +15 -0
  68. package/components/facets/triad/gear-triad/GearTriad.vue +73 -64
  69. package/components/facets/triad/gear-triad/GearTriadCallout.vue +58 -53
  70. package/components/facets/triad/gear-triad/GearTriadCenter.vue +9 -4
  71. package/components/facets/triad/gear-triad/GearTriadContent.vue +21 -36
  72. package/components/facets/triad/gear-triad/GearTriadDetail.vue +92 -0
  73. package/components/facets/triad/gear-triad/GearTriadDetails.vue +169 -0
  74. package/components/facets/triad/gear-triad/GearTriadDetailsContent.vue +18 -0
  75. package/components/facets/triad/gear-triad/GearTriadDetailsHeading.vue +60 -0
  76. package/components/facets/triad/gear-triad/GearTriadHeading.vue +19 -13
  77. package/components/facets/triad/gear-triad/GearTriadIcon.vue +22 -9
  78. package/components/facets/triad/gear-triad/style.css +26 -0
  79. package/components/facets/triad/{hex-triad/HexTriad.vue → hexagon-triad/HexagonTriad.vue} +81 -63
  80. package/components/facets/triad/{hex-triad/HexTriadBadge.vue → hexagon-triad/HexagonTriadBadge.vue} +38 -12
  81. package/components/facets/triad/{hex-triad/HexTriadCallout.vue → hexagon-triad/HexagonTriadCallout.vue} +35 -31
  82. package/components/facets/triad/hexagon-triad/HexagonTriadCenterBadge.vue +74 -0
  83. package/components/facets/triad/hexagon-triad/HexagonTriadContent.vue +34 -0
  84. package/components/facets/triad/hexagon-triad/HexagonTriadHeading.vue +44 -0
  85. package/components/facets/triad/{hex-triad/HexTriadLayer.vue → hexagon-triad/HexagonTriadLayer.vue} +12 -4
  86. package/components/facets/triad/hexagon-triad/style.css +22 -0
  87. package/components/process/arc-arrow-process/ArcArrowProcess.vue +13 -35
  88. package/components/process/arc-arrow-process/ArcArrowProcessArrow.vue +20 -21
  89. package/components/process/arc-arrow-process/ArcArrowProcessCallout.vue +30 -71
  90. package/components/process/arc-arrow-process/ArcArrowProcessContent.vue +18 -13
  91. package/components/process/arc-arrow-process/ArcArrowProcessHeading.vue +18 -18
  92. package/components/process/arc-arrow-process/ArcArrowProcessIcon.vue +23 -11
  93. package/components/process/arc-arrow-process/style.css +20 -0
  94. package/components/pyramid/circular-pyramid/CircularPyramid.vue +276 -190
  95. package/components/pyramid/circular-pyramid/CircularPyramidStack.vue +83 -98
  96. package/components/pyramid/circular-pyramid/CircularPyramidStackContent.vue +136 -29
  97. package/components/pyramid/circular-pyramid/CircularPyramidStackHeading.vue +212 -0
  98. package/components/pyramid/circular-pyramid/style.css +26 -0
  99. package/components/pyramid/square-pyramid/SquarePyramid.vue +199 -83
  100. package/components/pyramid/square-pyramid/SquarePyramidStack.vue +87 -95
  101. package/components/pyramid/square-pyramid/SquarePyramidStackContent.vue +138 -27
  102. package/components/pyramid/square-pyramid/SquarePyramidStackHeading.vue +212 -0
  103. package/components/pyramid/square-pyramid/style.css +48 -0
  104. package/components/style.css +35 -0
  105. package/layouts/core/arc-toc.vue +40 -45
  106. package/layouts/core/bg-center.vue +7 -6
  107. package/layouts/core/style.css +17 -0
  108. package/layouts/shifting-heading/shifting-intro.vue +4 -13
  109. package/layouts/thanks/thanks.vue +5 -5
  110. package/package.json +8 -6
  111. package/style.css +17 -0
  112. package/uno.config.ts +1 -0
  113. package/utils/activateOnKeyboard.ts +14 -0
  114. package/utils/{chevronCard → card/chevron-card}/context.ts +1 -1
  115. package/utils/card/chevron-card/index.ts +1 -0
  116. package/utils/card/horizontal-card/context.ts +12 -0
  117. package/utils/{horizCard/createHorizCardGeometry.ts → card/horizontal-card/createHorizontalCardGeometry.ts} +10 -45
  118. package/utils/card/horizontal-card/index.ts +2 -0
  119. package/utils/card/vertical-card/context.ts +19 -0
  120. package/utils/{vertCard/createVertCardGeometry.ts → card/vertical-card/createVerticalCardGeometry.ts} +9 -130
  121. package/utils/card/vertical-card/index.ts +2 -0
  122. package/utils/colors.ts +93 -0
  123. package/utils/{arcComparison → comparisons/arc-comparison}/context.ts +0 -11
  124. package/utils/{arcComparison → comparisons/arc-comparison}/createArcComparisonGeometry.ts +1 -1
  125. package/utils/comparisons/arc-comparison/resolveArcComparisonItems.ts +33 -0
  126. package/utils/comparisons/table-comparison/constants.ts +47 -0
  127. package/utils/{tableComparison → comparisons/table-comparison}/context.ts +2 -2
  128. package/utils/{arcOrbit → core/arc-orbit}/resolveArcOrbitItems.ts +11 -15
  129. package/utils/defense-in-depth/arc-defense-in-depth/context.ts +113 -0
  130. package/utils/defense-in-depth/arc-defense-in-depth/createArcDefenseInDepthGeometry.ts +600 -0
  131. package/utils/defense-in-depth/arc-defense-in-depth/types.ts +144 -0
  132. package/utils/defense-in-depth/shared/colors.ts +51 -0
  133. package/utils/defense-in-depth/shared/constants.ts +22 -0
  134. package/utils/defense-in-depth/shared/types.ts +7 -0
  135. package/utils/facets/tetrad/rectangle-orbit-tetrad/context.ts +31 -0
  136. package/utils/{rectOrbitTetrad/createRectOrbitTetradGeometry.ts → facets/tetrad/rectangle-orbit-tetrad/createRectangleOrbitTetradGeometry.ts} +5 -104
  137. package/utils/facets/tetrad/rectangle-orbit-tetrad/index.ts +3 -0
  138. package/utils/{rectOrbitTetrad/resolveRectOrbitTetradItems.ts → facets/tetrad/rectangle-orbit-tetrad/resolveRectangleOrbitTetradItems.ts} +41 -49
  139. package/utils/{arrowTriad → facets/triad/arrow-triad}/resolveArrowTriadItems.ts +27 -28
  140. package/utils/{gearTriad → facets/triad/gear-triad}/context.ts +5 -5
  141. package/utils/{gearTriad → facets/triad/gear-triad}/createGearTriadGeometry.ts +2 -0
  142. package/utils/{gearTriad → facets/triad/gear-triad}/resolveGearTriadItems.ts +23 -24
  143. package/utils/facets/triad/hexagon-triad/context.ts +25 -0
  144. package/utils/{hexTriad/createHexTriadGeometry.ts → facets/triad/hexagon-triad/createHexagonTriadGeometry.ts} +11 -27
  145. package/utils/facets/triad/hexagon-triad/index.ts +3 -0
  146. package/utils/facets/triad/hexagon-triad/resolveHexagonTriadItems.ts +60 -0
  147. package/utils/{shiftingHeading → layouts/shifting-heading}/collectShiftingIntroNodes.ts +1 -0
  148. package/utils/layouts/table-of-contents/calculateTocCenterAlignmentOffset.ts +17 -0
  149. package/utils/{tableOfContents → layouts/table-of-contents}/calculateTocMarkerPositions.ts +0 -12
  150. package/utils/{tableOfContents → layouts/table-of-contents}/createTocConnectorPath.ts +11 -5
  151. package/utils/{mergeUno → merge-uno}/classifyVisual.ts +1 -1
  152. package/utils/{mergeUno → merge-uno}/collectClassNames.ts +9 -3
  153. package/utils/process/arc-arrow-process/resolveArcArrowProcessItems.ts +180 -0
  154. package/utils/pyramid/circular-pyramid/context.ts +1 -4
  155. package/utils/pyramid/circular-pyramid/createCircularPyramidGeometry.ts +6 -10
  156. package/utils/pyramid/shared/colors.ts +33 -83
  157. package/utils/pyramid/shared/constants.ts +3 -2
  158. package/utils/pyramid/shared/types.ts +0 -5
  159. package/utils/pyramid/square-pyramid/context.ts +1 -4
  160. package/utils/pyramid/square-pyramid/createSquarePyramidGeometry.ts +6 -10
  161. package/utils/useDiagramAutoScale.ts +64 -16
  162. package/utils/useMergedUnoAttrs.ts +9 -5
  163. package/components/card/chevron-card/ChevronCardHeading.vue +0 -39
  164. package/components/card/horiz-card/HorizCardHeading.vue +0 -47
  165. package/components/card/vert-card/VertCardHeading.vue +0 -68
  166. package/components/card/vert-card/VertCardTitle.vue +0 -76
  167. package/components/comparisons/arc-comparison/ArcComparisonContents.vue +0 -17
  168. package/components/comparisons/arc-comparison/ArcComparisonTitle.vue +0 -29
  169. package/components/core/arc-orbit/ArcOrbitContents.vue +0 -18
  170. package/components/core/arc-orbit/ArcOrbitTitle.vue +0 -50
  171. package/components/facets/tetrad/rect-orbit-tetrad/RectOrbitTetradCenter.vue +0 -53
  172. package/components/facets/tetrad/rect-orbit-tetrad/RectOrbitTetradContent.vue +0 -39
  173. package/components/facets/tetrad/rect-orbit-tetrad/RectOrbitTetradHeading.vue +0 -44
  174. package/components/facets/triad/gear-triad/GearTriadContents.vue +0 -111
  175. package/components/facets/triad/gear-triad/GearTriadDescription.vue +0 -38
  176. package/components/facets/triad/hex-triad/HexTriadCenterBadge.vue +0 -51
  177. package/components/facets/triad/hex-triad/HexTriadContent.vue +0 -20
  178. package/components/facets/triad/hex-triad/HexTriadHeading.vue +0 -28
  179. package/components/pyramid/circular-pyramid/CircularPyramidStackTitle.vue +0 -138
  180. package/components/pyramid/square-pyramid/SquarePyramidStackTitle.vue +0 -134
  181. package/layouts/core/table-of-contents.vue +0 -30
  182. package/utils/arcArrowProcess/resolveArcArrowProcessItems.ts +0 -189
  183. package/utils/arcComparison/resolveArcComparisonItems.ts +0 -102
  184. package/utils/chevronCard/createChevronCardGeometry.ts +0 -48
  185. package/utils/chevronCard/index.ts +0 -2
  186. package/utils/hexTriad/context.ts +0 -25
  187. package/utils/hexTriad/index.ts +0 -3
  188. package/utils/hexTriad/resolveHexTriadItems.ts +0 -63
  189. package/utils/horizCard/context.ts +0 -13
  190. package/utils/horizCard/index.ts +0 -2
  191. package/utils/pyramid/index.ts +0 -3
  192. package/utils/rectOrbitTetrad/context.ts +0 -31
  193. package/utils/rectOrbitTetrad/index.ts +0 -3
  194. package/utils/tableComparison/constants.ts +0 -72
  195. package/utils/tableOfContents/calculateTocCenterAlignmentOffset.ts +0 -11
  196. package/utils/vertCard/context.ts +0 -18
  197. package/utils/vertCard/index.ts +0 -2
  198. package/utils/{arcComparison → comparisons/arc-comparison}/index.ts +0 -0
  199. package/utils/{tableComparison → comparisons/table-comparison}/index.ts +0 -0
  200. package/utils/{arcOrbit → core/arc-orbit}/context.ts +0 -0
  201. package/utils/{arcOrbit → core/arc-orbit}/createArcOrbitGeometry.ts +0 -0
  202. package/utils/{arcOrbit → core/arc-orbit}/index.ts +0 -0
  203. package/utils/{arrowTriad → facets/triad/arrow-triad}/context.ts +0 -0
  204. package/utils/{arrowTriad → facets/triad/arrow-triad}/createArrowTriadGeometry.ts +0 -0
  205. package/utils/{arrowTriad → facets/triad/arrow-triad}/index.ts +0 -0
  206. package/utils/{gearTriad → facets/triad/gear-triad}/index.ts +0 -0
  207. package/utils/{tableOfContents → layouts/table-of-contents}/calculateUniformTocArticleWidth.ts +0 -0
  208. package/utils/{tableOfContents → layouts/table-of-contents}/createTocArcPath.ts +0 -0
  209. package/utils/{tableOfContents → layouts/table-of-contents}/index.ts +0 -0
  210. package/utils/{mergeUno → merge-uno}/classifyLayout.ts +0 -0
  211. package/utils/{mergeUno → merge-uno}/classifySimple.ts +0 -0
  212. package/utils/{mergeUno → merge-uno}/classifyTypography.ts +0 -0
  213. package/utils/{mergeUno → merge-uno}/classifyUtility.ts +0 -0
  214. package/utils/{mergeUno → merge-uno}/index.ts +0 -0
  215. package/utils/{mergeUno → merge-uno}/mergeClassValues.ts +0 -0
  216. package/utils/{mergeUno → merge-uno}/splitVariantScope.ts +1 -1
  217. package/utils/{mergeUno → merge-uno}/types.ts +0 -0
  218. package/utils/{arcArrowProcess → process/arc-arrow-process}/context.ts +1 -1
  219. /package/utils/{arcArrowProcess → process/arc-arrow-process}/createArcArrowProcessGeometry.ts +0 -0
  220. /package/utils/{arcArrowProcess → process/arc-arrow-process}/index.ts +0 -0
@@ -0,0 +1,240 @@
1
+ <script setup lang="ts">
2
+ import {
3
+ type ComputedRef,
4
+ computed,
5
+ inject,
6
+ onUnmounted,
7
+ provide,
8
+ ref,
9
+ watch,
10
+ } from 'vue';
11
+
12
+ import {
13
+ ARC_DID_LAYER_KEY,
14
+ ARC_DID_ROOT_KEY,
15
+ type IArcDefenseInDepthLayerContext,
16
+ type IArcDefenseInDepthRegisteredLayerData,
17
+ type IArcDefenseInDepthRegisteredSectorData,
18
+ } from '../../../utils/defense-in-depth/arc-defense-in-depth/context';
19
+ import type {
20
+ IArcDefenseInDepthPartItem,
21
+ IArcDefenseInDepthSectorItem,
22
+ } from '../../../utils/defense-in-depth/arc-defense-in-depth/types';
23
+
24
+ import { useMergedUnoAttrs } from '../../../utils/useMergedUnoAttrs';
25
+
26
+ defineOptions({
27
+ inheritAttrs: false,
28
+ name: 'ArcDefenseInDepthLayer',
29
+ });
30
+
31
+ export interface IArcDefenseInDepthLayerProps {
32
+ readonly color?: string;
33
+ readonly textColor?: string;
34
+ readonly index?: number;
35
+ readonly active?: boolean;
36
+ }
37
+
38
+ const props = withDefaults(defineProps<IArcDefenseInDepthLayerProps>(), {
39
+ color: undefined,
40
+ textColor: undefined,
41
+ index: undefined,
42
+ active: undefined,
43
+ });
44
+
45
+ const rootContext = inject(ARC_DID_ROOT_KEY, undefined);
46
+ const currentTitle = ref<string | undefined>();
47
+
48
+ // Manage sector and part registrations within this layer
49
+ const registeredSectorTokens = ref<symbol[]>([]);
50
+ const registeredSectorData = ref<
51
+ Map<symbol, IArcDefenseInDepthRegisteredSectorData>
52
+ >(new Map());
53
+
54
+ function registerSector(
55
+ token?: symbol,
56
+ sectorDataRef?: ComputedRef<
57
+ IArcDefenseInDepthRegisteredSectorData | undefined
58
+ >,
59
+ ) {
60
+ const sToken = token ?? Symbol();
61
+ if (!registeredSectorTokens.value.includes(sToken)) {
62
+ registeredSectorTokens.value = [...registeredSectorTokens.value, sToken];
63
+ }
64
+
65
+ let stopWatch: (() => void) | undefined;
66
+ if (sectorDataRef) {
67
+ stopWatch = watch(
68
+ sectorDataRef,
69
+ (val) => {
70
+ const nextMap = new Map(registeredSectorData.value);
71
+ if (val) {
72
+ nextMap.set(sToken, val);
73
+ } else {
74
+ nextMap.delete(sToken);
75
+ }
76
+
77
+ registeredSectorData.value = nextMap;
78
+ },
79
+ { immediate: true },
80
+ );
81
+ }
82
+
83
+ const index = computed(() => registeredSectorTokens.value.indexOf(sToken));
84
+
85
+ return {
86
+ index,
87
+ unregister: () => {
88
+ stopWatch?.();
89
+ registeredSectorTokens.value = registeredSectorTokens.value.filter(
90
+ (t) => t !== sToken,
91
+ );
92
+ const nextMap = new Map(registeredSectorData.value);
93
+ nextMap.delete(sToken);
94
+ registeredSectorData.value = nextMap;
95
+ },
96
+ };
97
+ }
98
+
99
+ function registerPart(
100
+ token?: symbol,
101
+ partDataRef?: ComputedRef<IArcDefenseInDepthPartItem | undefined>,
102
+ ) {
103
+ const pToken = token ?? Symbol();
104
+ const sectorDataRef = computed<
105
+ IArcDefenseInDepthRegisteredSectorData | undefined
106
+ >(() => {
107
+ const pData = partDataRef?.value;
108
+ if (!pData) {
109
+ return undefined;
110
+ }
111
+
112
+ return {
113
+ parts: [pData],
114
+ split: false,
115
+ angle: pData.angle,
116
+ span: pData.span,
117
+ color: pData.color,
118
+ };
119
+ });
120
+ return registerSector(pToken, sectorDataRef);
121
+ }
122
+
123
+ const registeredSectorsList = computed<IArcDefenseInDepthSectorItem[]>(() => {
124
+ return registeredSectorTokens.value
125
+ .map((token) => registeredSectorData.value.get(token))
126
+ .filter(
127
+ (item): item is IArcDefenseInDepthRegisteredSectorData =>
128
+ item !== undefined,
129
+ )
130
+ .map((data) => ({
131
+ parts: data.parts ?? [],
132
+ split: data.split,
133
+ angle: data.angle,
134
+ span: data.span,
135
+ color: data.color,
136
+ }));
137
+ });
138
+
139
+ const registeredPartsList = computed<IArcDefenseInDepthPartItem[]>(() => {
140
+ return registeredSectorsList.value.flatMap(
141
+ (s) => s.parts as IArcDefenseInDepthPartItem[],
142
+ );
143
+ });
144
+
145
+ const layerToken = Symbol();
146
+ const layerRegistrationData = computed<IArcDefenseInDepthRegisteredLayerData>(
147
+ () => ({
148
+ title: currentTitle.value,
149
+ color: props.color,
150
+ sectors: registeredSectorsList.value,
151
+ parts: registeredPartsList.value,
152
+ index: props.index !== undefined ? Number(props.index) : undefined,
153
+ }),
154
+ );
155
+
156
+ const registration = rootContext?.registerLayer(
157
+ layerToken,
158
+ layerRegistrationData,
159
+ );
160
+
161
+ onUnmounted(() => {
162
+ registration?.unregister();
163
+ });
164
+
165
+ const resolvedIndex = computed<number>(() => {
166
+ if (props.index !== undefined) {
167
+ return Number(props.index);
168
+ }
169
+
170
+ return registration?.index.value ?? 0;
171
+ });
172
+
173
+ const layerGeo = computed(() => {
174
+ if (!rootContext) {
175
+ return undefined;
176
+ }
177
+
178
+ return rootContext.geo.value.layers[resolvedIndex.value];
179
+ });
180
+
181
+ const isActive = computed<boolean>(() => {
182
+ if (props.active !== undefined) {
183
+ return props.active;
184
+ }
185
+
186
+ if (!rootContext) {
187
+ return false;
188
+ }
189
+
190
+ return (
191
+ rootContext.activeIndex.value === -1 ||
192
+ rootContext.activeIndex.value === resolvedIndex.value
193
+ );
194
+ });
195
+
196
+ const effectiveColor = computed<string>(() => {
197
+ if (props.color) {
198
+ return props.color;
199
+ }
200
+
201
+ if (rootContext) {
202
+ return rootContext.getLayerColor(resolvedIndex.value);
203
+ }
204
+
205
+ return 'var(--alpha-arc-defense-in-depth-layer-accent)';
206
+ });
207
+
208
+ const layerContext: IArcDefenseInDepthLayerContext = {
209
+ layerIndex: resolvedIndex,
210
+ layerGeo,
211
+ isActive,
212
+ color: effectiveColor,
213
+ textColor: computed(() => props.textColor),
214
+ title: computed(() => currentTitle.value),
215
+ setTitle: (title: string) => {
216
+ currentTitle.value = title;
217
+ },
218
+ partsCount: computed(() => registeredPartsList.value.length),
219
+ registerPart,
220
+ registerSector,
221
+ };
222
+
223
+ provide(ARC_DID_LAYER_KEY, layerContext);
224
+
225
+ const { className, forwardedAttrs } = useMergedUnoAttrs(
226
+ 'alpha-arc-defense-in-depth__layer contents',
227
+ );
228
+ </script>
229
+
230
+ <template>
231
+ <div
232
+ v-bind="forwardedAttrs()"
233
+ :class="className()"
234
+ :data-index="resolvedIndex"
235
+ :data-active="isActive"
236
+ >
237
+ <!-- Default children slots -->
238
+ <slot />
239
+ </div>
240
+ </template>
@@ -0,0 +1,96 @@
1
+ <script setup lang="ts">
2
+ import { computed, inject, useSlots, type VNode, watch } from 'vue';
3
+
4
+ import { ARC_DID_LAYER_KEY } from '../../../utils/defense-in-depth/arc-defense-in-depth/context';
5
+ import { useMergedUnoAttrs } from '../../../utils/useMergedUnoAttrs';
6
+
7
+ defineOptions({
8
+ inheritAttrs: false,
9
+ name: 'ArcDefenseInDepthLayerHeading',
10
+ });
11
+
12
+ export interface IArcDefenseInDepthLayerHeadingProps {
13
+ readonly color?: string;
14
+ }
15
+
16
+ const props = defineProps<IArcDefenseInDepthLayerHeadingProps>();
17
+
18
+ const slots = useSlots();
19
+ const layerContext = inject(ARC_DID_LAYER_KEY, undefined);
20
+
21
+ function extractTextFromVNodes(nodes: VNode[]): string {
22
+ let text = '';
23
+ for (const node of nodes) {
24
+ if (typeof node.type === 'string' && node.type === 'br') {
25
+ text += '\n';
26
+ } else if (typeof node.children === 'string') {
27
+ text += node.children;
28
+ } else if (Array.isArray(node.children)) {
29
+ text += extractTextFromVNodes(node.children as VNode[]);
30
+ }
31
+ }
32
+
33
+ return text.trim();
34
+ }
35
+
36
+ const rawTitle = computed(() => {
37
+ if (slots.default) {
38
+ return extractTextFromVNodes(slots.default());
39
+ }
40
+
41
+ return '';
42
+ });
43
+
44
+ watch(
45
+ rawTitle,
46
+ (val) => {
47
+ if (val && layerContext?.setTitle) {
48
+ layerContext.setTitle(val);
49
+ }
50
+ },
51
+ { immediate: true },
52
+ );
53
+
54
+ const maxTitleWidth = computed(() => {
55
+ const geo = layerContext?.layerGeo.value;
56
+ if (!geo) {
57
+ return 130;
58
+ }
59
+
60
+ const arcLen = geo.midRadius * (40 * (Math.PI / 180));
61
+ return Math.max(75, Math.min(130, Math.round(arcLen * 0.82)));
62
+ });
63
+
64
+ const headingColor = computed(() => {
65
+ return props.color ?? layerContext?.textColor?.value;
66
+ });
67
+
68
+ const positionStyle = computed(() => {
69
+ const geo = layerContext?.layerGeo.value;
70
+ const colorVars = headingColor.value
71
+ ? { '--alpha-arc-defense-in-depth-layer-heading': headingColor.value }
72
+ : {};
73
+
74
+ if (!geo) {
75
+ return colorVars;
76
+ }
77
+
78
+ return {
79
+ left: `${geo.titlePosition.x}px`,
80
+ top: `${geo.titlePosition.y}px`,
81
+ transform: 'translate(-50%, -50%)',
82
+ maxWidth: `${maxTitleWidth.value}px`,
83
+ ...colorVars,
84
+ };
85
+ });
86
+
87
+ const { className, forwardedAttrs } = useMergedUnoAttrs(
88
+ 'alpha-arc-defense-in-depth__layer-title absolute z-20 max-w-[140px] pointer-events-auto select-none text-center font-semibold text-(--alpha-arc-defense-in-depth-layer-heading) tracking-tight leading-snug whitespace-pre-line text-sm md:text-base transition-colors duration-200',
89
+ );
90
+ </script>
91
+
92
+ <template>
93
+ <div v-bind="forwardedAttrs()" :class="className()" :style="positionStyle">
94
+ <slot />
95
+ </div>
96
+ </template>