@dcrackel/hematournamentui 1.0.706 → 1.0.708

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 (350) hide show
  1. package/.prettierignore +7 -1
  2. package/.storybook/main.js +5 -12
  3. package/.storybook/preview-head.html +10 -3
  4. package/.storybook/preview.js +5 -13
  5. package/AGENTS.md +118 -88
  6. package/README.md +29 -22
  7. package/dist/HemaTournamentUI-lib.es.js +8394 -8807
  8. package/dist/HemaTournamentUI-lib.umd.js +27 -27
  9. package/dist/hematournamentui-tailwind.css +183 -428
  10. package/dist/hematournamentui.css +1 -1
  11. package/eslint.config.js +49 -23
  12. package/package.json +15 -11
  13. package/postcss.config.js +3 -3
  14. package/prettier.config.js +16 -10
  15. package/src/config/boutScreenConfigurations.js +52 -50
  16. package/src/index.js +2 -0
  17. package/src/main.js +1 -1
  18. package/src/mocks/EventQuestionsMock.js +43 -55
  19. package/src/mocks/assignments.js +180 -181
  20. package/src/mocks/clubGetAllMock.js +8143 -8143
  21. package/src/mocks/eventMock.js +205 -205
  22. package/src/mocks/eventPersonGetInitalPoolAssignmentsLivePools.js +541 -542
  23. package/src/mocks/eventPersonGetInitalPoolAssignmentsPreparing.js +522 -523
  24. package/src/mocks/eventPersonGetInitialPoolAssignments.js +386 -387
  25. package/src/mocks/eventPersonGetInitialPoolAssignments2.js +2267 -2268
  26. package/src/mocks/eventPersonGetInitialStaff.js +94 -95
  27. package/src/mocks/eventPersonGetPoolAssignmentEvent.js +161 -162
  28. package/src/mocks/eventRules.js +87 -86
  29. package/src/mocks/eventpersonGetEventById.js +1737 -1737
  30. package/src/mocks/getAllClubs.js +8143 -8143
  31. package/src/mocks/getAllStaffByTournamentId.js +74 -75
  32. package/src/mocks/getAllWeapons.js +81 -82
  33. package/src/mocks/getAttendance.js +43 -44
  34. package/src/mocks/getClub.js +43 -44
  35. package/src/mocks/getClubDisplayByClubId.js +104 -105
  36. package/src/mocks/getDEBouts-128Fencers.js +3247 -3248
  37. package/src/mocks/getDEBouts-42Fencers.js +3736 -3737
  38. package/src/mocks/getDEBouts-67Fencers.js +6684 -6690
  39. package/src/mocks/getDEBouts-DoubleElim.js +4198 -4199
  40. package/src/mocks/getDEBouts-TableOf128.js +37 -0
  41. package/src/mocks/getDEBouts-TableOf64.js +35 -0
  42. package/src/mocks/getDEWithBouts.js +628 -629
  43. package/src/mocks/getDeBouts-12fencers.js +1255 -1256
  44. package/src/mocks/getDeBouts-15fencers.js +925 -927
  45. package/src/mocks/getDeBouts-22fencers.js +1683 -1685
  46. package/src/mocks/getDeBouts-6fencers.js +818 -818
  47. package/src/mocks/getEventByTournamentId.js +47 -48
  48. package/src/mocks/getFinalEventResult.js +304 -305
  49. package/src/mocks/getPenaltiesByEvent.js +655 -656
  50. package/src/mocks/getPoolResults.js +1533 -1534
  51. package/src/mocks/getPoolsWithBouts.js +662 -663
  52. package/src/mocks/getPoolsWithBouts6PoolId139.js +885 -886
  53. package/src/mocks/getPoolsWithBoutsByPoolId.js +841 -841
  54. package/src/mocks/getPoolsWithBoutsClubColors.js +4 -4
  55. package/src/mocks/getPoolsWithBoutsComplete.js +919 -921
  56. package/src/mocks/locationMock.js +3213 -3214
  57. package/src/mocks/mockRoutes.js +3 -3
  58. package/src/mocks/personGetAllMock.js +2536 -2537
  59. package/src/mocks/personsMock.js +17569 -17570
  60. package/src/mocks/singleEventMock.js +249 -250
  61. package/src/mocks/tournamentMock.js +1988 -1927
  62. package/src/stories/Atoms/CheckBox/BaseCheckbox.stories.js +25 -23
  63. package/src/stories/Atoms/CheckBox/BaseCheckbox.vue +30 -24
  64. package/src/stories/Atoms/Icon/BaseIcon.stories.js +63 -64
  65. package/src/stories/Atoms/Icon/BaseIcon.test.js +67 -69
  66. package/src/stories/Atoms/Icon/BaseIcon.vue +2 -3
  67. package/src/stories/Atoms/Input/BaseInput.stories.js +18 -18
  68. package/src/stories/Atoms/Input/BaseInput.test.js +65 -67
  69. package/src/stories/Atoms/Input/BaseInput.vue +36 -31
  70. package/src/stories/Atoms/RadioGroup/BaseRadioGroup.stories.js +21 -21
  71. package/src/stories/Atoms/RadioGroup/BaseRadioGroup.test.js +31 -31
  72. package/src/stories/Atoms/RadioGroup/BaseRadioGroup.vue +23 -18
  73. package/src/stories/Atoms/Tag/BaseTag.stories.js +21 -21
  74. package/src/stories/Atoms/Tag/BaseTag.test.js +26 -30
  75. package/src/stories/Atoms/Tag/BaseTag.vue +18 -19
  76. package/src/stories/Atoms/Text/BaseText.stories.js +54 -62
  77. package/src/stories/Atoms/Text/BaseText.test.js +152 -154
  78. package/src/stories/Atoms/Text/BaseText.vue +103 -81
  79. package/src/stories/Configure.mdx +5 -3
  80. package/src/stories/Molecules/Boxes/BoutBoxes/HandshotCounterBox/HandshotCounterBox.stories.js +24 -24
  81. package/src/stories/Molecules/Boxes/BoutBoxes/HandshotCounterBox/HandshotCounterBox.vue +33 -15
  82. package/src/stories/Molecules/Boxes/BoutBoxes/PassesBox/PassesBox.stories.js +46 -48
  83. package/src/stories/Molecules/Boxes/BoutBoxes/PassesBox/PassesBox.vue +38 -25
  84. package/src/stories/Molecules/Boxes/BoutBoxes/PenaltyConfirmationBox/PenaltyConfirmationBox.stories.js +4 -4
  85. package/src/stories/Molecules/Boxes/BoutBoxes/PenaltyConfirmationBox/PenaltyConfirmationBox.vue +9 -4
  86. package/src/stories/Molecules/Boxes/BoutBoxes/ScoreBox/ScoreBox.stories.js +90 -90
  87. package/src/stories/Molecules/Boxes/BoutBoxes/ScoreBox/ScoreBox.vue +51 -32
  88. package/src/stories/Molecules/Boxes/BoutBoxes/TimerBox/TimerBox.stories.js +25 -25
  89. package/src/stories/Molecules/Boxes/BoutBoxes/TimerBox/TimerBox.vue +47 -12
  90. package/src/stories/Molecules/Boxes/CounterBox/CounterBox.stories.js +19 -19
  91. package/src/stories/Molecules/Boxes/CounterBox/CounterBox.vue +25 -19
  92. package/src/stories/Molecules/Boxes/EventStatusBox/EventStatusBox.stories.js +25 -28
  93. package/src/stories/Molecules/Boxes/EventStatusBox/EventStatusBox.vue +7 -7
  94. package/src/stories/Molecules/Breadcrumb/Admin/Breadcrumb.stories.js +28 -29
  95. package/src/stories/Molecules/Breadcrumb/Admin/Breadcrumb.test.js +58 -58
  96. package/src/stories/Molecules/Breadcrumb/Admin/Breadcrumb.vue +15 -15
  97. package/src/stories/Molecules/Buttons/BaseButton/BaseButton.stories.js +86 -86
  98. package/src/stories/Molecules/Buttons/BaseButton/BaseButton.test.js +101 -103
  99. package/src/stories/Molecules/Buttons/BaseButton/BaseButton.vue +87 -24
  100. package/src/stories/Molecules/Buttons/ButtonBar/ButtonBar.stories.js +31 -31
  101. package/src/stories/Molecules/Buttons/ButtonBar/ButtonBar.vue +19 -21
  102. package/src/stories/Molecules/CombinationInputs/TitledInput/TitledInput.stories.js +57 -57
  103. package/src/stories/Molecules/CombinationInputs/TitledInput/TitledInput.test.js +64 -64
  104. package/src/stories/Molecules/CombinationInputs/TitledInput/TitledInput.vue +17 -16
  105. package/src/stories/Molecules/Filters/FilterAndSortBar/FilterAndSortBar.stories.js +19 -19
  106. package/src/stories/Molecules/Filters/FilterAndSortBar/FilterAndSortBar.vue +18 -7
  107. package/src/stories/Molecules/Filters/FilterUpcomingPast/FilterUpcomingPast.stories.js +16 -18
  108. package/src/stories/Molecules/Filters/FilterUpcomingPast/FilterUpcomingPast.vue +31 -13
  109. package/src/stories/Molecules/Indicators/MissingHemaRatingsId/MissingHemaRatingsId.stories.js +23 -0
  110. package/src/stories/Molecules/Indicators/MissingHemaRatingsId/MissingHemaRatingsId.vue +35 -0
  111. package/src/stories/Molecules/Indicators/ServerConnected/ServerConnected.stories.js +27 -27
  112. package/src/stories/Molecules/Indicators/ServerConnected/ServerConnected.vue +6 -5
  113. package/src/stories/Molecules/Inputs/MultiSelect/MultiSelect.stories.js +35 -35
  114. package/src/stories/Molecules/Inputs/MultiSelect/MultiSelect.vue +13 -8
  115. package/src/stories/Molecules/Inputs/Toggle/Toggle.stories.js +27 -27
  116. package/src/stories/Molecules/Inputs/Toggle/Toggle.vue +8 -5
  117. package/src/stories/Molecules/Menus/TabBar/TabBar.stories.js +18 -18
  118. package/src/stories/Molecules/Menus/TabBar/TabBar.vue +1 -2
  119. package/src/stories/Molecules/Modals/AddDisplayModal/AddDisplay.stories.js +36 -27
  120. package/src/stories/Molecules/Modals/AddDisplayModal/AddDisplayModal.vue +25 -15
  121. package/src/stories/Molecules/Modals/BaseModal/BaseModal.stories.js +66 -65
  122. package/src/stories/Molecules/Modals/BaseModal/BaseModal.vue +47 -9
  123. package/src/stories/Molecules/Modals/ConfirmModal/ConfirmModal.stories.js +23 -23
  124. package/src/stories/Molecules/Modals/ConfirmModal/ConfirmModal.vue +59 -11
  125. package/src/stories/Molecules/Modals/DirectorModal/DirectorModal.stories.js +37 -37
  126. package/src/stories/Molecules/Modals/DirectorModal/DirectorModal.test.js +18 -0
  127. package/src/stories/Molecules/Modals/DirectorModal/DirectorModal.vue +29 -23
  128. package/src/stories/Molecules/Modals/EditBoutModal/EditBoutModal.stories.js +41 -41
  129. package/src/stories/Molecules/Modals/EditBoutModal/EditBoutModal.vue +28 -16
  130. package/src/stories/Molecules/Modals/EventWizardModal/EventWizardModal.stories.js +29 -30
  131. package/src/stories/Molecules/Modals/EventWizardModal/EventWizardModal.vue +18 -16
  132. package/src/stories/Molecules/Modals/LoadingModal/LoadingModal.stories.js +21 -21
  133. package/src/stories/Molecules/Modals/LoadingModal/LoadingModal.vue +7 -7
  134. package/src/stories/Molecules/Modals/PenaltyModal/PenaltyModal.stories.js +24 -24
  135. package/src/stories/Molecules/Modals/PenaltyModal/PenaltyModal.vue +30 -25
  136. package/src/stories/Molecules/Reorder/ReorderableShell.stories.js +81 -77
  137. package/src/stories/Molecules/Reorder/ReorderableShell.vue +46 -43
  138. package/src/stories/Molecules/StepIndicator/BaseStepIndicator/StepIndicator.stories.js +40 -40
  139. package/src/stories/Molecules/StepIndicator/BaseStepIndicator/StepIndicator.vue +23 -25
  140. package/src/stories/Organisms/Cards/BoutCard/BoutCard.stories.js +34 -29
  141. package/src/stories/Organisms/Cards/BoutCard/BoutCard.vue +69 -66
  142. package/src/stories/Organisms/Cards/BoutCard/Variants/BoutCardActive/BoutCardActive.stories.js +24 -22
  143. package/src/stories/Organisms/Cards/BoutCard/Variants/BoutCardActive/BoutCardActive.vue +53 -41
  144. package/src/stories/Organisms/Cards/BoutCard/Variants/BoutCardInactive/BoutCardInactive.stories.js +24 -37
  145. package/src/stories/Organisms/Cards/BoutCard/Variants/BoutCardInactive/BoutCardInactive.vue +88 -103
  146. package/src/stories/Organisms/Cards/BoutCard/Variants/BoutCardReorder/BoutCardReorder.vue +13 -14
  147. package/src/stories/Organisms/Cards/BoutCard/Variants/BoutCardWaiting/BoutCardWaiting.stories.js +5 -5
  148. package/src/stories/Organisms/Cards/BoutCard/Variants/BoutCardWaiting/BoutCardWaiting.vue +22 -21
  149. package/src/stories/Organisms/Cards/BracketDirectorAssignmentCard/BracketDirectorAssignmentCard.stories.js +33 -0
  150. package/src/stories/Organisms/Cards/BracketDirectorAssignmentCard/BracketDirectorAssignmentCard.test.js +45 -0
  151. package/src/stories/Organisms/Cards/BracketDirectorAssignmentCard/BracketDirectorAssignmentCard.vue +103 -0
  152. package/src/stories/Organisms/Cards/ClubCard/ClubCard.stories.js +14 -17
  153. package/src/stories/Organisms/Cards/ClubCard/ClubCard.vue +25 -18
  154. package/src/stories/Organisms/Cards/Director/DirectorCard.stories.js +23 -23
  155. package/src/stories/Organisms/Cards/Director/DirectorCard.vue +159 -103
  156. package/src/stories/Organisms/Cards/EditBout/EditBout.stories.js +47 -47
  157. package/src/stories/Organisms/Cards/EditBout/EditBout.test.js +51 -0
  158. package/src/stories/Organisms/Cards/EditBout/EditBout.vue +82 -54
  159. package/src/stories/Organisms/Cards/EventCard/EventCard.stories.js +9 -10
  160. package/src/stories/Organisms/Cards/EventCard/EventCard.vue +83 -63
  161. package/src/stories/Organisms/Cards/FencerCard/FencerCard.stories.js +105 -105
  162. package/src/stories/Organisms/Cards/FencerCard/FencerCard.vue +298 -194
  163. package/src/stories/Organisms/Cards/FencerFinalResultCard/FencerFinalResultCard.stories.js +14 -14
  164. package/src/stories/Organisms/Cards/FencerFinalResultCard/FencerFinalResultCard.vue +37 -26
  165. package/src/stories/Organisms/Cards/FencerPoolResultsCard/FencerPoolResults.stories.js +24 -24
  166. package/src/stories/Organisms/Cards/FencerPoolResultsCard/FencerPoolResultsCard.vue +95 -28
  167. package/src/stories/Organisms/Cards/ImportFencerCard/ImportFencerCard.stories.js +59 -60
  168. package/src/stories/Organisms/Cards/ImportFencerCard/ImportFencerCard.vue +13 -7
  169. package/src/stories/Organisms/Cards/KioskCard/KioskCard.stories.js +34 -34
  170. package/src/stories/Organisms/Cards/KioskCard/KioskCard.vue +149 -104
  171. package/src/stories/Organisms/Cards/PenaltyCard/PenaltyCard.stories.js +19 -20
  172. package/src/stories/Organisms/Cards/PenaltyCard/PenaltyCard.vue +207 -163
  173. package/src/stories/Organisms/Cards/PenaltyFencerCard/PenaltyFencerCard.stories.js +17 -17
  174. package/src/stories/Organisms/Cards/PenaltyFencerCard/PenaltyFencerCard.vue +88 -46
  175. package/src/stories/Organisms/Cards/PoolBoutMatchCard/PoolBoutMatchCard.stories.js +182 -182
  176. package/src/stories/Organisms/Cards/PoolBoutMatchCard/PoolBoutMatchCard.vue +21 -12
  177. package/src/stories/Organisms/Cards/PoolFencerCard/PoolFencerCard.stories.js +25 -28
  178. package/src/stories/Organisms/Cards/PoolFencerCard/PoolFencerCard.vue +28 -22
  179. package/src/stories/Organisms/Cards/StaffCard/StaffCard.stories.js +62 -62
  180. package/src/stories/Organisms/Cards/StaffCard/StaffCard.vue +27 -22
  181. package/src/stories/Organisms/Cards/TableauBoutCard/TableauBoutCard.stories.js +60 -98
  182. package/src/stories/Organisms/Cards/TableauBoutCard/TableauBoutCard.test.js +143 -0
  183. package/src/stories/Organisms/Cards/TableauBoutCard/TableauBoutCard.vue +256 -202
  184. package/src/stories/Organisms/Cards/TableauFencerCard/TableauFencerCard.stories.js +69 -93
  185. package/src/stories/Organisms/Cards/TableauFencerCard/TableauFencerCard.vue +80 -111
  186. package/src/stories/Organisms/Cards/TournamentAdminCard/TournamentAdmin.stories.js +20 -20
  187. package/src/stories/Organisms/Cards/TournamentAdminCard/TournamentAdminCard.vue +62 -33
  188. package/src/stories/Organisms/Cards/WaitlistFencerCard/WaitlistFencerCard.vue +56 -32
  189. package/src/stories/Organisms/ComplexInputs/AddressAutocomplete/AddressAutocomplete.stories.js +6 -7
  190. package/src/stories/Organisms/ComplexInputs/AddressAutocomplete/AddressAutocomplete.vue +7 -8
  191. package/src/stories/Organisms/ComplexInputs/ClubColorPicker/ClubColorPicker.stories.js +31 -31
  192. package/src/stories/Organisms/ComplexInputs/ClubColorPicker/ClubColorPicker.vue +30 -35
  193. package/src/stories/Organisms/ComplexInputs/DatePicker/DatePicker.stories.js +13 -16
  194. package/src/stories/Organisms/ComplexInputs/DatePicker/DatePicker.vue +68 -70
  195. package/src/stories/Organisms/ComplexInputs/DropDown/DropDownMenu.stories.js +32 -34
  196. package/src/stories/Organisms/ComplexInputs/DropDown/DropDownMenu.vue +48 -25
  197. package/src/stories/Organisms/ComplexInputs/FindLocation/FindLocation.stories.js +21 -21
  198. package/src/stories/Organisms/ComplexInputs/FindLocation/FindLocation.vue +65 -38
  199. package/src/stories/Organisms/ComplexInputs/FindOrAddPerson/FindOrAddPerson.stories.js +19 -20
  200. package/src/stories/Organisms/ComplexInputs/FindOrAddPerson/FindOrAddPerson.vue +46 -21
  201. package/src/stories/Organisms/ComplexInputs/FindPerson/FindPerson.stories.js +22 -22
  202. package/src/stories/Organisms/ComplexInputs/FindPerson/FindPerson.vue +68 -23
  203. package/src/stories/Organisms/ComplexInputs/ImageCropper/ImageCropper.stories.js +13 -13
  204. package/src/stories/Organisms/ComplexInputs/ImageCropper/ImageCropper.vue +25 -24
  205. package/src/stories/Organisms/ComplexInputs/TextBoxEditor/TextBoxEditor.stories.js +6 -10
  206. package/src/stories/Organisms/ComplexInputs/TextBoxEditor/TextBoxEditor.vue +112 -48
  207. package/src/stories/Organisms/Containers/BoutsSection/BoutsSection.stories.js +43 -44
  208. package/src/stories/Organisms/Containers/BoutsSection/BoutsSection.vue +30 -23
  209. package/src/stories/Organisms/Containers/FinalResults/FinalResultsTable.stories.js +20 -20
  210. package/src/stories/Organisms/Containers/FinalResults/FinalResultsTable.vue +12 -12
  211. package/src/stories/Organisms/Containers/KioskContainer/KioskContainer.stories.js +24 -25
  212. package/src/stories/Organisms/Containers/KioskContainer/KioskContainer.vue +112 -87
  213. package/src/stories/Organisms/Containers/Pool/Pool.stories.js +54 -54
  214. package/src/stories/Organisms/Containers/Pool/Pool.vue +64 -41
  215. package/src/stories/Organisms/Containers/PoolGrid/PoolGrid.stories.js +17 -19
  216. package/src/stories/Organisms/Containers/PoolGrid/PoolGrid.vue +189 -135
  217. package/src/stories/Organisms/Containers/PoolResults/PoolResultsTable.stories.js +53 -54
  218. package/src/stories/Organisms/Containers/PoolResults/PoolResultsTable.vue +107 -73
  219. package/src/stories/Organisms/Containers/Tableau/Tableau.stories.js +23 -24
  220. package/src/stories/Organisms/Containers/Tableau/Tableau.test.js +177 -10
  221. package/src/stories/Organisms/Containers/Tableau/Tableau.vue +319 -198
  222. package/src/stories/Organisms/Containers/Tableau/components/BracketDirectorAssignmentPanel.test.js +29 -0
  223. package/src/stories/Organisms/Containers/Tableau/components/BracketDirectorAssignmentPanel.vue +46 -0
  224. package/src/stories/Organisms/Containers/Tableau/components/TableauSvgOverlay.test.js +21 -0
  225. package/src/stories/Organisms/Containers/Tableau/components/TableauSvgOverlay.vue +39 -0
  226. package/src/stories/Organisms/Containers/Tableau/layout/TableauLayoutEngine.js +145 -0
  227. package/src/stories/Organisms/Containers/Tableau/layout/TableauLayoutEngine.test.js +64 -0
  228. package/src/stories/Organisms/Containers/Tableau/plannedAssignments.js +57 -0
  229. package/src/stories/Organisms/Containers/Tableau/plannedAssignments.test.js +65 -0
  230. package/src/stories/Organisms/Containers/TableauColumn/TabeauColumn.stories.js +26 -27
  231. package/src/stories/Organisms/Containers/TableauColumn/TableauColumn.vue +31 -26
  232. package/src/stories/Organisms/Form/AddDisplay/AddDisplay.stories.js +26 -26
  233. package/src/stories/Organisms/Form/AddDisplay/AddDisplay.vue +130 -118
  234. package/src/stories/Organisms/Form/AddNewPerson/AddNewPerson.stories.js +14 -15
  235. package/src/stories/Organisms/Form/AddNewPerson/AddNewPerson.vue +94 -88
  236. package/src/stories/Organisms/Grids/GridContainer.stories.js +101 -101
  237. package/src/stories/Organisms/Grids/GridContainer.vue +160 -136
  238. package/src/stories/Organisms/Headers/AttendanceSummary/AttendanceSummary.stories.js +47 -47
  239. package/src/stories/Organisms/Headers/AttendanceSummary/AttendanceSummary.vue +65 -54
  240. package/src/stories/Organisms/Headers/EventFinalResultsHeader/EventFinalResultsHeader.stories.js +27 -27
  241. package/src/stories/Organisms/Headers/EventFinalResultsHeader/EventFinalResultsHeader.vue +38 -22
  242. package/src/stories/Organisms/Headers/PenaltySummary/PenaltySummary.stories.js +80 -80
  243. package/src/stories/Organisms/Headers/PenaltySummary/PenaltySummary.vue +14 -6
  244. package/src/stories/Organisms/Headers/PoolResultsHeader/PoolResultsHeader.stories.js +34 -34
  245. package/src/stories/Organisms/Headers/PoolResultsHeader/PoolResultsHeader.vue +36 -36
  246. package/src/stories/Organisms/Headers/PoolSummary/PoolSummary.stories.js +21 -21
  247. package/src/stories/Organisms/Headers/PoolSummary/PoolSummary.vue +56 -29
  248. package/src/stories/Organisms/Headers/ToggleHeader/ToggleHeader.stories.js +38 -38
  249. package/src/stories/Organisms/Headers/ToggleHeader/ToggleHeader.vue +19 -20
  250. package/src/stories/Organisms/RankCalculator/ByLetter/RankCalculator.stories.js +12 -13
  251. package/src/stories/Organisms/RankCalculator/ByLetter/RankCalculator.vue +47 -41
  252. package/src/stories/Organisms/RankCalculator/ByPoints/RankCalculatorByPoints.stories.js +12 -13
  253. package/src/stories/Organisms/RankCalculator/ByPoints/RankCalculatorByPoints.vue +66 -37
  254. package/src/stories/Organisms/Skeletons/ClubManagement/ClubManagement.stories.js +6 -10
  255. package/src/stories/Organisms/Skeletons/ClubManagement/ClubMangementSkeleton.vue +2 -2
  256. package/src/stories/Organisms/Skeletons/EventCard/EventCardSkeleton.stories.js +6 -10
  257. package/src/stories/Organisms/Skeletons/EventCard/EventCardSkeleton.vue +2 -3
  258. package/src/stories/Organisms/Skeletons/FencerCard/FencerCardSkeleton.stories.js +6 -10
  259. package/src/stories/Organisms/Skeletons/FencerCard/FencerCardSkeleton.vue +1 -1
  260. package/src/stories/Organisms/Skeletons/PersonManagement/PersonManagementSkeleton.stories.js +6 -9
  261. package/src/stories/Organisms/Skeletons/PersonManagement/PersonManagementSkeleton.vue +2 -2
  262. package/src/stories/Organisms/Skeletons/PoolSkeleton/PoolSkeleton.stories.js +6 -10
  263. package/src/stories/Organisms/Skeletons/PoolSkeleton/PoolSkeleton.vue +10 -4
  264. package/src/stories/Organisms/Skeletons/TournamentCard/TournamentCardSkeleton.stories.js +6 -10
  265. package/src/stories/Organisms/Skeletons/TournamentCard/TournamentCardSkeleton.vue +2 -2
  266. package/src/stories/Organisms/Wizards/EditEventWizard/BasicEventInfo/BasicEventInfo.stories.js +34 -34
  267. package/src/stories/Organisms/Wizards/EditEventWizard/BasicEventInfo/BasicEventInfo.vue +106 -56
  268. package/src/stories/Organisms/Wizards/EditEventWizard/DirectElimination/DirectElimination.stories.js +95 -95
  269. package/src/stories/Organisms/Wizards/EditEventWizard/DirectElimination/DirectElimination.vue +129 -69
  270. package/src/stories/Organisms/Wizards/EditEventWizard/DirectEliminationPromotion/DirectEliminationPromotion.stories.js +87 -88
  271. package/src/stories/Organisms/Wizards/EditEventWizard/DirectEliminationPromotion/DirectEliminationPromotion.vue +105 -60
  272. package/src/stories/Organisms/Wizards/EditEventWizard/EditEventWizard.stories.js +82 -82
  273. package/src/stories/Organisms/Wizards/EditEventWizard/EditEventWizard.vue +150 -177
  274. package/src/stories/Organisms/Wizards/EditEventWizard/EventCustomization/EventCustomization.stories.js +28 -28
  275. package/src/stories/Organisms/Wizards/EditEventWizard/EventCustomization/EventCustomization.vue +96 -36
  276. package/src/stories/Organisms/Wizards/EditEventWizard/PoolConfiguration/PoolConfiguration.stories.js +99 -99
  277. package/src/stories/Organisms/Wizards/EditEventWizard/PoolConfiguration/PoolConfiguration.vue +115 -67
  278. package/src/stories/Templates/Assignment/Assignment.stories.js +22 -23
  279. package/src/stories/Templates/Assignment/Assignment.vue +210 -161
  280. package/src/stories/Templates/ClubManagement/ClubBasic/ClubBasic.stories.js +90 -90
  281. package/src/stories/Templates/ClubManagement/ClubBasic/ClubBasic.vue +68 -55
  282. package/src/stories/Templates/ClubManagement/ClubManagement.stories.js +87 -87
  283. package/src/stories/Templates/ClubManagement/ClubManagement.vue +167 -147
  284. package/src/stories/Templates/EventManagement/Bracket/Bracket.stories.js +216 -109
  285. package/src/stories/Templates/EventManagement/Bracket/Bracket.test.js +138 -43
  286. package/src/stories/Templates/EventManagement/Bracket/Bracket.vue +198 -195
  287. package/src/stories/Templates/EventManagement/Bracket/BracketPlannedSuggestions.js +39 -0
  288. package/src/stories/Templates/EventManagement/Bracket/BracketStoryHarness.js +39 -0
  289. package/src/stories/Templates/EventManagement/Bracket/BracketStoryHarness.test.js +79 -0
  290. package/src/stories/Templates/EventManagement/EditEventInfo/EditEventInfo.stories.js +49 -50
  291. package/src/stories/Templates/EventManagement/EditEventInfo/EditEventInfo.vue +21 -21
  292. package/src/stories/Templates/EventManagement/EventAttendance/EventAttendance.stories.js +105 -103
  293. package/src/stories/Templates/EventManagement/EventAttendance/EventAttendance.vue +289 -226
  294. package/src/stories/Templates/EventManagement/EventFinalResults/EventFinalResults.stories.js +30 -30
  295. package/src/stories/Templates/EventManagement/EventFinalResults/EventFinalResults.vue +27 -22
  296. package/src/stories/Templates/EventManagement/KioskDisplay/KioskDisplay.stories.js +44 -45
  297. package/src/stories/Templates/EventManagement/KioskDisplay/KioskDisplay.vue +52 -43
  298. package/src/stories/Templates/EventManagement/Penalties/PenaltyReport.stories.js +28 -29
  299. package/src/stories/Templates/EventManagement/Penalties/PenaltyReport.vue +54 -39
  300. package/src/stories/Templates/EventManagement/PoolLive/PoolLive.stories.js +80 -111
  301. package/src/stories/Templates/EventManagement/PoolLive/PoolLive.test.js +121 -0
  302. package/src/stories/Templates/EventManagement/PoolLive/PoolLive.vue +290 -255
  303. package/src/stories/Templates/EventManagement/PoolManagement/PoolManagement.stories.js +109 -107
  304. package/src/stories/Templates/EventManagement/PoolManagement/PoolManagement.vue +144 -87
  305. package/src/stories/Templates/EventManagement/PoolResults/PoolResults.stories.js +56 -57
  306. package/src/stories/Templates/EventManagement/PoolResults/PoolResults.vue +132 -123
  307. package/src/stories/Templates/EventManagement/StaffList/StaffList.stories.js +56 -57
  308. package/src/stories/Templates/EventManagement/StaffList/StaffList.vue +84 -47
  309. package/src/stories/Templates/Menus/Admin/AdminLeftMenu.stories.js +29 -29
  310. package/src/stories/Templates/Menus/Admin/AdminLeftMenu.vue +71 -67
  311. package/src/stories/Templates/Menus/EditEventsTopMenu/EditEventsTopMenu.stories.js +39 -40
  312. package/src/stories/Templates/Menus/EditEventsTopMenu/EditEventsTopMenu.vue +79 -71
  313. package/src/stories/Templates/PersonManagement/Admin/Administration/Administration.stories.js +47 -47
  314. package/src/stories/Templates/PersonManagement/Admin/Administration/Administration.vue +39 -42
  315. package/src/stories/Templates/PersonManagement/Admin/FencerAdmin/FencerAdmin.stories.js +54 -54
  316. package/src/stories/Templates/PersonManagement/Admin/FencerAdmin/FencerAdmin.vue +27 -31
  317. package/src/stories/Templates/PersonManagement/Admin/MergeAccounts/MergeAccounts.stories.js +69 -69
  318. package/src/stories/Templates/PersonManagement/Admin/MergeAccounts/MergeAccounts.vue +78 -89
  319. package/src/stories/Templates/PersonManagement/Attendance/Attendance.stories.js +22 -22
  320. package/src/stories/Templates/PersonManagement/Attendance/Attendance.vue +61 -33
  321. package/src/stories/Templates/PersonManagement/Basic/BasicEdit.stories.js +29 -29
  322. package/src/stories/Templates/PersonManagement/Basic/BasicEdit.vue +80 -53
  323. package/src/stories/Templates/PersonManagement/PersonManagement.stories.js +84 -86
  324. package/src/stories/Templates/PersonManagement/PersonManagement.vue +107 -82
  325. package/src/stories/Templates/TournamentManagement/ListEvents/ListEvents.stories.js +31 -31
  326. package/src/stories/Templates/TournamentManagement/ListEvents/ListEvents.vue +70 -51
  327. package/src/stories/Templates/TournamentManagement/TournamentManagement.stories.js +79 -79
  328. package/src/stories/Templates/TournamentManagement/TournamentManagement.vue +275 -230
  329. package/src/stories/Templates/TournamentManagement/TournamentPageOne/TournamentPageOne.stories.js +113 -113
  330. package/src/stories/Templates/TournamentManagement/TournamentPageOne/TournamentPageOne.vue +175 -146
  331. package/src/stories/Templates/TournamentManagement/TournamentPageTwo/TournamentPageTwo.stories.js +77 -77
  332. package/src/stories/Templates/TournamentManagement/TournamentPageTwo/TournamentPageTwo.vue +208 -185
  333. package/src/stories/Util/Validations/AddNewPersonModalValidation.js +23 -19
  334. package/src/stories/Util/Validations/ClubManagementValidations.js +17 -21
  335. package/src/stories/Util/Validations/PersonManagementValidations.js +26 -22
  336. package/src/stories/Util/Validations/TournamentFieldsValidations.js +20 -18
  337. package/src/stories/Util/seeding.js +131 -131
  338. package/src/stories/Util/tabs.js +75 -75
  339. package/tailwind/tailwind.css +5 -7
  340. package/tailwind.config.js +12 -15
  341. package/vite.config.js +3 -3
  342. package/src/mocks/getDirectors.js +0 -18
  343. package/src/stories/Molecules/Modals/AssignDirectorModal/AssignDirectorModal.stories.js +0 -45
  344. package/src/stories/Molecules/Modals/AssignDirectorModal/AssignDirectorModal.vue +0 -111
  345. package/src/stories/Organisms/Cards/DirectorAssignmentCard/DirectorAssignmentCard.stories.js +0 -45
  346. package/src/stories/Organisms/Cards/DirectorAssignmentCard/DirectorAssignmentCard.vue +0 -83
  347. package/src/stories/Organisms/Cards/TableauBoutCard/SpacingConfig.js +0 -111
  348. package/src/stories/Organisms/Containers/TableauLines/SpacingConfig.js +0 -112
  349. package/src/stories/Organisms/Containers/TableauLines/TableauLines.stories.js +0 -23
  350. package/src/stories/Organisms/Containers/TableauLines/TableauLines.vue +0 -79
