@adecore/ui 0.23.0 → 0.24.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 (129) hide show
  1. package/dist/ButtonGroup.d.ts +1 -1
  2. package/dist/ButtonGroup.js +1 -1
  3. package/dist/Checkbox.js +1 -1
  4. package/dist/ChoiceCards.js +2 -2
  5. package/dist/CloseButton.js +1 -1
  6. package/dist/ColorSwatch.d.ts +1 -1
  7. package/dist/ColorSwatch.js +1 -1
  8. package/dist/Field.d.ts +1 -1
  9. package/dist/Field.js +4 -3
  10. package/dist/IconButton.d.ts +1 -1
  11. package/dist/IconButton.js +1 -1
  12. package/dist/ListRow.d.ts +1 -1
  13. package/dist/ListRow.js +1 -1
  14. package/dist/MiddleTruncate.d.ts +8 -0
  15. package/dist/MiddleTruncate.js +59 -0
  16. package/dist/PanelHeader.d.ts +1 -1
  17. package/dist/PanelHeader.js +1 -1
  18. package/dist/SectionLabel.d.ts +1 -1
  19. package/dist/SectionLabel.js +1 -1
  20. package/dist/Select.js +1 -1
  21. package/dist/SelectSearch.js +1 -1
  22. package/dist/Slider.js +1 -1
  23. package/dist/Surface.d.ts +1 -1
  24. package/dist/Surface.js +1 -1
  25. package/dist/Switch.js +1 -1
  26. package/dist/Toasts.d.ts +1 -1
  27. package/dist/Toasts.js +4 -5
  28. package/dist/Tooltip.d.ts +1 -1
  29. package/dist/Tooltip.js +2 -2
  30. package/dist/clipboard.d.ts +1 -1
  31. package/dist/clipboard.js +12 -2
  32. package/dist/dialog/parts.d.ts +3 -3
  33. package/dist/dialog/parts.js +2 -2
  34. package/dist/file-tree/helpers.d.ts +1 -0
  35. package/dist/file-tree/helpers.js +9 -0
  36. package/dist/file-tree/parts.d.ts +1 -1
  37. package/dist/file-tree/parts.js +1 -1
  38. package/dist/file-tree/use-slots.d.ts +8 -0
  39. package/dist/file-tree/use-slots.js +64 -22
  40. package/dist/format/datetime.d.ts +1 -0
  41. package/dist/format/datetime.js +15 -0
  42. package/dist/format/index.d.ts +1 -1
  43. package/dist/format/index.js +1 -1
  44. package/dist/index.d.ts +6 -3
  45. package/dist/index.js +5 -1
  46. package/dist/key-value-list/parts.d.ts +1 -1
  47. package/dist/key-value-list/parts.js +1 -1
  48. package/dist/locales/en.d.ts +83 -0
  49. package/dist/locales/en.js +82 -0
  50. package/dist/locales/nl.d.ts +83 -0
  51. package/dist/locales/nl.js +82 -0
  52. package/dist/locales.js +3 -2
  53. package/dist/menu/parts.d.ts +7 -7
  54. package/dist/menu/parts.js +4 -4
  55. package/dist/middle-truncate.d.ts +7 -0
  56. package/dist/middle-truncate.js +34 -0
  57. package/dist/popover/parts.d.ts +7 -7
  58. package/dist/popover/parts.js +2 -2
  59. package/dist/prefetch.js +6 -1
  60. package/dist/settings/ConfirmDialog.d.ts +4 -1
  61. package/dist/settings/ConfirmDialog.js +2 -2
  62. package/dist/settings/SettingsDialog.js +1 -1
  63. package/dist/tabs/parts.d.ts +8 -4
  64. package/dist/tabs/parts.js +84 -18
  65. package/dist/testing/dedupe.js +74 -23
  66. package/dist/theme.css +24 -8
  67. package/dist/tree/parts.d.ts +1 -1
  68. package/dist/tree/parts.js +1 -1
  69. package/dist/workspace/DropPreview.d.ts +8 -0
  70. package/dist/workspace/DropPreview.js +14 -0
  71. package/dist/workspace/SplitView.d.ts +1 -1
  72. package/dist/workspace/SplitView.js +59 -18
  73. package/dist/workspace/TabStrip.d.ts +1 -1
  74. package/dist/workspace/TabStrip.js +1 -1
  75. package/dist/workspace/Workspace.d.ts +2 -2
  76. package/dist/workspace/Workspace.js +4 -2
  77. package/dist/workspace/preview.d.ts +4 -8
  78. package/dist/workspace/preview.js +17 -2
  79. package/package.json +2 -2
  80. package/src/ButtonGroup.tsx +1 -1
  81. package/src/Checkbox.tsx +1 -1
  82. package/src/ChoiceCards.tsx +2 -2
  83. package/src/CloseButton.tsx +1 -1
  84. package/src/ColorSwatch.tsx +1 -1
  85. package/src/ErrorBoundary.tsx +4 -4
  86. package/src/Field.tsx +4 -5
  87. package/src/IconButton.tsx +1 -1
  88. package/src/ListRow.tsx +1 -1
  89. package/src/MiddleTruncate.tsx +84 -0
  90. package/src/PanelHeader.tsx +1 -1
  91. package/src/SectionLabel.tsx +1 -1
  92. package/src/Select.tsx +1 -1
  93. package/src/SelectSearch.tsx +1 -1
  94. package/src/Slider.tsx +1 -1
  95. package/src/Surface.tsx +1 -1
  96. package/src/Switch.tsx +1 -1
  97. package/src/Toasts.tsx +5 -6
  98. package/src/Tooltip.tsx +5 -5
  99. package/src/clipboard.ts +11 -2
  100. package/src/dialog/parts.tsx +2 -2
  101. package/src/file-tree/helpers.ts +10 -0
  102. package/src/file-tree/parts.tsx +1 -1
  103. package/src/file-tree/use-slots.ts +68 -23
  104. package/src/format/datetime.ts +17 -0
  105. package/src/format/index.ts +1 -0
  106. package/src/index.ts +6 -3
  107. package/src/key-value-list/parts.tsx +1 -1
  108. package/src/locales/en.ts +82 -0
  109. package/src/locales/nl.ts +82 -0
  110. package/src/locales.ts +3 -2
  111. package/src/menu/parts.tsx +4 -4
  112. package/src/middle-truncate.ts +41 -0
  113. package/src/popover/parts.tsx +2 -2
  114. package/src/prefetch.ts +6 -1
  115. package/src/settings/ConfirmDialog.tsx +7 -1
  116. package/src/settings/SettingsDialog.tsx +1 -1
  117. package/src/tabs/parts.tsx +156 -54
  118. package/src/testing/dedupe.ts +87 -24
  119. package/src/theme.css +24 -8
  120. package/src/tree/parts.tsx +1 -1
  121. package/src/workspace/DropPreview.tsx +26 -0
  122. package/src/workspace/SplitView.tsx +58 -22
  123. package/src/workspace/TabStrip.tsx +1 -1
  124. package/src/workspace/Workspace.tsx +7 -3
  125. package/src/workspace/preview.ts +22 -9
  126. package/dist/locales/en.json +0 -82
  127. package/dist/locales/nl.json +0 -82
  128. package/src/locales/en.json +0 -82
  129. package/src/locales/nl.json +0 -82
