@inkra/react 0.0.0-stage → 0.2.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 (267) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +316 -2
  3. package/THIRD_PARTY_NOTICES.md +39 -0
  4. package/Yozai-OFL.txt +94 -0
  5. package/dist/Button.d.ts +36 -0
  6. package/dist/Button.js +89 -0
  7. package/dist/PencilIcon.d.ts +22 -0
  8. package/dist/PencilIcon.js +210 -0
  9. package/dist/PencilLine.d.ts +10 -0
  10. package/dist/PencilLine.js +91 -0
  11. package/dist/PencilSurface.d.ts +19 -0
  12. package/dist/PencilSurface.js +19 -0
  13. package/dist/PencilText.d.ts +16 -0
  14. package/dist/PencilText.js +338 -0
  15. package/dist/accordion/Accordion.d.ts +27 -0
  16. package/dist/accordion/Accordion.js +40 -0
  17. package/dist/accordion/index.d.ts +2 -0
  18. package/dist/accordion/index.js +1 -0
  19. package/dist/alert-dialog/index.d.ts +64 -0
  20. package/dist/alert-dialog/index.js +109 -0
  21. package/dist/assets/ui-hand-yozai.woff2 +0 -0
  22. package/dist/audio-player/index.d.ts +60 -0
  23. package/dist/audio-player/index.js +101 -0
  24. package/dist/breadcrumb/index.d.ts +16 -0
  25. package/dist/breadcrumb/index.js +25 -0
  26. package/dist/calendar/index.d.ts +21 -0
  27. package/dist/calendar/index.js +41 -0
  28. package/dist/carousel/index.d.ts +51 -0
  29. package/dist/carousel/index.js +290 -0
  30. package/dist/choice-grid/index.d.ts +38 -0
  31. package/dist/choice-grid/index.js +85 -0
  32. package/dist/color-picker/color.d.ts +15 -0
  33. package/dist/color-picker/color.js +55 -0
  34. package/dist/color-picker/index.d.ts +31 -0
  35. package/dist/color-picker/index.js +69 -0
  36. package/dist/command/index.d.ts +23 -0
  37. package/dist/command/index.js +39 -0
  38. package/dist/content/index.d.ts +106 -0
  39. package/dist/content/index.js +80 -0
  40. package/dist/context-menu/index.d.ts +76 -0
  41. package/dist/context-menu/index.js +240 -0
  42. package/dist/data-table/index.d.ts +47 -0
  43. package/dist/data-table/index.js +91 -0
  44. package/dist/date-picker/index.d.ts +50 -0
  45. package/dist/date-picker/index.js +180 -0
  46. package/dist/day-agenda/index.d.ts +43 -0
  47. package/dist/day-agenda/index.js +47 -0
  48. package/dist/day-agenda/layout.d.ts +20 -0
  49. package/dist/day-agenda/layout.js +60 -0
  50. package/dist/display/ProgressRing.d.ts +6 -0
  51. package/dist/display/ProgressRing.js +146 -0
  52. package/dist/display/index.d.ts +59 -0
  53. package/dist/display/index.js +75 -0
  54. package/dist/dockable-panel/index.d.ts +41 -0
  55. package/dist/dockable-panel/index.js +253 -0
  56. package/dist/dockable-panel/model.d.ts +21 -0
  57. package/dist/dockable-panel/model.js +61 -0
  58. package/dist/drawer/index.d.ts +63 -0
  59. package/dist/drawer/index.js +86 -0
  60. package/dist/dropdown-menu/index.d.ts +34 -0
  61. package/dist/dropdown-menu/index.js +40 -0
  62. package/dist/editable/index.d.ts +53 -0
  63. package/dist/editable/index.js +162 -0
  64. package/dist/empty/index.d.ts +21 -0
  65. package/dist/empty/index.js +23 -0
  66. package/dist/flip/index.d.ts +49 -0
  67. package/dist/flip/index.js +138 -0
  68. package/dist/form/EditablePencilText.d.ts +13 -0
  69. package/dist/form/EditablePencilText.js +323 -0
  70. package/dist/form/Field.d.ts +13 -0
  71. package/dist/form/Field.js +26 -0
  72. package/dist/form/Input.d.ts +27 -0
  73. package/dist/form/Input.js +97 -0
  74. package/dist/form/InputAction.d.ts +7 -0
  75. package/dist/form/InputAction.js +24 -0
  76. package/dist/form/Textarea.d.ts +17 -0
  77. package/dist/form/Textarea.js +102 -0
  78. package/dist/form/context.d.ts +12 -0
  79. package/dist/form/context.js +10 -0
  80. package/dist/form/controlProps.d.ts +23 -0
  81. package/dist/form/controlProps.js +20 -0
  82. package/dist/form/index.d.ts +7 -0
  83. package/dist/form/index.js +3 -0
  84. package/dist/form/types.d.ts +6 -0
  85. package/dist/form/types.js +1 -0
  86. package/dist/heatmap/index.d.ts +59 -0
  87. package/dist/heatmap/index.js +248 -0
  88. package/dist/hotkey/index.d.ts +37 -0
  89. package/dist/hotkey/index.js +130 -0
  90. package/dist/hotkey/model.d.ts +27 -0
  91. package/dist/hotkey/model.js +97 -0
  92. package/dist/hover-card/index.d.ts +33 -0
  93. package/dist/hover-card/index.js +141 -0
  94. package/dist/image-cropper/index.d.ts +82 -0
  95. package/dist/image-cropper/index.js +261 -0
  96. package/dist/image-cropper/model.d.ts +42 -0
  97. package/dist/image-cropper/model.js +94 -0
  98. package/dist/image-viewer/index.d.ts +79 -0
  99. package/dist/image-viewer/index.js +220 -0
  100. package/dist/image-viewer/model.d.ts +9 -0
  101. package/dist/image-viewer/model.js +18 -0
  102. package/dist/images/layers-2x.png +0 -0
  103. package/dist/images/layers.png +0 -0
  104. package/dist/images/marker-icon.png +0 -0
  105. package/dist/index.d.ts +75 -0
  106. package/dist/index.js +69 -0
  107. package/dist/input-number/index.d.ts +16 -0
  108. package/dist/input-number/index.js +77 -0
  109. package/dist/internal/InputActionContext.d.ts +1 -0
  110. package/dist/internal/InputActionContext.js +3 -0
  111. package/dist/internal/cache.d.ts +14 -0
  112. package/dist/internal/cache.js +54 -0
  113. package/dist/internal/line.d.ts +4 -0
  114. package/dist/internal/line.js +21 -0
  115. package/dist/internal/paper.d.ts +1 -0
  116. package/dist/internal/paper.js +65 -0
  117. package/dist/internal/random.d.ts +3 -0
  118. package/dist/internal/random.js +30 -0
  119. package/dist/internal/recovery.d.ts +1 -0
  120. package/dist/internal/recovery.js +52 -0
  121. package/dist/internal/renderTokens.d.ts +10 -0
  122. package/dist/internal/renderTokens.js +13 -0
  123. package/dist/internal/stroke.d.ts +24 -0
  124. package/dist/internal/stroke.js +144 -0
  125. package/dist/internal/surfaceRenderer.d.ts +41 -0
  126. package/dist/internal/surfaceRenderer.js +178 -0
  127. package/dist/internal/textQueue.d.ts +1 -0
  128. package/dist/internal/textQueue.js +37 -0
  129. package/dist/internal/textRenderer.d.ts +28 -0
  130. package/dist/internal/textRenderer.js +239 -0
  131. package/dist/internal/travelIcons.d.ts +24 -0
  132. package/dist/internal/travelIcons.js +14 -0
  133. package/dist/internal/useBrowserLayoutEffect.d.ts +2 -0
  134. package/dist/internal/useBrowserLayoutEffect.js +3 -0
  135. package/dist/internal/usePencilSurface.d.ts +3 -0
  136. package/dist/internal/usePencilSurface.js +116 -0
  137. package/dist/internal/useSelectionDrawing.d.ts +2 -0
  138. package/dist/internal/useSelectionDrawing.js +90 -0
  139. package/dist/internal/wash.d.ts +16 -0
  140. package/dist/internal/wash.js +149 -0
  141. package/dist/journey-map/MapScale.d.ts +4 -0
  142. package/dist/journey-map/MapScale.js +54 -0
  143. package/dist/journey-map/index.d.ts +39 -0
  144. package/dist/journey-map/index.js +197 -0
  145. package/dist/journey-map/terrain.d.ts +8 -0
  146. package/dist/journey-map/terrain.js +127 -0
  147. package/dist/keypad/index.d.ts +23 -0
  148. package/dist/keypad/index.js +63 -0
  149. package/dist/keypad/model.d.ts +20 -0
  150. package/dist/keypad/model.js +33 -0
  151. package/dist/layout/index.d.ts +63 -0
  152. package/dist/layout/index.js +62 -0
  153. package/dist/log/index.d.ts +45 -0
  154. package/dist/log/index.js +159 -0
  155. package/dist/log/model.d.ts +16 -0
  156. package/dist/log/model.js +13 -0
  157. package/dist/node-graph/index.d.ts +123 -0
  158. package/dist/node-graph/index.js +304 -0
  159. package/dist/number-ticker/index.d.ts +29 -0
  160. package/dist/number-ticker/index.js +132 -0
  161. package/dist/number-ticker/model.d.ts +8 -0
  162. package/dist/number-ticker/model.js +34 -0
  163. package/dist/overflow-list/index.d.ts +39 -0
  164. package/dist/overflow-list/index.js +230 -0
  165. package/dist/overflow-list/layout.d.ts +19 -0
  166. package/dist/overflow-list/layout.js +44 -0
  167. package/dist/overlay/Overlay.d.ts +65 -0
  168. package/dist/overlay/Overlay.js +77 -0
  169. package/dist/overlay/Popover.d.ts +43 -0
  170. package/dist/overlay/Popover.js +45 -0
  171. package/dist/overlay/index.d.ts +4 -0
  172. package/dist/overlay/index.js +2 -0
  173. package/dist/overlay/themeBridge.d.ts +8 -0
  174. package/dist/overlay/themeBridge.js +98 -0
  175. package/dist/pagination/index.d.ts +23 -0
  176. package/dist/pagination/index.js +41 -0
  177. package/dist/pagination/model.d.ts +4 -0
  178. package/dist/pagination/model.js +42 -0
  179. package/dist/pan-zoom/index.d.ts +71 -0
  180. package/dist/pan-zoom/index.js +175 -0
  181. package/dist/pencil.d.ts +10 -0
  182. package/dist/pencil.js +39 -0
  183. package/dist/radar/index.d.ts +54 -0
  184. package/dist/radar/index.js +220 -0
  185. package/dist/range-slider/index.d.ts +16 -0
  186. package/dist/range-slider/index.js +22 -0
  187. package/dist/rating/index.d.ts +28 -0
  188. package/dist/rating/index.js +127 -0
  189. package/dist/resizable/index.d.ts +32 -0
  190. package/dist/resizable/index.js +50 -0
  191. package/dist/scroll-area/index.d.ts +36 -0
  192. package/dist/scroll-area/index.js +44 -0
  193. package/dist/segmented-progress/SegmentedProgress.d.ts +17 -0
  194. package/dist/segmented-progress/SegmentedProgress.js +42 -0
  195. package/dist/select/MultipleSelect.d.ts +44 -0
  196. package/dist/select/MultipleSelect.js +124 -0
  197. package/dist/select/SearchableSelect.d.ts +45 -0
  198. package/dist/select/SearchableSelect.js +50 -0
  199. package/dist/select/Select.d.ts +109 -0
  200. package/dist/select/Select.js +205 -0
  201. package/dist/select/index.d.ts +4 -0
  202. package/dist/select/index.js +2 -0
  203. package/dist/selection/Checkbox.d.ts +9 -0
  204. package/dist/selection/Checkbox.js +37 -0
  205. package/dist/selection/RadioGroup.d.ts +23 -0
  206. package/dist/selection/RadioGroup.js +82 -0
  207. package/dist/selection/Switch.d.ts +8 -0
  208. package/dist/selection/Switch.js +36 -0
  209. package/dist/selection/index.d.ts +6 -0
  210. package/dist/selection/index.js +3 -0
  211. package/dist/selection/useNativeChecked.d.ts +13 -0
  212. package/dist/selection/useNativeChecked.js +27 -0
  213. package/dist/slider/index.d.ts +11 -0
  214. package/dist/slider/index.js +45 -0
  215. package/dist/slot/index.d.ts +24 -0
  216. package/dist/slot/index.js +29 -0
  217. package/dist/sortable/index.d.ts +50 -0
  218. package/dist/sortable/index.js +278 -0
  219. package/dist/sortable/model.d.ts +30 -0
  220. package/dist/sortable/model.js +64 -0
  221. package/dist/sparkline/index.d.ts +19 -0
  222. package/dist/sparkline/index.js +240 -0
  223. package/dist/sparkline/model.d.ts +16 -0
  224. package/dist/sparkline/model.js +28 -0
  225. package/dist/steps/index.d.ts +16 -0
  226. package/dist/steps/index.js +37 -0
  227. package/dist/styles.css +8226 -0
  228. package/dist/tabs/index.d.ts +22 -0
  229. package/dist/tabs/index.js +42 -0
  230. package/dist/tag-input/index.d.ts +69 -0
  231. package/dist/tag-input/index.js +325 -0
  232. package/dist/tag-input/model.d.ts +14 -0
  233. package/dist/tag-input/model.js +38 -0
  234. package/dist/time-picker/index.d.ts +15 -0
  235. package/dist/time-picker/index.js +168 -0
  236. package/dist/timeline/index.d.ts +14 -0
  237. package/dist/timeline/index.js +16 -0
  238. package/dist/toast/index.d.ts +27 -0
  239. package/dist/toast/index.js +36 -0
  240. package/dist/toggle-group/index.d.ts +17 -0
  241. package/dist/toggle-group/index.js +26 -0
  242. package/dist/tokens.css +356 -0
  243. package/dist/tooltip/Tooltip.d.ts +24 -0
  244. package/dist/tooltip/Tooltip.js +32 -0
  245. package/dist/tooltip/index.d.ts +2 -0
  246. package/dist/tooltip/index.js +1 -0
  247. package/dist/transfer/index.d.ts +64 -0
  248. package/dist/transfer/index.js +174 -0
  249. package/dist/transfer/model.d.ts +12 -0
  250. package/dist/transfer/model.js +33 -0
  251. package/dist/tree/index.d.ts +39 -0
  252. package/dist/tree/index.js +36 -0
  253. package/dist/tree-select/index.d.ts +59 -0
  254. package/dist/tree-select/index.js +142 -0
  255. package/dist/tree-select/model.d.ts +31 -0
  256. package/dist/tree-select/model.js +135 -0
  257. package/dist/typewriter/index.d.ts +21 -0
  258. package/dist/typewriter/index.js +101 -0
  259. package/dist/typewriter/model.d.ts +7 -0
  260. package/dist/typewriter/model.js +45 -0
  261. package/dist/upload/index.d.ts +59 -0
  262. package/dist/upload/index.js +230 -0
  263. package/dist/virtual-list/index.d.ts +44 -0
  264. package/dist/virtual-list/index.js +128 -0
  265. package/dist/virtual-list/model.d.ts +7 -0
  266. package/dist/virtual-list/model.js +27 -0
  267. package/package.json +119 -4