@@ -1,7 +1,7 @@
1
1
  <template>
2
2
  <section class="w-full">
3
3
  <div v-if="c.customStatus && c.status !== 'active'" class="text-left">
4
- <BaseText :text="c.customStatus" size="sm" color="primary"/>
4
+ <BaseText :text="c.customStatus" size="sm" color="primary" />
5
5
  </div>
6
6
 
7
7
  <!-- Desktop -->
@@ -10,27 +10,27 @@
10
10
  <div class="flex justify-between shadow-lg drop-shadow p-2 rounded-xl bg-poolBox w-full mr-4">
11
11
  <div class="flex space-x-4 items-center">
12
12
  <div class="relative">
13
- <img :src="fencer1Portrait" alt="Portrait" class="w-12 h-12 rounded-full"/>
13
+ <img :src="fencer1Portrait" alt="Portrait" class="w-12 h-12 rounded-full" />
14
14
  <div :class="`w-4 h-4 rounded-full bg-${card.fencer1.colorDot} relative -mt-4 ml-9 z-10`"></div>
15
15
  </div>
16
16
  <div>
17
- <BaseText :text="c.fencer1.name" size="md" color="quaternary" weight="bold"/>
18
- <BaseText :text="c.fencer1.team" size="xs" color="quinary"/>
17
+ <BaseText :text="c.fencer1.name" size="md" color="quaternary" weight="bold" />
18
+ <BaseText :text="c.fencer1.team" size="xs" color="quinary" />
19
19
  </div>
