@harborclient/sdk 1.1.13 → 1.1.15

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 (99) hide show
  1. package/dist/components/Badge/index.d.ts +1 -1
  2. package/dist/components/Badge/index.d.ts.map +1 -1
  3. package/dist/components/Badge/index.js +2 -0
  4. package/dist/components/Breadcrumb/CrumbSegment.d.ts +19 -0
  5. package/dist/components/Breadcrumb/CrumbSegment.d.ts.map +1 -0
  6. package/dist/components/Breadcrumb/CrumbSegment.js +19 -0
  7. package/dist/components/Breadcrumb/EditableSegment.d.ts +46 -0
  8. package/dist/components/Breadcrumb/EditableSegment.d.ts.map +1 -0
  9. package/dist/components/Breadcrumb/EditableSegment.js +14 -0
  10. package/dist/components/Breadcrumb/SegmentShell.d.ts +32 -0
  11. package/dist/components/Breadcrumb/SegmentShell.d.ts.map +1 -0
  12. package/dist/components/Breadcrumb/SegmentShell.js +35 -0
  13. package/dist/components/Breadcrumb/index.d.ts +2 -18
  14. package/dist/components/Breadcrumb/index.d.ts.map +1 -1
  15. package/dist/components/Breadcrumb/index.js +2 -61
  16. package/dist/components/Breadcrumb/types.d.ts +18 -0
  17. package/dist/components/Breadcrumb/types.d.ts.map +1 -0
  18. package/dist/components/Breadcrumb/types.js +1 -0
  19. package/dist/components/CatalogCard/index.d.ts +51 -0
  20. package/dist/components/CatalogCard/index.d.ts.map +1 -0
  21. package/dist/components/CatalogCard/index.js +23 -0
  22. package/dist/components/CatalogReadmeMarkdown/index.d.ts +13 -0
  23. package/dist/components/CatalogReadmeMarkdown/index.d.ts.map +1 -0
  24. package/dist/components/CatalogReadmeMarkdown/index.js +53 -0
  25. package/dist/components/FormGroup/index.d.ts +6 -1
  26. package/dist/components/FormGroup/index.d.ts.map +1 -1
  27. package/dist/components/FormGroup/index.js +21 -10
  28. package/dist/components/FormSection/index.d.ts +37 -0
  29. package/dist/components/FormSection/index.d.ts.map +1 -0
  30. package/dist/components/FormSection/index.js +9 -0
  31. package/dist/components/ProgressBar/index.d.ts +20 -0
  32. package/dist/components/ProgressBar/index.d.ts.map +1 -0
  33. package/dist/components/ProgressBar/index.js +10 -0
  34. package/dist/components/ProgressBar/progressBar.logic.d.ts +9 -0
  35. package/dist/components/ProgressBar/progressBar.logic.d.ts.map +1 -0
  36. package/dist/components/ProgressBar/progressBar.logic.js +13 -0
  37. package/dist/components/PromptModal/index.d.ts +82 -0
  38. package/dist/components/PromptModal/index.d.ts.map +1 -0
  39. package/dist/components/PromptModal/index.js +22 -0
  40. package/dist/components/PromptModal/promptModal.logic.d.ts +8 -0
  41. package/dist/components/PromptModal/promptModal.logic.d.ts.map +1 -0
  42. package/dist/components/PromptModal/promptModal.logic.js +9 -0
  43. package/dist/components/ScreenshotCarousel/ScreenshotLightbox.d.ts +29 -0
  44. package/dist/components/ScreenshotCarousel/ScreenshotLightbox.d.ts.map +1 -0
  45. package/dist/components/ScreenshotCarousel/ScreenshotLightbox.js +66 -0
  46. package/dist/components/ScreenshotCarousel/index.d.ts +35 -0
  47. package/dist/components/ScreenshotCarousel/index.d.ts.map +1 -0
  48. package/dist/components/ScreenshotCarousel/index.js +89 -0
  49. package/dist/components/ScreenshotCarousel/variants.d.ts +17 -0
  50. package/dist/components/ScreenshotCarousel/variants.d.ts.map +1 -0
  51. package/dist/components/ScreenshotCarousel/variants.js +22 -0
  52. package/dist/components/SelectionActionToolbar/index.d.ts +41 -0
  53. package/dist/components/SelectionActionToolbar/index.d.ts.map +1 -0
  54. package/dist/components/SelectionActionToolbar/index.js +13 -0
  55. package/dist/components/SettingIdLabel/index.d.ts +16 -0
  56. package/dist/components/SettingIdLabel/index.d.ts.map +1 -0
  57. package/dist/components/SettingIdLabel/index.js +7 -0
  58. package/dist/components/SettingSectionHeading/index.d.ts +33 -0
  59. package/dist/components/SettingSectionHeading/index.d.ts.map +1 -0
  60. package/dist/components/SettingSectionHeading/index.js +10 -0
  61. package/dist/components/SidebarItem/SidebarDocumentItem.d.ts +79 -0
  62. package/dist/components/SidebarItem/SidebarDocumentItem.d.ts.map +1 -0
  63. package/dist/components/SidebarItem/SidebarDocumentItem.js +26 -0
  64. package/dist/components/SidebarItem/SidebarRequestItem.d.ts +0 -76
  65. package/dist/components/SidebarItem/SidebarRequestItem.d.ts.map +1 -1
  66. package/dist/components/SidebarItem/SidebarRequestItem.js +0 -21
  67. package/dist/components/SidebarItem/SidebarTree.d.ts +0 -21
  68. package/dist/components/SidebarItem/SidebarTree.d.ts.map +1 -1
  69. package/dist/components/SidebarItem/SidebarTree.js +0 -9
  70. package/dist/components/SidebarItem/SidebarTreeGroup.d.ts +24 -0
  71. package/dist/components/SidebarItem/SidebarTreeGroup.d.ts.map +1 -0
  72. package/dist/components/SidebarItem/SidebarTreeGroup.js +11 -0
  73. package/dist/components/SidebarItem/index.d.ts +5 -3
  74. package/dist/components/SidebarItem/index.d.ts.map +1 -1
  75. package/dist/components/SidebarItem/index.js +5 -3
  76. package/dist/components/SidebarItem/sidebarItemClasses.d.ts +8 -0
  77. package/dist/components/SidebarItem/sidebarItemClasses.d.ts.map +1 -1
  78. package/dist/components/SidebarItem/sidebarItemClasses.js +18 -8
  79. package/dist/components/SidebarSection/SectionItem.d.ts +40 -0
  80. package/dist/components/SidebarSection/SectionItem.d.ts.map +1 -0
  81. package/dist/components/SidebarSection/SectionItem.js +19 -0
  82. package/dist/components/SidebarSection/SidebarSection.d.ts +2 -38
  83. package/dist/components/SidebarSection/SidebarSection.d.ts.map +1 -1
  84. package/dist/components/SidebarSection/SidebarSection.js +2 -19
  85. package/dist/components/StatusDot/index.d.ts +42 -0
  86. package/dist/components/StatusDot/index.d.ts.map +1 -0
  87. package/dist/components/StatusDot/index.js +42 -0
  88. package/dist/components/ThemeVariantPickerModal/index.d.ts +71 -0
  89. package/dist/components/ThemeVariantPickerModal/index.d.ts.map +1 -0
  90. package/dist/components/ThemeVariantPickerModal/index.js +37 -0
  91. package/dist/components/VisibilityMenu/MenuCheckboxItem.d.ts +14 -0
  92. package/dist/components/VisibilityMenu/MenuCheckboxItem.d.ts.map +1 -0
  93. package/dist/components/VisibilityMenu/MenuCheckboxItem.js +14 -0
  94. package/dist/components/VisibilityMenu/index.d.ts.map +1 -1
  95. package/dist/components/VisibilityMenu/index.js +2 -11
  96. package/dist/components/index.d.ts +24 -1
  97. package/dist/components/index.d.ts.map +1 -1
  98. package/dist/components/index.js +15 -1
  99. package/package.json +6 -2
