@crewlethq/ui 0.9.0 → 0.11.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.
Files changed (96) hide show
  1. package/README.md +32 -1
  2. package/dist/Accordion/index.js +3 -3
  3. package/dist/AppShell/index.js +2 -2
  4. package/dist/Avatar/Avatar.d.ts +45 -14
  5. package/dist/Avatar/AvatarStack.d.ts +1 -3
  6. package/dist/Avatar/index.d.ts +2 -2
  7. package/dist/Avatar/index.js +2 -2
  8. package/dist/{Avatar-JAU77SHZ.css → Avatar-QHYOFID3.css} +83 -25
  9. package/dist/AvatarPicker/AvatarPicker.d.ts +32 -0
  10. package/dist/AvatarPicker/index.d.ts +3 -0
  11. package/dist/AvatarPicker/index.js +14 -0
  12. package/dist/AvatarPicker-PREY36MG.css +54 -0
  13. package/dist/Canvas/index.js +3 -3
  14. package/dist/Card/index.js +2 -2
  15. package/dist/CharacterPicker/index.js +3 -2
  16. package/dist/CodeBlock/index.js +3 -3
  17. package/dist/Combobox/index.js +3 -3
  18. package/dist/CommandPalette/index.js +6 -6
  19. package/dist/Copyable/index.js +2 -2
  20. package/dist/DataTable/index.js +6 -6
  21. package/dist/DataView/index.js +11 -11
  22. package/dist/DateTimePicker/index.js +4 -4
  23. package/dist/Disclosure/index.js +3 -3
  24. package/dist/EntityChip/index.js +3 -3
  25. package/dist/FactList/FactList.d.ts +33 -0
  26. package/dist/FactList/index.d.ts +3 -0
  27. package/dist/FactList/index.js +6 -0
  28. package/dist/FactList-G2H73NFR.css +57 -0
  29. package/dist/HuePicker/index.js +4 -3
  30. package/dist/ImageUpload/index.js +3 -3
  31. package/dist/Input/FormField.d.ts +8 -1
  32. package/dist/Input/index.js +1 -1
  33. package/dist/{Input-DRFNI26F.css → Input-RAKNQJCV.css} +7 -0
  34. package/dist/ListInput/ListInput.d.ts +3 -1
  35. package/dist/ListInput/index.js +3 -3
  36. package/dist/Menu/index.js +3 -3
  37. package/dist/Modal/index.js +3 -3
  38. package/dist/OrgLabel/index.js +3 -3
  39. package/dist/OrgNode/index.js +4 -4
  40. package/dist/OrgTable/index.js +6 -6
  41. package/dist/SegmentedControl/index.js +3 -3
  42. package/dist/Tabs/Tabs.d.ts +18 -0
  43. package/dist/Tabs/index.d.ts +1 -1
  44. package/dist/Tabs/index.js +1 -1
  45. package/dist/{Tabs-BWFQSWY3.css → Tabs-5I5Q5KKM.css} +33 -0
  46. package/dist/TagsInput/index.js +2 -2
  47. package/dist/ThemeSwitcher/index.js +4 -4
  48. package/dist/TimeWindowPicker/index.js +5 -5
  49. package/dist/TreeCanvas/index.js +4 -4
  50. package/dist/TreeGrid/index.js +2 -2
  51. package/dist/chunk-3L5NHASN.js +1 -0
  52. package/dist/{chunk-OAH4IEQJ.js → chunk-3UK4VFSK.js} +2 -3
  53. package/dist/{chunk-L7THQMFB.js → chunk-5WEVLIB6.js} +1 -1
  54. package/dist/{chunk-J3IS2TOA.js → chunk-6OF2DBKY.js} +1 -1
  55. package/dist/{chunk-IGWPZZIB.js → chunk-6SDGRKQ7.js} +2 -2
  56. package/dist/{chunk-EUT7VBQG.js → chunk-CIOKUMVC.js} +6 -6
  57. package/dist/{chunk-Y2V3TSQC.js → chunk-DDTDN5L2.js} +1 -1
  58. package/dist/{chunk-LPHHDCN3.js → chunk-EBBAAQDY.js} +1 -1
  59. package/dist/{chunk-UYK72NOS.js → chunk-ELZKOVEC.js} +1 -1
  60. package/dist/chunk-EXHQ2QVW.js +1 -0
  61. package/dist/{chunk-ZGX2DP7F.js → chunk-FTEJPHBI.js} +8 -2
  62. package/dist/{chunk-RIAZM6L3.js → chunk-G2AVKPSL.js} +1 -1
  63. package/dist/chunk-HI6Q2UXQ.js +169 -0
  64. package/dist/{chunk-IZHN5I3H.js → chunk-HLBRPES3.js} +4 -4
  65. package/dist/chunk-HV6IZFBK.js +64 -0
  66. package/dist/{chunk-K7OS4O2U.js → chunk-IHGKPEEV.js} +1 -1
  67. package/dist/{chunk-HEOVQZL7.js → chunk-JHQUT4WJ.js} +6 -2
  68. package/dist/{chunk-26TXVHN2.js → chunk-K5Q2DK3P.js} +1 -2
  69. package/dist/{chunk-MORLKUGM.js → chunk-KGTQ5CVD.js} +1 -1
  70. package/dist/{chunk-E3HDS4F7.js → chunk-LAQK4V3Z.js} +1 -1
  71. package/dist/{chunk-6HXH57BL.js → chunk-LZP7FGT7.js} +4 -2
  72. package/dist/{chunk-CVB7O3SZ.js → chunk-R4ZJB5YX.js} +4 -4
  73. package/dist/{chunk-MICH6QSJ.js → chunk-S4RCG44T.js} +1 -1
  74. package/dist/{chunk-UI6HWAWE.js → chunk-UAQIUSSK.js} +1 -1
  75. package/dist/chunk-URYDN2KA.js +25 -0
  76. package/dist/{chunk-X6K6OZ47.js → chunk-WEIINZPA.js} +1 -1
  77. package/dist/{chunk-IKH3Y4MP.js → chunk-YXMCUKFI.js} +1 -2
  78. package/dist/{chunk-JB6AN4ZC.js → chunk-ZMJHK7DR.js} +2 -2
  79. package/dist/generated/index.d.ts +2 -0
  80. package/dist/generated/index.js +58 -54
  81. package/dist/index.js +58 -54
  82. package/dist/styles.css +245 -30
  83. package/dist/utils/index.js +1 -1
  84. package/package.json +3 -3
  85. package/dist/chunk-UDW3DAP5.js +0 -125
  86. package/dist/{chunk-VE6LD3KM.js → chunk-2PZBIHRV.js} +2 -2
  87. package/dist/{chunk-MPXI6FM6.js → chunk-7JGWSOLM.js} +1 -1
  88. package/dist/{chunk-OVLJEVQS.js → chunk-7LD6P32I.js} +1 -1
  89. package/dist/{chunk-CEOXFO3E.js → chunk-EG6NYWVK.js} +1 -1
  90. package/dist/{chunk-FZVJDJFN.js → chunk-ENJUPIND.js} +1 -1
  91. package/dist/{chunk-5I56UXBJ.js → chunk-JCNUQ3US.js} +2 -2
  92. package/dist/{chunk-SX2DFTQV.js → chunk-MCPKHYMC.js} +1 -1
  93. package/dist/{chunk-YPTC4TX5.js → chunk-PQLMLG5K.js} +0 -0
  94. package/dist/{chunk-BTHX2FS3.js → chunk-TEEJSTFG.js} +2 -2
  95. package/dist/{chunk-LSB3EHBW.js → chunk-TFH6SYWB.js} +2 -2
  96. package/dist/{chunk-26SCUACK.js → chunk-YACKC3K2.js} +1 -1