20
20
  </div>
21
- <BaseText :text="score1Display" size="3xl" weight="bold" class="align-middle pr-3 pt-0.5"/>
21
+ <BaseText :text="score1Display" size="3xl" weight="bold" class="align-middle pr-3 pt-0.5" />
22
22
  </div>
23
23
 
24
24
  <!-- Fencer 2 -->
25
25
  <div class="flex justify-between shadow-lg drop-shadow p-2 rounded-xl bg-poolBox w-full ml-4">
26
26
  <div class="flex space-x-4 justify-between w-full">
27
- <BaseText :text="score2Display" size="3xl" weight="bold" class="align-middle pl-3 pt-0.5"/>
27
+ <BaseText :text="score2Display" size="3xl" weight="bold" class="align-middle pl-3 pt-0.5" />
28
28
  <div class="w-full">
29
- <BaseText :text="c.fencer2.name" size="md" color="quaternary" weight="bold" class="text-right"/>
30
- <BaseText :text="c.fencer2.team" size="xs" color="quinary" class="text-right"/>
29
+ <BaseText :text="c.fencer2.name" size="md" color="quaternary" weight="bold" class="text-right" />
30
+ <BaseText :text="c.fencer2.team" size="xs" color="quinary" class="text-right" />
31
31
  </div>