@@ -2,7 +2,7 @@ import type { ComponentPropsWithoutRef, JSX, ReactNode } from 'react';
2
2
  /**
3
3
  * Visual tone for compact status badges.
4
4
  */
5
- export type BadgeVariant = 'success' | 'danger' | 'muted' | 'accent' | 'warning';
5
+ export type BadgeVariant = 'success' | 'danger' | 'muted' | 'accent' | 'warning' | 'category';
6
6
  interface Props extends Omit<ComponentPropsWithoutRef<'span'>, 'children'> {
7
7
  /**
8
8
  * Badge label content.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Badge/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGtE;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEjF,UAAU,KAAM,SAAQ,IAAI,CAAC,wBAAwB,CAAC,MAAM,CAAC,EAAE,UAAU,CAAC;IACxE;;OAEG;IACH,QAAQ,EAAE,SAAS,CAAC;IAEpB;;OAEG;IACH,OAAO,CAAC,EAAE,YAAY,CAAC;CACxB;AAuBD;;GAEG;AACH,wBAAgB,KAAK,CAAC,EAAE,QAAQ,EAAE,OAAiB,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,GAAG,GAAG,CAAC,OAAO,CAa9F"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Badge/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGtE;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,GAAG,UAAU,CAAC;AAE9F,UAAU,KAAM,SAAQ,IAAI,CAAC,wBAAwB,CAAC,MAAM,CAAC,EAAE,UAAU,CAAC;IACxE;;OAEG;IACH,QAAQ,EAAE,SAAS,CAAC;IAEpB;;OAEG;IACH,OAAO,CAAC,EAAE,YAAY,CAAC;CACxB;AAyBD;;GAEG;AACH,wBAAgB,KAAK,CAAC,EAAE,QAAQ,EAAE,OAAiB,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,GAAG,GAAG,CAAC,OAAO,CAa9F"}
@@ -15,6 +15,8 @@ function variantClasses(variant) {
15
15
  return 'bg-accent/20 text-accent';
16
16
  case 'warning':
17
17
  return 'bg-warning/20 text-warning';
18
+ case 'category':
19
+ return 'bg-accent/15 text-text';
18
20
  case 'muted':
19
21
  default:
20
22
  return 'bg-control text-muted';
@@ -0,0 +1,19 @@
1
+ import type { JSX } from 'react';
2
+ import { type SegmentShape } from './SegmentShell.js';
3
+ import type { BreadcrumbSegment } from './types.js';
4
+ interface Props {
5
+ /**
6
+ * Crumb data and optional navigation handler.
7
+ */
8
+ segment: BreadcrumbSegment;
9
+ /**
10
+ * Segment position within the bar.
11
+ */
12
+ shape: SegmentShape;
13
+ }
14
+ /**
15
+ * Renders one leading, non-editable breadcrumb segment.
16
+ */
17
+ export declare function CrumbSegment({ segment, shape }: Props): JSX.Element;
18
+ export {};
19
+ //# sourceMappingURL=CrumbSegment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CrumbSegment.d.ts","sourceRoot":"","sources":["../../../src/components/Breadcrumb/CrumbSegment.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAc,MAAM,OAAO,CAAC;AAE7C,OAAO,EAAE,KAAK,YAAY,EAAgB,MAAM,mBAAmB,CAAC;AACpE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD,UAAU,KAAK;IACb;;OAEG;IACH,OAAO,EAAE,iBAAiB,CAAC;IAE3B;;OAEG;IACH,KAAK,EAAE,YAAY,CAAC;CACrB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,KAAK,GAAG,GAAG,CAAC,OAAO,CAkCnE"}
@@ -0,0 +1,19 @@
1
+ import { jsx as _jsx } from "@harborclient/sdk/jsx-runtime";
2
+ import { cn } from '../utils.js';
3
+ import { SegmentShell } from './SegmentShell.js';
4
+ /**
5
+ * Renders one leading, non-editable breadcrumb segment.
6
+ */
7
+ export function CrumbSegment({ segment, shape }) {
8
+ const contentClass = cn('block w-full truncate border-none bg-transparent p-0 text-left', segment.onClick && 'cursor-pointer hover:text-text focus-visible:text-text');
9
+ /**
10
+ * Stops click propagation so breadcrumb navigation does not trigger edit mode.
11
+ *
12
+ * @param event - Mouse event from a breadcrumb segment control.
13
+ */
14
+ const handleClick = (event) => {
15
+ event.stopPropagation();
16
+ segment.onClick?.();
17
+ };
18
+ return (_jsx(SegmentShell, { shape: shape, children: segment.onClick ? (_jsx("button", { type: "button", className: cn(contentClass, 'app-no-drag focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-accent'), onClick: handleClick, children: segment.label })) : (_jsx("span", { className: contentClass, children: segment.label })) }));
19
+ }
@@ -0,0 +1,46 @@
1
+ import type { JSX, RefObject } from 'react';
2
+ import { type SegmentShape } from './SegmentShell.js';
3
+ interface Props {
4
+ /**
5
+ * Current editable value.
6
+ */
7
+ value: string;
8
+ /**
9
+ * Placeholder when the value is empty.
10
+ */
11
+ placeholder: string;
12
+ /**
13
+ * Accessible name for the editable input.
14
+ */
15
+ editableLabel: string;
16
+ /**
17
+ * Whether inline edit mode is active.
18
+ */
19
+ editing: boolean;
20
+ /**
21
+ * Segment position within the bar.
22
+ */
23
+ shape: SegmentShape;
24
+ /**
25
+ * Ref forwarded to the inline input when editing.
26
+ */
27
+ inputRef: RefObject<HTMLInputElement | null>;
28
+ /**
29
+ * Opens inline edit mode for the trailing segment.
30
+ */
31
+ onStartEditing: () => void;
32
+ /**
33
+ * Closes inline edit mode for the trailing segment.
34
+ */
35
+ onStopEditing: () => void;
36
+ /**
37
+ * Called when the editable value changes.
38
+ */
39
+ onValueChange: (value: string) => void;
40
+ }
41
+ /**
42
+ * Renders the trailing breadcrumb segment with click-to-edit behavior.
43
+ */
44
+ export declare function EditableSegment({ value, placeholder, editableLabel, editing, shape, inputRef, onStartEditing, onStopEditing, onValueChange }: Props): JSX.Element;
45
+ export {};
46
+ //# sourceMappingURL=EditableSegment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EditableSegment.d.ts","sourceRoot":"","sources":["../../../src/components/Breadcrumb/EditableSegment.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAE5C,OAAO,EAAE,KAAK,YAAY,EAAgB,MAAM,mBAAmB,CAAC;AAEpE,UAAU,KAAK;IACb;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,WAAW,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,aAAa,EAAE,MAAM,CAAC;IAEtB;;OAEG;IACH,OAAO,EAAE,OAAO,CAAC;IAEjB;;OAEG;IACH,KAAK,EAAE,YAAY,CAAC;IAEpB;;OAEG;IACH,QAAQ,EAAE,SAAS,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAC;IAE7C;;OAEG;IACH,cAAc,EAAE,MAAM,IAAI,CAAC;IAE3B;;OAEG;IACH,aAAa,EAAE,MAAM,IAAI,CAAC;IAE1B;;OAEG;IACH,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACxC;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,EAC9B,KAAK,EACL,WAAW,EACX,aAAa,EACb,OAAO,EACP,KAAK,EACL,QAAQ,EACR,cAAc,EACd,aAAa,EACb,aAAa,EACd,EAAE,KAAK,GAAG,GAAG,CAAC,OAAO,CAmCrB"}
@@ -0,0 +1,14 @@
1
+ import { jsx as _jsx } from "@harborclient/sdk/jsx-runtime";
2
+ import { Input } from '../forms/index.js';
3
+ import { SegmentShell } from './SegmentShell.js';
4
+ /**
5
+ * Renders the trailing breadcrumb segment with click-to-edit behavior.
6
+ */
7
+ export function EditableSegment({ value, placeholder, editableLabel, editing, shape, inputRef, onStartEditing, onStopEditing, onValueChange }) {
8
+ return (_jsx(SegmentShell, { shape: shape, grow: true, children: editing ? (_jsx(Input, { ref: inputRef, variant: "plain", "aria-label": editableLabel, className: "app-no-drag w-full min-w-0 border-none bg-transparent p-0 font-semibold text-text outline-none", type: "text", value: value, onChange: (event) => onValueChange(event.target.value), onBlur: onStopEditing, onKeyDown: (event) => {
9
+ if (event.key === 'Enter' || event.key === 'Escape') {
10
+ event.preventDefault();
11
+ onStopEditing();
12
+ }
13
+ } })) : (_jsx("button", { type: "button", "aria-current": "page", "aria-label": editableLabel, className: "app-no-drag flex w-full min-w-0 cursor-text items-center border-none bg-transparent p-0 text-left font-semibold text-text hover:opacity-80 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-accent", onClick: onStartEditing, children: _jsx("span", { className: "min-w-0 truncate", children: value ? value : _jsx("span", { className: "font-normal text-muted", children: placeholder }) }) })) }));
14
+ }
@@ -0,0 +1,32 @@
1
+ import type { JSX, ReactNode } from 'react';
2
+ /**
3
+ * Shape position within the interlocking breadcrumb bar.
4
+ */
5
+ export type SegmentShape = 'first' | 'middle' | 'last' | 'only';
6
+ /**
7
+ * Shared shell classes and clip-path styling for one breadcrumb segment.
8
+ */
9
+ interface Props {
10
+ /**
11
+ * Segment position within the bar.
12
+ */
13
+ shape: SegmentShape;
14
+ /**
15
+ * When true, the segment grows to fill remaining horizontal space.
16
+ */
17
+ grow?: boolean;
18
+ /**
19
+ * Additional classes merged onto the segment shell.
20
+ */
21
+ className?: string;
22
+ /**
23
+ * Segment contents.
24
+ */
25
+ children: ReactNode;
26
+ }
27
+ /**
28
+ * Renders the arrow-shaped background shell shared by crumb and editable segments.
29
+ */
30
+ export declare function SegmentShell({ shape, grow, className, children }: Props): JSX.Element;
31
+ export {};
32
+ //# sourceMappingURL=SegmentShell.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SegmentShell.d.ts","sourceRoot":"","sources":["../../../src/components/Breadcrumb/SegmentShell.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAM5C;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAC;AAsBhE;;GAEG;AACH,UAAU,KAAK;IACb;;OAEG;IACH,KAAK,EAAE,YAAY,CAAC;IAEpB;;OAEG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;IAEf;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,EAAE,KAAK,EAAE,IAAY,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,KAAK,GAAG,GAAG,CAAC,OAAO,CAuB7F"}
@@ -0,0 +1,35 @@
1
+ import { jsx as _jsx } from "@harborclient/sdk/jsx-runtime";
2
+ import { cn } from '../utils.js';
3
+ /** Pixel width of the chevron notch shared between interlocking segments. */
4
+ const CHEVRON_PX = 9;
5
+ /**
6
+ * Returns a CSS clip-path polygon for the given segment shape.
7
+ *
8
+ * @param shape - Which segment position to clip for.
9
+ * @returns Clip-path polygon string for inline style use.
10
+ */
11
+ function clipPathForShape(shape) {
12
+ switch (shape) {
13
+ case 'first':
14
+ return `polygon(0 0, calc(100% - ${CHEVRON_PX}px) 0, 100% 50%, calc(100% - ${CHEVRON_PX}px) 100%, 0 100%)`;
15
+ case 'middle':
16
+ return `polygon(0 0, calc(100% - ${CHEVRON_PX}px) 0, 100% 50%, calc(100% - ${CHEVRON_PX}px) 100%, 0 100%, ${CHEVRON_PX}px 50%)`;
17
+ case 'last':
18
+ return `polygon(0 0, 100% 0, 100% 100%, 0 100%, ${CHEVRON_PX}px 50%)`;
19
+ case 'only':
20
+ default:
21
+ return 'none';
22
+ }
23
+ }
24
+ /**
25
+ * Renders the arrow-shaped background shell shared by crumb and editable segments.
26
+ */
27
+ export function SegmentShell({ shape, grow = false, className, children }) {
28
+ const hasChevron = shape !== 'only';
29
+ const clipPath = clipPathForShape(shape);
30
+ const needsLeadingInset = shape !== 'first' && shape !== 'only';
31
+ return (_jsx("div", { className: cn('hc-breadcrumb-segment relative flex min-h-[30px] min-w-0 items-center bg-sidebar py-2', grow ? 'min-w-[6rem] flex-1' : 'max-w-[45%] shrink-0', hasChevron && shape !== 'last' && '-mr-[6px]', !needsLeadingInset && 'pl-3', 'pr-3', className), style: {
32
+ ...(clipPath !== 'none' ? { clipPath } : {}),
33
+ ...(needsLeadingInset ? { paddingLeft: `${CHEVRON_PX + 8}px` } : {})
34
+ }, children: _jsx("div", { className: "min-w-0 truncate", children: children }) }));
35
+ }
@@ -1,21 +1,6 @@
1
1
  import { type JSX } from 'react';