package/dist/index.js CHANGED
@@ -1,101 +1,105 @@
1
- import './chunk-YPTC4TX5.js';
1
+ import './chunk-PQLMLG5K.js';
2
+ export { TreeCanvas } from './chunk-5WEVLIB6.js';
2
3
  import './chunk-AER7UDD4.js';
4
+ export { ThemeToggle } from './chunk-ORNOOMVY.js';
5
+ export { DEFAULT_TIME_WINDOW_LABELS, TIME_WINDOW_SPANS, TimeWindowPicker, describeTimeWindow, isTimeWindowSet, parseTimeWindowDuration, resolveTimeWindow, timeWindowMatchesPreset } from './chunk-HLBRPES3.js';
3
6
  export { Timeline, TimelineItem } from './chunk-O67VF5MS.js';
4
7
  export { ToastProvider, Toaster, useToast } from './chunk-UG5ZMAXW.js';
5
- export { Tooltip } from './chunk-CQY5NTRS.js';
6
- export { TreeCanvas } from './chunk-L7THQMFB.js';
8
+ export { Switch } from './chunk-A722MUNR.js';
9
+ export { Table } from './chunk-V2N3BMOT.js';
7
10
  export { TagGroup } from './chunk-E6UWRXNM.js';
8
- export { TagsInput } from './chunk-MPXI6FM6.js';
11
+ export { TagsInput } from './chunk-7JGWSOLM.js';
9
12
  export { Text } from './chunk-23DHIMJA.js';
10
- export { DensitySwitcher, ThemeSwitcher } from './chunk-X6K6OZ47.js';
11
- export { ThemeToggle } from './chunk-ORNOOMVY.js';
13
+ export { DensitySwitcher, ThemeSwitcher } from './chunk-WEIINZPA.js';
12
14
  export { applyDensity, applyStoredPreferences, applyTheme, resolveTheme, useDensityPreference, useSystemTheme, useThemePreference } from './chunk-K3OWD7BJ.js';
13
- export { DEFAULT_TIME_WINDOW_LABELS, TIME_WINDOW_SPANS, TimeWindowPicker, describeTimeWindow, isTimeWindowSet, parseTimeWindowDuration, resolveTimeWindow, timeWindowMatchesPreset } from './chunk-IZHN5I3H.js';
15
+ export { Select } from './chunk-SEFMO2EV.js';
16
+ export { matchesShortcut, useShortcut } from './chunk-2FPENTCF.js';
14
17
  export { NavGroup, NavItem, SidebarNav } from './chunk-IVFJD7WY.js';
15
18
  export { Skeleton } from './chunk-W5J7R5EB.js';
16
19
  export { StatCard } from './chunk-IKB6HFGK.js';
17
20
  export { StatGroup } from './chunk-QVAFL2LE.js';
18
21
  export { Stepper } from './chunk-5QWIJSQM.js';
19
- export { Switch } from './chunk-A722MUNR.js';
20
- export { Table } from './chunk-V2N3BMOT.js';
22
+ export { PricingCard } from './chunk-UCYIRDND.js';
23
+ export { Tag } from './chunk-LOECRMHA.js';
24
+ export { StatusDot } from './chunk-WIATRXEJ.js';
21
25
  export { Prose } from './chunk-JCSA3XVH.js';
22
26
  export { SearchTrigger } from './chunk-6DRDCT22.js';
23
27
  export { Section } from './chunk-A2UXBCLO.js';
24
- import './chunk-UI6HWAWE.js';
28
+ import './chunk-UAQIUSSK.js';
25
29
  export { SegmentedMeter, segmentedMeterLabel } from './chunk-4AK52VHB.js';
26
- export { Select } from './chunk-SEFMO2EV.js';
27
- export { matchesShortcut, useShortcut } from './chunk-2FPENTCF.js';
30
+ export { DEFAULT_METER_THRESHOLDS, METER_STATES, Meter, meterState, meterStateTone, meterTone, progressTone } from './chunk-4PZ6FJKW.js';
28
31
  export { NewItemsNotice } from './chunk-PXU6HOZB.js';