32
32
  <div class="relative w-20">
33
- <img :src="fencer2Portrait" alt="Portrait" class="w-12 h-12 rounded-full"/>
33
+ <img :src="fencer2Portrait" alt="Portrait" class="w-12 h-12 rounded-full" />
34
34
  <div :class="`w-4 h-4 rounded-full bg-${card.fencer2.colorDot} relative -mt-4 -ml-2 z-10`"></div>
35
35
  </div>
36
36
  </div>
@@ -39,42 +39,40 @@
39
39
  <!-- Actions -->
40
40
  <section v-if="editMode" class="text-right pl-4 flex">
41
41
  <BaseButton
42
- v-if="isScheduled"
43
- label="Start" size="sm" type="primary"
44
- @buttonClick="$emit('start', c.ids)" class="w-16"/>
45
- <BaseButton
46
- v-if="!isScheduled"
47
- label="Edit" size="sm" type="primary"
48
- @buttonClick="$emit('edit', c.ids)" class="w-16"/>
49
- <!-- Admin assign button -->
42
+ v-if="isScheduled"
43
+ label="Start"
44
+ size="sm"
45
+ type="primary"
46
+ @buttonClick="$emit('start', c.ids)"
47
+ class="w-16"
48
+ />
50
49
  <BaseButton
