@eifi1/ui-kit 0.52.0 → 0.53.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +47 -54
- package/dist/billing/cancel-subscription.d.ts +5 -14
- package/dist/billing/cancel-subscription.js +1 -3
- package/dist/billing/cancel-subscription.js.map +1 -1
- package/dist/billing/plan-card.d.ts +5 -13
- package/dist/billing/plan-card.js +3 -11
- package/dist/billing/plan-card.js.map +1 -1
- package/dist/billing/plan-switch.d.ts +5 -14
- package/dist/billing/plan-switch.js +1 -3
- package/dist/billing/plan-switch.js.map +1 -1
- package/dist/chart.d.ts +3 -14
- package/dist/chart.js +64 -11
- package/dist/chart.js.map +1 -1
- package/dist/components/date-field.d.ts +1 -1
- package/dist/components/date-field.js.map +1 -1
- package/dist/components/date-picker.d.ts +1 -1
- package/dist/components/date-picker.js.map +1 -1
- package/dist/components/date-range-picker.d.ts +4 -17
- package/dist/components/date-range-picker.js +2 -2
- package/dist/components/date-range-picker.js.map +1 -1
- package/dist/components/nav-pills.d.ts +1 -1
- package/dist/components/nav-pills.js.map +1 -1
- package/dist/components/series-chart-axes.d.ts +1 -1
- package/dist/components/series-chart-axes.js.map +1 -1
- package/dist/components/series-chart.d.ts +64 -19
- package/dist/components/series-chart.js +2 -1
- package/dist/components/series-chart.js.map +1 -1
- package/dist/components/treemap-labels.d.ts +6 -1
- package/dist/components/treemap-labels.js +2 -2
- package/dist/components/treemap-labels.js.map +1 -1
- package/dist/components/treemap.d.ts +29 -4
- package/dist/components/treemap.js +22 -9
- package/dist/components/treemap.js.map +1 -1
- package/dist/data-table.d.ts +1 -6
- package/dist/data-table.js +1 -9
- package/dist/data-table.js.map +1 -1
- package/dist/demo/demo-countdown.d.ts +0 -5
- package/dist/demo/demo-countdown.js +0 -4
- package/dist/demo/demo-countdown.js.map +1 -1
- package/dist/eslint/index.js +1 -1
- package/dist/feedback/feedback-mutation.d.ts +11 -23
- package/dist/feedback/feedback-mutation.js +1 -9
- package/dist/feedback/feedback-mutation.js.map +1 -1
- package/dist/feedback/feedback-public-list.d.ts +1 -6
- package/dist/feedback/feedback-public-list.js +1 -2
- package/dist/feedback/feedback-public-list.js.map +1 -1
- package/dist/feedback/feedback-row-detail-labels.js +0 -8
- package/dist/feedback/feedback-row-detail-labels.js.map +1 -1
- package/dist/feedback/feedback-row-detail.d.ts +3 -50
- package/dist/feedback/feedback-row-detail.js +0 -8
- package/dist/feedback/feedback-row-detail.js.map +1 -1
- package/dist/feedback/feedback-status-undo.d.ts +3 -19
- package/dist/feedback/feedback-status-undo.js.map +1 -1
- package/dist/feedback/feedback-thread.d.ts +0 -9
- package/dist/feedback/feedback-thread.js.map +1 -1
- package/dist/feedback.d.ts +6 -40
- package/dist/feedback.js +88 -46
- package/dist/feedback.js.map +1 -1
- package/dist/i18n/defaults.js +0 -4
- package/dist/i18n/defaults.js.map +1 -1
- package/dist/i18n/german.js +2 -19
- package/dist/i18n/german.js.map +1 -1
- package/dist/i18n/kit-labels.d.ts +5 -14
- package/dist/i18n/kit-labels.js.map +1 -1
- package/dist/i18n/locales/en.js +2 -30
- package/dist/i18n/locales/en.js.map +3 -3
- package/dist/i18n/locales/es.js +2 -19
- package/dist/i18n/locales/es.js.map +1 -1
- package/dist/i18n/locales/fr.js +2 -19
- package/dist/i18n/locales/fr.js.map +1 -1
- package/dist/i18n/locales/hu.js +2 -19
- package/dist/i18n/locales/hu.js.map +1 -1
- package/dist/i18n/locales/it.js +2 -20
- package/dist/i18n/locales/it.js.map +1 -1
- package/dist/i18n/locales/zh.js +2 -19
- package/dist/i18n/locales/zh.js.map +1 -1
- package/dist/i18n/review.js +9 -4
- package/dist/i18n/review.js.map +1 -1
- package/dist/i18n/shared-labels.js +0 -1
- package/dist/i18n/shared-labels.js.map +1 -1
- package/dist/index.d.ts +15 -64
- package/dist/index.js +22 -102
- package/dist/index.js.map +1 -1
- package/dist/rhf/fields.d.ts +2 -2
- package/dist/rhf/fields.js.map +1 -1
- package/dist/search/search-index.d.ts +0 -6
- package/dist/search/search-index.js +0 -4
- package/dist/search/search-index.js.map +1 -1
- package/dist/search.d.ts +1 -8
- package/dist/search.js +2 -7
- package/dist/search.js.map +1 -1
- package/dist/shell/account-menu-language.d.ts +7 -21
- package/dist/shell/account-menu-language.js +1 -3
- package/dist/shell/account-menu-language.js.map +1 -1
- package/dist/shell/account-menu-text-size.d.ts +9 -23
- package/dist/shell/account-menu-text-size.js +2 -3
- package/dist/shell/account-menu-text-size.js.map +1 -1
- package/dist/shell/app-shell.d.ts +0 -10
- package/dist/shell/app-shell.js +1 -7
- package/dist/shell/app-shell.js.map +1 -1
- package/dist/shell/company-switcher.d.ts +1 -1
- package/dist/shell/company-switcher.js.map +1 -1
- package/dist/shell/dev-menu.d.ts +1 -1
- package/dist/shell/dev-menu.js.map +1 -1
- package/dist/shell/top-bar-parts-labels.d.ts +1 -1
- package/dist/shell/top-bar-parts-labels.js.map +1 -1
- package/dist/shell.d.ts +7 -29
- package/dist/shell.js +12 -42
- package/dist/shell.js.map +1 -1
- package/dist/sync.d.ts +2 -6
- package/dist/sync.js +2 -15
- package/dist/sync.js.map +1 -1
- package/dist/theme/chart-palette.d.ts +0 -5
- package/dist/theme/chart-palette.js +0 -2
- package/dist/theme/chart-palette.js.map +1 -1
- package/package.json +1 -1
- package/src/billing/cancel-subscription.tsx +5 -16
- package/src/billing/plan-card.tsx +7 -24
- package/src/billing/plan-switch.tsx +5 -16
- package/src/chart.ts +62 -13
- package/src/components/date-field.tsx +1 -1
- package/src/components/date-picker.tsx +0 -1
- package/src/components/date-range-picker.tsx +6 -22
- package/src/components/nav-pills.tsx +1 -1
- package/src/components/series-chart-axes.ts +6 -1
- package/src/components/series-chart.tsx +78 -21
- package/src/components/treemap-labels.ts +11 -3
- package/src/components/treemap.tsx +65 -12
- package/src/data-table.ts +1 -11
- package/src/demo/demo-countdown.ts +3 -8
- package/src/feedback/feedback-mutation.ts +12 -33
- package/src/feedback/feedback-public-list.tsx +1 -7
- package/src/feedback/feedback-row-detail-labels.ts +0 -8
- package/src/feedback/feedback-row-detail.tsx +8 -58
- package/src/feedback/feedback-status-undo.ts +4 -18
- package/src/feedback/feedback-thread.tsx +0 -10
- package/src/feedback.ts +89 -48
- package/src/i18n/defaults.ts +0 -4
- package/src/i18n/german.ts +2 -19
- package/src/i18n/kit-labels.tsx +5 -14
- package/src/i18n/locales/es.ts +2 -19
- package/src/i18n/locales/fr.ts +2 -19
- package/src/i18n/locales/hu.ts +2 -19
- package/src/i18n/locales/it.ts +2 -20
- package/src/i18n/locales/zh.ts +2 -19
- package/src/i18n/review.ts +9 -4
- package/src/i18n/shared-labels.ts +0 -1
- package/src/index.ts +30 -112
- package/src/rhf/fields.tsx +2 -2
- package/src/search/search-index.ts +0 -15
- package/src/search.ts +8 -8
- package/src/shell/account-menu-language.tsx +7 -27
- package/src/shell/account-menu-text-size.tsx +13 -32
- package/src/shell/app-shell.tsx +0 -13
- package/src/shell/company-switcher.tsx +1 -1
- package/src/shell/dev-menu.tsx +1 -1
- package/src/shell/top-bar-parts-labels.ts +1 -1
- package/src/shell.ts +17 -44
- package/src/sync.ts +2 -15
- package/src/theme/chart-palette.ts +0 -2
- package/tokens.css +4 -4
- package/dist/billing/dialog-close.d.ts +0 -29
- package/dist/billing/dialog-close.js +0 -8
- package/dist/billing/dialog-close.js.map +0 -1
- package/dist/components/field-sync-labels.d.ts +0 -3
- package/dist/components/field-sync-labels.js +0 -12
- package/dist/components/field-sync-labels.js.map +0 -1
- package/dist/components/field-sync.d.ts +0 -186
- package/dist/components/field-sync.js +0 -269
- package/dist/components/field-sync.js.map +0 -1
- package/dist/components/section-nav.d.ts +0 -44
- package/dist/components/section-nav.js +0 -33
- package/dist/components/section-nav.js.map +0 -1
- package/dist/components/sign-chip-labels.d.ts +0 -3
- package/dist/components/sign-chip-labels.js +0 -11
- package/dist/components/sign-chip-labels.js.map +0 -1
- package/dist/components/sign-chip.d.ts +0 -77
- package/dist/components/sign-chip.js +0 -47
- package/dist/components/sign-chip.js.map +0 -1
- package/dist/lib/isin.d.ts +0 -38
- package/dist/lib/isin.js +0 -36
- package/dist/lib/isin.js.map +0 -1
- package/dist/shell/role-switcher.d.ts +0 -28
- package/dist/shell/role-switcher.js +0 -31
- package/dist/shell/role-switcher.js.map +0 -1
- package/src/billing/dialog-close.ts +0 -34
- package/src/components/field-sync-labels.ts +0 -14
- package/src/components/field-sync.tsx +0 -504
- package/src/components/section-nav.tsx +0 -72
- package/src/components/sign-chip-labels.ts +0 -13
- package/src/components/sign-chip.tsx +0 -133
- package/src/lib/isin.ts +0 -72
- package/src/shell/role-switcher.tsx +0 -53
|
@@ -129,13 +129,26 @@ export interface TreemapProps extends Omit<ComponentPropsWithoutRef<"div">, "chi
|
|
|
129
129
|
* A tile's and a group's accessible name (`labels.tile`, `labels.group`, 0.52) says the
|
|
130
130
|
* value too, asked of the formatter as the tooltip asks it, share and all, and its text
|
|
131
131
|
* is used; markup is said as the bare number. The name says the share itself, so a
|
|
132
|
-
* formatter that writes it into its text has it said twice
|
|
132
|
+
* formatter that writes it into its text has it said twice — say so with
|
|
133
|
+
* {@link TreemapProps.shareInValue}.
|
|
133
134
|
*
|
|
134
135
|
* Default: the bare number through `Intl.NumberFormat` in the provider's locale (0.52,
|
|
135
136
|
* DOC-10: before, the runtime's). A host with a currency passes this — the kit knows
|
|
136
137
|
* none.
|
|
137
138
|
*/
|
|
138
139
|
valueFormatter?: (value: number, share: number | undefined) => ReactNode;
|
|
140
|
+
/**
|
|
141
|
+
* The `valueFormatter`'s text already says the share ("CHF 412.30 · 12%"), so a tile's
|
|
142
|
+
* and a group's accessible name leave their own " (12%)" out (0.53, keksdose after 0.52):
|
|
143
|
+
* the map hands `labels.tile` and `labels.group` the share as `""`, and every catalogue's
|
|
144
|
+
* template drops it there, in its own typography. Before, the only way out was to replace
|
|
145
|
+
* both templates, and with them the kit's seven catalogues. The tooltip is the same either
|
|
146
|
+
* way: it prints what the formatter prints. A formatter whose value is markup is said as
|
|
147
|
+
* the bare number, so its share is then not said at all.
|
|
148
|
+
*
|
|
149
|
+
* Default `false`: the name says the share.
|
|
150
|
+
*/
|
|
151
|
+
shareInValue?: boolean;
|
|
139
152
|
/**
|
|
140
153
|
* What the map SHOWS, in a sentence — "Rent is three fifths of the month." — the
|
|
141
154
|
* figure's accessible description (0.52, DSP-5). Not drawn; a caption the eye should
|
|
@@ -185,8 +198,18 @@ export interface TreemapProps extends Omit<ComponentPropsWithoutRef<"div">, "chi
|
|
|
185
198
|
* Every tile is tagged as a whole too, clickable or not (0.52): its accessible name
|
|
186
199
|
* (`labels.tile`) says the name and the value, in an attribute a host's redaction
|
|
187
200
|
* reaches only through the tag.
|
|
201
|
+
*
|
|
202
|
+
* - `true`: every node — the tiles, and a group's frame (its `<g>` and its band's name)
|
|
203
|
+
* and tooltip bubble too.
|
|
204
|
+
* - `"tiles"` (0.53, keksdose after 0.52): the tiles as `true` tags them, and no group —
|
|
205
|
+
* for groups that are public names over private ones, as chains (Migros, Coop) over
|
|
206
|
+
* the shops a user paid. Its frame's band, its frame and its bubble's name are
|
|
207
|
+
* untagged, and so is the frame's accessible name (`labels.group`), which says the
|
|
208
|
+
* group's TOTAL: use it only where the groups' names and totals are not the private
|
|
209
|
+
* part. The bubble's value cell is tagged whatever this says, as in every chart.
|
|
210
|
+
* A tile's name still says its group's (`labels.inGroup`), under the tile's tag.
|
|
188
211
|
*/
|
|
189
|
-
redactNames?: boolean;
|
|
212
|
+
redactNames?: boolean | "tiles";
|
|
190
213
|
/**
|
|
191
214
|
* A second, smaller line under a tile's label — one extra figure per node that the
|
|
192
215
|
* name cannot carry (a year-on-year `+12%`, `new`). Return `undefined` for a node
|
|
@@ -436,7 +459,9 @@ export interface TreemapCellProps {
|
|
|
436
459
|
/** Filled in by recharts for a GROUP: the nodes laid out inside it. A cell with
|
|
437
460
|
* children draws a frame, not a tile (0.52). */
|
|
438
461
|
children?: readonly object[] | null;
|
|
439
|
-
redactNames
|
|
462
|
+
/** See {@link TreemapProps.redactNames}: `"tiles"` tags a cell with no `children`, and
|
|
463
|
+
* leaves a group's frame and band untagged (0.53). */
|
|
464
|
+
redactNames?: boolean | "tiles";
|
|
440
465
|
nodeNote?: (id: string) => string | undefined;
|
|
441
466
|
/** The page's reading direction, which `Treemap` reads off its own root. In `rtl`
|
|
442
467
|
* the label stands in the tile's top RIGHT corner and is shaped right-to-left, so a
|
|
@@ -578,6 +603,10 @@ function Tile({
|
|
|
578
603
|
// is a button.
|
|
579
604
|
const roving = path != null && keys ? keys : undefined;
|
|
580
605
|
const focusable = roving !== undefined || activate !== undefined;
|
|
606
|
+
// `"tiles"` (0.53, keksdose after 0.52) leaves a group's frame and band untagged: its
|
|
607
|
+
// groups are public chain names, and its blur on `[data-private]` blurred them with the
|
|
608
|
+
// payees. A truthy test on the union would have tagged them still.
|
|
609
|
+
const redact = redactNames === true || (redactNames === "tiles" && !group);
|
|
581
610
|
const onKeyDown = focusable
|
|
582
611
|
? (e: KeyboardEvent<SVGGElement>) => {
|
|
583
612
|
if (roving?.move(path!, e)) {
|
|
@@ -606,7 +635,7 @@ function Tile({
|
|
|
606
635
|
// In a map, -1 as drawn: the map moves its one stop on the elements in place.
|
|
607
636
|
tabIndex={roving ? -1 : activate ? 0 : undefined}
|
|
608
637
|
aria-label={focusable ? (roving?.name(path!) ?? name) : undefined}
|
|
609
|
-
data-private={focusable &&
|
|
638
|
+
data-private={focusable && redact ? "" : undefined}
|
|
610
639
|
data-group={group ? "" : undefined}
|
|
611
640
|
cursor={activate ? "pointer" : undefined}
|
|
612
641
|
// CSS beats a presentation attribute, so this recolours the rect's own stroke
|
|
@@ -646,7 +675,7 @@ function Tile({
|
|
|
646
675
|
<text
|
|
647
676
|
// A plain attribute, so the host's `[data-private]` rule reaches an SVG
|
|
648
677
|
// <text> exactly as it reaches a table cell.
|
|
649
|
-
data-private={
|
|
678
|
+
data-private={redact ? "" : undefined}
|
|
650
679
|
x={textX}
|
|
651
680
|
// A band's name centred in its 20px; a tile's where its floor leaves room below.
|
|
652
681
|
y={py + (group ? 14 : 15) * scale}
|
|
@@ -697,10 +726,20 @@ const TREEMAP_CONFIG: ChartConfig = {};
|
|
|
697
726
|
* recharts CLONES the `content` element to inject `active`/`payload`, so this has to BE
|
|
698
727
|
* that element — a `<div>` wrapped around `<ChartTooltipContent />` in the JSX would
|
|
699
728
|
* take those props itself and hand the tooltip nothing.
|
|
729
|
+
*
|
|
730
|
+
* `groups: false` is `redactNames="tiles"` (0.53): a group's bubble is left untagged, as its
|
|
731
|
+
* frame is. The payload says which node is hovered — recharts hands the node itself, with
|
|
732
|
+
* its laid-out `children` for a group and `null` for a tile, as the cell is told — so
|
|
733
|
+
* anything else, or no payload, is tagged.
|
|
700
734
|
*/
|
|
701
|
-
function RedactedTooltipContent(
|
|
735
|
+
function RedactedTooltipContent({
|
|
736
|
+
groups = true,
|
|
737
|
+
...props
|
|
738
|
+
}: ComponentProps<typeof ChartTooltipContent> & { groups?: boolean }) {
|
|
739
|
+
const children = props.payload?.[0]?.payload?.children;
|
|
740
|
+
const group = Array.isArray(children) && children.length > 0;
|
|
702
741
|
return (
|
|
703
|
-
<div data-private>
|
|
742
|
+
<div data-private={groups || !group ? true : undefined}>
|
|
704
743
|
<ChartTooltipContent {...props} />
|
|
705
744
|
</div>
|
|
706
745
|
);
|
|
@@ -895,6 +934,7 @@ export function Treemap({
|
|
|
895
934
|
onNodeClick,
|
|
896
935
|
onGroupClick,
|
|
897
936
|
redactNames = false,
|
|
937
|
+
shareInValue = false,
|
|
898
938
|
nodeNote,
|
|
899
939
|
maxTiles,
|
|
900
940
|
colors,
|
|
@@ -1066,10 +1106,13 @@ export function Treemap({
|
|
|
1066
1106
|
};
|
|
1067
1107
|
// A group's name by its path; a node's groups by theirs, its own path's prefixes.
|
|
1068
1108
|
const groupName = new Map(order.filter((n) => n.children).map((n) => [n.path, n.name]));
|
|
1109
|
+
// `""` when the formatter's text says the share already, which every template drops
|
|
1110
|
+
// (0.53, `shareInValue`).
|
|
1111
|
+
const shareOf = (v: number) => (shareInValue ? "" : shareText(total > 0 ? v / total : 0));
|
|
1069
1112
|
return new Map(
|
|
1070
1113
|
order.map((n) => {
|
|
1071
1114
|
const say = n.children ? labels.group : labels.tile;
|
|
1072
|
-
const own = say(n.name, valueText(n.size),
|
|
1115
|
+
const own = say(n.name, valueText(n.size), shareOf(n.size));
|
|
1073
1116
|
// The innermost group first: "Rent: …, in Housing, in Fixed costs".
|
|
1074
1117
|
const named = n.groups
|
|
1075
1118
|
.map((g, i) => groupName.get(pathOf(n.groups.slice(0, i), g)) ?? g)
|
|
@@ -1077,7 +1120,7 @@ export function Treemap({
|
|
|
1077
1120
|
return [n.path, named] as const;
|
|
1078
1121
|
}),
|
|
1079
1122
|
);
|
|
1080
|
-
}, [order, labels, format, numberFormat, shareText, total]);
|
|
1123
|
+
}, [order, labels, format, numberFormat, shareText, shareInValue, total]);
|
|
1081
1124
|
const keys = useMemo<TileKeys>(
|
|
1082
1125
|
() => ({ name: (path) => names.get(path), onFocus, register, move }),
|
|
1083
1126
|
[names, onFocus, register, move],
|
|
@@ -1086,7 +1129,6 @@ export function Treemap({
|
|
|
1086
1129
|
() => ({ tokens: tokenHex, edgeFor, edges: edgesInForce, keys, layout, hover: anchor.set }),
|
|
1087
1130
|
[tokenHex, edgeFor, edgesInForce, keys, layout, anchor],
|
|
1088
1131
|
);
|
|
1089
|
-
const Content = redactNames ? RedactedTooltipContent : ChartTooltipContent;
|
|
1090
1132
|
const cell = useMemo(
|
|
1091
1133
|
() => (
|
|
1092
1134
|
<TreemapCell
|
|
@@ -1100,8 +1142,19 @@ export function Treemap({
|
|
|
1100
1142
|
[onNodeClick, onGroupClick, redactNames, nodeNote, dir],
|
|
1101
1143
|
);
|
|
1102
1144
|
const tooltip = useMemo(
|
|
1103
|
-
() =>
|
|
1104
|
-
|
|
1145
|
+
() => (
|
|
1146
|
+
<TreemapTooltip
|
|
1147
|
+
content={
|
|
1148
|
+
redactNames ? (
|
|
1149
|
+
<RedactedTooltipContent hideLabel valueFormatter={format} groups={redactNames === true} />
|
|
1150
|
+
) : (
|
|
1151
|
+
<ChartTooltipContent hideLabel valueFormatter={format} />
|
|
1152
|
+
)
|
|
1153
|
+
}
|
|
1154
|
+
anchor={anchor}
|
|
1155
|
+
/>
|
|
1156
|
+
),
|
|
1157
|
+
[redactNames, format, anchor],
|
|
1105
1158
|
);
|
|
1106
1159
|
|
|
1107
1160
|
if (nodes.length === 0) return null;
|
package/src/data-table.ts
CHANGED
|
@@ -27,22 +27,12 @@ export type {
|
|
|
27
27
|
DataTableRowAction,
|
|
28
28
|
DataTableDesktopSwipeActions,
|
|
29
29
|
} from "./components/data-table";
|
|
30
|
-
// 0.46.1 (keksdose N3): a swipe plan as `RowActions`' actions — the desktop column's own
|
|
31
|
-
// derivation, for an app's hand-built actions column.
|
|
32
|
-
export {
|
|
33
|
-
/** @deprecated 0.52 — `DataTable`'s `desktopSwipeActions`, which builds its column with it (API-4); removed in 0.53 */
|
|
34
|
-
swipePlanRowActions,
|
|
35
|
-
} from "./components/data-table-row-actions";
|
|
36
30
|
// 0.48 (keksdose dev #605): a `groupBy` level (also `mobileGroupBy`'s) and the `loadMore` footer.
|
|
37
31
|
export type { DataTableGroupBy, DataTableLoadMore } from "./components/data-table-groups";
|
|
38
32
|
// 0.48.2 (keksdose dev #632): `virtualize`'s options.
|
|
39
33
|
export type { DataTableVirtualize } from "./components/data-table-virtual";
|
|
40
34
|
export * from "./components/data-table-cells";
|
|
41
|
-
export {
|
|
42
|
-
useTableUrlState,
|
|
43
|
-
/** @deprecated 0.52 — `useTableUrlState`, which reads the URL with it (API-4); removed in 0.53 */
|
|
44
|
-
readTableUrlState,
|
|
45
|
-
} from "./components/use-table-state";
|
|
35
|
+
export { useTableUrlState } from "./components/use-table-state";
|
|
46
36
|
export type {
|
|
47
37
|
TableUrlState,
|
|
48
38
|
TableUrlSync,
|
|
@@ -50,14 +50,9 @@ function minutesAt(expiry: number, now: number): number | null {
|
|
|
50
50
|
return Math.max(0, Math.ceil((expiry - now) / MINUTE));
|
|
51
51
|
}
|
|
52
52
|
|
|
53
|
-
/**
|
|
54
|
-
*
|
|
55
|
-
*
|
|
56
|
-
*/
|
|
57
|
-
export function demoCountdown(expiresAt: DemoExpiry | null | undefined, now: number): DemoCountdown {
|
|
58
|
-
return countdownOf(minutesAt(expiryMs(expiresAt), now));
|
|
59
|
-
}
|
|
60
|
-
|
|
53
|
+
/** The countdown for `minutesLeft` — see {@link DemoCountdown} for the rounding and the
|
|
54
|
+
* thresholds. (Public as `demoCountdown(expiresAt, now)` until 0.53, deprecated in 0.52,
|
|
55
|
+
* API-4: `useDemoCountdown` with its `now` option is the same countdown.) */
|
|
61
56
|
function countdownOf(minutesLeft: number | null): DemoCountdown {
|
|
62
57
|
if (minutesLeft === null) {
|
|
63
58
|
return { minutesLeft, hours: 0, minutes: 0, lastHour: false, warning: false, ended: false };
|
|
@@ -1,41 +1,20 @@
|
|
|
1
|
-
import { isThenable } from "../lib/thenable";
|
|
2
|
-
|
|
3
1
|
/**
|
|
4
|
-
* A page's mutation
|
|
5
|
-
*
|
|
2
|
+
* A page's mutation, run once (refactor audit 2026-10-30, FLW-3): TanStack Query's
|
|
3
|
+
* `mutateAsync`, or any `(patch) => Promise` that resolves once the PATCH has landed.
|
|
6
4
|
*
|
|
7
|
-
* The parts
|
|
8
|
-
* v5 calls per-call callbacks for the LATEST `mutate()` on
|
|
9
|
-
* overwrites the options and detaches from the earlier mutation —
|
|
10
|
-
* before the first PATCH answered (another swipe, another pill,
|
|
11
|
-
* first change's Undo toast, and the detail's editor stayed
|
|
12
|
-
* `mutateAsync` returns settles for every call, whatever the observer
|
|
5
|
+
* The parts took TanStack Query's `mutate` with a per-call `onSuccess` until 0.53
|
|
6
|
+
* (deprecated in 0.52). TanStack v5 calls per-call callbacks for the LATEST `mutate()` on
|
|
7
|
+
* an observer only — it overwrites the options and detaches from the earlier mutation —
|
|
8
|
+
* so a second change sent before the first PATCH answered (another swipe, another pill,
|
|
9
|
+
* the Undo itself) lost the first change's Undo toast, and the detail's editor stayed
|
|
10
|
+
* open. The promise `mutateAsync` returns settles for every call, whatever the observer
|
|
11
|
+
* does next.
|
|
13
12
|
*
|
|
14
|
-
*
|
|
15
|
-
* taken from whichever comes first: the callback, or the promise the call returned. A
|
|
16
|
-
* rejected promise is the mutation's own to report (its `onError`), so it is caught here
|
|
13
|
+
* A rejected promise is the mutation's own to report (its `onError`), so it is caught here
|
|
17
14
|
* and nothing more happens.
|
|
18
15
|
*
|
|
19
16
|
* @internal Not part of `/feedback` or the barrel.
|
|
20
17
|
*/
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
* A mutation in either form: the promise form (0.52) — TanStack's `mutateAsync`, any
|
|
24
|
-
* `(patch) => Promise` — or the callback form before it — TanStack's `mutate`, a function
|
|
25
|
-
* that calls `onSuccess` once the PATCH has landed, and only then. One signature for
|
|
26
|
-
* both, so an inline function handed to a prop of this type gets its parameter types (a
|
|
27
|
-
* union of the two leaves `async (patch) => …` an implicit `any`).
|
|
28
|
-
*/
|
|
29
|
-
export type FeedbackMutationCall<P> = (patch: P, callbacks: { onSuccess: () => void }) => void | Promise<unknown>;
|
|
30
|
-
|
|
31
|
-
/** Send `patch` through `call`, and run `landed` once when it has landed. */
|
|
32
|
-
export function runMutation<P>(call: FeedbackMutationCall<P>, patch: P, landed: () => void): void {
|
|
33
|
-
let done = false;
|
|
34
|
-
const once = () => {
|
|
35
|
-
if (done) return;
|
|
36
|
-
done = true;
|
|
37
|
-
landed();
|
|
38
|
-
};
|
|
39
|
-
const answer: unknown = call(patch, { onSuccess: once });
|
|
40
|
-
if (isThenable(answer)) answer.then(once, () => undefined);
|
|
18
|
+
export function runMutation<P>(call: (patch: P) => Promise<unknown>, patch: P, landed: () => void): void {
|
|
19
|
+
call(patch).then(landed, () => undefined);
|
|
41
20
|
}
|
|
@@ -174,11 +174,6 @@ export interface FeedbackPublicListProps<T extends FeedbackPublicListItem = Feed
|
|
|
174
174
|
* what it carries: every other `onOpenChange` in the kit is a boolean (refactor audit
|
|
175
175
|
* 2026-10-30, API-5). */
|
|
176
176
|
onOpenIdChange?: (id: number | null) => void;
|
|
177
|
-
/**
|
|
178
|
-
* @deprecated 0.52 — `onOpenIdChange`, the same call: an `onOpenChange` is a boolean
|
|
179
|
-
* everywhere else in the kit; removed in 0.53
|
|
180
|
-
*/
|
|
181
|
-
onOpenChange?: (id: number | null) => void;
|
|
182
177
|
/**
|
|
183
178
|
* 0.38.1: the opened report when it is NOT on this page — a `?row=` link to an older
|
|
184
179
|
* one (Kurvenschmiede). The app fetches it (`GET /feedback/public/{id}`, a list item's
|
|
@@ -249,7 +244,6 @@ export function FeedbackPublicList<T extends FeedbackPublicListItem = FeedbackPu
|
|
|
249
244
|
loading = false,
|
|
250
245
|
openId: openIdProp,
|
|
251
246
|
onOpenIdChange,
|
|
252
|
-
onOpenChange,
|
|
253
247
|
openRow,
|
|
254
248
|
page: pageIndex = 0,
|
|
255
249
|
hasMore = false,
|
|
@@ -269,7 +263,7 @@ export function FeedbackPublicList<T extends FeedbackPublicListItem = FeedbackPu
|
|
|
269
263
|
const openId = openIdProp !== undefined ? openIdProp : ownOpenId;
|
|
270
264
|
const setOpen = (id: number | null) => {
|
|
271
265
|
if (openIdProp === undefined) setOwnOpenId(id);
|
|
272
|
-
|
|
266
|
+
onOpenIdChange?.(id);
|
|
273
267
|
};
|
|
274
268
|
// A `?row=` report from another page: first, while it is the open one, and only when
|
|
275
269
|
// the page does not have it itself.
|
|
@@ -20,14 +20,6 @@ export const DEFAULT_FEEDBACK_DETAIL_LABELS: FeedbackDetailLabels = {
|
|
|
20
20
|
outcome: "Outcome",
|
|
21
21
|
replies: "Replies",
|
|
22
22
|
resolvedAt: (date) => `Resolved: ${date}`,
|
|
23
|
-
// The outcome editor's three words, read by nothing since 0.38 and "kept for one
|
|
24
|
-
// release" for 13 minors: no tag, so the deprecations test never listed them (refactor
|
|
25
|
-
// audit 2026-10-30, DOC-9). Deprecated on `FeedbackDetailLabels`, the type an app reads
|
|
26
|
-
// them through — a tag on these keys reached no reader (0.52 code review). The keys
|
|
27
|
-
// leave the type and all seven catalogues in 0.53.
|
|
28
|
-
outcomeAdd: "Add outcome",
|
|
29
|
-
outcomeUpdate: "Update",
|
|
30
|
-
outcomePlaceholder: "What was done, decided, or why this won't be addressed.",
|
|
31
23
|
rework: "Rework",
|
|
32
24
|
reworkTitle: "Send for rework",
|
|
33
25
|
reworkSend: "Send rework",
|
|
@@ -35,7 +35,7 @@ import {
|
|
|
35
35
|
splitDescription,
|
|
36
36
|
} from "./feedback-record";
|
|
37
37
|
import type { FeedbackContext, FeedbackRecord } from "./feedback-record";
|
|
38
|
-
import { runMutation
|
|
38
|
+
import { runMutation } from "./feedback-mutation";
|
|
39
39
|
import { feedbackPage, feedbackPageLinkTarget } from "./feedback-page-link";
|
|
40
40
|
import { useFeedbackStatusUndo } from "./feedback-status-undo";
|
|
41
41
|
import type { FeedbackStatusChange } from "./feedback-status-undo";
|
|
@@ -133,22 +133,6 @@ export interface FeedbackDetailLabels {
|
|
|
133
133
|
/** On section 4's heading line once the row is settled, given the formatted
|
|
134
134
|
* `resolved_at` date. de-CH: "Erledigt am: {{date}}" */
|
|
135
135
|
resolvedAt: (date: string) => string;
|
|
136
|
-
// Deprecated on these members, the ones an app's code reads and overrides through: the
|
|
137
|
-
// tags sat on the English default's keys, and reached nothing — the default is typed by
|
|
138
|
-
// this interface (0.52 code review, feedback-row-detail-labels.ts; refactor audit
|
|
139
|
-
// 2026-10-30, DOC-9).
|
|
140
|
-
/** The admin's button while there is no outcome — read by nothing since 0.38 (the
|
|
141
|
-
* outcome is frozen, §9.7; a reply is written instead). de-CH: "Ergebnis hinzufügen"
|
|
142
|
-
* @deprecated 0.52 — a reply: the outcome is frozen since 0.38 (§9.7); removed in 0.53. */
|
|
143
|
-
outcomeAdd: string;
|
|
144
|
-
/** The same button once there is one. Unused since 0.38, as `outcomeAdd`.
|
|
145
|
-
* de-CH: "Aktualisieren"
|
|
146
|
-
* @deprecated 0.52 — a reply: the outcome is frozen since 0.38 (§9.7); removed in 0.53. */
|
|
147
|
-
outcomeUpdate: string;
|
|
148
|
-
/** The line above the outcome editor. Unused since 0.38, as `outcomeAdd`.
|
|
149
|
-
* de-CH: "Was wurde umgesetzt, entschieden oder warum nicht."
|
|
150
|
-
* @deprecated 0.52 — a reply: the outcome is frozen since 0.38 (§9.7); removed in 0.53. */
|
|
151
|
-
outcomePlaceholder: string;
|
|
152
136
|
/** The button that opens section 5 on an answered row. de-CH: "Nacharbeit" */
|
|
153
137
|
rework: string;
|
|
154
138
|
/** Section 5's heading. de-CH: "Zur Nacharbeit senden" */
|
|
@@ -181,23 +165,10 @@ export function useFeedbackDetailLabels(labels?: LabelOverride<FeedbackDetailLab
|
|
|
181
165
|
|
|
182
166
|
/* ── The page a report was filed on (§3.2, §4.4.2) ────────────────────────── */
|
|
183
167
|
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
* page.
|
|
189
|
-
*
|
|
190
|
-
* Always a path on THIS app, never another origin's address — but the path and query
|
|
191
|
-
* are the reporter's to write, so it is TEXT, not a link target: `/join?token=…` acts on
|
|
192
|
-
* load, and `/login?next=…` forwards a signed-in admin to whatever its query names
|
|
193
|
-
* (refactor audit 2026-10-30, FLW-7; 0.52 code review). The kit's URL cell and section
|
|
194
|
-
* link {@link feedbackPagePath} alone, and not even that for a one-shot route
|
|
195
|
-
* (`pageLinkExclude`) — `FeedbackRowDetail` and `useFeedbackColumns` draw the page that
|
|
196
|
-
* way; an app's own cell should not link this.
|
|
197
|
-
*/
|
|
198
|
-
export function feedbackPageHref(context: FeedbackContext | null | undefined): string | null {
|
|
199
|
-
return feedbackPage(context)?.href ?? null;
|
|
200
|
-
}
|
|
168
|
+
// The page as the reporter had it (path + query + hash) and the full URL "Copy URL"
|
|
169
|
+
// copies were public too, as `feedbackPageHref` and `feedbackPageUrl`, until 0.53 (deprecated
|
|
170
|
+
// in 0.52, API-4): `feedbackPage` (./feedback-page-link) is the one reading, and the kit
|
|
171
|
+
// links only its path.
|
|
201
172
|
|
|
202
173
|
/** The page's path alone — the compact text a URL column shows (§4.3), and the only part
|
|
203
174
|
* of the page the kit links. */
|
|
@@ -205,15 +176,6 @@ export function feedbackPagePath(context: FeedbackContext | null | undefined): s
|
|
|
205
176
|
return feedbackPage(context)?.path ?? null;
|
|
206
177
|
}
|
|
207
178
|
|
|
208
|
-
/**
|
|
209
|
-
* What "Copy URL" copies: the FULL `context.url` as the reporter's browser had it —
|
|
210
|
-
* origin included, which is the one part that says which copy of the app it was
|
|
211
|
-
* (feedback #278) — else `context.route`. `null` when there is no page.
|
|
212
|
-
*/
|
|
213
|
-
export function feedbackPageUrl(context: FeedbackContext | null | undefined): string | null {
|
|
214
|
-
return feedbackPage(context)?.url ?? null;
|
|
215
|
-
}
|
|
216
|
-
|
|
217
179
|
/* ── Attachments (§3.5, §4.4.3) ───────────────────────────────────────────── */
|
|
218
180
|
|
|
219
181
|
/**
|
|
@@ -319,17 +281,6 @@ export interface FeedbackDetailPatch {
|
|
|
319
281
|
*/
|
|
320
282
|
export type FeedbackDetailUpdateAsync = (patch: FeedbackDetailPatch) => Promise<unknown>;
|
|
321
283
|
|
|
322
|
-
/**
|
|
323
|
-
* The callback form: TanStack Query's `mutate`, or a function that calls `onSuccess` once
|
|
324
|
-
* the PATCH has landed. TanStack calls a per-call `onSuccess` for the LATEST `mutate()`
|
|
325
|
-
* only, so an editor whose save was followed by another PATCH before it answered stayed
|
|
326
|
-
* open, and the earlier status change lost its Undo.
|
|
327
|
-
*
|
|
328
|
-
* @deprecated 0.52 — pass `update.mutateAsync` ({@link FeedbackDetailUpdateAsync}); removed
|
|
329
|
-
* in 0.53
|
|
330
|
-
*/
|
|
331
|
-
export type FeedbackDetailUpdate = (patch: FeedbackDetailPatch, callbacks: { onSuccess: () => void }) => void;
|
|
332
|
-
|
|
333
284
|
/** `POST /feedback/attachments` (§3.3): one file up, its URL
|
|
334
285
|
* (`/api/v1/feedback/attachments/<key>`) back. Reject on failure. */
|
|
335
286
|
export type FeedbackUpload = (file: File) => Promise<string>;
|
|
@@ -351,7 +302,7 @@ export interface FeedbackReworkSectionProps {
|
|
|
351
302
|
/** The PATCH — see {@link FeedbackDetailUpdateAsync}. Called with `{ id, body }` only,
|
|
352
303
|
* and only without `onRework`: the legacy append (§3.4), which server-kit 0.13 still
|
|
353
304
|
* turns into an entry for one release. Optional since 0.40; pass one of the two. */
|
|
354
|
-
onUpdate?:
|
|
305
|
+
onUpdate?: FeedbackDetailUpdateAsync;
|
|
355
306
|
/** The PATCH is in flight (`update.isPending`). The upload adds its own. */
|
|
356
307
|
pending?: boolean;
|
|
357
308
|
/** The upload. Left out, the note goes without a file field. */
|
|
@@ -517,9 +468,8 @@ export interface FeedbackRowDetailProps {
|
|
|
517
468
|
/** The signed-in user's id — who the AUTHOR is: the description editor and rework. */
|
|
518
469
|
viewerId?: number | null;
|
|
519
470
|
/** The page's PATCH — `update.mutateAsync` (see {@link FeedbackDetailUpdateAsync}). The
|
|
520
|
-
* callback form
|
|
521
|
-
|
|
522
|
-
onUpdate: FeedbackMutationCall<FeedbackDetailPatch>;
|
|
471
|
+
* callback form, `update.mutate`, went in 0.53 (deprecated in 0.52). */
|
|
472
|
+
onUpdate: FeedbackDetailUpdateAsync;
|
|
523
473
|
/** `update.isPending`: the editors' save buttons wait for it. */
|
|
524
474
|
pending?: boolean;
|
|
525
475
|
/** `POST /feedback/attachments` for the rework's one file and, since 0.47 (§12) with
|
|
@@ -9,7 +9,7 @@ import {
|
|
|
9
9
|
} from "./feedback-labels";
|
|
10
10
|
import type { FeedbackRecord } from "./feedback-record";
|
|
11
11
|
import type { LabelOverride } from "../i18n/kit-labels";
|
|
12
|
-
import { runMutation
|
|
12
|
+
import { runMutation } from "./feedback-mutation";
|
|
13
13
|
|
|
14
14
|
/**
|
|
15
15
|
* A status change that can be taken back — §4.5 of the feedback contract, lifted from
|
|
@@ -42,17 +42,6 @@ export interface FeedbackStatusPatch {
|
|
|
42
42
|
*/
|
|
43
43
|
export type FeedbackStatusMutateAsync = (patch: FeedbackStatusPatch) => Promise<unknown>;
|
|
44
44
|
|
|
45
|
-
/**
|
|
46
|
-
* The callback form: TanStack Query's `mutate`, or a function that calls `onSuccess` once
|
|
47
|
-
* the PATCH has landed. TanStack calls a per-call `onSuccess` for the LATEST `mutate()` on
|
|
48
|
-
* its observer only, so a second change sent before the first answered — another swipe,
|
|
49
|
-
* another pill, the Undo itself — lost the first change's Undo toast.
|
|
50
|
-
*
|
|
51
|
-
* @deprecated 0.52 — pass `update.mutateAsync` ({@link FeedbackStatusMutateAsync}), whose
|
|
52
|
-
* promise settles for every call; removed in 0.53
|
|
53
|
-
*/
|
|
54
|
-
export type FeedbackStatusMutate = (patch: FeedbackStatusPatch, callbacks: { onSuccess: () => void }) => void;
|
|
55
|
-
|
|
56
45
|
/** What the change needs to know about the row: which one, what it is called in the
|
|
57
46
|
* toast, and where it stood (the status Undo goes back to). */
|
|
58
47
|
export type FeedbackStatusRow = Pick<FeedbackRecord, "id" | "title" | "status">;
|
|
@@ -90,14 +79,11 @@ export const FEEDBACK_UNDO_DURATION = 8000;
|
|
|
90
79
|
* `{ id, status: previous }` → once that has landed `statusRestored(previousName, title)`.
|
|
91
80
|
* Each change waits for its OWN answer, so two changes in flight each get their toast.
|
|
92
81
|
*
|
|
93
|
-
* `update.mutate
|
|
94
|
-
*
|
|
95
|
-
* takes both rather than two overloads: TypeScript types an inline callback's parameters
|
|
96
|
-
* from the FIRST overload, so a hand-written `(patch, { onSuccess }) => …` — the form this
|
|
97
|
-
* hook documented until 0.52 — would no longer compile.
|
|
82
|
+
* `update.mutate`, the callback form, went in 0.53 (deprecated in 0.52): with it a second
|
|
83
|
+
* change before the first answered lost the first one's Undo.
|
|
98
84
|
*/
|
|
99
85
|
export function useFeedbackStatusUndo(
|
|
100
|
-
mutate:
|
|
86
|
+
mutate: FeedbackStatusMutateAsync,
|
|
101
87
|
{ labels, statusLabels }: FeedbackStatusUndoOptions = {},
|
|
102
88
|
): FeedbackStatusChange {
|
|
103
89
|
const words = useFeedbackToastLabels(labels);
|
|
@@ -903,13 +903,3 @@ function dataAttributes(props: object): Record<string, unknown> {
|
|
|
903
903
|
for (const [key, value] of Object.entries(props)) if (key.startsWith("data-")) out[key] = value;
|
|
904
904
|
return out;
|
|
905
905
|
}
|
|
906
|
-
|
|
907
|
-
/** @deprecated 0.52 — {@link ChatComposerProps}, the same type; removed in 0.53 */
|
|
908
|
-
export type FeedbackComposerProps = ChatComposerProps;
|
|
909
|
-
/** @deprecated 0.52 — {@link ChatComposerHandle}, the same type; removed in 0.53 */
|
|
910
|
-
export type FeedbackComposerHandle = ChatComposerHandle;
|
|
911
|
-
/** @deprecated 0.52 — {@link ChatComposerLabels}, the same type (still the provider's
|
|
912
|
-
* `feedbackComposer` namespace); removed in 0.53 */
|
|
913
|
-
export type FeedbackComposerLabels = ChatComposerLabels;
|
|
914
|
-
/** @deprecated 0.52 — {@link ChatComposerSlotContext}, the same type; removed in 0.53 */
|
|
915
|
-
export type FeedbackComposerSlotContext = ChatComposerSlotContext;
|
package/src/feedback.ts
CHANGED
|
@@ -9,20 +9,103 @@ export * from "./feedback/feedback-inbox";
|
|
|
9
9
|
export * from "./feedback/feedback-thread";
|
|
10
10
|
// 0.27.0: the feedback harmonization (docs/feedback-harmonization.md) — one record,
|
|
11
11
|
// one menu, dialog, table, detail and crash reporter for keksdose, kastlan, Kurvenschmiede.
|
|
12
|
-
|
|
12
|
+
//
|
|
13
|
+
// Named, not `*`, for six of its modules: 0.53 took the slice's share of the 55 names no app
|
|
14
|
+
// reads off the surface (deprecated in 0.52, refactor audit 2026-10-30, API-4) —
|
|
15
|
+
// `feedbackAttachmentLine`, `FEEDBACK_UNDO_DURATION`, `FEEDBACK_SWIPE_ACTIONS`,
|
|
16
|
+
// `feedbackColumns`, `feedbackSubmitter`, `feedbackSubmitterEmail`, `feedbackEnvironment`,
|
|
17
|
+
// `feedbackPagePath`, `feedbackAttachmentUrls`, `feedbackRowAccess`, `useFeedbackDetailLabels`
|
|
18
|
+
// and `feedbackPublicSwitchAllowed`, which their modules keep for the kit's own use.
|
|
19
|
+
// `feedbackPageHref` and `feedbackPageUrl` went whole: nothing read them.
|
|
20
|
+
export {
|
|
21
|
+
DEFAULT_ATTACHMENT_ACCEPT,
|
|
22
|
+
DEFAULT_MAX_ATTACHMENT_BYTES,
|
|
23
|
+
DEFAULT_MAX_ATTACHMENTS,
|
|
24
|
+
FEEDBACK_ATTACHMENT_ACCEPT,
|
|
25
|
+
FEEDBACK_PICKABLE_CATEGORIES,
|
|
26
|
+
FEEDBACK_REWORKABLE_STATUSES,
|
|
27
|
+
FEEDBACK_QUEUE_STATUSES,
|
|
28
|
+
FEEDBACK_AUTHOR_EDITABLE_STATUSES,
|
|
29
|
+
FEEDBACK_AWAITING_STATUSES,
|
|
30
|
+
FEEDBACK_DECIDED_STATUSES,
|
|
31
|
+
FEEDBACK_COMMENT_MAX,
|
|
32
|
+
FEEDBACK_REPLY_MAX,
|
|
33
|
+
appendRework,
|
|
34
|
+
reworkCount,
|
|
35
|
+
feedbackReworkCount,
|
|
36
|
+
splitBodyAttachments,
|
|
37
|
+
splitDescription,
|
|
38
|
+
replaceDescription,
|
|
39
|
+
isImageAttachment,
|
|
40
|
+
attachmentName,
|
|
41
|
+
type FeedbackEnvironment,
|
|
42
|
+
type FeedbackContext,
|
|
43
|
+
type FeedbackRecord,
|
|
44
|
+
} from "./feedback/feedback-record";
|
|
13
45
|
export * from "./feedback/feedback-labels";
|
|
14
|
-
export
|
|
15
|
-
|
|
46
|
+
export {
|
|
47
|
+
useFeedbackStatusUndo,
|
|
48
|
+
type FeedbackStatusPatch,
|
|
49
|
+
type FeedbackStatusMutateAsync,
|
|
50
|
+
type FeedbackStatusRow,
|
|
51
|
+
type FeedbackStatusChange,
|
|
52
|
+
type FeedbackStatusUndoOptions,
|
|
53
|
+
} from "./feedback/feedback-status-undo";
|
|
54
|
+
export {
|
|
55
|
+
DEFAULT_FEEDBACK_SWIPE,
|
|
56
|
+
feedbackSwipePlan,
|
|
57
|
+
feedbackSwipeOmitShown,
|
|
58
|
+
type FeedbackSwipeAction,
|
|
59
|
+
type FeedbackSwipeBinding,
|
|
60
|
+
type FeedbackSwipeOptions,
|
|
61
|
+
} from "./feedback/feedback-swipe";
|
|
16
62
|
export * from "./feedback/feedback-menu";
|
|
17
63
|
export * from "./feedback/feedback-context";
|
|
18
64
|
export * from "./feedback/feedback-capture";
|
|
19
65
|
export * from "./feedback/feedback-submit";
|
|
20
|
-
export
|
|
21
|
-
|
|
66
|
+
export {
|
|
67
|
+
DEFAULT_FEEDBACK_PAGE_LABELS,
|
|
68
|
+
useFeedbackPageLabels,
|
|
69
|
+
isFeedbackAwaiting,
|
|
70
|
+
useFeedbackRenderDate,
|
|
71
|
+
FeedbackSubject,
|
|
72
|
+
useFeedbackColumns,
|
|
73
|
+
feedbackMobileGroupBy,
|
|
74
|
+
FeedbackMobileCard,
|
|
75
|
+
FeedbackAwaitingToggle,
|
|
76
|
+
FeedbackEmptyState,
|
|
77
|
+
type FeedbackPageLabels,
|
|
78
|
+
type FeedbackTableRow,
|
|
79
|
+
type FeedbackRenderDate,
|
|
80
|
+
type FeedbackSubjectProps,
|
|
81
|
+
type FeedbackColumnsOptions,
|
|
82
|
+
type UseFeedbackColumnsOptions,
|
|
83
|
+
type FeedbackMobileCardProps,
|
|
84
|
+
type FeedbackAwaitingToggleProps,
|
|
85
|
+
type FeedbackEmptyStateProps,
|
|
86
|
+
} from "./feedback/feedback-table";
|
|
87
|
+
export {
|
|
88
|
+
DEFAULT_FEEDBACK_DETAIL_LABELS,
|
|
89
|
+
FeedbackReworkSection,
|
|
90
|
+
FeedbackRowDetail,
|
|
91
|
+
type FeedbackDetailLabels,
|
|
92
|
+
type FeedbackRowAccess,
|
|
93
|
+
type FeedbackDetailPatch,
|
|
94
|
+
type FeedbackDetailUpdateAsync,
|
|
95
|
+
type FeedbackUpload,
|
|
96
|
+
type FeedbackReworkSend,
|
|
97
|
+
type FeedbackReworkSectionProps,
|
|
98
|
+
type FeedbackRowDetailProps,
|
|
99
|
+
} from "./feedback/feedback-row-detail";
|
|
22
100
|
export * from "./feedback/feedback-crash";
|
|
23
101
|
// 0.38.0: the public pages (§9.15) — the "Visible to others" switch, the list every user
|
|
24
102
|
// reads and one report opened.
|
|
25
|
-
export
|
|
103
|
+
export {
|
|
104
|
+
FeedbackPublicSwitch,
|
|
105
|
+
type FeedbackPublicSwitchRow,
|
|
106
|
+
type FeedbackPublicSwitchViewer,
|
|
107
|
+
type FeedbackPublicSwitchProps,
|
|
108
|
+
} from "./feedback/feedback-public-switch";
|
|
26
109
|
export * from "./feedback/feedback-public-list";
|
|
27
110
|
// 0.38.0: public feedback (docs/feedback-harmonization.md §9) — the shapes, the vote, the
|
|
28
111
|
// comment thread, the replies' timeline and composer.
|
|
@@ -31,45 +114,3 @@ export * from "./feedback/feedback-vote-button";
|
|
|
31
114
|
export * from "./feedback/feedback-comment-thread";
|
|
32
115
|
export * from "./feedback/feedback-replies";
|
|
33
116
|
export * from "./feedback/feedback-entry-file";
|
|
34
|
-
// 0.52: the slice's share of the 55 names no app reads (refactor audit 2026-10-30, API-4,
|
|
35
|
-
// decision 4), tagged on their specifiers as the barrel's are — the modules keep them.
|
|
36
|
-
export {
|
|
37
|
-
/** @deprecated 0.52 — `appendRework`, which writes the line (API-4); removed in 0.53 */
|
|
38
|
-
feedbackAttachmentLine,
|
|
39
|
-
} from "./feedback/feedback-record";
|
|
40
|
-
export {
|
|
41
|
-
/** @deprecated 0.52 — `useFeedbackStatusUndo`, which keeps its Undo that long (API-4); removed in 0.53 */
|
|
42
|
-
FEEDBACK_UNDO_DURATION,
|
|
43
|
-
} from "./feedback/feedback-status-undo";
|
|
44
|
-
export {
|
|
45
|
-
/** @deprecated 0.52 — `DEFAULT_FEEDBACK_SWIPE` and `feedbackSwipePlan`, which name the actions (API-4); removed in 0.53 */
|
|
46
|
-
FEEDBACK_SWIPE_ACTIONS,
|
|
47
|
-
} from "./feedback/feedback-swipe";
|
|
48
|
-
export {
|
|
49
|
-
/** @deprecated 0.52 — `useFeedbackColumns`, the same columns in the provider's words (API-4); removed in 0.53 */
|
|
50
|
-
feedbackColumns,
|
|
51
|
-
/** @deprecated 0.52 — `useFeedbackColumns`, whose submitter cell reads it (API-4); removed in 0.53 */
|
|
52
|
-
feedbackSubmitter,
|
|
53
|
-
/** @deprecated 0.52 — `useFeedbackColumns`, whose submitter cell reads it (API-4); removed in 0.53 */
|
|
54
|
-
feedbackSubmitterEmail,
|
|
55
|
-
/** @deprecated 0.52 — `useFeedbackColumns`, whose environment cell reads it (API-4); removed in 0.53 */
|
|
56
|
-
feedbackEnvironment,
|
|
57
|
-
} from "./feedback/feedback-table";
|
|
58
|
-
export {
|
|
59
|
-
/** @deprecated 0.52 — `FeedbackRowDetail`, which links the page itself (API-4); removed in 0.53 */
|
|
60
|
-
feedbackPageUrl,
|
|
61
|
-
/** @deprecated 0.52 — `FeedbackRowDetail` and the table's URL cell, which link only a page's path and keep one-shot pages as text (the 0.52 code review's guard, which an app has no helper for); removed in 0.53 */
|
|
62
|
-
feedbackPageHref,
|
|
63
|
-
/** @deprecated 0.52 — `FeedbackRowDetail` and the table's URL cell, which show the page themselves; removed in 0.53 */
|
|
64
|
-
feedbackPagePath,
|
|
65
|
-
/** @deprecated 0.52 — `FeedbackRowDetail`, which lists the attachments itself (API-4); removed in 0.53 */
|
|
66
|
-
feedbackAttachmentUrls,
|
|
67
|
-
/** @deprecated 0.52 — `FeedbackRowDetail`, which decides who may edit what (API-4); removed in 0.53 */
|
|
68
|
-
feedbackRowAccess,
|
|
69
|
-
/** @deprecated 0.52 — `FeedbackRowDetail`, which resolves its words itself (API-4); removed in 0.53 */
|
|
70
|
-
useFeedbackDetailLabels,
|
|
71
|
-
} from "./feedback/feedback-row-detail";
|
|
72
|
-
export {
|
|
73
|
-
/** @deprecated 0.52 — `FeedbackPublicSwitch`, which asks it (API-4); removed in 0.53 */
|
|
74
|
-
feedbackPublicSwitchAllowed,
|
|
75
|
-
} from "./feedback/feedback-public-switch";
|