29
- export { OrgNodeDisclosure, OrgNodeLabel, OrgNodeLead } from './chunk-K7OS4O2U.js';
30
- export { OrgTable, OrgTableActions, OrgTableAdd, OrgTableName } from './chunk-JB6AN4ZC.js';
31
- export { TreeGrid } from './chunk-SX2DFTQV.js';
32
+ export { OrgNodeDisclosure, OrgNodeLabel, OrgNodeLead } from './chunk-IHGKPEEV.js';
33
+ export { OrgTable, OrgTableActions, OrgTableAdd, OrgTableName } from './chunk-ZMJHK7DR.js';
34
+ export { TreeGrid } from './chunk-MCPKHYMC.js';
32
35
  export { SIZE_EPSILON, TYPE_AHEAD_RESET_MS, createTreeModel, isTypeAheadKey, layoutConnectors, layoutForest, placeGroups, treeAllExpandable, treeAncestors, treeCollapseOrAscend, treeExpandOrDescend, treeExpandTo, treeExpandable, treeFirst, treeFirstChild, treeItemAction, treeLast, treeLevel, treeNext, treeParent, treePosInSet, treePrevious, treeSetSize, treeStep, treeTypeAhead, treeVisible, typeAheadBuffer, useLayoutAnchor, useMeasuredSizes, useTreeState } from './chunk-S3BCVWTU.js';
33
- export { OrgLabel } from './chunk-J3IS2TOA.js';
34
- export { PricingCard } from './chunk-UCYIRDND.js';
35
- export { Tag } from './chunk-LOECRMHA.js';
36
- export { StatusDot } from './chunk-WIATRXEJ.js';
36
+ export { OrgLabel } from './chunk-6OF2DBKY.js';
37
37
  export { AutoGrid, Inline, Spacer, Stack } from './chunk-W4ENKCXJ.js';
38
38
  export { Link } from './chunk-ZPSOF6VL.js';
39
39
  export { List, ListItem } from './chunk-DS2C73RJ.js';
40
- export { ListInput } from './chunk-6HXH57BL.js';
41
- export { DEFAULT_METER_THRESHOLDS, METER_STATES, Meter, meterState, meterStateTone, meterTone, progressTone } from './chunk-4PZ6FJKW.js';
40
+ export { ListInput } from './chunk-LZP7FGT7.js';
41
+ export { Eyebrow } from './chunk-RK4XPHVG.js';
42
+ export { FactList } from './chunk-URYDN2KA.js';
43
+ export { Tooltip } from './chunk-CQY5NTRS.js';
42
44
  export { FILTER_CHIP_ATTRIBUTE, FilterChip, FilterChipGroup } from './chunk-5YLON2PW.js';
43
45
  export { useFullscreen } from './chunk-XDTYBF2F.js';
44
- export { HuePicker } from './chunk-26TXVHN2.js';
45
- export { NODE_HUES, NODE_HUE_NAMES, isNodeHue } from './chunk-AYKXMIOR.js';
46
- export { SegmentedControl } from './chunk-LPHHDCN3.js';
47
- export { TabPanel, Tabs, tabId } from './chunk-HEOVQZL7.js';
46
+ import './chunk-EXHQ2QVW.js';
47
+ export { ImageUpload } from './chunk-LAQK4V3Z.js';
48
48
  export { InlineCode } from './chunk-NN62JQLR.js';
49
- export { ImageUpload } from './chunk-E3HDS4F7.js';
50
49
  export { DescriptionList, DescriptionListItem } from './chunk-XN4JBAN3.js';
51
50
  export { DIFF_LIST_LABELS, DiffList } from './chunk-LFHCXZO5.js';
52
- export { Disclosure } from './chunk-MICH6QSJ.js';
51
+ export { Disclosure } from './chunk-S4RCG44T.js';
53
52
  export { EmptyState } from './chunk-RA2ULG6H.js';
54
- export { EntityChip } from './chunk-Y2V3TSQC.js';
53
+ export { EntityChip } from './chunk-DDTDN5L2.js';
55
54
  export { ErrorBoundary } from './chunk-XX2VQE55.js';
56
- export { Eyebrow } from './chunk-RK4XPHVG.js';
57
- export { Combobox } from './chunk-UYK72NOS.js';
58
- export { CommandPalette } from './chunk-IGWPZZIB.js';
55
+ export { CodeBlock } from './chunk-KGTQ5CVD.js';
56
+ export { Combobox } from './chunk-ELZKOVEC.js';
57
+ export { CommandPalette } from './chunk-6SDGRKQ7.js';
59
58
  export { Container } from './chunk-QVE4GJAT.js';
60
- export { DATA_VIEW_TOOLBAR_LABELS, DataView, DataViewToolbar, FILTER_AXIS_LABELS, FilterAxisBar, FilterAxisChip, applyColumnFilters, applyFilters, blankFilterValue, defaultOperator, filterDefsFromColumns, filterHasValue, filterPredicate, formatFilterValue, operatorOf, tableColumns } from './chunk-EUT7VBQG.js';
59
+ export { CopyButton, Copyable } from './chunk-YACKC3K2.js';
60
+ export { DATA_VIEW_TOOLBAR_LABELS, DataView, DataViewToolbar, FILTER_AXIS_LABELS, FilterAxisBar, FilterAxisChip, applyColumnFilters, applyFilters, blankFilterValue, defaultOperator, filterDefsFromColumns, filterHasValue, filterPredicate, formatFilterValue, operatorOf, tableColumns } from './chunk-CIOKUMVC.js';
61
61
  export { Toolbar, ToolbarOverflow, ToolbarWide } from './chunk-PGRPNDWM.js';
62
62
  export { RelativeTime, currentNow, formatElapsed, formatExact, formatRelative, formatUntil, toISO, toInstant, useNow } from './chunk-3CZ7XAVY.js';
63
63
  export { PageHeader } from './chunk-HOXGBLEY.js';
64
+ export { DEFAULT_DATE_TIME_PICKER_LABELS, DateTimePicker } from './chunk-JCNUQ3US.js';
64
65
  export { Kbd, isApplePlatform, keyGlyph } from './chunk-SMBKXWML.js';
66
+ export { FormField, FormRow, FormSection, Input, InputAffix, Label, ReadOnlyField, Textarea } from './chunk-FTEJPHBI.js';
65
67
  export { TYPE_AHEAD_WINDOW, useListbox, useOptionKeys } from './chunk-6MU7HNB4.js';