51
- v-if="isAdmin && isScheduled"
52
- label=""
53
- type="primary"
54
- iconName="fa-user-plus"
55
- :iconLeft="false"
56
- class="w-10 h-10 pr-4"
57
- @buttonClick="$emit('assign', c.ids)"
50
+ v-if="!isScheduled"
51
+ label="Edit"
52
+ size="sm"
53
+ type="primary"
54
+ @buttonClick="$emit('edit', c.ids)"
55
+ class="w-16"
58
56
  />
59
57
  </section>
60
58
  </div>
61
59
 
62
60
  <!-- Mobile -->
63
- <section
64
- class="relative flex md:hidden items-center border rounded-md bg-poolBox transition overflow-hidden"
65
- :class="mobileCardActionClass"
66
- >
61
+ <section
62
+ class="relative flex md:hidden items-center border rounded-md bg-poolBox transition overflow-hidden"
63
+ :class="mobileCardActionClass"
64
+ >
67
65
  <!-- main tappable area -->
68
66
  <div class="flex flex-1 items-center p-4 min-w-0" @click="onCardClick">
69
67
  <!-- left portrait or index when reordering -->
70
68
  <div v-if="!reorderMode" class="relative flex flex-col items-center flex-none">
71
- <img :src="fencer1Portrait" alt="Portrait" class="w-12 h-12 rounded-full"/>
69
+ <img :src="fencer1Portrait" alt="Portrait" class="w-12 h-12 rounded-full" />
72
70
  <div :class="`w-4 h-4 rounded-full bg-${card.fencer1.colorDot} relative -mt-4 ml-9 z-10`"></div>
73
71
  </div>
74
72
 
75
73
  <div v-if="reorderMode" class="flex flex-col items-center -mt-3 select-none flex-none">
76
- <BaseText text="bout" size="xs" color="quinary" weight="bold"/>
77
- <BaseText :text="`${(c.ids.orderIndex ?? 0) + 1}`" size="3xl" color="quaternary" weight="bold"/>
74
+ <BaseText text="bout" size="xs" color="quinary" weight="bold" />
75
+ <BaseText :text="`${(c.ids.orderIndex ?? 0) + 1}`" size="3xl" color="quaternary" weight="bold" />
78
76
  </div>