2
- /**
3
- * One non-editable breadcrumb segment rendered before the trailing editable item.
4
- */
5
- export interface BreadcrumbSegment {
6
- /**
7
- * Visible label for the segment.
8
- */
9
- label: string;
10
- /**
11
- * Optional stable key; falls back to the segment index when omitted.
12
- */
13
- id?: string;
14
- /**
15
- * When set, the segment renders as a navigable button.
16
- */
17
- onClick?: () => void;
18
- }
2
+ import { type BreadcrumbSegment } from './types.js';
3
+ export type { BreadcrumbSegment } from './types.js';
19
4
  interface Props {
20
5
  /**
21
6
  * Leading, non-editable crumbs (collection, folder, and so on).
@@ -52,5 +37,4 @@ interface Props {
52
37
  * segments are optionally clickable; the trailing segment is inline-editable.
53
38
  */
54
39
  export declare function Breadcrumb({ segments, value, placeholder, editableLabel, onValueChange, className, flush }: Props): JSX.Element;
55
- export {};
56
40
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Breadcrumb/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,GAAG,EAQT,MAAM,OAAO,CAAC;AAOf;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,EAAE,CAAC,EAAE,MAAM,CAAC;IAEZ;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB;AAED,UAAU,KAAK;IACb;;OAEG;IACH,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAE9B;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;OAEG;IACH,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAEvC;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAyOD;;;GAGG;AACH,wBAAgB,UAAU,CAAC,EACzB,QAAQ,EACR,KAAK,EACL,WAAgB,EAChB,aAAsB,EACtB,aAAa,EACb,SAAS,EACT,KAAa,EACd,EAAE,KAAK,GAAG,GAAG,CAAC,OAAO,CA2DrB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Breadcrumb/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,GAAG,EAAsC,MAAM,OAAO,CAAC;AAKrE,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD,YAAY,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD,UAAU,KAAK;IACb;;OAEG;IACH,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAE9B;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;OAEG;IACH,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAEvC;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,EACzB,QAAQ,EACR,KAAK,EACL,WAAgB,EAChB,aAAsB,EACtB,aAAa,EACb,SAAS,EACT,KAAa,EACd,EAAE,KAAK,GAAG,GAAG,CAAC,OAAO,CA2DrB"}
@@ -1,67 +1,8 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "@harborclient/sdk/jsx-runtime";
2
2
  import { useEffect, useId, useRef, useState } from 'react';
3
- import { Input } from '../forms/index.js';
4
3
  import { cn } from '../utils.js';
5
- /** Pixel width of the chevron notch shared between interlocking segments. */
6
- const CHEVRON_PX = 9;
7
- /**
8
- * Returns a CSS clip-path polygon for the given segment shape.
9
- *
10
- * @param shape - Which segment position to clip for.
11
- * @returns Clip-path polygon string for inline style use.
12
- */
13
- function clipPathForShape(shape) {
14
- switch (shape) {
15
- case 'first':
16
- return `polygon(0 0, calc(100% - ${CHEVRON_PX}px) 0, 100% 50%, calc(100% - ${CHEVRON_PX}px) 100%, 0 100%)`;
17
- case 'middle':
18
- return `polygon(0 0, calc(100% - ${CHEVRON_PX}px) 0, 100% 50%, calc(100% - ${CHEVRON_PX}px) 100%, 0 100%, ${CHEVRON_PX}px 50%)`;
19
- case 'last':
20
- return `polygon(0 0, 100% 0, 100% 100%, 0 100%, ${CHEVRON_PX}px 50%)`;
21
- case 'only':
22
- default:
23
- return 'none';
24
- }
25
- }
26
- /**
27
- * Renders the arrow-shaped background shell shared by crumb and editable segments.
28
- */
29
- function SegmentShell({ shape, grow = false, className, children }) {
30
- const hasChevron = shape !== 'only';
31
- const clipPath = clipPathForShape(shape);
32
- const needsLeadingInset = shape !== 'first' && shape !== 'only';
33
- return (_jsx("div", { className: cn('hc-breadcrumb-segment relative flex min-h-[30px] min-w-0 items-center bg-sidebar py-2', grow ? 'min-w-[6rem] flex-1' : 'max-w-[45%] shrink-0', hasChevron && shape !== 'last' && '-mr-[6px]', !needsLeadingInset && 'pl-3', 'pr-3', className), style: {
34
- ...(clipPath !== 'none' ? { clipPath } : {}),
35
- ...(needsLeadingInset ? { paddingLeft: `${CHEVRON_PX + 8}px` } : {})
36
- }, children: _jsx("div", { className: "min-w-0 truncate", children: children }) }));
37
- }
38
- /**
39
- * Renders one leading, non-editable breadcrumb segment.
40
- */
41
- function CrumbSegment({ segment, shape }) {
42
- const contentClass = cn('block w-full truncate border-none bg-transparent p-0 text-left', segment.onClick && 'cursor-pointer hover:text-text focus-visible:text-text');
43
- /**
44
- * Stops click propagation so breadcrumb navigation does not trigger edit mode.
45
- *
46
- * @param event - Mouse event from a breadcrumb segment control.
47
- */
48
- const handleClick = (event) => {
49
- event.stopPropagation();
50
- segment.onClick?.();
51
- };
52
- return (_jsx(SegmentShell, { shape: shape, children: segment.onClick ? (_jsx("button", { type: "button", className: cn(contentClass, 'app-no-drag focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-accent'), onClick: handleClick, children: segment.label })) : (_jsx("span", { className: contentClass, children: segment.label })) }));
53
- }
54
- /**
55
- * Renders the trailing breadcrumb segment with click-to-edit behavior.
56
- */
57
- function EditableSegment({ value, placeholder, editableLabel, editing, shape, inputRef, onStartEditing, onStopEditing, onValueChange }) {
58
- return (_jsx(SegmentShell, { shape: shape, grow: true, children: editing ? (_jsx(Input, { ref: inputRef, variant: "plain", "aria-label": editableLabel, className: "app-no-drag w-full min-w-0 border-none bg-transparent p-0 font-semibold text-text outline-none", type: "text", value: value, onChange: (event) => onValueChange(event.target.value), onBlur: onStopEditing, onKeyDown: (event) => {
59
- if (event.key === 'Enter' || event.key === 'Escape') {
60
- event.preventDefault();
61
- onStopEditing();
62
- }
63
- } })) : (_jsx("button", { type: "button", "aria-current": "page", "aria-label": editableLabel, className: "app-no-drag flex w-full min-w-0 cursor-text items-center border-none bg-transparent p-0 text-left font-semibold text-text hover:opacity-80 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-[-2px] focus-visible:outline-accent", onClick: onStartEditing, children: _jsx("span", { className: "min-w-0 truncate", children: value ? value : _jsx("span", { className: "font-normal text-muted", children: placeholder }) }) })) }));
64
- }
4
+ import { CrumbSegment } from './CrumbSegment.js';
5
+ import { EditableSegment } from './EditableSegment.js';
65
6
  /**
66
7
  * Full-width breadcrumb bar with interlocking arrow-shaped segments. Leading
67
8
  * segments are optionally clickable; the trailing segment is inline-editable.
@@ -0,0 +1,18 @@
1
+ /**
2
+ * One non-editable breadcrumb segment rendered before the trailing editable item.
3
+ */
4
+ export interface BreadcrumbSegment {
5
+ /**
6
+ * Visible label for the segment.
7
+ */
8
+ label: string;
9
+ /**
10
+ * Optional stable key; falls back to the segment index when omitted.
11
+ */
12
+ id?: string;
13
+ /**
14
+ * When set, the segment renders as a navigable button.
15
+ */
16
+ onClick?: () => void;
17
+ }
18
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/Breadcrumb/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,EAAE,CAAC,EAAE,MAAM,CAAC;IAEZ;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,51 @@
1
+ import type { JSX, ReactNode } from 'react';
2
+ /**
3
+ * One category chip shown on a marketplace catalog card.
4
+ */
5
+ export interface CatalogCardCategory {
6
+ /**
7
+ * Stable category id used as the chip key.
8
+ */
9
+ id: string;
10
+ /**
11
+ * Human-readable label rendered inside the chip.
12
+ */
13
+ label: string;
14
+ }
15
+ export interface Props {
16
+ /**
17
+ * Marketplace listing display name.
18
+ */
19
+ name: string;
20
+ /**
21
+ * Published version string shown beside the name.
22
+ */
23
+ version: string;
24
+ /**
25
+ * Short summary text clamped to three lines.
26
+ */
27
+ summary: string;
28
+ /**
29
+ * Opens the catalog detail view for this listing.
30
+ */
31
+ onOpen: () => void;
32
+ /**
33
+ * Optional preview slot, typically a screenshot carousel.
34
+ * When omitted, a "No preview" placeholder is rendered.
35
+ */
36
+ preview?: ReactNode;
37
+ /**
38
+ * Category chips rendered below the summary.
39
+ * Omit or pass an empty array to hide the chip row.
40
+ */
41
+ categories?: CatalogCardCategory[];
42
+ /**
43
+ * Optional footer slot for action buttons or status rows.
44
+ */
45
+ footer?: ReactNode;
46
+ }
47
+ /**
48
+ * Compact marketplace preview card; opens the detail view on activation.
49
+ */
50
+ export declare function CatalogCard({ name, version, summary, onOpen, preview, categories, footer }: Props): JSX.Element;
51
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/CatalogCard/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAiB,SAAS,EAAE,MAAM,OAAO,CAAC;AAK3D;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC;;OAEG;IACH,EAAE,EAAE,MAAM,CAAC;IAEX;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,KAAK;IACpB;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,MAAM,EAAE,MAAM,IAAI,CAAC;IAEnB;;;OAGG;IACH,OAAO,CAAC,EAAE,SAAS,CAAC;IAEpB;;;OAGG;IACH,UAAU,CAAC,EAAE,mBAAmB,EAAE,CAAC;IAEnC;;OAEG;IACH,MAAM,CAAC,EAAE,SAAS,CAAC;CACpB;AAeD;;GAEG;AACH,wBAAgB,WAAW,CAAC,EAC1B,IAAI,EACJ,OAAO,EACP,OAAO,EACP,MAAM,EACN,OAAO,EACP,UAAU,EACV,MAAM,EACP,EAAE,KAAK,GAAG,GAAG,CAAC,OAAO,CAyCrB"}
@@ -0,0 +1,23 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "@harborclient/sdk/jsx-runtime";
2
+ import { Badge } from '../Badge/index.js';
3
+ import { Card } from '../Card/index.js';
4
+ import { cn } from '../utils.js';
5
+ /**
6
+ * Opens the detail view when the card is activated from the keyboard.
7
+ *
8
+ * @param event - Keyboard event on the card list item.
9
+ * @param onOpen - Handler that opens the catalog detail view.
10
+ */
11
+ function handleKeyDown(event, onOpen) {
12
+ if (event.key === 'Enter' || event.key === ' ') {
13
+ event.preventDefault();
14
+ onOpen();
15
+ }
16
+ }
17
+ /**
18
+ * Compact marketplace preview card; opens the detail view on activation.
19
+ */
20
+ export function CatalogCard({ name, version, summary, onOpen, preview, categories, footer }) {
21
+ const showCategories = categories != null && categories.length > 0;
22
+ return (_jsx("li", { tabIndex: 0, "aria-label": `View details for ${name}`, onClick: onOpen, onKeyDown: (event) => handleKeyDown(event, onOpen), children: _jsxs(Card, { className: "h-full cursor-pointer flex-col overflow-hidden hover:bg-selection/40", children: [preview ?? (_jsx("div", { className: "bg-panel flex aspect-video w-full items-center justify-center border-b border-separator text-[14px] text-muted", "aria-hidden": true, children: "No preview" })), _jsxs(Card.Body, { className: "flex flex-1 flex-col gap-1.5 p-3", children: [_jsxs("div", { className: "flex items-baseline justify-between gap-2", children: [_jsx("h3", { className: "m-0 min-w-0 truncate text-[14px] font-semibold text-text", children: name }), _jsx("span", { className: "shrink-0 text-[14px] text-muted", children: version })] }), _jsx("p", { className: "m-0 line-clamp-3 text-[14px] text-text", children: summary }), showCategories ? (_jsx("div", { className: "mt-auto flex flex-wrap gap-1.5 pt-1.5", children: categories.map((category) => (_jsx(Badge, { variant: "category", className: "px-2", children: category.label }, category.id))) })) : null] }), footer != null ? _jsx("div", { className: cn('border-t border-separator'), children: footer }) : null] }) }));
23
+ }
@@ -0,0 +1,13 @@
1
+ import type { JSX } from 'react';
2
+ interface Props {
3
+ /**
4
+ * Raw markdown string from a catalog README or description file.
5
+ */
6
+ content: string;
7
+ }
8
+ /**
9
+ * Renders catalog README markdown with GFM support and GitHub-like spacing.
10
+ */
11
+ export declare function CatalogReadmeMarkdown({ content }: Props): JSX.Element;
12
+ export {};
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/CatalogReadmeMarkdown/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAIjC,UAAU,KAAK;IACb;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;CACjB;AAyGD;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,EAAE,OAAO,EAAE,EAAE,KAAK,GAAG,GAAG,CAAC,OAAO,CAUrE"}
@@ -0,0 +1,53 @@
1
+ import { jsx as _jsx } from "@harborclient/sdk/jsx-runtime";
2
+ import ReactMarkdown from 'react-markdown';
3
+ import remarkGfm from 'remark-gfm';
4
+ /**
5
+ * Builds react-markdown component overrides styled like a GitHub README.
6
+ *
7
+ * Uses explicit element classes instead of Tailwind Typography so spacing and
8
+ * font sizes stay predictable within HarborClient theme tokens.
9
+ *
10
+ * @returns Component map for {@link ReactMarkdown}.
11
+ */
12
+ function createReadmeMarkdownComponents() {
13
+ return {
14
+ p: ({ children }) => _jsx("p", { className: "mb-4 break-words last:mb-0", children: children }),
15
+ a: ({ href, children }) => (_jsx("a", { href: href, target: "_blank", rel: "noopener noreferrer", className: "text-accent underline underline-offset-2 hover:opacity-90", children: children })),
16
+ ul: ({ children }) => (_jsx("ul", { className: "my-4 list-disc space-y-2 pl-6 last:mb-0 [&>li]:break-words", children: children })),
17
+ ol: ({ children }) => (_jsx("ol", { className: "my-4 list-decimal space-y-2 pl-6 last:mb-0 [&>li]:break-words", children: children })),
18
+ li: ({ children }) => (_jsx("li", { className: "break-words [&>p]:mb-2 [&>p:last-child]:mb-0", children: children })),
19
+ blockquote: ({ children }) => (_jsx("blockquote", { className: "my-4 border-l-4 border-separator pl-4 text-muted [&>p:last-child]:mb-0", children: children })),
20
+ hr: () => _jsx("hr", { className: "my-6 border-separator" }),
21
+ h1: ({ children }) => (_jsx("h1", { className: "mt-6 mb-4 border-b border-separator pb-2 text-[20px] font-semibold first:mt-0", children: children })),
22
+ h2: ({ children }) => (_jsx("h2", { className: "mt-6 mb-3 border-b border-separator pb-2 text-[18px] font-semibold first:mt-0", children: children })),
23
+ h3: ({ children }) => _jsx("h3", { className: "mt-5 mb-3 font-semibold first:mt-0", children: children }),
24
+ h4: ({ children }) => (_jsx("h4", { className: "mt-4 mb-2 text-[14px] font-semibold first:mt-0", children: children })),
25
+ h5: ({ children }) => (_jsx("h5", { className: "mt-4 mb-2 text-[14px] font-semibold first:mt-0", children: children })),
26
+ h6: ({ children }) => (_jsx("h6", { className: "mt-4 mb-2 text-[14px] font-semibold first:mt-0", children: children })),
27
+ pre: ({ children }) => (_jsx("pre", { className: "my-4 overflow-x-auto rounded-md border border-separator bg-sidebar p-4 font-mono text-[14px]", children: children })),
28
+ code: ({ className, children }) => {
29
+ const isBlock = typeof className === 'string' && className.includes('language-');
30
+ if (isBlock) {
31
+ return (_jsx("code", { className: `font-mono text-[14px] ${className ?? ''}`.trim(), children: children }));
32
+ }
33
+ return (_jsx("code", { className: "rounded bg-sidebar px-1.5 py-0.5 font-mono text-[14px]", children: children }));
34
+ },
35
+ table: ({ children }) => (_jsx("div", { className: "my-4 overflow-x-auto last:mb-0", children: _jsx("table", { className: "w-full border-collapse text-left text-[14px]", children: children }) })),
36
+ thead: ({ children }) => _jsx("thead", { children: children }),
37
+ tbody: ({ children }) => _jsx("tbody", { children: children }),
38
+ tr: ({ children }) => _jsx("tr", { children: children }),
39
+ th: ({ children }) => (_jsx("th", { className: "border border-separator bg-sidebar/40 px-2 py-1 align-top font-semibold", children: children })),
40
+ td: ({ children }) => (_jsx("td", { className: "border border-separator px-2 py-1 align-top", children: children })),
41
+ img: ({ src, alt }) => (_jsx("img", { src: src, alt: alt ?? '', className: "my-4 max-w-full rounded-md border border-separator" })),
42
+ strong: ({ children }) => _jsx("strong", { className: "font-semibold", children: children }),
43
+ em: ({ children }) => _jsx("em", { className: "italic", children: children }),
44
+ del: ({ children }) => _jsx("del", { className: "opacity-80", children: children })
45
+ };
46
+ }
47
+ /**
48
+ * Renders catalog README markdown with GFM support and GitHub-like spacing.
49
+ */
50
+ export function CatalogReadmeMarkdown({ content }) {
51
+ const components = createReadmeMarkdownComponents();
52
+ return (_jsx("div", { className: "leading-relaxed break-words text-text [&>*:first-child]:mt-0 [&>*:last-child]:mb-0", children: _jsx(ReactMarkdown, { remarkPlugins: [remarkGfm], components: components, children: content }) }));
53
+ }
@@ -57,12 +57,17 @@ interface Props extends Omit<ComponentPropsWithoutRef<'div'>, 'children' | 'clas
57
57
  * Extra classes on the label element (associated and checkboxAdjacent layouts).
58
58
  */
59
59
  labelClassName?: string;
60
+ /**
61
+ * When false, omits the default border and padding on stacked, checkbox, and
62
+ * inline layouts for fields nested inside an already-bordered section.
63
+ */
64
+ bordered?: boolean;
60
65
  }
