@bitrise/bitkit-v2 0.3.360 → 0.3.362

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. package/dist/components/BitkitControlButton/BitkitControlButton.js +0 -1
  2. package/dist/components/BitkitControlButton/BitkitControlButton.js.map +1 -1
  3. package/dist/components/BitkitGroupHeading/BitkitGroupHeading.d.ts +0 -2
  4. package/dist/components/BitkitGroupHeading/BitkitGroupHeading.js +11 -15
  5. package/dist/components/BitkitGroupHeading/BitkitGroupHeading.js.map +1 -1
  6. package/dist/components/BitkitSidebar/BitkitSidebar.d.ts +45 -0
  7. package/dist/components/BitkitSidebar/BitkitSidebar.js +147 -0
  8. package/dist/components/BitkitSidebar/BitkitSidebar.js.map +1 -0
  9. package/dist/components/index.d.ts +1 -1
  10. package/dist/main.js +2 -2
  11. package/dist/theme/slot-recipes/DataWidget.recipe.js +4 -4
  12. package/dist/theme/slot-recipes/DataWidget.recipe.js.map +1 -1
  13. package/dist/theme/slot-recipes/GroupHeading.recipe.js +1 -4
  14. package/dist/theme/slot-recipes/GroupHeading.recipe.js.map +1 -1
  15. package/dist/theme/slot-recipes/Sidebar.recipe.d.ts +22 -0
  16. package/dist/theme/slot-recipes/Sidebar.recipe.js +143 -0
  17. package/dist/theme/slot-recipes/Sidebar.recipe.js.map +1 -0
  18. package/dist/theme/slot-recipes/index.d.ts +21 -81
  19. package/dist/theme/slot-recipes/index.js +2 -2
  20. package/dist/theme/slot-recipes/index.js.map +1 -1
  21. package/docs/v1-to-v2-migration-guide.md +6 -9
  22. package/package.json +1 -1
  23. package/dist/components/BitkitPageSidebar/BitkitPageSidebar.d.ts +0 -74
  24. package/dist/components/BitkitPageSidebar/BitkitPageSidebar.js +0 -244
  25. package/dist/components/BitkitPageSidebar/BitkitPageSidebar.js.map +0 -1
  26. package/dist/theme/slot-recipes/PageSidebar.recipe.d.ts +0 -82
  27. package/dist/theme/slot-recipes/PageSidebar.recipe.js +0 -230
  28. package/dist/theme/slot-recipes/PageSidebar.recipe.js.map +0 -1
  29. package/dist/utilities/useIsTruncated.d.ts +0 -27
  30. package/dist/utilities/useIsTruncated.js +0 -51
  31. package/dist/utilities/useIsTruncated.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Sidebar.recipe.js","names":[],"sources":["../../../lib/theme/slot-recipes/Sidebar.recipe.ts"],"sourcesContent":["import { defineSlotRecipe } from '@chakra-ui/react/styled-system';\n\nimport { rem } from '../themeUtils';\n\nconst sidebarSlotRecipe = defineSlotRecipe({\n className: 'sidebar',\n slots: [\n 'divider',\n 'suffixIcon',\n 'footer',\n 'item',\n 'itemIcon',\n 'itemLabel',\n 'project',\n 'projectLabel',\n 'projectValue',\n 'root',\n 'selectionMarker',\n 'title',\n 'titleWithBack',\n ],\n base: {\n root: {\n background: 'background/primary',\n borderInlineEnd: '1px solid',\n borderColor: 'border/regular',\n display: 'flex',\n flexDirection: 'column',\n width: rem(256),\n height: '100dvh',\n },\n item: {\n alignItems: 'center',\n cursor: 'pointer',\n display: 'flex',\n gap: '16',\n overflow: 'clip',\n paddingBlock: '12',\n paddingInlineEnd: '24',\n paddingInlineStart: '32',\n position: 'relative',\n width: 'full',\n _hover: {\n background: 'background/hover',\n },\n },\n itemIcon: {\n color: 'icon/secondary',\n flexShrink: 0,\n },\n itemLabel: {\n color: 'text/primary',\n flex: 1,\n minWidth: 0,\n overflow: 'hidden',\n textAlign: 'start',\n textOverflow: 'ellipsis',\n textStyle: 'body/lg/regular',\n whiteSpace: 'nowrap',\n },\n suffixIcon: {\n color: 'icon/tertiary',\n display: 'none',\n flexShrink: 0,\n _groupHover: {\n display: 'block',\n },\n },\n selectionMarker: {\n background: 'border/selected',\n borderStartEndRadius: '2',\n borderEndEndRadius: '2',\n display: 'none',\n height: 'full',\n insetBlockStart: 0,\n insetInlineEnd: 0,\n position: 'absolute',\n width: '2',\n },\n footer: {\n borderBlockStart: '1px solid',\n borderColor: 'border/regular',\n display: 'flex',\n flexDirection: 'column',\n marginBlockStart: 'auto',\n paddingBlock: '12',\n },\n project: {\n display: 'flex',\n flexDirection: 'column',\n gap: '4',\n justifyContent: 'center',\n overflow: 'clip',\n paddingBlockEnd: '12',\n paddingBlockStart: '8',\n paddingInlineEnd: '24',\n paddingInlineStart: '32',\n whiteSpace: 'nowrap',\n },\n projectLabel: {\n color: 'text/tertiary',\n textStyle: 'heading/h6',\n },\n projectValue: {\n color: 'text/body',\n textStyle: 'body/lg/semibold',\n },\n title: {\n alignItems: 'center',\n color: 'text/primary',\n display: 'flex',\n gap: '12',\n paddingBlock: '16',\n paddingInlineEnd: '8',\n paddingInlineStart: '32',\n textStyle: 'heading/h3',\n },\n titleWithBack: {\n alignItems: 'center',\n color: 'text/primary',\n display: 'flex',\n gap: '12',\n paddingBlockEnd: '16',\n paddingBlockStart: '24',\n paddingInlineEnd: '8',\n paddingInlineStart: '24',\n textStyle: 'heading/h3',\n },\n divider: {\n marginInline: '32',\n marginBlock: '24',\n width: 'auto',\n },\n },\n variants: {\n selected: {\n true: {\n item: {\n background: 'background/selected',\n _hover: {\n background: 'background/selected-hover',\n },\n },\n itemIcon: {\n color: 'icon/interactive',\n },\n itemLabel: {\n textStyle: 'body/lg/semibold',\n },\n selectionMarker: {\n display: 'block',\n },\n },\n },\n },\n});\n\nexport default sidebarSlotRecipe;\n"],"mappings":";;;AAIA,IAAM,oBAAoB,iBAAiB;CACzC,WAAW;CACX,OAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF;CACA,MAAM;EACJ,MAAM;GACJ,YAAY;GACZ,iBAAiB;GACjB,aAAa;GACb,SAAS;GACT,eAAe;GACf,OAAO,IAAI,GAAG;GACd,QAAQ;EACV;EACA,MAAM;GACJ,YAAY;GACZ,QAAQ;GACR,SAAS;GACT,KAAK;GACL,UAAU;GACV,cAAc;GACd,kBAAkB;GAClB,oBAAoB;GACpB,UAAU;GACV,OAAO;GACP,QAAQ,EACN,YAAY,mBACd;EACF;EACA,UAAU;GACR,OAAO;GACP,YAAY;EACd;EACA,WAAW;GACT,OAAO;GACP,MAAM;GACN,UAAU;GACV,UAAU;GACV,WAAW;GACX,cAAc;GACd,WAAW;GACX,YAAY;EACd;EACA,YAAY;GACV,OAAO;GACP,SAAS;GACT,YAAY;GACZ,aAAa,EACX,SAAS,QACX;EACF;EACA,iBAAiB;GACf,YAAY;GACZ,sBAAsB;GACtB,oBAAoB;GACpB,SAAS;GACT,QAAQ;GACR,iBAAiB;GACjB,gBAAgB;GAChB,UAAU;GACV,OAAO;EACT;EACA,QAAQ;GACN,kBAAkB;GAClB,aAAa;GACb,SAAS;GACT,eAAe;GACf,kBAAkB;GAClB,cAAc;EAChB;EACA,SAAS;GACP,SAAS;GACT,eAAe;GACf,KAAK;GACL,gBAAgB;GAChB,UAAU;GACV,iBAAiB;GACjB,mBAAmB;GACnB,kBAAkB;GAClB,oBAAoB;GACpB,YAAY;EACd;EACA,cAAc;GACZ,OAAO;GACP,WAAW;EACb;EACA,cAAc;GACZ,OAAO;GACP,WAAW;EACb;EACA,OAAO;GACL,YAAY;GACZ,OAAO;GACP,SAAS;GACT,KAAK;GACL,cAAc;GACd,kBAAkB;GAClB,oBAAoB;GACpB,WAAW;EACb;EACA,eAAe;GACb,YAAY;GACZ,OAAO;GACP,SAAS;GACT,KAAK;GACL,iBAAiB;GACjB,mBAAmB;GACnB,kBAAkB;GAClB,oBAAoB;GACpB,WAAW;EACb;EACA,SAAS;GACP,cAAc;GACd,aAAa;GACb,OAAO;EACT;CACF;CACA,UAAU,EACR,UAAU,EACR,MAAM;EACJ,MAAM;GACJ,YAAY;GACZ,QAAQ,EACN,YAAY,4BACd;EACF;EACA,UAAU,EACR,OAAO,mBACT;EACA,WAAW,EACT,WAAW,mBACb;EACA,iBAAiB,EACf,SAAS,QACX;CACF,EACF,EACF;AACF,CAAC"}
