@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,64 @@
|
|
|
1
|
+
import { Button } from "../actions/Button.js";
|
|
2
|
+
import { Checkbox } from "../forms/Checkbox.js";
|
|
3
|
+
import { Popover } from "../overlays/Popover.js";
|
|
4
|
+
import { buttonKind } from "./ButtonKinds.js";
|
|
5
|
+
import { forwardRef } from "react";
|
|
6
|
+
import { ChevronDownIcon } from "lucide-react";
|
|
7
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
8
|
+
// src/board/Filters.tsx
|
|
9
|
+
/** The List's filters: menus of checklists, then the active choices as chips that remove themselves, then Clear. */
|
|
10
|
+
const FilterBar = forwardRef(({ children }, ref) => /* @__PURE__ */ jsx("div", {
|
|
11
|
+
ref,
|
|
12
|
+
"data-item-filters": true,
|
|
13
|
+
className: "flex flex-wrap items-center gap-1.5",
|
|
14
|
+
children
|
|
15
|
+
}));
|
|
16
|
+
FilterBar.displayName = "FilterBar";
|
|
17
|
+
/** A filter's button, its name and how many choices are on, opening its checklist. */
|
|
18
|
+
function FilterMenu({ which, name, picked, children }) {
|
|
19
|
+
return /* @__PURE__ */ jsxs(Popover, { children: [/* @__PURE__ */ jsx(Popover.Trigger, {
|
|
20
|
+
asChild: true,
|
|
21
|
+
children: /* @__PURE__ */ jsxs(Button, {
|
|
22
|
+
...buttonKind("other"),
|
|
23
|
+
"data-filter": which,
|
|
24
|
+
rightIcon: /* @__PURE__ */ jsx(ChevronDownIcon, {}),
|
|
25
|
+
children: [name, picked > 0 && ` · ${picked}`]
|
|
26
|
+
})
|
|
27
|
+
}), /* @__PURE__ */ jsx(Popover.Content, {
|
|
28
|
+
side: "bottom",
|
|
29
|
+
align: "start",
|
|
30
|
+
children
|
|
31
|
+
})] });
|
|
32
|
+
}
|
|
33
|
+
/** A filter menu's checklist. */
|
|
34
|
+
function FilterChoices({ children }) {
|
|
35
|
+
return /* @__PURE__ */ jsx("div", {
|
|
36
|
+
className: "grid w-52 gap-0.5",
|
|
37
|
+
children
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
/** One choice in a filter's checklist: its checkbox, then what it is, such as a badge. */
|
|
41
|
+
function FilterChoice({ checked, onToggle, children }) {
|
|
42
|
+
return /* @__PURE__ */ jsxs("label", {
|
|
43
|
+
"data-filter-choice": true,
|
|
44
|
+
className: "flex cursor-pointer items-center gap-2 rounded-md px-1.5 py-1 text-xs hover:bg-(--accent)",
|
|
45
|
+
children: [/* @__PURE__ */ jsx(Checkbox, {
|
|
46
|
+
checked,
|
|
47
|
+
onChange: onToggle
|
|
48
|
+
}), children]
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
/** An active choice as a chip, such as a badge ending in ×, which removes the choice. */
|
|
52
|
+
function FilterChip({ removeLabel, onRemove, children }) {
|
|
53
|
+
return /* @__PURE__ */ jsx("button", {
|
|
54
|
+
type: "button",
|
|
55
|
+
"data-filter-chip": true,
|
|
56
|
+
"aria-label": removeLabel,
|
|
57
|
+
title: removeLabel,
|
|
58
|
+
onClick: onRemove,
|
|
59
|
+
children
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
export { FilterBar, FilterChip, FilterChoice, FilterChoices, FilterMenu };
|
|
63
|
+
|
|
64
|
+
//# sourceMappingURL=Filters.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Filters.js","names":[],"sources":["../../src/board/Filters.tsx"],"sourcesContent":["import { ChevronDownIcon } from 'lucide-react';\nimport { forwardRef, type ReactNode } from 'react';\n\nimport { Button } from '../actions/Button';\nimport { Checkbox } from '../forms/Checkbox';\nimport { Popover } from '../overlays/Popover';\nimport { buttonKind } from './ButtonKinds';\n\n/** The List's filters: menus of checklists, then the active choices as chips that remove themselves, then Clear. */\nexport const FilterBar = forwardRef<HTMLDivElement, { children: ReactNode }>(({ children }, ref) => (\n <div ref={ref} data-item-filters className=\"flex flex-wrap items-center gap-1.5\">\n {children}\n </div>\n));\n\nFilterBar.displayName = 'FilterBar';\n\ninterface FilterMenuProps {\n /** What the menu filters, as `data-filter`. */\n which: string;\n name: string;\n /** How many of its choices are on, after its name. */\n picked: number;\n children: ReactNode;\n}\n\n/** A filter's button, its name and how many choices are on, opening its checklist. */\nexport function FilterMenu({ which, name, picked, children }: FilterMenuProps) {\n return (\n <Popover>\n <Popover.Trigger asChild>\n <Button {...buttonKind('other')} data-filter={which} rightIcon={<ChevronDownIcon />}>\n {name}\n {picked > 0 && ` · ${picked}`}\n </Button>\n </Popover.Trigger>\n <Popover.Content side=\"bottom\" align=\"start\">\n {children}\n </Popover.Content>\n </Popover>\n );\n}\n\n/** A filter menu's checklist. */\nexport function FilterChoices({ children }: { children: ReactNode }) {\n return <div className=\"grid w-52 gap-0.5\">{children}</div>;\n}\n\n/** One choice in a filter's checklist: its checkbox, then what it is, such as a badge. */\nexport function FilterChoice({\n checked,\n onToggle,\n children,\n}: {\n checked: boolean;\n onToggle: () => void;\n children: ReactNode;\n}) {\n return (\n <label\n data-filter-choice\n className=\"flex cursor-pointer items-center gap-2 rounded-md px-1.5 py-1 text-xs hover:bg-(--accent)\"\n >\n <Checkbox checked={checked} onChange={onToggle} />\n {children}\n </label>\n );\n}\n\n/** An active choice as a chip, such as a badge ending in ×, which removes the choice. */\nexport function FilterChip({\n removeLabel,\n onRemove,\n children,\n}: {\n removeLabel: string;\n onRemove: () => void;\n children: ReactNode;\n}) {\n return (\n <button type=\"button\" data-filter-chip aria-label={removeLabel} title={removeLabel} onClick={onRemove}>\n {children}\n </button>\n );\n}\n"],"mappings":";;;;;;;;;AASA,MAAa,YAAY,YAAqD,EAAE,YAAY,QACxF,oBAAC,OAAD;CAAU;CAAK,qBAAA;CAAkB,WAAU;CACtC;AACA,CAAA,CACR;AAED,UAAU,cAAc;;AAYxB,SAAgB,WAAW,EAAE,OAAO,MAAM,QAAQ,YAA6B;CAC3E,OACI,qBAAC,SAAD,EAAA,UAAA,CACI,oBAAC,QAAQ,SAAT;EAAiB,SAAA;EACb,UAAA,qBAAC,QAAD;GAAQ,GAAI,WAAW,OAAO;GAAG,eAAa;GAAO,WAAW,oBAAC,iBAAD,CAAkB,CAAA;GAAlF,UAAA,CACK,MACA,SAAS,KAAK,MAAM,QACjB;;CACK,CAAA,GACjB,oBAAC,QAAQ,SAAT;EAAiB,MAAK;EAAS,OAAM;EAChC;CACY,CAAA,CACZ,EAAA,CAAA;AAEjB;;AAGA,SAAgB,cAAc,EAAE,YAAqC;CACjE,OAAO,oBAAC,OAAD;EAAK,WAAU;EAAqB;CAAc,CAAA;AAC7D;;AAGA,SAAgB,aAAa,EACzB,SACA,UACA,YAKD;CACC,OACI,qBAAC,SAAD;EACI,sBAAA;EACA,WAAU;EAFd,UAAA,CAII,oBAAC,UAAD;GAAmB;GAAS,UAAU;EAAW,CAAA,GAChD,QACE;;AAEf;;AAGA,SAAgB,WAAW,EACvB,aACA,UACA,YAKD;CACC,OACI,oBAAC,UAAD;EAAQ,MAAK;EAAS,oBAAA;EAAiB,cAAY;EAAa,OAAO;EAAa,SAAS;EACxF;CACG,CAAA;AAEhB"}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
import { DataAttributes } from "./DataAttributes.js";
|
|
2
|
+
import { ReactNode, Ref } from "react";
|
|
3
|
+
declare const headings: {
|
|
4
|
+
readonly section: 'm-0 text-[13px] font-medium';
|
|
5
|
+
readonly muted: 'm-0 text-[13px] font-medium text-(--muted-foreground)';
|
|
6
|
+
readonly label: 'm-0 text-[11px] font-medium tracking-wider text-(--muted-foreground) uppercase';
|
|
7
|
+
};
|
|
8
|
+
/** A section's heading: a sidebar `section`'s, a `muted` one over the comments or a description's own section, or the
|
|
9
|
+
* small uppercase `label` over the description and the record. `as` a `label` it names the field `htmlFor` names, or
|
|
10
|
+
* as a `span` a group that names itself. */
|
|
11
|
+
export declare function DetailsHeading({ presentation, as, htmlFor, children }: {
|
|
12
|
+
presentation?: keyof typeof headings;
|
|
13
|
+
as?: 'h2' | 'label' | 'span';
|
|
14
|
+
htmlFor?: string | undefined;
|
|
15
|
+
children: ReactNode;
|
|
16
|
+
}): import("react").JSX.Element;
|
|
17
|
+
/** A sidebar section, or a section of the body such as a concept's parts: its heading over its content. */
|
|
18
|
+
export declare function DetailsSection({ heading, children, ...data }: {
|
|
19
|
+
heading: ReactNode;
|
|
20
|
+
children: ReactNode;
|
|
21
|
+
} & DataAttributes): import("react").JSX.Element;
|
|
22
|
+
/** A section of the description, such as Acceptance Criteria: its muted heading over its text. */
|
|
23
|
+
export declare function TextSection({ heading, children }: {
|
|
24
|
+
heading: ReactNode;
|
|
25
|
+
children: ReactNode;
|
|
26
|
+
}): import("react").JSX.Element;
|
|
27
|
+
/**
|
|
28
|
+
* A section of the main column, beside the sidebar: the record, description or comments, its `header` over its
|
|
29
|
+
* content. When it `fill`s, its content takes the height left.
|
|
30
|
+
*/
|
|
31
|
+
export declare function MainSection({ as: Tag, header, fill, children, ...data }: {
|
|
32
|
+
as?: 'div' | 'section';
|
|
33
|
+
header: ReactNode;
|
|
34
|
+
fill?: boolean;
|
|
35
|
+
children: ReactNode;
|
|
36
|
+
} & DataAttributes): import("react").JSX.Element;
|
|
37
|
+
/** A main section's header row: its small uppercase `heading`, then its actions at the end. */
|
|
38
|
+
export declare function SectionHeader({ heading, children }: {
|
|
39
|
+
heading: ReactNode;
|
|
40
|
+
children?: ReactNode;
|
|
41
|
+
}): import("react").JSX.Element;
|
|
42
|
+
/** A short status in a section's header, such as a save that could not be read back, truncating. */
|
|
43
|
+
export declare function HeaderStatus({ children }: {
|
|
44
|
+
children: string;
|
|
45
|
+
}): import("react").JSX.Element;
|
|
46
|
+
/** A line of the details in the body size: an error, announced, or a muted empty state. `mainColumn` keeps it in the
|
|
47
|
+
* main column beside the sidebar. */
|
|
48
|
+
export declare function DetailsText({ tone, mainColumn, children }: {
|
|
49
|
+
tone?: 'muted' | 'error';
|
|
50
|
+
mainColumn?: boolean;
|
|
51
|
+
children: ReactNode;
|
|
52
|
+
}): import("react").JSX.Element;
|
|
53
|
+
/** A placeholder that keeps the main column's place while the details load. */
|
|
54
|
+
export declare function MainColumnSlot({ children }: {
|
|
55
|
+
children: ReactNode;
|
|
56
|
+
}): import("react").JSX.Element;
|
|
57
|
+
/** The meta area under the summary: its facts, wrapping onto as many lines as the width needs. */
|
|
58
|
+
export declare function MetaArea({ children, ...data }: {
|
|
59
|
+
children: ReactNode;
|
|
60
|
+
} & DataAttributes): import("react").JSX.Element;
|
|
61
|
+
/**
|
|
62
|
+
* A labelled fact: in the meta area, its value wrapping rather than running past the dialog; in a `record`, a fact of
|
|
63
|
+
* the work record whose value wraps onto lines of its own.
|
|
64
|
+
*/
|
|
65
|
+
export declare function DetailFact({ label, presentation, children, ...data }: {
|
|
66
|
+
label: string;
|
|
67
|
+
presentation?: 'meta' | 'record';
|
|
68
|
+
children: ReactNode;
|
|
69
|
+
} & DataAttributes): import("react").JSX.Element;
|
|
70
|
+
/** A line of short items, such as a review round's verdicts, wrapping. */
|
|
71
|
+
export declare function InlineList({ items }: {
|
|
72
|
+
items: readonly string[];
|
|
73
|
+
}): import("react").JSX.Element;
|
|
74
|
+
/** Facts one under the other, such as a record's review rounds. */
|
|
75
|
+
export declare function FactList({ children, ...data }: {
|
|
76
|
+
children: ReactNode;
|
|
77
|
+
} & DataAttributes): import("react").JSX.Element;
|
|
78
|
+
/** The editor's slot in a main section: a column that takes the height left when it `fill`s. */
|
|
79
|
+
export declare function EditorSlot({ fill, children }: {
|
|
80
|
+
fill: boolean;
|
|
81
|
+
children: ReactNode;
|
|
82
|
+
}): import("react").JSX.Element;
|
|
83
|
+
/** Under an editor: whether it changed, or `error` in its place, announced and wrapping, then its buttons. */
|
|
84
|
+
export declare function EditActions({ status, error, children, ...data }: {
|
|
85
|
+
status: string;
|
|
86
|
+
error?: string | null | undefined;
|
|
87
|
+
children: ReactNode;
|
|
88
|
+
} & DataAttributes): import("react").JSX.Element;
|
|
89
|
+
/** How a Spec's sync stands: its `status`, announced, then what answers it, then an `error`, announced. */
|
|
90
|
+
export declare function SpecSync({ status, error, children }: {
|
|
91
|
+
status?: string | undefined;
|
|
92
|
+
error?: string | null | undefined;
|
|
93
|
+
children?: ReactNode;
|
|
94
|
+
}): import("react").JSX.Element;
|
|
95
|
+
/** Linked work items, such as sub-tickets or blockers, one TicketLink each; or attachments, one AttachmentLink each. */
|
|
96
|
+
export declare function TicketLinkList({ children }: {
|
|
97
|
+
children: ReactNode;
|
|
98
|
+
}): import("react").JSX.Element;
|
|
99
|
+
/** A linked work item: done or open (`stateLabel` names it), its `reference` and `title` linked, and its tracker's
|
|
100
|
+
* `fields` under them. */
|
|
101
|
+
export declare function TicketLink({ closed, stateLabel, href, reference, title, fields }: {
|
|
102
|
+
closed: boolean;
|
|
103
|
+
stateLabel: string;
|
|
104
|
+
href: string;
|
|
105
|
+
reference: string;
|
|
106
|
+
title: string;
|
|
107
|
+
fields?: ReactNode;
|
|
108
|
+
}): import("react").JSX.Element;
|
|
109
|
+
/** An attachment's name, linked. */
|
|
110
|
+
export declare function AttachmentLink({ href, name }: {
|
|
111
|
+
href: string;
|
|
112
|
+
name: string;
|
|
113
|
+
}): import("react").JSX.Element;
|
|
114
|
+
/** A sprint's count over its children: `count` ("This sprint: 2 of 5 done") and the sprint's `name`. */
|
|
115
|
+
export declare function SprintCount({ count, name }: {
|
|
116
|
+
count: string;
|
|
117
|
+
name: string;
|
|
118
|
+
}): import("react").JSX.Element;
|
|
119
|
+
/** The work an item waits on, struck through once closed. */
|
|
120
|
+
export declare function WaitsOnList({ items }: {
|
|
121
|
+
items: readonly {
|
|
122
|
+
key: string;
|
|
123
|
+
title: string;
|
|
124
|
+
closed: boolean;
|
|
125
|
+
}[];
|
|
126
|
+
}): import("react").JSX.Element;
|
|
127
|
+
/** Chips in a wrapping line, grouped with no box of their own, such as the labels fact's, for tests to name. */
|
|
128
|
+
export declare function ChipGroup({ children, ...data }: {
|
|
129
|
+
children: ReactNode;
|
|
130
|
+
} & DataAttributes): import("react").JSX.Element;
|
|
131
|
+
/** A popover's panel for picking labels: 18rem wide, its picker over its status. */
|
|
132
|
+
export declare function LabelEditorPanel({ children }: {
|
|
133
|
+
children: ReactNode;
|
|
134
|
+
}): import("react").JSX.Element;
|
|
135
|
+
/** A kind change that failed: each of its `lines`, then the `action` that retries it, announced. */
|
|
136
|
+
export declare function ChangeFailed({ lines, action, ...data }: {
|
|
137
|
+
lines: readonly string[];
|
|
138
|
+
action: ReactNode;
|
|
139
|
+
} & DataAttributes): import("react").JSX.Element;
|
|
140
|
+
/** Where the item's kind and its ticket's disagree: the `message`, the `actions` that answer it, then a `hint` and any
|
|
141
|
+
* `error`, which the caller renders as caption Text. */
|
|
142
|
+
export declare function KindQuestion({ message, actions, children, ...data }: {
|
|
143
|
+
message: string;
|
|
144
|
+
actions: ReactNode;
|
|
145
|
+
children?: ReactNode;
|
|
146
|
+
} & DataAttributes): import("react").JSX.Element;
|
|
147
|
+
/** A ticket's outgoing title and text, as the tracker will receive them; the labels name each for assistive
|
|
148
|
+
* technology. */
|
|
149
|
+
export declare function OutgoingTicket({ title, text, titleLabel, textLabel }: {
|
|
150
|
+
title: string;
|
|
151
|
+
text: string;
|
|
152
|
+
titleLabel: string;
|
|
153
|
+
textLabel: string;
|
|
154
|
+
}): import("react").JSX.Element;
|
|
155
|
+
/** A check's run: its `command`, then what it says of the run. */
|
|
156
|
+
export declare function CheckRun({ command, children }: {
|
|
157
|
+
command: string;
|
|
158
|
+
children: ReactNode;
|
|
159
|
+
}): import("react").JSX.Element;
|
|
160
|
+
/** A section's own scrolling panel that focus moves to when it opens, such as Create issue's; `label` names it. */
|
|
161
|
+
export declare function FocusPanel({ label, ref, children }: {
|
|
162
|
+
label: string;
|
|
163
|
+
ref?: Ref<HTMLElement>;
|
|
164
|
+
children: ReactNode;
|
|
165
|
+
}): import("react").JSX.Element;
|
|
166
|
+
export {};
|
|
167
|
+
//# sourceMappingURL=ItemDetails.d.ts.map
|
|
@@ -0,0 +1,339 @@
|
|
|
1
|
+
import { CircleCheckIcon, CircleDotIcon } from "lucide-react";
|
|
2
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
// src/board/ItemDetails.tsx
|
|
4
|
+
const headings = {
|
|
5
|
+
section: "m-0 text-[13px] font-medium",
|
|
6
|
+
muted: "m-0 text-[13px] font-medium text-(--muted-foreground)",
|
|
7
|
+
label: "m-0 text-[11px] font-medium tracking-wider text-(--muted-foreground) uppercase"
|
|
8
|
+
};
|
|
9
|
+
/** A section's heading: a sidebar `section`'s, a `muted` one over the comments or a description's own section, or the
|
|
10
|
+
* small uppercase `label` over the description and the record. `as` a `label` it names the field `htmlFor` names, or
|
|
11
|
+
* as a `span` a group that names itself. */
|
|
12
|
+
function DetailsHeading({ presentation = "section", as = "h2", htmlFor, children }) {
|
|
13
|
+
if (as === "label") return /* @__PURE__ */ jsx("label", {
|
|
14
|
+
htmlFor,
|
|
15
|
+
className: headings[presentation],
|
|
16
|
+
children
|
|
17
|
+
});
|
|
18
|
+
if (as === "span") return /* @__PURE__ */ jsx("span", {
|
|
19
|
+
className: headings[presentation],
|
|
20
|
+
children
|
|
21
|
+
});
|
|
22
|
+
return /* @__PURE__ */ jsx("h2", {
|
|
23
|
+
className: headings[presentation],
|
|
24
|
+
children
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
/** A sidebar section, or a section of the body such as a concept's parts: its heading over its content. */
|
|
28
|
+
function DetailsSection({ heading, children, ...data }) {
|
|
29
|
+
return /* @__PURE__ */ jsxs("section", {
|
|
30
|
+
...data,
|
|
31
|
+
className: "grid min-w-0 grid-cols-[minmax(0,1fr)] gap-2",
|
|
32
|
+
children: [/* @__PURE__ */ jsx(DetailsHeading, { children: heading }), children]
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
/** A section of the description, such as Acceptance Criteria: its muted heading over its text. */
|
|
36
|
+
function TextSection({ heading, children }) {
|
|
37
|
+
return /* @__PURE__ */ jsxs("section", {
|
|
38
|
+
className: "grid min-w-0 gap-2",
|
|
39
|
+
children: [/* @__PURE__ */ jsx(DetailsHeading, {
|
|
40
|
+
presentation: "muted",
|
|
41
|
+
children: heading
|
|
42
|
+
}), children]
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* A section of the main column, beside the sidebar: the record, description or comments, its `header` over its
|
|
47
|
+
* content. When it `fill`s, its content takes the height left.
|
|
48
|
+
*/
|
|
49
|
+
function MainSection({ as: Tag = "div", header, fill = false, children, ...data }) {
|
|
50
|
+
return /* @__PURE__ */ jsxs(Tag, {
|
|
51
|
+
...data,
|
|
52
|
+
className: `grid min-w-0 gap-2 ${fill ? "min-h-0 grid-rows-[auto_minmax(0,1fr)]" : ""} @min-[45rem]:col-start-1`,
|
|
53
|
+
children: [header, children]
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
/** A main section's header row: its small uppercase `heading`, then its actions at the end. */
|
|
57
|
+
function SectionHeader({ heading, children }) {
|
|
58
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
59
|
+
className: "flex h-7 items-center justify-between gap-2",
|
|
60
|
+
children: [/* @__PURE__ */ jsx(DetailsHeading, {
|
|
61
|
+
presentation: "label",
|
|
62
|
+
children: heading
|
|
63
|
+
}), children && /* @__PURE__ */ jsx("span", {
|
|
64
|
+
className: "flex min-w-0 items-center gap-3",
|
|
65
|
+
children
|
|
66
|
+
})]
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
/** A short status in a section's header, such as a save that could not be read back, truncating. */
|
|
70
|
+
function HeaderStatus({ children }) {
|
|
71
|
+
return /* @__PURE__ */ jsx("span", {
|
|
72
|
+
className: "truncate text-xs text-(--muted-foreground)",
|
|
73
|
+
role: "status",
|
|
74
|
+
title: children,
|
|
75
|
+
children
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
/** A line of the details in the body size: an error, announced, or a muted empty state. `mainColumn` keeps it in the
|
|
79
|
+
* main column beside the sidebar. */
|
|
80
|
+
function DetailsText({ tone = "muted", mainColumn = false, children }) {
|
|
81
|
+
return /* @__PURE__ */ jsx("p", {
|
|
82
|
+
className: `m-0 text-sm ${tone === "error" ? "text-(--error-foreground)" : "text-(--muted-foreground)"}${mainColumn ? " @min-[45rem]:col-start-1" : ""}`,
|
|
83
|
+
role: tone === "error" ? "alert" : void 0,
|
|
84
|
+
children
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
/** A placeholder that keeps the main column's place while the details load. */
|
|
88
|
+
function MainColumnSlot({ children }) {
|
|
89
|
+
return /* @__PURE__ */ jsx("div", {
|
|
90
|
+
className: "@min-[45rem]:col-start-1",
|
|
91
|
+
children
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
/** The meta area under the summary: its facts, wrapping onto as many lines as the width needs. */
|
|
95
|
+
function MetaArea({ children, ...data }) {
|
|
96
|
+
return /* @__PURE__ */ jsx("div", {
|
|
97
|
+
...data,
|
|
98
|
+
className: "flex min-w-0 flex-wrap items-center gap-x-5 gap-y-2",
|
|
99
|
+
children
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* A labelled fact: in the meta area, its value wrapping rather than running past the dialog; in a `record`, a fact of
|
|
104
|
+
* the work record whose value wraps onto lines of its own.
|
|
105
|
+
*/
|
|
106
|
+
function DetailFact({ label, presentation = "meta", children, ...data }) {
|
|
107
|
+
if (presentation === "record") return /* @__PURE__ */ jsxs("div", {
|
|
108
|
+
...data,
|
|
109
|
+
className: "flex min-w-0 flex-wrap items-baseline gap-x-1.5 text-sm",
|
|
110
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
111
|
+
className: "shrink-0 text-xs text-(--muted-foreground)",
|
|
112
|
+
children: label
|
|
113
|
+
}), children]
|
|
114
|
+
});
|
|
115
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
116
|
+
...data,
|
|
117
|
+
className: "flex max-w-full min-w-0 items-baseline gap-1.5 text-sm",
|
|
118
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
119
|
+
className: "shrink-0 text-xs text-(--muted-foreground)",
|
|
120
|
+
children: label
|
|
121
|
+
}), /* @__PURE__ */ jsx("span", {
|
|
122
|
+
className: "min-w-0 wrap-anywhere",
|
|
123
|
+
children
|
|
124
|
+
})]
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
/** A line of short items, such as a review round's verdicts, wrapping. */
|
|
128
|
+
function InlineList({ items }) {
|
|
129
|
+
return /* @__PURE__ */ jsx("ul", {
|
|
130
|
+
className: "m-0 flex list-none flex-wrap gap-x-3 p-0",
|
|
131
|
+
children: items.map((item, index) => /* @__PURE__ */ jsx("li", { children: item }, index))
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
/** Facts one under the other, such as a record's review rounds. */
|
|
135
|
+
function FactList({ children, ...data }) {
|
|
136
|
+
return /* @__PURE__ */ jsx("div", {
|
|
137
|
+
...data,
|
|
138
|
+
className: "grid gap-1",
|
|
139
|
+
children
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
/** The editor's slot in a main section: a column that takes the height left when it `fill`s. */
|
|
143
|
+
function EditorSlot({ fill, children }) {
|
|
144
|
+
return /* @__PURE__ */ jsx("div", {
|
|
145
|
+
className: fill ? "flex min-h-0 flex-col" : "contents",
|
|
146
|
+
children
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
/** Under an editor: whether it changed, or `error` in its place, announced and wrapping, then its buttons. */
|
|
150
|
+
function EditActions({ status, error, children, ...data }) {
|
|
151
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
152
|
+
...data,
|
|
153
|
+
className: "flex items-start gap-2",
|
|
154
|
+
children: [error ? /* @__PURE__ */ jsx("p", {
|
|
155
|
+
className: "m-0 me-auto min-w-0 flex-1 py-1.5 text-xs text-(--error-foreground)",
|
|
156
|
+
role: "alert",
|
|
157
|
+
children: error
|
|
158
|
+
}) : /* @__PURE__ */ jsx("span", {
|
|
159
|
+
className: "me-auto min-w-0 flex-1 py-1.5 text-xs text-(--muted-foreground)",
|
|
160
|
+
children: status
|
|
161
|
+
}), children]
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
/** How a Spec's sync stands: its `status`, announced, then what answers it, then an `error`, announced. */
|
|
165
|
+
function SpecSync({ status, error, children }) {
|
|
166
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
167
|
+
className: "grid gap-2 text-sm",
|
|
168
|
+
"data-spec-sync": true,
|
|
169
|
+
children: [
|
|
170
|
+
status && /* @__PURE__ */ jsx("p", {
|
|
171
|
+
className: "m-0",
|
|
172
|
+
role: "status",
|
|
173
|
+
children: status
|
|
174
|
+
}),
|
|
175
|
+
children,
|
|
176
|
+
error && /* @__PURE__ */ jsx("p", {
|
|
177
|
+
className: "m-0 text-(--error-foreground)",
|
|
178
|
+
role: "alert",
|
|
179
|
+
children: error
|
|
180
|
+
})
|
|
181
|
+
]
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
/** Linked work items, such as sub-tickets or blockers, one TicketLink each; or attachments, one AttachmentLink each. */
|
|
185
|
+
function TicketLinkList({ children }) {
|
|
186
|
+
return /* @__PURE__ */ jsx("ul", {
|
|
187
|
+
className: "m-0 grid list-none gap-1.5 p-0",
|
|
188
|
+
children
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
/** A linked work item: done or open (`stateLabel` names it), its `reference` and `title` linked, and its tracker's
|
|
192
|
+
* `fields` under them. */
|
|
193
|
+
function TicketLink({ closed, stateLabel, href, reference, title, fields }) {
|
|
194
|
+
return /* @__PURE__ */ jsxs("li", {
|
|
195
|
+
className: "flex items-start gap-2 text-sm",
|
|
196
|
+
children: [closed ? /* @__PURE__ */ jsx(CircleCheckIcon, {
|
|
197
|
+
"aria-label": stateLabel,
|
|
198
|
+
className: "mt-0.5 size-3.5 shrink-0 text-(--success)"
|
|
199
|
+
}) : /* @__PURE__ */ jsx(CircleDotIcon, {
|
|
200
|
+
"aria-label": stateLabel,
|
|
201
|
+
className: "mt-0.5 size-3.5 shrink-0 text-(--muted-foreground)"
|
|
202
|
+
}), /* @__PURE__ */ jsxs("span", {
|
|
203
|
+
className: "min-w-0",
|
|
204
|
+
children: [/* @__PURE__ */ jsxs("a", {
|
|
205
|
+
href,
|
|
206
|
+
target: "_blank",
|
|
207
|
+
rel: "noopener",
|
|
208
|
+
className: "wrap-anywhere hover:underline",
|
|
209
|
+
children: [
|
|
210
|
+
/* @__PURE__ */ jsx("span", {
|
|
211
|
+
className: "text-(--muted-foreground)",
|
|
212
|
+
children: reference
|
|
213
|
+
}),
|
|
214
|
+
" ",
|
|
215
|
+
title
|
|
216
|
+
]
|
|
217
|
+
}), fields]
|
|
218
|
+
})]
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
/** An attachment's name, linked. */
|
|
222
|
+
function AttachmentLink({ href, name }) {
|
|
223
|
+
return /* @__PURE__ */ jsx("li", {
|
|
224
|
+
className: "text-sm",
|
|
225
|
+
children: /* @__PURE__ */ jsx("a", {
|
|
226
|
+
href,
|
|
227
|
+
target: "_blank",
|
|
228
|
+
rel: "noopener",
|
|
229
|
+
className: "wrap-anywhere underline",
|
|
230
|
+
children: name
|
|
231
|
+
})
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
/** A sprint's count over its children: `count` ("This sprint: 2 of 5 done") and the sprint's `name`. */
|
|
235
|
+
function SprintCount({ count, name }) {
|
|
236
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
237
|
+
className: "text-sm",
|
|
238
|
+
children: [/* @__PURE__ */ jsx("p", {
|
|
239
|
+
className: "m-0 font-medium",
|
|
240
|
+
children: count
|
|
241
|
+
}), /* @__PURE__ */ jsx("p", {
|
|
242
|
+
className: "m-0 text-xs text-(--muted-foreground)",
|
|
243
|
+
children: name
|
|
244
|
+
})]
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
/** The work an item waits on, struck through once closed. */
|
|
248
|
+
function WaitsOnList({ items }) {
|
|
249
|
+
return /* @__PURE__ */ jsx("ul", {
|
|
250
|
+
className: "m-0 grid list-none gap-1.5 p-0 text-sm",
|
|
251
|
+
"data-waits-on": true,
|
|
252
|
+
children: items.map((item) => /* @__PURE__ */ jsx("li", {
|
|
253
|
+
className: item.closed ? "text-(--muted-foreground) line-through" : "",
|
|
254
|
+
children: item.title
|
|
255
|
+
}, item.key))
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
/** Chips in a wrapping line, grouped with no box of their own, such as the labels fact's, for tests to name. */
|
|
259
|
+
function ChipGroup({ children, ...data }) {
|
|
260
|
+
return /* @__PURE__ */ jsx("span", {
|
|
261
|
+
...data,
|
|
262
|
+
className: "contents",
|
|
263
|
+
children
|
|
264
|
+
});
|
|
265
|
+
}
|
|
266
|
+
/** A popover's panel for picking labels: 18rem wide, its picker over its status. */
|
|
267
|
+
function LabelEditorPanel({ children }) {
|
|
268
|
+
return /* @__PURE__ */ jsx("div", {
|
|
269
|
+
className: "grid w-72 gap-2",
|
|
270
|
+
children
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
/** A kind change that failed: each of its `lines`, then the `action` that retries it, announced. */
|
|
274
|
+
function ChangeFailed({ lines, action, ...data }) {
|
|
275
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
276
|
+
...data,
|
|
277
|
+
role: "alert",
|
|
278
|
+
className: "grid w-full justify-items-start gap-1 text-xs text-(--error-foreground)",
|
|
279
|
+
children: [lines.map((line, index) => /* @__PURE__ */ jsx("p", {
|
|
280
|
+
className: "m-0",
|
|
281
|
+
children: line
|
|
282
|
+
}, index)), action]
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
/** Where the item's kind and its ticket's disagree: the `message`, the `actions` that answer it, then a `hint` and any
|
|
286
|
+
* `error`, which the caller renders as caption Text. */
|
|
287
|
+
function KindQuestion({ message, actions, children, ...data }) {
|
|
288
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
289
|
+
...data,
|
|
290
|
+
className: "grid w-full gap-2 rounded-lg border border-(--border) p-3",
|
|
291
|
+
children: [
|
|
292
|
+
/* @__PURE__ */ jsx("p", {
|
|
293
|
+
className: "m-0 text-sm",
|
|
294
|
+
children: message
|
|
295
|
+
}),
|
|
296
|
+
/* @__PURE__ */ jsx("span", {
|
|
297
|
+
className: "flex flex-wrap gap-2",
|
|
298
|
+
children: actions
|
|
299
|
+
}),
|
|
300
|
+
children
|
|
301
|
+
]
|
|
302
|
+
});
|
|
303
|
+
}
|
|
304
|
+
/** A ticket's outgoing title and text, as the tracker will receive them; the labels name each for assistive
|
|
305
|
+
* technology. */
|
|
306
|
+
function OutgoingTicket({ title, text, titleLabel, textLabel }) {
|
|
307
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("div", {
|
|
308
|
+
"aria-label": titleLabel,
|
|
309
|
+
className: "font-medium wrap-anywhere",
|
|
310
|
+
children: title
|
|
311
|
+
}), /* @__PURE__ */ jsx("pre", {
|
|
312
|
+
"aria-label": textLabel,
|
|
313
|
+
className: "m-0 max-h-64 overflow-auto text-xs wrap-anywhere whitespace-pre-wrap",
|
|
314
|
+
children: text
|
|
315
|
+
})] });
|
|
316
|
+
}
|
|
317
|
+
/** A check's run: its `command`, then what it says of the run. */
|
|
318
|
+
function CheckRun({ command, children }) {
|
|
319
|
+
return /* @__PURE__ */ jsxs("section", {
|
|
320
|
+
className: "min-w-0 rounded border border-(--border) p-2",
|
|
321
|
+
children: [/* @__PURE__ */ jsx("code", {
|
|
322
|
+
className: "wrap-anywhere whitespace-pre-wrap",
|
|
323
|
+
children: command
|
|
324
|
+
}), children]
|
|
325
|
+
});
|
|
326
|
+
}
|
|
327
|
+
/** A section's own scrolling panel that focus moves to when it opens, such as Create issue's; `label` names it. */
|
|
328
|
+
function FocusPanel({ label, ref, children }) {
|
|
329
|
+
return /* @__PURE__ */ jsx("section", {
|
|
330
|
+
ref,
|
|
331
|
+
tabIndex: -1,
|
|
332
|
+
"aria-label": label,
|
|
333
|
+
className: "grid max-h-[50dvh] w-full gap-3 overflow-y-auto pt-1",
|
|
334
|
+
children
|
|
335
|
+
});
|
|
336
|
+
}
|
|
337
|
+
export { AttachmentLink, ChangeFailed, CheckRun, ChipGroup, DetailFact, DetailsHeading, DetailsSection, DetailsText, EditActions, EditorSlot, FactList, FocusPanel, HeaderStatus, InlineList, KindQuestion, LabelEditorPanel, MainColumnSlot, MainSection, MetaArea, OutgoingTicket, SectionHeader, SpecSync, SprintCount, TextSection, TicketLink, TicketLinkList, WaitsOnList };
|
|
338
|
+
|
|
339
|
+
//# sourceMappingURL=ItemDetails.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ItemDetails.js","names":[],"sources":["../../src/board/ItemDetails.tsx"],"sourcesContent":["// What Lar Factory's item dialog shows from a piece of work's details: its sections' headings, the meta area's facts\n// and people, the main column's description, record and comments, and the sidebar's lists.\n\nimport { CircleCheckIcon, CircleDotIcon } from 'lucide-react';\nimport type { ReactNode, Ref } from 'react';\n\nimport type { DataAttributes } from './DataAttributes';\n\nconst headings = {\n section: 'm-0 text-[13px] font-medium',\n muted: 'm-0 text-[13px] font-medium text-(--muted-foreground)',\n label: 'm-0 text-[11px] font-medium tracking-wider text-(--muted-foreground) uppercase',\n} as const;\n\n/** A section's heading: a sidebar `section`'s, a `muted` one over the comments or a description's own section, or the\n * small uppercase `label` over the description and the record. `as` a `label` it names the field `htmlFor` names, or\n * as a `span` a group that names itself. */\nexport function DetailsHeading({\n presentation = 'section',\n as = 'h2',\n htmlFor,\n children,\n}: {\n presentation?: keyof typeof headings;\n as?: 'h2' | 'label' | 'span';\n htmlFor?: string | undefined;\n children: ReactNode;\n}) {\n if (as === 'label')\n return (\n <label htmlFor={htmlFor} className={headings[presentation]}>\n {children}\n </label>\n );\n\n if (as === 'span') return <span className={headings[presentation]}>{children}</span>;\n\n return <h2 className={headings[presentation]}>{children}</h2>;\n}\n\n/** A sidebar section, or a section of the body such as a concept's parts: its heading over its content. */\nexport function DetailsSection({\n heading,\n children,\n ...data\n}: {\n heading: ReactNode;\n children: ReactNode;\n} & DataAttributes) {\n return (\n <section {...data} className=\"grid min-w-0 grid-cols-[minmax(0,1fr)] gap-2\">\n <DetailsHeading>{heading}</DetailsHeading>\n {children}\n </section>\n );\n}\n\n/** A section of the description, such as Acceptance Criteria: its muted heading over its text. */\nexport function TextSection({ heading, children }: { heading: ReactNode; children: ReactNode }) {\n return (\n <section className=\"grid min-w-0 gap-2\">\n <DetailsHeading presentation=\"muted\">{heading}</DetailsHeading>\n {children}\n </section>\n );\n}\n\n/**\n * A section of the main column, beside the sidebar: the record, description or comments, its `header` over its\n * content. When it `fill`s, its content takes the height left.\n */\nexport function MainSection({\n as: Tag = 'div',\n header,\n fill = false,\n children,\n ...data\n}: {\n as?: 'div' | 'section';\n header: ReactNode;\n fill?: boolean;\n children: ReactNode;\n} & DataAttributes) {\n return (\n <Tag\n {...data}\n className={`grid min-w-0 gap-2 ${fill ? 'min-h-0 grid-rows-[auto_minmax(0,1fr)]' : ''} @min-[45rem]:col-start-1`}\n >\n {header}\n {children}\n </Tag>\n );\n}\n\n/** A main section's header row: its small uppercase `heading`, then its actions at the end. */\nexport function SectionHeader({ heading, children }: { heading: ReactNode; children?: ReactNode }) {\n return (\n <div className=\"flex h-7 items-center justify-between gap-2\">\n <DetailsHeading presentation=\"label\">{heading}</DetailsHeading>\n {children && <span className=\"flex min-w-0 items-center gap-3\">{children}</span>}\n </div>\n );\n}\n\n/** A short status in a section's header, such as a save that could not be read back, truncating. */\nexport function HeaderStatus({ children }: { children: string }) {\n return (\n <span className=\"truncate text-xs text-(--muted-foreground)\" role=\"status\" title={children}>\n {children}\n </span>\n );\n}\n\n/** A line of the details in the body size: an error, announced, or a muted empty state. `mainColumn` keeps it in the\n * main column beside the sidebar. */\nexport function DetailsText({\n tone = 'muted',\n mainColumn = false,\n children,\n}: {\n tone?: 'muted' | 'error';\n mainColumn?: boolean;\n children: ReactNode;\n}) {\n return (\n <p\n className={`m-0 text-sm ${tone === 'error' ? 'text-(--error-foreground)' : 'text-(--muted-foreground)'}${mainColumn ? ' @min-[45rem]:col-start-1' : ''}`}\n role={tone === 'error' ? 'alert' : undefined}\n >\n {children}\n </p>\n );\n}\n\n/** A placeholder that keeps the main column's place while the details load. */\nexport function MainColumnSlot({ children }: { children: ReactNode }) {\n return <div className=\"@min-[45rem]:col-start-1\">{children}</div>;\n}\n\n/** The meta area under the summary: its facts, wrapping onto as many lines as the width needs. */\nexport function MetaArea({ children, ...data }: { children: ReactNode } & DataAttributes) {\n return (\n <div {...data} className=\"flex min-w-0 flex-wrap items-center gap-x-5 gap-y-2\">\n {children}\n </div>\n );\n}\n\n/**\n * A labelled fact: in the meta area, its value wrapping rather than running past the dialog; in a `record`, a fact of\n * the work record whose value wraps onto lines of its own.\n */\nexport function DetailFact({\n label,\n presentation = 'meta',\n children,\n ...data\n}: {\n label: string;\n presentation?: 'meta' | 'record';\n children: ReactNode;\n} & DataAttributes) {\n if (presentation === 'record')\n return (\n <div {...data} className=\"flex min-w-0 flex-wrap items-baseline gap-x-1.5 text-sm\">\n <span className=\"shrink-0 text-xs text-(--muted-foreground)\">{label}</span>\n {children}\n </div>\n );\n\n return (\n <div {...data} className=\"flex max-w-full min-w-0 items-baseline gap-1.5 text-sm\">\n <span className=\"shrink-0 text-xs text-(--muted-foreground)\">{label}</span>\n <span className=\"min-w-0 wrap-anywhere\">{children}</span>\n </div>\n );\n}\n\n/** A line of short items, such as a review round's verdicts, wrapping. */\nexport function InlineList({ items }: { items: readonly string[] }) {\n return (\n <ul className=\"m-0 flex list-none flex-wrap gap-x-3 p-0\">\n {items.map((item, index) => (\n <li key={index}>{item}</li>\n ))}\n </ul>\n );\n}\n\n/** Facts one under the other, such as a record's review rounds. */\nexport function FactList({ children, ...data }: { children: ReactNode } & DataAttributes) {\n return (\n <div {...data} className=\"grid gap-1\">\n {children}\n </div>\n );\n}\n\n/** The editor's slot in a main section: a column that takes the height left when it `fill`s. */\nexport function EditorSlot({ fill, children }: { fill: boolean; children: ReactNode }) {\n return <div className={fill ? 'flex min-h-0 flex-col' : 'contents'}>{children}</div>;\n}\n\n/** Under an editor: whether it changed, or `error` in its place, announced and wrapping, then its buttons. */\nexport function EditActions({\n status,\n error,\n children,\n ...data\n}: {\n status: string;\n error?: string | null | undefined;\n children: ReactNode;\n} & DataAttributes) {\n return (\n <div {...data} className=\"flex items-start gap-2\">\n {error ? (\n <p className=\"m-0 me-auto min-w-0 flex-1 py-1.5 text-xs text-(--error-foreground)\" role=\"alert\">\n {error}\n </p>\n ) : (\n <span className=\"me-auto min-w-0 flex-1 py-1.5 text-xs text-(--muted-foreground)\">{status}</span>\n )}\n {children}\n </div>\n );\n}\n\n/** How a Spec's sync stands: its `status`, announced, then what answers it, then an `error`, announced. */\nexport function SpecSync({\n status,\n error,\n children,\n}: {\n status?: string | undefined;\n error?: string | null | undefined;\n children?: ReactNode;\n}) {\n return (\n <div className=\"grid gap-2 text-sm\" data-spec-sync>\n {status && (\n <p className=\"m-0\" role=\"status\">\n {status}\n </p>\n )}\n {children}\n {error && (\n <p className=\"m-0 text-(--error-foreground)\" role=\"alert\">\n {error}\n </p>\n )}\n </div>\n );\n}\n\n/** Linked work items, such as sub-tickets or blockers, one TicketLink each; or attachments, one AttachmentLink each. */\nexport function TicketLinkList({ children }: { children: ReactNode }) {\n return <ul className=\"m-0 grid list-none gap-1.5 p-0\">{children}</ul>;\n}\n\n/** A linked work item: done or open (`stateLabel` names it), its `reference` and `title` linked, and its tracker's\n * `fields` under them. */\nexport function TicketLink({\n closed,\n stateLabel,\n href,\n reference,\n title,\n fields,\n}: {\n closed: boolean;\n stateLabel: string;\n href: string;\n reference: string;\n title: string;\n fields?: ReactNode;\n}) {\n return (\n <li className=\"flex items-start gap-2 text-sm\">\n {closed ? (\n <CircleCheckIcon aria-label={stateLabel} className=\"mt-0.5 size-3.5 shrink-0 text-(--success)\" />\n ) : (\n <CircleDotIcon aria-label={stateLabel} className=\"mt-0.5 size-3.5 shrink-0 text-(--muted-foreground)\" />\n )}\n <span className=\"min-w-0\">\n <a href={href} target=\"_blank\" rel=\"noopener\" className=\"wrap-anywhere hover:underline\">\n <span className=\"text-(--muted-foreground)\">{reference}</span> {title}\n </a>\n {fields}\n </span>\n </li>\n );\n}\n\n/** An attachment's name, linked. */\nexport function AttachmentLink({ href, name }: { href: string; name: string }) {\n return (\n <li className=\"text-sm\">\n <a href={href} target=\"_blank\" rel=\"noopener\" className=\"wrap-anywhere underline\">\n {name}\n </a>\n </li>\n );\n}\n\n/** A sprint's count over its children: `count` (\"This sprint: 2 of 5 done\") and the sprint's `name`. */\nexport function SprintCount({ count, name }: { count: string; name: string }) {\n return (\n <div className=\"text-sm\">\n <p className=\"m-0 font-medium\">{count}</p>\n <p className=\"m-0 text-xs text-(--muted-foreground)\">{name}</p>\n </div>\n );\n}\n\n/** The work an item waits on, struck through once closed. */\nexport function WaitsOnList({ items }: { items: readonly { key: string; title: string; closed: boolean }[] }) {\n return (\n <ul className=\"m-0 grid list-none gap-1.5 p-0 text-sm\" data-waits-on>\n {items.map((item) => (\n <li key={item.key} className={item.closed ? 'text-(--muted-foreground) line-through' : ''}>\n {item.title}\n </li>\n ))}\n </ul>\n );\n}\n\n/** Chips in a wrapping line, grouped with no box of their own, such as the labels fact's, for tests to name. */\nexport function ChipGroup({ children, ...data }: { children: ReactNode } & DataAttributes) {\n return (\n <span {...data} className=\"contents\">\n {children}\n </span>\n );\n}\n\n/** A popover's panel for picking labels: 18rem wide, its picker over its status. */\nexport function LabelEditorPanel({ children }: { children: ReactNode }) {\n return <div className=\"grid w-72 gap-2\">{children}</div>;\n}\n\n/** A kind change that failed: each of its `lines`, then the `action` that retries it, announced. */\nexport function ChangeFailed({\n lines,\n action,\n ...data\n}: {\n lines: readonly string[];\n action: ReactNode;\n} & DataAttributes) {\n return (\n <div {...data} role=\"alert\" className=\"grid w-full justify-items-start gap-1 text-xs text-(--error-foreground)\">\n {lines.map((line, index) => (\n <p key={index} className=\"m-0\">\n {line}\n </p>\n ))}\n {action}\n </div>\n );\n}\n\n/** Where the item's kind and its ticket's disagree: the `message`, the `actions` that answer it, then a `hint` and any\n * `error`, which the caller renders as caption Text. */\nexport function KindQuestion({\n message,\n actions,\n children,\n ...data\n}: {\n message: string;\n actions: ReactNode;\n children?: ReactNode;\n} & DataAttributes) {\n return (\n <div {...data} className=\"grid w-full gap-2 rounded-lg border border-(--border) p-3\">\n <p className=\"m-0 text-sm\">{message}</p>\n <span className=\"flex flex-wrap gap-2\">{actions}</span>\n {children}\n </div>\n );\n}\n\n/** A ticket's outgoing title and text, as the tracker will receive them; the labels name each for assistive\n * technology. */\nexport function OutgoingTicket({\n title,\n text,\n titleLabel,\n textLabel,\n}: {\n title: string;\n text: string;\n titleLabel: string;\n textLabel: string;\n}) {\n return (\n <>\n <div aria-label={titleLabel} className=\"font-medium wrap-anywhere\">\n {title}\n </div>\n <pre\n aria-label={textLabel}\n className=\"m-0 max-h-64 overflow-auto text-xs wrap-anywhere whitespace-pre-wrap\"\n >\n {text}\n </pre>\n </>\n );\n}\n\n/** A check's run: its `command`, then what it says of the run. */\nexport function CheckRun({ command, children }: { command: string; children: ReactNode }) {\n return (\n <section className=\"min-w-0 rounded border border-(--border) p-2\">\n <code className=\"wrap-anywhere whitespace-pre-wrap\">{command}</code>\n {children}\n </section>\n );\n}\n\n/** A section's own scrolling panel that focus moves to when it opens, such as Create issue's; `label` names it. */\nexport function FocusPanel({ label, ref, children }: { label: string; ref?: Ref<HTMLElement>; children: ReactNode }) {\n return (\n <section\n ref={ref}\n tabIndex={-1}\n aria-label={label}\n className=\"grid max-h-[50dvh] w-full gap-3 overflow-y-auto pt-1\"\n >\n {children}\n </section>\n );\n}\n"],"mappings":"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"}
|