@lar-works/design-system 0.2.0 → 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/showcase.css +6 -0
- package/src/styles.css +9 -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
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
import { Button } from "../actions/Button.js";
|
|
2
|
+
import { Badge } from "../display/Badge.js";
|
|
2
3
|
import { InsetPanel } from "../display/InsetPanel.js";
|
|
3
4
|
import { SkeletonLoader } from "../feedback/SkeletonLoader.js";
|
|
4
5
|
import { Stack } from "../layout/Flow.js";
|
|
6
|
+
import { HelpTip } from "../overlays/HelpTip.js";
|
|
5
7
|
import { Heading, Text } from "../typography/Typography.js";
|
|
6
8
|
import { Field } from "./Field.js";
|
|
7
9
|
import { useId, useState } from "react";
|
|
8
|
-
import { jsx, jsxs } from "react/jsx-runtime";
|
|
9
10
|
import { ChevronDownIcon } from "lucide-react";
|
|
11
|
+
import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
|
|
10
12
|
// src/forms/FormSection.tsx
|
|
11
13
|
const contentSpacing = "px-4 py-3.5 sm:px-5";
|
|
12
14
|
const rowClasses = `grid min-w-0 gap-x-6 gap-y-3 sm:items-center ${contentSpacing}`;
|
|
@@ -23,7 +25,31 @@ function FormStack({ children }) {
|
|
|
23
25
|
children
|
|
24
26
|
});
|
|
25
27
|
}
|
|
26
|
-
function FormSection(
|
|
28
|
+
function FormSection(props) {
|
|
29
|
+
if (props.presentation === "dense") return /* @__PURE__ */ jsx(DenseFormSection, { ...props });
|
|
30
|
+
return /* @__PURE__ */ jsx(PanelFormSection, { ...props });
|
|
31
|
+
}
|
|
32
|
+
function DenseFormSection({ presentation: _presentation, title, help, helpLabel, description, "aria-label": label, children, ...data }) {
|
|
33
|
+
const titleId = useId();
|
|
34
|
+
return /* @__PURE__ */ jsxs("section", {
|
|
35
|
+
...data,
|
|
36
|
+
"aria-label": label,
|
|
37
|
+
"aria-labelledby": label || !title ? void 0 : titleId,
|
|
38
|
+
className: "grid min-w-0 gap-3",
|
|
39
|
+
children: [(title || description) && /* @__PURE__ */ jsxs("div", { children: [title && /* @__PURE__ */ jsxs("h3", {
|
|
40
|
+
id: titleId,
|
|
41
|
+
className: "m-0 flex items-center gap-1.5 text-[13px] font-semibold",
|
|
42
|
+
children: [title, help && /* @__PURE__ */ jsx(HelpTip, {
|
|
43
|
+
label: helpLabel ?? (typeof title === "string" ? title : ""),
|
|
44
|
+
children: help
|
|
45
|
+
})]
|
|
46
|
+
}), description && /* @__PURE__ */ jsx("p", {
|
|
47
|
+
className: "text-base-700 m-0 mt-0.5 text-xs",
|
|
48
|
+
children: description
|
|
49
|
+
})] }), children]
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
function PanelFormSection({ action, badges, children, description, loading = false, loadingLabel, title }) {
|
|
27
53
|
const titleId = useId();
|
|
28
54
|
const content = /* @__PURE__ */ jsxs("section", {
|
|
29
55
|
"aria-labelledby": titleId,
|
|
@@ -56,7 +82,9 @@ function FormSection({ action, badges, children, description, loading = false, l
|
|
|
56
82
|
children: content
|
|
57
83
|
}) : content;
|
|
58
84
|
}
|
|
59
|
-
function FormRow(
|
|
85
|
+
function FormRow(props) {
|
|
86
|
+
if (props.layout === "flow") return /* @__PURE__ */ jsx(FormRowFlow, { ...props });
|
|
87
|
+
const { badges, children, description, id, label } = props;
|
|
60
88
|
return /* @__PURE__ */ jsxs("div", {
|
|
61
89
|
id,
|
|
62
90
|
tabIndex: id ? -1 : void 0,
|
|
@@ -82,6 +110,48 @@ function FormRow({ badges, children, description, id, label }) {
|
|
|
82
110
|
})]
|
|
83
111
|
});
|
|
84
112
|
}
|
|
113
|
+
function FormRowFlow({ layout: _layout, label, help, helpLabel, description, children, below, error, errorId, ...data }) {
|
|
114
|
+
const fallbackErrorId = useId();
|
|
115
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
116
|
+
...data,
|
|
117
|
+
className: "settings-row grid min-w-0 gap-2 px-4 py-3",
|
|
118
|
+
children: [
|
|
119
|
+
/* @__PURE__ */ jsxs("div", {
|
|
120
|
+
className: "flex min-w-0 flex-wrap items-center gap-x-6 gap-y-2",
|
|
121
|
+
children: [/* @__PURE__ */ jsxs("div", {
|
|
122
|
+
className: "min-w-32 flex-1",
|
|
123
|
+
children: [/* @__PURE__ */ jsxs("div", {
|
|
124
|
+
className: "settings-row-title flex min-w-0 items-center gap-1.5 text-[13px] font-medium wrap-anywhere",
|
|
125
|
+
children: [label, help && /* @__PURE__ */ jsx(HelpTip, {
|
|
126
|
+
label: helpLabel ?? (typeof label === "string" ? label : ""),
|
|
127
|
+
children: help
|
|
128
|
+
})]
|
|
129
|
+
}), description && /* @__PURE__ */ jsx("div", {
|
|
130
|
+
className: "text-base-700 text-xs wrap-anywhere",
|
|
131
|
+
children: description
|
|
132
|
+
})]
|
|
133
|
+
}), children && /* @__PURE__ */ jsx("div", {
|
|
134
|
+
className: "settings-row-control flex max-w-full min-w-0 flex-wrap items-center gap-2 sm:max-w-[60%] [&_button]:max-w-full [&>span]:max-w-full",
|
|
135
|
+
children
|
|
136
|
+
})]
|
|
137
|
+
}),
|
|
138
|
+
below,
|
|
139
|
+
error && /* @__PURE__ */ jsx("p", {
|
|
140
|
+
id: errorId ?? fallbackErrorId,
|
|
141
|
+
role: "alert",
|
|
142
|
+
className: "m-0 text-xs text-(--lar-danger-text)",
|
|
143
|
+
children: error
|
|
144
|
+
})
|
|
145
|
+
]
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
/** A value and its unit beside it in a row's controls, such as a number field and "days". */
|
|
149
|
+
function FormUnit({ children, unit }) {
|
|
150
|
+
return /* @__PURE__ */ jsxs("span", {
|
|
151
|
+
className: "flex items-center gap-2 text-sm [&_input]:w-20",
|
|
152
|
+
children: [children, unit]
|
|
153
|
+
});
|
|
154
|
+
}
|
|
85
155
|
function FormField({ action, children, loading = false, loadingLabel, ...props }) {
|
|
86
156
|
if (loading) return /* @__PURE__ */ jsx(SkeletonLoader, {
|
|
87
157
|
label: loadingLabel ?? "",
|
|
@@ -119,11 +189,58 @@ function FormAction(props) {
|
|
|
119
189
|
variant: "subtle"
|
|
120
190
|
});
|
|
121
191
|
}
|
|
122
|
-
function Disclosure({ children, label, lazy = false }) {
|
|
123
|
-
const [open, setOpen] = useState(
|
|
192
|
+
function Disclosure({ children, label, lazy = false, presentation = "note", defaultOpen = false, badge, onOpenChange, ...data }) {
|
|
193
|
+
const [open, setOpen] = useState(defaultOpen);
|
|
194
|
+
const shown = !lazy || open ? children : null;
|
|
195
|
+
const toggle = (event) => {
|
|
196
|
+
setOpen(event.currentTarget.open);
|
|
197
|
+
onOpenChange?.(event.currentTarget.open);
|
|
198
|
+
};
|
|
199
|
+
if (presentation === "group") return /* @__PURE__ */ jsxs("details", {
|
|
200
|
+
...data,
|
|
201
|
+
open,
|
|
202
|
+
onToggle: toggle,
|
|
203
|
+
className: "min-w-0",
|
|
204
|
+
children: [/* @__PURE__ */ jsxs("summary", {
|
|
205
|
+
className: "cursor-pointer text-[13px] font-semibold",
|
|
206
|
+
children: [label, badge && /* @__PURE__ */ jsxs(Fragment$1, { children: [" ", /* @__PURE__ */ jsx(Badge, {
|
|
207
|
+
className: "ms-1",
|
|
208
|
+
children: badge
|
|
209
|
+
})] })]
|
|
210
|
+
}), shown && /* @__PURE__ */ jsx("div", {
|
|
211
|
+
className: "mt-3 grid min-w-0 gap-3",
|
|
212
|
+
children: shown
|
|
213
|
+
})]
|
|
214
|
+
});
|
|
215
|
+
if (presentation === "framed") return /* @__PURE__ */ jsxs("details", {
|
|
216
|
+
...data,
|
|
217
|
+
open,
|
|
218
|
+
onToggle: toggle,
|
|
219
|
+
className: "min-w-0 rounded-lg border px-3 py-2",
|
|
220
|
+
children: [/* @__PURE__ */ jsx("summary", {
|
|
221
|
+
className: "cursor-pointer text-sm font-medium",
|
|
222
|
+
children: label
|
|
223
|
+
}), /* @__PURE__ */ jsx("div", {
|
|
224
|
+
className: "mt-2",
|
|
225
|
+
children: shown
|
|
226
|
+
})]
|
|
227
|
+
});
|
|
228
|
+
if (presentation === "section") return /* @__PURE__ */ jsxs("details", {
|
|
229
|
+
...data,
|
|
230
|
+
className: "grid min-w-0 gap-2",
|
|
231
|
+
onToggle: toggle,
|
|
232
|
+
children: [/* @__PURE__ */ jsx("summary", {
|
|
233
|
+
className: "text-base-700 cursor-pointer text-sm",
|
|
234
|
+
children: label
|
|
235
|
+
}), /* @__PURE__ */ jsx("div", {
|
|
236
|
+
className: "pt-2",
|
|
237
|
+
children: shown
|
|
238
|
+
})]
|
|
239
|
+
});
|
|
124
240
|
return /* @__PURE__ */ jsxs("details", {
|
|
241
|
+
...data,
|
|
125
242
|
className: "group px-1",
|
|
126
|
-
onToggle:
|
|
243
|
+
onToggle: toggle,
|
|
127
244
|
children: [/* @__PURE__ */ jsxs("summary", {
|
|
128
245
|
className: "text-base-700 hover:text-base-content focus-visible:outline-primary flex w-fit cursor-pointer list-none items-center gap-1.5 rounded py-1 text-xs focus-visible:outline-2 focus-visible:outline-offset-2 [&::-webkit-details-marker]:hidden",
|
|
129
246
|
children: [/* @__PURE__ */ jsx("span", {
|
|
@@ -133,10 +250,24 @@ function Disclosure({ children, label, lazy = false }) {
|
|
|
133
250
|
}), label]
|
|
134
251
|
}), /* @__PURE__ */ jsx("div", {
|
|
135
252
|
className: "text-base-700 mt-2 space-y-2 text-xs leading-relaxed",
|
|
136
|
-
children:
|
|
253
|
+
children: shown
|
|
137
254
|
})]
|
|
138
255
|
});
|
|
139
256
|
}
|
|
140
|
-
|
|
257
|
+
/** The form section's fieldset: a bordered group of controls under a legend, on the native fieldset, which also
|
|
258
|
+
* disables every control inside it. As a `group`, it only groups and disables its fields. */
|
|
259
|
+
function FormFieldset({ legend, hiddenLegend = false, presentation = "bordered", className = "", children, ...props }) {
|
|
260
|
+
return /* @__PURE__ */ jsxs("fieldset", {
|
|
261
|
+
className: `m-0 min-w-0 ${presentation === "group" ? "border-0 p-0" : "border-base-300 mb-3 rounded-lg border px-3 pt-2 pb-0 [&>legend]:mb-2 [&>legend]:font-semibold"} ${className}`,
|
|
262
|
+
"data-slot": "fieldset",
|
|
263
|
+
...props,
|
|
264
|
+
children: [legend ? /* @__PURE__ */ jsx("legend", {
|
|
265
|
+
className: hiddenLegend ? "sr-only" : "text-base-content p-0 text-sm leading-5 font-medium",
|
|
266
|
+
"data-slot": "fieldset-legend",
|
|
267
|
+
children: legend
|
|
268
|
+
}) : null, children]
|
|
269
|
+
});
|
|
270
|
+
}
|
|
271
|
+
export { Disclosure, FormAction, FormContent, FormField, FormFieldset, FormRow, FormSection, FormStack, FormUnit };
|
|
141
272
|
|
|
142
273
|
//# sourceMappingURL=FormSection.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FormSection.js","names":[],"sources":["../../src/forms/FormSection.tsx"],"sourcesContent":["import { ChevronDownIcon } from 'lucide-react';\nimport { type ReactNode, useId, useState } from 'react';\n\nimport { Button, type ButtonProps } from '../actions/Button';\nimport { InsetPanel } from '../display/InsetPanel';\nimport { SkeletonLoader } from '../feedback/SkeletonLoader';\nimport { Stack } from '../layout/Flow';\nimport { Heading, Text } from '../typography/Typography';\nimport { Field, type FieldProps } from './Field';\n\nconst contentSpacing = 'px-4 py-3.5 sm:px-5';\nconst rowClasses = `grid min-w-0 gap-x-6 gap-y-3 sm:items-center ${contentSpacing}`;\n\nexport function FormContent({ children }: { children: ReactNode }) {\n return (\n <Stack space=\"group\" className={contentSpacing}>\n {children}\n </Stack>\n );\n}\n\nexport function FormStack({ children }: { children: ReactNode }) {\n return <Stack space=\"page\">{children}</Stack>;\n}\n\ninterface FormSectionProps {\n action?: ReactNode;\n badges?: ReactNode;\n children: ReactNode;\n description?: string;\n loading?: boolean;\n loadingLabel?: string;\n title: ReactNode;\n}\n\nexport function FormSection({\n action,\n badges,\n children,\n description,\n loading = false,\n loadingLabel,\n title,\n}: FormSectionProps) {\n const titleId = useId();\n const content = (\n <section aria-labelledby={titleId}>\n <div className=\"flex min-h-5 items-center justify-between gap-3\">\n <div className=\"flex min-w-0 flex-wrap items-center gap-2\">\n <Heading id={titleId} as=\"h3\" className=\"text-base-700\" variant=\"label\">\n {title}\n </Heading>\n {badges}\n </div>\n {action}\n </div>\n <div className=\"mt-3\">\n <InsetPanel presentation=\"settings\">\n {description ? (\n <FormContent>\n <Text variant=\"caption\" tone=\"muted\">\n {description}\n </Text>\n </FormContent>\n ) : null}\n {children}\n </InsetPanel>\n </div>\n </section>\n );\n\n return loading ? (\n <SkeletonLoader label={loadingLabel ?? (typeof title === 'string' ? title : '')}>{content}</SkeletonLoader>\n ) : (\n content\n );\n}\n\ninterface FormRowProps {\n badges?: ReactNode;\n children: ReactNode;\n description: string;\n /** The row's element id, for linking or scrolling to it; a row with one can take focus when it is opened. */\n id?: string;\n label: ReactNode;\n}\n\nexport function FormRow({ badges, children, description, id, label }: FormRowProps) {\n return (\n <div\n id={id}\n tabIndex={id ? -1 : undefined}\n className={`${rowClasses} sm:grid-cols-[minmax(0,1fr)_13rem] sm:has-[[role=switch]]:grid-cols-[minmax(0,1fr)_auto]`}\n >\n <Stack space=\"tight\" className=\"min-w-0\">\n <div className=\"flex flex-wrap items-center gap-x-2 gap-y-1.5\">\n <Text as=\"span\" variant=\"label\">\n {label}\n </Text>\n {badges}\n </div>\n <Text variant=\"caption\" tone=\"muted\">\n {description}\n </Text>\n </Stack>\n <div className=\"min-w-0 sm:flex sm:justify-end [&>[role=status]]:w-full\">{children}</div>\n </div>\n );\n}\n\ntype FormFieldProps = Omit<FieldProps, 'children' | 'className'> & { action?: ReactNode } & (\n | { children: ReactNode; loading?: false; loadingLabel?: never }\n | { children?: never; loading: true; loadingLabel: string }\n );\n\nexport function FormField({ action, children, loading = false, loadingLabel, ...props }: FormFieldProps) {\n if (loading)\n return (\n <SkeletonLoader label={loadingLabel ?? ''}>\n <div className={`${rowClasses} sm:grid-cols-[9rem_minmax(0,1fr)]`}>\n <Text variant=\"label\" className=\"w-3/4\" loading />\n <SkeletonLoader.Shape presentation=\"control\" />\n </div>\n </SkeletonLoader>\n );\n\n const content = children;\n\n if (action) {\n return (\n <div className={`${rowClasses} grid-cols-[minmax(0,1fr)_auto] sm:grid-cols-[9rem_minmax(0,1fr)_auto]`}>\n <Field\n {...props}\n className=\"contents [&>div]:min-w-0 [&>div:first-child]:col-span-2 [&>div:first-child]:mb-0 sm:[&>div:first-child]:col-span-1 [&>p]:col-span-2 [&>p]:mt-0 sm:[&>p]:col-start-2\"\n >\n {content}\n </Field>\n <div className=\"col-start-2 row-start-2 flex items-center gap-2 sm:col-start-3 sm:row-start-1\">\n {action}\n </div>\n </div>\n );\n }\n\n return (\n <Field\n {...props}\n className={`${rowClasses} sm:grid-cols-[9rem_minmax(0,1fr)] [&>div]:min-w-0 [&>div:first-child]:mb-0 [&>p]:mt-0 sm:[&>p]:col-start-2`}\n >\n {content}\n </Field>\n );\n}\n\nexport function FormAction(props: Omit<ButtonProps, 'type' | 'size' | 'variant' | 'color'>) {\n return <Button {...props} type=\"button\" variant=\"subtle\" />;\n}\n\nexport function Disclosure({ children, label, lazy = false }: { children: ReactNode; label: string; lazy?: boolean }) {\n const [open, setOpen] = useState(false);\n\n return (\n <details className=\"group px-1\" onToggle={(event) => setOpen(event.currentTarget.open)}>\n <summary className=\"text-base-700 hover:text-base-content focus-visible:outline-primary flex w-fit cursor-pointer list-none items-center gap-1.5 rounded py-1 text-xs focus-visible:outline-2 focus-visible:outline-offset-2 [&::-webkit-details-marker]:hidden\">\n <span aria-hidden=\"true\" className=\"-rotate-90 transition-transform group-open:rotate-0 [&>svg]:size-3\">\n <ChevronDownIcon />\n </span>\n {label}\n </summary>\n <div className=\"text-base-700 mt-2 space-y-2 text-xs leading-relaxed\">\n {!lazy || open ? children : null}\n </div>\n </details>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"FormSection.js","names":[],"sources":["../../src/forms/FormSection.tsx"],"sourcesContent":["import { ChevronDownIcon } from 'lucide-react';\nimport { type ComponentProps, type ReactNode, type SyntheticEvent, useId, useState } from 'react';\n\nimport { Button, type ButtonProps } from '../actions/Button';\nimport { Badge } from '../display/Badge';\nimport { InsetPanel } from '../display/InsetPanel';\nimport { SkeletonLoader } from '../feedback/SkeletonLoader';\nimport { Stack } from '../layout/Flow';\nimport { HelpTip } from '../overlays/HelpTip';\nimport { Heading, Text } from '../typography/Typography';\nimport { Field, type FieldProps } from './Field';\n\ntype DataAttributes = { [key: `data-${string}`]: string | undefined };\n\nconst contentSpacing = 'px-4 py-3.5 sm:px-5';\nconst rowClasses = `grid min-w-0 gap-x-6 gap-y-3 sm:items-center ${contentSpacing}`;\n\nexport function FormContent({ children }: { children: ReactNode }) {\n return (\n <Stack space=\"group\" className={contentSpacing}>\n {children}\n </Stack>\n );\n}\n\nexport function FormStack({ children }: { children: ReactNode }) {\n return <Stack space=\"page\">{children}</Stack>;\n}\n\ninterface FormSectionProps {\n action?: ReactNode;\n badges?: ReactNode;\n children: ReactNode;\n description?: string;\n loading?: boolean;\n loadingLabel?: string;\n presentation?: 'default';\n title: ReactNode;\n}\n\n/** A dense tool's settings group: its title (with an optional help popover) and description over the content as\n * given, such as one or more settings panels and their notes. */\ninterface DenseFormSectionProps extends DataAttributes {\n presentation: 'dense';\n title?: ReactNode;\n /** Explains the group in a popover from a help button after the title; `helpLabel` names that button. */\n help?: ReactNode;\n helpLabel?: string;\n description?: ReactNode;\n /** Names the group when its title doesn't, or when it has none. */\n 'aria-label'?: string;\n children?: ReactNode;\n}\n\nexport function FormSection(props: FormSectionProps | DenseFormSectionProps) {\n if (props.presentation === 'dense') return <DenseFormSection {...props} />;\n\n return <PanelFormSection {...props} />;\n}\n\nfunction DenseFormSection({\n presentation: _presentation,\n title,\n help,\n helpLabel,\n description,\n 'aria-label': label,\n children,\n ...data\n}: DenseFormSectionProps) {\n const titleId = useId();\n\n return (\n <section\n {...data}\n aria-label={label}\n aria-labelledby={label || !title ? undefined : titleId}\n className=\"grid min-w-0 gap-3\"\n >\n {(title || description) && (\n <div>\n {title && (\n <h3 id={titleId} className=\"m-0 flex items-center gap-1.5 text-[13px] font-semibold\">\n {title}\n {help && (\n <HelpTip label={helpLabel ?? (typeof title === 'string' ? title : '')}>{help}</HelpTip>\n )}\n </h3>\n )}\n {description && <p className=\"text-base-700 m-0 mt-0.5 text-xs\">{description}</p>}\n </div>\n )}\n {children}\n </section>\n );\n}\n\nfunction PanelFormSection({\n action,\n badges,\n children,\n description,\n loading = false,\n loadingLabel,\n title,\n}: FormSectionProps) {\n const titleId = useId();\n const content = (\n <section aria-labelledby={titleId}>\n <div className=\"flex min-h-5 items-center justify-between gap-3\">\n <div className=\"flex min-w-0 flex-wrap items-center gap-2\">\n <Heading id={titleId} as=\"h3\" className=\"text-base-700\" variant=\"label\">\n {title}\n </Heading>\n {badges}\n </div>\n {action}\n </div>\n <div className=\"mt-3\">\n <InsetPanel presentation=\"settings\">\n {description ? (\n <FormContent>\n <Text variant=\"caption\" tone=\"muted\">\n {description}\n </Text>\n </FormContent>\n ) : null}\n {children}\n </InsetPanel>\n </div>\n </section>\n );\n\n return loading ? (\n <SkeletonLoader label={loadingLabel ?? (typeof title === 'string' ? title : '')}>{content}</SkeletonLoader>\n ) : (\n content\n );\n}\n\ninterface FormRowColumnsProps {\n badges?: ReactNode;\n children: ReactNode;\n description: string;\n /** The row's element id, for linking or scrolling to it; a row with one can take focus when it is opened. */\n id?: string;\n label: ReactNode;\n layout?: 'columns';\n}\n\n/** A dense tool's settings row: the label (with an optional help popover) and description, then its controls flowing\n * beside them and wrapping under them when they don't fit, then content below and an error. */\ninterface FormRowFlowProps extends DataAttributes {\n layout: 'flow';\n label: ReactNode;\n /** Explains the setting in a popover from a help button after the label; `helpLabel` names that button. */\n help?: ReactNode;\n helpLabel?: string;\n description?: ReactNode;\n children?: ReactNode;\n /** Full-width content under the label and controls, such as a list the setting governs. */\n below?: ReactNode;\n error?: string | undefined;\n /** The error's element id, for a control's aria-describedby. */\n errorId?: string;\n}\n\ntype FormRowProps = FormRowColumnsProps | FormRowFlowProps;\n\nexport function FormRow(props: FormRowProps) {\n if (props.layout === 'flow') return <FormRowFlow {...props} />;\n\n const { badges, children, description, id, label } = props;\n\n return (\n <div\n id={id}\n tabIndex={id ? -1 : undefined}\n className={`${rowClasses} sm:grid-cols-[minmax(0,1fr)_13rem] sm:has-[[role=switch]]:grid-cols-[minmax(0,1fr)_auto]`}\n >\n <Stack space=\"tight\" className=\"min-w-0\">\n <div className=\"flex flex-wrap items-center gap-x-2 gap-y-1.5\">\n <Text as=\"span\" variant=\"label\">\n {label}\n </Text>\n {badges}\n </div>\n <Text variant=\"caption\" tone=\"muted\">\n {description}\n </Text>\n </Stack>\n <div className=\"min-w-0 sm:flex sm:justify-end [&>[role=status]]:w-full\">{children}</div>\n </div>\n );\n}\n\nfunction FormRowFlow({\n layout: _layout,\n label,\n help,\n helpLabel,\n description,\n children,\n below,\n error,\n errorId,\n ...data\n}: FormRowFlowProps) {\n const fallbackErrorId = useId();\n\n return (\n <div {...data} className=\"settings-row grid min-w-0 gap-2 px-4 py-3\">\n <div className=\"flex min-w-0 flex-wrap items-center gap-x-6 gap-y-2\">\n <div className=\"min-w-32 flex-1\">\n <div className=\"settings-row-title flex min-w-0 items-center gap-1.5 text-[13px] font-medium wrap-anywhere\">\n {label}\n {help && (\n <HelpTip label={helpLabel ?? (typeof label === 'string' ? label : '')}>{help}</HelpTip>\n )}\n </div>\n {description && <div className=\"text-base-700 text-xs wrap-anywhere\">{description}</div>}\n </div>\n {children && (\n <div className=\"settings-row-control flex max-w-full min-w-0 flex-wrap items-center gap-2 sm:max-w-[60%] [&_button]:max-w-full [&>span]:max-w-full\">\n {children}\n </div>\n )}\n </div>\n {below}\n {error && (\n <p id={errorId ?? fallbackErrorId} role=\"alert\" className=\"m-0 text-xs text-(--lar-danger-text)\">\n {error}\n </p>\n )}\n </div>\n );\n}\n\n/** A value and its unit beside it in a row's controls, such as a number field and \"days\". */\nexport function FormUnit({ children, unit }: { children: ReactNode; unit: ReactNode }) {\n return (\n <span className=\"flex items-center gap-2 text-sm [&_input]:w-20\">\n {children}\n {unit}\n </span>\n );\n}\n\ntype FormFieldProps = Omit<FieldProps, 'children' | 'className'> & { action?: ReactNode } & (\n | { children: ReactNode; loading?: false; loadingLabel?: never }\n | { children?: never; loading: true; loadingLabel: string }\n );\n\nexport function FormField({ action, children, loading = false, loadingLabel, ...props }: FormFieldProps) {\n if (loading)\n return (\n <SkeletonLoader label={loadingLabel ?? ''}>\n <div className={`${rowClasses} sm:grid-cols-[9rem_minmax(0,1fr)]`}>\n <Text variant=\"label\" className=\"w-3/4\" loading />\n <SkeletonLoader.Shape presentation=\"control\" />\n </div>\n </SkeletonLoader>\n );\n\n const content = children;\n\n if (action) {\n return (\n <div className={`${rowClasses} grid-cols-[minmax(0,1fr)_auto] sm:grid-cols-[9rem_minmax(0,1fr)_auto]`}>\n <Field\n {...props}\n className=\"contents [&>div]:min-w-0 [&>div:first-child]:col-span-2 [&>div:first-child]:mb-0 sm:[&>div:first-child]:col-span-1 [&>p]:col-span-2 [&>p]:mt-0 sm:[&>p]:col-start-2\"\n >\n {content}\n </Field>\n <div className=\"col-start-2 row-start-2 flex items-center gap-2 sm:col-start-3 sm:row-start-1\">\n {action}\n </div>\n </div>\n );\n }\n\n return (\n <Field\n {...props}\n className={`${rowClasses} sm:grid-cols-[9rem_minmax(0,1fr)] [&>div]:min-w-0 [&>div:first-child]:mb-0 [&>p]:mt-0 sm:[&>p]:col-start-2`}\n >\n {content}\n </Field>\n );\n}\n\nexport function FormAction(props: Omit<ButtonProps, 'type' | 'size' | 'variant' | 'color'>) {\n return <Button {...props} type=\"button\" variant=\"subtle\" />;\n}\n\nexport function Disclosure({\n children,\n label,\n lazy = false,\n presentation = 'note',\n defaultOpen = false,\n badge,\n onOpenChange,\n ...data\n}: {\n children: ReactNode;\n label: string;\n lazy?: boolean;\n /** `note` folds small muted text behind a chevron; `section` folds a section's own content, such as an earlier\n * version of a text, behind a muted label in the body size; `group` folds a form's optional group behind its\n * heading, such as optional settings; `framed` folds a short list in a frame, such as entries that can't be\n * picked. */\n presentation?: 'note' | 'section' | 'group' | 'framed';\n /** Starts open, such as a group whose kept answers may need a look. */\n defaultOpen?: boolean;\n /** A `group`'s badge after its heading, such as \"Optional\". */\n badge?: string | undefined;\n /** Hears each time it opens or closes, such as to read what it shows once it opens. */\n onOpenChange?: (open: boolean) => void;\n} & DataAttributes) {\n const [open, setOpen] = useState(defaultOpen);\n const shown = !lazy || open ? children : null;\n const toggle = (event: SyntheticEvent<HTMLDetailsElement>) => {\n setOpen(event.currentTarget.open);\n onOpenChange?.(event.currentTarget.open);\n };\n\n if (presentation === 'group')\n return (\n <details {...data} open={open} onToggle={toggle} className=\"min-w-0\">\n <summary className=\"cursor-pointer text-[13px] font-semibold\">\n {label}\n {badge && (\n <>\n {' '}\n <Badge className=\"ms-1\">{badge}</Badge>\n </>\n )}\n </summary>\n {shown && <div className=\"mt-3 grid min-w-0 gap-3\">{shown}</div>}\n </details>\n );\n\n if (presentation === 'framed')\n return (\n <details {...data} open={open} onToggle={toggle} className=\"min-w-0 rounded-lg border px-3 py-2\">\n <summary className=\"cursor-pointer text-sm font-medium\">{label}</summary>\n <div className=\"mt-2\">{shown}</div>\n </details>\n );\n\n if (presentation === 'section')\n return (\n <details {...data} className=\"grid min-w-0 gap-2\" onToggle={toggle}>\n <summary className=\"text-base-700 cursor-pointer text-sm\">{label}</summary>\n <div className=\"pt-2\">{shown}</div>\n </details>\n );\n\n return (\n <details {...data} className=\"group px-1\" onToggle={toggle}>\n <summary className=\"text-base-700 hover:text-base-content focus-visible:outline-primary flex w-fit cursor-pointer list-none items-center gap-1.5 rounded py-1 text-xs focus-visible:outline-2 focus-visible:outline-offset-2 [&::-webkit-details-marker]:hidden\">\n <span aria-hidden=\"true\" className=\"-rotate-90 transition-transform group-open:rotate-0 [&>svg]:size-3\">\n <ChevronDownIcon />\n </span>\n {label}\n </summary>\n <div className=\"text-base-700 mt-2 space-y-2 text-xs leading-relaxed\">{shown}</div>\n </details>\n );\n}\n\ntype FormFieldsetProps = Omit<ComponentProps<'fieldset'>, 'style'> & {\n /** The legend over the group. */\n legend?: ReactNode;\n /** Names the group for assistive technology only, where what's around it already says what it is. */\n hiddenLegend?: boolean;\n /** `group` only groups and disables its fields, with no frame. */\n presentation?: 'bordered' | 'group';\n};\n\n/** The form section's fieldset: a bordered group of controls under a legend, on the native fieldset, which also\n * disables every control inside it. As a `group`, it only groups and disables its fields. */\nexport function FormFieldset({\n legend,\n hiddenLegend = false,\n presentation = 'bordered',\n className = '',\n children,\n ...props\n}: FormFieldsetProps) {\n return (\n <fieldset\n className={`m-0 min-w-0 ${presentation === 'group' ? 'border-0 p-0' : 'border-base-300 mb-3 rounded-lg border px-3 pt-2 pb-0 [&>legend]:mb-2 [&>legend]:font-semibold'} ${className}`}\n data-slot=\"fieldset\"\n {...props}\n >\n {legend ? (\n <legend\n className={hiddenLegend ? 'sr-only' : 'text-base-content p-0 text-sm leading-5 font-medium'}\n data-slot=\"fieldset-legend\"\n >\n {legend}\n </legend>\n ) : null}\n {children}\n </fieldset>\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/** A value a form submits that nobody edits in place, such as a pick made in a popover: a hidden field. */
|
|
2
|
+
export declare function HiddenField({ name, value }: {
|
|
3
|
+
name: string;
|
|
4
|
+
value: string;
|
|
5
|
+
}): import("react").JSX.Element;
|
|
6
|
+
//# sourceMappingURL=HiddenField.d.ts.map
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
// src/forms/HiddenField.tsx
|
|
3
|
+
/** A value a form submits that nobody edits in place, such as a pick made in a popover: a hidden field. */
|
|
4
|
+
function HiddenField({ name, value }) {
|
|
5
|
+
return /* @__PURE__ */ jsx("input", {
|
|
6
|
+
type: "hidden",
|
|
7
|
+
name,
|
|
8
|
+
value
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
export { HiddenField };
|
|
12
|
+
|
|
13
|
+
//# sourceMappingURL=HiddenField.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HiddenField.js","names":[],"sources":["../../src/forms/HiddenField.tsx"],"sourcesContent":["/** A value a form submits that nobody edits in place, such as a pick made in a popover: a hidden field. */\nexport function HiddenField({ name, value }: { name: string; value: string }) {\n return <input type=\"hidden\" name={name} value={value} />;\n}\n"],"mappings":";;;AACA,SAAgB,YAAY,EAAE,MAAM,SAA0C;CAC1E,OAAO,oBAAC,SAAD;EAAO,MAAK;EAAe;EAAa;CAAQ,CAAA;AAC3D"}
|
package/dist/forms/Input.d.ts
CHANGED
|
@@ -1,5 +1,15 @@
|
|
|
1
1
|
import { InputProps } from "@ninna-ui/forms";
|
|
2
|
-
type InputProps$1 = Omit<InputProps, 'fullWidth'
|
|
3
|
-
|
|
2
|
+
type InputProps$1 = Omit<InputProps, 'fullWidth'> & {
|
|
3
|
+
/** A `field` fills its container; `setting` is a settings row's 16rem text field, narrower where the row is; `short`
|
|
4
|
+
* holds a few characters, such as a hex colour; `count` a small whole number; `title` is a document's title typed
|
|
5
|
+
* in place, borderless in large semibold type, such as a new item's. */
|
|
6
|
+
presentation?: 'field' | 'setting' | 'short' | 'count' | 'title';
|
|
7
|
+
};
|
|
8
|
+
declare const Input$1: import("react").ForwardRefExoticComponent<Omit<InputProps, "fullWidth"> & {
|
|
9
|
+
/** A `field` fills its container; `setting` is a settings row's 16rem text field, narrower where the row is; `short`
|
|
10
|
+
* holds a few characters, such as a hex colour; `count` a small whole number; `title` is a document's title typed
|
|
11
|
+
* in place, borderless in large semibold type, such as a new item's. */
|
|
12
|
+
presentation?: 'field' | 'setting' | 'short' | 'count' | 'title';
|
|
13
|
+
} & import("react").RefAttributes<HTMLInputElement>>;
|
|
4
14
|
export { Input$1 as Input, InputProps$1 as InputProps };
|
|
5
15
|
//# sourceMappingURL=Input.d.ts.map
|
package/dist/forms/Input.js
CHANGED
|
@@ -3,14 +3,21 @@ import { forwardRef } from "react";
|
|
|
3
3
|
import { jsx } from "react/jsx-runtime";
|
|
4
4
|
import { Input } from "@ninna-ui/forms";
|
|
5
5
|
// src/forms/Input.tsx
|
|
6
|
-
const
|
|
6
|
+
const presentations = {
|
|
7
|
+
field: "",
|
|
8
|
+
setting: "w-64 max-w-full",
|
|
9
|
+
short: "w-24",
|
|
10
|
+
count: "w-20",
|
|
11
|
+
title: "text-base-content w-full shrink-0 border-0 bg-transparent p-0 text-xl font-semibold tracking-tight outline-none placeholder:font-medium placeholder:text-(--muted-foreground)"
|
|
12
|
+
};
|
|
13
|
+
const Input$1 = forwardRef(({ size = formControlDefaults.size, variant = formControlDefaults.variant, presentation = "field", className, ...props }, ref) => /* @__PURE__ */ jsx(Input, {
|
|
7
14
|
ref,
|
|
8
15
|
color: formControlDefaults.color,
|
|
9
16
|
...props,
|
|
10
17
|
fullWidth: true,
|
|
11
18
|
size,
|
|
12
|
-
variant,
|
|
13
|
-
className: `${variant === "filled" ? formControlClasses : ""} ${className ?? ""}`
|
|
19
|
+
variant: presentation === "title" ? "unstyled" : variant,
|
|
20
|
+
className: `${variant === "filled" && presentation !== "title" ? formControlClasses : ""} ${presentations[presentation]} ${className ?? ""}`
|
|
14
21
|
}));
|
|
15
22
|
Input$1.displayName = "Input";
|
|
16
23
|
export { Input$1 as Input };
|
package/dist/forms/Input.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Input.js","names":["Input","NinnaInput"],"sources":["../../src/forms/Input.tsx"],"sourcesContent":["import { Input as NinnaInput, type InputProps as NinnaInputProps } from '@ninna-ui/forms';\nimport { forwardRef } from 'react';\n\nimport { formControlClasses, formControlDefaults } from './FormControlStyles';\n\nexport type InputProps = Omit<NinnaInputProps, 'fullWidth'
|
|
1
|
+
{"version":3,"file":"Input.js","names":["Input","NinnaInput"],"sources":["../../src/forms/Input.tsx"],"sourcesContent":["import { Input as NinnaInput, type InputProps as NinnaInputProps } from '@ninna-ui/forms';\nimport { forwardRef } from 'react';\n\nimport { formControlClasses, formControlDefaults } from './FormControlStyles';\n\nexport type InputProps = Omit<NinnaInputProps, 'fullWidth'> & {\n /** A `field` fills its container; `setting` is a settings row's 16rem text field, narrower where the row is; `short`\n * holds a few characters, such as a hex colour; `count` a small whole number; `title` is a document's title typed\n * in place, borderless in large semibold type, such as a new item's. */\n presentation?: 'field' | 'setting' | 'short' | 'count' | 'title';\n};\n\nconst presentations = {\n field: '',\n setting: 'w-64 max-w-full',\n short: 'w-24',\n count: 'w-20',\n title: 'text-base-content w-full shrink-0 border-0 bg-transparent p-0 text-xl font-semibold tracking-tight outline-none placeholder:font-medium placeholder:text-(--muted-foreground)',\n} as const;\n\nexport const Input = forwardRef<HTMLInputElement, InputProps>(\n (\n {\n size = formControlDefaults.size,\n variant = formControlDefaults.variant,\n presentation = 'field',\n className,\n ...props\n },\n ref,\n ) => (\n <NinnaInput\n ref={ref}\n color={formControlDefaults.color}\n {...props}\n fullWidth\n size={size}\n variant={presentation === 'title' ? 'unstyled' : variant}\n className={`${variant === 'filled' && presentation !== 'title' ? formControlClasses : ''} ${presentations[presentation]} ${className ?? ''}`}\n />\n ),\n);\n\nInput.displayName = 'Input';\n"],"mappings":";;;;;AAYA,MAAM,gBAAgB;CAClB,OAAO;CACP,SAAS;CACT,OAAO;CACP,OAAO;CACP,OAAO;AACX;AAEA,MAAaA,UAAQ,YAEb,EACI,OAAO,oBAAoB,MAC3B,UAAU,oBAAoB,SAC9B,eAAe,SACf,WACA,GAAG,SAEP,QAEA,oBAACC,OAAD;CACS;CACL,OAAO,oBAAoB;CAC3B,GAAI;CACJ,WAAA;CACM;CACN,SAAS,iBAAiB,UAAU,aAAa;CACjD,WAAW,GAAG,YAAY,YAAY,iBAAiB,UAAU,qBAAqB,GAAG,GAAG,cAAc,cAAc,GAAG,aAAa;AAC3I,CAAA,CAET;AAEA,QAAM,cAAc"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
export interface LabelChoice {
|
|
2
|
+
name: string;
|
|
3
|
+
/** A CSS colour; a tracker with no label colours gives none. */
|
|
4
|
+
color?: string | undefined;
|
|
5
|
+
description?: string | undefined;
|
|
6
|
+
}
|
|
7
|
+
/** Lets a typed name no choice has become a new label. */
|
|
8
|
+
export interface LabelCreation {
|
|
9
|
+
/** Why this person can't add new labels at all, or null when they can. */
|
|
10
|
+
refused: string | null;
|
|
11
|
+
/** Why this name can't be a label, or null when it can. */
|
|
12
|
+
problem: (name: string) => string | null;
|
|
13
|
+
/** What adding one does, under the list. */
|
|
14
|
+
note: string;
|
|
15
|
+
/** The button that adds `name`, such as `Create "name"`. */
|
|
16
|
+
createLabel: (name: string) => string;
|
|
17
|
+
onCreate: (name: string) => void;
|
|
18
|
+
}
|
|
19
|
+
interface LabelPickerProps {
|
|
20
|
+
choices: readonly LabelChoice[];
|
|
21
|
+
picked: readonly string[];
|
|
22
|
+
onToggle: (name: string) => void;
|
|
23
|
+
/** The filter field's accessible name and its placeholder. */
|
|
24
|
+
filterLabel: string;
|
|
25
|
+
placeholder: string;
|
|
26
|
+
/** Shown when the filter matches nothing. */
|
|
27
|
+
noMatchLabel: string;
|
|
28
|
+
/** Choices shown ticked or not but not changeable here, each marked with `lockedNote`. */
|
|
29
|
+
locked?: readonly string[];
|
|
30
|
+
lockedNote?: string;
|
|
31
|
+
busy?: boolean;
|
|
32
|
+
create?: LabelCreation;
|
|
33
|
+
/** Whether two names are the same label; trackers compare them ignoring case. */
|
|
34
|
+
same?: (a: string, b: string) => boolean;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* A searchable checklist of labels, with each label's colour and description. It holds only its search text: the
|
|
38
|
+
* caller gives the choices, what is picked and what a toggle does, so it reads and writes whichever way its surface
|
|
39
|
+
* needs. With `create`, Enter or the create button lets a typed name no choice has in.
|
|
40
|
+
*/
|
|
41
|
+
export declare function LabelPicker({ choices, picked, onToggle, filterLabel, placeholder, noMatchLabel, locked, lockedNote, busy, create, same }: LabelPickerProps): import("react").JSX.Element;
|
|
42
|
+
export {};
|
|
43
|
+
//# sourceMappingURL=LabelPicker.d.ts.map
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { Button } from "../actions/Button.js";
|
|
2
|
+
import { StatusIndicator } from "../feedback/StatusIndicator.js";
|
|
3
|
+
import { Checkbox } from "./Checkbox.js";
|
|
4
|
+
import { Input } from "./Input.js";
|
|
5
|
+
import { useState } from "react";
|
|
6
|
+
import { PlusIcon } from "lucide-react";
|
|
7
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
8
|
+
// src/forms/LabelPicker.tsx
|
|
9
|
+
const ignoringCase = (a, b) => a.toLowerCase() === b.toLowerCase();
|
|
10
|
+
/**
|
|
11
|
+
* A searchable checklist of labels, with each label's colour and description. It holds only its search text: the
|
|
12
|
+
* caller gives the choices, what is picked and what a toggle does, so it reads and writes whichever way its surface
|
|
13
|
+
* needs. With `create`, Enter or the create button lets a typed name no choice has in.
|
|
14
|
+
*/
|
|
15
|
+
function LabelPicker({ choices, picked, onToggle, filterLabel, placeholder, noMatchLabel, locked = [], lockedNote, busy = false, create, same = ignoringCase }) {
|
|
16
|
+
const [query, setQuery] = useState("");
|
|
17
|
+
const typed = query.trim();
|
|
18
|
+
const hits = choices.filter(({ name }) => name.toLowerCase().includes(typed.toLowerCase()));
|
|
19
|
+
const fresh = !!create && !!typed && !choices.some(({ name }) => same(name, typed));
|
|
20
|
+
const refusal = fresh ? create.refused ?? create.problem(typed) : null;
|
|
21
|
+
const add = () => {
|
|
22
|
+
create?.onCreate(typed);
|
|
23
|
+
setQuery("");
|
|
24
|
+
};
|
|
25
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
26
|
+
className: "grid w-72 gap-2",
|
|
27
|
+
"data-label-picker": true,
|
|
28
|
+
"aria-busy": busy,
|
|
29
|
+
children: [
|
|
30
|
+
/* @__PURE__ */ jsx(Input, {
|
|
31
|
+
autoFocus: true,
|
|
32
|
+
placeholder,
|
|
33
|
+
"aria-label": filterLabel,
|
|
34
|
+
value: query,
|
|
35
|
+
onChange: (e) => setQuery(e.target.value),
|
|
36
|
+
onKeyDown: (e) => {
|
|
37
|
+
if (e.key !== "Enter") return;
|
|
38
|
+
e.preventDefault();
|
|
39
|
+
if (fresh && !refusal) add();
|
|
40
|
+
}
|
|
41
|
+
}),
|
|
42
|
+
/* @__PURE__ */ jsxs("div", {
|
|
43
|
+
className: "grid max-h-56 gap-0.5 overflow-y-auto",
|
|
44
|
+
children: [hits.map(({ name, color, description }) => {
|
|
45
|
+
const fixed = locked.some((label) => same(label, name));
|
|
46
|
+
return /* @__PURE__ */ jsxs("label", {
|
|
47
|
+
"data-label-choice": true,
|
|
48
|
+
className: "hover:bg-base-200 flex cursor-pointer items-start gap-2 rounded-md px-1.5 py-1 text-xs",
|
|
49
|
+
children: [
|
|
50
|
+
/* @__PURE__ */ jsx(Checkbox, {
|
|
51
|
+
checked: picked.some((label) => same(label, name)),
|
|
52
|
+
disabled: fixed,
|
|
53
|
+
onChange: () => onToggle(name)
|
|
54
|
+
}),
|
|
55
|
+
color && /* @__PURE__ */ jsx("span", {
|
|
56
|
+
"data-label-dot": true,
|
|
57
|
+
className: "mt-1 flex",
|
|
58
|
+
children: /* @__PURE__ */ jsx(StatusIndicator, {
|
|
59
|
+
tone: "neutral",
|
|
60
|
+
labelColor: color
|
|
61
|
+
})
|
|
62
|
+
}),
|
|
63
|
+
/* @__PURE__ */ jsxs("span", {
|
|
64
|
+
className: "min-w-0 flex-1",
|
|
65
|
+
children: [/* @__PURE__ */ jsxs("span", {
|
|
66
|
+
className: "block wrap-anywhere",
|
|
67
|
+
children: [name, fixed && lockedNote && /* @__PURE__ */ jsxs("span", {
|
|
68
|
+
className: "text-base-700",
|
|
69
|
+
children: [" · ", lockedNote]
|
|
70
|
+
})]
|
|
71
|
+
}), description && /* @__PURE__ */ jsx("span", {
|
|
72
|
+
className: "text-base-700 block text-[11px]",
|
|
73
|
+
children: description
|
|
74
|
+
})]
|
|
75
|
+
})
|
|
76
|
+
]
|
|
77
|
+
}, name);
|
|
78
|
+
}), !hits.length && !fresh && /* @__PURE__ */ jsx("p", {
|
|
79
|
+
className: "text-base-700 m-0 p-1.5 text-[11px]",
|
|
80
|
+
children: noMatchLabel
|
|
81
|
+
})]
|
|
82
|
+
}),
|
|
83
|
+
fresh && !refusal && /* @__PURE__ */ jsx("span", {
|
|
84
|
+
className: "justify-self-start",
|
|
85
|
+
children: /* @__PURE__ */ jsx(Button, {
|
|
86
|
+
variant: "secondary",
|
|
87
|
+
compact: true,
|
|
88
|
+
leftIcon: /* @__PURE__ */ jsx(PlusIcon, {}),
|
|
89
|
+
onClick: add,
|
|
90
|
+
children: create.createLabel(typed)
|
|
91
|
+
})
|
|
92
|
+
}),
|
|
93
|
+
refusal && /* @__PURE__ */ jsx("p", {
|
|
94
|
+
role: "alert",
|
|
95
|
+
className: "text-base-700 m-0 text-[11px]",
|
|
96
|
+
children: refusal
|
|
97
|
+
}),
|
|
98
|
+
create && !create.refused && /* @__PURE__ */ jsx("p", {
|
|
99
|
+
className: "text-base-700 m-0 text-[11px]",
|
|
100
|
+
children: create.note
|
|
101
|
+
})
|
|
102
|
+
]
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
export { LabelPicker };
|
|
106
|
+
|
|
107
|
+
//# sourceMappingURL=LabelPicker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LabelPicker.js","names":[],"sources":["../../src/forms/LabelPicker.tsx"],"sourcesContent":["import { PlusIcon } from 'lucide-react';\nimport { useState } from 'react';\n\nimport { Button } from '../actions/Button';\nimport { StatusIndicator } from '../feedback/StatusIndicator';\nimport { Checkbox } from './Checkbox';\nimport { Input } from './Input';\n\nexport interface LabelChoice {\n name: string;\n /** A CSS colour; a tracker with no label colours gives none. */\n color?: string | undefined;\n description?: string | undefined;\n}\n\n/** Lets a typed name no choice has become a new label. */\nexport interface LabelCreation {\n /** Why this person can't add new labels at all, or null when they can. */\n refused: string | null;\n /** Why this name can't be a label, or null when it can. */\n problem: (name: string) => string | null;\n /** What adding one does, under the list. */\n note: string;\n /** The button that adds `name`, such as `Create \"name\"`. */\n createLabel: (name: string) => string;\n onCreate: (name: string) => void;\n}\n\ninterface LabelPickerProps {\n choices: readonly LabelChoice[];\n picked: readonly string[];\n onToggle: (name: string) => void;\n /** The filter field's accessible name and its placeholder. */\n filterLabel: string;\n placeholder: string;\n /** Shown when the filter matches nothing. */\n noMatchLabel: string;\n /** Choices shown ticked or not but not changeable here, each marked with `lockedNote`. */\n locked?: readonly string[];\n lockedNote?: string;\n busy?: boolean;\n create?: LabelCreation;\n /** Whether two names are the same label; trackers compare them ignoring case. */\n same?: (a: string, b: string) => boolean;\n}\n\nconst ignoringCase = (a: string, b: string) => a.toLowerCase() === b.toLowerCase();\n\n/**\n * A searchable checklist of labels, with each label's colour and description. It holds only its search text: the\n * caller gives the choices, what is picked and what a toggle does, so it reads and writes whichever way its surface\n * needs. With `create`, Enter or the create button lets a typed name no choice has in.\n */\nexport function LabelPicker({\n choices,\n picked,\n onToggle,\n filterLabel,\n placeholder,\n noMatchLabel,\n locked = [],\n lockedNote,\n busy = false,\n create,\n same = ignoringCase,\n}: LabelPickerProps) {\n const [query, setQuery] = useState('');\n const typed = query.trim();\n const hits = choices.filter(({ name }) => name.toLowerCase().includes(typed.toLowerCase()));\n const fresh = !!create && !!typed && !choices.some(({ name }) => same(name, typed));\n const refusal = fresh ? (create.refused ?? create.problem(typed)) : null;\n const add = () => {\n create?.onCreate(typed);\n setQuery('');\n };\n\n return (\n <div className=\"grid w-72 gap-2\" data-label-picker aria-busy={busy}>\n <Input\n autoFocus\n placeholder={placeholder}\n aria-label={filterLabel}\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n onKeyDown={(e) => {\n if (e.key !== 'Enter') return;\n\n e.preventDefault();\n\n if (fresh && !refusal) add();\n }}\n />\n <div className=\"grid max-h-56 gap-0.5 overflow-y-auto\">\n {hits.map(({ name, color, description }) => {\n const fixed = locked.some((label) => same(label, name));\n\n return (\n <label\n key={name}\n data-label-choice\n className=\"hover:bg-base-200 flex cursor-pointer items-start gap-2 rounded-md px-1.5 py-1 text-xs\"\n >\n <Checkbox\n checked={picked.some((label) => same(label, name))}\n disabled={fixed}\n onChange={() => onToggle(name)}\n />\n {color && (\n <span data-label-dot className=\"mt-1 flex\">\n <StatusIndicator tone=\"neutral\" labelColor={color} />\n </span>\n )}\n <span className=\"min-w-0 flex-1\">\n <span className=\"block wrap-anywhere\">\n {name}\n {fixed && lockedNote && <span className=\"text-base-700\"> · {lockedNote}</span>}\n </span>\n {description && <span className=\"text-base-700 block text-[11px]\">{description}</span>}\n </span>\n </label>\n );\n })}\n {!hits.length && !fresh && <p className=\"text-base-700 m-0 p-1.5 text-[11px]\">{noMatchLabel}</p>}\n </div>\n {fresh && !refusal && (\n <span className=\"justify-self-start\">\n <Button variant=\"secondary\" compact leftIcon={<PlusIcon />} onClick={add}>\n {create.createLabel(typed)}\n </Button>\n </span>\n )}\n {refusal && (\n <p role=\"alert\" className=\"text-base-700 m-0 text-[11px]\">\n {refusal}\n </p>\n )}\n {create && !create.refused && <p className=\"text-base-700 m-0 text-[11px]\">{create.note}</p>}\n </div>\n );\n}\n"],"mappings":";;;;;;;;AA8CA,MAAM,gBAAgB,GAAW,MAAc,EAAE,YAAY,MAAM,EAAE,YAAY;;;;;;AAOjF,SAAgB,YAAY,EACxB,SACA,QACA,UACA,aACA,aACA,cACA,SAAS,CAAC,GACV,YACA,OAAO,OACP,QACA,OAAO,gBACU;CACjB,MAAM,CAAC,OAAO,YAAY,SAAS,EAAE;CACrC,MAAM,QAAQ,MAAM,KAAK;CACzB,MAAM,OAAO,QAAQ,QAAQ,EAAE,WAAW,KAAK,YAAY,CAAC,CAAC,SAAS,MAAM,YAAY,CAAC,CAAC;CAC1F,MAAM,QAAQ,CAAC,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,QAAQ,MAAM,EAAE,WAAW,KAAK,MAAM,KAAK,CAAC;CAClF,MAAM,UAAU,QAAS,OAAO,WAAW,OAAO,QAAQ,KAAK,IAAK;CACpE,MAAM,YAAY;EACd,QAAQ,SAAS,KAAK;EACtB,SAAS,EAAE;CACf;CAEA,OACI,qBAAC,OAAD;EAAK,WAAU;EAAkB,qBAAA;EAAkB,aAAW;EAA9D,UAAA;GACI,oBAAC,OAAD;IACI,WAAA;IACa;IACb,cAAY;IACZ,OAAO;IACP,WAAW,MAAM,SAAS,EAAE,OAAO,KAAK;IACxC,YAAY,MAAM;KACd,IAAI,EAAE,QAAQ,SAAS;KAEvB,EAAE,eAAe;KAEjB,IAAI,SAAS,CAAC,SAAS,IAAI;IAC/B;GACH,CAAA;GACD,qBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACK,KAAK,KAAK,EAAE,MAAM,OAAO,kBAAkB;KACxC,MAAM,QAAQ,OAAO,MAAM,UAAU,KAAK,OAAO,IAAI,CAAC;KAEtD,OACI,qBAAC,SAAD;MAEI,qBAAA;MACA,WAAU;MAHd,UAAA;OAKI,oBAAC,UAAD;QACI,SAAS,OAAO,MAAM,UAAU,KAAK,OAAO,IAAI,CAAC;QACjD,UAAU;QACV,gBAAgB,SAAS,IAAI;OAChC,CAAA;OACA,SACG,oBAAC,QAAD;QAAM,kBAAA;QAAe,WAAU;QAC3B,UAAA,oBAAC,iBAAD;SAAiB,MAAK;SAAU,YAAY;QAAQ,CAAA;OAClD,CAAA;OAEV,qBAAC,QAAD;QAAM,WAAU;QAAhB,UAAA,CACI,qBAAC,QAAD;SAAM,WAAU;SAAhB,UAAA,CACK,MACA,SAAS,cAAc,qBAAC,QAAD;UAAM,WAAU;UAAhB,UAAA,CAAgC,OAAI,UAAiB;SAC3E,CAAA,CAAA;QACL,CAAA,GAAA,eAAe,oBAAC,QAAD;SAAM,WAAU;SAAmC,UAAA;QAAkB,CAAA,CACnF;;MACH;KArBE,GAAA,IAqBF;IAEf,CAAC,GACA,CAAC,KAAK,UAAU,CAAC,SAAS,oBAAC,KAAD;KAAG,WAAU;KAAuC,UAAA;IAAgB,CAAA,CAC9F;;GACJ,SAAS,CAAC,WACP,oBAAC,QAAD;IAAM,WAAU;IACZ,UAAA,oBAAC,QAAD;KAAQ,SAAQ;KAAY,SAAA;KAAQ,UAAU,oBAAC,UAAD,CAAW,CAAA;KAAG,SAAS;KAChE,UAAA,OAAO,YAAY,KAAK;IACrB,CAAA;GACN,CAAA;GAET,WACG,oBAAC,KAAD;IAAG,MAAK;IAAQ,WAAU;IACrB,UAAA;GACF,CAAA;GAEN,UAAU,CAAC,OAAO,WAAW,oBAAC,KAAD;IAAG,WAAU;IAAiC,UAAA,OAAO;GAAQ,CAAA;EAC1F;;AAEb"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { RichTextFormat } from "../display/RichText.js";
|
|
2
|
+
interface MarkdownEditorProps {
|
|
3
|
+
/** The Markdown it starts from; later changes to it are ignored. */
|
|
4
|
+
value: string;
|
|
5
|
+
/** How `value` is written; the editor reports Markdown either way. */
|
|
6
|
+
format?: RichTextFormat;
|
|
7
|
+
onChange: (markdown: string) => void;
|
|
8
|
+
label: string;
|
|
9
|
+
placeholder: string;
|
|
10
|
+
/** Grows the editor into its parent's height, or, when 'wide', only while its container is 40rem wide or more and
|
|
11
|
+
* otherwise with its text, uncapped, as its parent scrolls. Without it, it grows with its text up to a cap. */
|
|
12
|
+
fill?: boolean | 'wide';
|
|
13
|
+
disabled?: boolean;
|
|
14
|
+
autoFocus?: boolean;
|
|
15
|
+
/** Called with the Markdown the editor makes of `value`, before any edit. */
|
|
16
|
+
onBaseline?: (markdown: string) => void;
|
|
17
|
+
}
|
|
18
|
+
/** A rich text field that reads and reports Markdown, such as a ticket's description, with a formatting toolbar. */
|
|
19
|
+
export declare function MarkdownEditor({ value, format, onChange, label, placeholder, fill, disabled, autoFocus, onBaseline }: MarkdownEditorProps): import("react").JSX.Element;
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=MarkdownEditor.d.ts.map
|