@@ -1,3 +1,4 @@
1
+ import { formatAgo } from './duration.js';
1
2
  import { dateFormatter, wordFormatter } from './locale.js';
2
3
  /* The parts that are a word rather than a number, and so come from the language and not the region. */
3
4
  const WORD_PARTS = new Set(['month', 'weekday', 'dayPeriod', 'era']);
@@ -49,3 +50,17 @@ export const isSameDay = (a, b) => {
49
50
  return left.getFullYear() === right.getFullYear() && left.getMonth() === right.getMonth() && left.getDate() === right.getDate();
50
51
  };
51
52
  export const formatMoment = (at, now = Date.now()) => (isSameDay(at, now) ? formatClock(at) : formatDayClock(at));
53
+ const WEEK = 7 * 24 * 60 * 60 * 1000;
54
+ /*
55
+ * How old a row is, for its right edge: `3d ago` for the first week, then the day, with the year once
56
+ * it is not this one. An `at` ahead of `now`, from a clock that runs ahead, reads as now.
57
+ */
58
+ export const formatAge = (at, now = Date.now()) => {
59
+ const date = toDate(at);
60
+ const today = toDate(now);
61
+ const past = today.getTime() - date.getTime();
62
+ if (past < WEEK) {
63
+ return formatAgo(past);
64
+ }
65
+ return date.getFullYear() === today.getFullYear() ? formatDay(date) : formatDayWithYear(date);
66
+ };
@@ -1,4 +1,4 @@
1
- export { formatClock, formatDateTime, formatDay, formatDayClock, formatDayWithYear, formatHour, formatMoment, formatNumericDate, formatWeekdayClock, formatWeekdayDay, isSameDay } from './datetime.ts';
1
+ export { formatAge, formatClock, formatDateTime, formatDay, formatDayClock, formatDayWithYear, formatHour, formatMoment, formatNumericDate, formatWeekdayClock, formatWeekdayDay, isSameDay } from './datetime.ts';
2
2
  export { formatAgo, formatClockDuration, formatCountdown, formatDuration, formatElapsedShort } from './duration.ts';
3
3
  export { FALLBACK_LOCALE, formatLocale, labelCollator, setFormatSource, systemLocale, useFormatLocale, type FormatSource } from './locale.ts';
4
4
  export { formatBytes, formatDecimal, formatFixed, formatMoney, formatNumber, formatNumeral, formatPercent, formatRounded, formatTokens, formatUsdSignificant } from './number.ts';
@@ -1,5 +1,5 @@
1
1
  /* Every number, date, time and duration a person reads, written the way the language and the region they set ask for. */
2
- export { formatClock, formatDateTime, formatDay, formatDayClock, formatDayWithYear, formatHour, formatMoment, formatNumericDate, formatWeekdayClock, formatWeekdayDay, isSameDay } from './datetime.js';
2
+ export { formatAge, formatClock, formatDateTime, formatDay, formatDayClock, formatDayWithYear, formatHour, formatMoment, formatNumericDate, formatWeekdayClock, formatWeekdayDay, isSameDay } from './datetime.js';
3
3
  export { formatAgo, formatClockDuration, formatCountdown, formatDuration, formatElapsedShort } from './duration.js';
