@bitrise/bitkit-v2 0.3.475-beta.3009 → 0.3.475-beta.3014
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/dist/components/BitkitCalendar/BitkitCalendar.d.ts +12 -0
- package/dist/components/BitkitCalendar/BitkitCalendar.js +7 -1
- package/dist/components/BitkitCalendar/BitkitCalendar.js.map +1 -1
- package/dist/components/BitkitCalendar/components/CalendarContent.d.ts +5 -1
- package/dist/components/BitkitCalendar/components/CalendarContent.js +60 -43
- package/dist/components/BitkitCalendar/components/CalendarContent.js.map +1 -1
- package/dist/components/BitkitCalendar/components/CalendarMonth.d.ts +4 -2
- package/dist/components/BitkitCalendar/components/CalendarMonth.js +15 -5
- package/dist/components/BitkitCalendar/components/CalendarMonth.js.map +1 -1
- package/dist/components/BitkitCalendar/components/CalendarMonthSelect.d.ts +2 -1
- package/dist/components/BitkitCalendar/components/CalendarMonthSelect.js +3 -2
- package/dist/components/BitkitCalendar/components/CalendarMonthSelect.js.map +1 -1
- package/dist/components/BitkitCalendar/components/CalendarNextTrigger.d.ts +3 -1
- package/dist/components/BitkitCalendar/components/CalendarNextTrigger.js +3 -3
- package/dist/components/BitkitCalendar/components/CalendarNextTrigger.js.map +1 -1
- package/dist/components/BitkitCalendar/components/CalendarPrevTrigger.d.ts +3 -1
- package/dist/components/BitkitCalendar/components/CalendarPrevTrigger.js +3 -3
- package/dist/components/BitkitCalendar/components/CalendarPrevTrigger.js.map +1 -1
- package/dist/components/BitkitCalendar/components/CalendarSelect.d.ts +1 -0
- package/dist/components/BitkitCalendar/components/CalendarSelect.js +4 -2
- package/dist/components/BitkitCalendar/components/CalendarSelect.js.map +1 -1
- package/dist/components/BitkitCalendar/components/CalendarYearSelect.d.ts +2 -1
- package/dist/components/BitkitCalendar/components/CalendarYearSelect.js +3 -2
- package/dist/components/BitkitCalendar/components/CalendarYearSelect.js.map +1 -1
- package/dist/components/BitkitDatePicker/BitkitDatePicker.d.ts +2 -0
- package/dist/components/BitkitDatePicker/BitkitDatePicker.js +2 -1
- package/dist/components/BitkitDatePicker/BitkitDatePicker.js.map +1 -1
- package/dist/components/BitkitFilter/BitkitFilter.context.d.ts +65 -0
- package/dist/components/BitkitFilter/BitkitFilter.context.js +82 -0
- package/dist/components/BitkitFilter/BitkitFilter.context.js.map +1 -0
- package/dist/components/BitkitFilter/BitkitFilter.d.ts +55 -0
- package/dist/components/BitkitFilter/BitkitFilter.js +240 -0
- package/dist/components/BitkitFilter/BitkitFilter.js.map +1 -0
- package/dist/components/BitkitFilter/BitkitFilter.utils.d.ts +18 -0
- package/dist/components/BitkitFilter/BitkitFilter.utils.js +42 -0
- package/dist/components/BitkitFilter/BitkitFilter.utils.js.map +1 -0
- package/dist/components/BitkitFilter/BitkitFilterAdd.d.ts +18 -0
- package/dist/components/BitkitFilter/BitkitFilterAdd.js +188 -0
- package/dist/components/BitkitFilter/BitkitFilterAdd.js.map +1 -0
- package/dist/components/BitkitFilter/BitkitFilterDateRange.d.ts +26 -0
- package/dist/components/BitkitFilter/BitkitFilterDateRange.js +118 -0
- package/dist/components/BitkitFilter/BitkitFilterDateRange.js.map +1 -0
- package/dist/components/BitkitFilter/BitkitFilterSearch.d.ts +23 -0
- package/dist/components/BitkitFilter/BitkitFilterSearch.js +70 -0
- package/dist/components/BitkitFilter/BitkitFilterSearch.js.map +1 -0
- package/dist/components/BitkitFilter/BitkitFilterSelect.d.ts +61 -0
- package/dist/components/BitkitFilter/BitkitFilterSelect.js +140 -0
- package/dist/components/BitkitFilter/BitkitFilterSelect.js.map +1 -0
- package/dist/components/BitkitFilter/BitkitFilterSwitch.d.ts +28 -0
- package/dist/components/BitkitFilter/BitkitFilterSwitch.js +87 -0
- package/dist/components/BitkitFilter/BitkitFilterSwitch.js.map +1 -0
- package/dist/components/BitkitFilter/components/FilterChip.d.ts +23 -0
- package/dist/components/BitkitFilter/components/FilterChip.js +64 -0
- package/dist/components/BitkitFilter/components/FilterChip.js.map +1 -0
- package/dist/components/BitkitFilter/components/FilterField.d.ts +15 -0
- package/dist/components/BitkitFilter/components/FilterField.js +58 -0
- package/dist/components/BitkitFilter/components/FilterField.js.map +1 -0
- package/dist/components/BitkitFilter/components/FilterPanel.d.ts +42 -0
- package/dist/components/BitkitFilter/components/FilterPanel.js +126 -0
- package/dist/components/BitkitFilter/components/FilterPanel.js.map +1 -0
- package/dist/components/BitkitFilter/components/FilterSearchInput.d.ts +15 -0
- package/dist/components/BitkitFilter/components/FilterSearchInput.js +41 -0
- package/dist/components/BitkitFilter/components/FilterSearchInput.js.map +1 -0
- package/dist/components/BitkitFilter/components/FilterSelectForm.d.ts +41 -0
- package/dist/components/BitkitFilter/components/FilterSelectForm.js +307 -0
- package/dist/components/BitkitFilter/components/FilterSelectForm.js.map +1 -0
- package/dist/components/BitkitMarkdown/BitkitMarkdown.js +1 -1
- package/dist/components/BitkitNoteCard/BitkitNoteCard.js +1 -1
- package/dist/components/index.d.ts +6 -1
- package/dist/main.js +8 -9
- package/dist/theme/recipes/index.d.ts +525 -0
- package/dist/theme/recipes/index.js +1 -3
- package/dist/theme/recipes/index.js.map +1 -1
- package/dist/theme/slot-recipes/DatePicker.recipe.d.ts +15 -0
- package/dist/theme/slot-recipes/DatePicker.recipe.js +72 -22
- package/dist/theme/slot-recipes/DatePicker.recipe.js.map +1 -1
- package/dist/theme/slot-recipes/DatePickerSelect.recipe.d.ts +82 -0
- package/dist/theme/slot-recipes/DatePickerSelect.recipe.js +28 -10
- package/dist/theme/slot-recipes/DatePickerSelect.recipe.js.map +1 -1
- package/dist/theme/slot-recipes/Filter.recipe.d.ts +37 -0
- package/dist/theme/slot-recipes/Filter.recipe.js +636 -0
- package/dist/theme/slot-recipes/Filter.recipe.js.map +1 -0
- package/dist/theme/slot-recipes/Listbox.recipe.d.ts +22 -0
- package/dist/theme/slot-recipes/Listbox.recipe.js +92 -0
- package/dist/theme/slot-recipes/Listbox.recipe.js.map +1 -0
- package/dist/theme/slot-recipes/Menu.recipe.js +6 -1
- package/dist/theme/slot-recipes/Menu.recipe.js.map +1 -1
- package/dist/theme/slot-recipes/Tag.recipe.d.ts +1 -1
- package/dist/theme/slot-recipes/index.d.ts +155 -2
- package/dist/theme/slot-recipes/index.js +4 -2
- package/dist/theme/slot-recipes/index.js.map +1 -1
- package/dist/utilities/BitkitPortalContext.js +3 -2
- package/dist/utilities/BitkitPortalContext.js.map +1 -1
- package/docs/v1-to-v2-migration-guide.md +48 -1
- package/package.json +1 -1
- package/dist/components/BitkitUIHeader/BitkitUIHeader.d.ts +0 -37
- package/dist/components/BitkitUIHeader/BitkitUIHeader.js +0 -100
- package/dist/components/BitkitUIHeader/BitkitUIHeader.js.map +0 -1
- package/dist/components/BitkitUIHeader/BitriseLogo.d.ts +0 -10
- package/dist/components/BitkitUIHeader/BitriseLogo.js +0 -86
- package/dist/components/BitkitUIHeader/BitriseLogo.js.map +0 -1
- package/dist/components/BitkitUIHeader/UIHeaderAccount.d.ts +0 -19
- package/dist/components/BitkitUIHeader/UIHeaderAccount.js +0 -38
- package/dist/components/BitkitUIHeader/UIHeaderAccount.js.map +0 -1
- package/dist/components/BitkitUIHeader/UIHeaderButton.d.ts +0 -33
- package/dist/components/BitkitUIHeader/UIHeaderButton.js +0 -41
- package/dist/components/BitkitUIHeader/UIHeaderButton.js.map +0 -1
- package/dist/components/BitkitUIHeader/UIHeaderContext.d.ts +0 -12
- package/dist/components/BitkitUIHeader/UIHeaderContext.js +0 -11
- package/dist/components/BitkitUIHeader/UIHeaderContext.js.map +0 -1
- package/dist/components/BitkitUIHeader/UIHeaderControl.d.ts +0 -64
- package/dist/components/BitkitUIHeader/UIHeaderControl.js +0 -66
- package/dist/components/BitkitUIHeader/UIHeaderControl.js.map +0 -1
- package/dist/components/BitkitUIHeader/UIHeaderNavButton.d.ts +0 -20
- package/dist/components/BitkitUIHeader/UIHeaderNavButton.js +0 -47
- package/dist/components/BitkitUIHeader/UIHeaderNavButton.js.map +0 -1
- package/dist/components/BitkitUIHeader/UIHeaderSearch.d.ts +0 -32
- package/dist/components/BitkitUIHeader/UIHeaderSearch.js +0 -96
- package/dist/components/BitkitUIHeader/UIHeaderSearch.js.map +0 -1
- package/dist/theme/recipes/UIHeaderButton.recipe.js +0 -111
- package/dist/theme/recipes/UIHeaderButton.recipe.js.map +0 -1
- package/dist/theme/slot-recipes/UIHeader.recipe.d.ts +0 -11
- package/dist/theme/slot-recipes/UIHeader.recipe.js +0 -237
- package/dist/theme/slot-recipes/UIHeader.recipe.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FilterPanel.js","names":[],"sources":["../../../../lib/components/BitkitFilter/components/FilterPanel.tsx"],"sourcesContent":["import { Box } from '@chakra-ui/react/box';\nimport { Drawer } from '@chakra-ui/react/drawer';\nimport { Popover } from '@chakra-ui/react/popover';\nimport { Portal } from '@chakra-ui/react/portal';\nimport { Text } from '@chakra-ui/react/text';\nimport { type ReactNode } from 'react';\n\nimport { IconArrowLeft } from '../../../icons';\nimport { usePortalContext } from '../../../utilities/BitkitPortalContext';\nimport BitkitBadge from '../../BitkitBadge/BitkitBadge';\nimport BitkitButton from '../../BitkitButton/BitkitButton';\nimport BitkitControlButton from '../../BitkitControlButton/BitkitControlButton';\nimport { useFilterContext } from '../BitkitFilter.context';\n\nexport interface FilterPanelProps {\n children: ReactNode;\n /** Where focus goes on close, for a panel without a trigger to return it to. */\n finalFocusEl?: () => HTMLElement | null;\n /** Anchors the desktop popover to an element it has no trigger for — the \"Add filter\" button. */\n getAnchorElement?: () => HTMLElement | null;\n onOpenChange: (open: boolean) => void;\n open: boolean;\n /**\n * What opens the panel: on desktop a `FilterChip`, which renders the popover's trigger; on mobile a\n * `FilterField`, which opens it through its own `onClick`.\n */\n trigger?: ReactNode;\n}\n\n/**\n * Where a filter edits its value: an anchored popover on desktop, a full-screen view stacked over the\n * filters dialog on mobile. The content unmounts on close, so the draft state of the form inside\n * starts over from the applied value each time it opens.\n */\nconst FilterPanel = (props: FilterPanelProps) => {\n const { children, finalFocusEl, getAnchorElement, onOpenChange: onOpenChangeProp, open, trigger } = props;\n const { isDisabled, isMobile, styles } = useFilterContext();\n // While the page loads the triggers are only `aria-disabled`, so opening is refused here.\n const onOpenChange = (isOpen: boolean) => {\n if (!isOpen || !isDisabled) onOpenChangeProp(isOpen);\n };\n const { disablePortal } = usePortalContext();\n\n if (isMobile) {\n return (\n <>\n {trigger}\n <Drawer.Root\n finalFocusEl={finalFocusEl}\n lazyMount\n onOpenChange={({ open: isOpen }) => onOpenChange(isOpen)}\n open={open}\n unmountOnExit\n >\n <Portal disabled={disablePortal}>\n <Drawer.Positioner>\n <Drawer.Content>{children}</Drawer.Content>\n </Drawer.Positioner>\n </Portal>\n </Drawer.Root>\n </>\n );\n }\n\n return (\n <Popover.Root\n finalFocusEl={finalFocusEl}\n lazyMount\n onOpenChange={({ open: isOpen }) => onOpenChange(isOpen)}\n open={open}\n positioning={{\n getAnchorElement,\n gutter: 8,\n placement: 'bottom-start',\n }}\n unmountOnExit\n >\n {trigger}\n <Portal disabled={disablePortal}>\n <Popover.Positioner>\n <Popover.Content css={styles.popoverContent}>{children}</Popover.Content>\n </Popover.Positioner>\n </Portal>\n </Popover.Root>\n );\n};\n\nexport interface FilterPanelHeaderProps {\n /** Desktop only: a multi-select's selection count, shown as a badge next to the title. */\n count?: number;\n title: string;\n}\n\nexport const FilterPanelHeader = ({ count, title }: FilterPanelHeaderProps) => {\n const { isMobile, styles } = useFilterContext();\n\n if (isMobile) {\n return (\n <Box css={styles.mobilePanelHeader}>\n <Drawer.CloseTrigger asChild unstyled>\n <BitkitControlButton icon={IconArrowLeft} label=\"Back\" />\n </Drawer.CloseTrigger>\n <Box>\n <Text css={styles.mobilePanelOverline}>Filter</Text>\n <Drawer.Title css={styles.mobilePanelTitle} unstyled>\n {title}\n </Drawer.Title>\n </Box>\n </Box>\n );\n }\n\n return (\n <Popover.Header>\n <Popover.Title>{title}</Popover.Title>\n {count !== undefined && <BitkitBadge>{count}</BitkitBadge>}\n </Popover.Header>\n );\n};\n\nexport interface FilterPanelFooterProps {\n /** Mobile only: the Apply button's label, e.g. \"Apply (2)\". */\n applyLabel?: string;\n isApplyDisabled: boolean;\n onApply: () => void;\n /** Desktop only: adds a \"Cancel\" button. On mobile the header's back button cancels. */\n onCancel?: () => void;\n /** The action before Apply: \"Clear\", or the wildcard-mode switch. */\n start?: { label: string; onClick: () => void };\n}\n\nexport const FilterPanelFooter = ({\n applyLabel,\n isApplyDisabled,\n onApply,\n onCancel,\n start,\n}: FilterPanelFooterProps) => {\n const { isMobile, styles } = useFilterContext();\n const applyState = isApplyDisabled ? 'disabled' : undefined;\n\n if (isMobile) {\n return (\n <Drawer.Footer>\n <Box css={styles.mobileFooter}>\n {!!start && (\n <BitkitButton onClick={start.onClick} size=\"md\" variant=\"secondary\">\n {start.label}\n </BitkitButton>\n )}\n <BitkitButton onClick={onApply} size=\"md\" state={applyState}>\n {applyLabel ?? 'Apply'}\n </BitkitButton>\n </Box>\n </Drawer.Footer>\n );\n }\n\n return (\n <Box css={styles.popoverFooter}>\n <Box css={styles.popoverFooterStart}>\n {!!start && (\n <BitkitButton onClick={start.onClick} size=\"sm\" variant=\"tertiary\">\n {start.label}\n </BitkitButton>\n )}\n </Box>\n {!!onCancel && (\n <BitkitButton onClick={onCancel} size=\"sm\" variant=\"secondary\">\n Cancel\n </BitkitButton>\n )}\n <BitkitButton onClick={onApply} size=\"sm\" state={applyState}>\n Apply\n </BitkitButton>\n </Box>\n );\n};\n\nexport default FilterPanel;\n"],"mappings":";;;;;;;;;;;;;;;;;;AAkCA,IAAM,eAAe,UAA4B;CAC/C,MAAM,EAAE,UAAU,cAAc,kBAAkB,cAAc,kBAAkB,MAAM,YAAY;CACpG,MAAM,EAAE,YAAY,UAAU,WAAW,iBAAiB;CAE1D,MAAM,gBAAgB,WAAoB;EACxC,IAAI,CAAC,UAAU,CAAC,YAAY,iBAAiB,MAAM;CACrD;CACA,MAAM,EAAE,kBAAkB,iBAAiB;CAE3C,IAAI,UACF,OACE,qBAAA,UAAA,EAAA,UAAA,CACG,SACD,oBAAC,OAAO,MAAR;EACgB;EACd,WAAA;EACA,eAAe,EAAE,MAAM,aAAa,aAAa,MAAM;EACjD;EACN,eAAA;EAEA,UAAA,oBAAC,QAAD;GAAQ,UAAU;GAChB,UAAA,oBAAC,OAAO,YAAR,EAAA,UACE,oBAAC,OAAO,SAAR,EAAiB,SAAyB,CAAA,EACzB,CAAA;EACb,CAAA;CACG,CAAA,CACb,EAAA,CAAA;CAIN,OACE,qBAAC,QAAQ,MAAT;EACgB;EACd,WAAA;EACA,eAAe,EAAE,MAAM,aAAa,aAAa,MAAM;EACjD;EACN,aAAa;GACX;GACA,QAAQ;GACR,WAAW;EACb;EACA,eAAA;EAVF,UAAA,CAYG,SACD,oBAAC,QAAD;GAAQ,UAAU;GAChB,UAAA,oBAAC,QAAQ,YAAT,EAAA,UACE,oBAAC,QAAQ,SAAT;IAAiB,KAAK,OAAO;IAAiB;GAA0B,CAAA,EACtD,CAAA;EACd,CAAA,CACI;;AAElB;AAQA,IAAa,qBAAqB,EAAE,OAAO,YAAoC;CAC7E,MAAM,EAAE,UAAU,WAAW,iBAAiB;CAE9C,IAAI,UACF,OACE,qBAAC,KAAD;EAAK,KAAK,OAAO;EAAjB,UAAA,CACE,oBAAC,OAAO,cAAR;GAAqB,SAAA;GAAQ,UAAA;GAC3B,UAAA,oBAAC,qBAAD;IAAqB,MAAM;IAAe,OAAM;GAAQ,CAAA;EACrC,CAAA,GACrB,qBAAC,KAAD,EAAA,UAAA,CACE,oBAAC,MAAD;GAAM,KAAK,OAAO;GAAqB,UAAA;EAAY,CAAA,GACnD,oBAAC,OAAO,OAAR;GAAc,KAAK,OAAO;GAAkB,UAAA;GACzC,UAAA;EACW,CAAA,CACX,EAAA,CAAA,CACF;;CAIT,OACE,qBAAC,QAAQ,QAAT,EAAA,UAAA,CACE,oBAAC,QAAQ,OAAT,EAAA,UAAgB,MAAqB,CAAA,GACpC,UAAU,KAAA,KAAa,oBAAC,aAAD,EAAA,UAAc,MAAmB,CAAA,CAC3C,EAAA,CAAA;AAEpB;AAaA,IAAa,qBAAqB,EAChC,YACA,iBACA,SACA,UACA,YAC4B;CAC5B,MAAM,EAAE,UAAU,WAAW,iBAAiB;CAC9C,MAAM,aAAa,kBAAkB,aAAa,KAAA;CAElD,IAAI,UACF,OACE,oBAAC,OAAO,QAAR,EAAA,UACE,qBAAC,KAAD;EAAK,KAAK,OAAO;EAAjB,UAAA,CACG,CAAC,CAAC,SACD,oBAAC,cAAD;GAAc,SAAS,MAAM;GAAS,MAAK;GAAK,SAAQ;GACrD,UAAA,MAAM;EACK,CAAA,GAEhB,oBAAC,cAAD;GAAc,SAAS;GAAS,MAAK;GAAK,OAAO;GAC9C,UAAA,cAAc;EACH,CAAA,CACX;CACQ,CAAA,EAAA,CAAA;CAInB,OACE,qBAAC,KAAD;EAAK,KAAK,OAAO;EAAjB,UAAA;GACE,oBAAC,KAAD;IAAK,KAAK,OAAO;IACd,UAAA,CAAC,CAAC,SACD,oBAAC,cAAD;KAAc,SAAS,MAAM;KAAS,MAAK;KAAK,SAAQ;KACrD,UAAA,MAAM;IACK,CAAA;GAEb,CAAA;GACJ,CAAC,CAAC,YACD,oBAAC,cAAD;IAAc,SAAS;IAAU,MAAK;IAAK,SAAQ;IAAY,UAAA;GAEjD,CAAA;GAEhB,oBAAC,cAAD;IAAc,SAAS;IAAS,MAAK;IAAK,OAAO;IAAY,UAAA;GAE/C,CAAA;EACX;;AAET"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { BoxProps } from '@chakra-ui/react/box';
|
|
2
|
+
import { ReactElement } from 'react';
|
|
3
|
+
export interface FilterSearchInputProps extends Omit<BoxProps, 'children' | 'defaultValue' | 'onChange'> {
|
|
4
|
+
/** Extra hint read out with the field, e.g. what the search matches. */
|
|
5
|
+
description?: string;
|
|
6
|
+
label: string;
|
|
7
|
+
onValueChange: (value: string) => void;
|
|
8
|
+
placeholder: string;
|
|
9
|
+
/** Wraps the input, e.g. in a tooltip. */
|
|
10
|
+
renderInput?: (input: ReactElement) => ReactElement;
|
|
11
|
+
value: string;
|
|
12
|
+
}
|
|
13
|
+
/** The borderless search field of the bar — and, on mobile, of each filter's view too. */
|
|
14
|
+
declare const FilterSearchInput: import('react').ForwardRefExoticComponent<FilterSearchInputProps & import('react').RefAttributes<HTMLInputElement>>;
|
|
15
|
+
export default FilterSearchInput;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import IconMagnifier from "../../../icons/IconMagnifier.js";
|
|
2
|
+
import BitkitCloseButton from "../../BitkitCloseButton/BitkitCloseButton.js";
|
|
3
|
+
import { useFilterContext } from "../BitkitFilter.context.js";
|
|
4
|
+
import { Box } from "@chakra-ui/react/box";
|
|
5
|
+
import { chakra } from "@chakra-ui/react/styled-system";
|
|
6
|
+
import { forwardRef } from "react";
|
|
7
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
8
|
+
//#region lib/components/BitkitFilter/components/FilterSearchInput.tsx
|
|
9
|
+
/** The borderless search field of the bar — and, on mobile, of each filter's view too. */
|
|
10
|
+
var FilterSearchInput = forwardRef((props, ref) => {
|
|
11
|
+
const { css, description, label, onValueChange, placeholder, renderInput = (input) => input, value, ...rest } = props;
|
|
12
|
+
const { isMobile, styles } = useFilterContext();
|
|
13
|
+
return /* @__PURE__ */ jsxs(Box, {
|
|
14
|
+
css: [isMobile ? styles.mobileSearch : styles.search, css],
|
|
15
|
+
...rest,
|
|
16
|
+
children: [
|
|
17
|
+
/* @__PURE__ */ jsx(IconMagnifier, { size: isMobile ? "24" : "16" }),
|
|
18
|
+
renderInput(/* @__PURE__ */ jsx(chakra.input, {
|
|
19
|
+
"aria-description": description,
|
|
20
|
+
"aria-label": label,
|
|
21
|
+
css: isMobile ? styles.mobileSearchInput : styles.searchInput,
|
|
22
|
+
onChange: (event) => onValueChange(event.target.value),
|
|
23
|
+
placeholder,
|
|
24
|
+
ref,
|
|
25
|
+
type: "search",
|
|
26
|
+
value
|
|
27
|
+
})),
|
|
28
|
+
!!value && /* @__PURE__ */ jsx(BitkitCloseButton, {
|
|
29
|
+
"aria-label": "Clear search",
|
|
30
|
+
colorVariant: "neutral",
|
|
31
|
+
onClick: () => onValueChange(""),
|
|
32
|
+
size: "sm"
|
|
33
|
+
})
|
|
34
|
+
]
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
FilterSearchInput.displayName = "FilterSearchInput";
|
|
38
|
+
//#endregion
|
|
39
|
+
export { FilterSearchInput as default };
|
|
40
|
+
|
|
41
|
+
//# sourceMappingURL=FilterSearchInput.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FilterSearchInput.js","names":[],"sources":["../../../../lib/components/BitkitFilter/components/FilterSearchInput.tsx"],"sourcesContent":["import { Box, type BoxProps } from '@chakra-ui/react/box';\n// `chakra.input`: the filter's search fields are borderless rows from the filter recipe, unlike the\n// bordered BitkitSearchInput.\nimport { chakra } from '@chakra-ui/react/styled-system';\nimport { forwardRef, type ReactElement } from 'react';\n\nimport { IconMagnifier } from '../../../icons';\nimport BitkitCloseButton from '../../BitkitCloseButton/BitkitCloseButton';\nimport { useFilterContext } from '../BitkitFilter.context';\n\nexport interface FilterSearchInputProps extends Omit<BoxProps, 'children' | 'defaultValue' | 'onChange'> {\n /** Extra hint read out with the field, e.g. what the search matches. */\n description?: string;\n label: string;\n onValueChange: (value: string) => void;\n placeholder: string;\n /** Wraps the input, e.g. in a tooltip. */\n renderInput?: (input: ReactElement) => ReactElement;\n value: string;\n}\n\n/** The borderless search field of the bar — and, on mobile, of each filter's view too. */\nconst FilterSearchInput = forwardRef<HTMLInputElement, FilterSearchInputProps>((props, ref) => {\n const { css, description, label, onValueChange, placeholder, renderInput = (input) => input, value, ...rest } = props;\n const { isMobile, styles } = useFilterContext();\n\n return (\n <Box css={[isMobile ? styles.mobileSearch : styles.search, css]} {...rest}>\n <IconMagnifier size={isMobile ? '24' : '16'} />\n {renderInput(\n <chakra.input\n aria-description={description}\n aria-label={label}\n css={isMobile ? styles.mobileSearchInput : styles.searchInput}\n onChange={(event) => onValueChange(event.target.value)}\n placeholder={placeholder}\n ref={ref}\n type=\"search\"\n value={value}\n />,\n )}\n {!!value && (\n <BitkitCloseButton\n aria-label=\"Clear search\"\n colorVariant=\"neutral\"\n onClick={() => onValueChange('')}\n size=\"sm\"\n />\n )}\n </Box>\n );\n});\n\nFilterSearchInput.displayName = 'FilterSearchInput';\n\nexport default FilterSearchInput;\n"],"mappings":";;;;;;;;;AAsBA,IAAM,oBAAoB,YAAsD,OAAO,QAAQ;CAC7F,MAAM,EAAE,KAAK,aAAa,OAAO,eAAe,aAAa,eAAe,UAAU,OAAO,OAAO,GAAG,SAAS;CAChH,MAAM,EAAE,UAAU,WAAW,iBAAiB;CAE9C,OACE,qBAAC,KAAD;EAAK,KAAK,CAAC,WAAW,OAAO,eAAe,OAAO,QAAQ,GAAG;EAAG,GAAI;EAArE,UAAA;GACE,oBAAC,eAAD,EAAe,MAAM,WAAW,OAAO,KAAO,CAAA;GAC7C,YACC,oBAAC,OAAO,OAAR;IACE,oBAAkB;IAClB,cAAY;IACZ,KAAK,WAAW,OAAO,oBAAoB,OAAO;IAClD,WAAW,UAAU,cAAc,MAAM,OAAO,KAAK;IACxC;IACR;IACL,MAAK;IACE;GACR,CAAA,CACH;GACC,CAAC,CAAC,SACD,oBAAC,mBAAD;IACE,cAAW;IACX,cAAa;IACb,eAAe,cAAc,EAAE;IAC/B,MAAK;GACN,CAAA;EAEA;;AAET,CAAC;AAED,kBAAkB,cAAc"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { BitkitIconComponent } from '../../../icons';
|
|
2
|
+
import { BitkitColorToken } from '../../../theme/themeUtils';
|
|
3
|
+
export interface BitkitFilterSelectItem {
|
|
4
|
+
/** Lists the option under this heading, with the others of the same group. */
|
|
5
|
+
group?: string;
|
|
6
|
+
icon?: BitkitIconComponent;
|
|
7
|
+
/** Colors the icon, e.g. a status: `icon/positive` for "Passed". */
|
|
8
|
+
iconColor?: BitkitColorToken<'icon'>;
|
|
9
|
+
label: string;
|
|
10
|
+
value: string;
|
|
11
|
+
}
|
|
12
|
+
/** The list renders at most this many options; search narrows down the rest. */
|
|
13
|
+
export declare const MAX_VISIBLE_ITEMS = 100;
|
|
14
|
+
export interface FilterSelectFormProps {
|
|
15
|
+
/** The filter holds a value: the footer offers "Clear" instead of the wildcard-mode switch. */
|
|
16
|
+
isEditing: boolean;
|
|
17
|
+
/** Keeps `items` in their own order instead of listing the applied ones first — for a switch's fixed options. */
|
|
18
|
+
isOrderFixed?: boolean;
|
|
19
|
+
/** A value is always applied: no "Clear" in the footer. */
|
|
20
|
+
isRequired?: boolean;
|
|
21
|
+
items: BitkitFilterSelectItem[];
|
|
22
|
+
label: string;
|
|
23
|
+
loading?: boolean;
|
|
24
|
+
loadingLabel?: string;
|
|
25
|
+
multiple?: boolean;
|
|
26
|
+
onApply: (value: string[]) => void;
|
|
27
|
+
onCancel: () => void;
|
|
28
|
+
onSearchChange?: (searchText: string) => void;
|
|
29
|
+
pattern?: boolean;
|
|
30
|
+
pluralLabel: string;
|
|
31
|
+
searchPlaceholder?: string;
|
|
32
|
+
/**
|
|
33
|
+
* The applied selection with its labels. Without a search, any of it missing from `items` — e.g.
|
|
34
|
+
* left behind by a server search — is listed first, so it can still be unchecked.
|
|
35
|
+
*/
|
|
36
|
+
selectedItems?: BitkitFilterSelectItem[];
|
|
37
|
+
value: string[];
|
|
38
|
+
}
|
|
39
|
+
/** The body of a select filter's panel: search, the option list or wildcard pattern, and the footer. */
|
|
40
|
+
declare const FilterSelectForm: (props: FilterSelectFormProps) => import('react').JSX.Element;
|
|
41
|
+
export default FilterSelectForm;
|
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
import IconCheck from "../../../icons/IconCheck.js";
|
|
2
|
+
import BitkitGroupHeading from "../../BitkitGroupHeading/BitkitGroupHeading.js";
|
|
3
|
+
import BitkitCheckbox from "../../BitkitCheckbox/BitkitCheckbox.js";
|
|
4
|
+
import BitkitCheckboxGroup from "../../BitkitCheckboxGroup/BitkitCheckboxGroup.js";
|
|
5
|
+
import { compilePattern, isEqualFilterValue, isPattern, toRunningText } from "../BitkitFilter.utils.js";
|
|
6
|
+
import { useFilterContext } from "../BitkitFilter.context.js";
|
|
7
|
+
import { FilterPanelFooter, FilterPanelHeader } from "./FilterPanel.js";
|
|
8
|
+
import FilterSearchInput from "./FilterSearchInput.js";
|
|
9
|
+
import BitkitInlineLoading from "../../BitkitInlineLoading/BitkitInlineLoading.js";
|
|
10
|
+
import BitkitList_default from "../../BitkitList/BitkitList.js";
|
|
11
|
+
import BitkitTextInput from "../../BitkitTextInput/BitkitTextInput.js";
|
|
12
|
+
import BitkitSearchInput from "../../BitkitSearchInput/BitkitSearchInput.js";
|
|
13
|
+
import { Box } from "@chakra-ui/react/box";
|
|
14
|
+
import { useSlotRecipe } from "@chakra-ui/react/styled-system";
|
|
15
|
+
import { Fragment, useEffect, useMemo, useRef, useState } from "react";
|
|
16
|
+
import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
|
|
17
|
+
import { Text } from "@chakra-ui/react/text";
|
|
18
|
+
import { createListCollection } from "@chakra-ui/react/collection";
|
|
19
|
+
import { HStack } from "@chakra-ui/react/stack";
|
|
20
|
+
import { Listbox } from "@chakra-ui/react/listbox";
|
|
21
|
+
//#region lib/components/BitkitFilter/components/FilterSelectForm.tsx
|
|
22
|
+
/**
|
|
23
|
+
* Gathers the options by `group`, in the order each group first appears, so the list (and its
|
|
24
|
+
* keyboard order) runs group by group. Ungrouped options come under an empty-named group.
|
|
25
|
+
*/
|
|
26
|
+
var groupItems = (items) => {
|
|
27
|
+
const groups = /* @__PURE__ */ new Map();
|
|
28
|
+
items.forEach((item) => {
|
|
29
|
+
const key = item.group ?? "";
|
|
30
|
+
groups.set(key, [...groups.get(key) ?? [], item]);
|
|
31
|
+
});
|
|
32
|
+
return [...groups];
|
|
33
|
+
};
|
|
34
|
+
/** Below this many options the list is short enough to scan, so there is no search input. */
|
|
35
|
+
var SEARCH_THRESHOLD = 5;
|
|
36
|
+
/** The body of a select filter's panel: search, the option list or wildcard pattern, and the footer. */
|
|
37
|
+
var FilterSelectForm = (props) => {
|
|
38
|
+
const { isEditing, isOrderFixed, isRequired, items, label, loading, loadingLabel = "Loading...", multiple, onApply, onCancel, onSearchChange, pattern, pluralLabel, searchPlaceholder = "Search for options", selectedItems = [], value } = props;
|
|
39
|
+
const { isMobile, styles } = useFilterContext();
|
|
40
|
+
const [draft, setDraft] = useState(value);
|
|
41
|
+
const [mode, setMode] = useState(pattern && value[0] && isPattern(value[0]) ? "pattern" : "list");
|
|
42
|
+
const [searchText, setSearchText] = useState("");
|
|
43
|
+
const [hasLoaded, setHasLoaded] = useState(!loading);
|
|
44
|
+
if (!loading && !hasLoaded) setHasLoaded(true);
|
|
45
|
+
const onSearchTextChange = (text) => {
|
|
46
|
+
setSearchText(text);
|
|
47
|
+
onSearchChange?.(text);
|
|
48
|
+
};
|
|
49
|
+
const matchingItems = useMemo(() => {
|
|
50
|
+
if (!searchText) {
|
|
51
|
+
if (isOrderFixed) return items;
|
|
52
|
+
return [...value.flatMap((selected) => {
|
|
53
|
+
return items.find((option) => option.value === selected) ?? selectedItems.find((option) => option.value === selected) ?? [];
|
|
54
|
+
}), ...items.filter((item) => !value.includes(item.value))];
|
|
55
|
+
}
|
|
56
|
+
if (onSearchChange) return items;
|
|
57
|
+
const query = searchText.toLowerCase();
|
|
58
|
+
return items.filter((item) => item.label.toLowerCase().includes(query));
|
|
59
|
+
}, [
|
|
60
|
+
isOrderFixed,
|
|
61
|
+
items,
|
|
62
|
+
onSearchChange,
|
|
63
|
+
searchText,
|
|
64
|
+
selectedItems,
|
|
65
|
+
value
|
|
66
|
+
]);
|
|
67
|
+
const visibleGroups = useMemo(() => groupItems(matchingItems.slice(0, 100)), [matchingItems]);
|
|
68
|
+
const visibleItems = visibleGroups.flatMap(([, groupItems]) => groupItems);
|
|
69
|
+
const isInitialLoading = !!loading && !hasLoaded;
|
|
70
|
+
const showSearch = !isInitialLoading && (!!onSearchChange || items.length > SEARCH_THRESHOLD);
|
|
71
|
+
const searchLabel = `Search ${toRunningText(pluralLabel)}`;
|
|
72
|
+
const showLimitHelper = matchingItems.length > 100;
|
|
73
|
+
const patternValue = draft[0] ?? "";
|
|
74
|
+
const isApplyDisabled = isEqualFilterValue(draft, value) || mode === "pattern" && !(patternValue && isPattern(patternValue)) || !!isRequired && !draft.length;
|
|
75
|
+
const bodyRef = useRef(null);
|
|
76
|
+
const hasSwitchedMode = useRef(false);
|
|
77
|
+
useEffect(() => {
|
|
78
|
+
if (!hasSwitchedMode.current) return;
|
|
79
|
+
bodyRef.current?.querySelector("input:not([type=hidden]), [role=listbox], input[type=checkbox]")?.focus();
|
|
80
|
+
}, [mode]);
|
|
81
|
+
let start;
|
|
82
|
+
if (isEditing && !isRequired) start = {
|
|
83
|
+
label: multiple && isMobile ? "Clear all" : "Clear",
|
|
84
|
+
onClick: () => onApply([])
|
|
85
|
+
};
|
|
86
|
+
else if (pattern && !isEditing) start = {
|
|
87
|
+
label: mode === "list" ? "Use wildcard pattern" : "Select from list",
|
|
88
|
+
onClick: () => {
|
|
89
|
+
hasSwitchedMode.current = true;
|
|
90
|
+
setMode(mode === "list" ? "pattern" : "list");
|
|
91
|
+
setDraft([]);
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
let list;
|
|
95
|
+
if (loading) list = /* @__PURE__ */ jsx(BitkitInlineLoading, {
|
|
96
|
+
css: styles.loading,
|
|
97
|
+
label: loadingLabel,
|
|
98
|
+
size: isMobile ? "lg" : "md"
|
|
99
|
+
});
|
|
100
|
+
else if (!visibleItems.length) list = /* @__PURE__ */ jsx(Text, {
|
|
101
|
+
css: styles.loading,
|
|
102
|
+
color: "text/secondary",
|
|
103
|
+
textStyle: isMobile ? "body/lg/regular" : "body/md/regular",
|
|
104
|
+
children: searchText ? "No result. Refine your search term." : "No options available."
|
|
105
|
+
});
|
|
106
|
+
else if (multiple && !isMobile) list = /* @__PURE__ */ jsxs(Box, {
|
|
107
|
+
css: styles.checkboxList,
|
|
108
|
+
children: [/* @__PURE__ */ jsx(BitkitCheckboxGroup, {
|
|
109
|
+
"aria-label": label,
|
|
110
|
+
onValueChange: setDraft,
|
|
111
|
+
size: "md",
|
|
112
|
+
value: draft,
|
|
113
|
+
children: visibleGroups.map(([group, groupItems]) => /* @__PURE__ */ jsxs(Fragment, { children: [!!group && /* @__PURE__ */ jsx(BitkitGroupHeading, {
|
|
114
|
+
label: group,
|
|
115
|
+
paddingBlockStart: "12",
|
|
116
|
+
paddingInline: "4"
|
|
117
|
+
}), groupItems.map((item) => /* @__PURE__ */ jsx(BitkitCheckbox, {
|
|
118
|
+
labelText: item.icon ? /* @__PURE__ */ jsxs(HStack, {
|
|
119
|
+
gap: "4",
|
|
120
|
+
children: [/* @__PURE__ */ jsx(item.icon, {
|
|
121
|
+
color: item.iconColor,
|
|
122
|
+
size: "16"
|
|
123
|
+
}), item.label]
|
|
124
|
+
}) : item.label,
|
|
125
|
+
value: item.value
|
|
126
|
+
}, item.value))] }, group))
|
|
127
|
+
}), showLimitHelper && /* @__PURE__ */ jsx(LimitHelper, { marginBlockStart: "16" })]
|
|
128
|
+
});
|
|
129
|
+
else list = /* @__PURE__ */ jsx(FilterListbox, {
|
|
130
|
+
groups: visibleGroups,
|
|
131
|
+
items: visibleItems,
|
|
132
|
+
label,
|
|
133
|
+
multiple,
|
|
134
|
+
onValueChange: setDraft,
|
|
135
|
+
showLimitHelper,
|
|
136
|
+
value: draft
|
|
137
|
+
});
|
|
138
|
+
let search = null;
|
|
139
|
+
if (showSearch && isMobile) search = /* @__PURE__ */ jsx(FilterSearchInput, {
|
|
140
|
+
label: searchLabel,
|
|
141
|
+
onValueChange: onSearchTextChange,
|
|
142
|
+
placeholder: searchPlaceholder,
|
|
143
|
+
value: searchText
|
|
144
|
+
});
|
|
145
|
+
else if (showSearch) search = /* @__PURE__ */ jsx(Box, {
|
|
146
|
+
css: styles.popoverSearch,
|
|
147
|
+
children: /* @__PURE__ */ jsx(BitkitSearchInput, {
|
|
148
|
+
label: searchLabel,
|
|
149
|
+
onChange: onSearchTextChange,
|
|
150
|
+
placeholder: searchPlaceholder,
|
|
151
|
+
size: "md",
|
|
152
|
+
value: searchText
|
|
153
|
+
})
|
|
154
|
+
});
|
|
155
|
+
const body = /* @__PURE__ */ jsx(Box, {
|
|
156
|
+
css: styles.popoverBody,
|
|
157
|
+
ref: bodyRef,
|
|
158
|
+
children: mode === "pattern" ? /* @__PURE__ */ jsx(FilterPatternBody, {
|
|
159
|
+
items,
|
|
160
|
+
onValueChange: setDraft,
|
|
161
|
+
pluralLabel,
|
|
162
|
+
value: patternValue
|
|
163
|
+
}) : /* @__PURE__ */ jsxs(Fragment$1, { children: [search, list] })
|
|
164
|
+
});
|
|
165
|
+
return /* @__PURE__ */ jsxs(Fragment$1, { children: [
|
|
166
|
+
/* @__PURE__ */ jsx(FilterPanelHeader, {
|
|
167
|
+
count: multiple && mode === "list" ? draft.length : void 0,
|
|
168
|
+
title: multiple ? pluralLabel : label
|
|
169
|
+
}),
|
|
170
|
+
isMobile ? /* @__PURE__ */ jsx(Box, {
|
|
171
|
+
flex: "1",
|
|
172
|
+
overflowY: "auto",
|
|
173
|
+
children: body
|
|
174
|
+
}) : body,
|
|
175
|
+
!isInitialLoading && /* @__PURE__ */ jsx(FilterPanelFooter, {
|
|
176
|
+
applyLabel: multiple && mode === "list" && draft.length ? `Apply (${draft.length})` : void 0,
|
|
177
|
+
isApplyDisabled,
|
|
178
|
+
onApply: () => onApply(mode === "pattern" ? [patternValue] : draft),
|
|
179
|
+
onCancel,
|
|
180
|
+
start
|
|
181
|
+
})
|
|
182
|
+
] });
|
|
183
|
+
};
|
|
184
|
+
var LimitHelper = ({ marginBlockStart }) => {
|
|
185
|
+
const { styles } = useFilterContext();
|
|
186
|
+
return /* @__PURE__ */ jsxs(Text, {
|
|
187
|
+
css: styles.listHelperText,
|
|
188
|
+
marginBlockStart,
|
|
189
|
+
children: [
|
|
190
|
+
"Showing the first ",
|
|
191
|
+
100,
|
|
192
|
+
" options. Search to find more."
|
|
193
|
+
]
|
|
194
|
+
});
|
|
195
|
+
};
|
|
196
|
+
/**
|
|
197
|
+
* The option list for a single select, and on mobile for a multiple one too — there the rows are
|
|
198
|
+
* full-width and highlighted when selected, with a checkbox drawn in front.
|
|
199
|
+
*/
|
|
200
|
+
var FilterListbox = (props) => {
|
|
201
|
+
const { groups, items, label, multiple, onValueChange, showLimitHelper, value } = props;
|
|
202
|
+
const { isMobile, styles } = useFilterContext();
|
|
203
|
+
const collection = useMemo(() => createListCollection({ items }), [items]);
|
|
204
|
+
const checkboxStyles = useSlotRecipe({ key: "checkbox" })({ size: "lg" });
|
|
205
|
+
const checkIndicator = /* @__PURE__ */ jsx(Listbox.ItemIndicator, { children: /* @__PURE__ */ jsx(IconCheck, { size: "16" }) });
|
|
206
|
+
const renderItem = (item) => {
|
|
207
|
+
const state = value.includes(item.value) ? "checked" : "unchecked";
|
|
208
|
+
const check = multiple ? /* @__PURE__ */ jsx(Box, {
|
|
209
|
+
"aria-hidden": true,
|
|
210
|
+
css: [checkboxStyles.control, styles.mobileListCheckbox],
|
|
211
|
+
"data-state": state,
|
|
212
|
+
children: /* @__PURE__ */ jsx(IconCheck, {})
|
|
213
|
+
}) : /* @__PURE__ */ jsx(Box, {
|
|
214
|
+
"aria-hidden": true,
|
|
215
|
+
css: styles.mobileListCheck,
|
|
216
|
+
"data-state": state,
|
|
217
|
+
children: /* @__PURE__ */ jsx(IconCheck, { size: "16" })
|
|
218
|
+
});
|
|
219
|
+
return /* @__PURE__ */ jsxs(Listbox.Item, {
|
|
220
|
+
item,
|
|
221
|
+
children: [
|
|
222
|
+
isMobile && check,
|
|
223
|
+
!!item.icon && /* @__PURE__ */ jsx(item.icon, {
|
|
224
|
+
color: item.iconColor,
|
|
225
|
+
size: isMobile ? "24" : "16"
|
|
226
|
+
}),
|
|
227
|
+
/* @__PURE__ */ jsx(Listbox.ItemText, { children: item.label }),
|
|
228
|
+
!isMobile && checkIndicator
|
|
229
|
+
]
|
|
230
|
+
}, item.value);
|
|
231
|
+
};
|
|
232
|
+
return /* @__PURE__ */ jsxs(Listbox.Root, {
|
|
233
|
+
collection,
|
|
234
|
+
onValueChange: (details) => onValueChange(details.value),
|
|
235
|
+
selectionMode: multiple ? "multiple" : "single",
|
|
236
|
+
size: isMobile ? "lg" : "md",
|
|
237
|
+
value,
|
|
238
|
+
children: [/* @__PURE__ */ jsx(Listbox.Label, {
|
|
239
|
+
srOnly: true,
|
|
240
|
+
children: label
|
|
241
|
+
}), /* @__PURE__ */ jsxs(Listbox.Content, { children: [groups.map(([group, groupItems]) => /* @__PURE__ */ jsxs(Listbox.ItemGroup, { children: [!!group && /* @__PURE__ */ jsx(Listbox.ItemGroupLabel, {
|
|
242
|
+
asChild: true,
|
|
243
|
+
children: /* @__PURE__ */ jsx(BitkitGroupHeading, {
|
|
244
|
+
label: group,
|
|
245
|
+
paddingBlockStart: "12",
|
|
246
|
+
paddingInline: "24"
|
|
247
|
+
})
|
|
248
|
+
}), groupItems.map(renderItem)] }, group)), showLimitHelper && /* @__PURE__ */ jsx(Box, {
|
|
249
|
+
paddingBlockStart: "8",
|
|
250
|
+
paddingInline: "24",
|
|
251
|
+
children: /* @__PURE__ */ jsx(LimitHelper, {})
|
|
252
|
+
})] })]
|
|
253
|
+
});
|
|
254
|
+
};
|
|
255
|
+
var FilterPatternBody = ({ items, onValueChange, pluralLabel, value }) => {
|
|
256
|
+
const { isMobile, styles } = useFilterContext();
|
|
257
|
+
const noun = toRunningText(pluralLabel);
|
|
258
|
+
const matches = useMemo(() => {
|
|
259
|
+
if (!isPattern(value)) return null;
|
|
260
|
+
const regExp = compilePattern(value);
|
|
261
|
+
return items.filter((item) => !isPattern(item.label) && regExp.test(item.label));
|
|
262
|
+
}, [items, value]);
|
|
263
|
+
let results;
|
|
264
|
+
if (!matches) results = /* @__PURE__ */ jsxs(Text, {
|
|
265
|
+
color: "text/secondary",
|
|
266
|
+
textStyle: "body/md/regular",
|
|
267
|
+
children: [
|
|
268
|
+
"Enter a pattern with the wildcard ‘*’ to view ",
|
|
269
|
+
noun,
|
|
270
|
+
" with matching names."
|
|
271
|
+
]
|
|
272
|
+
});
|
|
273
|
+
else if (!matches.length) results = /* @__PURE__ */ jsxs(Text, {
|
|
274
|
+
color: "text/tertiary",
|
|
275
|
+
textStyle: "body/md/regular",
|
|
276
|
+
children: [
|
|
277
|
+
"(no matching ",
|
|
278
|
+
noun,
|
|
279
|
+
")"
|
|
280
|
+
]
|
|
281
|
+
});
|
|
282
|
+
else results = /* @__PURE__ */ jsx(BitkitList_default, {
|
|
283
|
+
size: "md",
|
|
284
|
+
children: matches.map((item) => /* @__PURE__ */ jsx(BitkitList_default.Item, { children: item.label }, item.value))
|
|
285
|
+
});
|
|
286
|
+
return /* @__PURE__ */ jsxs(Box, {
|
|
287
|
+
css: styles.pattern,
|
|
288
|
+
children: [/* @__PURE__ */ jsx(BitkitTextInput, {
|
|
289
|
+
helperText: "Allowed wildcard character: *",
|
|
290
|
+
label: "Wildcard pattern",
|
|
291
|
+
onValueChange: (text) => onValueChange(text ? [text] : []),
|
|
292
|
+
placeholder: "(e.g. *main*, release-*)",
|
|
293
|
+
size: isMobile ? "lg" : "md",
|
|
294
|
+
value
|
|
295
|
+
}), /* @__PURE__ */ jsxs(Box, {
|
|
296
|
+
css: styles.patternResults,
|
|
297
|
+
children: [/* @__PURE__ */ jsxs(Text, {
|
|
298
|
+
css: styles.patternResultsLabel,
|
|
299
|
+
children: ["Matching results", matches?.length ? ` (${matches.length})` : ""]
|
|
300
|
+
}), results]
|
|
301
|
+
})]
|
|
302
|
+
});
|
|
303
|
+
};
|
|
304
|
+
//#endregion
|
|
305
|
+
export { FilterSelectForm as default };
|
|
306
|
+
|
|
307
|
+
//# sourceMappingURL=FilterSelectForm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FilterSelectForm.js","names":[],"sources":["../../../../lib/components/BitkitFilter/components/FilterSelectForm.tsx"],"sourcesContent":["import { Box } from '@chakra-ui/react/box';\nimport { createListCollection } from '@chakra-ui/react/collection';\nimport { Listbox } from '@chakra-ui/react/listbox';\nimport { HStack } from '@chakra-ui/react/stack';\nimport { useSlotRecipe } from '@chakra-ui/react/styled-system';\nimport { Text } from '@chakra-ui/react/text';\nimport { Fragment, useEffect, useMemo, useRef, useState } from 'react';\n\nimport { type BitkitIconComponent, IconCheck } from '../../../icons';\nimport { type BitkitColorToken } from '../../../theme/themeUtils';\nimport BitkitCheckbox from '../../BitkitCheckbox/BitkitCheckbox';\nimport BitkitCheckboxGroup from '../../BitkitCheckboxGroup/BitkitCheckboxGroup';\nimport BitkitGroupHeading from '../../BitkitGroupHeading/BitkitGroupHeading';\nimport BitkitInlineLoading from '../../BitkitInlineLoading/BitkitInlineLoading';\nimport BitkitList from '../../BitkitList/BitkitList';\nimport BitkitSearchInput from '../../BitkitSearchInput/BitkitSearchInput';\nimport BitkitTextInput from '../../BitkitTextInput/BitkitTextInput';\nimport { useFilterContext } from '../BitkitFilter.context';\nimport { compilePattern, isEqualFilterValue, isPattern, toRunningText } from '../BitkitFilter.utils';\nimport { FilterPanelFooter, FilterPanelHeader } from './FilterPanel';\nimport FilterSearchInput from './FilterSearchInput';\n\nexport interface BitkitFilterSelectItem {\n /** Lists the option under this heading, with the others of the same group. */\n group?: string;\n icon?: BitkitIconComponent;\n /** Colors the icon, e.g. a status: `icon/positive` for \"Passed\". */\n iconColor?: BitkitColorToken<'icon'>;\n label: string;\n value: string;\n}\n\n/**\n * Gathers the options by `group`, in the order each group first appears, so the list (and its\n * keyboard order) runs group by group. Ungrouped options come under an empty-named group.\n */\nconst groupItems = (items: BitkitFilterSelectItem[]) => {\n const groups = new Map<string, BitkitFilterSelectItem[]>();\n items.forEach((item) => {\n const key = item.group ?? '';\n groups.set(key, [...(groups.get(key) ?? []), item]);\n });\n return [...groups];\n};\n\n/** The list renders at most this many options; search narrows down the rest. */\nexport const MAX_VISIBLE_ITEMS = 100;\n\n/** Below this many options the list is short enough to scan, so there is no search input. */\nconst SEARCH_THRESHOLD = 5;\n\nexport interface FilterSelectFormProps {\n /** The filter holds a value: the footer offers \"Clear\" instead of the wildcard-mode switch. */\n isEditing: boolean;\n /** Keeps `items` in their own order instead of listing the applied ones first — for a switch's fixed options. */\n isOrderFixed?: boolean;\n /** A value is always applied: no \"Clear\" in the footer. */\n isRequired?: boolean;\n items: BitkitFilterSelectItem[];\n label: string;\n loading?: boolean;\n loadingLabel?: string;\n multiple?: boolean;\n onApply: (value: string[]) => void;\n onCancel: () => void;\n onSearchChange?: (searchText: string) => void;\n pattern?: boolean;\n pluralLabel: string;\n searchPlaceholder?: string;\n /**\n * The applied selection with its labels. Without a search, any of it missing from `items` — e.g.\n * left behind by a server search — is listed first, so it can still be unchecked.\n */\n selectedItems?: BitkitFilterSelectItem[];\n value: string[];\n}\n\n/** The body of a select filter's panel: search, the option list or wildcard pattern, and the footer. */\nconst FilterSelectForm = (props: FilterSelectFormProps) => {\n const {\n isEditing,\n isOrderFixed,\n isRequired,\n items,\n label,\n loading,\n loadingLabel = 'Loading...',\n multiple,\n onApply,\n onCancel,\n onSearchChange,\n pattern,\n pluralLabel,\n searchPlaceholder = 'Search for options',\n selectedItems = [],\n value,\n } = props;\n const { isMobile, styles } = useFilterContext();\n\n const [draft, setDraft] = useState(value);\n const [mode, setMode] = useState<'list' | 'pattern'>(pattern && value[0] && isPattern(value[0]) ? 'pattern' : 'list');\n const [searchText, setSearchText] = useState('');\n // Set once the options have loaded, so a later reload (a search, or clearing it) keeps the search and footer.\n const [hasLoaded, setHasLoaded] = useState(!loading);\n if (!loading && !hasLoaded) setHasLoaded(true);\n\n const onSearchTextChange = (text: string) => {\n setSearchText(text);\n onSearchChange?.(text);\n };\n\n // With `onSearchChange` the consumer filters `items` itself, e.g. on the server. Without a search,\n // the applied options come first. `value` doesn't change while the panel is open, so the order is\n // set when it opens and rows don't jump as options are (un)checked.\n const matchingItems = useMemo(() => {\n if (!searchText) {\n if (isOrderFixed) return items;\n const applied = value.flatMap((selected) => {\n const item = items.find((option) => option.value === selected);\n return item ?? selectedItems.find((option) => option.value === selected) ?? [];\n });\n return [...applied, ...items.filter((item) => !value.includes(item.value))];\n }\n if (onSearchChange) return items;\n const query = searchText.toLowerCase();\n return items.filter((item) => item.label.toLowerCase().includes(query));\n }, [isOrderFixed, items, onSearchChange, searchText, selectedItems, value]);\n\n const visibleGroups = useMemo(() => groupItems(matchingItems.slice(0, MAX_VISIBLE_ITEMS)), [matchingItems]);\n const visibleItems = visibleGroups.flatMap(([, groupItems]) => groupItems);\n // The first load shows only the title and a loading row; later loads keep the input and footer in place.\n const isInitialLoading = !!loading && !hasLoaded;\n const showSearch = !isInitialLoading && (!!onSearchChange || items.length > SEARCH_THRESHOLD);\n const searchLabel = `Search ${toRunningText(pluralLabel)}`;\n const showLimitHelper = matchingItems.length > MAX_VISIBLE_ITEMS;\n\n const patternValue = draft[0] ?? '';\n const isApplyDisabled =\n isEqualFilterValue(draft, value) ||\n (mode === 'pattern' && !(patternValue && isPattern(patternValue))) ||\n (!!isRequired && !draft.length);\n\n // Switching between the list and the pattern moves focus into the new view, so typing goes there.\n const bodyRef = useRef<HTMLDivElement>(null);\n const hasSwitchedMode = useRef(false);\n useEffect(() => {\n if (!hasSwitchedMode.current) return;\n bodyRef.current\n ?.querySelector<HTMLElement>('input:not([type=hidden]), [role=listbox], input[type=checkbox]')\n ?.focus();\n }, [mode]);\n\n let start;\n if (isEditing && !isRequired) {\n start = { label: multiple && isMobile ? 'Clear all' : 'Clear', onClick: () => onApply([]) };\n } else if (pattern && !isEditing) {\n start = {\n label: mode === 'list' ? 'Use wildcard pattern' : 'Select from list',\n onClick: () => {\n hasSwitchedMode.current = true;\n setMode(mode === 'list' ? 'pattern' : 'list');\n setDraft([]);\n },\n };\n }\n\n let list;\n if (loading) {\n list = <BitkitInlineLoading css={styles.loading} label={loadingLabel} size={isMobile ? 'lg' : 'md'} />;\n } else if (!visibleItems.length) {\n list = (\n <Text css={styles.loading} color=\"text/secondary\" textStyle={isMobile ? 'body/lg/regular' : 'body/md/regular'}>\n {searchText ? 'No result. Refine your search term.' : 'No options available.'}\n </Text>\n );\n } else if (multiple && !isMobile) {\n list = (\n <Box css={styles.checkboxList}>\n <BitkitCheckboxGroup aria-label={label} onValueChange={setDraft} size=\"md\" value={draft}>\n {visibleGroups.map(([group, groupItems]) => (\n <Fragment key={group}>\n {/* The list pads 20; the heading lines up 24 from the popover's edge, like the listbox's. */}\n {!!group && <BitkitGroupHeading label={group} paddingBlockStart=\"12\" paddingInline=\"4\" />}\n {groupItems.map((item) => (\n <BitkitCheckbox\n key={item.value}\n labelText={\n item.icon ? (\n <HStack gap=\"4\">\n <item.icon color={item.iconColor} size=\"16\" />\n {item.label}\n </HStack>\n ) : (\n item.label\n )\n }\n value={item.value}\n />\n ))}\n </Fragment>\n ))}\n </BitkitCheckboxGroup>\n {showLimitHelper && <LimitHelper marginBlockStart=\"16\" />}\n </Box>\n );\n } else {\n list = (\n <FilterListbox\n groups={visibleGroups}\n items={visibleItems}\n label={label}\n multiple={multiple}\n onValueChange={setDraft}\n showLimitHelper={showLimitHelper}\n value={draft}\n />\n );\n }\n\n let search = null;\n if (showSearch && isMobile) {\n search = (\n <FilterSearchInput\n label={searchLabel}\n onValueChange={onSearchTextChange}\n placeholder={searchPlaceholder}\n value={searchText}\n />\n );\n } else if (showSearch) {\n search = (\n <Box css={styles.popoverSearch}>\n <BitkitSearchInput\n label={searchLabel}\n onChange={onSearchTextChange}\n placeholder={searchPlaceholder}\n size=\"md\"\n value={searchText}\n />\n </Box>\n );\n }\n\n const body = (\n <Box css={styles.popoverBody} ref={bodyRef}>\n {mode === 'pattern' ? (\n <FilterPatternBody items={items} onValueChange={setDraft} pluralLabel={pluralLabel} value={patternValue} />\n ) : (\n <>\n {search}\n {list}\n </>\n )}\n </Box>\n );\n\n return (\n <>\n <FilterPanelHeader\n count={multiple && mode === 'list' ? draft.length : undefined}\n title={multiple ? pluralLabel : label}\n />\n {isMobile ? (\n <Box flex=\"1\" overflowY=\"auto\">\n {body}\n </Box>\n ) : (\n body\n )}\n {!isInitialLoading && (\n <FilterPanelFooter\n applyLabel={multiple && mode === 'list' && draft.length ? `Apply (${draft.length})` : undefined}\n isApplyDisabled={isApplyDisabled}\n onApply={() => onApply(mode === 'pattern' ? [patternValue] : draft)}\n onCancel={onCancel}\n start={start}\n />\n )}\n </>\n );\n};\n\nconst LimitHelper = ({ marginBlockStart }: { marginBlockStart?: '16' }) => {\n const { styles } = useFilterContext();\n\n return (\n <Text css={styles.listHelperText} marginBlockStart={marginBlockStart}>\n Showing the first {MAX_VISIBLE_ITEMS} options. Search to find more.\n </Text>\n );\n};\n\ninterface FilterListboxProps {\n groups: [string, BitkitFilterSelectItem[]][];\n /** `groups` flattened, in the same order: the collection's (and so the keyboard's) order. */\n items: BitkitFilterSelectItem[];\n label: string;\n multiple?: boolean;\n onValueChange: (value: string[]) => void;\n showLimitHelper: boolean;\n value: string[];\n}\n\n/**\n * The option list for a single select, and on mobile for a multiple one too — there the rows are\n * full-width and highlighted when selected, with a checkbox drawn in front.\n */\nconst FilterListbox = (props: FilterListboxProps) => {\n const { groups, items, label, multiple, onValueChange, showLimitHelper, value } = props;\n const { isMobile, styles } = useFilterContext();\n const collection = useMemo(() => createListCollection({ items }), [items]);\n const checkboxStyles = useSlotRecipe({ key: 'checkbox' })({ size: 'lg' });\n\n const checkIndicator = (\n <Listbox.ItemIndicator>\n <IconCheck size=\"16\" />\n </Listbox.ItemIndicator>\n );\n\n const renderItem = (item: BitkitFilterSelectItem) => {\n const state = value.includes(item.value) ? 'checked' : 'unchecked';\n const check = multiple ? (\n // Drawn, not a real checkbox: the option row is the control, and a nested input would be a second one.\n <Box aria-hidden css={[checkboxStyles.control, styles.mobileListCheckbox]} data-state={state}>\n <IconCheck />\n </Box>\n ) : (\n <Box aria-hidden css={styles.mobileListCheck} data-state={state}>\n <IconCheck size=\"16\" />\n </Box>\n );\n return (\n <Listbox.Item item={item} key={item.value}>\n {isMobile && check}\n {!!item.icon && <item.icon color={item.iconColor} size={isMobile ? '24' : '16'} />}\n <Listbox.ItemText>{item.label}</Listbox.ItemText>\n {!isMobile && checkIndicator}\n </Listbox.Item>\n );\n };\n\n return (\n <Listbox.Root\n collection={collection}\n onValueChange={(details) => onValueChange(details.value)}\n selectionMode={multiple ? 'multiple' : 'single'}\n size={isMobile ? 'lg' : 'md'}\n value={value}\n >\n {/* Zag points the content's aria-labelledby at the label, so it has to exist. */}\n <Listbox.Label srOnly>{label}</Listbox.Label>\n <Listbox.Content>\n {groups.map(([group, groupItems]) => (\n <Listbox.ItemGroup key={group}>\n {!!group && (\n <Listbox.ItemGroupLabel asChild>\n <BitkitGroupHeading label={group} paddingBlockStart=\"12\" paddingInline=\"24\" />\n </Listbox.ItemGroupLabel>\n )}\n {groupItems.map(renderItem)}\n </Listbox.ItemGroup>\n ))}\n {showLimitHelper && (\n <Box paddingBlockStart=\"8\" paddingInline=\"24\">\n <LimitHelper />\n </Box>\n )}\n </Listbox.Content>\n </Listbox.Root>\n );\n};\n\ninterface FilterPatternBodyProps {\n items: BitkitFilterSelectItem[];\n onValueChange: (value: string[]) => void;\n pluralLabel: string;\n value: string;\n}\n\nconst FilterPatternBody = ({ items, onValueChange, pluralLabel, value }: FilterPatternBodyProps) => {\n const { isMobile, styles } = useFilterContext();\n const noun = toRunningText(pluralLabel);\n const matches = useMemo(() => {\n if (!isPattern(value)) return null;\n const regExp = compilePattern(value);\n return items.filter((item) => !isPattern(item.label) && regExp.test(item.label));\n }, [items, value]);\n\n let results;\n if (!matches) {\n results = (\n <Text color=\"text/secondary\" textStyle=\"body/md/regular\">\n Enter a pattern with the wildcard ‘*’ to view {noun} with matching names.\n </Text>\n );\n } else if (!matches.length) {\n results = (\n <Text color=\"text/tertiary\" textStyle=\"body/md/regular\">\n (no matching {noun})\n </Text>\n );\n } else {\n results = (\n <BitkitList size=\"md\">\n {matches.map((item) => (\n <BitkitList.Item key={item.value}>{item.label}</BitkitList.Item>\n ))}\n </BitkitList>\n );\n }\n\n return (\n <Box css={styles.pattern}>\n <BitkitTextInput\n helperText=\"Allowed wildcard character: *\"\n label=\"Wildcard pattern\"\n onValueChange={(text) => onValueChange(text ? [text] : [])}\n placeholder=\"(e.g. *main*, release-*)\"\n size={isMobile ? 'lg' : 'md'}\n value={value}\n />\n <Box css={styles.patternResults}>\n <Text css={styles.patternResultsLabel}>Matching results{matches?.length ? ` (${matches.length})` : ''}</Text>\n {results}\n </Box>\n </Box>\n );\n};\n\nexport default FilterSelectForm;\n"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import BitkitCodeSnippet from "../BitkitCodeSnippet/BitkitCodeSnippet.js";
|
|
2
|
+
import BitkitList_default from "../BitkitList/BitkitList.js";
|
|
2
3
|
import BitkitHeading from "../BitkitHeading/BitkitHeading.js";
|
|
3
4
|
import BitkitLink from "../BitkitLink/BitkitLink.js";
|
|
4
|
-
import BitkitList_default from "../BitkitList/BitkitList.js";
|
|
5
5
|
import { getTextContent } from "../../utilities/getTextContent.js";
|
|
6
6
|
import { chakra, useSlotRecipe } from "@chakra-ui/react/styled-system";
|
|
7
7
|
import { forwardRef } from "react";
|
|
@@ -3,8 +3,8 @@ import IconChevronDown from "../../icons/IconChevronDown.js";
|
|
|
3
3
|
import IconChevronUp from "../../icons/IconChevronUp.js";
|
|
4
4
|
import { ICON_COMPONENTS_MAP } from "../common/notificationMaps.js";
|
|
5
5
|
import BitkitButton from "../BitkitButton/BitkitButton.js";
|
|
6
|
-
import BitkitLinkButton from "../BitkitLinkButton/BitkitLinkButton.js";
|
|
7
6
|
import BitkitList_default from "../BitkitList/BitkitList.js";
|
|
7
|
+
import BitkitLinkButton from "../BitkitLinkButton/BitkitLinkButton.js";
|
|
8
8
|
import { Box } from "@chakra-ui/react/box";
|
|
9
9
|
import { useSlotRecipe } from "@chakra-ui/react/styled-system";
|
|
10
10
|
import { forwardRef, useState } from "react";
|
|
@@ -28,6 +28,12 @@ export { default as BitkitEmptyState, type BitkitEmptyStateProps } from './Bitki
|
|
|
28
28
|
export { default as BitkitExpandableCard, type BitkitExpandableCardProps, } from './BitkitExpandableCard/BitkitExpandableCard';
|
|
29
29
|
export { default as BitkitField, type BitkitFieldProps } from './BitkitField/BitkitField';
|
|
30
30
|
export { default as BitkitFileInput, type BitkitFileInputProps } from './BitkitFileInput/BitkitFileInput';
|
|
31
|
+
export { default as BitkitFilter, type BitkitFilterProps } from './BitkitFilter/BitkitFilter';
|
|
32
|
+
export { type BitkitFilterAddProps } from './BitkitFilter/BitkitFilterAdd';
|
|
33
|
+
export { type BitkitFilterDateRangeProps, type BitkitFilterDateRangeValue } from './BitkitFilter/BitkitFilterDateRange';
|
|
34
|
+
export { type BitkitFilterSearchProps } from './BitkitFilter/BitkitFilterSearch';
|
|
35
|
+
export { type BitkitFilterSelectItem, type BitkitFilterSelectProps } from './BitkitFilter/BitkitFilterSelect';
|
|
36
|
+
export { type BitkitFilterSwitchItem, type BitkitFilterSwitchProps } from './BitkitFilter/BitkitFilterSwitch';
|
|
31
37
|
export { default as BitkitGroupHeading, type BitkitGroupHeadingProps } from './BitkitGroupHeading/BitkitGroupHeading';
|
|
32
38
|
export { default as BitkitHeading, type BitkitHeadingProps } from './BitkitHeading/BitkitHeading';
|
|
33
39
|
export { default as BitkitIconButton, type BitkitIconButtonProps } from './BitkitIconButton/BitkitIconButton';
|
|
@@ -94,6 +100,5 @@ export { default as BitkitToggletip, type BitkitToggletipProps } from './BitkitT
|
|
|
94
100
|
export { default as BitkitTooltip, type BitkitTooltipProps } from './BitkitTooltip/BitkitTooltip';
|
|
95
101
|
export { default as BitkitTour, type BitkitTourInstance, type BitkitTourOptions, type BitkitTourProps, type BitkitTourSecondaryAction, type BitkitTourStep, useBitkitTour, } from './BitkitTour/BitkitTour';
|
|
96
102
|
export { default as BitkitTreeView, type BitkitTreeViewBranchProps, type BitkitTreeViewExpandedChangeDetails, type BitkitTreeViewLeafProps, type BitkitTreeViewNodeRenderProps, type BitkitTreeViewRootProps, type BitkitTreeViewSelectionChangeDetails, createTreeCollection, } from './BitkitTreeView/BitkitTreeView';
|
|
97
|
-
export { default as BitkitUIHeader, type BitkitUIHeaderAccountProps, type BitkitUIHeaderButtonProps, type BitkitUIHeaderControlAsAnchorProps, type BitkitUIHeaderControlAsButtonProps, type BitkitUIHeaderControlProps, type BitkitUIHeaderNavButtonProps, type BitkitUIHeaderProps, type BitkitUIHeaderSearchProps, uiHeaderHeight, } from './BitkitUIHeader/BitkitUIHeader';
|
|
98
103
|
export { default as BitkitUISideNav, type BitkitUISideNavBodyProps, type BitkitUISideNavFooterHeadingProps, type BitkitUISideNavFooterProps, type BitkitUISideNavItemProps, type BitkitUISideNavLinkAsAnchorProps, type BitkitUISideNavLinkAsButtonProps, type BitkitUISideNavLinkProps, type BitkitUISideNavProps, type BitkitUISideNavWorkspaceProps, type BitkitUISideNavWorkspaceSelectorProps, uiSideNavRailWidth, } from './BitkitUISideNav/BitkitUISideNav';
|
|
99
104
|
export { useUISideNav } from './BitkitUISideNav/UISideNavContext';
|
package/dist/main.js
CHANGED
|
@@ -306,8 +306,8 @@ import BitkitBadge from "./components/BitkitBadge/BitkitBadge.js";
|
|
|
306
306
|
import BitkitControlButton from "./components/BitkitControlButton/BitkitControlButton.js";
|
|
307
307
|
import BitkitBreadcrumb from "./components/BitkitBreadcrumb/BitkitBreadcrumb.js";
|
|
308
308
|
import BitkitButton from "./components/BitkitButton/BitkitButton.js";
|
|
309
|
-
import BitkitGroupHeading from "./components/BitkitGroupHeading/BitkitGroupHeading.js";
|
|
310
309
|
import BitkitTooltip from "./components/BitkitTooltip/BitkitTooltip.js";
|
|
310
|
+
import BitkitGroupHeading from "./components/BitkitGroupHeading/BitkitGroupHeading.js";
|
|
311
311
|
import BitkitSelectMenuAction from "./components/BitkitSelectMenu/BitkitSelectMenuAction.js";
|
|
312
312
|
import BitkitSelectMenu from "./components/BitkitSelectMenu/BitkitSelectMenu.js";
|
|
313
313
|
import BitkitCalendar from "./components/BitkitCalendar/BitkitCalendar.js";
|
|
@@ -332,14 +332,18 @@ import BitkitDrawer from "./components/BitkitDrawer/BitkitDrawer.js";
|
|
|
332
332
|
import BitkitEmptyState from "./components/BitkitEmptyState/BitkitEmptyState.js";
|
|
333
333
|
import BitkitExpandableCard from "./components/BitkitExpandableCard/BitkitExpandableCard.js";
|
|
334
334
|
import BitkitFileInput from "./components/BitkitFileInput/BitkitFileInput.js";
|
|
335
|
+
import useResponsive, { ResponsiveProvider } from "./hooks/useResponsive.js";
|
|
336
|
+
import BitkitInlineLoading from "./components/BitkitInlineLoading/BitkitInlineLoading.js";
|
|
337
|
+
import BitkitList_default from "./components/BitkitList/BitkitList.js";
|
|
338
|
+
import BitkitTextInput from "./components/BitkitTextInput/BitkitTextInput.js";
|
|
339
|
+
import BitkitSearchInput from "./components/BitkitSearchInput/BitkitSearchInput.js";
|
|
340
|
+
import BitkitFilter_default from "./components/BitkitFilter/BitkitFilter.js";
|
|
335
341
|
import BitkitHeading from "./components/BitkitHeading/BitkitHeading.js";
|
|
336
342
|
import BitkitIconButton from "./components/BitkitIconButton/BitkitIconButton.js";
|
|
337
|
-
import BitkitInlineLoading from "./components/BitkitInlineLoading/BitkitInlineLoading.js";
|
|
338
343
|
import BitkitLabeledData from "./components/BitkitLabeledData/BitkitLabeledData.js";
|
|
339
344
|
import BitkitLightbox from "./components/BitkitLightbox/BitkitLightbox.js";
|
|
340
345
|
import BitkitLink from "./components/BitkitLink/BitkitLink.js";
|
|
341
346
|
import BitkitLinkButton from "./components/BitkitLinkButton/BitkitLinkButton.js";
|
|
342
|
-
import BitkitList_default from "./components/BitkitList/BitkitList.js";
|
|
343
347
|
import BitkitMarkdown from "./components/BitkitMarkdown/BitkitMarkdown.js";
|
|
344
348
|
import BitkitMarkdownCard from "./components/BitkitMarkdownCard/BitkitMarkdownCard.js";
|
|
345
349
|
import BitkitMultiselectMenu from "./components/BitkitMultiselectMenu/BitkitMultiselectMenu.js";
|
|
@@ -361,8 +365,6 @@ import BitkitPromoBanner from "./components/BitkitPromoBanner/BitkitPromoBanner.
|
|
|
361
365
|
import BitkitRadio from "./components/BitkitRadio/BitkitRadio.js";
|
|
362
366
|
import BitkitRadioGroup from "./components/BitkitRadioGroup/BitkitRadioGroup.js";
|
|
363
367
|
import BitkitRibbon from "./components/BitkitRibbon/BitkitRibbon.js";
|
|
364
|
-
import BitkitTextInput from "./components/BitkitTextInput/BitkitTextInput.js";
|
|
365
|
-
import BitkitSearchInput from "./components/BitkitSearchInput/BitkitSearchInput.js";
|
|
366
368
|
import BitkitSectionHeading from "./components/BitkitSectionHeading/BitkitSectionHeading.js";
|
|
367
369
|
import BitkitSegmentedControl_default from "./components/BitkitSegmentedControl/BitkitSegmentedControl.js";
|
|
368
370
|
import BitkitSelect_default from "./components/BitkitSelect/BitkitSelect.js";
|
|
@@ -383,12 +385,9 @@ import createBitkitToast, { dismissBitkitToast } from "./components/BitkitToast/
|
|
|
383
385
|
import BitkitToggleButton from "./components/BitkitToggleButton/BitkitToggleButton.js";
|
|
384
386
|
import BitkitTour, { useBitkitTour } from "./components/BitkitTour/BitkitTour.js";
|
|
385
387
|
import BitkitTreeView, { createTreeCollection } from "./components/BitkitTreeView/BitkitTreeView.js";
|
|
386
|
-
import { uiHeaderHeight } from "./theme/slot-recipes/UIHeader.recipe.js";
|
|
387
|
-
import BitkitUIHeader_default from "./components/BitkitUIHeader/BitkitUIHeader.js";
|
|
388
|
-
import useResponsive, { ResponsiveProvider } from "./hooks/useResponsive.js";
|
|
389
388
|
import { useUISideNav } from "./components/BitkitUISideNav/UISideNavContext.js";
|
|
390
389
|
import { uiSideNavRailWidth } from "./theme/slot-recipes/UISideNav.recipe.js";
|
|
391
390
|
import BitkitUISideNav_default from "./components/BitkitUISideNav/BitkitUISideNav.js";
|
|
392
391
|
import bitkitTheme from "./theme/index.js";
|
|
393
392
|
import Provider from "./providers/BitkitProvider.js";
|
|
394
|
-
export { BitkitAccordion_default as BitkitAccordion, BitkitActionBar, BitkitActionMenu_default as BitkitActionMenu, BitkitAlert, BitkitAvatar, BitkitBadge, BitkitBreadcrumb, BitkitButton, BitkitCalendar, BitkitCheckbox, BitkitCheckboxGroup, BitkitCloseButton, BitkitCodeSnippet, BitkitCollapsible, BitkitColorButton, BitkitCombobox_default as BitkitCombobox, BitkitControlButton, BitkitDataWidget, BitkitDatePicker, BitkitDefinitionTooltip, BitkitDialog_default as BitkitDialog, BitkitDraggableCard, BitkitDrawer, BitkitEmptyState, BitkitExpandableCard, BitkitField, BitkitFileInput, BitkitFormDialog_default as BitkitFormDialog, BitkitGroupHeading, BitkitHeading, BitkitIconButton, BitkitInlineLoading, BitkitLabel, BitkitLabelTooltip, BitkitLabeledData, BitkitLightbox, BitkitLink, BitkitLinkButton, BitkitList_default as BitkitList, BitkitMarkdown, BitkitMarkdownCard, BitkitMultiselect_default as BitkitMultiselect, BitkitMultiselectMenu, BitkitNativeSelect, BitkitNoteCard, BitkitNumberInput, BitkitOverflowContent, BitkitOverflowTooltip, BitkitPageFooter_default as BitkitPageFooter, BitkitPageHeader, BitkitPageSidebar_default as BitkitPageSidebar, BitkitPagination, BitkitPaginationLoadMore, BitkitPopover, BitkitProgressBar, BitkitPromoBanner, Provider as BitkitProvider, BitkitRadio, BitkitRadioGroup, BitkitRibbon, BitkitSearchInput, BitkitSectionHeading, BitkitSegmentedControl_default as BitkitSegmentedControl, BitkitSelect_default as BitkitSelect, BitkitSelectMenu, BitkitSelectMenuAction, BitkitSelectableTag_default as BitkitSelectableTag, BitkitSettingsCard_default as BitkitSettingsCard, BitkitSkeletonGroup, BitkitSpinner, BitkitSplitButton_default as BitkitSplitButton, BitkitStat, BitkitSteps_default as BitkitSteps, BitkitStepsCard_default as BitkitStepsCard, BitkitStepsDialog_default as BitkitStepsDialog, BitkitSwitch, BitkitTable, BitkitTableCard, BitkitTabs, BitkitTag, BitkitTagsInput, BitkitTextArea, BitkitTextInput, BitkitToggleButton, BitkitToggletip, BitkitTooltip, BitkitTour, BitkitTreeView,
|
|
393
|
+
export { BitkitAccordion_default as BitkitAccordion, BitkitActionBar, BitkitActionMenu_default as BitkitActionMenu, BitkitAlert, BitkitAvatar, BitkitBadge, BitkitBreadcrumb, BitkitButton, BitkitCalendar, BitkitCheckbox, BitkitCheckboxGroup, BitkitCloseButton, BitkitCodeSnippet, BitkitCollapsible, BitkitColorButton, BitkitCombobox_default as BitkitCombobox, BitkitControlButton, BitkitDataWidget, BitkitDatePicker, BitkitDefinitionTooltip, BitkitDialog_default as BitkitDialog, BitkitDraggableCard, BitkitDrawer, BitkitEmptyState, BitkitExpandableCard, BitkitField, BitkitFileInput, BitkitFilter_default as BitkitFilter, BitkitFormDialog_default as BitkitFormDialog, BitkitGroupHeading, BitkitHeading, BitkitIconButton, BitkitInlineLoading, BitkitLabel, BitkitLabelTooltip, BitkitLabeledData, BitkitLightbox, BitkitLink, BitkitLinkButton, BitkitList_default as BitkitList, BitkitMarkdown, BitkitMarkdownCard, BitkitMultiselect_default as BitkitMultiselect, BitkitMultiselectMenu, BitkitNativeSelect, BitkitNoteCard, BitkitNumberInput, BitkitOverflowContent, BitkitOverflowTooltip, BitkitPageFooter_default as BitkitPageFooter, BitkitPageHeader, BitkitPageSidebar_default as BitkitPageSidebar, BitkitPagination, BitkitPaginationLoadMore, BitkitPopover, BitkitProgressBar, BitkitPromoBanner, Provider as BitkitProvider, BitkitRadio, BitkitRadioGroup, BitkitRibbon, BitkitSearchInput, BitkitSectionHeading, BitkitSegmentedControl_default as BitkitSegmentedControl, BitkitSelect_default as BitkitSelect, BitkitSelectMenu, BitkitSelectMenuAction, BitkitSelectableTag_default as BitkitSelectableTag, BitkitSettingsCard_default as BitkitSettingsCard, BitkitSkeletonGroup, BitkitSpinner, BitkitSplitButton_default as BitkitSplitButton, BitkitStat, BitkitSteps_default as BitkitSteps, BitkitStepsCard_default as BitkitStepsCard, BitkitStepsDialog_default as BitkitStepsDialog, BitkitSwitch, BitkitTable, BitkitTableCard, BitkitTabs, BitkitTag, BitkitTagsInput, BitkitTextArea, BitkitTextInput, BitkitToggleButton, BitkitToggletip, BitkitTooltip, BitkitTour, BitkitTreeView, BitkitUISideNav_default as BitkitUISideNav, IconAbortCircle, IconAbortCircleFilled, IconAddons, IconAgent, IconAnchor, IconAndroid, IconApp, IconAppSettings, IconAppStore, IconAppStoreColor, IconApple, IconArchive, IconArchiveDelete, IconArchiveRestore, IconArrowBackAndDown, IconArrowBackAndUp, IconArrowDown, IconArrowForwardAndDown, IconArrowForwardAndUp, IconArrowLeft, IconArrowNortheast, IconArrowNorthwest, IconArrowRight, IconArrowUp, IconArrowsHorizontal, IconArrowsVertical, IconAutomation, IconAws, IconAwsColor, IconBadge3RdParty, IconBadgeBitrise, IconBadgeUpgrade, IconBadgeVersionOk, IconBazel, IconBell, IconBitbot, IconBitbotError, IconBitbucket, IconBitbucketColor, IconBitbucketNeutral, IconBitbucketWhite, IconBlockCircle, IconBook, IconBoxArrowDown, IconBoxDot, IconBoxLinesOverflow, IconBoxLinesWrap, IconBranch, IconBrowserstackColor, IconBug, IconBuild, IconBuildCache, IconBuildCacheFilled, IconBuildEnvSetup, IconBuildHub, IconBuildHubFilled, IconCalendar, IconChangePlan, IconChat, IconCheck, IconCheckCircle, IconCheckCircleFilled, IconChevronDown, IconChevronLeft, IconChevronRight, IconChevronUp, IconCi, IconCiFilled, IconCircle, IconCircleDashed, IconCircleHalfFilled, IconClaude, IconClaudeColor, IconClock, IconCode, IconCodePush, IconCodeSigning, IconCoffee, IconCommit, IconConfigure, IconConnectedAccounts, IconContainer, IconCopilot, IconCopy, IconCordova, IconCpu, IconCreditcard, IconCredits, IconCross, IconCrossCircle, IconCrossCircleFilled, IconCrown, IconCursor, IconCycle, IconDashboard, IconDashboardFilled, IconDeployment, IconDetails, IconDoc, IconDollar, IconDot, IconDotnet, IconDotnetColor, IconDotnetText, IconDotnetTextColor, IconDoubleCircle, IconDownload, IconDragHandle, IconEc2Ami, IconEnterprise, IconErrorCircle, IconErrorCircleFilled, IconExpand, IconExtraBuildCapacity, IconEye, IconEyeSlash, IconFastlane, IconFile, IconFileDoc, IconFilePdf, IconFilePlist, IconFileYml, IconFileZip, IconFilter, IconFlag, IconFlutter, IconFolder, IconFullscreen, IconFullscreenExit, IconGauge, IconGit, IconGithub, IconGitlab, IconGitlabColor, IconGitlabWhite, IconGlobe, IconGo, IconGoogleColor, IconGooglePlay, IconGooglePlayColor, IconGradle, IconGroup, IconHashtag, IconHeadset, IconHeart, IconHistory, IconHourglass, IconImage, IconInfoCircle, IconInfoCircleFilled, IconInsights, IconInsightsFilled, IconInstall, IconInteraction, IconInvoice, IconIonic, IconJapanese, IconJava, IconJavaColor, IconJavaDuke, IconJavaDukeColor, IconKey, IconKiroColor, IconKotlin, IconKotlinColor, IconKotlinWhite, IconLaptop, IconLaunchdarkly, IconLegacyApp, IconLightbulb, IconLink, IconLinux, IconLock, IconLockOpen, IconLogin, IconLogout, IconMacos, IconMagicWand, IconMagnifier, IconMail, IconMcp, IconMedal, IconMemory, IconMenuGrid, IconMenuHamburger, IconMessage, IconMessageAlert, IconMessageQuestion, IconMicrophone, IconMinus, IconMinusCircle, IconMinusCircleFilled, IconMobile, IconMobileLandscape, IconMonitorChart, IconMoreHorizontal, IconMoreVertical, IconNews, IconNextjs, IconNodejs, IconOpenInNew, IconOther, IconOutsideContributor, IconOverview, IconPause, IconPencil, IconPeople, IconPercent, IconPerson, IconPersonWithDesk, IconPin, IconPlay, IconPlus, IconPlusCircle, IconPlusCircleFilled, IconPower, IconProject, IconProjectSettings, IconPull, IconPush, IconPuzzle, IconPython, IconPythonColor, IconQuestionCircle, IconQuestionCircleFilled, IconReact, IconRefresh, IconRegex, IconRelease, IconReleaseFilled, IconRemoteAccess, IconReplace, IconResponsiveness, IconReviewerApproved, IconReviewerAssigned, IconReviewerRejected, IconRuby, IconRubyColor, IconSave, IconSecurityShield, IconSettings, IconSettingsFilled, IconShuffle, IconSiren, IconSkip, IconSkipCircle, IconSkipCircleFilled, IconSlack, IconSlackColor, IconSparkle, IconSparkleFilled, IconSpinnerOnDisabled, IconSpinnerPurple, IconSpinnerPurpleDouble, IconSpinnerWhite, IconStability, IconStack, IconStar, IconStep, IconStop, IconStopwatch, IconTabPlus, IconTag, IconTasks, IconTeams, IconTeamsColor, IconTemplateCode, IconTerminal, IconTerminalFilled, IconTestQuarantine, IconThemeDarkToggle, IconThumbDown, IconThumbUp, IconTools, IconTrash, IconTrigger, IconUbuntu, IconUbuntuColor, IconUnity3D, IconUnpin, IconUpload, IconValidateShield, IconVideo, IconVsCode, IconWarning, IconWarningYellow, IconWebUi, IconWebhooks, IconWindsurf, IconWorkflow, IconWorkflowFlow, IconXTwitter, IconXamarin, IconXcode, ResponsiveProvider, bitkitIcon, bitkitTheme as bitriseTheme, createBitkitToast, createTreeCollection, dismissBitkitToast, rem, uiSideNavRailWidth, useBitkitTour, useResponsive, useStepsDialog, useUISideNav };
|