66
- export { FormField, FormRow, FormSection, Input, InputAffix, Label, ReadOnlyField, Textarea } from './chunk-ZGX2DP7F.js';
67
- export { ALL_ITEMS, CopyableCell, DATA_TABLE_LABELS, DataTable, RowActionsMenu } from './chunk-CVB7O3SZ.js';
68
- export { Menu } from './chunk-LSB3EHBW.js';
68
+ export { ALL_ITEMS, CopyableCell, DATA_TABLE_LABELS, DataTable, RowActionsMenu } from './chunk-R4ZJB5YX.js';
69
+ export { Menu } from './chunk-TFH6SYWB.js';
69
70
  export { EMPTY_VALUE, EmptyValue } from './chunk-EUCC37WY.js';
70
- export { ConfirmModal, Modal } from './chunk-BTHX2FS3.js';
71
- export { DEFAULT_DATE_TIME_PICKER_LABELS, DateTimePicker } from './chunk-5I56UXBJ.js';
72
- export { Popover } from './chunk-PDUZO35I.js';
71
+ export { ConfirmModal, Modal } from './chunk-TEEJSTFG.js';
72
+ export { useClipboard, writeClipboard } from './chunk-5VNUYO76.js';
73
73
  export { CalendarGrid, compareDays, daysInMonth, sameDay, shiftDay, shiftMonth, today } from './chunk-GXQ3B46I.js';
74
74
  export { Callout } from './chunk-R6FBDTP3.js';
75
- export { CANVAS_COMPOSE_CONTEXT, CANVAS_FIT_MAX_ZOOM, CANVAS_FIT_PADDING, CANVAS_FOCUS_CONTEXT, CANVAS_MAX_ZOOM, CANVAS_MIN_ZOOM, CANVAS_PAN_MARGIN, CANVAS_PAN_STEP, CANVAS_REVEAL_PADDING, CANVAS_TAP_SLOP, CANVAS_WHEEL_LINE_PX, CANVAS_WHEEL_ZOOM_PER_PIXEL, CANVAS_ZOOM_CEILING, CANVAS_ZOOM_LIMITS, CANVAS_ZOOM_STEP, Canvas, IDENTITY_VIEW, anchorView, beyondSlop, clampPan, clampZoom, fitView, panBy, pinchView, regionView, revealView, screenRect, toScreen, toWorld, wheelPixels, wheelZoomFactor, zoomAt, zoomLimits } from './chunk-VE6LD3KM.js';
75
+ export { CANVAS_COMPOSE_CONTEXT, CANVAS_FIT_MAX_ZOOM, CANVAS_FIT_PADDING, CANVAS_FOCUS_CONTEXT, CANVAS_MAX_ZOOM, CANVAS_MIN_ZOOM, CANVAS_PAN_MARGIN, CANVAS_PAN_STEP, CANVAS_REVEAL_PADDING, CANVAS_TAP_SLOP, CANVAS_WHEEL_LINE_PX, CANVAS_WHEEL_ZOOM_PER_PIXEL, CANVAS_ZOOM_CEILING, CANVAS_ZOOM_LIMITS, CANVAS_ZOOM_STEP, Canvas, IDENTITY_VIEW, anchorView, beyondSlop, clampPan, clampZoom, fitView, panBy, pinchView, regionView, revealView, screenRect, toScreen, toWorld, wheelPixels, wheelZoomFactor, zoomAt, zoomLimits } from './chunk-2PZBIHRV.js';
76
76
  import './chunk-53DVJCVW.js';
77
- export { Card } from './chunk-CEOXFO3E.js';
77
+ export { Button, ButtonLink } from './chunk-OG6CL3EB.js';
78
+ export { Card } from './chunk-EG6NYWVK.js';
78
79
  export { useCardHeaderSlot } from './chunk-AV2DXAEL.js';
79
- export { CHARACTER_PICKER_COLUMNS, CharacterPicker } from './chunk-IKH3Y4MP.js';
80
- import './chunk-CBOICT64.js';
80
+ import './chunk-3L5NHASN.js';
81
81
  export { ActivityStrip, BarList, ChartTooltip, DATA_COLORS, DATA_COLOR_OTHER, Legend, Sparkline, StackedBar, StackedColumns, TimeSeries, dataColor, niceScale, useChartHover } from './chunk-4WNNEDKO.js';
82
82
  export { Checkbox } from './chunk-YCTMKKRA.js';
83
- export { CodeBlock } from './chunk-MORLKUGM.js';
84
- export { CopyButton, Copyable } from './chunk-26SCUACK.js';
85
- export { useClipboard, writeClipboard } from './chunk-5VNUYO76.js';
86
- export { Accordion, AccordionItem } from './chunk-RIAZM6L3.js';
87
- export { DisclosureAnatomy } from './chunk-FZVJDJFN.js';
88
- export { Count } from './chunk-BHHIIK3M.js';
83
+ export { Accordion, AccordionItem } from './chunk-G2AVKPSL.js';
84
+ export { DisclosureAnatomy } from './chunk-ENJUPIND.js';
89
85
  export { HeadingLevelProvider, headingTag, nextHeadingLevel, useHeadingLevel } from './chunk-PQADV6P6.js';
90
86
  export { ADD_PILL_MS, AddPill } from './chunk-74WGARJE.js';
87
+ export { AppShell, AppShellRail, AppShellRailRow, AppShellToggle, AppShellTopbar, useAppShell } from './chunk-7LD6P32I.js';
88
+ export { IconButton } from './chunk-4FQT6ZAY.js';
91
89
  export { Announcer, announce, useAnnouncer } from './chunk-RSAQOKH3.js';
92
- export { AppShell, AppShellRail, AppShellRailRow, AppShellToggle, AppShellTopbar, useAppShell } from './chunk-OVLJEVQS.js';
90
+ export { AvatarStack, avatarStackLabel } from './chunk-3UK4VFSK.js';
91
+ export { AvatarPicker } from './chunk-HV6IZFBK.js';
92
+ export { HuePicker } from './chunk-K5Q2DK3P.js';
93
+ export { NODE_HUES, NODE_HUE_NAMES, isNodeHue } from './chunk-AYKXMIOR.js';
94
+ export { SegmentedControl } from './chunk-EBBAAQDY.js';
95
+ export { TabPanel, Tabs, tabId } from './chunk-JHQUT4WJ.js';
96
+ export { Popover } from './chunk-PDUZO35I.js';
97
+ export { CHARACTER_PICKER_COLUMNS, CharacterPicker } from './chunk-YXMCUKFI.js';
98
+ import './chunk-CBOICT64.js';
99
+ export { Count } from './chunk-BHHIIK3M.js';
93
100
  export { LAYER_GAP, LAYER_REPOSITION_EVENT, LayerHost, outsideBounds, placePopup, useLayerContainer, viewportBounds } from './chunk-7RPGY3JE.js';
