@knkcs/anker 1.9.4 → 1.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CLAUDE-ANKER.md CHANGED
@@ -90,6 +90,37 @@ Full spec with composition diagrams, slot tables, and authoring rules: `docs/pag
90
90
 
91
91
  ---
92
92
 
93
+ ## DataTable cells
94
+
95
+ anker ships 16 reusable cell components for `<DataTable>` columns under `@knkcs/anker/components/data-table/cells`. **Use cells before composing primitives.** Inline `<Badge>` / `<Box>` / `<Text>` / `<Tooltip>` cell content fragments the visual language and silently misses later improvements (a11y, dark mode, density).
96
+
97
+ **Rule:** cells are the contract — if no cell fits, file an issue and propose a new cell. Don't hand-roll.
98
+
99
+ | Cell | Use for |
100
+ |---|---|
101
+ | `ActionCell` | row action icons |
102
+ | `BooleanCell` | yes/no |
103
+ | `CodeCell` | monospace code |
104
+ | `ColorSwatchCell` | color swatch |
105
+ | `CountCell` | "N items" |
106
+ | `DateCell` | timestamps |
107
+ | `DeviceCell` | User-Agent → browser/OS + tooltip |
108
+ | `IdentityCell` | avatar + name (+ subText) |
109
+ | `LinkCell` | internal link |
110
+ | `MenuCell` | row overflow menu |
111
+ | `NumberCell` | numbers |
112
+ | `SlugCell` | mono IDs |
113
+ | `StatusBadgeCell` | status pill (+ optional `tooltip`) |
114
+ | `SwitchCell` | inline toggle |
115
+ | `TruncatedTextCell` | text (+ optional `subText`, `maxLength`) |
116
+ | `UrlCell` | external URL |
117
+
118
+ Import path: `@knkcs/anker/components/data-table/cells`.
119
+
120
+ Full slot/prop tables: `docs/react-table-reference.md`. Mapping guide for common column intents: `docs/page-patterns.md` §11.13.
121
+
122
+ ---
123
+
93
124
  ## Pointers
94
125
 
95
126
  - Full spec: anker GitHub Pages docs site (`/design-system`, `/page-patterns`)
@@ -1,7 +1,7 @@
1
- import { Prose, Avatar } from '../chunk-ZFBDVERP.js';
2
- import { formatRelativeToCurrentWeekDateTime, formatRelativeDateTime } from '../chunk-NQN6LXYU.js';
3
- export { StatusBadge, formatRelativeDateTime, formatRelativeToCurrentWeekDateTime } from '../chunk-NQN6LXYU.js';
4
- import { Tooltip, Table, MenuRoot, MenuTrigger, MenuContent, MenuItem, Badge } from '../chunk-2QFOWHTU.js';
1
+ import { Prose } from '../chunk-VOGT33LU.js';
2
+ import { formatRelativeToCurrentWeekDateTime, formatRelativeDateTime } from '../chunk-ELQTHWXC.js';
3
+ export { StatusBadge, formatRelativeDateTime, formatRelativeToCurrentWeekDateTime } from '../chunk-ELQTHWXC.js';
4
+ import { Tooltip, Avatar, Table, MenuRoot, MenuTrigger, MenuContent, MenuItem, Badge } from '../chunk-2ZWZ2WAS.js';
5
5
  export { SearchInput } from '../chunk-E7KRPPCQ.js';
6
6
  import { Textarea } from '../chunk-NFZMG6ZL.js';
7
7
  import { text_input_default } from '../chunk-OU6H3KU4.js';
@@ -1,9 +1,23 @@
1
- import { Menu, Portal, AbsoluteCenter, Tooltip as Tooltip$1 } from '@chakra-ui/react';
1
+ import { AvatarGroup as AvatarGroup$1, Menu, Avatar as Avatar$1, Portal, AbsoluteCenter, Tooltip as Tooltip$1 } from '@chakra-ui/react';
2
2
  export { Badge, Table } from '@chakra-ui/react';
3
+ import { jsxs, jsx } from 'react/jsx-runtime';
3
4
  import { Check, ChevronRight } from 'lucide-react';
4
- import { jsx, jsxs } from 'react/jsx-runtime';
5
5
 
6
- // src/primitives/badge.tsx
6
+ // src/primitives/avatar.tsx
7
+ var Avatar = function Avatar2({
8
+ ref,
9
+ ...props
10
+ }) {
11
+ const { name, src, srcSet, loading, icon, fallback, children, ...rest } = props;
12
+ return /* @__PURE__ */ jsxs(Avatar$1.Root, { ref, ...rest, children: [
13
+ /* @__PURE__ */ jsx(Avatar$1.Fallback, { name, children: icon || fallback }),
14
+ /* @__PURE__ */ jsx(Avatar$1.Image, { src, srcSet, loading }),
15
+ children
16
+ ] });
17
+ };
18
+ Avatar.displayName = "Avatar";
19
+ var AvatarGroup = AvatarGroup$1;
20
+ AvatarGroup.displayName = "AvatarGroup";
7
21
  var MenuContent = function MenuContent2({
8
22
  ref,
9
23
  ...props
@@ -104,6 +118,6 @@ var Tooltip = function Tooltip2({
104
118
  };
105
119
  Tooltip.displayName = "Tooltip";
106
120
 
107
- export { MenuArrow, MenuCheckboxItem, MenuContent, MenuContextTrigger, MenuItem, MenuItemCommand, MenuItemGroup, MenuItemText, MenuRadioItem, MenuRadioItemGroup, MenuRoot, MenuSeparator, MenuTrigger, MenuTriggerItem, Tooltip };
108
- //# sourceMappingURL=chunk-2QFOWHTU.js.map
109
- //# sourceMappingURL=chunk-2QFOWHTU.js.map
121
+ export { Avatar, AvatarGroup, MenuArrow, MenuCheckboxItem, MenuContent, MenuContextTrigger, MenuItem, MenuItemCommand, MenuItemGroup, MenuItemText, MenuRadioItem, MenuRadioItemGroup, MenuRoot, MenuSeparator, MenuTrigger, MenuTriggerItem, Tooltip };
122
+ //# sourceMappingURL=chunk-2ZWZ2WAS.js.map
123
+ //# sourceMappingURL=chunk-2ZWZ2WAS.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/primitives/avatar.tsx","../src/primitives/menu.tsx","../src/primitives/tooltip.tsx"],"names":["Avatar","ChakraAvatar","ChakraAvatarGroup","MenuContent","jsx","ChakraMenu","MenuArrow","MenuCheckboxItem","jsxs","MenuRadioItem","MenuItemGroup","MenuTriggerItem","Tooltip","ChakraTooltip","Portal"],"mappings":"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","file":"chunk-2ZWZ2WAS.js","sourcesContent":["import {\n\tAvatar as ChakraAvatar,\n\tAvatarGroup as ChakraAvatarGroup,\n} from \"@chakra-ui/react\";\nimport type * as React from \"react\";\n\ntype ImageProps = React.ImgHTMLAttributes<HTMLImageElement>;\n\nexport interface AvatarProps extends ChakraAvatar.RootProps {\n\t/** Display name used to generate initials for the fallback. */\n\tname?: string;\n\t/** Image source URL. */\n\tsrc?: string;\n\t/** Image srcSet attribute for responsive images. */\n\tsrcSet?: string;\n\t/** Image loading strategy. */\n\tloading?: ImageProps[\"loading\"];\n\t/** Custom icon element shown as fallback. */\n\ticon?: React.ReactElement;\n\t/** Custom fallback content when no image or icon is provided. */\n\tfallback?: React.ReactNode;\n}\n\nexport const Avatar = function Avatar({\n\tref,\n\t...props\n}: AvatarProps & { ref?: React.Ref<HTMLDivElement> }) {\n\tconst { name, src, srcSet, loading, icon, fallback, children, ...rest } =\n\t\tprops;\n\treturn (\n\t\t<ChakraAvatar.Root ref={ref} {...rest}>\n\t\t\t<ChakraAvatar.Fallback name={name}>\n\t\t\t\t{icon || fallback}\n\t\t\t</ChakraAvatar.Fallback>\n\t\t\t<ChakraAvatar.Image src={src} srcSet={srcSet} loading={loading} />\n\t\t\t{children}\n\t\t</ChakraAvatar.Root>\n\t);\n};\nAvatar.displayName = \"Avatar\";\n\nexport const AvatarGroup = ChakraAvatarGroup;\nAvatarGroup.displayName = \"AvatarGroup\";\n","\"use client\";\n\nimport { AbsoluteCenter, Menu as ChakraMenu, Portal } from \"@chakra-ui/react\";\nimport { Check, ChevronRight } from \"lucide-react\";\nimport type * as React from \"react\";\n\ninterface MenuContentProps extends ChakraMenu.ContentProps {\n\t/** Whether to render the menu content inside a portal. @default true */\n\tportalled?: boolean;\n\t/** Container ref for the portal. */\n\tportalRef?: React.RefObject<HTMLElement | null>;\n}\n\nexport const MenuContent = function MenuContent({\n\tref,\n\t...props\n}: MenuContentProps & { ref?: React.Ref<HTMLDivElement> }) {\n\tconst { portalled = true, portalRef, ...rest } = props;\n\treturn (\n\t\t<Portal disabled={!portalled} container={portalRef}>\n\t\t\t<ChakraMenu.Positioner>\n\t\t\t\t<ChakraMenu.Content ref={ref} {...rest} />\n\t\t\t</ChakraMenu.Positioner>\n\t\t</Portal>\n\t);\n};\nMenuContent.displayName = \"MenuContent\";\n\nexport const MenuArrow = function MenuArrow({\n\tref,\n\t...props\n}: ChakraMenu.ArrowProps & { ref?: React.Ref<HTMLDivElement> }) {\n\treturn (\n\t\t<ChakraMenu.Arrow ref={ref} {...props}>\n\t\t\t<ChakraMenu.ArrowTip />\n\t\t</ChakraMenu.Arrow>\n\t);\n};\nMenuArrow.displayName = \"MenuArrow\";\n\nexport const MenuCheckboxItem = function MenuCheckboxItem({\n\tref,\n\t...props\n}: ChakraMenu.CheckboxItemProps & { ref?: React.Ref<HTMLDivElement> }) {\n\treturn (\n\t\t<ChakraMenu.CheckboxItem ps=\"8\" ref={ref} {...props}>\n\t\t\t<AbsoluteCenter axis=\"horizontal\" insetStart=\"4\" asChild>\n\t\t\t\t<ChakraMenu.ItemIndicator>\n\t\t\t\t\t<Check />\n\t\t\t\t</ChakraMenu.ItemIndicator>\n\t\t\t</AbsoluteCenter>\n\t\t\t{props.children}\n\t\t</ChakraMenu.CheckboxItem>\n\t);\n};\nMenuCheckboxItem.displayName = \"MenuCheckboxItem\";\n\nexport const MenuRadioItem = function MenuRadioItem({\n\tref,\n\t...props\n}: ChakraMenu.RadioItemProps & { ref?: React.Ref<HTMLDivElement> }) {\n\tconst { children, ...rest } = props;\n\treturn (\n\t\t<ChakraMenu.RadioItem ps=\"8\" ref={ref} {...rest}>\n\t\t\t<AbsoluteCenter axis=\"horizontal\" insetStart=\"4\" asChild>\n\t\t\t\t<ChakraMenu.ItemIndicator>\n\t\t\t\t\t<Check />\n\t\t\t\t</ChakraMenu.ItemIndicator>\n\t\t\t</AbsoluteCenter>\n\t\t\t<ChakraMenu.ItemText>{children}</ChakraMenu.ItemText>\n\t\t</ChakraMenu.RadioItem>\n\t);\n};\nMenuRadioItem.displayName = \"MenuRadioItem\";\n\nexport const MenuItemGroup = function MenuItemGroup({\n\tref,\n\t...props\n}: ChakraMenu.ItemGroupProps & { ref?: React.Ref<HTMLDivElement> }) {\n\tconst { title, children, ...rest } = props;\n\treturn (\n\t\t<ChakraMenu.ItemGroup ref={ref} {...rest}>\n\t\t\t{title && (\n\t\t\t\t<ChakraMenu.ItemGroupLabel userSelect=\"none\">\n\t\t\t\t\t{title}\n\t\t\t\t</ChakraMenu.ItemGroupLabel>\n\t\t\t)}\n\t\t\t{children}\n\t\t</ChakraMenu.ItemGroup>\n\t);\n};\nMenuItemGroup.displayName = \"MenuItemGroup\";\n\nexport interface MenuTriggerItemProps extends ChakraMenu.ItemProps {\n\t/** Icon rendered before the trigger item label. */\n\tstartIcon?: React.ReactNode;\n}\n\nexport const MenuTriggerItem = function MenuTriggerItem({\n\tref,\n\t...props\n}: MenuTriggerItemProps & { ref?: React.Ref<HTMLDivElement> }) {\n\tconst { startIcon, children, ...rest } = props;\n\treturn (\n\t\t<ChakraMenu.TriggerItem ref={ref} {...rest}>\n\t\t\t{startIcon}\n\t\t\t{children}\n\t\t\t<ChevronRight />\n\t\t</ChakraMenu.TriggerItem>\n\t);\n};\nMenuTriggerItem.displayName = \"MenuTriggerItem\";\n\nexport const MenuRadioItemGroup = ChakraMenu.RadioItemGroup;\nMenuRadioItemGroup.displayName = \"MenuRadioItemGroup\";\nexport const MenuContextTrigger = ChakraMenu.ContextTrigger;\nMenuContextTrigger.displayName = \"MenuContextTrigger\";\nexport const MenuRoot = ChakraMenu.Root;\nMenuRoot.displayName = \"MenuRoot\";\nexport const MenuSeparator = ChakraMenu.Separator;\nMenuSeparator.displayName = \"MenuSeparator\";\n\nexport const MenuItem = ChakraMenu.Item;\nMenuItem.displayName = \"MenuItem\";\nexport const MenuItemText = ChakraMenu.ItemText;\nMenuItemText.displayName = \"MenuItemText\";\nexport const MenuItemCommand = ChakraMenu.ItemCommand;\nMenuItemCommand.displayName = \"MenuItemCommand\";\nexport const MenuTrigger = ChakraMenu.Trigger;\nMenuTrigger.displayName = \"MenuTrigger\";\n","import { Tooltip as ChakraTooltip, Portal } from \"@chakra-ui/react\";\nimport type * as React from \"react\";\n\nexport interface TooltipProps extends ChakraTooltip.RootProps {\n\tshowArrow?: boolean;\n\tportalled?: boolean;\n\tportalRef?: React.RefObject<HTMLElement | null>;\n\tcontent: React.ReactNode;\n\tcontentProps?: ChakraTooltip.ContentProps;\n\tdisabled?: boolean;\n}\n\nexport const Tooltip = function Tooltip({\n\tref,\n\t...props\n}: TooltipProps & { ref?: React.Ref<HTMLDivElement> }) {\n\tconst {\n\t\tshowArrow,\n\t\tchildren,\n\t\tdisabled,\n\t\tportalled = true,\n\t\tcontent,\n\t\tcontentProps,\n\t\tportalRef,\n\t\t...rest\n\t} = props;\n\n\tif (disabled) return children;\n\n\treturn (\n\t\t<ChakraTooltip.Root {...rest}>\n\t\t\t<ChakraTooltip.Trigger asChild>{children}</ChakraTooltip.Trigger>\n\t\t\t<Portal disabled={!portalled} container={portalRef}>\n\t\t\t\t<ChakraTooltip.Positioner>\n\t\t\t\t\t<ChakraTooltip.Content ref={ref} {...contentProps}>\n\t\t\t\t\t\t{showArrow && (\n\t\t\t\t\t\t\t<ChakraTooltip.Arrow>\n\t\t\t\t\t\t\t\t<ChakraTooltip.ArrowTip />\n\t\t\t\t\t\t\t</ChakraTooltip.Arrow>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{content}\n\t\t\t\t\t</ChakraTooltip.Content>\n\t\t\t\t</ChakraTooltip.Positioner>\n\t\t\t</Portal>\n\t\t</ChakraTooltip.Root>\n\t);\n};\nTooltip.displayName = \"Tooltip\";\n"]}
@@ -1,4 +1,4 @@
1
- import { Badge } from './chunk-2QFOWHTU.js';
1
+ import { Badge } from './chunk-2ZWZ2WAS.js';
2
2
  import dayjs from 'dayjs';
3
3
  import calendarPlugin from 'dayjs/plugin/calendar.js';
4
4
  import relativeTime from 'dayjs/plugin/relativeTime.js';
@@ -46,5 +46,5 @@ var StatusBadge = (props) => {
46
46
  StatusBadge.displayName = "StatusBadge";
47
47
 
48
48
  export { StatusBadge, formatRelativeDateTime, formatRelativeToCurrentWeekDateTime };
49
- //# sourceMappingURL=chunk-NQN6LXYU.js.map
50
- //# sourceMappingURL=chunk-NQN6LXYU.js.map
49
+ //# sourceMappingURL=chunk-ELQTHWXC.js.map
50
+ //# sourceMappingURL=chunk-ELQTHWXC.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/atoms/datetime/utils/relative-date-time-utils.ts","../src/atoms/status-badge/status-badge.tsx"],"names":[],"mappings":";;;;;;;;;AAKA,KAAA,CAAM,OAAO,SAAS,CAAA;AACtB,KAAA,CAAM,OAAO,YAAY,CAAA;AACzB,KAAA,CAAM,OAAO,cAAc,CAAA;AAmBpB,SAAS,sBAAA,CACf,IAAA,EACA,QAAA,mBAAqB,IAAI,MAAK,EAC7B;AACD,EAAA,OAAO,KAAA,CAAM,IAAI,CAAA,CAAE,IAAA,CAAK,QAAQ,CAAA;AACjC;AAmBO,SAAS,mCAAA,CACf,IAAA,EACA,QAAA,mBAAqB,IAAI,MAAK,EAC7B;AACD,EAAA,MAAM,UAAU,KAAA,CAAM,IAAI,CAAA,CAAE,MAAA,CAAO,UAAU,KAAK,CAAA;AAElD,EAAA,IAAI,CAAC,OAAA,EAAS;AAGb,IAAA,OAAO,KAAA,CAAM,IAAI,CAAA,CAAE,QAAA,CAAS,QAAA,EAAU;AAAA,MACrC,QAAA,EAAU;AAAA,KACV,CAAA;AAAA,EACF;AAGA,EAAA,OAAO,sBAAA,CAAuB,MAAM,QAAQ,CAAA;AAC7C;ACtDO,IAAM,WAAA,GAA0C,CAAC,KAAA,KAAU;AACjE,EAAA,MAAM,EAAE,KAAA,EAAO,KAAA,EAAM,GAAI,KAAA;AAEzB,EAAA,MAAM,SAAA,GAAY,QAAQ,MAAM;AAC/B,IAAA,IAAI;AACH,MAAA,OAAO,cAAc,KAAK,CAAA;AAAA,IAC3B,CAAA,CAAA,MAAQ;AACP,MAAA,OAAO,OAAA;AAAA,IACR;AAAA,EACD,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAEV,EAAA,uBACC,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACA,EAAA,EAAI,KAAA;AAAA,MACJ,KAAA,EAAO,SAAA;AAAA,MACP,OAAA,EAAQ,MAAA;AAAA,MACR,EAAA,EAAI,CAAA;AAAA,MACJ,iBAAA,EAAmB,CAAA;AAAA,MAElB,QAAA,EAAA;AAAA;AAAA,GACF;AAEF;AAEA,WAAA,CAAY,WAAA,GAAc,aAAA","file":"chunk-NQN6LXYU.js","sourcesContent":["import dayjs from \"dayjs\";\nimport calendarPlugin from \"dayjs/plugin/calendar.js\";\nimport relativeTime from \"dayjs/plugin/relativeTime.js\";\nimport utcPlugin from \"dayjs/plugin/utc.js\";\n\ndayjs.extend(utcPlugin);\ndayjs.extend(relativeTime);\ndayjs.extend(calendarPlugin);\n\nimport type { DateType } from \"../types\";\n\n/**\n * A function that will return a string with how far a given date is in the past or future,\n * using a baseDate as reference. If the baseDate is not passed, the function will use today as reference.\n *\n * @param date - the date to be formatted\n * @param baseDate - the date that should be used as a reference (default is \"today\")\n * @returns a relative date\n *\n * @example\n * // Considering today as 18.08.2021\n * formatRelativeDateTime('2021-08-17T15:45:00') // returns \"a day ago\"\n *\n * @example\n * formatRelativeDateTime('2021-08-17T15:45:00', '2021-08-16') // returns \"in a day\"\n */\nexport function formatRelativeDateTime(\n\tdate: DateType,\n\tbaseDate: DateType = new Date(),\n) {\n\treturn dayjs(date).from(baseDate);\n}\n\n/**\n * A function that formats a date relative to Today or to the `baseDate` if passed.\n * If the date is not today, it will return a string with \"Yesterday ...\", \"Tomorrow ...\", etc\n * If the date is not in the current week, it return a string with \"DD MMM YYYY\" format\n * If the date is today, it will return a string with \"... ago\" or \"in ...\"\n *\n * @param date - the date to be formatted\n * @param baseDate - the date that should be used as a reference (default is \"today\")\n * @returns a relative date\n *\n * @example\n * // Considering today as 18.08.2021\n * formatRelativeToCurrentWeekDateTime('2021-08-17T15:45:00') // returns \"Yesterday at 3:45 PM\"\n *\n * @example\n * formatRelativeToCurrentWeekDateTime('2021-08-17T15:45:00', '2021-08-16') // returns \"Tomorrow at 3:45 PM\"\n */\nexport function formatRelativeToCurrentWeekDateTime(\n\tdate: DateType,\n\tbaseDate: DateType = new Date(),\n) {\n\tconst isToday = dayjs(date).isSame(baseDate, \"day\");\n\n\tif (!isToday) {\n\t\t// if the date is not today, we display it with \"Yesterday\", \"Tomorrow\", etc.\n\t\t// and if the date is not in the current week then it will display \"17 Aug 2021\"\n\t\treturn dayjs(date).calendar(baseDate, {\n\t\t\tsameElse: \"DD MMM YYYY\",\n\t\t});\n\t}\n\n\t// returns \"... ago\"\n\treturn formatRelativeDateTime(date, baseDate);\n}\n","import { readableColor } from \"color2k\";\nimport type React from \"react\";\nimport { useMemo } from \"react\";\nimport { Badge } from \"../../primitives/badge\";\n\nexport interface StatusBadgeProps {\n\t/** The display label for the badge */\n\tlabel: string;\n\t/** The background color for the badge (hex format, e.g. \"#ff0000\") */\n\tcolor: string;\n}\n\nexport const StatusBadge: React.FC<StatusBadgeProps> = (props) => {\n\tconst { label, color } = props;\n\n\tconst textColor = useMemo(() => {\n\t\ttry {\n\t\t\treturn readableColor(color);\n\t\t} catch {\n\t\t\treturn \"black\";\n\t\t}\n\t}, [color]);\n\n\treturn (\n\t\t<Badge\n\t\t\tbg={color}\n\t\t\tcolor={textColor}\n\t\t\trounded=\"base\"\n\t\t\tpx={2}\n\t\t\tmarginInlineStart={1}\n\t\t>\n\t\t\t{label}\n\t\t</Badge>\n\t);\n};\n\nStatusBadge.displayName = \"StatusBadge\";\n"]}
1
+ {"version":3,"sources":["../src/atoms/datetime/utils/relative-date-time-utils.ts","../src/atoms/status-badge/status-badge.tsx"],"names":[],"mappings":";;;;;;;;;AAKA,KAAA,CAAM,OAAO,SAAS,CAAA;AACtB,KAAA,CAAM,OAAO,YAAY,CAAA;AACzB,KAAA,CAAM,OAAO,cAAc,CAAA;AAmBpB,SAAS,sBAAA,CACf,IAAA,EACA,QAAA,mBAAqB,IAAI,MAAK,EAC7B;AACD,EAAA,OAAO,KAAA,CAAM,IAAI,CAAA,CAAE,IAAA,CAAK,QAAQ,CAAA;AACjC;AAmBO,SAAS,mCAAA,CACf,IAAA,EACA,QAAA,mBAAqB,IAAI,MAAK,EAC7B;AACD,EAAA,MAAM,UAAU,KAAA,CAAM,IAAI,CAAA,CAAE,MAAA,CAAO,UAAU,KAAK,CAAA;AAElD,EAAA,IAAI,CAAC,OAAA,EAAS;AAGb,IAAA,OAAO,KAAA,CAAM,IAAI,CAAA,CAAE,QAAA,CAAS,QAAA,EAAU;AAAA,MACrC,QAAA,EAAU;AAAA,KACV,CAAA;AAAA,EACF;AAGA,EAAA,OAAO,sBAAA,CAAuB,MAAM,QAAQ,CAAA;AAC7C;ACtDO,IAAM,WAAA,GAA0C,CAAC,KAAA,KAAU;AACjE,EAAA,MAAM,EAAE,KAAA,EAAO,KAAA,EAAM,GAAI,KAAA;AAEzB,EAAA,MAAM,SAAA,GAAY,QAAQ,MAAM;AAC/B,IAAA,IAAI;AACH,MAAA,OAAO,cAAc,KAAK,CAAA;AAAA,IAC3B,CAAA,CAAA,MAAQ;AACP,MAAA,OAAO,OAAA;AAAA,IACR;AAAA,EACD,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAEV,EAAA,uBACC,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACA,EAAA,EAAI,KAAA;AAAA,MACJ,KAAA,EAAO,SAAA;AAAA,MACP,OAAA,EAAQ,MAAA;AAAA,MACR,EAAA,EAAI,CAAA;AAAA,MACJ,iBAAA,EAAmB,CAAA;AAAA,MAElB,QAAA,EAAA;AAAA;AAAA,GACF;AAEF;AAEA,WAAA,CAAY,WAAA,GAAc,aAAA","file":"chunk-ELQTHWXC.js","sourcesContent":["import dayjs from \"dayjs\";\nimport calendarPlugin from \"dayjs/plugin/calendar.js\";\nimport relativeTime from \"dayjs/plugin/relativeTime.js\";\nimport utcPlugin from \"dayjs/plugin/utc.js\";\n\ndayjs.extend(utcPlugin);\ndayjs.extend(relativeTime);\ndayjs.extend(calendarPlugin);\n\nimport type { DateType } from \"../types\";\n\n/**\n * A function that will return a string with how far a given date is in the past or future,\n * using a baseDate as reference. If the baseDate is not passed, the function will use today as reference.\n *\n * @param date - the date to be formatted\n * @param baseDate - the date that should be used as a reference (default is \"today\")\n * @returns a relative date\n *\n * @example\n * // Considering today as 18.08.2021\n * formatRelativeDateTime('2021-08-17T15:45:00') // returns \"a day ago\"\n *\n * @example\n * formatRelativeDateTime('2021-08-17T15:45:00', '2021-08-16') // returns \"in a day\"\n */\nexport function formatRelativeDateTime(\n\tdate: DateType,\n\tbaseDate: DateType = new Date(),\n) {\n\treturn dayjs(date).from(baseDate);\n}\n\n/**\n * A function that formats a date relative to Today or to the `baseDate` if passed.\n * If the date is not today, it will return a string with \"Yesterday ...\", \"Tomorrow ...\", etc\n * If the date is not in the current week, it return a string with \"DD MMM YYYY\" format\n * If the date is today, it will return a string with \"... ago\" or \"in ...\"\n *\n * @param date - the date to be formatted\n * @param baseDate - the date that should be used as a reference (default is \"today\")\n * @returns a relative date\n *\n * @example\n * // Considering today as 18.08.2021\n * formatRelativeToCurrentWeekDateTime('2021-08-17T15:45:00') // returns \"Yesterday at 3:45 PM\"\n *\n * @example\n * formatRelativeToCurrentWeekDateTime('2021-08-17T15:45:00', '2021-08-16') // returns \"Tomorrow at 3:45 PM\"\n */\nexport function formatRelativeToCurrentWeekDateTime(\n\tdate: DateType,\n\tbaseDate: DateType = new Date(),\n) {\n\tconst isToday = dayjs(date).isSame(baseDate, \"day\");\n\n\tif (!isToday) {\n\t\t// if the date is not today, we display it with \"Yesterday\", \"Tomorrow\", etc.\n\t\t// and if the date is not in the current week then it will display \"17 Aug 2021\"\n\t\treturn dayjs(date).calendar(baseDate, {\n\t\t\tsameElse: \"DD MMM YYYY\",\n\t\t});\n\t}\n\n\t// returns \"... ago\"\n\treturn formatRelativeDateTime(date, baseDate);\n}\n","import { readableColor } from \"color2k\";\nimport type React from \"react\";\nimport { useMemo } from \"react\";\nimport { Badge } from \"../../primitives/badge\";\n\nexport interface StatusBadgeProps {\n\t/** The display label for the badge */\n\tlabel: string;\n\t/** The background color for the badge (hex format, e.g. \"#ff0000\") */\n\tcolor: string;\n}\n\nexport const StatusBadge: React.FC<StatusBadgeProps> = (props) => {\n\tconst { label, color } = props;\n\n\tconst textColor = useMemo(() => {\n\t\ttry {\n\t\t\treturn readableColor(color);\n\t\t} catch {\n\t\t\treturn \"black\";\n\t\t}\n\t}, [color]);\n\n\treturn (\n\t\t<Badge\n\t\t\tbg={color}\n\t\t\tcolor={textColor}\n\t\t\trounded=\"base\"\n\t\t\tpx={2}\n\t\t\tmarginInlineStart={1}\n\t\t>\n\t\t\t{label}\n\t\t</Badge>\n\t);\n};\n\nStatusBadge.displayName = \"StatusBadge\";\n"]}
@@ -0,0 +1,18 @@
1
+ import { useRecipe, chakra } from '@chakra-ui/react';
2
+ import { jsx } from 'react/jsx-runtime';
3
+
4
+ // src/primitives/prose.tsx
5
+ var Prose = ({
6
+ ref,
7
+ size,
8
+ ...props
9
+ }) => {
10
+ const recipe = useRecipe({ key: "prose" });
11
+ const styles = recipe({ size });
12
+ return /* @__PURE__ */ jsx(chakra.div, { ref, css: styles, ...props });
13
+ };
14
+ Prose.displayName = "Prose";
15
+
16
+ export { Prose };
17
+ //# sourceMappingURL=chunk-VOGT33LU.js.map
18
+ //# sourceMappingURL=chunk-VOGT33LU.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/primitives/prose.tsx"],"names":[],"mappings":";;;;AAOO,IAAM,QAAQ,CAAC;AAAA,EACrB,GAAA;AAAA,EACA,IAAA;AAAA,EACA,GAAG;AACJ,CAAA,KAAwD;AACvD,EAAA,MAAM,MAAA,GAAS,SAAA,CAAU,EAAE,GAAA,EAAK,SAAS,CAAA;AACzC,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,EAAE,IAAA,EAAM,CAAA;AAC9B,EAAA,uBAAO,GAAA,CAAC,OAAO,GAAA,EAAP,EAAW,KAAU,GAAA,EAAK,MAAA,EAAS,GAAG,KAAA,EAAO,CAAA;AACtD;AACA,KAAA,CAAM,WAAA,GAAc,OAAA","file":"chunk-VOGT33LU.js","sourcesContent":["import { chakra, type HTMLChakraProps, useRecipe } from \"@chakra-ui/react\";\nimport type React from \"react\";\n\nexport interface ProseProps extends HTMLChakraProps<\"div\"> {\n\tsize?: \"md\" | \"lg\";\n}\n\nexport const Prose = ({\n\tref,\n\tsize,\n\t...props\n}: ProseProps & { ref?: React.Ref<HTMLDivElement> }) => {\n\tconst recipe = useRecipe({ key: \"prose\" });\n\tconst styles = recipe({ size });\n\treturn <chakra.div ref={ref} css={styles} {...props} />;\n};\nProse.displayName = \"Prose\";\n"]}
@@ -297,6 +297,12 @@ interface StatusBadgeCellProps {
297
297
  detail?: string | null;
298
298
  /** Color for the detail text. @default "fg.error" */
299
299
  detailColor?: string;
300
+ /**
301
+ * Optional tooltip content shown on hover/focus over the badge. Useful
302
+ * for status descriptions, full JSON payloads, or contextual hints that
303
+ * don't fit on the badge label.
304
+ */
305
+ tooltip?: React__default.ReactNode;
300
306
  }
301
307
  declare const StatusBadgeCell: React__default.FC<StatusBadgeCellProps>;
302
308
 
@@ -313,6 +319,12 @@ declare const SwitchCell: React__default.FC<SwitchCellProps>;
313
319
  interface TruncatedTextCellProps {
314
320
  value: string | null | undefined;
315
321
  maxLength?: number;
322
+ /**
323
+ * Optional secondary line rendered below the primary value in smaller,
324
+ * muted text (e.g. "created 2 days ago", target ID, contextual hint).
325
+ * Sub-text is `lineClamp={1}` and is not affected by `maxLength`.
326
+ */
327
+ subText?: React__default.ReactNode;
316
328
  }
317
329
  declare const TruncatedTextCell: React__default.FC<TruncatedTextCellProps>;
318
330
 
@@ -1,6 +1,6 @@
1
1
  import { Collapsible, Skeleton, Separator, Checkbox as Checkbox$1 } from '../chunk-TXGJ7BNX.js';
2
- import { formatRelativeDateTime, StatusBadge } from '../chunk-NQN6LXYU.js';
3
- import { MenuItem, MenuRoot, MenuTrigger, MenuContent, Tooltip, Table } from '../chunk-2QFOWHTU.js';
2
+ import { formatRelativeDateTime, StatusBadge } from '../chunk-ELQTHWXC.js';
3
+ import { MenuItem, MenuRoot, MenuTrigger, MenuContent, Tooltip, Table } from '../chunk-2ZWZ2WAS.js';
4
4
  import { Popover, PopoverTrigger, PopoverContent, PopoverBody, Switch } from '../chunk-WQIEF5N3.js';
5
5
  import { text_input_default } from '../chunk-OU6H3KU4.js';
6
6
  import { Button, IconButton } from '../chunk-JS7ZEZV3.js';
@@ -791,18 +791,22 @@ var StatusBadgeCell = ({
791
791
  colorMap,
792
792
  fallbackColor = "gray",
793
793
  detail,
794
- detailColor = "fg.error"
794
+ detailColor = "fg.error",
795
+ tooltip
795
796
  }) => {
796
797
  if (value == null) return /* @__PURE__ */ jsx("span", { children: emptyCellValue });
797
798
  const color = colorMap?.[value] ?? fallbackColor;
798
- const badge = /* @__PURE__ */ jsx(StatusBadge, { label: value, color });
799
+ let badge = /* @__PURE__ */ jsx(StatusBadge, { label: value, color });
800
+ if (tooltip != null) {
801
+ badge = /* @__PURE__ */ jsx(Tooltip, { content: tooltip, showArrow: true, children: /* @__PURE__ */ jsx("span", { children: badge }) });
802
+ }
799
803
  if (detail) {
800
804
  return /* @__PURE__ */ jsxs(VStack, { align: "start", gap: 0.5, children: [
801
805
  badge,
802
806
  /* @__PURE__ */ jsx(Text, { fontSize: "xs", color: detailColor, children: detail })
803
807
  ] });
804
808
  }
805
- return badge;
809
+ return /* @__PURE__ */ jsx(Fragment, { children: badge });
806
810
  };
807
811
  StatusBadgeCell.displayName = "StatusBadgeCell";
808
812
  var SwitchCell = ({
@@ -827,12 +831,18 @@ var SwitchCell = ({
827
831
  SwitchCell.displayName = "SwitchCell";
828
832
  var TruncatedTextCell = ({
829
833
  value,
830
- maxLength
834
+ maxLength,
835
+ subText
831
836
  }) => {
832
837
  if (value == null) return /* @__PURE__ */ jsx("span", { children: emptyCellValue });
833
838
  const isTruncated = maxLength != null && value.length > maxLength;
834
839
  const display = isTruncated ? truncateText(value, maxLength) : value;
835
- return /* @__PURE__ */ jsx("span", { title: isTruncated ? value : void 0, children: display });
840
+ const primary = /* @__PURE__ */ jsx("span", { title: isTruncated ? value : void 0, children: display });
841
+ if (subText == null) return primary;
842
+ return /* @__PURE__ */ jsxs(VStack, { align: "start", gap: 0, children: [
843
+ primary,
844
+ /* @__PURE__ */ jsx(Text, { fontSize: "xs", color: "fg.muted", lineClamp: 1, children: subText })
845
+ ] });
836
846
  };
837
847
  TruncatedTextCell.displayName = "TruncatedTextCell";
838
848
  var UrlCell = ({ value, label }) => {