61
66
  /**
62
67
  * Reusable form field wrapper that pairs a label with one or more controls.
63
68
  * Supports stacked fields, checkboxes, inline rows, radio options, and
64
69
  * adjacent checkbox rows used in list pickers.
65
70
  */
66
- export declare function FormGroup({ label, children, htmlFor, description, error, errorId, descriptionId, layout, labelTone, srOnly, className, labelClassName, ...props }: Props): JSX.Element;
71
+ export declare function FormGroup({ label, children, htmlFor, description, error, errorId, descriptionId, layout, labelTone, srOnly, className, labelClassName, bordered, ...props }: Props): JSX.Element;
67
72
  export {};
68
73
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/FormGroup/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,wBAAwB,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAItE;;GAEG;AACH,MAAM,MAAM,eAAe,GACvB,SAAS,GACT,UAAU,GACV,QAAQ,GACR,OAAO,GACP,kBAAkB,GAClB,YAAY,CAAC;AAEjB;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,OAAO,CAAC;AAErD,UAAU,KAAM,SAAQ,IAAI,CAAC,wBAAwB,CAAC,KAAK,CAAC,EAAE,UAAU,GAAG,WAAW,CAAC;IACrF;;OAEG;IACH,KAAK,EAAE,SAAS,CAAC;IAEjB;;OAEG;IACH,QAAQ,CAAC,EAAE,SAAS,CAAC;IAErB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;OAGG;IACH,WAAW,CAAC,EAAE,SAAS,CAAC;IAExB;;OAEG;IACH,KAAK,CAAC,EAAE,SAAS,CAAC;IAElB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;OAEG;IACH,MAAM,CAAC,EAAE,eAAe,CAAC;IAEzB;;OAEG;IACH,SAAS,CAAC,EAAE,kBAAkB,CAAC;IAE/B;;OAEG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IAEjB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAkBD;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,EACxB,KAAK,EACL,QAAQ,EACR,OAAO,EACP,WAAW,EACX,KAAK,EACL,OAAO,EACP,aAAa,EACb,MAAkB,EAClB,SAAqB,EACrB,MAAc,EACd,SAAS,EACT,cAAc,EACd,GAAG,KAAK,EACT,EAAE,KAAK,GAAG,GAAG,CAAC,OAAO,CAoJrB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/FormGroup/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,wBAAwB,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAItE;;GAEG;AACH,MAAM,MAAM,eAAe,GACvB,SAAS,GACT,UAAU,GACV,QAAQ,GACR,OAAO,GACP,kBAAkB,GAClB,YAAY,CAAC;AAEjB;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,OAAO,CAAC;AAErD,UAAU,KAAM,SAAQ,IAAI,CAAC,wBAAwB,CAAC,KAAK,CAAC,EAAE,UAAU,GAAG,WAAW,CAAC;IACrF;;OAEG;IACH,KAAK,EAAE,SAAS,CAAC;IAEjB;;OAEG;IACH,QAAQ,CAAC,EAAE,SAAS,CAAC;IAErB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;OAGG;IACH,WAAW,CAAC,EAAE,SAAS,CAAC;IAExB;;OAEG;IACH,KAAK,CAAC,EAAE,SAAS,CAAC;IAElB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;OAEG;IACH,MAAM,CAAC,EAAE,eAAe,CAAC;IAEzB;;OAEG;IACH,SAAS,CAAC,EAAE,kBAAkB,CAAC;IAE/B;;OAEG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IAEjB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAoCD;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,EACxB,KAAK,EACL,QAAQ,EACR,OAAO,EACP,WAAW,EACX,KAAK,EACL,OAAO,EACP,aAAa,EACb,MAAkB,EAClB,SAAqB,EACrB,MAAc,EACd,SAAS,EACT,cAAc,EACd,QAAe,EACf,GAAG,KAAK,EACT,EAAE,KAAK,GAAG,GAAG,CAAC,OAAO,CAkJrB"}
@@ -2,6 +2,23 @@ import { jsx as _jsx, jsxs as _jsxs } from "@harborclient/sdk/jsx-runtime";
2
2
  import { useId } from '@harborclient/sdk/react';