94
101
  export { focusables, isComposing, isModalLayerOpen, layerCount, useBodyScrollLock, useModalLayer, usePopupLayer } from './chunk-R25RGPUB.js';
95
- export { IconButton } from './chunk-4FQT6ZAY.js';
96
- export { AvatarStack, avatarStackLabel } from './chunk-OAH4IEQJ.js';
97
- export { AVATAR_CHARACTER_FULL_DETAIL, AVATAR_CORNER_RATIO, AVATAR_SIZES, Avatar, avatarCorner, avatarPixels, avatarTint, getInitials } from './chunk-UDW3DAP5.js';
98
- export { BrandLockup } from './chunk-7KBNFFM3.js';
99
- export { Button, ButtonLink } from './chunk-OG6CL3EB.js';
100
102
  export { VisuallyHidden } from './chunk-BZFWDIV6.js';
103
+ export { AVATAR_CHARACTER_FULL_DETAIL, AVATAR_CORNER_RATIO, AVATAR_SIZES, AVATAR_STATUSES, AVATAR_STATUS_LABELS, Avatar, avatarCorner, avatarPixels, avatarTint, getInitials } from './chunk-HI6Q2UXQ.js';
104
+ export { BrandLockup } from './chunk-7KBNFFM3.js';
101
105
  export { cx } from './chunk-ODEQTPFM.js';
package/dist/styles.css CHANGED
@@ -1088,7 +1088,7 @@
1088
1088
  }
1089
1089
 
1090
1090
 
1091
- /* Avatar-JAU77SHZ.css */
1091
+ /* Avatar-QHYOFID3.css */
1092
1092
  /*
1093
1093
  * The identity badge.
1094
1094
  *
@@ -1101,8 +1101,10 @@
1101
1101
  * OUTLINE (a squircle for an agent, a circle for a person), the monogram and
1102
1102
  * the name, and for an agent an operator gave one, its character and its hue.
1103
1103
  *
1104
- * THE ONE HUE A BADGE CARRIES AS A LINE IS A STATE, as a ring round it, and the
1105
- * ring is the component's only coloured line outside its own plate.
1104
+ * A STATE IS A CORNER BADGE, NEVER A LINE ROUND THE PLATE. A ring in a state's
1105
+ * hue round a plate in the agent's own hue put two colours on a 32px mark and
1106
+ * framed what the agent was doing louder than who it is. The one ring left is
1107
+ * SELECTED, in the accent.
1106
1108
  *
1107
1109
  * The seeded tints stay for the one case that earns them, a roster somebody
1108
1110
  * scans, and their grounds are TOKENS: measured under white initials and held
@@ -1302,11 +1304,12 @@
1302
1304
  color: var(--color-node-blue);
1303
1305
  }
1304
1306
 
1305
- /* ── the state ring ────────────────────────────────────────────────────── */
1307
+ /* ── the selected ring ────────────────────────────────────────────────── */
1306
1308
 
1307
1309
  /*
1308
1310
  * A 1.5px LINE 2px OUTSIDE THE BADGE, which is the design's ring: it draws a
1309
1311
  * 3.5px shadow over a 2px one in the card's colour, and 3.5 less 2 is 1.5.
1312
+ * Longhands, so nothing else that sets an outline resets the ring's geometry.
1310
1313
  *
1311
1314
  * AN OUTLINE RATHER THAN THAT SHADOW PAIR, for three reasons. The gap is
1312
1315
  * TRANSPARENT, so the ring reads on whatever the badge stands on, where the
@@ -1314,44 +1317,156 @@
1314
1317
  * other ground. An outline follows the corner, the squircle's included, in
1315
1318
  * every engine this package supports. And forced-colors mode keeps an outline
1316
1319
  * and drops every shadow, so the ring is still drawn for the readers who most
1317
- * need a boundary; it is drawn in the system colour there, which is why the
1318
- * state is always said in words beside the badge as well.
1319
- *
1320
- * LONGHANDS, so the tone rules below set the colour alone and cannot reset the
1321
- * geometry, whichever order they are read in. Each fill is measured at 3:1 as
1322
- * a mark on every opaque surface by @crewlethq/tokens, which is the floor a
1323
- * boundary a reader has to see is held to.
1324
- */
1325
- .crewlet-avatar--ring-info,
1326
- .crewlet-avatar--ring-warning,
1327
- .crewlet-avatar--ring-danger,
1328
- .crewlet-avatar--ring-success,
1320
+ * need a boundary.
1321
+ *
1322
+ * SELECTED, in the accent, which is what the accent means: where the reader
1323
+ * is. It is the only place a badge spends the accent, and the accent is
1324
+ * measured at 3:1 as a mark on every opaque surface by @crewlethq/tokens.
1325
+ */
1329
1326
  .crewlet-avatar--ring-brand {
1330
1327
  outline-style: solid;
1331
1328
  outline-width: 1.5px;
1332
1329
  outline-offset: 2px;
1330
+ outline-color: var(--color-brand-accent);
1333
1331
  }
1334
1332
 
