@lar-works/design-system 0.2.1 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -1
- package/dist/actions/Button.d.ts +39 -1
- package/dist/actions/Button.js +39 -9
- package/dist/actions/Button.js.map +1 -1
- package/dist/actions/ButtonLink.d.ts +5 -1
- package/dist/actions/ButtonLink.js +28 -2
- package/dist/actions/ButtonLink.js.map +1 -1
- package/dist/actions/ButtonRecipes.js +7 -0
- package/dist/actions/ButtonRecipes.js.map +1 -0
- package/dist/actions/IconButton.d.ts +2 -2
- package/dist/actions/IconButton.js +1 -1
- package/dist/actions/IconButton.js.map +1 -1
- package/dist/actions/ThemeSwitch.js +1 -1
- package/dist/board/ActivityLine.d.ts +36 -0
- package/dist/board/ActivityLine.js +144 -0
- package/dist/board/ActivityLine.js.map +1 -0
- package/dist/board/ActivityTrack.d.ts +11 -0
- package/dist/board/ActivityTrack.js +25 -0
- package/dist/board/ActivityTrack.js.map +1 -0
- package/dist/board/AddItem.d.ts +82 -0
- package/dist/board/AddItem.js +185 -0
- package/dist/board/AddItem.js.map +1 -0
- package/dist/board/Archive.d.ts +21 -0
- package/dist/board/Archive.js +63 -0
- package/dist/board/Archive.js.map +1 -0
- package/dist/board/Attention.d.ts +66 -0
- package/dist/board/Attention.js +122 -0
- package/dist/board/Attention.js.map +1 -0
- package/dist/board/BoardShell.d.ts +16 -0
- package/dist/board/BoardShell.js +35 -0
- package/dist/board/BoardShell.js.map +1 -0
- package/dist/board/BoardTitleBar.d.ts +50 -0
- package/dist/board/BoardTitleBar.js +125 -0
- package/dist/board/BoardTitleBar.js.map +1 -0
- package/dist/board/ButtonKinds.d.ts +24 -0
- package/dist/board/ButtonKinds.js +19 -0
- package/dist/board/ButtonKinds.js.map +1 -0
- package/dist/board/Cleanup.d.ts +8 -0
- package/dist/board/Cleanup.js +15 -0
- package/dist/board/Cleanup.js.map +1 -0
- package/dist/board/Counters.d.ts +101 -0
- package/dist/board/Counters.js +202 -0
- package/dist/board/Counters.js.map +1 -0
- package/dist/board/DataAttributes.d.ts +6 -0
- package/dist/board/Dependencies.d.ts +17 -0
- package/dist/board/Dependencies.js +44 -0
- package/dist/board/Dependencies.js.map +1 -0
- package/dist/board/Desk.d.ts +52 -0
- package/dist/board/Desk.js +130 -0
- package/dist/board/Desk.js.map +1 -0
- package/dist/board/Dossier.d.ts +100 -0
- package/dist/board/Dossier.js +194 -0
- package/dist/board/Dossier.js.map +1 -0
- package/dist/board/Filters.d.ts +33 -0
- package/dist/board/Filters.js +64 -0
- package/dist/board/Filters.js.map +1 -0
- package/dist/board/ItemDetails.d.ts +167 -0
- package/dist/board/ItemDetails.js +339 -0
- package/dist/board/ItemDetails.js.map +1 -0
- package/dist/board/ItemDialog.d.ts +73 -0
- package/dist/board/ItemDialog.js +140 -0
- package/dist/board/ItemDialog.js.map +1 -0
- package/dist/board/ItemParts.d.ts +42 -0
- package/dist/board/ItemParts.js +82 -0
- package/dist/board/ItemParts.js.map +1 -0
- package/dist/board/ItemProgress.d.ts +56 -0
- package/dist/board/ItemProgress.js +138 -0
- package/dist/board/ItemProgress.js.map +1 -0
- package/dist/board/List.d.ts +65 -0
- package/dist/board/List.js +118 -0
- package/dist/board/List.js.map +1 -0
- package/dist/board/LoadingScreen.d.ts +38 -0
- package/dist/board/LoadingScreen.js +74 -0
- package/dist/board/LoadingScreen.js.map +1 -0
- package/dist/board/NeedsYou.d.ts +13 -0
- package/dist/board/NeedsYou.js +31 -0
- package/dist/board/NeedsYou.js.map +1 -0
- package/dist/board/Onboarding.d.ts +53 -0
- package/dist/board/Onboarding.js +122 -0
- package/dist/board/Onboarding.js.map +1 -0
- package/dist/board/PartsList.d.ts +60 -0
- package/dist/board/PartsList.js +115 -0
- package/dist/board/PartsList.js.map +1 -0
- package/dist/board/ProjectIcon.d.ts +51 -0
- package/dist/board/ProjectIcon.js +120 -0
- package/dist/board/ProjectIcon.js.map +1 -0
- package/dist/board/PullRequests.d.ts +43 -0
- package/dist/board/PullRequests.js +83 -0
- package/dist/board/PullRequests.js.map +1 -0
- package/dist/board/RowStyles.js +14 -0
- package/dist/board/RowStyles.js.map +1 -0
- package/dist/board/Settings.d.ts +54 -0
- package/dist/board/Settings.js +112 -0
- package/dist/board/Settings.js.map +1 -0
- package/dist/board/Slices.d.ts +32 -0
- package/dist/board/Slices.js +88 -0
- package/dist/board/Slices.js.map +1 -0
- package/dist/board/SourceIcon.d.ts +12 -0
- package/dist/board/SourceIcon.js +24 -0
- package/dist/board/SourceIcon.js.map +1 -0
- package/dist/board/StagePane.d.ts +43 -0
- package/dist/board/StagePane.js +97 -0
- package/dist/board/StagePane.js.map +1 -0
- package/dist/board/StageRow.d.ts +141 -0
- package/dist/board/StageRow.js +287 -0
- package/dist/board/StageRow.js.map +1 -0
- package/dist/board/StageTrack.d.ts +18 -0
- package/dist/board/StageTrack.js +38 -0
- package/dist/board/StageTrack.js.map +1 -0
- package/dist/board/StartControls.d.ts +30 -0
- package/dist/board/StartControls.js +51 -0
- package/dist/board/StartControls.js.map +1 -0
- package/dist/board/StatusColors.d.ts +5 -0
- package/dist/board/StatusColors.js +17 -0
- package/dist/board/StatusColors.js.map +1 -0
- package/dist/board/StatusGlyph.d.ts +18 -0
- package/dist/board/StatusGlyph.js +51 -0
- package/dist/board/StatusGlyph.js.map +1 -0
- package/dist/board/Threads.d.ts +13 -0
- package/dist/board/Threads.js +35 -0
- package/dist/board/Threads.js.map +1 -0
- package/dist/board/TrackerLabels.d.ts +27 -0
- package/dist/board/TrackerLabels.js +56 -0
- package/dist/board/TrackerLabels.js.map +1 -0
- package/dist/board/UpdatePill.d.ts +52 -0
- package/dist/board/UpdatePill.js +188 -0
- package/dist/board/UpdatePill.js.map +1 -0
- package/dist/board/Vocabulary.d.ts +56 -0
- package/dist/board/Vocabulary.js +104 -0
- package/dist/board/Vocabulary.js.map +1 -0
- package/dist/board/Warnings.d.ts +35 -0
- package/dist/board/Warnings.js +85 -0
- package/dist/board/Warnings.js.map +1 -0
- package/dist/board/WorkMap.d.ts +136 -0
- package/dist/board/WorkMap.js +274 -0
- package/dist/board/WorkMap.js.map +1 -0
- package/dist/board/index.d.ts +42 -0
- package/dist/collections/CollectionState.d.ts +10 -1
- package/dist/collections/CollectionState.js +12 -5
- package/dist/collections/CollectionState.js.map +1 -1
- package/dist/collections/ResultList.js +1 -1
- package/dist/collections/ScrollRow.js +1 -1
- package/dist/collections/VirtualList.js +1 -1
- package/dist/display/Avatar.d.ts +5 -2
- package/dist/display/Avatar.js +2 -2
- package/dist/display/Avatar.js.map +1 -1
- package/dist/display/Badge.d.ts +6 -1
- package/dist/display/Badge.js +9 -4
- package/dist/display/Badge.js.map +1 -1
- package/dist/display/CheckList.js +1 -1
- package/dist/display/Comment.d.ts +12 -0
- package/dist/display/Comment.js +39 -0
- package/dist/display/Comment.js.map +1 -0
- package/dist/display/CopyButton.d.ts +10 -2
- package/dist/display/CopyButton.js +29 -16
- package/dist/display/CopyButton.js.map +1 -1
- package/dist/display/Diagram.d.ts +17 -0
- package/dist/display/Diagram.js +49 -0
- package/dist/display/Diagram.js.map +1 -0
- package/dist/display/ImagePicker.js +1 -1
- package/dist/display/InfoBox.js +2 -2
- package/dist/display/InsetPanel.d.ts +3 -1
- package/dist/display/InsetPanel.js +7 -4
- package/dist/display/InsetPanel.js.map +1 -1
- package/dist/display/ItemAction.js +2 -2
- package/dist/display/LabelChip.d.ts +26 -0
- package/dist/display/LabelChip.js +41 -0
- package/dist/display/LabelChip.js.map +1 -0
- package/dist/display/LabelTint.js +60 -0
- package/dist/display/LabelTint.js.map +1 -0
- package/dist/display/Person.d.ts +5 -0
- package/dist/display/Person.js +19 -0
- package/dist/display/Person.js.map +1 -0
- package/dist/display/PropertySheet.js +1 -1
- package/dist/display/RadioChoice.d.ts +9 -2
- package/dist/display/RadioChoice.js +5 -1
- package/dist/display/RadioChoice.js.map +1 -1
- package/dist/display/RatingLink.js +1 -1
- package/dist/display/RichText.d.ts +12 -0
- package/dist/display/RichText.js +94 -0
- package/dist/display/RichText.js.map +1 -0
- package/dist/display/RowList.js +1 -1
- package/dist/display/index.d.ts +6 -1
- package/dist/feedback/Alert.js +1 -1
- package/dist/feedback/AsyncState.js +1 -1
- package/dist/feedback/DismissButton.d.ts +12 -0
- package/dist/feedback/DismissButton.js +20 -0
- package/dist/feedback/DismissButton.js.map +1 -0
- package/dist/feedback/ErrorNotification.js +2 -0
- package/dist/feedback/ErrorNotification.js.map +1 -1
- package/dist/feedback/FormResult.d.ts +16 -0
- package/dist/feedback/FormResult.js +30 -0
- package/dist/feedback/FormResult.js.map +1 -0
- package/dist/feedback/LiveRegion.d.ts +7 -0
- package/dist/feedback/LiveRegion.js +15 -0
- package/dist/feedback/LiveRegion.js.map +1 -0
- package/dist/feedback/Loading.d.ts +19 -0
- package/dist/feedback/Loading.js +63 -0
- package/dist/feedback/Loading.js.map +1 -0
- package/dist/feedback/Notifications.d.ts +35 -1
- package/dist/feedback/Notifications.js +196 -4
- package/dist/feedback/Notifications.js.map +1 -1
- package/dist/feedback/Progress.d.ts +15 -0
- package/dist/feedback/Progress.js +38 -0
- package/dist/feedback/Progress.js.map +1 -0
- package/dist/feedback/ProgressStatusRow.js +1 -1
- package/dist/feedback/StatusIndicator.d.ts +6 -1
- package/dist/feedback/StatusIndicator.js +19 -5
- package/dist/feedback/StatusIndicator.js.map +1 -1
- package/dist/feedback/index.d.ts +8 -4
- package/dist/forms/Checkbox.js +1 -1
- package/dist/forms/ColorSwatches.d.ts +21 -0
- package/dist/forms/ColorSwatches.js +26 -0
- package/dist/forms/ColorSwatches.js.map +1 -0
- package/dist/forms/FormSection.d.ts +68 -6
- package/dist/forms/FormSection.js +139 -8
- package/dist/forms/FormSection.js.map +1 -1
- package/dist/forms/HiddenField.d.ts +6 -0
- package/dist/forms/HiddenField.js +13 -0
- package/dist/forms/HiddenField.js.map +1 -0
- package/dist/forms/Input.d.ts +12 -2
- package/dist/forms/Input.js +10 -3
- package/dist/forms/Input.js.map +1 -1
- package/dist/forms/LabelPicker.d.ts +43 -0
- package/dist/forms/LabelPicker.js +107 -0
- package/dist/forms/LabelPicker.js.map +1 -0
- package/dist/forms/MarkdownEditor.d.ts +21 -0
- package/dist/forms/MarkdownEditor.js +175 -0
- package/dist/forms/MarkdownEditor.js.map +1 -0
- package/dist/forms/MarkdownToolbar.js +204 -0
- package/dist/forms/MarkdownToolbar.js.map +1 -0
- package/dist/forms/OptionSelect.d.ts +30 -9
- package/dist/forms/OptionSelect.js +53 -13
- package/dist/forms/OptionSelect.js.map +1 -1
- package/dist/forms/Select.d.ts +4 -1
- package/dist/forms/Select.js +3 -1
- package/dist/forms/Select.js.map +1 -1
- package/dist/forms/Switch.d.ts +4 -1
- package/dist/forms/Switch.js +5 -2
- package/dist/forms/Switch.js.map +1 -1
- package/dist/forms/TagInput.js +1 -1
- package/dist/forms/index.d.ts +7 -3
- package/dist/foundations/AmbientMotion.d.ts +2 -0
- package/dist/foundations/AmbientMotion.js +39 -0
- package/dist/foundations/AmbientMotion.js.map +1 -0
- package/dist/foundations/DesignSystemProvider.d.ts +34 -0
- package/dist/foundations/DesignSystemProvider.js +26 -1
- package/dist/foundations/DesignSystemProvider.js.map +1 -1
- package/dist/foundations/index.d.ts +2 -1
- package/dist/icons/BrandIcons.d.ts +8 -2
- package/dist/icons/BrandIcons.js +14 -3
- package/dist/icons/BrandIcons.js.map +1 -1
- package/dist/icons/dynamic.d.ts +2 -0
- package/dist/icons/dynamic.js +1 -0
- package/dist/icons/index.d.ts +2 -2
- package/dist/icons/index.js +1 -1
- package/dist/icons.d.ts +2 -2
- package/dist/icons.js +1 -1
- package/dist/index.d.ts +71 -10
- package/dist/index.js +78 -21
- package/dist/layout/Site.js +1 -1
- package/dist/layout/TitleBar.js +1 -1
- package/dist/layout/index.d.ts +2 -2
- package/dist/layout/index.js +3 -3
- package/dist/layout/toolbar/CommandPaletteTrigger.d.ts +17 -2
- package/dist/layout/toolbar/CommandPaletteTrigger.js +89 -6
- package/dist/layout/toolbar/CommandPaletteTrigger.js.map +1 -1
- package/dist/layout/toolbar/TriggerFit.js +56 -0
- package/dist/layout/toolbar/TriggerFit.js.map +1 -0
- package/dist/navigation/CollectionBrowseSelector.js +1 -1
- package/dist/navigation/CollectionViewToggle.d.ts +26 -0
- package/dist/navigation/CollectionViewToggle.js +54 -23
- package/dist/navigation/CollectionViewToggle.js.map +1 -1
- package/dist/navigation/DrilldownBrowseSelector.js +1 -1
- package/dist/navigation/FolderSelector.js +2 -2
- package/dist/navigation/SortMenu.d.ts +10 -0
- package/dist/navigation/SortMenu.js +33 -0
- package/dist/navigation/SortMenu.js.map +1 -0
- package/dist/navigation/index.d.ts +3 -2
- package/dist/overlays/CommandPalette.d.ts +38 -4
- package/dist/overlays/CommandPalette.js +140 -54
- package/dist/overlays/CommandPalette.js.map +1 -1
- package/dist/overlays/Drawer.js +1 -1
- package/dist/overlays/DropdownMenu.d.ts +7 -1
- package/dist/overlays/DropdownMenu.js +13 -2
- package/dist/overlays/DropdownMenu.js.map +1 -1
- package/dist/overlays/HelpTip.d.ts +8 -0
- package/dist/overlays/HelpTip.js +29 -0
- package/dist/overlays/HelpTip.js.map +1 -0
- package/dist/overlays/ImageViewer.js +2 -2
- package/dist/overlays/Modal.d.ts +5 -0
- package/dist/overlays/Modal.js +17 -2
- package/dist/overlays/Modal.js.map +1 -1
- package/dist/overlays/ModalExpandButton.d.ts +18 -0
- package/dist/overlays/ModalExpandButton.js +43 -0
- package/dist/overlays/ModalExpandButton.js.map +1 -0
- package/dist/overlays/Popover.d.ts +2 -1
- package/dist/overlays/Popover.js +1 -0
- package/dist/overlays/Popover.js.map +1 -1
- package/dist/overlays/index.d.ts +4 -2
- package/dist/showcase/Cards.js +1 -1
- package/dist/showcase/FeatureRow.js +1 -1
- package/dist/showcase/PhotoSearchConcept.js +1 -1
- package/dist/showcase/ProductBand.js +1 -1
- package/dist/showcase/Status.js +1 -1
- package/dist/typography/Code.d.ts +18 -0
- package/dist/typography/Code.js +24 -0
- package/dist/typography/Code.js.map +1 -0
- package/dist/typography/Link.d.ts +7 -2
- package/dist/typography/Link.js +15 -5
- package/dist/typography/Link.js.map +1 -1
- package/dist/typography/Typography.d.ts +19 -1
- package/dist/typography/Typography.js +11 -3
- package/dist/typography/Typography.js.map +1 -1
- package/dist/typography/index.d.ts +3 -3
- package/package.json +26 -3
- package/src/actions/Button.tsx +78 -11
- package/src/actions/ButtonLink.tsx +34 -0
- package/src/actions/ButtonRecipes.ts +10 -0
- package/src/actions/IconButton.tsx +7 -4
- package/src/board/ActivityLine.tsx +176 -0
- package/src/board/ActivityTrack.tsx +23 -0
- package/src/board/AddItem.tsx +259 -0
- package/src/board/Archive.tsx +75 -0
- package/src/board/Attention.tsx +135 -0
- package/src/board/BoardShell.tsx +30 -0
- package/src/board/BoardTitleBar.tsx +167 -0
- package/src/board/ButtonKinds.ts +32 -0
- package/src/board/Cleanup.tsx +19 -0
- package/src/board/Counters.tsx +224 -0
- package/src/board/DataAttributes.ts +3 -0
- package/src/board/Dependencies.tsx +49 -0
- package/src/board/Desk.tsx +155 -0
- package/src/board/Dossier.tsx +262 -0
- package/src/board/Filters.tsx +85 -0
- package/src/board/ItemDetails.tsx +435 -0
- package/src/board/ItemDialog.tsx +179 -0
- package/src/board/ItemParts.tsx +128 -0
- package/src/board/ItemProgress.tsx +164 -0
- package/src/board/List.tsx +154 -0
- package/src/board/LoadingScreen.tsx +78 -0
- package/src/board/NeedsYou.tsx +30 -0
- package/src/board/Onboarding.tsx +124 -0
- package/src/board/PartsList.tsx +160 -0
- package/src/board/ProjectIcon.tsx +172 -0
- package/src/board/PullRequests.tsx +106 -0
- package/src/board/RowStyles.ts +17 -0
- package/src/board/Settings.tsx +124 -0
- package/src/board/Slices.tsx +103 -0
- package/src/board/SourceIcon.tsx +33 -0
- package/src/board/StagePane.tsx +128 -0
- package/src/board/StageRow.tsx +320 -0
- package/src/board/StageTrack.tsx +61 -0
- package/src/board/StartControls.tsx +77 -0
- package/src/board/StatusColors.ts +28 -0
- package/src/board/StatusGlyph.tsx +70 -0
- package/src/board/Threads.tsx +38 -0
- package/src/board/TrackerLabels.tsx +75 -0
- package/src/board/UpdatePill.tsx +222 -0
- package/src/board/Vocabulary.tsx +155 -0
- package/src/board/Warnings.tsx +83 -0
- package/src/board/WorkMap.tsx +436 -0
- package/src/board/base.css +121 -0
- package/src/board/button-kinds.css +8 -0
- package/src/board/index.ts +224 -0
- package/src/board/items.css +75 -0
- package/src/board/loading-screen.css +171 -0
- package/src/board/rows.css +180 -0
- package/src/board/title-bar.css +56 -0
- package/src/board/tokens.css +52 -0
- package/src/board.css +19 -0
- package/src/collections/CollectionState.tsx +20 -7
- package/src/display/Avatar.tsx +6 -3
- package/src/display/Badge.tsx +25 -3
- package/src/display/Comment.tsx +26 -0
- package/src/display/CopyButton.tsx +48 -18
- package/src/display/Diagram.tsx +59 -0
- package/src/display/InsetPanel.tsx +4 -1
- package/src/display/LabelChip.tsx +73 -0
- package/src/display/LabelTint.ts +72 -0
- package/src/display/Person.tsx +11 -0
- package/src/display/RadioChoice.tsx +11 -2
- package/src/display/RichText.tsx +114 -0
- package/src/display/index.ts +5 -0
- package/src/feedback/DismissButton.tsx +28 -0
- package/src/feedback/ErrorNotification.ts +3 -0
- package/src/feedback/FormResult.tsx +50 -0
- package/src/feedback/LiveRegion.tsx +10 -0
- package/src/feedback/Loading.tsx +75 -0
- package/src/feedback/Notifications.tsx +267 -2
- package/src/feedback/Progress.tsx +44 -0
- package/src/feedback/StatusIndicator.tsx +34 -3
- package/src/feedback/index.ts +12 -2
- package/src/forms/ColorSwatches.tsx +50 -0
- package/src/forms/FormSection.tsx +245 -10
- package/src/forms/HiddenField.tsx +4 -0
- package/src/forms/Input.tsx +26 -4
- package/src/forms/LabelPicker.tsx +140 -0
- package/src/forms/MarkdownEditor.tsx +283 -0
- package/src/forms/MarkdownToolbar.tsx +267 -0
- package/src/forms/OptionSelect.tsx +110 -25
- package/src/forms/Select.tsx +20 -13
- package/src/forms/Switch.tsx +16 -2
- package/src/forms/index.ts +16 -2
- package/src/foundations/AmbientMotion.ts +51 -0
- package/src/foundations/DesignSystemProvider.tsx +19 -0
- package/src/foundations/index.ts +1 -0
- package/src/foundations/theme.css +64 -0
- package/src/icons/BrandIcons.tsx +12 -3
- package/src/icons/dynamic.ts +4 -0
- package/src/icons/index.ts +1 -1
- package/src/index.ts +2 -1
- package/src/layout/index.ts +1 -1
- package/src/layout/toolbar/CommandPaletteTrigger.tsx +187 -31
- package/src/layout/toolbar/TriggerFit.ts +84 -0
- package/src/navigation/CollectionViewToggle.tsx +94 -24
- package/src/navigation/SortMenu.tsx +41 -0
- package/src/navigation/index.ts +2 -1
- package/src/overlays/CommandPalette.tsx +190 -60
- package/src/overlays/DropdownMenu.tsx +12 -1
- package/src/overlays/HelpTip.tsx +29 -0
- package/src/overlays/Modal.tsx +23 -0
- package/src/overlays/ModalExpandButton.tsx +48 -0
- package/src/overlays/Popover.tsx +3 -1
- package/src/overlays/index.ts +9 -1
- package/src/styles.css +3 -1
- package/src/typography/Code.tsx +24 -0
- package/src/typography/Link.tsx +19 -10
- package/src/typography/Typography.tsx +25 -2
- package/src/typography/index.ts +1 -1
- package/dist/feedback/index.js +0 -11
- package/dist/typography/index.js +0 -4
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { ButtonProps } from '../actions/Button';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Lar Factory's five kinds of button. A Main action, at most one per area, is filled; a Start is tinted, with the play
|
|
5
|
+
* icon; an Open is outlined, with the thread or pull request icon; an App control has no border and an icon; any Other
|
|
6
|
+
* button is outlined, with no icon. A dialog or a form is an area of its own, so its submit is its Main action. Every
|
|
7
|
+
* kind is the compact 28px Button and keeps its look while disabled.
|
|
8
|
+
*/
|
|
9
|
+
export type ButtonKind = 'main' | 'start' | 'open' | 'control' | 'other';
|
|
10
|
+
|
|
11
|
+
const recipe = {
|
|
12
|
+
main: 'primary',
|
|
13
|
+
start: 'tinted',
|
|
14
|
+
open: 'secondary',
|
|
15
|
+
control: 'quiet',
|
|
16
|
+
other: 'secondary',
|
|
17
|
+
} as const satisfies Record<ButtonKind, ButtonProps['variant']>;
|
|
18
|
+
|
|
19
|
+
/** Props to spread on the design system's Button for a kind: its recipe, the compact size, and `data-kind`, which
|
|
20
|
+
* names the kind for tests and the board's sheets. A destructive confirm, such as Reset or Abandon, is its
|
|
21
|
+
* area's Main action filled in the danger colour. */
|
|
22
|
+
export const buttonKind = <
|
|
23
|
+
K extends ButtonKind,
|
|
24
|
+
T extends (K extends 'main' ? 'danger' : never) | undefined = undefined,
|
|
25
|
+
>(
|
|
26
|
+
kind: K,
|
|
27
|
+
tone?: T,
|
|
28
|
+
) => ({
|
|
29
|
+
variant: (tone ? 'destructive' : recipe[kind]) as T extends 'danger' ? 'destructive' : (typeof recipe)[K],
|
|
30
|
+
compact: true,
|
|
31
|
+
'data-kind': kind,
|
|
32
|
+
});
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
// What removing work's old branches and worktrees would lose, in a confirmation.
|
|
2
|
+
|
|
3
|
+
/** Each branch with the files and commits deleting it would lose, as a nested bulleted list. */
|
|
4
|
+
export function LossList({ branches }: { branches: { name: string; losses: string[] }[] }) {
|
|
5
|
+
return (
|
|
6
|
+
<ul className="m-0 list-disc ps-5 wrap-anywhere">
|
|
7
|
+
{branches.map((branch) => (
|
|
8
|
+
<li key={branch.name}>
|
|
9
|
+
<span>{branch.name}</span>
|
|
10
|
+
<ul className="m-0 list-disc ps-5">
|
|
11
|
+
{branch.losses.map((loss) => (
|
|
12
|
+
<li key={loss}>{loss}</li>
|
|
13
|
+
))}
|
|
14
|
+
</ul>
|
|
15
|
+
</li>
|
|
16
|
+
))}
|
|
17
|
+
</ul>
|
|
18
|
+
);
|
|
19
|
+
}
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
|
|
3
|
+
import { Button } from '../actions/Button';
|
|
4
|
+
import { Popover } from '../overlays/Popover';
|
|
5
|
+
import { Tooltip, TooltipPopup, TooltipTrigger } from '../overlays/Tooltip';
|
|
6
|
+
import { buttonKind } from './ButtonKinds';
|
|
7
|
+
|
|
8
|
+
/** The title bar's counters, in its status strip after the Refreshed time. */
|
|
9
|
+
export function BoardCounters({ children }: { children: ReactNode }) {
|
|
10
|
+
return <div className="counters flex shrink-0 items-center gap-0.5 whitespace-nowrap">{children}</div>;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/** How wide a counter's value stays from dash or loader to number: a count, a count over a limit, or a spend under
|
|
14
|
+
* $1,000 with its plus. */
|
|
15
|
+
const valueWidths = { count: 'min-w-[2ch]', limit: 'min-w-[4ch]', spend: 'min-w-[8ch]' };
|
|
16
|
+
|
|
17
|
+
/** Which counters the title bar's width folds away: Shaping and Shipped below 54rem, then Spend below 66rem. */
|
|
18
|
+
const folds = { never: '', medium: 'hidden @min-[54rem]:inline-flex', wide: 'hidden @min-[66rem]:inline-flex' };
|
|
19
|
+
|
|
20
|
+
interface BoardCounterProps {
|
|
21
|
+
/** The status's glyph, in its own colour. */
|
|
22
|
+
icon: ReactNode;
|
|
23
|
+
value: ReactNode;
|
|
24
|
+
width?: keyof typeof valueWidths;
|
|
25
|
+
/** Names the counter for screen readers, with `hint`: "need you: 2 items waiting on your answer". */
|
|
26
|
+
label: string;
|
|
27
|
+
/** What the number means, in the tooltip. */
|
|
28
|
+
hint: string;
|
|
29
|
+
fold?: keyof typeof folds;
|
|
30
|
+
/** The panel's head: its title and, at its right, a figure such as the count. */
|
|
31
|
+
title: string;
|
|
32
|
+
sub?: ReactNode;
|
|
33
|
+
/** A note under the panel's list. */
|
|
34
|
+
foot?: ReactNode;
|
|
35
|
+
/** The panel's list, which scrolls. */
|
|
36
|
+
children: ReactNode;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/** One counter: an App control with a glyph and a tabular value, its tooltip, and the panel it opens, padded as a
|
|
40
|
+
* menu, of everything behind the number. */
|
|
41
|
+
export function BoardCounter({
|
|
42
|
+
icon,
|
|
43
|
+
value,
|
|
44
|
+
width = 'count',
|
|
45
|
+
label,
|
|
46
|
+
hint,
|
|
47
|
+
fold = 'never',
|
|
48
|
+
title,
|
|
49
|
+
sub,
|
|
50
|
+
foot,
|
|
51
|
+
children,
|
|
52
|
+
}: BoardCounterProps) {
|
|
53
|
+
return (
|
|
54
|
+
<Popover>
|
|
55
|
+
<Tooltip>
|
|
56
|
+
<TooltipTrigger asChild>
|
|
57
|
+
<Popover.Trigger asChild>
|
|
58
|
+
<Button
|
|
59
|
+
{...buttonKind('control')}
|
|
60
|
+
aria-label={`${label}: ${hint}`}
|
|
61
|
+
className={`text-base-700 hover:text-base-content data-[state=open]:bg-base-300/60 data-[state=open]:text-base-content min-w-0 gap-1.5 ${folds[fold]}`}
|
|
62
|
+
>
|
|
63
|
+
<span className="counter-icon grid size-4 shrink-0 place-items-center [&_svg]:size-4">
|
|
64
|
+
{icon}
|
|
65
|
+
</span>
|
|
66
|
+
<span
|
|
67
|
+
className={`counter-value text-base-content inline-flex items-center leading-4 font-medium tabular-nums [&_[data-loader]]:w-full [&_[data-loader]]:justify-center [&_svg]:size-3 ${valueWidths[width]}`}
|
|
68
|
+
>
|
|
69
|
+
{value}
|
|
70
|
+
</span>
|
|
71
|
+
</Button>
|
|
72
|
+
</Popover.Trigger>
|
|
73
|
+
</TooltipTrigger>
|
|
74
|
+
<TooltipPopup side="bottom">{hint}</TooltipPopup>
|
|
75
|
+
</Tooltip>
|
|
76
|
+
<Popover.Content side="bottom" align="end" layout="fill" presentation="menu">
|
|
77
|
+
<div className="counter-popup flex max-h-112 min-h-0 w-96 max-w-full flex-col">
|
|
78
|
+
<div className="counter-head text-base-700 flex h-7 shrink-0 items-center gap-2 px-2 text-xs font-medium">
|
|
79
|
+
<span className="min-w-0 flex-1 truncate">{title}</span>
|
|
80
|
+
{sub !== undefined && <span className="shrink-0 font-normal tabular-nums">{sub}</span>}
|
|
81
|
+
</div>
|
|
82
|
+
<div className="min-h-0 flex-1 overflow-y-auto overscroll-contain">{children}</div>
|
|
83
|
+
{foot !== undefined && (
|
|
84
|
+
<div className="mt-1 shrink-0 border-t border-(--border) px-2 pt-1.5 pb-1 text-xs text-(--muted-foreground)">
|
|
85
|
+
{foot}
|
|
86
|
+
</div>
|
|
87
|
+
)}
|
|
88
|
+
</div>
|
|
89
|
+
</Popover.Content>
|
|
90
|
+
</Popover>
|
|
91
|
+
);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/** The divider before the spend counter, which folds with it. */
|
|
95
|
+
export function CounterDivider() {
|
|
96
|
+
return <span aria-hidden="true" className="mx-1 hidden h-4 w-px shrink-0 bg-(--border) @min-[66rem]:block" />;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/** A panel's list split by status, each part under its name and count. */
|
|
100
|
+
export function CounterGroups({ children }: { children: ReactNode }) {
|
|
101
|
+
return <div className="grid gap-1">{children}</div>;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
export function CounterGroup({ title, count, children }: { title: string; count: number; children: ReactNode }) {
|
|
105
|
+
return (
|
|
106
|
+
<section>
|
|
107
|
+
<h3 className="m-0 flex h-7 items-center gap-1 px-2 text-xs font-medium text-(--muted-foreground)">
|
|
108
|
+
{title} <span className="tabular-nums">{count}</span>
|
|
109
|
+
</h3>
|
|
110
|
+
{children}
|
|
111
|
+
</section>
|
|
112
|
+
);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/** What a panel says when its list is empty, or what is still loading. */
|
|
116
|
+
export function CounterEmpty({ children }: { children: ReactNode }) {
|
|
117
|
+
return (
|
|
118
|
+
<p className="m-0 flex min-h-20 items-center justify-center px-2 py-4 text-center text-xs text-(--muted-foreground)">
|
|
119
|
+
{children}
|
|
120
|
+
</p>
|
|
121
|
+
);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
export function CounterList({ children }: { children: ReactNode }) {
|
|
125
|
+
return <ul className="m-0 grid list-none grid-cols-[minmax(0,1fr)] gap-px p-0">{children}</ul>;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
interface CounterItemProps {
|
|
129
|
+
/** The item's id, as `data-item`. */
|
|
130
|
+
item: string;
|
|
131
|
+
/** The row's accessible name, the item's name. */
|
|
132
|
+
label: string;
|
|
133
|
+
/** The item's status glyph and source icon. */
|
|
134
|
+
leading: ReactNode;
|
|
135
|
+
title: ReactNode;
|
|
136
|
+
/** At the right: CounterAge, or a figure such as its spend. */
|
|
137
|
+
trailing: ReactNode;
|
|
138
|
+
onOpen: () => void;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/** One item in a panel, as a menu's row; picking it closes the panel and opens the item. */
|
|
142
|
+
export function CounterItem({ item, label, leading, title, trailing, onOpen }: CounterItemProps) {
|
|
143
|
+
return (
|
|
144
|
+
<li>
|
|
145
|
+
<Popover.Close asChild aria-label={label}>
|
|
146
|
+
<button
|
|
147
|
+
type="button"
|
|
148
|
+
onClick={onOpen}
|
|
149
|
+
data-item={item}
|
|
150
|
+
className="text-base-content hover:bg-base-200 focus-visible:bg-base-200 flex min-h-7 w-full cursor-default items-center gap-2 rounded-[0.375rem] px-2 py-1 text-left text-sm outline-none max-lg:min-h-11 pointer-coarse:min-h-11"
|
|
151
|
+
>
|
|
152
|
+
{leading}
|
|
153
|
+
<span className="min-w-0 flex-1 truncate">{title}</span>
|
|
154
|
+
<span className="flex shrink-0 items-center gap-1.5 text-[11px] text-(--muted-foreground) tabular-nums">
|
|
155
|
+
{trailing}
|
|
156
|
+
</span>
|
|
157
|
+
</button>
|
|
158
|
+
</Popover.Close>
|
|
159
|
+
</li>
|
|
160
|
+
);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/** A row's repository icon and age. */
|
|
164
|
+
export function CounterAge({ icon, age }: { icon: ReactNode; age: string }) {
|
|
165
|
+
return (
|
|
166
|
+
<>
|
|
167
|
+
{icon}
|
|
168
|
+
<span className="min-w-7 text-right whitespace-nowrap">{age}</span>
|
|
169
|
+
</>
|
|
170
|
+
);
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/** A row's figure, such as its spend. */
|
|
174
|
+
export function CounterFigure({ children }: { children: ReactNode }) {
|
|
175
|
+
return <span className="font-medium text-(--foreground)">{children}</span>;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/** A value not known yet, as nothing has been read. */
|
|
179
|
+
export function CounterDash() {
|
|
180
|
+
return <span className="font-normal text-(--muted-foreground)">–</span>;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
/** A count over a limit, such as builds at work over the build limit: "2/3". */
|
|
184
|
+
export function CounterOfLimit({ count, limit }: { count: ReactNode; limit: number }) {
|
|
185
|
+
return (
|
|
186
|
+
<>
|
|
187
|
+
{count}
|
|
188
|
+
<span className="font-normal text-(--muted-foreground)">/{limit}</span>
|
|
189
|
+
</>
|
|
190
|
+
);
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
/** A figure that covers only part of what it sums, marked with a plus: amber while some of it is unavailable, muted
|
|
194
|
+
* while some is still loading. */
|
|
195
|
+
export function CounterPartial({ figure, unavailable }: { figure: string; unavailable: boolean }) {
|
|
196
|
+
return (
|
|
197
|
+
<>
|
|
198
|
+
{figure}
|
|
199
|
+
<span className={`font-normal ${unavailable ? 'text-(--you)' : 'text-(--muted-foreground)'}`}>+</span>
|
|
200
|
+
</>
|
|
201
|
+
);
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/** The build limit as bars, then the count over it: one bar per build it allows, filled for each build at work, and
|
|
205
|
+
* extra builds past it after a gap. */
|
|
206
|
+
export function LimitBars({ used, limit }: { used: number; limit: number }) {
|
|
207
|
+
const bar = (n: number, on: boolean) => (
|
|
208
|
+
<span key={n} className={`h-1.5 w-3 rounded-full ${on ? 'bg-(--thread)' : 'bg-(--border)'}`} />
|
|
209
|
+
);
|
|
210
|
+
|
|
211
|
+
return (
|
|
212
|
+
<span className="inline-flex items-center gap-2">
|
|
213
|
+
<span className="inline-flex items-center gap-[3px]">
|
|
214
|
+
{Array.from({ length: limit }, (_, n) => bar(n, n < used))}
|
|
215
|
+
{used > limit && (
|
|
216
|
+
<span className="ml-1 inline-flex gap-[3px]">
|
|
217
|
+
{Array.from({ length: used - limit }, (_, n) => bar(limit + n, true))}
|
|
218
|
+
</span>
|
|
219
|
+
)}
|
|
220
|
+
</span>
|
|
221
|
+
{used}/{limit}
|
|
222
|
+
</span>
|
|
223
|
+
);
|
|
224
|
+
}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
/** The `data-*` attributes a board composition passes on to its root element, which name what it shows for the
|
|
2
|
+
* board's tests and keyboard focus (such as `data-item` or `data-stage`). */
|
|
3
|
+
export type DataAttributes = { [name: `data-${string}`]: string | number | boolean | undefined };
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
// The Dependencies holding a build, in the item dialog.
|
|
2
|
+
|
|
3
|
+
import type { ReactNode } from 'react';
|
|
4
|
+
|
|
5
|
+
/** The Dependencies, one DependencyItem each. */
|
|
6
|
+
export function DependencyList({ children }: { children: ReactNode }) {
|
|
7
|
+
return <ul className="m-0 grid list-none gap-3 p-0 text-sm">{children}</ul>;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
/** A Dependency: who owns it and whether it's met, its need, its latest read and evidence, what the board asks about it,
|
|
11
|
+
* and its `action`. */
|
|
12
|
+
export function DependencyItem({
|
|
13
|
+
id,
|
|
14
|
+
owner,
|
|
15
|
+
need,
|
|
16
|
+
read,
|
|
17
|
+
evidence,
|
|
18
|
+
notice,
|
|
19
|
+
action,
|
|
20
|
+
}: {
|
|
21
|
+
id: string;
|
|
22
|
+
owner: ReactNode;
|
|
23
|
+
need: ReactNode;
|
|
24
|
+
read: ReactNode;
|
|
25
|
+
evidence: ReactNode;
|
|
26
|
+
notice?: ReactNode;
|
|
27
|
+
action: ReactNode;
|
|
28
|
+
}) {
|
|
29
|
+
return (
|
|
30
|
+
<li className="grid gap-1" data-dependency={id}>
|
|
31
|
+
<span className="font-medium" data-dependency-owner>
|
|
32
|
+
{owner}
|
|
33
|
+
</span>
|
|
34
|
+
<span>{need}</span>
|
|
35
|
+
<span className="text-xs text-(--muted-foreground)" data-dependency-read>
|
|
36
|
+
{read}
|
|
37
|
+
</span>
|
|
38
|
+
<span className="text-xs text-(--muted-foreground)" data-dependency-evidence>
|
|
39
|
+
{evidence}
|
|
40
|
+
</span>
|
|
41
|
+
{notice && (
|
|
42
|
+
<p className="m-0 text-xs font-medium text-(--warning-foreground)" data-dependency-notice>
|
|
43
|
+
{notice}
|
|
44
|
+
</p>
|
|
45
|
+
)}
|
|
46
|
+
<span>{action}</span>
|
|
47
|
+
</li>
|
|
48
|
+
);
|
|
49
|
+
}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
|
|
3
|
+
interface DeskSectionProps {
|
|
4
|
+
title: string;
|
|
5
|
+
/** How many cards show; with none, `empty` says why in one small line. */
|
|
6
|
+
count: number;
|
|
7
|
+
empty?: ReactNode;
|
|
8
|
+
children?: ReactNode;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
/** "Your desk": the items awaiting your action as small cards in one row that scrolls sideways under the page's padding
|
|
12
|
+
* to the window's edges. An empty desk is one small line. */
|
|
13
|
+
export function DeskSection({ title, count, empty, children }: DeskSectionProps) {
|
|
14
|
+
if (!count)
|
|
15
|
+
return (
|
|
16
|
+
<section
|
|
17
|
+
className="desk flex shrink-0 items-baseline gap-2 text-xs text-(--muted-foreground)"
|
|
18
|
+
aria-labelledby="desk-h"
|
|
19
|
+
>
|
|
20
|
+
<h2 id="desk-h" className="m-0 text-[13px] font-medium text-(--foreground)">
|
|
21
|
+
{title}
|
|
22
|
+
</h2>
|
|
23
|
+
<p className="m-0">{empty}</p>
|
|
24
|
+
</section>
|
|
25
|
+
);
|
|
26
|
+
|
|
27
|
+
return (
|
|
28
|
+
<section className="desk grid shrink-0 gap-2" aria-labelledby="desk-h">
|
|
29
|
+
<h2 id="desk-h" className="m-0 text-[13px] font-medium">
|
|
30
|
+
{title} <span className="text-(--muted-foreground)">{count}</span>
|
|
31
|
+
</h2>
|
|
32
|
+
<div className="-mx-6 flex [scrollbar-width:none] items-start gap-3 overflow-x-auto px-6 py-1 [&::-webkit-scrollbar]:hidden">
|
|
33
|
+
{children}
|
|
34
|
+
</div>
|
|
35
|
+
</section>
|
|
36
|
+
);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
interface DeskCardProps {
|
|
40
|
+
/** The item's id, as `data-item`. */
|
|
41
|
+
item: string;
|
|
42
|
+
/** Whether the item dialog shows this item now. */
|
|
43
|
+
picked: boolean;
|
|
44
|
+
onOpen: () => void;
|
|
45
|
+
/** The first row: where the item comes from, its kind and its age. */
|
|
46
|
+
source: ReactNode;
|
|
47
|
+
kind: ReactNode;
|
|
48
|
+
age: ReactNode;
|
|
49
|
+
title: ReactNode;
|
|
50
|
+
/** The title's full text, for its tooltip. */
|
|
51
|
+
name: string;
|
|
52
|
+
/** More about the item under its title, such as a work item's fields. */
|
|
53
|
+
details?: ReactNode;
|
|
54
|
+
statusIcon: ReactNode;
|
|
55
|
+
status: string;
|
|
56
|
+
/** Beside the status: the next step, such as DeskMergeState or DeskHint. */
|
|
57
|
+
next?: ReactNode;
|
|
58
|
+
/** The card's actions, in its right corner, the board's button kinds drawn 32px tall there. A click beside them
|
|
59
|
+
* opens the item, as anywhere else on the card. */
|
|
60
|
+
actions: ReactNode;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* An item on your desk, opening the item dialog. Every card has the same four rows at the same heights, so they line
|
|
65
|
+
* up across cards: source, kind and age; the title; the status and next step; and the card's actions. Its summary is a
|
|
66
|
+
* button too, so the keyboard can open it.
|
|
67
|
+
*/
|
|
68
|
+
export function DeskCard({
|
|
69
|
+
item,
|
|
70
|
+
picked,
|
|
71
|
+
onOpen,
|
|
72
|
+
source,
|
|
73
|
+
kind,
|
|
74
|
+
age,
|
|
75
|
+
title,
|
|
76
|
+
name,
|
|
77
|
+
details,
|
|
78
|
+
statusIcon,
|
|
79
|
+
status,
|
|
80
|
+
next,
|
|
81
|
+
actions,
|
|
82
|
+
}: DeskCardProps) {
|
|
83
|
+
return (
|
|
84
|
+
<div
|
|
85
|
+
onClick={onOpen}
|
|
86
|
+
data-item={item}
|
|
87
|
+
className={`desk-card relative grid w-88 shrink-0 cursor-pointer content-start gap-2 rounded-xl border border-[color-mix(in_srgb,var(--warning)_45%,var(--border))] bg-(--card) py-3 pr-3 pl-4 shadow-[inset_3px_0_0_var(--warning)] hover:bg-(--accent) ${picked ? 'ring-2 ring-(--primary) ring-offset-1 ring-offset-(--background)' : ''}`}
|
|
88
|
+
>
|
|
89
|
+
<button
|
|
90
|
+
type="button"
|
|
91
|
+
className="grid min-w-0 gap-2 rounded text-left focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-(--primary)"
|
|
92
|
+
>
|
|
93
|
+
<span className="desk-meta flex h-6 min-w-0 items-center gap-2 text-[11px]">
|
|
94
|
+
{source}
|
|
95
|
+
{kind}
|
|
96
|
+
<span className="ml-auto shrink-0 text-(--muted-foreground)">{age}</span>
|
|
97
|
+
</span>
|
|
98
|
+
<span className="desk-title h-5 truncate text-[13px]/5 font-medium" title={name}>
|
|
99
|
+
{title}
|
|
100
|
+
</span>
|
|
101
|
+
{details}
|
|
102
|
+
</button>
|
|
103
|
+
<span className="flex min-w-0 items-center gap-2">
|
|
104
|
+
<span className="flex shrink-0 items-center gap-1.5 text-[11px] [&_svg]:size-3">
|
|
105
|
+
{statusIcon}
|
|
106
|
+
<span className="font-semibold text-(--warning-foreground)">{status}</span>
|
|
107
|
+
</span>
|
|
108
|
+
<span className="desk-next flex h-5 min-w-0 flex-1 items-center gap-1.5 text-[11px] text-(--muted-foreground) tabular-nums">
|
|
109
|
+
{next}
|
|
110
|
+
</span>
|
|
111
|
+
</span>
|
|
112
|
+
<div
|
|
113
|
+
className="desk-actions flex h-8 shrink-0 items-center justify-end gap-1.5 [&_[data-kind]:not([data-toggle])]:h-8 [&_[data-kind][data-icon-only]]:w-8!"
|
|
114
|
+
// The actions keep their clicks from the card; a click on the row's own empty space still opens it.
|
|
115
|
+
onClick={(event) => {
|
|
116
|
+
if (event.target !== event.currentTarget) event.stopPropagation();
|
|
117
|
+
}}
|
|
118
|
+
>
|
|
119
|
+
{actions}
|
|
120
|
+
</div>
|
|
121
|
+
</div>
|
|
122
|
+
);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
export type MergeState = 'can merge' | 'checking' | 'blocked' | 'conflicts';
|
|
126
|
+
|
|
127
|
+
const mergeDots: Record<MergeState, string> = {
|
|
128
|
+
'can merge': 'bg-(--build)',
|
|
129
|
+
checking: 'bg-(--warning)',
|
|
130
|
+
blocked: 'bg-(--muted-foreground)',
|
|
131
|
+
conflicts: 'bg-(--error)',
|
|
132
|
+
};
|
|
133
|
+
|
|
134
|
+
/** A desk card's next step while its pull request is open: its merge state, then its checks. */
|
|
135
|
+
export function DeskMergeState({ state, checks }: { state: MergeState; checks: string }) {
|
|
136
|
+
return (
|
|
137
|
+
<>
|
|
138
|
+
<span className={`size-2 shrink-0 rounded-full ${mergeDots[state]}`} />
|
|
139
|
+
<span className="shrink-0 font-medium text-(--foreground)">{state}</span>
|
|
140
|
+
<span className="truncate" title={`${state} · ${checks}`}>
|
|
141
|
+
{' '}
|
|
142
|
+
· {checks}
|
|
143
|
+
</span>
|
|
144
|
+
</>
|
|
145
|
+
);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/** A desk card's next step as a hint, such as what its status waits for. */
|
|
149
|
+
export function DeskHint({ children }: { children?: string | undefined }) {
|
|
150
|
+
return (
|
|
151
|
+
<span className="truncate" title={children}>
|
|
152
|
+
{children}
|
|
153
|
+
</span>
|
|
154
|
+
);
|
|
155
|
+
}
|