4
4
  export { FALLBACK_LOCALE, formatLocale, labelCollator, setFormatSource, systemLocale, useFormatLocale } from './locale.js';
5
5
  export { formatBytes, formatDecimal, formatFixed, formatMoney, formatNumber, formatNumeral, formatPercent, formatRounded, formatTokens, formatUsdSignificant } from './number.js';
package/dist/index.d.ts CHANGED
@@ -11,7 +11,7 @@ export type { DialogDescriptionProps, DialogFooterProps, DialogPopupProps, Dialo
11
11
  export type { MenuCheckProps, MenuHintProps, MenuLabelProps, MenuPopupProps, MenuRowActionProps, MenuRowProps, MenuRowSubmenuTriggerProps } from './menu/parts.tsx';
12
12
  export type { KeyValueListItemProps, KeyValueListNameProps, KeyValueListRootProps, KeyValueListValueProps } from './key-value-list/parts.tsx';
13
13
  export type { PopoverPopupProps, PopupVariant, PreviewCardPopupProps } from './popover/parts.tsx';
14
- export type { TabsCountProps, TabsListProps, TabsRootProps, TabsTabProps, TabsValue } from './tabs/parts.tsx';
14
+ export type { TabsCountProps, TabsListProps, TabsRootProps, TabsTabProps, TabsValue, TabsVariant } from './tabs/parts.tsx';
15
15
  export { AccentSwatches, type AccentSwatchesProps } from './AccentSwatches.tsx';
16
16
  export { Banner, type BannerProps, type BannerTone } from './Banner.tsx';
17
17
  export { Button, type ButtonProps, type ButtonSize, type ButtonVariant } from './Button.tsx';
@@ -34,11 +34,12 @@ export { Input, TextArea, type InputProps, type TextAreaProps } from './Input.ts
34
34
  export { Kbd, KeyCap, Keys, type KbdProps, type KeyCapProps, type KeysProps } from './Kbd.tsx';
35
35
  export { ListRow, type ListRowProps } from './ListRow.tsx';
36
36
  export { Meter, type MeterProps } from './Meter.tsx';
37
+ export { MiddleTruncate, type MiddleTruncateProps } from './MiddleTruncate.tsx';
37
38
  export { PanelEmpty, type PanelEmptyProps } from './PanelEmpty.tsx';
38
39
  export { PanelHeader, type PanelHeaderProps } from './PanelHeader.tsx';
39
40
  export { Pill, type PillProps } from './Pill.tsx';
40
41
  export { PromptDialog, type PromptDialogProps } from './PromptDialog.tsx';
41
- export { ProjectSwitcher, type ProjectSwitcherItem, type ProjectSwitcherProps } from './ProjectSwitcher.tsx';
42
+ export { ProjectSwitcher, ProjectSwitcherGroups, type ProjectSwitcherItem, type ProjectSwitcherProps } from './ProjectSwitcher.tsx';
42
43
  export { SectionLabel, type SectionLabelProps } from './SectionLabel.tsx';
43
44
  export { SegmentBar, type SegmentBarPart, type SegmentBarProps } from './SegmentBar.tsx';
44
45
  export { Segmented, type SegmentedOption, type SegmentedProps } from './Segmented.tsx';
@@ -88,5 +89,7 @@ export { Workspace, type WorkspaceProps } from './workspace/Workspace.tsx';
88
89
  export type { WorkspaceLayout } from './workspace/context.ts';
89
90
  export { DocumentTab, TabStrip, type DocumentTabProps, type TabStripProps, type TabStripItem } from './workspace/TabStrip.tsx';
90
91
  export { SplitView, type SplitViewProps, type SplitViewInfo, type SplitViewBounds, type SplitDropTarget, type SplitDrag } from './workspace/SplitView.tsx';
92
+ export { DropPreview, type DropPreviewProps } from './workspace/DropPreview.tsx';
93
+ export { dropPreviewPath, rectDropPreview, sameDropPreview, tabDropPreview, type DropPreviewShape, type TabDrop } from './workspace/preview.ts';
91
94
  export { createSplitLayout, normalizeSplitLayout, updateSplitLayout, splitPanes, type SplitAxis, type SplitSide, type SplitPane, type SplitBranch, type SplitNode, type SplitLayout, type SplitCommand } from './workspace/model.ts';
92
- export type { SplitRect, SplitEdges, SplitMinimum } from './workspace/geometry.ts';
95
+ export { tabGapAt, type SplitRect, type SplitEdges, type SplitMinimum } from './workspace/geometry.ts';
package/dist/index.js CHANGED
@@ -33,11 +33,12 @@ export { Input, TextArea } from './Input.js';
33
33
  export { Kbd, KeyCap, Keys } from './Kbd.js';
34
34
  export { ListRow } from './ListRow.js';
35
35
  export { Meter } from './Meter.js';
36
+ export { MiddleTruncate } from './MiddleTruncate.js';
36
37
  export { PanelEmpty } from './PanelEmpty.js';
37
38
  export { PanelHeader } from './PanelHeader.js';
38
39
  export { Pill } from './Pill.js';
39
40
  export { PromptDialog } from './PromptDialog.js';
40
- export { ProjectSwitcher } from './ProjectSwitcher.js';
41
+ export { ProjectSwitcher, ProjectSwitcherGroups } from './ProjectSwitcher.js';
41
42
  export { SectionLabel } from './SectionLabel.js';
42
43
  export { SegmentBar } from './SegmentBar.js';
43
44
  export { Segmented } from './Segmented.js';
@@ -81,4 +82,7 @@ export { useFileTree } from './file-tree/use-file-tree.js';
81
82
  export { Workspace } from './workspace/Workspace.js';
82
83
  export { DocumentTab, TabStrip } from './workspace/TabStrip.js';
83
84
  export { SplitView } from './workspace/SplitView.js';
85
+ export { DropPreview } from './workspace/DropPreview.js';
86
+ export { dropPreviewPath, rectDropPreview, sameDropPreview, tabDropPreview } from './workspace/preview.js';
84
87
  export { createSplitLayout, normalizeSplitLayout, updateSplitLayout, splitPanes } from './workspace/model.js';
88
+ export { tabGapAt } from './workspace/geometry.js';
@@ -1,4 +1,4 @@
1
- import { useRender } from '@base-ui-components/react/use-render';
1
+ import { useRender } from '@base-ui/react/use-render';
2
2
  export type KeyValueListRootProps = useRender.ComponentProps<'dl'> & {
3
3
  divided?: boolean;
4
4
  };
@@ -1,5 +1,5 @@
1
1
  import clsx from 'clsx';
2
- import { useRender } from '@base-ui-components/react/use-render';
2
+ import { useRender } from '@base-ui/react/use-render';
3
3
  /*
4
4
  * The names take the width of the widest one, up to two fifths of the list, and a longer name wraps
5
5
  * there. Every item is a subgrid of the list, so the names line up across rows and a hairline runs
@@ -0,0 +1,83 @@
1
+ declare const _default: {
2
+ action: {
3
+ cancel: string;
4
+ copy: string;
5
+ copyError: string;
6
+ dismiss: string;
7
+ reload: string;
8
+ retry: string;
9
+ select: string;
10
+ selectAll: string;
11
+ };
12
+ accent: {
13
+ more: string;
14
+ };
15
+ settings: {
16
+ title: string;
17
+ section: string;
18
+ sections: string;
19
+ close: string;
20
+ failed: string;
21
+ search: {
22
+ placeholder: string;
23
+ clear: string;
24
+ none: string;
25
+ results: string;
26
+ pane: string;
27
+ };
28
+ };
29
+ controls: {
30
+ stepper: {
31
+ smaller: string;
32
+ larger: string;
33
+ smallerFor: string;
34
+ largerFor: string;
35
+ };
36
+ };
37
+ select: {
38
+ search: string;
39
+ noMatch: string;
40
+ };
41
+ iconPicker: {
42
+ label: string;
43
+ none: string;
44
+ search: string;
45
+ clear: string;
46
+ noMatch: string;
47
+ };
48
+ zoom: {
49
+ out: string;
50
+ in: string;
51
+ presets: string;
52
+ fit: string;
53
+ fitEverything: string;
54
+ };
55
+ waveform: {
56
+ position: string;
57
+ };
58
+ projectSwitcher: {
59
+ label: string;
60
+ recent: string;
61
+ actionsFor: string;
62
+ };
63
+ tabs: {
64
+ more: string;
65
+ close: string;
66
+ };
67
+ tree: {
68
+ label: string;
69
+ expand: string;
70
+ collapse: string;
71
+ };
72
+ workspace: {
73
+ tabs: string;
74
+ unsaved: string;
75
+ closeTab: string;
76
+ resize: string;
77
+ pane: string;
78
+ movePane: string;
79
+ maximize: string;
80
+ restore: string;
81
+ };
82
+ };
83
+ export default _default;
@@ -0,0 +1,82 @@
1
+ export default {
2
+ action: {
3
+ cancel: 'Cancel',
4
+ copy: 'Copy',
5
+ copyError: 'Copy error',
6
+ dismiss: 'Dismiss',
7
+ reload: 'Reload',
8
+ retry: 'Try again',
9
+ select: 'Select',
10
+ selectAll: 'Select all'
11
+ },
12
+ accent: {
13
+ more: 'More colors'
14
+ },
15
+ settings: {
16
+ title: 'Settings',
17
+ section: 'Settings section',
18
+ sections: 'Settings sections',
19
+ close: 'Close settings',
20
+ failed: 'This settings page failed to render',
21
+ search: {
22
+ placeholder: 'Search settings',
23
+ clear: 'Clear search',
24
+ none: 'Nothing matches "{{query}}".',
25
+ results: 'Search results',
26
+ pane: 'Section'
27
+ }
28
+ },
29
+ controls: {
30
+ stepper: {
31
+ smaller: 'Smaller',
32
+ larger: 'Larger',
33
+ smallerFor: '{{label}}: smaller',
34
+ largerFor: '{{label}}: larger'
35
+ }
36
+ },
37
+ select: {
38
+ search: 'Search',
39
+ noMatch: 'No option matches “{{query}}”'
40
+ },
41
+ iconPicker: {
42
+ label: 'Icon',
43
+ none: 'No icon',
44
+ search: 'Find an icon',
45
+ clear: 'Clear search',
46
+ noMatch: 'No icon matches “{{query}}”'
47
+ },
48
+ zoom: {
49
+ out: 'Zoom out',
50
+ in: 'Zoom in',
51
+ presets: 'Zoom presets',
52
+ fit: 'Zoom to fit',
53
+ fitEverything: 'Fit everything'
54
+ },
55
+ waveform: {
56
+ position: '{{time}} of {{duration}}'
57
+ },
58
+ projectSwitcher: {
59
+ label: 'Projects',
60
+ recent: 'Recent projects',
61
+ actionsFor: 'Actions for {{name}}'
62
+ },
63
+ tabs: {
64
+ more: 'More',
65
+ close: 'Close tab'
66
+ },
67
+ tree: {
68
+ label: 'Files',
69
+ expand: 'Expand',
70
+ collapse: 'Collapse'
71
+ },
72
+ workspace: {
73
+ tabs: 'Open views',
74
+ unsaved: 'Unsaved changes',
75
+ closeTab: 'Close {{name}}',
76
+ resize: 'Resize panels',
77
+ pane: 'Panel',
78
+ movePane: 'Move panel',
79
+ maximize: 'Maximize panel',
80
+ restore: 'Restore panels'
81
+ }
82
+ };
@@ -0,0 +1,83 @@
1
+ declare const _default: {
2
+ action: {
3
+ cancel: string;
4
+ copy: string;
5
+ copyError: string;
6
+ dismiss: string;
7
+ reload: string;
8
+ retry: string;
9
+ select: string;
10
+ selectAll: string;
11
+ };
12
+ accent: {
13
+ more: string;
14
+ };
15
+ settings: {
16
+ title: string;
17
+ section: string;
18
+ sections: string;
19
+ close: string;
20
+ failed: string;
21
+ search: {
22
+ placeholder: string;
23
+ clear: string;
24
+ none: string;
25
+ results: string;
26
+ pane: string;
27
+ };
28
+ };
29
+ controls: {
30
+ stepper: {
31
+ smaller: string;
32
+ larger: string;
33
+ smallerFor: string;
34
+ largerFor: string;
35
+ };
36
+ };
37
+ select: {
38
+ search: string;
39
+ noMatch: string;
40
+ };
41
+ iconPicker: {
42
+ label: string;
43
+ none: string;
44
+ search: string;
45
+ clear: string;
46
+ noMatch: string;
47
+ };
48
+ zoom: {
49
+ out: string;
50
+ in: string;
51
+ presets: string;
52
+ fit: string;
53
+ fitEverything: string;
54
+ };
55
+ waveform: {
56
+ position: string;
57
+ };
58
+ projectSwitcher: {
59
+ label: string;
60
+ recent: string;
61
+ actionsFor: string;
62
+ };
63
+ tabs: {
64
+ more: string;
65
+ close: string;
66
+ };
67
+ tree: {
68
+ label: string;
69
+ expand: string;
70
+ collapse: string;
71
+ };
72
+ workspace: {
73
+ tabs: string;
74
+ unsaved: string;
75
+ closeTab: string;
76
+ resize: string;
77
+ pane: string;
78
+ movePane: string;
79
+ maximize: string;
80
+ restore: string;
81
+ };
82
+ };
83
+ export default _default;
@@ -0,0 +1,82 @@
1
+ export default {
2
+ action: {
3
+ cancel: 'Annuleren',
4
+ copy: 'Kopiëren',
5
+ copyError: 'Fout kopiëren',
6
+ dismiss: 'Sluiten',
7
+ reload: 'Herladen',
8
+ retry: 'Opnieuw proberen',
9
+ select: 'Selecteren',
10
+ selectAll: 'Alles selecteren'
11
+ },
12
+ accent: {
13
+ more: 'Meer kleuren'
14
+ },
15
+ settings: {
16
+ title: 'Instellingen',
17
+ section: 'Onderdeel van de instellingen',
18
+ sections: 'Onderdelen van de instellingen',
19
+ close: 'Instellingen sluiten',
20
+ failed: 'Deze instellingenpagina kon niet worden getekend',
21
+ search: {
22
+ placeholder: 'Instellingen zoeken',
23
+ clear: 'Zoekopdracht wissen',
24
+ none: 'Niets komt overeen met "{{query}}".',
25
+ results: 'Zoekresultaten',
26
+ pane: 'Onderdeel'
27
+ }
28
+ },
29
+ controls: {
30
+ stepper: {
31
+ smaller: 'Kleiner',
32
+ larger: 'Groter',
33
+ smallerFor: '{{label}}: kleiner',
34
+ largerFor: '{{label}}: groter'
35
+ }
36
+ },
37
+ select: {
38
+ search: 'Zoeken',
39
+ noMatch: 'Geen optie past bij “{{query}}”'
40
+ },
41
+ iconPicker: {
42
+ label: 'Icoon',
43
+ none: 'Geen icoon',
44
+ search: 'Zoek een icoon',
45
+ clear: 'Zoekopdracht wissen',
46
+ noMatch: 'Geen icoon past bij “{{query}}”'
47
+ },
48
+ zoom: {
49
+ out: 'Uitzoomen',
50
+ in: 'Inzoomen',
51
+ presets: 'Zoomstanden',
52
+ fit: 'Zoomen tot alles past',
53
+ fitEverything: 'Alles laten passen'
54
+ },
55
+ waveform: {
56
+ position: '{{time}} van {{duration}}'
57
+ },
58
+ projectSwitcher: {
59
+ label: 'Projecten',
60
+ recent: 'Recente projecten',
61
+ actionsFor: 'Acties voor {{name}}'
62
+ },
63
+ tabs: {
64
+ more: 'Meer',
65
+ close: 'Tabblad sluiten'
66
+ },
67
+ tree: {
68
+ label: 'Bestanden',
69
+ expand: 'Uitvouwen',
70
+ collapse: 'Invouwen'
71
+ },
72
+ workspace: {
73
+ tabs: 'Open views',
74
+ unsaved: 'Niet-opgeslagen wijzigingen',
75
+ closeTab: 'Sluit {{name}}',
76
+ resize: 'Panelen vergroten of verkleinen',
77
+ pane: 'Paneel',
78
+ movePane: 'Paneel verplaatsen',
79
+ maximize: 'Paneel maximaliseren',
80
+ restore: 'Panelen herstellen'
81
+ }
82
+ };
package/dist/locales.js CHANGED
@@ -1,5 +1,6 @@
1
- import en from './locales/en.json' with { type: 'json' };
2
- import nl from './locales/nl.json' with { type: 'json' };
1
+ /* The words are modules, not JSON: Node needs `with { type: 'json' }` on a JSON import, and a browser refuses it on the JavaScript Vite serves. */
2
+ import en from './locales/en.js';
3
+ import nl from './locales/nl.js';
3
4
  /* The words of this library live in a namespace of their own, which the app adds to its i18next beside its own namespaces. */
4
5
  export const UI_NAMESPACE = 'ui';
5
6
  /*
@@ -1,9 +1,9 @@
1
1
  import { type ComponentProps, type ReactNode, type Ref } from 'react';
2
2
  import { type LucideIcon } from 'lucide-react';
3
- import { ContextMenu as BaseContextMenu } from '@base-ui-components/react/context-menu';
4
- import { Menu as BaseMenu } from '@base-ui-components/react/menu';
5
- import { Separator as BaseSeparator } from '@base-ui-components/react/separator';
6
- import { useRender } from '@base-ui-components/react/use-render';
3
+ import { ContextMenu as BaseContextMenu } from '@base-ui/react/context-menu';
4
+ import { Menu as BaseMenu } from '@base-ui/react/menu';
5
+ import { Separator as BaseSeparator } from '@base-ui/react/separator';
6
+ import { useRender } from '@base-ui/react/use-render';
7
7
  import { type PlacementKey } from '../placement.ts';
8
8
  type PositionerProps = ComponentProps<typeof BaseMenu.Positioner>;
9
9
  type Placement = Pick<PositionerProps, PlacementKey>;
@@ -12,7 +12,7 @@ export declare function MenuRoot(props: ComponentProps<typeof BaseMenu.Root>): i
12
12
  export declare function ContextMenuRoot(props: ComponentProps<typeof BaseContextMenu.Root>): import("react").JSX.Element;
13
13
  export declare function MenuSubmenuRoot(props: ComponentProps<typeof BaseMenu.SubmenuRoot>): import("react").JSX.Element;
14
14
  export declare const MenuTrigger: BaseMenu.Trigger;
15
- export declare const ContextMenuTrigger: import("react").ForwardRefExoticComponent<import("@base-ui-components/react/context-menu").ContextMenuTriggerProps & import("react").RefAttributes<HTMLDivElement>>;
15
+ export declare const ContextMenuTrigger: import("react").ForwardRefExoticComponent<Omit<import("@base-ui/react").ContextMenuTriggerProps, "ref"> & import("react").RefAttributes<HTMLDivElement>>;
16
16
  export type MenuPopupProps = ComponentProps<typeof BaseMenu.Popup> & Placement;
17
17
  export declare function MenuPopup({ className, ...props }: MenuPopupProps): import("react").JSX.Element;
18
18
  type ItemLook = {
@@ -34,7 +34,7 @@ type MenuCheckboxItemProps = ComponentProps<typeof BaseMenu.CheckboxItem> & Item
34
34
  children?: ReactNode;
35
35
  };
36
36
  export declare function MenuCheckboxItem({ unstyled, indicator, className, children, ...props }: MenuCheckboxItemProps): import("react").JSX.Element;
37
- export declare const MenuRadioGroup: import("react").NamedExoticComponent<import("@base-ui-components/react/menu").MenuRadioGroupProps & import("react").RefAttributes<Element>>;
37
+ export declare const MenuRadioGroup: import("react").NamedExoticComponent<Omit<import("@base-ui/react").MenuRadioGroupProps, "ref"> & import("react").RefAttributes<HTMLDivElement>>;
38
38
  type MenuRadioItemProps = ComponentProps<typeof BaseMenu.RadioItem> & ItemLook & Indicator & {
39
39
  children?: ReactNode;
40
40
  };
@@ -56,7 +56,7 @@ export declare function MenuRowAction({ icon, label, iconClassName, className, .
56
56
  export type MenuRowSubmenuTriggerProps = Omit<ComponentProps<typeof BaseMenu.SubmenuTrigger>, 'children' | 'label'> & RowButton;
57
57
  export declare function MenuRowSubmenuTrigger({ icon, label, iconClassName, className, ...props }: MenuRowSubmenuTriggerProps): import("react").JSX.Element;
58
58
  export declare function MenuSeparator({ className, ...props }: ComponentProps<typeof BaseSeparator>): import("react").JSX.Element;
59
- export declare const MenuGroup: import("react").ForwardRefExoticComponent<import("@base-ui-components/react/menu").MenuGroupProps & import("react").RefAttributes<Element>>;
59
+ export declare const MenuGroup: import("react").ForwardRefExoticComponent<Omit<import("@base-ui/react").MenuGroupProps, "ref"> & import("react").RefAttributes<HTMLDivElement>>;
60
60
  type MenuGroupLabelProps = ComponentProps<typeof BaseMenu.GroupLabel> & {
61
61
  unstyled?: boolean;
62
62
  };
@@ -2,10 +2,10 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { createContext, useContext } from 'react';
3
3
  import clsx from 'clsx';
4
4
  import { Check, ChevronRight } from 'lucide-react';
5
- import { ContextMenu as BaseContextMenu } from '@base-ui-components/react/context-menu';
6
- import { Menu as BaseMenu } from '@base-ui-components/react/menu';
7
- import { Separator as BaseSeparator } from '@base-ui-components/react/separator';
8
- import { useRender } from '@base-ui-components/react/use-render';
5
+ import { ContextMenu as BaseContextMenu } from '@base-ui/react/context-menu';
6
+ import { Menu as BaseMenu } from '@base-ui/react/menu';
7
+ import { Separator as BaseSeparator } from '@base-ui/react/separator';
8
+ import { useRender } from '@base-ui/react/use-render';
9
9
  import { withClass } from '../class-name.js';
10
10
  import { Icon } from '../Icon.js';
11
11
  import { Tooltip } from '../Tooltip.js';
@@ -0,0 +1,7 @@
1
+ export interface MiddleCut {
2
+ head: string;
3
+ middle: string;
4
+ tail: string;
5
+ }
6
+ export declare const MIDDLE_ELLIPSIS = "\u2026";
7
+ export declare function fitMiddle(text: string, width: number, measure: (text: string) => number): MiddleCut | null;
@@ -0,0 +1,34 @@
1
+ export const MIDDLE_ELLIPSIS = '…';
2
+ /*
3
+ * The head and tail of `text` that keep the most of it around an ellipsis within `width`, or null
4
+ * when the whole text fits. The tail gets the odd character, since the end of a path or a branch is
5
+ * what tells two of them apart. Code points, never UTF-16 units, so a cut never halves a character.
6
+ */
7
+ export function fitMiddle(text, width, measure) {
8
+ if (measure(text) <= width) {
9
+ return null;
10
+ }
11
+ const characters = Array.from(text);
12
+ const cutAt = (kept) => {
13
+ const headLength = Math.floor(kept / 2);
14
+ const tailStart = characters.length - (kept - headLength);
15
+ return {
16
+ head: characters.slice(0, headLength).join(''),
17
+ middle: characters.slice(headLength, tailStart).join(''),
18
+ tail: characters.slice(tailStart).join('')
19
+ };
20
+ };
21
+ const fits = (cut) => measure(cut.head + MIDDLE_ELLIPSIS + cut.tail) <= width;
22
+ let low = 0;
23
+ let high = characters.length - 1;
24
+ while (low < high) {
25
+ const kept = Math.ceil((low + high) / 2);
26
+ if (fits(cutAt(kept))) {
27
+ low = kept;
28
+ }
29
+ else {
30
+ high = kept - 1;
31
+ }
32
+ }
33
+ return cutAt(low);
34
+ }
@@ -1,6 +1,6 @@
1
1
  import type { ComponentProps } from 'react';
2
- import { Popover as BasePopover } from '@base-ui-components/react/popover';
3
- import { PreviewCard as BasePreviewCard } from '@base-ui-components/react/preview-card';
2
+ import { Popover as BasePopover } from '@base-ui/react/popover';
3
+ import { PreviewCard as BasePreviewCard } from '@base-ui/react/preview-card';
4
4
  import { type PlacementKey } from '../placement.ts';
5
5
  declare const POPUP_VARIANT: {
6
6
  readonly menu: 'menu-popup';
@@ -11,15 +11,15 @@ export type PopupVariant = keyof typeof POPUP_VARIANT;
11
11
  type Placement = Pick<ComponentProps<typeof BasePopover.Positioner>, PlacementKey>;
12
12
  export declare const PopoverRoot: typeof BasePopover.Root;
13
13
  export declare const PopoverTrigger: BasePopover.Trigger;
14
- export declare const PopoverClose: import("react").ForwardRefExoticComponent<import("@base-ui-components/react/popover").PopoverCloseProps & import("react").RefAttributes<HTMLButtonElement>>;
15
- export declare const PopoverTitle: import("react").ForwardRefExoticComponent<import("@base-ui-components/react/popover").PopoverTitleProps & import("react").RefAttributes<HTMLHeadingElement>>;
16
- export declare const PopoverDescription: import("react").ForwardRefExoticComponent<import("@base-ui-components/react/popover").PopoverDescriptionProps & import("react").RefAttributes<HTMLParagraphElement>>;
14
+ export declare const PopoverClose: import("react").ForwardRefExoticComponent<Omit<import("@base-ui/react").PopoverCloseProps, "ref"> & import("react").RefAttributes<HTMLButtonElement>>;
15
+ export declare const PopoverTitle: import("react").ForwardRefExoticComponent<Omit<import("@base-ui/react").PopoverTitleProps, "ref"> & import("react").RefAttributes<HTMLHeadingElement>>;
16
+ export declare const PopoverDescription: import("react").ForwardRefExoticComponent<Omit<import("@base-ui/react").PopoverDescriptionProps, "ref"> & import("react").RefAttributes<HTMLParagraphElement>>;
17
17
  export type PopoverPopupProps = ComponentProps<typeof BasePopover.Popup> & Placement & {
18
18
  variant?: PopupVariant;
19
19
  };
20
20
  export declare function PopoverPopup({ variant, side, align, sideOffset, className, ...props }: PopoverPopupProps): import("react").JSX.Element;
21
- export declare const PreviewCardRoot: typeof BasePreviewCard.Root;
22
- export declare const PreviewCardTrigger: import("react").ForwardRefExoticComponent<import("@base-ui-components/react/preview-card").PreviewCardTriggerProps & import("react").RefAttributes<HTMLAnchorElement>>;
21
+ export declare const PreviewCardRoot: <Payload>(props: BasePreviewCard.Root.Props<Payload>) => React.JSX.Element;
22
+ export declare const PreviewCardTrigger: BasePreviewCard.Trigger;
23
23
  export type PreviewCardPopupProps = ComponentProps<typeof BasePreviewCard.Popup> & Placement & {
24
24
  variant?: PopupVariant;
25
25
  };
@@ -1,6 +1,6 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
- import { Popover as BasePopover } from '@base-ui-components/react/popover';
3
- import { PreviewCard as BasePreviewCard } from '@base-ui-components/react/preview-card';
2
+ import { Popover as BasePopover } from '@base-ui/react/popover';
3
+ import { PreviewCard as BasePreviewCard } from '@base-ui/react/preview-card';
4
4
  import { withClass } from '../class-name.js';
5
5
  import { splitPlacement } from '../placement.js';
6
6
  import { renderPositioner } from '../popup-layer.js';
package/dist/prefetch.js CHANGED
@@ -11,7 +11,7 @@ export class Prefetcher {
11
11
  running = null;
12
12
  loading = false;
13
13
  whenIdle;
14
- /* Asked on every start, since a person can turn data saving on while the page runs. */
14
+ /* Asked on every ask and again before every load, since a person can turn data saving on while the page runs. */
15
15
  allowed;
16
16
  constructor(whenIdle, allowed = () => true) {
17
17
  this.whenIdle = whenIdle;
@@ -65,6 +65,11 @@ export class Prefetcher {
65
65
  try {
66
66
  for (let load = this.queue.shift(); load; load = this.queue.shift()) {
67
67
  await new Promise((resolve) => this.whenIdle(resolve));
68
+ if (!this.allowed()) {
69
+ // Data saving came on while it waited; a later ask may queue it again.
70
+ this.queued.delete(load);
71
+ continue;
72
+ }
68
73
  this.loading = true;
69
74
  try {
70
75
  await load();
@@ -1,3 +1,4 @@
1
+ import type { Ref } from 'react';
1
2
  export interface ConfirmDialogProps {
2
3
  open: boolean;
3
4
  onOpenChange(open: boolean): void;
@@ -5,5 +6,7 @@ export interface ConfirmDialogProps {
5
6
  description: string;
6
7
  confirmLabel: string;
7
8
  onConfirm(): Promise<void>;
9
+ className?: string;
10
+ ref?: Ref<HTMLDivElement>;
8
11
  }
9
- export declare function ConfirmDialog({ open, onOpenChange, title, description, confirmLabel, onConfirm }: ConfirmDialogProps): import("react").JSX.Element;
12
+ export declare function ConfirmDialog({ open, onOpenChange, title, description, confirmLabel, onConfirm, className, ref }: ConfirmDialogProps): import("react").JSX.Element;
@@ -1,8 +1,8 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { PromptDialog } from '../PromptDialog.js';
3
3
  /* One destructive step, asked before it happens, over whichever dialog it was opened from. */
4
- export function ConfirmDialog({ open, onOpenChange, title, description, confirmLabel, onConfirm }) {
5
- return (_jsx(PromptDialog, { open: open, nested: true, danger: true, title: title, description: description, confirmLabel: confirmLabel, onConfirm: async () => {
4
+ export function ConfirmDialog({ open, onOpenChange, title, description, confirmLabel, onConfirm, className, ref }) {
5
+ return (_jsx(PromptDialog, { ref: ref, className: className, open: open, nested: true, danger: true, title: title, description: description, confirmLabel: confirmLabel, onConfirm: async () => {
6
6
  await onConfirm();
7
7
  onOpenChange(false);
8
8
  }, onOpenChange: onOpenChange }));
@@ -2,7 +2,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { Suspense, useEffect, useMemo, useRef, useState } from 'react';
3
3
  import clsx from 'clsx';
4
4
  import { useTranslation } from 'react-i18next';
5
- import { Tabs } from '@base-ui-components/react/tabs';
5
+ import { Tabs } from '@base-ui/react/tabs';
6
6
  import { Search, X } from 'lucide-react';
7
7
  import { CloseButton } from '../CloseButton.js';
8
8
  import { DialogDescription, DialogPopup, DialogRoot, DialogTitle } from '../dialog/parts.js';