1335
- .crewlet-avatar--ring-info {
1336
- outline-color: var(--color-feedback-info);
1333
+ /* ── the status badge ─────────────────────────────────────────────────── */
1334
+
1335
+ /*
1336
+ * THE FRAME is the face's own box, so a badge with a status takes exactly the
1337
+ * room one without takes: the corner badge hangs past it rather than growing
1338
+ * it, and a row lays out the same either way. The badge is 0.42 of the box,
1339
+ * never under 10px, which is the size its glyph stays a shape at.
1340
+ */
1341
+ .crewlet-avatar-frame {
1342
+ --crewlet-avatar-status-size: max(10px, calc(var(--crewlet-avatar-size) * 0.42));
1343
+ --crewlet-avatar-status-overhang: 2px;
1344
+ --crewlet-avatar-status-gap: 1.5px;
1345
+ position: relative;
1346
+ display: inline-flex;
1347
+ flex: none;
1348
+ width: var(--crewlet-avatar-size);
1349
+ height: var(--crewlet-avatar-size);
1350
+ vertical-align: middle;
1337
1351
  }
1338
1352
 
1339
- .crewlet-avatar--ring-warning {
1340
- outline-color: var(--color-feedback-warning);
1353
+ /*
1354
+ * THE NOTCH: the face is masked by a circle a gap wider than the badge, centred
1355
+ * where the badge sits, so the gap shows whatever the badge stands on. A ring
1356
+ * of the ground's colour would need to know that ground, and a badge on a card,
1357
+ * a hovered row and the page would each need a different one. A mask reads only
1358
+ * alpha, so its black is opacity rather than a colour.
1359
+ */
1360
+ .crewlet-avatar--notched {
1361
+ --crewlet-avatar-status-centre: calc(
1362
+ 100% + var(--crewlet-avatar-status-overhang) - var(--crewlet-avatar-status-size) / 2
1363
+ );
1364
+ --crewlet-avatar-status-cut: calc(var(--crewlet-avatar-status-size) / 2 + var(--crewlet-avatar-status-gap));
1365
+ -webkit-mask-image: radial-gradient(
1366
+ circle at var(--crewlet-avatar-status-centre) var(--crewlet-avatar-status-centre),
1367
+ transparent var(--crewlet-avatar-status-cut),
1368
+ #000 calc(var(--crewlet-avatar-status-cut) + 0.5px)
1369
+ );
1370
+ mask-image: radial-gradient(
1371
+ circle at var(--crewlet-avatar-status-centre) var(--crewlet-avatar-status-centre),
1372
+ transparent var(--crewlet-avatar-status-cut),
1373
+ #000 calc(var(--crewlet-avatar-status-cut) + 0.5px)
1374
+ );
1341
1375
  }
1342
1376
 
1343
- .crewlet-avatar--ring-danger {
1344
- outline-color: var(--color-feedback-danger);
1377
+ /*
1378
+ * THE BADGE: a state's fill step carrying its glyph in the inverse ink, which
1379
+ * the tokens' palette suite holds at 3:1 on each fill (`MARK_ON_FILL`). The
1380
+ * transparent outline is drawn only in forced-colors mode, where the fill
1381
+ * becomes the page's own colour and the outline is what keeps a boundary.
1382
+ */
1383
+ .crewlet-avatar__status {
1384
+ position: absolute;
1385
+ right: calc(var(--crewlet-avatar-status-overhang) * -1);
1386
+ bottom: calc(var(--crewlet-avatar-status-overhang) * -1);
1387
+ display: grid;
1388
+ place-items: center;
1389
+ width: var(--crewlet-avatar-status-size);
1390
+ height: var(--crewlet-avatar-status-size);
1391
+ border-radius: var(--radius-circle);
1392
+ outline: 1px solid transparent;
1393
+ color: var(--color-text-inverse);
1394
+ pointer-events: none;
1345
1395
  }
1346
1396
 
1347
- .crewlet-avatar--ring-success {
1348
- outline-color: var(--color-feedback-success);
1397
+ .crewlet-avatar__status > svg {
1398
+ display: block;
1399
+ width: 100%;
1400
+ height: 100%;
1349
1401
  }
1350
1402
 
1351
- /* SELECTED, in the accent, which is what the accent means: where the reader
1352
- is. It is the only place a badge spends the accent. */
1353
- .crewlet-avatar--ring-brand {
1354
- outline-color: var(--color-brand-accent);
1403
+ .crewlet-avatar__status--working {
1404
+ background: var(--color-feedback-info);
1405
+ }
1406
+
1407
+ .crewlet-avatar__status--needs {
1408
+ background: var(--color-feedback-warning);
1409
+ }
1410
+
1411
+ .crewlet-avatar__status--stopped {
1412
+ background: var(--color-feedback-danger);
1413
+ }
1414
+
1415
+
1416
+ /* AvatarPicker-PREY36MG.css */
1417
+ /*
1418
+ * The badge as a button, with a pencil pip on its corner saying it changes
1419
+ * the badge. No chrome of its own beyond the focus ring: the badge is the
1420
+ * control's face.
1421
+ */
1422
+ .crewlet-avatar-picker {
1423
+ position: relative;
1424
+ display: inline-flex;
1425
+ flex: none;
1426
+ padding: 0;
1427
+ border: 0;
1428
+ border-radius: var(--radius-lg);
1429
+ background: none;
1430
+ cursor: pointer;
1431
+ }
1432
+
1433
+ button.crewlet-avatar-picker:focus-visible {
1434
+ outline: 2px solid var(--color-focus);
1435
+ outline-offset: 2px;
1436
+ }
1437
+
1438
+ .crewlet-avatar-picker__pip {
1439
+ position: absolute;
1440
+ right: calc(var(--spacing-1) * -1);
1441
+ bottom: calc(var(--spacing-1) * -1);
1442
+ display: grid;
1443
+ place-items: center;
1444
+ width: 16px;
1445
+ height: 16px;
1446
+ border: 1px solid var(--color-border-strong);
1447
+ border-radius: var(--radius-circle);
1448
+ background: var(--color-surface-elevated);
1449
+ color: var(--color-text-secondary);
1450
+ }
1451
+
1452
+ button.crewlet-avatar-picker:hover .crewlet-avatar-picker__pip {
1453
+ color: var(--color-text-primary);
1454
+ }
1455
+
1456
+ .crewlet-avatar-picker__body {
1457
+ display: grid;
1458
+ gap: var(--spacing-2);
1459
+ width: max-content;
1460
+ max-width: 100%;
1461
+ padding: var(--spacing-3);
1462
+ }
1463
+
1464
+ .crewlet-avatar-picker__label {
1465
+ font-size: var(--font-size-2xs);
1466
+ font-weight: var(--font-weight-medium);
1467
+ letter-spacing: var(--font-letter-spacing-wide);
1468
+ text-transform: uppercase;
1469
+ color: var(--color-text-tertiary);
1355
1470
  }
1356
1471
 
1357
1472
 
@@ -7974,6 +8089,66 @@ svg.crewlet-datetime__chevron {
7974
8089
  }
7975
8090
 
7976
8091
 
8092
+ /* FactList-G2H73NFR.css */
8093
+ /*
8094
+ * Read-only facts in one bordered box, a 32px row each: label and lock on the
8095
+ * left, the value on the right. The rows share the box's hairline between
8096
+ * them, so a list of six reads as one object rather than six cards.
8097
+ */
8098
+ .crewlet-fact-list {
8099
+ display: grid;
8100
+ margin: 0;
8101
+ border: 1px solid var(--color-border-default);
8102
+ border-radius: var(--radius-md);
8103
+ overflow: hidden;
8104
+ }
8105
+
8106
+ .crewlet-fact-list__row {
8107
+ display: flex;
8108
+ align-items: center;
8109
+ gap: var(--spacing-2);
8110
+ min-height: 32px;
8111
+ padding: var(--spacing-1) var(--spacing-3);
8112
+ font-size: var(--font-size-compact);
8113
+ }
8114
+
8115
+ .crewlet-fact-list__row + .crewlet-fact-list__row {
8116
+ border-top: 1px solid var(--color-border-default);
8117
+ }
8118
+
8119
+ .crewlet-fact-list__row.is-locked {
8120
+ cursor: help;
8121
+ }
8122
+
8123
+ .crewlet-fact-list__label {
8124
+ display: flex;
8125
+ flex: 1 1 auto;
8126
+ align-items: center;
8127
+ gap: var(--spacing-1);
8128
+ min-width: 0;
8129
+ margin: 0;
8130
+ color: var(--color-text-tertiary);
8131
+ }
8132
+
8133
+ .crewlet-fact-list__lock {
8134
+ flex: none;
8135
+ color: var(--color-text-tertiary);
8136
+ }
8137
+
8138
+ .crewlet-fact-list__value {
8139
+ display: flex;
8140
+ flex: 0 1 auto;
8141
+ align-items: center;
8142
+ justify-content: flex-end;
8143
+ gap: var(--spacing-2);
8144
+ min-width: 0;
8145
+ margin: 0;
8146
+ color: var(--color-text-secondary);
8147
+ text-align: right;
8148
+ overflow-wrap: anywhere;
8149
+ }
8150
+
8151
+
7977
8152
  /* FilterChip-EZ4QMW4E.css */
7978
8153
  /*
7979
8154
  * The filter chip: neutral until it is on, and then the accent.
@@ -8566,7 +8741,7 @@ svg.crewlet-datetime__chevron {
8566
8741
  }
8567
8742
 
8568
8743
 
8569
- /* Input-DRFNI26F.css */
8744
+ /* Input-RAKNQJCV.css */
8570
8745
  /*
8571
8746
  * The form row: Input, Textarea, Label, FormField, FormRow, FormSection and
8572
8747
  * ReadOnlyField.
@@ -9071,6 +9246,13 @@ svg.crewlet-datetime__chevron {
9071
9246
  color: var(--color-text-tertiary);
9072
9247
  }
9073
9248
 
9249
+ /* SHOWN ONLY WHILE THE FIELD HAS FOCUS (`helperOnFocus`): a dense form reads as
9250
+ labels and values at rest, and the sentence appears under the field the
9251
+ reader is in. Still described, so a screen reader hears it on entry. */
9252
+ .crewlet-form-field--helper-on-focus:not(:focus-within) .crewlet-form-field__helper {
9253
+ display: none;
9254
+ }
9255
+
9074
9256
  /*
9075
9257
  * The error line, on the danger INK. It stays BESIDE the help rather than
9076
9258
  * replacing it: a reader told they are wrong needs the line that says what
@@ -15434,7 +15616,7 @@ svg.crewlet-select__chevron {
15434
15616
  }
15435
15617
 
15436
15618
 
15437
- /* Tabs-BWFQSWY3.css */
15619
+ /* Tabs-5I5Q5KKM.css */
15438
15620
  /*
15439
15621
  * The pill register: Tabs and SegmentedControl.
15440
15622
  *
@@ -15775,6 +15957,39 @@ svg.crewlet-select__chevron {
15775
15957
  }
15776
15958
  }
15777
15959
 
15960
+ /* ── markers ──────────────────────────────────────────────────────────────
15961
+ What needs the reader behind a tab: a danger count for problems, a 6px
15962
+ dot for a warning or an unsaved change. One per tab, the most urgent. */
15963
+ .crewlet-tabs__marker {
15964
+ display: inline-flex;
15965
+ align-items: center;
15966
+ justify-content: center;
15967
+ flex: none;
15968
+ }
15969
+ .crewlet-tabs__marker--danger {
15970
+ min-width: 16px;
15971
+ height: 16px;
15972
+ padding: 0 var(--spacing-1);
15973
+ border-radius: var(--radius-circle);
15974
+ background: var(--color-feedback-danger-soft);
15975
+ color: var(--color-feedback-danger-ink);
15976
+ font-family: var(--font-family-mono);
15977
+ font-size: var(--font-size-2xs);
15978
+ line-height: 1;
15979
+ }
15980
+ .crewlet-tabs__marker--warning,
15981
+ .crewlet-tabs__marker--changed {
15982
+ width: 6px;
15983
+ height: 6px;
15984
+ border-radius: var(--radius-circle);
15985
+ }
15986
+ .crewlet-tabs__marker--warning {
15987
+ background: var(--color-feedback-warning);
15988
+ }
15989
+ .crewlet-tabs__marker--changed {
15990
+ background: var(--color-brand-accent);
15991
+ }
15992
+
15778
15993
 
15779
15994
  /* Tag-4BRQS6GN.css */
15780
15995
  /*
@@ -1,5 +1,5 @@
1
1
  import '../chunk-AER7UDD4.js';
2
- export { NODE_HUES, NODE_HUE_NAMES, isNodeHue } from '../chunk-AYKXMIOR.js';
3
2
  export { useClipboard, writeClipboard } from '../chunk-5VNUYO76.js';
4
3
  export { HeadingLevelProvider, headingTag, nextHeadingLevel, useHeadingLevel } from '../chunk-PQADV6P6.js';
4
+ export { NODE_HUES, NODE_HUE_NAMES, isNodeHue } from '../chunk-AYKXMIOR.js';
5
5
  export { cx } from '../chunk-ODEQTPFM.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@crewlethq/ui",
3
- "version": "0.9.0",
3
+ "version": "0.11.0",
4
4
  "description": "Crewlet shared React components built on @crewlethq/tokens and @crewlethq/icons.",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -42,8 +42,8 @@
42
42
  "clean": "rm -rf dist src/generated"
43
43
  },
44
44
  "dependencies": {
45
- "@crewlethq/icons": "0.9.0",
46
- "@crewlethq/tokens": "0.9.0"
45
+ "@crewlethq/icons": "0.11.0",
46
+ "@crewlethq/tokens": "0.11.0"
47
47
  },
48
48
  "peerDependencies": {
49
49
  "react": ">=18",
@@ -1,125 +0,0 @@
1
- import { cx } from './chunk-ODEQTPFM.js';
2
- import { useState, useEffect } from 'react';
3
- import { CrewletCharacter } from '@crewlethq/icons/characters';
4
- import { jsx } from 'react/jsx-runtime';
5
-
6
- var AVATAR_SIZES = { xs: 20, sm: 26, md: 32, lg: 40 };
7
- var AVATAR_CORNER_RATIO = 0.29;
8
- var AVATAR_CHARACTER_FULL_DETAIL = 56;
9
- var getInitials = (name) => {
10
- if (!name) return "?";
11
- const words = name.trim().split(/[\s\-_.]+/).filter(Boolean);
12
- if (words.length === 0) return "?";
13
- const first = (word2) => (Array.from(word2)[0] ?? "").toUpperCase();
14
- if (words.length >= 2) return words.slice(0, 2).map(first).join("") || "?";
15
- const word = words[0];
16
- const humps = word.split(/(?<=\p{Ll})(?=\p{Lu})/u);
17
- if (humps.length >= 2) return humps.slice(0, 2).map(first).join("");
18
- return Array.from(word).slice(0, 2).map((character) => character.toUpperCase()).join("") || "?";
19
- };
20
- var TINT_COUNT = 10;
21
- var avatarTint = (seed) => {
22
- let hash = 0;
23
- for (let i = 0; i < seed.length; i += 1) {
24
- hash = hash * 31 + seed.charCodeAt(i) >>> 0;
25
- }
26
- return hash % TINT_COUNT;
27
- };
28
- function avatarPixels(size) {
29
- return typeof size === "number" ? size : AVATAR_SIZES[size];
30
- }
31
- function avatarCorner(pixels) {
32
- return pixels * AVATAR_CORNER_RATIO;
33
- }
34
- var Avatar = ({
35
- src,
36
- name,
37
- size = "md",
38
- kind = "agent",
39
- tone = "neutral",
40
- ring,
41
- decorative = false,
42
- colorSeed,
43
- character,
44
- hue,
45
- className,
46
- style,
47
- ...rest
48
- }) => {
49
- const [imageFailed, setImageFailed] = useState(false);
50
- useEffect(() => {
51
- setImageFailed(false);
52
- }, [src]);
53
- const step = typeof size === "number" ? null : size;
54
- const pixels = avatarPixels(size);
55
- const measured = step === null ? {
56
- "--crewlet-avatar-size": `${pixels}px`,
57
- fontSize: Math.max(9, Math.round(pixels * 0.36))
58
- } : {};
59
- const seeded = tone === "seeded" ? avatarTint(colorSeed ?? name ?? "") : null;
60
- const classes = cx(
61
- "crewlet-avatar",
62
- `crewlet-avatar--${kind}`,
63
- step === null ? null : `crewlet-avatar--${step}`,
64
- ring === void 0 ? null : `crewlet-avatar--ring-${ring}`,
65
- className
66
- );
67
- if (character !== void 0 && kind === "agent") {
68
- return /* @__PURE__ */ jsx(
69
- "span",
70
- {
71
- ...rest,
72
- className: cx(
73
- classes,
74
- "crewlet-avatar--character",
75
- hue === void 0 ? "crewlet-avatar--neutral" : `crewlet-avatar--hue-${hue}`
76
- ),
77
- style: { ...measured, ...style },
78
- role: decorative ? void 0 : "img",
79
- "aria-hidden": decorative ? true : void 0,
80
- "aria-label": decorative ? void 0 : name ? `${name} avatar` : "Avatar",
81
- children: /* @__PURE__ */ jsx(
82
- CrewletCharacter,
83
- {
84
- className: "crewlet-avatar__character",
85
- character,
86
- detail: pixels >= AVATAR_CHARACTER_FULL_DETAIL ? "full" : "compact"
87
- }
88
- )
89
- }
90
- );
91
- }
92
- if (src && !imageFailed) {
93
- return /* @__PURE__ */ jsx(
94
- "img",
95
- {
96
- ...rest,
97
- className: cx(classes, "crewlet-avatar--image"),
98
- style: { ...measured, ...style },
99
- src,
100
- alt: decorative ? "" : name ?? "",
101
- "aria-hidden": decorative ? true : void 0,
102
- onError: () => setImageFailed(true)
103
- }
104
- );
105
- }
106
- return /* @__PURE__ */ jsx(
107
- "span",
108
- {
109
- ...rest,
110
- className: cx(
111
- classes,
112
- "crewlet-avatar--fallback",
113
- `crewlet-avatar--${tone}`,
114
- seeded === null ? null : `crewlet-avatar--tint-${seeded}`
115
- ),
116
- style: { ...measured, ...style },
117
- role: decorative ? void 0 : "img",
118
- "aria-hidden": decorative ? true : void 0,
119
- "aria-label": decorative ? void 0 : name ? `${name} avatar` : "Avatar",
120
- children: getInitials(name)
121
- }
122
- );
123
- };
124
-
125
- export { AVATAR_CHARACTER_FULL_DETAIL, AVATAR_CORNER_RATIO, AVATAR_SIZES, Avatar, avatarCorner, avatarPixels, avatarTint, getInitials };