@@ -0,0 +1,43 @@
1
+ import { type HTMLAttributes, type ReactNode } from 'react';
2
+ export interface AgendaEvent {
3
+ id: string;
4
+ title: string;
5
+ /** Minutes from the selected local day's midnight. Negative/over-1440 values indicate continuation. */
6
+ startMinute?: number;
7
+ endMinute?: number;
8
+ description?: ReactNode;
9
+ kind?: 'activity' | 'travel' | 'stay';
10
+ color?: string;
11
+ icon?: ReactNode;
12
+ disabled?: boolean;
13
+ }
14
+ export interface DayAgendaProps extends Omit<HTMLAttributes<HTMLElement>, 'onSelect'> {
15
+ date: string;
16
+ events: readonly AgendaEvent[];
17
+ selectedEvent?: string;
18
+ onEventSelect?: (event: AgendaEvent) => void;
19
+ locale?: string;
20
+ timeZoneLabel?: string;
21
+ emptyLabel?: string;
22
+ untimedLabel?: string;
23
+ showOverview?: boolean;
24
+ hourCycle?: 'h12' | 'h23';
25
+ density?: 'compact' | 'comfortable';
26
+ showDescriptions?: boolean;
27
+ divided?: boolean;
28
+ disabled?: boolean;
29
+ onPreviousDay?: () => void;
30
+ onNextDay?: () => void;
31
+ navigationLabels?: {
32
+ previous: string;
33
+ next: string;
34
+ };
35
+ }
36
+ export declare function agendaTime(minute: number, hourCycle?: 'h12' | 'h23', locale?: string): string;
37
+ export declare function agendaInterval(event: AgendaEvent): {
38
+ start: number;
39
+ end: number;
40
+ before: boolean;
41
+ after: boolean;
42
+ } | null;
43
+ export declare function DayAgenda({ date, events, selectedEvent, onEventSelect, locale, timeZoneLabel, emptyLabel, untimedLabel, showOverview, hourCycle, density, showDescriptions, divided, disabled, onPreviousDay, onNextDay, navigationLabels, className, ...props }: DayAgendaProps): import("react").JSX.Element;
@@ -0,0 +1,47 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useId } from 'react';
3
+ import { TravelIcon } from '../internal/travelIcons.js';
4
+ import { Button } from '../Button.js';
5
+ import { createAgendaScale, layoutAgendaCards } from './layout.js';
6
+ import { PencilSurface } from '../PencilSurface.js';
7
+ import { PencilLine } from '../PencilLine.js';
8
+ import { PencilText } from '../PencilText.js';
9
+ export function agendaTime(minute, hourCycle = 'h23', locale = 'en') {
10
+ const value = Math.max(0, Math.min(1440, Math.floor(minute)));
11
+ if (hourCycle === 'h12') {
12
+ const time = new Date(Date.UTC(2000, 0, 1, 0, value));
13
+ return new Intl.DateTimeFormat(locale, { timeZone: 'UTC', hour: 'numeric', minute: '2-digit', hourCycle }).format(time) + (value === 1440 ? ' +1' : '');
14
+ }
15
+ return value === 1440 ? '00:00 +1' : `${String(Math.floor(value / 60)).padStart(2, '0')}:${String(value % 60).padStart(2, '0')}`;
16
+ }
17
+ export function agendaInterval(event) {
18
+ if (event.startMinute === undefined || !Number.isFinite(event.startMinute))
19
+ return null;
20
+ const end = event.endMinute;
21
+ if (end !== undefined && (!Number.isFinite(end) || end < event.startMinute))
22
+ return null;
23
+ if (event.startMinute >= 1440 || (end ?? event.startMinute) < 0 || (end === 0 && event.startMinute < 0))
24
+ return null;
25
+ return { start: Math.max(0, event.startMinute), end: Math.min(1440, end ?? event.startMinute), before: event.startMinute < 0, after: (end ?? 0) > 1440 };
26
+ }
27
+ export function DayAgenda({ date, events, selectedEvent, onEventSelect, locale = 'en', timeZoneLabel, emptyLabel = 'No events', untimedLabel = 'Time pending', showOverview = true, hourCycle = 'h23', density = 'comfortable', showDescriptions = true, divided = true, disabled = false, onPreviousDay, onNextDay, navigationLabels = { previous: 'Previous day', next: 'Next day' }, className, ...props }) {
28
+ const id = useId();
29
+ const validDate = /^\d{4}-\d{2}-\d{2}$/.test(date) ? new Date(`${date}T12:00:00Z`) : new Date(NaN);
30
+ const title = Number.isFinite(validDate.getTime()) ? new Intl.DateTimeFormat(locale, { timeZone: 'UTC', month: 'long', day: 'numeric', weekday: 'short' }).format(validDate) : date;
31
+ const ordered = [...events].sort((a, b) => (agendaInterval(a)?.start ?? Infinity) - (agendaInterval(b)?.start ?? Infinity));
32
+ const formatTime = (minute) => agendaTime(minute, hourCycle, locale);
33
+ const timed = ordered.flatMap(event => {
34
+ const interval = agendaInterval(event);
35
+ return interval ? [{ ...interval, id: event.id, event }] : [];
36
+ });
37
+ const intervals = timed.filter(row => row.end > row.start);
38
+ const points = timed.filter(row => row.end === row.start);
39
+ const scale = createAgendaScale(intervals, points.map(row => row.start), density === 'compact');
40
+ const cards = layoutAgendaCards(timed, scale).sort((a, b) => a.start - b.start);
41
+ const ticks = Array.from({ length: 25 }, (_, hour) => hour * 60).filter((minute, index, list) => index === 0 || index === 24 || scale.position(minute) - scale.position(list[index - 1]) >= 25);
42
+ const renderCard = (event, time) => _jsxs(PencilSurface, { variant: "quiet", radius: 6, className: "inkra-agenda__card", "data-selected": selectedEvent === event.id, style: { '--inkra-accent-soft': event.color ?? (event.kind === 'stay' ? '#c8c38f' : event.kind === 'travel' ? '#87bbc0' : '#a7c7ad') }, children: [onEventSelect && _jsx("button", { type: "button", className: "inkra-agenda__hit", disabled: disabled || event.disabled, "aria-label": `${time}, ${event.title}`, "aria-pressed": selectedEvent === event.id, onClick: () => onEventSelect(event) }), _jsxs("div", { className: "inkra-agenda__card-copy", children: [_jsxs("span", { className: "inkra-agenda__card-title", title: event.title, children: [event.icon && _jsx("span", { "aria-hidden": "true", children: event.icon }), _jsx(PencilText, { ellipsis: true, children: event.title })] }), showDescriptions && event.description && _jsx("span", { className: "inkra-agenda__description", children: event.description })] })] });
43
+ return _jsxs("section", { ...props, "data-density": density, "data-hour-cycle": hourCycle, className: ['inkra-agenda', className].filter(Boolean).join(' '), "aria-labelledby": props['aria-labelledby'] ?? id, children: [_jsxs("header", { className: "inkra-agenda__heading", children: [_jsx(PencilText, { as: "h3", id: id, children: title }), timeZoneLabel && _jsx(PencilText, { children: timeZoneLabel })] }), _jsx(PencilLine, {}), ordered.length === 0 ? _jsx(PencilText, { as: "p", children: emptyLabel }) : _jsxs(_Fragment, { children: [_jsx("div", { className: "inkra-agenda__timeline", "data-overview": showOverview, children: _jsxs("div", { className: "inkra-agenda__scale", style: { height: scale.height + 24 }, children: [ticks.map(minute => _jsxs("div", { className: "inkra-agenda__tick", style: { top: scale.position(minute) + 12 }, children: [_jsx("span", { children: _jsx(PencilText, { children: formatTime(minute) }) }), divided && _jsx(PencilLine, {})] }, minute)), _jsx("ol", { className: "inkra-agenda__lanes", children: cards.map(row => {
44
+ const time = `${row.before ? '\u2190 ' : ''}${formatTime(row.start)}${row.event.endMinute !== undefined ? ` - ${formatTime(row.end)}` : ''}${row.after ? ' \u2192' : ''}`;
45
+ return _jsxs("li", { "data-kind": row.event.kind, style: { top: row.top + 14, height: Math.max(44, row.height - 4), insetInlineStart: `${row.lane / row.lanes * 100}%`, width: `${100 / row.lanes}%` }, children: [renderCard(row.event, time), _jsx("span", { className: "inkra-agenda__accessible-time", children: time })] }, row.id);
46
+ }) })] }) }), ordered.some(event => !agendaInterval(event)) && _jsxs("div", { className: "inkra-agenda__pending", children: [_jsx(PencilText, { children: untimedLabel }), ordered.filter(event => !agendaInterval(event)).map(event => _jsx("div", { children: renderCard(event, untimedLabel) }, event.id))] })] }), (onPreviousDay || onNextDay) && _jsxs("footer", { className: "inkra-agenda__navigation", children: [_jsx(PencilLine, {}), _jsx(Button, { variant: "ghost", size: "icon", "aria-label": navigationLabels.previous, title: navigationLabels.previous, disabled: !onPreviousDay, onClick: onPreviousDay, children: _jsx(TravelIcon, { name: "previous" }) }), _jsx(Button, { variant: "ghost", size: "icon", "aria-label": navigationLabels.next, title: navigationLabels.next, disabled: !onNextDay, onClick: onNextDay, children: _jsx(TravelIcon, { name: "next" }) })] })] });
47
+ }
@@ -0,0 +1,20 @@
1
+ export interface ScheduleInterval {
2
+ id: string;
3
+ start: number;
4
+ end: number;
5
+ }
6
+ export declare function layoutAgendaIntervals<T extends ScheduleInterval>(intervals: T[]): (T & {
7
+ lane: number;
8
+ lanes: number;
9
+ })[];
10
+ export declare function createAgendaScale(intervals: ScheduleInterval[], pointTimes: number[], compact: boolean): {
11
+ position: (minute: number, edge?: "before" | "after") => number;
12
+ height: number;
13
+ rowHeight: number;
14
+ };
15
+ export declare function layoutAgendaCards<T extends ScheduleInterval>(rows: T[], scale: ReturnType<typeof createAgendaScale>): (T & {
16
+ top: number;
17
+ height: number;
18
+ lane: number;
19
+ lanes: number;
20
+ })[];
@@ -0,0 +1,60 @@
1
+ export function layoutAgendaIntervals(intervals) {
2
+ const sorted = [...intervals].sort((a, b) => a.start - b.start || a.id.localeCompare(b.id));
3
+ const result = [];
4
+ let group = [], groupEnd = -Infinity, laneEnds = [];
5
+ const flush = () => { for (const item of group)
6
+ result.push({ ...item, lanes: laneEnds.length }); group = []; laneEnds = []; };
7
+ for (const item of sorted) {
8
+ if (item.start >= groupEnd)
9
+ flush();
10
+ let lane = laneEnds.findIndex(end => end <= item.start);
11
+ if (lane < 0)
12
+ lane = laneEnds.length;
13
+ laneEnds[lane] = item.end;
14
+ group.push({ ...item, lane });
15
+ groupEnd = Math.max(groupEnd, item.end);
16
+ }
17
+ flush();
18
+ return result;
19
+ }
20
+ export function createAgendaScale(intervals, pointTimes, compact) {
21
+ const rowHeight = compact ? 56 : 72;
22
+ const points = new Set(pointTimes);
23
+ const boundaries = [...new Set([0, 1440, ...pointTimes, ...intervals.flatMap(row => [row.start, row.end])])].sort((a, b) => a - b);
24
+ const before = new Map(), after = new Map();
25
+ const segments = [];
26
+ let height = 0;
27
+ for (let index = 0; index < boundaries.length; index++) {
28
+ const time = boundaries[index];
29
+ before.set(time, height);
30
+ if (points.has(time))
31
+ height += rowHeight;
32
+ after.set(time, height);
33
+ const next = boundaries[index + 1];
34
+ if (next === undefined)
35
+ continue;
36
+ const occupied = intervals.some(row => row.start < next && row.end > time);
37
+ const size = Math.max(occupied ? rowHeight : 16, (next - time) / 60 * 32);
38
+ segments.push({ start: time, end: next, top: height, size });
39
+ height += size;
40
+ }
41
+ const position = (minute, edge = 'before') => {
42
+ const time = Math.max(0, Math.min(1440, minute));
43
+ const exact = (edge === 'after' ? after : before).get(time);
44
+ if (exact !== undefined)
45
+ return exact;
46
+ const segment = segments.find(row => time >= row.start && time <= row.end);
47
+ return segment ? segment.top + (time - segment.start) / (segment.end - segment.start) * segment.size : 0;
48
+ };
49
+ return { position, height, rowHeight };
50
+ }
51
+ export function layoutAgendaCards(rows, scale) {
52
+ // Allocate lanes in the shared pixel scale so a point inside a long event cannot cover it.
53
+ const positioned = rows.map(row => {
54
+ const point = row.start === row.end;
55
+ const top = scale.position(row.start, point ? 'before' : 'after');
56
+ const height = point ? scale.rowHeight : scale.position(row.end) - top;
57
+ return { id: row.id, start: top, end: top + height, row, top, height };
58
+ });
59
+ return layoutAgendaIntervals(positioned).map(({ row, top, height, lane, lanes }) => ({ ...row, top, height, lane, lanes }));
60
+ }
@@ -0,0 +1,6 @@
1
+ export declare function ProgressRing({ diameter, thickness, percent, seed }: {
2
+ diameter: number;
3
+ thickness: number;
4
+ percent: number | null;
5
+ seed: string | number;
6
+ }): import("react").JSX.Element;
@@ -0,0 +1,146 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect, useMemo, useRef } from 'react';
3
+ import { BoundedCache, PENCIL_RENDERER_VERSION, canvasByteCost, canvasIsUsable, effectiveDpr } from '../internal/cache.js';
4
+ import { observeCanvasRecovery } from '../internal/recovery.js';
5
+ import { seedToNumber } from '../internal/random.js';
6
+ import { maxStrokeRoughness, pencilRenderDefaults, readRenderToken } from '../internal/renderTokens.js';
7
+ import { pencilStroke } from '../internal/stroke.js';
8
+ const ringCache = new BoundedCache(48, 8 * 1024 * 1024);
9
+ function smoothstep(value) {
10
+ return value * value * (3 - 2 * value);
11
+ }
12
+ function arcClip(diameter, radius, thickness, percent) {
13
+ const progress = Math.max(0, Math.min(100, percent ?? 28));
14
+ if (progress === 0)
15
+ return 'inset(50%)';
16
+ if (progress === 100)
17
+ return 'none';
18
+ const radians = progress / 100 * Math.PI * 2;
19
+ const arcLength = radius * radians;
20
+ const taperLength = Math.min(arcLength * 0.28, Math.max(7, thickness * 2.4));
21
+ const steps = Math.max(8, Math.ceil(progress * 0.9));
22
+ const outer = [];
23
+ const inner = [];
24
+ let start;
25
+ let end;
26
+ const point = (angle, distance) => `${((diameter / 2 + Math.cos(angle) * distance) / diameter * 100).toFixed(3)}% ${((diameter / 2 + Math.sin(angle) * distance) / diameter * 100).toFixed(3)}%`;
27
+ for (let index = 0; index <= steps; index += 1) {
28
+ const ratio = index / steps;
29
+ const distanceFromEnd = Math.min(ratio, 1 - ratio) * arcLength;
30
+ const taper = 0.12 + smoothstep(Math.min(1, distanceFromEnd / taperLength)) * 0.88;
31
+ // Leave enough room for the global stroke-width token while narrowing only
32
+ // the exposed ends. The pencil texture itself still determines the edge.
33
+ const halfWidth = thickness * 1.55 * taper;
34
+ const angle = ratio * radians - Math.PI / 2;
35
+ if (index === 0)
36
+ start = { angle, halfWidth };
37
+ if (index === steps)
38
+ end = { angle, halfWidth };
39
+ outer.push(point(angle, radius + halfWidth));
40
+ inner.push(point(angle, Math.max(0, radius - halfWidth)));
41
+ }
42
+ const endCap = Array.from({ length: 5 }, (_, index) => {
43
+ const capAngle = Math.PI / 2 - index / 4 * Math.PI;
44
+ const tangent = end.angle + Math.PI / 2;
45
+ const x = diameter / 2 + Math.cos(end.angle) * radius
46
+ + Math.cos(end.angle) * Math.sin(capAngle) * end.halfWidth
47
+ + Math.cos(tangent) * Math.cos(capAngle) * end.halfWidth;
48
+ const y = diameter / 2 + Math.sin(end.angle) * radius
49
+ + Math.sin(end.angle) * Math.sin(capAngle) * end.halfWidth
50
+ + Math.sin(tangent) * Math.cos(capAngle) * end.halfWidth;
51
+ return `${(x / diameter * 100).toFixed(3)}% ${(y / diameter * 100).toFixed(3)}%`;
52
+ });
53
+ const startCap = Array.from({ length: 5 }, (_, index) => {
54
+ const capAngle = -Math.PI / 2 + index / 4 * Math.PI;
55
+ const tangent = start.angle + Math.PI / 2;
56
+ const x = diameter / 2 + Math.cos(start.angle) * radius
57
+ + Math.cos(start.angle) * Math.sin(capAngle) * start.halfWidth
58
+ - Math.cos(tangent) * Math.cos(capAngle) * start.halfWidth;
59
+ const y = diameter / 2 + Math.sin(start.angle) * radius
60
+ + Math.sin(start.angle) * Math.sin(capAngle) * start.halfWidth
61
+ - Math.sin(tangent) * Math.cos(capAngle) * start.halfWidth;
62
+ return `${(x / diameter * 100).toFixed(3)}% ${(y / diameter * 100).toFixed(3)}%`;
63
+ });
64
+ return `polygon(${outer.join(',')},${endCap.join(',')},${inner.reverse().join(',')},${startCap.join(',')})`;
65
+ }
66
+ export function ProgressRing({ diameter, thickness, percent, seed }) {
67
+ const canvasRef = useRef(null);
68
+ const radius = diameter / 2 - thickness - 4;
69
+ const clipPath = useMemo(() => arcClip(diameter, radius, thickness, percent), [diameter, percent, radius, thickness]);
70
+ // Paint a stable full ring once; CSS reveals the current arc without repainting its texture.
71
+ useEffect(() => {
72
+ const canvas = canvasRef.current;
73
+ if (!canvas)
74
+ return;
75
+ let lastPaint = '';
76
+ const paint = () => {
77
+ try {
78
+ if (!CSS.supports('clip-path', 'polygon(0 0, 100% 0, 100% 100%)'))
79
+ return;
80
+ const width = canvas.clientWidth;
81
+ if (!width)
82
+ return;
83
+ const style = getComputedStyle(canvas);
84
+ const weight = readRenderToken(style, '--inkra-stroke-width', pencilRenderDefaults.strokeWidth, 0.3, 3);
85
+ const roughness = readRenderToken(style, '--inkra-stroke-amplitude', pencilRenderDefaults.strokeRoughness, 0, maxStrokeRoughness);
86
+ const dpr = effectiveDpr(2);
87
+ const key = JSON.stringify([PENCIL_RENDERER_VERSION, diameter, thickness, width, dpr, style.color, weight, roughness, seed]);
88
+ if (key === lastPaint && canvasIsUsable(canvas))
89
+ return;
90
+ let image = ringCache.get(key);
91
+ if (image && !canvasIsUsable(image)) {
92
+ ringCache.delete(key);
93
+ image = undefined;
94
+ }
95
+ if (!image) {
96
+ image = document.createElement('canvas');
97
+ image.width = image.height = Math.ceil(width * dpr);
98
+ const context = image.getContext('2d');
99
+ if (!context)
100
+ throw new Error('Canvas unavailable');
101
+ context.scale(image.width / diameter, image.height / diameter);
102
+ const points = Array.from({ length: 361 }, (_, index) => {
103
+ const angle = index * Math.PI / 180 - Math.PI / 2;
104
+ return [diameter / 2 + Math.cos(angle) * radius, diameter / 2 + Math.sin(angle) * radius];
105
+ });
106
+ pencilStroke(context, points, style.color, thickness * weight / 2.15, seedToNumber(seed), roughness * 0.55, 2, true, { variation: 0.86, breaks: 0.32, grain: 0.84, gain: 1.35, step: 0.55, edgeGrain: true });
107
+ ringCache.set(key, image, canvasByteCost(image));
108
+ }
109
+ const context = canvas.getContext('2d');
110
+ if (!context || context.isContextLost?.())
111
+ throw new Error('Canvas unavailable');
112
+ canvas.width = image.width;
113
+ canvas.height = image.height;
114
+ context.drawImage(image, 0, 0);
115
+ canvas.dataset.ready = 'true';
116
+ lastPaint = key;
117
+ }
118
+ catch {
119
+ delete canvas.dataset.ready;
120
+ lastPaint = '';
121
+ }
122
+ };
123
+ const lost = () => { delete canvas.dataset.ready; lastPaint = ''; };
124
+ canvas.addEventListener('contextlost', lost);
125
+ const observer = new MutationObserver(paint);
126
+ for (let node = canvas; node; node = node.parentElement) {
127
+ observer.observe(node, { attributes: true, attributeFilter: ['style', 'class', 'dir', 'data-theme', 'data-inkra-theme'] });
128
+ }
129
+ const resize = new ResizeObserver(paint);
130
+ resize.observe(canvas);
131
+ const scheme = matchMedia('(prefers-color-scheme: dark)');
132
+ scheme.addEventListener('change', paint);
133
+ window.addEventListener('resize', paint);
134
+ const stopRecovery = observeCanvasRecovery(paint);
135
+ paint();
136
+ return () => {
137
+ observer.disconnect();
138
+ resize.disconnect();
139
+ scheme.removeEventListener('change', paint);
140
+ window.removeEventListener('resize', paint);
141
+ canvas.removeEventListener('contextlost', lost);
142
+ stopRecovery();
143
+ };
144
+ }, [diameter, radius, seed, thickness]);
145
+ return _jsx("span", { className: "inkra-progress__ring", "aria-hidden": "true", children: _jsx("span", { className: "inkra-progress__ring-rotation", children: _jsxs("span", { className: "inkra-progress__ring-direction", children: [_jsx("canvas", { ref: canvasRef, className: "inkra-progress__ring-ink", style: { clipPath } }), _jsx("svg", { className: "inkra-progress__ring-fallback", viewBox: `0 0 ${diameter} ${diameter}`, focusable: "false", children: _jsx("circle", { cx: diameter / 2, cy: diameter / 2, r: radius, fill: "none", stroke: "currentColor", strokeWidth: thickness, pathLength: 100, strokeDasharray: "100", strokeDashoffset: 100 - (percent ?? 28), strokeLinecap: "round", transform: `rotate(-90 ${diameter / 2} ${diameter / 2})` }) })] }) }) });
146
+ }
@@ -0,0 +1,59 @@
1
+ import type { HTMLAttributes, ReactNode } from 'react';
2
+ import { type ProgressPartialSegment, type ProgressThreshold } from '../segmented-progress/SegmentedProgress.js';
3
+ export type { ProgressPartialSegment, ProgressThreshold } from '../segmented-progress/SegmentedProgress.js';
4
+ export type BadgeVariant = 'neutral' | 'accent' | 'success' | 'warning' | 'danger' | 'info';
5
+ export interface BadgeProps extends HTMLAttributes<HTMLSpanElement> {
6
+ children: ReactNode;
7
+ seed?: string | number;
8
+ variant?: BadgeVariant;
9
+ size?: 'sm' | 'md' | 'lg';
10
+ startIcon?: ReactNode;
11
+ endIcon?: ReactNode;
12
+ }
13
+ export declare const Badge: import("react").ForwardRefExoticComponent<BadgeProps & import("react").RefAttributes<HTMLSpanElement>>;
14
+ export type SeparatorOrientation = 'horizontal' | 'vertical';
15
+ export interface SeparatorProps extends Omit<HTMLAttributes<HTMLDivElement>, 'children'> {
16
+ weight?: number;
17
+ decorative?: boolean;
18
+ orientation?: SeparatorOrientation;
19
+ seed?: string | number;
20
+ }
21
+ export declare const Separator: import("react").ForwardRefExoticComponent<SeparatorProps & import("react").RefAttributes<HTMLDivElement>>;
22
+ export interface SkeletonProps extends Omit<HTMLAttributes<HTMLDivElement>, 'children'> {
23
+ seed?: string | number;
24
+ radius?: number;
25
+ }
26
+ export declare const Skeleton: import("react").ForwardRefExoticComponent<SkeletonProps & import("react").RefAttributes<HTMLDivElement>>;
27
+ export interface ProgressRenderState {
28
+ value: number | null;
29
+ max: number;
30
+ percent: number | null;
31
+ }
32
+ export type ProgressContentPosition = 'center' | 'top' | 'bottom' | 'start' | 'end';
33
+ export interface ProgressProps extends Omit<HTMLAttributes<HTMLDivElement>, 'children'> {
34
+ value: number | null;
35
+ max?: number;
36
+ label?: ReactNode;
37
+ seed?: string | number;
38
+ size?: 'sm' | 'md' | 'lg';
39
+ shape?: 'linear' | 'circular' | 'segmented';
40
+ /** Circular diameter in CSS pixels, clamped to 32-512. */
41
+ diameter?: number;
42
+ /** Circular stroke width, clamped to 1-diameter/8. */
43
+ thickness?: number;
44
+ /** Segmented cell count, clamped to 1-64. */
45
+ segmentCount?: number;
46
+ /** Segmented gap in CSS pixels, clamped to 0-24. */
47
+ segmentGap?: number;
48
+ /** How the active partial cell is represented. */
49
+ partialSegment?: ProgressPartialSegment;
50
+ /** Pigment ranges expressed in the same value units as max. */
51
+ thresholds?: readonly ProgressThreshold[];
52
+ /** Per-cell pigment overrides by zero-based segment index. */
53
+ segmentColors?: readonly string[];
54
+ /** Defaults to center for circular, end otherwise. Center maps to end for non-circular shapes. */
55
+ contentPosition?: ProgressContentPosition;
56
+ /** Non-interactive content; render state contains normalized values. */
57
+ children?: ReactNode | ((state: ProgressRenderState) => ReactNode);
58
+ }
59
+ export declare const Progress: import("react").ForwardRefExoticComponent<ProgressProps & import("react").RefAttributes<HTMLDivElement>>;
@@ -0,0 +1,75 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { forwardRef, useId } from 'react';
3
+ import { PencilLine } from '../PencilLine.js';
4
+ import { PencilSurface } from '../PencilSurface.js';
5
+ import { PencilText } from '../PencilText.js';
6
+ import { SegmentedProgress, } from '../segmented-progress/SegmentedProgress.js';
7
+ import { ProgressRing } from './ProgressRing.js';
8
+ const badgeTokens = {
9
+ neutral: { foreground: 'ink-muted', pigment: 'surface-muted' },
10
+ accent: { foreground: 'accent-strong', pigment: 'accent-soft' },
11
+ success: { foreground: 'success-foreground', pigment: 'success-pigment' },
12
+ warning: { foreground: 'warning-foreground', pigment: 'warning-pigment' },
13
+ danger: { foreground: 'danger-foreground', pigment: 'danger-pigment' },
14
+ info: { foreground: 'info-foreground', pigment: 'info-pigment' },
15
+ };
16
+ export const Badge = forwardRef(function Badge({ children, className, seed, style, variant = 'neutral', size = 'md', startIcon, endIcon, ...props }, ref) {
17
+ const generatedId = useId();
18
+ const tokens = badgeTokens[variant];
19
+ const resolvedStyle = {
20
+ ...style,
21
+ color: `var(--inkra-${tokens.foreground})`,
22
+ '--inkra-coral-soft': `var(--inkra-${tokens.pigment})`,
23
+ '--inkra-border-strong': `var(--inkra-${tokens.foreground})`,
24
+ };
25
+ return (_jsxs(PencilSurface, { ...props, as: "span", className: ['inkra-badge', className].filter(Boolean).join(' '), "data-variant": variant, "data-size": size, radius: 6, ref: ref, seed: seed ?? `inkra-badge-${generatedId}`, style: resolvedStyle, variant: "badge", children: [startIcon && _jsx("span", { className: "inkra-badge__icon", "aria-hidden": "true", children: startIcon }), typeof children === 'string' ? (_jsx(PencilText, { seed: `${seed ?? `inkra-badge-${generatedId}`}-label`, children: children })) : children, endIcon && _jsx("span", { className: "inkra-badge__icon", "aria-hidden": "true", children: endIcon })] }));
26
+ });
27
+ export const Separator = forwardRef(function Separator({ className, decorative = false, orientation = 'horizontal', weight = 0.9, seed, ...props }, ref) {
28
+ const semanticProps = decorative
29
+ ? { 'aria-hidden': true }
30
+ : { 'aria-orientation': orientation, role: 'separator' };
31
+ return (_jsx("div", { ...props, ...semanticProps, className: ['inkra-separator', className].filter(Boolean).join(' '), "data-orientation": orientation, ref: ref, children: _jsx(PencilLine, { className: "inkra-separator__line", orientation: orientation, seed: seed ?? `inkra-separator-${orientation}`, weight: Number.isFinite(weight) ? Math.max(0.3, Math.min(2, weight)) : 0.9 }) }));
32
+ });
33
+ export const Skeleton = forwardRef(function Skeleton({ className, seed = 'inkra-skeleton', radius, ...props }, ref) {
34
+ return (_jsx(PencilSurface, { ...props, "aria-hidden": "true", as: "div", className: ['inkra-skeleton', className].filter(Boolean).join(' '), ref: ref, seed: seed, radius: radius, variant: "quiet" }));
35
+ });
36
+ function normalizeMax(max) {
37
+ return typeof max === 'number' && Number.isFinite(max) && max > 0 ? max : 100;
38
+ }
39
+ function normalizeValue(value, max) {
40
+ if (value === null)
41
+ return null;
42
+ if (!Number.isFinite(value))
43
+ return 0;
44
+ return Math.min(max, Math.max(0, value));
45
+ }
46
+ export const Progress = forwardRef(function Progress({ 'aria-label': ariaLabel, 'aria-labelledby': ariaLabelledBy, className, label, max, seed, style, value, size = 'md', shape = 'linear', diameter, thickness, segmentCount, segmentGap, partialSegment = 'fractional', thresholds, segmentColors, contentPosition, children, ...props }, ref) {
47
+ const generatedId = useId();
48
+ const labelId = `inkra-progress-${generatedId}-label`;
49
+ const resolvedMax = normalizeMax(max);
50
+ const resolvedValue = normalizeValue(value, resolvedMax);
51
+ const percent = resolvedValue === null ? null : resolvedValue / resolvedMax * 100;
52
+ const resolvedLabelledBy = ariaLabel == null && ariaLabelledBy == null && label != null
53
+ ? labelId
54
+ : ariaLabelledBy;
55
+ const resolvedSeed = seed ?? `inkra-progress-${generatedId}`;
56
+ const resolvedDiameter = typeof diameter === 'number' && Number.isFinite(diameter)
57
+ ? Math.max(32, Math.min(512, diameter)) : { sm: 64, md: 96, lg: 128 }[size];
58
+ const resolvedThickness = Math.min(resolvedDiameter / 8, Math.max(1, typeof thickness === 'number' && Number.isFinite(thickness) ? thickness : { sm: 4, md: 6, lg: 8 }[size]));
59
+ const resolvedSegmentCount = typeof segmentCount === 'number' && Number.isFinite(segmentCount)
60
+ ? Math.max(1, Math.min(64, Math.round(segmentCount))) : 10;
61
+ const resolvedSegmentGap = typeof segmentGap === 'number' && Number.isFinite(segmentGap)
62
+ ? Math.max(0, Math.min(24, segmentGap)) : { sm: 2, md: 3, lg: 4 }[size];
63
+ const position = contentPosition ?? (shape === 'circular' ? 'center' : 'end');
64
+ const content = typeof children === 'function' ? children({ value: resolvedValue, max: resolvedMax, percent }) : children;
65
+ const resolvedStyle = {
66
+ ...style,
67
+ '--inkra-progress-value': `${percent ?? 36}%`,
68
+ ...(shape === 'circular' ? {
69
+ '--inkra-progress-angle': `${(percent ?? 28) * 3.6}deg`,
70
+ '--inkra-progress-diameter': `${resolvedDiameter}px`,
71
+ '--inkra-progress-content-inset': `${(resolvedThickness * 2 + 8) / resolvedDiameter * 100}%`,
72
+ } : {}),
73
+ };
74
+ return (_jsxs("div", { ...props, "aria-label": ariaLabel, "aria-labelledby": resolvedLabelledBy, "aria-valuemax": resolvedMax, "aria-valuemin": 0, "aria-valuenow": resolvedValue ?? undefined, className: ['inkra-progress', className].filter(Boolean).join(' '), "data-state": resolvedValue === null ? 'indeterminate' : 'determinate', "data-value": resolvedValue ?? undefined, "data-size": size, "data-shape": shape, ref: ref, role: "progressbar", style: resolvedStyle, children: [label == null ? null : (typeof label === 'string' ? (_jsx(PencilText, { as: "span", className: "inkra-progress__label", id: labelId, seed: `${resolvedSeed}-label`, children: label })) : _jsx("span", { className: "inkra-progress__label", id: labelId, children: label })), _jsxs("div", { className: "inkra-progress__body", "data-content-position": content == null ? undefined : shape !== 'circular' && position === 'center' ? 'end' : position, children: [shape === 'circular' ? (_jsx(ProgressRing, { diameter: resolvedDiameter, thickness: resolvedThickness, percent: percent, seed: `${resolvedSeed}-ring` })) : shape === 'segmented' ? (_jsx(SegmentedProgress, { count: resolvedSegmentCount, gap: resolvedSegmentGap, max: resolvedMax, partialSegment: partialSegment, percent: percent, seed: `${resolvedSeed}-segments`, segmentColors: segmentColors, thresholds: thresholds })) : (_jsxs("span", { "aria-hidden": "true", className: "inkra-progress__track", children: [_jsx(PencilSurface, { as: "span", className: "inkra-progress__outline", radius: 6, seed: `${resolvedSeed}-outline`, variant: "outline" }), _jsx("span", { className: "inkra-progress__fill-clip", children: _jsx(PencilSurface, { as: "span", className: "inkra-progress__fill", radius: 6, seed: `${resolvedSeed}-fill`, variant: "selection" }) })] })), content != null && _jsx("div", { className: "inkra-progress__content", children: typeof content === 'string' || typeof content === 'number' ? _jsx(PencilText, { children: String(content) }) : content })] })] }));
75
+ });
@@ -0,0 +1,41 @@
1
+ import type { HTMLAttributes, ReactNode } from 'react';
2
+ import type { DockablePanelPosition, DockablePanelSnapEdge } from './model.js';
3
+ export type { DockablePanelBounds, DockablePanelPlacement, DockablePanelPosition, DockablePanelSize, DockablePanelSnapEdge, } from './model.js';
4
+ export type DockablePanelPositionReason = 'drag' | 'keyboard' | 'reset' | 'viewport';
5
+ export interface DockablePanelPositionChangeDetails {
6
+ reason: DockablePanelPositionReason;
7
+ snappedEdges: readonly DockablePanelSnapEdge[];
8
+ }
9
+ export interface DockablePanelLabels {
10
+ move?: string;
11
+ collapse?: string;
12
+ expand?: string;
13
+ reset?: string;
14
+ keyboardInstructions?: string;
15
+ }
16
+ export interface DockablePanelWorkspaceProps extends HTMLAttributes<HTMLDivElement> {
17
+ activeId?: string | null;
18
+ defaultActiveId?: string | null;
19
+ onActiveChange?: (id: string) => void;
20
+ baseZIndex?: number;
21
+ boundaryPadding?: number;
22
+ snapThreshold?: number;
23
+ titleBarVisibility?: number;
24
+ }
25
+ export declare const DockablePanelWorkspace: import("react").ForwardRefExoticComponent<DockablePanelWorkspaceProps & import("react").RefAttributes<HTMLDivElement>>;
26
+ export interface DockablePanelProps extends Omit<HTMLAttributes<HTMLElement>, 'onChange' | 'title'> {
27
+ id: string;
28
+ title: ReactNode;
29
+ position?: DockablePanelPosition;
30
+ defaultPosition?: DockablePanelPosition;
31
+ onPositionChange?: (position: DockablePanelPosition, details: DockablePanelPositionChangeDetails) => void;
32
+ collapsed?: boolean;
33
+ defaultCollapsed?: boolean;
34
+ onCollapsedChange?: (collapsed: boolean) => void;
35
+ collapsible?: boolean;
36
+ movable?: boolean;
37
+ keyboardStep?: number;
38
+ headerActions?: ReactNode;
39
+ labels?: DockablePanelLabels;
40
+ }
41
+ export declare const DockablePanel: import("react").ForwardRefExoticComponent<DockablePanelProps & import("react").RefAttributes<HTMLElement>>;