79
77
 
80
78
  <!-- center -->
@@ -82,80 +80,67 @@
82
80
  <div class="flex items-center justify-center">
83
81
  <div :class="`mr-2 bg-${card.fencer1.colorDot} w-3 h-3 flex-none`"></div>
84
82
  <BaseText
85
- :text="c.fencer1.name"
86
- size="sm"
87
- color="quinary"
88
- weight="bold"
89
- class="leading-none truncate max-w-full"
83
+ :text="c.fencer1.name"
84
+ size="sm"
85
+ color="quinary"
86
+ weight="bold"
87
+ class="leading-none truncate max-w-full"
90
88
  />
91
89
  </div>
92
90
 
93
- <BaseText text="vs" size="xs" color="quaternary"/>
91
+ <BaseText text="vs" size="xs" color="quaternary" />
94
92
 
95
93
  <div class="flex items-center justify-center">
96
94
  <div :class="`mr-2 bg-${card.fencer2.colorDot} w-3 h-3 flex-none`"></div>
97
95
  <BaseText
98
- :text="c.fencer2.name"
99
- size="sm"
100
- color="quinary"
101
- weight="bold"
102
- class="leading-none truncate max-w-full"
96
+ :text="c.fencer2.name"
97
+ size="sm"
98
+ color="quinary"
99
+ weight="bold"
100
+ class="leading-none truncate max-w-full"
103
101
  />
104
102
  </div>
105
103
  </div>
106
104
 
107
105
  <!-- right portrait -->
108
106
  <div class="relative w-12 h-12 flex-none">
109
- <img :src="fencer2Portrait" alt="Portrait" class="w-12 h-12 rounded-full"/>
110
- <div :class="`absolute -mt-4 -right-1 w-4 h-4 rounded-full bg-${card.fencer2.colorDot} ring-2 ring-white`"></div>
107
+ <img :src="fencer2Portrait" alt="Portrait" class="w-12 h-12 rounded-full" />
108
+ <div
109
+ :class="`absolute -mt-4 -right-1 w-4 h-4 rounded-full bg-${card.fencer2.colorDot} ring-2 ring-white`"
110
+ ></div>
111
111
  </div>
112
112
  </div>
113
-
114
- <!-- action rail: [ > ] -->
115
- <button
116
- v-if="isAdmin && isScheduled && !reorderMode"
117
- type="button"
118
- class="flex-none w-10 h-full flex items-center justify-center bg-white/60 hover:bg-white"
119
- @click.stop="$emit('assign', c.ids)"
120
- aria-label="Assign director"
121
- title="Assign director"
122
- >
123
- <BaseIcon icon-name="fa-chevron-right" size="sm" color="quinary" hover="primary" />
124
- </button>
125
113
  </section>
126
-
127
114
  </section>
128
115
  </template>
129
116
 
130
117
  <script>
131
- import BaseText from "../../../../../Atoms/Text/BaseText.vue";
132
- import BaseButton from "../../../../../Molecules/Buttons/BaseButton/BaseButton.vue";
133
- import missingPortrait from "../../../../../../assets/portrait1.png";
134
- import BaseIcon from "../../../../../Atoms/Icon/BaseIcon.vue";
118
+ import BaseText from '../../../../../Atoms/Text/BaseText.vue';
119
+ import BaseButton from '../../../../../Molecules/Buttons/BaseButton/BaseButton.vue';
120
+ import missingPortrait from '../../../../../../assets/portrait1.png';
135
121
 
136
- const emptyFencer = { portrait: "", name: "Unknown Name", team: "Unknown Team", colorDot: "gray-400" };
122
+ const emptyFencer = { portrait: '', name: 'Unknown Name', team: 'Unknown Team', colorDot: 'gray-400' };
137
123
  const defaultCard = {
138
- status: "scheduled",
139
- customStatus: "",
124
+ status: 'scheduled',
125
+ customStatus: '',
140
126
  fencer1: { ...emptyFencer },
141
127
  fencer2: { ...emptyFencer },
142
128
  score1: 0,
143
129
  score2: 0,
144
- pos1: "",
145
- pos2: "",
146
- ids: {},
130
+ pos1: '',
131
+ pos2: '',
132
+ ids: {}
147
133
  };
148
134
 
149
135
  export default {
150
- name: "BoutCardInactive",
151
- emits: ['assign', 'edit', 'reorder:tap', 'start'],
152
- components: {BaseIcon, BaseButton, BaseText },
136
+ name: 'BoutCardInactive',
137
+ emits: ['edit', 'reorder:tap', 'start'],
138
+ components: { BaseButton, BaseText },
153
139
  props: {
154
140
  card: { type: Object, required: true },
155
141
  editMode: { type: Boolean, default: false },
156
142
  reorderMode: { type: Boolean, default: false },
157
- mode: { type: String, default: undefined }, // let status decide unless explicitly set
158
- isAdmin: { type: Boolean, default: false },
143
+ mode: { type: String, default: undefined } // let status decide unless explicitly set
159
144
  },
160
145
  computed: {
161
146
  c() {
@@ -164,23 +149,23 @@ export default {
164
149
  ...defaultCard,
165
150
  ...src,
166
151
  fencer1: { ...emptyFencer, ...(src.fencer1 || {}) },
167
- fencer2: { ...emptyFencer, ...(src.fencer2 || {}) },
152
+ fencer2: { ...emptyFencer, ...(src.fencer2 || {}) }
168
153
  };
169
154
  },
170
- isScheduled() {
171
- const status = this.mode ?? this.c.status; // prefer explicit prop if provided
172
- return status === "scheduled";
173
- },
174
- mobileCardActionClass() {
175
- if (this.reorderMode) return "cursor-grab ring-2 ring-dashed ring-slate-300";
176
- if (this.editMode) return "cursor-pointer";
177
- return "cursor-default";
178
- },
155
+ isScheduled() {
156
+ const status = this.mode ?? this.c.status; // prefer explicit prop if provided
157
+ return status === 'scheduled';
158
+ },
159
+ mobileCardActionClass() {
160
+ if (this.reorderMode) return 'cursor-grab ring-2 ring-dashed ring-slate-300';
161
+ if (this.editMode) return 'cursor-pointer';
162
+ return 'cursor-default';
163
+ },
179
164
  score1Display() {
180
- return this.isScheduled ? "-" : String(this.c.score1);
165
+ return this.isScheduled ? '-' : String(this.c.score1);
181
166
  },
182
167
  score2Display() {
183
- return this.isScheduled ? "-" : String(this.c.score2);
168
+ return this.isScheduled ? '-' : String(this.c.score2);
184
169
  },
185
170
  fencer1Portrait() {
186
171
  const s = this.c.fencer1.portrait;
@@ -189,23 +174,23 @@ export default {
189
174
  fencer2Portrait() {
190
175
  const s = this.c.fencer2.portrait;
191
176
  return s && String(s).trim() ? s : missingPortrait;
192
- },
193
- },
194
- methods: {
195
- onCardClick() {
196
- if (this.reorderMode) {
197
- this.$emit("reorder:tap", this.c.ids);
198
- return;
199
- }
200
-
201
- if (!this.editMode) return;
202
- if (this.isScheduled) {
203
- this.$emit("start", this.c.ids);
204
- return;
205
- }
206
-
207
- this.$emit("edit", this.c.ids);
208
- },
209
- },
210
- };
177
+ }
178
+ },
179
+ methods: {
180
+ onCardClick() {
181
+ if (this.reorderMode) {
182
+ this.$emit('reorder:tap', this.c.ids);
183
+ return;
184
+ }
185
+
186
+ if (!this.editMode) return;
187
+ if (this.isScheduled) {
188
+ this.$emit('start', this.c.ids);
189
+ return;
190
+ }
191
+
192
+ this.$emit('edit', this.c.ids);
193
+ }
194
+ }
195
+ };
211
196
  </script>
@@ -1,45 +1,44 @@
1
1
  <!-- src/stories/Organisms/Cards/BoutCard/Variants/BoutCardReorder/BoutCardReorder.vue -->
2
2
  <template>
3
3
  <section class="w-full border rounded-lg mb-4" :class="selected ? 'border-bright' : ''">