3
3
  import { FieldError } from '../FieldError/index.js';
4
4
  import { enhanceControl } from '../enhanceControl.js';
5
+ /**
6
+ * Returns Tailwind classes for the label text based on tone and visibility.
7
+ *
8
+ * @returns Class string for the label element.
9
+ */
10
+ /**
11
+ * Returns wrapper classes for bordered stacked, checkbox, and inline layouts.
12
+ *
13
+ * @param bordered - Whether the default border and padding should be applied.
14
+ * @param layoutClasses - Layout-specific flex and sizing classes.
15
+ * @param extra - Caller-supplied className override.
16
+ */
17
+ function borderedWrapperClasses(bordered, layoutClasses, extra) {
18
+ const frame = bordered ? 'p-4 border border-separator rounded-md' : '';
19
+ const base = `hc-form-group ${layoutClasses} ${frame}`.trim();
20
+ return extra ? `${base} ${extra}` : base;
21
+ }
5
22
  /**
6
23
  * Returns Tailwind classes for the label text based on tone and visibility.
7
24
  *
@@ -22,7 +39,7 @@ function labelClasses(tone, srOnly, inline) {
22
39
  * Supports stacked fields, checkboxes, inline rows, radio options, and
23
40
  * adjacent checkbox rows used in list pickers.
24
41
  */