@@ -1422,87 +1422,6 @@ declare const slotRecipes: {
1422
1422
  };
1423
1423
  };
1424
1424
  }>;
1425
- pageSidebar: import('@chakra-ui/react').SlotRecipeDefinition<"body" | "footer" | "title" | "root" | "item" | "titleText" | "suffixIcon" | "titleBlock" | "itemLabel" | "itemIcon" | "contentBlock" | "divider" | "project" | "projectLabel" | "projectValue" | "projectValueWrapper" | "selectionMarker", {
1426
- hasBack: {
1427
- true: {
1428
- title: {
1429
- paddingBlockEnd: "8";
1430
- paddingInlineStart: "16";
1431
- };
1432
- titleBlock: {
1433
- gap: "4";
1434
- paddingBlock: "4";
1435
- };
1436
- };
1437
- false: {
1438
- title: {
1439
- paddingBlockEnd: "16";
1440
- paddingInlineStart: "24";
1441
- };
1442
- titleBlock: {
1443
- paddingBlock: "6";
1444
- };
1445
- };
1446
- };
1447
- isDisabled: {
1448
- true: {
1449
- item: {
1450
- cursor: "not-allowed";
1451
- _hover: {
1452
- background: "transparent";
1453
- _active: {
1454
- background: "transparent";
1455
- };
1456
- };
1457
- _active: {
1458
- background: "transparent";
1459
- };
1460
- };
1461
- itemIcon: {
1462
- color: "icon/disabled";
1463
- _groupHover: {
1464
- color: "icon/disabled";
1465
- };
1466
- };
1467
- itemLabel: {
1468
- color: "text/disabled";
1469
- };
1470
- suffixIcon: {
1471
- display: "none";
1472
- _groupHover: {
1473
- display: "none";
1474
- };
1475
- };
1476
- };
1477
- false: {};
1478
- };
1479
- selected: {
1480
- true: {
1481
- item: {
1482
- background: "background/selected";
1483
- _hover: {
1484
- background: "background/selected-hover";
1485
- _active: {
1486
- background: "background/selected-active";
1487
- };
1488
- };
1489
- _active: {
1490
- background: "background/selected-active";
1491
- };
1492
- };
1493
- itemIcon: {
1494
- color: "icon/interactive";
1495
- _groupHover: {
1496
- color: "icon/interactive-hover";
1497
- };
1498
- };
1499
- itemLabel: {
1500
- textStyle: "body/md/semibold";
1501
- };
1502
- };
1503
- false: {};
1504
- };
1505
- }>;
1506
1425
  pagination: import('@chakra-ui/react').SlotRecipeDefinition<"text" | "root" | "itemsBlock" | "itemsSelect" | "pageBlock" | "pageSelect", {
1507
1426
  variant: {
1508
1427
  card: {
@@ -1839,6 +1758,27 @@ declare const slotRecipes: {
1839
1758
  };
1840
1759
  };
1841
1760
  }>;
1761
+ sidebar: import('@chakra-ui/react').SlotRecipeDefinition<"footer" | "title" | "root" | "item" | "suffixIcon" | "itemLabel" | "itemIcon" | "divider" | "project" | "projectLabel" | "projectValue" | "selectionMarker" | "titleWithBack", {
1762
+ selected: {
1763
+ true: {
1764
+ item: {
1765
+ background: "background/selected";
1766
+ _hover: {
1767
+ background: "background/selected-hover";
1768
+ };
1769
+ };
1770
+ itemIcon: {
1771
+ color: "icon/interactive";
1772
+ };
1773
+ itemLabel: {
1774
+ textStyle: "body/lg/semibold";
1775
+ };
1776
+ selectionMarker: {
1777
+ display: "block";
1778
+ };
1779
+ };
1780
+ };
1781
+ }>;
1842
1782
  select: import('@chakra-ui/react').SlotRecipeDefinition<"content" | "label" | "checkbox" | "list" | "avatar" | "emptyState" | "root" | "item" | "itemContent" | "itemIndicator" | "trigger" | "positioner" | "indicator" | "itemGroup" | "itemGroupLabel" | "itemText" | "valueText" | "action" | "clearTrigger" | "control" | "actionContainer" | "searchInputGroup" | "searchInput" | "searchClear" | "itemList" | "itemLoading" | "itemLoadingLabel" | "itemLabel" | "itemHelperText" | "indicatorGroup" | "checkmark" | "itemIcon" | "valueIcon", {
1843
1783
  hasStatusIcon: {
1844
1784
  true: {
@@ -34,7 +34,6 @@ import nativeSelectSlotRecipe from "./NativeSelect.recipe.js";
34
34
  import noteCardSlotRecipe from "./NoteCard.recipe.js";
35
35
  import overflowContentSlotRecipe from "./OverflowContent.recipe.js";
36
36
  import pageFooterSlotRecipe from "./PageFooter.recipe.js";
37
- import pageSidebarSlotRecipe from "./PageSidebar.recipe.js";
38
37
  import paginationSlotRecipe from "./Pagination.recipe.js";
39
38
  import paginationLoadMoreRecipe from "./PaginationLoadMore.recipe.js";
40
39
  import popoverSlotRecipe from "./Popover.recipe.js";
@@ -45,6 +44,7 @@ import ribbonSlotRecipe from "./Ribbon.recipe.js";
45
44
  import sectionHeadingRecipe from "./SectionHeading.recipe.js";
46
45
  import segmentGroupSlotRecipe from "./SegmentGroup.recipe.js";
47
46
  import settingsCardSlotRecipe from "./SettingsCard.recipe.js";
47
+ import sidebarSlotRecipe from "./Sidebar.recipe.js";
48
48
  import splitButtonSlotRecipe from "./SplitButton.recipe.js";
49
49
  import statSlotRecipe from "./Stat.recipe.js";
50
50
  import stepCardSlotRecipe from "./StepCard.recipe.js";
@@ -95,7 +95,6 @@ var slotRecipes = {
95
95
  numberInput: numberInputSlotRecipe,
96
96
  overflowContent: overflowContentSlotRecipe,
97
97
  pageFooter: pageFooterSlotRecipe,
98
- pageSidebar: pageSidebarSlotRecipe,
99
98
  pagination: paginationSlotRecipe,
100
99
  paginationLoadMore: paginationLoadMoreRecipe,
101
100
  popover: popoverSlotRecipe,
@@ -106,6 +105,7 @@ var slotRecipes = {
106
105
  sectionHeading: sectionHeadingRecipe,
107
106
  labeledData: labeledDataSlotRecipe,
108
107
  segmentGroup: segmentGroupSlotRecipe,
108
+ sidebar: sidebarSlotRecipe,
109
109
  select: selectSlotRecipe,
110
110
  settingsCard: settingsCardSlotRecipe,
111
111
  splitButton: splitButtonSlotRecipe,
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../lib/theme/slot-recipes/index.ts"],"sourcesContent":["import accordionSlotRecipe from './Accordion.recipe.ts';\nimport actionBarSlotRecipe from './ActionBar.recipe.ts';\nimport alertSlotRecipe from './Alert.recipe.ts';\nimport avatarSlotRecipe from './Avatar.recipe.ts';\nimport breadcrumbSlotRecipe from './Breadcrumb.recipe.ts';\nimport cardSlotRecipe from './Card.recipe';\nimport checkboxSlotRecipe from './Checkbox.recipe';\nimport codeSnippetSlotRecipe from './CodeSnippet.recipe.ts';\nimport collapsibleSlotRecipe from './Collapsible.recipe.ts';\nimport comboboxSlotRecipe from './Combobox.recipe.ts';\nimport dataWidgetSlotRecipe from './DataWidget.recipe.ts';\nimport datePickerSlotRecipe from './DatePicker.recipe.ts';\nimport datePickerSelectSlotRecipe from './DatePickerSelect.recipe.ts';\nimport dialogSlotRecipe from './Dialog.recipe.ts';\nimport draggableCardSlotRecipe from './DraggableCard.recipe.ts';\nimport drawerSlotRecipe from './Drawer.recipe.ts';\nimport emptyStateSlotRecipe from './EmptyState.recipe';\nimport expandableCardSlotRecipe from './ExpandableCard.recipe.ts';\nimport fieldSlotRecipe from './Field.recipe';\nimport fieldsetSlotRecipe from './Fieldset.recipe.ts';\nimport fileUploadSlotRecipe from './FileUpload.recipe.ts';\nimport groupHeadingSlotRecipe from './GroupHeading.recipe.ts';\nimport imageCropperSlotRecipe from './ImageCropper.recipe.ts';\nimport inlineLoadingSlotRecipe from './InlineLoading.recipe.ts';\nimport labeledDataSlotRecipe from './LabeledData.recipe.ts';\nimport listSlotRecipe from './List.recipe.ts';\nimport markdownSlotRecipe from './Markdown.recipe.ts';\nimport markdownCardSlotRecipe from './MarkdownCard.recipe.ts';\nimport menuSlotRecipe from './Menu.recipe.ts';\nimport multiselectSlotRecipe from './Multiselect.recipe.ts';\nimport nativeSelectSlotRecipe from './NativeSelect.recipe.ts';\nimport noteCardSlotRecipe from './NoteCard.recipe.ts';\nimport numberInputSlotRecipe from './NumberInput.recipe';\nimport overflowContentSlotRecipe from './OverflowContent.recipe.ts';\nimport pageFooterSlotRecipe from './PageFooter.recipe.ts';\nimport pageSidebarSlotRecipe from './PageSidebar.recipe.ts';\nimport paginationSlotRecipe from './Pagination.recipe.ts';\nimport paginationLoadMoreSlotRecipe from './PaginationLoadMore.recipe.ts';\nimport popoverSlotRecipe from './Popover.recipe.ts';\nimport progressSlotRecipe from './Progress.recipe.ts';\nimport qrCodeSlotRecipe from './QrCode.recipe.ts';\nimport radioGroupSlotRecipe from './RadioGroup.recipe.ts';\nimport ribbonSlotRecipe from './Ribbon.recipe.ts';\nimport sectionHeadingSlotRecipe from './SectionHeading.recipe.ts';\nimport segmentGroupSlotRecipe from './SegmentGroup.recipe.ts';\nimport { selectSlotRecipe } from './Select.recipe.ts';\nimport settingsCardSlotRecipe from './SettingsCard.recipe.ts';\nimport splitButtonSlotRecipe from './SplitButton.recipe.ts';\nimport statSlotRecipe from './Stat.recipe.ts';\nimport stepCardSlotRecipe from './StepCard.recipe.ts';\nimport stepsSlotRecipe from './Steps.recipe.ts';\nimport switchSlotRecipe from './Switch.recipe';\nimport tableSlotRecipe from './Table.recipe.ts';\nimport tabsSlotRecipe from './Tabs.recipe';\nimport tagSlotRecipe from './Tag.recipe.ts';\nimport tagsInputSlotRecipe from './TagsInput.recipe.ts';\nimport textInputSlotRecipe from './TextInput.recipe.ts';\nimport toastSlotRecipe from './Toast.recipe';\nimport tooltipSlotRecipe from './Tooltip.recipe';\nimport tourSlotRecipe from './Tour.recipe.ts';\nimport treeViewSlotRecipe from './TreeView.recipe.ts';\n\nconst slotRecipes = {\n accordion: accordionSlotRecipe,\n actionBar: actionBarSlotRecipe,\n alert: alertSlotRecipe,\n avatar: avatarSlotRecipe,\n breadcrumb: breadcrumbSlotRecipe,\n card: cardSlotRecipe,\n checkbox: checkboxSlotRecipe,\n codeSnippet: codeSnippetSlotRecipe,\n collapsible: collapsibleSlotRecipe,\n combobox: comboboxSlotRecipe,\n dataWidget: dataWidgetSlotRecipe,\n datePicker: datePickerSlotRecipe,\n datePickerSelect: datePickerSelectSlotRecipe,\n dialog: dialogSlotRecipe,\n draggableCard: draggableCardSlotRecipe,\n drawer: drawerSlotRecipe,\n emptyState: emptyStateSlotRecipe,\n expandableCard: expandableCardSlotRecipe,\n field: fieldSlotRecipe,\n groupHeading: groupHeadingSlotRecipe,\n fieldset: fieldsetSlotRecipe,\n fileUpload: fileUploadSlotRecipe,\n imageCropper: imageCropperSlotRecipe,\n inlineLoading: inlineLoadingSlotRecipe,\n list: listSlotRecipe,\n markdown: markdownSlotRecipe,\n markdownCard: markdownCardSlotRecipe,\n menu: menuSlotRecipe,\n multiselect: multiselectSlotRecipe,\n noteCard: noteCardSlotRecipe,\n nativeSelect: nativeSelectSlotRecipe,\n numberInput: numberInputSlotRecipe,\n overflowContent: overflowContentSlotRecipe,\n pageFooter: pageFooterSlotRecipe,\n pageSidebar: pageSidebarSlotRecipe,\n pagination: paginationSlotRecipe,\n paginationLoadMore: paginationLoadMoreSlotRecipe,\n popover: popoverSlotRecipe,\n progress: progressSlotRecipe,\n qrCode: qrCodeSlotRecipe,\n radioGroup: radioGroupSlotRecipe,\n ribbon: ribbonSlotRecipe,\n sectionHeading: sectionHeadingSlotRecipe,\n labeledData: labeledDataSlotRecipe,\n segmentGroup: segmentGroupSlotRecipe,\n select: selectSlotRecipe,\n settingsCard: settingsCardSlotRecipe,\n splitButton: splitButtonSlotRecipe,\n stat: statSlotRecipe,\n stepsCard: stepCardSlotRecipe,\n steps: stepsSlotRecipe,\n switch: switchSlotRecipe,\n table: tableSlotRecipe,\n tabs: tabsSlotRecipe,\n tag: tagSlotRecipe,\n tagsInput: tagsInputSlotRecipe,\n textInput: textInputSlotRecipe,\n toast: toastSlotRecipe,\n tooltip: tooltipSlotRecipe,\n tour: tourSlotRecipe,\n treeView: treeViewSlotRecipe,\n};\n\nexport default slotRecipes;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8DA,IAAM,cAAc;CAClB,WAAW;CACX,WAAW;CACX,OAAO;CACP,QAAQ;CACR,YAAY;CACZ,MAAM;CACN,UAAU;CACV,aAAa;CACb,aAAa;CACb,UAAU;CACV,YAAY;CACZ,YAAY;CACZ,kBAAkB;CAClB,QAAQ;CACR,eAAe;CACf,QAAQ;CACR,YAAY;CACZ,gBAAgB;CAChB,OAAO;CACP,cAAc;CACd,UAAU;CACV,YAAY;CACZ,cAAc;CACd,eAAe;CACf,MAAM;CACN,UAAU;CACV,cAAc;CACd,MAAM;CACN,aAAa;CACb,UAAU;CACV,cAAc;CACd,aAAa;CACb,iBAAiB;CACjB,YAAY;CACZ,aAAa;CACb,YAAY;CACZ,oBAAoB;CACpB,SAAS;CACT,UAAU;CACV,QAAQ;CACR,YAAY;CACZ,QAAQ;CACR,gBAAgB;CAChB,aAAa;CACb,cAAc;CACd,QAAQ;CACR,cAAc;CACd,aAAa;CACb,MAAM;CACN,WAAW;CACX,OAAO;CACP,QAAQ;CACR,OAAO;CACP,MAAM;CACN,KAAK;CACL,WAAW;CACX,WAAW;CACX,OAAO;CACP,SAAS;CACT,MAAM;CACN,UAAU;AACZ"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../lib/theme/slot-recipes/index.ts"],"sourcesContent":["import accordionSlotRecipe from './Accordion.recipe.ts';\nimport actionBarSlotRecipe from './ActionBar.recipe.ts';\nimport alertSlotRecipe from './Alert.recipe.ts';\nimport avatarSlotRecipe from './Avatar.recipe.ts';\nimport breadcrumbSlotRecipe from './Breadcrumb.recipe.ts';\nimport cardSlotRecipe from './Card.recipe';\nimport checkboxSlotRecipe from './Checkbox.recipe';\nimport codeSnippetSlotRecipe from './CodeSnippet.recipe.ts';\nimport collapsibleSlotRecipe from './Collapsible.recipe.ts';\nimport comboboxSlotRecipe from './Combobox.recipe.ts';\nimport dataWidgetSlotRecipe from './DataWidget.recipe.ts';\nimport datePickerSlotRecipe from './DatePicker.recipe.ts';\nimport datePickerSelectSlotRecipe from './DatePickerSelect.recipe.ts';\nimport dialogSlotRecipe from './Dialog.recipe.ts';\nimport draggableCardSlotRecipe from './DraggableCard.recipe.ts';\nimport drawerSlotRecipe from './Drawer.recipe.ts';\nimport emptyStateSlotRecipe from './EmptyState.recipe';\nimport expandableCardSlotRecipe from './ExpandableCard.recipe.ts';\nimport fieldSlotRecipe from './Field.recipe';\nimport fieldsetSlotRecipe from './Fieldset.recipe.ts';\nimport fileUploadSlotRecipe from './FileUpload.recipe.ts';\nimport groupHeadingSlotRecipe from './GroupHeading.recipe.ts';\nimport imageCropperSlotRecipe from './ImageCropper.recipe.ts';\nimport inlineLoadingSlotRecipe from './InlineLoading.recipe.ts';\nimport labeledDataSlotRecipe from './LabeledData.recipe.ts';\nimport listSlotRecipe from './List.recipe.ts';\nimport markdownSlotRecipe from './Markdown.recipe.ts';\nimport markdownCardSlotRecipe from './MarkdownCard.recipe.ts';\nimport menuSlotRecipe from './Menu.recipe.ts';\nimport multiselectSlotRecipe from './Multiselect.recipe.ts';\nimport nativeSelectSlotRecipe from './NativeSelect.recipe.ts';\nimport noteCardSlotRecipe from './NoteCard.recipe.ts';\nimport numberInputSlotRecipe from './NumberInput.recipe';\nimport overflowContentSlotRecipe from './OverflowContent.recipe.ts';\nimport pageFooterSlotRecipe from './PageFooter.recipe.ts';\nimport paginationSlotRecipe from './Pagination.recipe.ts';\nimport paginationLoadMoreSlotRecipe from './PaginationLoadMore.recipe.ts';\nimport popoverSlotRecipe from './Popover.recipe.ts';\nimport progressSlotRecipe from './Progress.recipe.ts';\nimport qrCodeSlotRecipe from './QrCode.recipe.ts';\nimport radioGroupSlotRecipe from './RadioGroup.recipe.ts';\nimport ribbonSlotRecipe from './Ribbon.recipe.ts';\nimport sectionHeadingSlotRecipe from './SectionHeading.recipe.ts';\nimport segmentGroupSlotRecipe from './SegmentGroup.recipe.ts';\nimport { selectSlotRecipe } from './Select.recipe.ts';\nimport settingsCardSlotRecipe from './SettingsCard.recipe.ts';\nimport sidebarSlotRecipe from './Sidebar.recipe.ts';\nimport splitButtonSlotRecipe from './SplitButton.recipe.ts';\nimport statSlotRecipe from './Stat.recipe.ts';\nimport stepCardSlotRecipe from './StepCard.recipe.ts';\nimport stepsSlotRecipe from './Steps.recipe.ts';\nimport switchSlotRecipe from './Switch.recipe';\nimport tableSlotRecipe from './Table.recipe.ts';\nimport tabsSlotRecipe from './Tabs.recipe';\nimport tagSlotRecipe from './Tag.recipe.ts';\nimport tagsInputSlotRecipe from './TagsInput.recipe.ts';\nimport textInputSlotRecipe from './TextInput.recipe.ts';\nimport toastSlotRecipe from './Toast.recipe';\nimport tooltipSlotRecipe from './Tooltip.recipe';\nimport tourSlotRecipe from './Tour.recipe.ts';\nimport treeViewSlotRecipe from './TreeView.recipe.ts';\n\nconst slotRecipes = {\n accordion: accordionSlotRecipe,\n actionBar: actionBarSlotRecipe,\n alert: alertSlotRecipe,\n avatar: avatarSlotRecipe,\n breadcrumb: breadcrumbSlotRecipe,\n card: cardSlotRecipe,\n checkbox: checkboxSlotRecipe,\n codeSnippet: codeSnippetSlotRecipe,\n collapsible: collapsibleSlotRecipe,\n combobox: comboboxSlotRecipe,\n dataWidget: dataWidgetSlotRecipe,\n datePicker: datePickerSlotRecipe,\n datePickerSelect: datePickerSelectSlotRecipe,\n dialog: dialogSlotRecipe,\n draggableCard: draggableCardSlotRecipe,\n drawer: drawerSlotRecipe,\n emptyState: emptyStateSlotRecipe,\n expandableCard: expandableCardSlotRecipe,\n field: fieldSlotRecipe,\n groupHeading: groupHeadingSlotRecipe,\n fieldset: fieldsetSlotRecipe,\n fileUpload: fileUploadSlotRecipe,\n imageCropper: imageCropperSlotRecipe,\n inlineLoading: inlineLoadingSlotRecipe,\n list: listSlotRecipe,\n markdown: markdownSlotRecipe,\n markdownCard: markdownCardSlotRecipe,\n menu: menuSlotRecipe,\n multiselect: multiselectSlotRecipe,\n noteCard: noteCardSlotRecipe,\n nativeSelect: nativeSelectSlotRecipe,\n numberInput: numberInputSlotRecipe,\n overflowContent: overflowContentSlotRecipe,\n pageFooter: pageFooterSlotRecipe,\n pagination: paginationSlotRecipe,\n paginationLoadMore: paginationLoadMoreSlotRecipe,\n popover: popoverSlotRecipe,\n progress: progressSlotRecipe,\n qrCode: qrCodeSlotRecipe,\n radioGroup: radioGroupSlotRecipe,\n ribbon: ribbonSlotRecipe,\n sectionHeading: sectionHeadingSlotRecipe,\n labeledData: labeledDataSlotRecipe,\n segmentGroup: segmentGroupSlotRecipe,\n sidebar: sidebarSlotRecipe,\n select: selectSlotRecipe,\n settingsCard: settingsCardSlotRecipe,\n splitButton: splitButtonSlotRecipe,\n stat: statSlotRecipe,\n stepsCard: stepCardSlotRecipe,\n steps: stepsSlotRecipe,\n switch: switchSlotRecipe,\n table: tableSlotRecipe,\n tabs: tabsSlotRecipe,\n tag: tagSlotRecipe,\n tagsInput: tagsInputSlotRecipe,\n textInput: textInputSlotRecipe,\n toast: toastSlotRecipe,\n tooltip: tooltipSlotRecipe,\n tour: tourSlotRecipe,\n treeView: treeViewSlotRecipe,\n};\n\nexport default slotRecipes;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8DA,IAAM,cAAc;CAClB,WAAW;CACX,WAAW;CACX,OAAO;CACP,QAAQ;CACR,YAAY;CACZ,MAAM;CACN,UAAU;CACV,aAAa;CACb,aAAa;CACb,UAAU;CACV,YAAY;CACZ,YAAY;CACZ,kBAAkB;CAClB,QAAQ;CACR,eAAe;CACf,QAAQ;CACR,YAAY;CACZ,gBAAgB;CAChB,OAAO;CACP,cAAc;CACd,UAAU;CACV,YAAY;CACZ,cAAc;CACd,eAAe;CACf,MAAM;CACN,UAAU;CACV,cAAc;CACd,MAAM;CACN,aAAa;CACb,UAAU;CACV,cAAc;CACd,aAAa;CACb,iBAAiB;CACjB,YAAY;CACZ,YAAY;CACZ,oBAAoB;CACpB,SAAS;CACT,UAAU;CACV,QAAQ;CACR,YAAY;CACZ,QAAQ;CACR,gBAAgB;CAChB,aAAa;CACb,cAAc;CACd,SAAS;CACT,QAAQ;CACR,cAAc;CACd,aAAa;CACb,MAAM;CACN,WAAW;CACX,OAAO;CACP,QAAQ;CACR,OAAO;CACP,MAAM;CACN,KAAK;CACL,WAAW;CACX,WAAW;CACX,OAAO;CACP,SAAS;CACT,MAAM;CACN,UAAU;AACZ"}
@@ -249,15 +249,12 @@ If your codebase has a local `card.tsx` wrapper around v1 Card (e.g. Shadcn-styl
249
249
  ### Sidebar & Breadcrumb
250
250
 
251
251
  ```tsx
252
- // Sidebar v2 — note the rename: v1 `Sidebar` maps to `BitkitPageSidebar`.
253
- // It stands at least viewport-tall; an embedded panel opts out with `minHeight="auto"`.
254
- <BitkitPageSidebar>
255
- <BitkitPageSidebar.Title>Title</BitkitPageSidebar.Title>
256
- <BitkitPageSidebar.Body>
257
- <BitkitPageSidebar.GroupHeading label="Group" />
258
- <BitkitPageSidebar.Item icon={IconName} selected={...}>Label</BitkitPageSidebar.Item>
259
- </BitkitPageSidebar.Body>
260
- </BitkitPageSidebar>
252
+ // Sidebar v2
253
+ <BitkitSidebar>
254
+ <BitkitSidebar.Title>Title</BitkitSidebar.Title>
255
+ <BitkitSidebar.GroupHeading>Group</BitkitSidebar.GroupHeading>
256
+ <BitkitSidebar.Item icon={IconName} selected={...}>Label</BitkitSidebar.Item>
257
+ </BitkitSidebar>
261
258
 
262
259
  // Breadcrumb v2
263
260
  <BitkitBreadcrumb>
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@bitrise/bitkit-v2",
3
3
  "private": false,
4
- "version": "0.3.360",
4
+ "version": "0.3.362",
5
5
  "description": "Bitrise Design System Components built with Chakra UI V3",
6
6
  "keywords": [
7
7
  "react",
@@ -1,74 +0,0 @@
1
- import { BoxProps } from '@chakra-ui/react/box';
2
- import { SeparatorProps } from '@chakra-ui/react/separator';
3
- import { HTMLChakraProps } from '@chakra-ui/react/styled-system';
4
- import { ReactNode } from 'react';
5
- import { BitkitIconComponent } from '../../icons';
6
- import { BitkitGroupHeadingProps } from '../BitkitGroupHeading/BitkitGroupHeading';
7
- export interface BitkitPageSidebarProps extends BoxProps {
8
- children: ReactNode;
9
- }
10
- interface BitkitPageSidebarItemCommonProps {
11
- badge?: ReactNode;
12
- /**
13
- * The item's label. Typed as a string rather than `ReactNode` because the row truncates it with
14
- * an ellipsis, and the overflow tooltip needs the full text to reveal.
15
- */
16
- children: string;
17
- icon?: BitkitIconComponent;
18
- /**
19
- * Marks the item as the current page. Mutually exclusive with `state="disabled"` — you cannot be
20
- * on a page whose nav item is unavailable — but the two are not type-checked against each other:
21
- * the combination only ever arrives from a computed `selected`, which no union can catch, and
22
- * checking it would break the ordinary `selected={item.id === currentId}` mapping. If both do
23
- * turn up, disabled wins, since that is the one of the two the design actually defines.
24
- */
25
- selected?: boolean;
26
- state?: 'disabled';
27
- suffixIcon?: BitkitIconComponent;
28
- }
29
- interface BitkitPageSidebarItemLinkProps extends Omit<HTMLChakraProps<'a'>, 'children'>, BitkitPageSidebarItemCommonProps {
30
- href: string;
31
- }
32
- interface BitkitPageSidebarItemButtonProps extends Omit<HTMLChakraProps<'button'>, 'children' | 'disabled'>, BitkitPageSidebarItemCommonProps {
33
- href?: never;
34
- }
35
- export type BitkitPageSidebarItemProps = BitkitPageSidebarItemButtonProps | BitkitPageSidebarItemLinkProps;
36
- interface BitkitPageSidebarTitleCommonProps extends BoxProps {
37
- backLabel?: string;
38
- children: ReactNode;
39
- }
40
- interface BitkitPageSidebarTitleLinkProps extends BitkitPageSidebarTitleCommonProps {
41
- backHref: string;
42
- onBackClick?: never;
43
- }
44
- interface BitkitPageSidebarTitleButtonProps extends BitkitPageSidebarTitleCommonProps {
45
- backHref?: never;
46
- onBackClick: () => void;
47
- }
48
- interface BitkitPageSidebarTitlePlainProps extends BitkitPageSidebarTitleCommonProps {
49
- backHref?: never;
50
- onBackClick?: never;
51
- }
52
- export type BitkitPageSidebarTitleProps = BitkitPageSidebarTitleButtonProps | BitkitPageSidebarTitleLinkProps | BitkitPageSidebarTitlePlainProps;
53
- export interface BitkitPageSidebarBodyProps extends BoxProps {
54
- children: ReactNode;
55
- }
56
- export interface BitkitPageSidebarFooterProps extends BoxProps {
57
- children: ReactNode;
58
- }
59
- export interface BitkitPageSidebarProjectProps extends BoxProps {
60
- label: string;
61
- value: string;
62
- }
63
- export type BitkitPageSidebarGroupHeadingProps = BitkitGroupHeadingProps;
64
- export type BitkitPageSidebarDividerProps = SeparatorProps;
65
- declare const _default: import('react').ForwardRefExoticComponent<BitkitPageSidebarProps & import('react').RefAttributes<HTMLElement>> & {
66
- Body: import('react').ForwardRefExoticComponent<BitkitPageSidebarBodyProps & import('react').RefAttributes<HTMLDivElement>>;
67
- Divider: import('react').ForwardRefExoticComponent<SeparatorProps & import('react').RefAttributes<HTMLDivElement>>;
68
- Footer: import('react').ForwardRefExoticComponent<BitkitPageSidebarFooterProps & import('react').RefAttributes<HTMLDivElement>>;
69
- GroupHeading: import('react').ForwardRefExoticComponent<BitkitGroupHeadingProps & import('react').RefAttributes<HTMLDivElement>>;
70
- Item: import('react').ForwardRefExoticComponent<BitkitPageSidebarItemProps & import('react').RefAttributes<HTMLAnchorElement | HTMLButtonElement>>;
71
- Project: import('react').ForwardRefExoticComponent<BitkitPageSidebarProjectProps & import('react').RefAttributes<HTMLDivElement>>;
72
- Title: import('react').ForwardRefExoticComponent<BitkitPageSidebarTitleProps & import('react').RefAttributes<HTMLDivElement>>;
73
- };
74
- export default _default;
@@ -1,244 +0,0 @@
1
- import IconChevronLeft from "../../icons/IconChevronLeft.js";
2
- import { withSubComponents } from "../../utilities/withSubComponents.js";
3
- import BitkitControlButton from "../BitkitControlButton/BitkitControlButton.js";
4
- import BitkitGroupHeading from "../BitkitGroupHeading/BitkitGroupHeading.js";
5
- import BitkitOverflowTooltip from "../BitkitOverflowTooltip/BitkitOverflowTooltip.js";
6
- import useIsTruncated from "../../utilities/useIsTruncated.js";
7
- import { Box } from "@chakra-ui/react/box";
8
- import { chakra, useSlotRecipe } from "@chakra-ui/react/styled-system";
9
- import { forwardRef } from "react";
10
- import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
11
- import { Separator } from "@chakra-ui/react/separator";
12
- import { Text } from "@chakra-ui/react/text";
13
- //#region lib/components/BitkitPageSidebar/BitkitPageSidebar.tsx
14
- /**
15
- * Page-level navigation sidebar. It expects three children, in this order:
16
- *
17
- * ```tsx
18
- * <BitkitPageSidebar>
19
- * <BitkitPageSidebar.Title>Title</BitkitPageSidebar.Title>
20
- * <BitkitPageSidebar.Body>
21
- * <BitkitPageSidebar.Item icon={IconWorkflow}>Workflows</BitkitPageSidebar.Item>
22
- * </BitkitPageSidebar.Body>
23
- * <BitkitPageSidebar.Footer>…</BitkitPageSidebar.Footer>
24
- * </BitkitPageSidebar>
25
- * ```
26
- *
27
- * `Title` and `Footer` are optional. The sidebar scrolls as a single block: when the navigation is
28
- * taller than the viewport the whole thing — footer included — grows and scrolls with the page,
29
- * which is why `Body` keeps a minimum gap above the footer so the two blocks never touch.
30
- *
31
- * The `<nav>` carries a default `aria-label` so it is not announced as an unnamed landmark. A page
32
- * with more than one sidebar should name each one — pass your own `aria-label` (or
33
- * `aria-labelledby`), which overrides the default.
34
- *
35
- * It stands at least viewport-tall by default. An embedded panel that should size to its content
36
- * opts out with `minHeight="auto"`.
37
- */
38
- var BitkitPageSidebar = forwardRef((props, ref) => {
39
- const { children, ...rest } = props;
40
- const styles = useSlotRecipe({ key: "pageSidebar" })();
41
- return /* @__PURE__ */ jsx(Box, {
42
- ref,
43
- "aria-label": "Page navigation",
44
- asChild: true,
45
- css: styles.root,
46
- ...rest,
47
- children: /* @__PURE__ */ jsx("nav", { children })
48
- });
49
- });
50
- BitkitPageSidebar.displayName = "BitkitPageSidebar";
51
- var BitkitPageSidebarItem = forwardRef((props, ref) => {
52
- const { badge, children, icon: Icon, selected, state, suffixIcon: SuffixIcon, ...rest } = props;
53
- const isDisabled = state === "disabled";
54
- const isSelected = selected === true && !isDisabled;
55
- const styles = useSlotRecipe({ key: "pageSidebar" })({
56
- isDisabled,
57
- selected: isSelected
58
- });
59
- const { isTruncated, ref: labelRef } = useIsTruncated(children);
60
- const itemContent = /* @__PURE__ */ jsxs(Fragment$1, { children: [
61
- /* @__PURE__ */ jsxs(Box, {
62
- as: "span",
63
- css: styles.contentBlock,
64
- children: [Icon && /* @__PURE__ */ jsx(Icon, {
65
- css: styles.itemIcon,
66
- size: "16"
67
- }), /* @__PURE__ */ jsx(Text, {
68
- as: "span",
69
- css: styles.itemLabel,
70
- ref: labelRef,
71
- children
72
- })]
73
- }),
74
- badge,
75
- SuffixIcon && /* @__PURE__ */ jsx(SuffixIcon, {
76
- css: styles.suffixIcon,
77
- size: "16"
78
- }),
79
- isSelected && /* @__PURE__ */ jsx(Box, {
80
- as: "span",
81
- css: styles.selectionMarker
82
- })
83
- ] });
84
- const withTooltip = (row) => /* @__PURE__ */ jsx(BitkitOverflowTooltip, {
85
- disabled: !isTruncated,
86
- text: children,
87
- children: row
88
- });
89
- if (rest.href !== void 0) {
90
- const { className, href, onClick, onKeyDown, ...linkRest } = rest;
91
- const handleClick = isDisabled ? (event) => {
92
- event.preventDefault();
93
- event.stopPropagation();
94
- } : onClick;
95
- const handleKeyDown = isDisabled ? (event) => {
96
- if (event.key === "Enter" || event.key === " ") {
97
- event.preventDefault();
98
- event.stopPropagation();
99
- }
100
- } : onKeyDown;
101
- return withTooltip(/* @__PURE__ */ jsx(chakra.a, {
102
- ref,
103
- ...linkRest,
104
- "aria-current": isSelected ? "page" : void 0,
105
- "aria-disabled": isDisabled || void 0,
106
- className: className ? `group ${className}` : "group",
107
- css: styles.item,
108
- href: isDisabled ? void 0 : href,
109
- onClick: handleClick,
110
- onKeyDown: handleKeyDown,
111
- children: itemContent
112
- }));
113
- }
114
- const { className, href: _href, ...buttonRest } = rest;
115
- return withTooltip(/* @__PURE__ */ jsx(chakra.button, {
116
- ref,
117
- ...buttonRest,
118
- "aria-current": isSelected ? "page" : void 0,
119
- className: className ? `group ${className}` : "group",
120
- css: styles.item,
121
- disabled: isDisabled,
122
- type: "button",
123
- children: itemContent
124
- }));
125
- });
126
- BitkitPageSidebarItem.displayName = "BitkitPageSidebarItem";
127
- var BitkitPageSidebarTitle = forwardRef((props, ref) => {
128
- const { backHref, backLabel = "Back", children, onBackClick, ...rest } = props;
129
- const hasBack = backHref !== void 0 || onBackClick !== void 0;
130
- const styles = useSlotRecipe({ key: "pageSidebar" })({ hasBack });
131
- return /* @__PURE__ */ jsx(Box, {
132
- ref,
133
- css: styles.title,
134
- ...rest,
135
- children: /* @__PURE__ */ jsxs(Box, {
136
- css: styles.titleBlock,
137
- children: [hasBack && (backHref !== void 0 ? /* @__PURE__ */ jsx(BitkitControlButton, {
138
- href: backHref,
139
- icon: IconChevronLeft,
140
- label: backLabel,
141
- size: "xs",
142
- tooltipProps: { placement: "right" }
143
- }) : /* @__PURE__ */ jsx(BitkitControlButton, {
144
- icon: IconChevronLeft,
145
- label: backLabel,
146
- onClick: onBackClick,
147
- size: "xs",
148
- tooltipProps: { placement: "right" }
149
- })), /* @__PURE__ */ jsx(Text, {
150
- as: "span",
151
- css: styles.titleText,
152
- children
153
- })]
154
- })
155
- });
156
- });
157
- BitkitPageSidebarTitle.displayName = "BitkitPageSidebarTitle";
158
- /**
159
- * Holds the navigation items. It absorbs the space left between `Title` and `Footer`, so the footer
160
- * sits at the bottom of the viewport on a short navigation, and keeps a minimum gap above the
161
- * footer so the two blocks stay visually separate however long the list gets.
162
- */
163
- var BitkitPageSidebarBody = forwardRef((props, ref) => {
164
- const { children, ...rest } = props;
165
- const styles = useSlotRecipe({ key: "pageSidebar" })();
166
- return /* @__PURE__ */ jsx(Box, {
167
- ref,
168
- css: styles.body,
169
- ...rest,
170
- children
171
- });
172
- });
173
- BitkitPageSidebarBody.displayName = "BitkitPageSidebarBody";
174
- var BitkitPageSidebarFooter = forwardRef((props, ref) => {
175
- const { children, ...rest } = props;
176
- const styles = useSlotRecipe({ key: "pageSidebar" })();
177
- return /* @__PURE__ */ jsx(Box, {
178
- ref,
179
- css: styles.footer,
180
- ...rest,
181
- children
182
- });
183
- });
184
- BitkitPageSidebarFooter.displayName = "BitkitPageSidebarFooter";
185
- var BitkitPageSidebarProject = forwardRef((props, ref) => {
186
- const { label, value, ...rest } = props;
187
- const styles = useSlotRecipe({ key: "pageSidebar" })();
188
- const { isTruncated, ref: valueRef } = useIsTruncated(value);
189
- return /* @__PURE__ */ jsxs(Box, {
190
- ref,
191
- css: styles.project,
192
- ...rest,
193
- children: [/* @__PURE__ */ jsx(Text, {
194
- as: "span",
195
- css: styles.projectLabel,
196
- children: label
197
- }), /* @__PURE__ */ jsx(BitkitOverflowTooltip, {
198
- disabled: !isTruncated,
199
- text: value,
200
- children: /* @__PURE__ */ jsx(Box, {
201
- css: styles.projectValueWrapper,
202
- children: /* @__PURE__ */ jsx(Text, {
203
- as: "span",
204
- css: styles.projectValue,
205
- ref: valueRef,
206
- children: value
207
- })
208
- })
209
- })]
210
- });
211
- });
212
- BitkitPageSidebarProject.displayName = "BitkitPageSidebarProject";
213
- var BitkitPageSidebarGroupHeading = forwardRef((props, ref) => {
214
- return /* @__PURE__ */ jsx(BitkitGroupHeading, {
215
- ref,
216
- paddingBlockEnd: "8",
217
- paddingBlockStart: "16",
218
- paddingInline: "24",
219
- ...props
220
- });
221
- });
222
- BitkitPageSidebarGroupHeading.displayName = "BitkitPageSidebarGroupHeading";
223
- var BitkitPageSidebarDivider = forwardRef((props, ref) => {
224
- const styles = useSlotRecipe({ key: "pageSidebar" })();
225
- return /* @__PURE__ */ jsx(Separator, {
226
- ref,
227
- css: styles.divider,
228
- ...props
229
- });
230
- });
231
- BitkitPageSidebarDivider.displayName = "BitkitPageSidebarDivider";
232
- var BitkitPageSidebar_default = withSubComponents(BitkitPageSidebar, {
233
- Body: BitkitPageSidebarBody,
234
- Divider: BitkitPageSidebarDivider,
235
- Footer: BitkitPageSidebarFooter,
236
- GroupHeading: BitkitPageSidebarGroupHeading,
237
- Item: BitkitPageSidebarItem,
238
- Project: BitkitPageSidebarProject,
239
- Title: BitkitPageSidebarTitle
240
- });
241
- //#endregion
242
- export { BitkitPageSidebar_default as default };
243
-
244
- //# sourceMappingURL=BitkitPageSidebar.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"BitkitPageSidebar.js","names":[],"sources":["../../../lib/components/BitkitPageSidebar/BitkitPageSidebar.tsx"],"sourcesContent":["import { Box, type BoxProps } from '@chakra-ui/react/box';\nimport { Separator, type SeparatorProps } from '@chakra-ui/react/separator';\nimport { chakra, type HTMLChakraProps, useSlotRecipe } from '@chakra-ui/react/styled-system';\nimport { Text } from '@chakra-ui/react/text';\nimport { forwardRef, type KeyboardEvent, type MouseEvent, type ReactNode, type Ref } from 'react';\n\nimport { type BitkitIconComponent } from '../../icons';\nimport IconChevronLeft from '../../icons/IconChevronLeft';\nimport useIsTruncated from '../../utilities/useIsTruncated';\nimport { withSubComponents } from '../../utilities/withSubComponents';\nimport BitkitControlButton from '../BitkitControlButton/BitkitControlButton';\nimport BitkitGroupHeading, { type BitkitGroupHeadingProps } from '../BitkitGroupHeading/BitkitGroupHeading';\nimport BitkitOverflowTooltip from '../BitkitOverflowTooltip/BitkitOverflowTooltip';\n\n// ----- BitkitPageSidebar (Root) -----\n\nexport interface BitkitPageSidebarProps extends BoxProps {\n children: ReactNode;\n}\n\n/**\n * Page-level navigation sidebar. It expects three children, in this order:\n *\n * ```tsx\n * <BitkitPageSidebar>\n * <BitkitPageSidebar.Title>Title</BitkitPageSidebar.Title>\n * <BitkitPageSidebar.Body>\n * <BitkitPageSidebar.Item icon={IconWorkflow}>Workflows</BitkitPageSidebar.Item>\n * </BitkitPageSidebar.Body>\n * <BitkitPageSidebar.Footer>…</BitkitPageSidebar.Footer>\n * </BitkitPageSidebar>\n * ```\n *\n * `Title` and `Footer` are optional. The sidebar scrolls as a single block: when the navigation is\n * taller than the viewport the whole thing — footer included — grows and scrolls with the page,\n * which is why `Body` keeps a minimum gap above the footer so the two blocks never touch.\n *\n * The `<nav>` carries a default `aria-label` so it is not announced as an unnamed landmark. A page\n * with more than one sidebar should name each one — pass your own `aria-label` (or\n * `aria-labelledby`), which overrides the default.\n *\n * It stands at least viewport-tall by default. An embedded panel that should size to its content\n * opts out with `minHeight=\"auto\"`.\n */\nconst BitkitPageSidebar = forwardRef<HTMLElement, BitkitPageSidebarProps>((props, ref) => {\n const { children, ...rest } = props;\n\n const recipe = useSlotRecipe({ key: 'pageSidebar' });\n const styles = recipe();\n\n return (\n <Box ref={ref} aria-label=\"Page navigation\" asChild css={styles.root} {...rest}>\n <nav>{children}</nav>\n </Box>\n );\n});\n\nBitkitPageSidebar.displayName = 'BitkitPageSidebar';\n\n// ----- BitkitPageSidebar.Item -----\n\ninterface BitkitPageSidebarItemCommonProps {\n badge?: ReactNode;\n /**\n * The item's label. Typed as a string rather than `ReactNode` because the row truncates it with\n * an ellipsis, and the overflow tooltip needs the full text to reveal.\n */\n children: string;\n icon?: BitkitIconComponent;\n /**\n * Marks the item as the current page. Mutually exclusive with `state=\"disabled\"` — you cannot be\n * on a page whose nav item is unavailable — but the two are not type-checked against each other:\n * the combination only ever arrives from a computed `selected`, which no union can catch, and\n * checking it would break the ordinary `selected={item.id === currentId}` mapping. If both do\n * turn up, disabled wins, since that is the one of the two the design actually defines.\n */\n selected?: boolean;\n state?: 'disabled';\n suffixIcon?: BitkitIconComponent;\n}\n\ninterface BitkitPageSidebarItemLinkProps\n extends Omit<HTMLChakraProps<'a'>, 'children'>, BitkitPageSidebarItemCommonProps {\n href: string;\n}\n\ninterface BitkitPageSidebarItemButtonProps\n extends Omit<HTMLChakraProps<'button'>, 'children' | 'disabled'>, BitkitPageSidebarItemCommonProps {\n href?: never;\n}\n\nexport type BitkitPageSidebarItemProps = BitkitPageSidebarItemButtonProps | BitkitPageSidebarItemLinkProps;\n\nconst BitkitPageSidebarItem = forwardRef<HTMLButtonElement | HTMLAnchorElement, BitkitPageSidebarItemProps>(\n (props, ref) => {\n const { badge, children, icon: Icon, selected, state, suffixIcon: SuffixIcon, ...rest } = props;\n\n const isDisabled = state === 'disabled';\n // `selected` and `state=\"disabled\"` are not checked against each other in the types, so this is\n // the single place the overlap is resolved: disabled wins, and the two recipe variants can never\n // both claim the same slot.\n const isSelected = selected === true && !isDisabled;\n\n const recipe = useSlotRecipe({ key: 'pageSidebar' });\n const styles = recipe({ isDisabled, selected: isSelected });\n\n const { isTruncated, ref: labelRef } = useIsTruncated<HTMLParagraphElement>(children);\n\n const itemContent = (\n <>\n {/* `span`, not the default `div`: in button mode these sit inside a `<button>`, whose\n content model allows phrasing content only. */}\n <Box as=\"span\" css={styles.contentBlock}>\n {Icon && <Icon css={styles.itemIcon} size=\"16\" />}\n <Text as=\"span\" css={styles.itemLabel} ref={labelRef}>\n {children}\n </Text>\n </Box>\n {badge}\n {SuffixIcon && <SuffixIcon css={styles.suffixIcon} size=\"16\" />}\n {isSelected && <Box as=\"span\" css={styles.selectionMarker} />}\n </>\n );\n\n // The overflow tooltip anchors to the row itself, which is the focusable element: anchored to an\n // inner node it would only ever open on hover, leaving keyboard users unable to read a truncated\n // label. `Tooltip.Trigger` renders `asChild` and composes refs, so the consumer's forwarded ref\n // survives, and the ref measuring the truncation sits on the label further in.\n const withTooltip = (row: ReactNode) => (\n <BitkitOverflowTooltip disabled={!isTruncated} text={children}>\n {row}\n </BitkitOverflowTooltip>\n );\n\n // `chakra.a` / `chakra.button` rather than a named primitive: the item carries its own slot recipe,\n // and Chakra's `Button`/`Link` would layer their own recipe styles on top of it.\n if (rest.href !== undefined) {\n const { className, href, onClick, onKeyDown, ...linkRest } = rest;\n const handleClick = isDisabled\n ? (event: MouseEvent<HTMLAnchorElement>) => {\n event.preventDefault();\n event.stopPropagation();\n }\n : onClick;\n const handleKeyDown = isDisabled\n ? (event: KeyboardEvent<HTMLAnchorElement>) => {\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n event.stopPropagation();\n }\n }\n : onKeyDown;\n\n return withTooltip(\n <chakra.a\n ref={ref as Ref<HTMLAnchorElement>}\n {...linkRest}\n aria-current={isSelected ? 'page' : undefined}\n aria-disabled={isDisabled || undefined}\n className={className ? `group ${className}` : 'group'}\n css={styles.item}\n href={isDisabled ? undefined : href}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n >\n {itemContent}\n </chakra.a>,\n );\n }\n\n const { className, href: _href, ...buttonRest } = rest;\n\n return withTooltip(\n <chakra.button\n ref={ref as Ref<HTMLButtonElement>}\n {...buttonRest}\n aria-current={isSelected ? 'page' : undefined}\n className={className ? `group ${className}` : 'group'}\n css={styles.item}\n disabled={isDisabled}\n type=\"button\"\n >\n {itemContent}\n </chakra.button>,\n );\n },\n);\n\nBitkitPageSidebarItem.displayName = 'BitkitPageSidebarItem';\n\n// ----- BitkitPageSidebar.Title -----\n\ninterface BitkitPageSidebarTitleCommonProps extends BoxProps {\n backLabel?: string;\n children: ReactNode;\n}\n\ninterface BitkitPageSidebarTitleLinkProps extends BitkitPageSidebarTitleCommonProps {\n backHref: string;\n onBackClick?: never;\n}\n\ninterface BitkitPageSidebarTitleButtonProps extends BitkitPageSidebarTitleCommonProps {\n backHref?: never;\n onBackClick: () => void;\n}\n\ninterface BitkitPageSidebarTitlePlainProps extends BitkitPageSidebarTitleCommonProps {\n backHref?: never;\n onBackClick?: never;\n}\n\nexport type BitkitPageSidebarTitleProps =\n | BitkitPageSidebarTitleButtonProps\n | BitkitPageSidebarTitleLinkProps\n | BitkitPageSidebarTitlePlainProps;\n\nconst BitkitPageSidebarTitle = forwardRef<HTMLDivElement, BitkitPageSidebarTitleProps>((props, ref) => {\n const { backHref, backLabel = 'Back', children, onBackClick, ...rest } = props;\n\n const hasBack = backHref !== undefined || onBackClick !== undefined;\n\n const recipe = useSlotRecipe({ key: 'pageSidebar' });\n const styles = recipe({ hasBack });\n\n return (\n <Box ref={ref} css={styles.title} {...rest}>\n <Box css={styles.titleBlock}>\n {/* The label tooltip opens to the right. Its default `top` has nowhere to go here — the\n button sits at the very top of the sidebar, so the tooltip jams against the viewport\n edge and covers the header instead of flipping. */}\n {hasBack &&\n (backHref !== undefined ? (\n <BitkitControlButton\n href={backHref}\n icon={IconChevronLeft}\n label={backLabel}\n size=\"xs\"\n tooltipProps={{ placement: 'right' }}\n />\n ) : (\n <BitkitControlButton\n icon={IconChevronLeft}\n label={backLabel}\n onClick={onBackClick}\n size=\"xs\"\n tooltipProps={{ placement: 'right' }}\n />\n ))}\n <Text as=\"span\" css={styles.titleText}>\n {children}\n </Text>\n </Box>\n </Box>\n );\n});\n\nBitkitPageSidebarTitle.displayName = 'BitkitPageSidebarTitle';\n\n// ----- BitkitPageSidebar.Body -----\n\nexport interface BitkitPageSidebarBodyProps extends BoxProps {\n children: ReactNode;\n}\n\n/**\n * Holds the navigation items. It absorbs the space left between `Title` and `Footer`, so the footer\n * sits at the bottom of the viewport on a short navigation, and keeps a minimum gap above the\n * footer so the two blocks stay visually separate however long the list gets.\n */\nconst BitkitPageSidebarBody = forwardRef<HTMLDivElement, BitkitPageSidebarBodyProps>((props, ref) => {\n const { children, ...rest } = props;\n\n const recipe = useSlotRecipe({ key: 'pageSidebar' });\n const styles = recipe();\n\n return (\n <Box ref={ref} css={styles.body} {...rest}>\n {children}\n </Box>\n );\n});\n\nBitkitPageSidebarBody.displayName = 'BitkitPageSidebarBody';\n\n// ----- BitkitPageSidebar.Footer -----\n\nexport interface BitkitPageSidebarFooterProps extends BoxProps {\n children: ReactNode;\n}\n\nconst BitkitPageSidebarFooter = forwardRef<HTMLDivElement, BitkitPageSidebarFooterProps>((props, ref) => {\n const { children, ...rest } = props;\n\n const recipe = useSlotRecipe({ key: 'pageSidebar' });\n const styles = recipe();\n\n return (\n <Box ref={ref} css={styles.footer} {...rest}>\n {children}\n </Box>\n );\n});\n\nBitkitPageSidebarFooter.displayName = 'BitkitPageSidebarFooter';\n\n// ----- BitkitPageSidebar.Project -----\n\nexport interface BitkitPageSidebarProjectProps extends BoxProps {\n label: string;\n value: string;\n}\n\nconst BitkitPageSidebarProject = forwardRef<HTMLDivElement, BitkitPageSidebarProjectProps>((props, ref) => {\n const { label, value, ...rest } = props;\n\n const recipe = useSlotRecipe({ key: 'pageSidebar' });\n const styles = recipe();\n\n const { isTruncated, ref: valueRef } = useIsTruncated<HTMLParagraphElement>(value);\n\n return (\n <Box ref={ref} css={styles.project} {...rest}>\n <Text as=\"span\" css={styles.projectLabel}>\n {label}\n </Text>\n {/* Wrapper for the same reason as in Item: the trigger cannot be the element being measured. */}\n <BitkitOverflowTooltip disabled={!isTruncated} text={value}>\n <Box css={styles.projectValueWrapper}>\n <Text as=\"span\" css={styles.projectValue} ref={valueRef}>\n {value}\n </Text>\n </Box>\n </BitkitOverflowTooltip>\n </Box>\n );\n});\n\nBitkitPageSidebarProject.displayName = 'BitkitPageSidebarProject';\n\n// ----- BitkitPageSidebar.GroupHeading -----\n\nexport type BitkitPageSidebarGroupHeadingProps = BitkitGroupHeadingProps;\n\nconst BitkitPageSidebarGroupHeading = forwardRef<HTMLDivElement, BitkitPageSidebarGroupHeadingProps>((props, ref) => {\n return <BitkitGroupHeading ref={ref} paddingBlockEnd=\"8\" paddingBlockStart=\"16\" paddingInline=\"24\" {...props} />;\n});\n\nBitkitPageSidebarGroupHeading.displayName = 'BitkitPageSidebarGroupHeading';\n\n// ----- BitkitPageSidebar.Divider -----\n\nexport type BitkitPageSidebarDividerProps = SeparatorProps;\n\nconst BitkitPageSidebarDivider = forwardRef<HTMLDivElement, BitkitPageSidebarDividerProps>((props, ref) => {\n const recipe = useSlotRecipe({ key: 'pageSidebar' });\n const styles = recipe();\n\n return <Separator ref={ref} css={styles.divider} {...props} />;\n});\n\nBitkitPageSidebarDivider.displayName = 'BitkitPageSidebarDivider';\n\nexport default withSubComponents(BitkitPageSidebar, {\n Body: BitkitPageSidebarBody,\n Divider: BitkitPageSidebarDivider,\n Footer: BitkitPageSidebarFooter,\n GroupHeading: BitkitPageSidebarGroupHeading,\n Item: BitkitPageSidebarItem,\n Project: BitkitPageSidebarProject,\n Title: BitkitPageSidebarTitle,\n});\n"],"mappings":"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"}