4
- <div class="flex items-center justify-between p-2 rounded-md bg-poolBox shadow-sm" >
4
+ <div class="flex items-center justify-between p-2 rounded-md bg-poolBox shadow-sm">
5
5
  <!-- Left label / handle area (purely visual; drag comes from parent shell) -->
6
6
  <div class="flex flex-col items-center select-none pl-4 -mt-1">
7
7
  <BaseText text="bout" size="xs" color="quinary" weight="bold" />
8
- <BaseText :text="String(orderIndex + 1)" size="4xl" color="quaternary" weight="bold"/>
8
+ <BaseText :text="String(orderIndex + 1)" size="4xl" color="quaternary" weight="bold" />
9
9
  </div>
10
10
 
11
11
  <!-- Center text -->
12
12
  <div class="text-center flex-1 mx-2">
13
- <BaseText :text="`${card.pos1} - ${card.fencer1.name}`" size="sm" color="quinary" weight="bold"/>
14
- <BaseText text="vs" size="xs" color="quaternary" class="-mt-0.5 ml-3"/>
15
- <BaseText :text="`${card.pos2} - ${card.fencer2.name}`" size="sm" color="quinary" weight="bold"/>
13
+ <BaseText :text="`${card.pos1} - ${card.fencer1.name}`" size="sm" color="quinary" weight="bold" />
14
+ <BaseText text="vs" size="xs" color="quaternary" class="-mt-0.5 ml-3" />
15
+ <BaseText :text="`${card.pos2} - ${card.fencer2.name}`" size="sm" color="quinary" weight="bold" />
16
16
  </div>
17
17
 
18
18
  <div>
19
- <BaseIcon icon-name="fa-grip-dots-vertical" size="4xl" color="quinary" class="mr-4"/>
19
+ <BaseIcon icon-name="fa-grip-dots-vertical" size="4xl" color="quinary" class="mr-4" />
20
20
  </div>
21
-
22
21
  </div>
23
22
  </section>
24
23
  </template>
25
24
 
26
25
  <script>
27
- import BaseText from "../../../../../Atoms/Text/BaseText.vue";
28
- import BaseIcon from "../../../../../Atoms/Icon/BaseIcon.vue";
26
+ import BaseText from '../../../../../Atoms/Text/BaseText.vue';
27
+ import BaseIcon from '../../../../../Atoms/Icon/BaseIcon.vue';
29
28
 
30
29
  export default {
31
- name: "BoutCardReorder",
32
- components: {BaseIcon, BaseText },
30
+ name: 'BoutCardReorder',
31
+ components: { BaseIcon, BaseText },
33
32
  props: {
34
33
  card: { type: Object, required: true },
35
34
  editMode: { type: Boolean, default: false },
36
35
  reorderMode: { type: Boolean, default: true },
37
- selected: { type: Boolean, default: false },
36
+ selected: { type: Boolean, default: false }
38
37
  },
39
38
  computed: {
40
39
  orderIndex() {
41
40
  return Number(this.card?.ids?.orderIndex ?? 0);
42
- },
43
- },
41
+ }
42
+ }
44
43
  };
45
44
  </script>
@@ -1,11 +1,11 @@
1
1
  import BoutCardWaiting from './BoutCardWaiting.vue';
2
2
 
3
3
  export default {
4
- title: 'Molecules/BoutCard/Variants/Waiting',
5
- component: BoutCardWaiting,
6
- args: {
7
- colors: { Color1: 'red', Color2: 'blue' },
8
- },
4
+ title: 'Molecules/BoutCard/Variants/Waiting',
5
+ component: BoutCardWaiting,
6
+ args: {
7
+ colors: { Color1: 'red', Color2: 'blue' }
8
+ }
9
9
  };
10
10
 
11
11
  export const Default = {};
@@ -6,71 +6,72 @@
6
6
  <div class="flex justify-between shadow-lg drop-shadow p-2 rounded-xl bg-poolBox w-5/12">
7
7
  <div class="flex space-x-4 items-center">
8
8
  <div class="relative">
9
- <img :src="missingPortrait" alt="Placeholder portrait" class="w-12 h-12 rounded-full"/>
9
+ <img :src="missingPortrait" alt="Placeholder portrait" class="w-12 h-12 rounded-full" />
10
10
  <div :class="`w-4 h-4 rounded-full bg-${card.fencer1.colorDot} relative -mt-4 ml-9 z-10`"></div>
11
11
  </div>
12
12
  <div>
13
- <BaseText text="Waiting to be selected" size="md" color="quaternary" weight="bold"/>
14
- <BaseText text="starting soon" size="xs" color="quinary"/>
13
+ <BaseText text="Waiting to be selected" size="md" color="quaternary" weight="bold" />
14
+ <BaseText text="starting soon" size="xs" color="quinary" />
15
15
  </div>
16
16
  </div>
17
- <BaseText text="" size="3xl" weight="bold" class="align-middle pr-3 pt-0.5"/>
17
+ <BaseText text="" size="3xl" weight="bold" class="align-middle pr-3 pt-0.5" />
18
18
  </div>
19
19
 
20
20
  <!-- Right placeholder -->
21
21
  <div class="flex justify-between shadow-lg drop-shadow p-2 rounded-xl bg-poolBox w-5/12">
22
22
  <div class="flex justify-end space-x-4 ml-4 w-full">
23
23
  <div class="text-right">
24
- <BaseText text="Waiting to be selected" size="md" color="quaternary" weight="bold"/>
25
- <BaseText text="starting soon" size="xs" color="quinary"/>
24
+ <BaseText text="Waiting to be selected" size="md" color="quaternary" weight="bold" />
25
+ <BaseText text="starting soon" size="xs" color="quinary" />
26
26
  </div>
27
27
  <div class="relative">
28
- <img :src="missingPortrait" alt="Placeholder portrait" class="w-12 h-12 rounded-full"/>
28
+ <img :src="missingPortrait" alt="Placeholder portrait" class="w-12 h-12 rounded-full" />
29
29
  <div :class="`w-4 h-4 rounded-full bg-${card.fencer2.colorDot} relative -mt-4 -ml-1 z-10`"></div>
30
30
  </div>
31
31
  </div>
32
32
  </div>
33
33
 
34
- <section class="w-18 bg-primary">
35
- </section>
34
+ <section class="w-18 bg-primary"></section>
36
35
  </div>
37
36
 
38
37
  <!-- Mobile -->
39
38
  <div class="flex md:hidden justify-between items-center p-4 border rounded-md bg-poolBox">
40
39
  <div class="relative flex flex-col items-center">
41
- <img :src="missingPortrait" alt="Placeholder portrait" class="w-12 h-12 rounded-full"/>
40
+ <img :src="missingPortrait" alt="Placeholder portrait" class="w-12 h-12 rounded-full" />
42
41
  <div :class="`w-4 h-4 rounded-full bg-${card.fencer1.colorDot} relative -mt-4 ml-9 z-10`"></div>
43
42
  </div>
44
43
 
45
44
  <div class="text-center flex-1 mx-4">
46
- <BaseText text="Select a Match!" size="md" color="quaternary" weight="bold"/>
47
- <BaseText text="to get started" size="xs" color="quinary"/>
45
+ <BaseText text="Select a Match!" size="md" color="quaternary" weight="bold" />
46
+ <BaseText text="to get started" size="xs" color="quinary" />
48
47
  </div>
49
48
 
50
49
  <!-- right portrait -->
51
50
  <div class="relative w-12 h-12">
52
51
  <img :src="missingPortrait" alt="Portrait" class="w-12 h-12 rounded-full" />
53
- <div :class="`absolute -mt-4 -right-1 w-4 h-4 rounded-full bg-${card.fencer2.colorDot} ring-2 ring-white`"></div>
52
+ <div
53
+ :class="`absolute -mt-4 -right-1 w-4 h-4 rounded-full bg-${card.fencer2.colorDot} ring-2 ring-white`"
54
+ ></div>
54
55
  </div>
55
56
  </div>
56
57
  </section>
57
58
  </template>
58
59
 
59
60
  <script>
60
- import BaseText from "../../../../../Atoms/Text/BaseText.vue";
61
- import missingPortrait from "../../../../../../assets/portrait1.png";
61
+ import BaseText from '../../../../../Atoms/Text/BaseText.vue';
62
+ import missingPortrait from '../../../../../../assets/portrait1.png';
62
63
 