25
- export function FormGroup({ label, children, htmlFor, description, error, errorId, descriptionId, layout = 'stacked', labelTone = 'default', srOnly = false, className, labelClassName, ...props }) {
42
+ export function FormGroup({ label, children, htmlFor, description, error, errorId, descriptionId, layout = 'stacked', labelTone = 'default', srOnly = false, className, labelClassName, bordered = true, ...props }) {
26
43
  const generatedId = useId();
27
44
  const controlId = htmlFor ?? generatedId;
28
45
  const extra = className ?? '';
@@ -63,15 +80,11 @@ export function FormGroup({ label, children, htmlFor, description, error, errorI
63
80
  id: controlId,
64
81
  invalid: resolvedErrorId != null
65
82
  });
66
- const wrapperClasses = extra
67
- ? `hc-form-group flex flex-col gap-1 p-4 border border-separator rounded-md ${extra}`
68
- : 'hc-form-group flex flex-col gap-1 p-4 border border-separator rounded-md';
83
+ const wrapperClasses = borderedWrapperClasses(bordered, 'flex flex-col gap-1', extra);
69
84
  return (_jsxs("div", { ...props, className: wrapperClasses, children: [_jsxs("label", { htmlFor: controlId, className: "hc-form-group-label flex flex-col gap-1", children: [_jsxs("span", { className: "hc-form-group-label-row flex items-center gap-2", children: [linkedChildren, _jsx("span", { className: labelClasses(labelTone, srOnly, false), children: label })] }), resolvedDescriptionId ? (_jsx("p", { id: resolvedDescriptionId, className: "hc-form-group-description m-0 pl-[26px] text-[14px] text-muted", children: description })) : null] }), resolvedErrorId ? (_jsx(FieldError, { id: resolvedErrorId, spacing: "field", children: error })) : null] }));
70
85
  }
71
86
  if (layout === 'inline') {
72
- const wrapperClasses = extra
73
- ? `hc-form-group flex min-w-0 flex-1 items-center gap-2 p-4 border border-separator rounded-md ${extra}`
74
- : 'hc-form-group flex min-w-0 flex-1 items-center gap-2 p-4 border border-separator rounded-md';
87
+ const wrapperClasses = borderedWrapperClasses(bordered, 'flex min-w-0 flex-1 items-center gap-2', extra);
75
88
  const linkedChildren = enhanceControl(children, { id: controlId });
76
89
  return (_jsxs("label", { htmlFor: controlId, className: wrapperClasses, children: [_jsx("span", { className: labelClasses(labelTone, srOnly, true), children: label }), linkedChildren] }));
77
90
  }
@@ -88,8 +101,6 @@ export function FormGroup({ label, children, htmlFor, description, error, errorI
88
101
  invalid: resolvedErrorId != null,
89
102
  id: htmlFor
90
103
  });
91
- const wrapperClasses = extra
92
- ? `hc-form-group flex flex-col gap-1 p-4 border border-separator rounded-md ${extra}`
93
- : 'hc-form-group flex flex-col gap-1 p-4 border border-separator rounded-md';
104
+ const wrapperClasses = borderedWrapperClasses(bordered, 'flex flex-col gap-1', extra);
94
105
  return (_jsxs("div", { ...props, className: wrapperClasses, children: [_jsxs("label", { htmlFor: htmlFor, className: "hc-form-group-label flex flex-col gap-1", children: [_jsx("span", { className: labelClasses(labelTone, srOnly, false), children: label }), resolvedDescriptionId ? (_jsx("p", { id: resolvedDescriptionId, className: "hc-form-group-description m-0 text-[14px] text-muted", children: description })) : null, control] }), resolvedErrorId ? (_jsx(FieldError, { id: resolvedErrorId, spacing: "field", children: error })) : null] }));
95
106
  }
@@ -0,0 +1,37 @@
1
+ import type { JSX, ReactNode } from 'react';
2
+ export interface Props {
3
+ /**
4
+ * Section heading text or node.
5
+ */
6
+ title: ReactNode;
7
+ /**
8
+ * Helper copy shown below the title.
9
+ */
10
+ description: ReactNode;
11
+ /**
12
+ * Editor and any trailing controls for this section.
13
+ */
14
+ children: ReactNode;
15
+ /**
16
+ * When true, stretches the section to fill remaining vertical space in script tabs.
17
+ */
18
+ fill?: boolean;
19
+ /**
20
+ * Extra classes appended to the outer wrapper.
21
+ */
22
+ className?: string;
23
+ /**
24
+ * Overrides the default title classes (`text-[18px] text-muted`).
25
+ */
26
+ titleClassName?: string;
27
+ /**
28
+ * Optional id on the title span for label associations.
29
+ */
30
+ titleId?: string;
31
+ }
32
+ /**
33
+ * Shared settings section shell: title, description, and editor content.
34
+ * Used across collection, folder, environment, and globals settings views.
35
+ */
36
+ export declare function FormSection({ title, description, children, fill, className, titleClassName, titleId }: Props): JSX.Element;
37
+ //# sourceMappingURL=index.d.ts.map