63
64
  export default {
64
- name: "BoutCardWaiting",
65
- components: {BaseText },
65
+ name: 'BoutCardWaiting',
66
+ components: { BaseText },
66
67
  props: {
67
68
  card: {
68
69
  type: Object,
69
70
  required: true
70
- },
71
+ }
71
72
  },
72
73
  data() {
73
74
  return { missingPortrait };
74
- },
75
- };
76
- </script>
75
+ }
76
+ };
77
+ </script>
@@ -0,0 +1,33 @@
1
+ import BracketDirectorAssignmentCard from './BracketDirectorAssignmentCard.vue';
2
+
3
+ export default {
4
+ title: 'Organisms/Cards/BracketDirectorAssignmentCard',
5
+ component: BracketDirectorAssignmentCard,
6
+ args: {
7
+ station: {
8
+ RingId: 1,
9
+ RingName: 'Ring 1',
10
+ Color: '#2563eb',
11
+ Director: {
12
+ PersonId: 1001,
13
+ DisplayName: 'Alex Morgan',
14
+ PortraitUrl: ''
15
+ }
16
+ },
17
+ variant: 'assigned'
18
+ },
19
+ argTypes: {
20
+ station: { control: 'object' },
21
+ variant: { control: 'select', options: ['assigned', 'add'] },
22
+ addLabel: { control: 'text' }
23
+ }
24
+ };
25
+
26
+ export const Assigned = {};
27
+
28
+ export const AddDirector = {
29
+ args: {
30
+ station: null,
31
+ variant: 'add'
32
+ }
33
+ };
@@ -0,0 +1,45 @@
1
+ import { shallowMount } from '@vue/test-utils';
2
+ import { describe, expect, it } from 'vitest';
3
+ import BracketDirectorAssignmentCard from './BracketDirectorAssignmentCard.vue';
4
+
5
+ const station = {
6
+ RingId: 3,
7
+ RingName: 'Ring 3',
8
+ Color: '#059669',
9
+ Director: { PersonId: 1003, DisplayName: 'Sam Rivera', PortraitUrl: '/portrait.png' }
10
+ };
11
+
12
+ describe('BracketDirectorAssignmentCard', () => {
13
+ it('renders the ring, portrait, and director name', () => {
14
+ const wrapper = shallowMount(BracketDirectorAssignmentCard, { props: { station } });
15
+
16
+ expect(wrapper.find('img').attributes()).toMatchObject({
17
+ src: '/portrait.png',
18
+ alt: 'Sam Rivera portrait'
19
+ });
20
+ expect(wrapper.findAll('base-text-stub').map(text => text.attributes('text'))).toContain('Sam Rivera');
21
+ expect(wrapper.find('[data-testid="bracket-director-assignment"]').attributes('style')).toBeUndefined();
22
+ expect(wrapper.find('[data-testid="director-color-dot"]').attributes('style')).toContain('#059669');
23
+ expect(wrapper.find('[data-testid="ring-number-icon"]').exists()).toBe(false);
24
+ expect(wrapper.findAll('base-text-stub').map(text => text.attributes('text'))).toContain('Ring 3');
25
+ });
26
+
27
+ it('uses director initials when no portrait is supplied', () => {
28
+ const wrapper = shallowMount(BracketDirectorAssignmentCard, {
29
+ props: { station: { ...station, Director: { ...station.Director, PortraitUrl: '' } } }
30
+ });
31
+
32
+ expect(wrapper.find('img').exists()).toBe(false);
33
+ expect(wrapper.find('[data-testid="director-initials"]').classes()).toContain('rounded-xl');
34
+ expect(wrapper.find('[data-testid="director-initials"] base-text-stub').attributes('text')).toBe('SR');
35
+ });
36
+
37
+ it('emits add intent from the summary card', async () => {
38
+ const wrapper = shallowMount(BracketDirectorAssignmentCard, { props: { variant: 'add' } });
39
+
40
+ await wrapper.find('[data-testid="add-bracket-director"]').trigger('click');
41
+
42
+ expect(wrapper.emitted('action:add')).toEqual([[]]);
43
+ expect(wrapper.find('base-text-stub').attributes('text')).toBe('Click here to add director');
44
+ });
45
+ });
@@ -0,0 +1,103 @@
1
+ <template>
2
+ <button
3
+ v-if="isAddCard"
4
+ type="button"
5
+ data-testid="add-bracket-director"
6
+ class="flex min-h-20 w-full items-center justify-center gap-3 rounded-lg border-2 border-dashed border-dropdownSelect bg-white px-4 py-3 text-left transition hover:border-bright hover:shadow-md focus-visible:border-bright focus-visible:outline-none"
7
+ @click="$emit('action:add')"
8
+ >
9
+ <span class="flex h-9 w-9 items-center justify-center rounded-full bg-bannerBackground" aria-hidden="true">
10
+ <BaseIcon iconName="fa-plus" color="primaryHighlight" size="sm" />
11
+ </span>
12
+ <BaseText :text="addLabel" color="primaryHighlight" size="sm" weight="bold" />
13
+ </button>
14
+
15
+ <article
16
+ v-else-if="station"
17
+ data-testid="bracket-director-assignment"
18
+ class="flex min-h-16 w-full items-center gap-3 overflow-hidden rounded-md border border-poolSetup bg-white px-3 py-2 shadow-sm hover:border-bright"
19
+ :aria-label="assignmentLabel"
20
+ >
21
+ <div class="relative h-12 w-12 flex-none">
22
+ <img
23
+ v-if="portraitUrl"
24
+ :src="portraitUrl"
25
+ :alt="`${directorName} portrait`"
26
+ class="h-12 w-12 rounded-xl object-cover"
27
+ />
28
+ <div
29
+ v-else
30
+ data-testid="director-initials"
31
+ class="flex h-12 w-12 items-center justify-center rounded-xl bg-dropdownSelect"
32
+ aria-hidden="true"
33
+ >
34
+ <BaseText :text="directorInitials" color="primaryHighlight" size="sm" weight="bold" />
35
+ </div>
36
+ <span
37
+ data-testid="director-color-dot"
38
+ class="absolute -bottom-1 -right-1 h-4 w-4 rounded-full ring-2 ring-white"
39
+ :style="{ backgroundColor: station.Color }"
40
+ aria-hidden="true"
41
+ ></span>
42
+ </div>
43
+
44
+ <div class="min-w-0 flex-1">
45
+ <BaseText :text="ringLabel" color="quaternary" size="xs" />
46
+ <BaseText class="truncate" :text="directorName" color="primaryHighlight" size="sm" weight="bold" />
47
+ </div>
48
+ </article>
49
+ </template>
50
+
51
+ <script>
52
+ import BaseIcon from '../../../Atoms/Icon/BaseIcon.vue';
53
+ import BaseText from '../../../Atoms/Text/BaseText.vue';
54
+
55
+ const getInitials = displayName =>
56
+ String(displayName || '')
57
+ .split(/\s+/)
58
+ .filter(Boolean)
59
+ .slice(0, 2)
60
+ .map(name => name[0].toUpperCase())
61
+ .join('');
62
+
63
+ export default {
64
+ name: 'BracketDirectorAssignmentCard',
65
+ components: { BaseIcon, BaseText },
66
+ emits: ['action:add'],
67
+ props: {
68
+ station: {
69
+ type: Object,
70
+ default: null
71
+ },
72
+ variant: {
73
+ type: String,
74
+ default: 'assigned',
75
+ validator: value => ['assigned', 'add'].includes(value)
76
+ },
77
+ addLabel: {
78
+ type: String,
79
+ default: 'Click here to add director'
80
+ }
81
+ },
82
+ computed: {
83
+ assignmentLabel() {
84
+ return `${this.ringLabel}, Director ${this.directorName}`;
85
+ },
86
+ directorInitials() {
87
+ return getInitials(this.directorName) || '?';
88
+ },
89
+ directorName() {
90
+ return this.station?.Director?.DisplayName || 'Director TBD';
91
+ },
92
+ isAddCard() {
93
+ return this.variant === 'add';
94
+ },
95
+ portraitUrl() {
96
+ return this.station?.Director?.PortraitUrl || '';
97
+ },
98
+ ringLabel() {
99
+ return this.station?.RingName || `Ring ${this.station?.RingId ?? ''}`.trim();
100
+ }
101
+ }
102
+ };
103
+ </script>