@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.
Files changed (193) hide show
  1. package/README.md +47 -54
  2. package/dist/billing/cancel-subscription.d.ts +5 -14
  3. package/dist/billing/cancel-subscription.js +1 -3
  4. package/dist/billing/cancel-subscription.js.map +1 -1
  5. package/dist/billing/plan-card.d.ts +5 -13
  6. package/dist/billing/plan-card.js +3 -11
  7. package/dist/billing/plan-card.js.map +1 -1
  8. package/dist/billing/plan-switch.d.ts +5 -14
  9. package/dist/billing/plan-switch.js +1 -3
  10. package/dist/billing/plan-switch.js.map +1 -1
  11. package/dist/chart.d.ts +3 -14
  12. package/dist/chart.js +64 -11
  13. package/dist/chart.js.map +1 -1
  14. package/dist/components/date-field.d.ts +1 -1
  15. package/dist/components/date-field.js.map +1 -1
  16. package/dist/components/date-picker.d.ts +1 -1
  17. package/dist/components/date-picker.js.map +1 -1
  18. package/dist/components/date-range-picker.d.ts +4 -17
  19. package/dist/components/date-range-picker.js +2 -2
  20. package/dist/components/date-range-picker.js.map +1 -1
  21. package/dist/components/nav-pills.d.ts +1 -1
  22. package/dist/components/nav-pills.js.map +1 -1
  23. package/dist/components/series-chart-axes.d.ts +1 -1
  24. package/dist/components/series-chart-axes.js.map +1 -1
  25. package/dist/components/series-chart.d.ts +64 -19
  26. package/dist/components/series-chart.js +2 -1
  27. package/dist/components/series-chart.js.map +1 -1
  28. package/dist/components/treemap-labels.d.ts +6 -1
  29. package/dist/components/treemap-labels.js +2 -2
  30. package/dist/components/treemap-labels.js.map +1 -1
  31. package/dist/components/treemap.d.ts +29 -4
  32. package/dist/components/treemap.js +22 -9
  33. package/dist/components/treemap.js.map +1 -1
  34. package/dist/data-table.d.ts +1 -6
  35. package/dist/data-table.js +1 -9
  36. package/dist/data-table.js.map +1 -1
  37. package/dist/demo/demo-countdown.d.ts +0 -5
  38. package/dist/demo/demo-countdown.js +0 -4
  39. package/dist/demo/demo-countdown.js.map +1 -1
  40. package/dist/eslint/index.js +1 -1
  41. package/dist/feedback/feedback-mutation.d.ts +11 -23
  42. package/dist/feedback/feedback-mutation.js +1 -9
  43. package/dist/feedback/feedback-mutation.js.map +1 -1
  44. package/dist/feedback/feedback-public-list.d.ts +1 -6
  45. package/dist/feedback/feedback-public-list.js +1 -2
  46. package/dist/feedback/feedback-public-list.js.map +1 -1
  47. package/dist/feedback/feedback-row-detail-labels.js +0 -8
  48. package/dist/feedback/feedback-row-detail-labels.js.map +1 -1
  49. package/dist/feedback/feedback-row-detail.d.ts +3 -50
  50. package/dist/feedback/feedback-row-detail.js +0 -8
  51. package/dist/feedback/feedback-row-detail.js.map +1 -1
  52. package/dist/feedback/feedback-status-undo.d.ts +3 -19
  53. package/dist/feedback/feedback-status-undo.js.map +1 -1
  54. package/dist/feedback/feedback-thread.d.ts +0 -9
  55. package/dist/feedback/feedback-thread.js.map +1 -1
  56. package/dist/feedback.d.ts +6 -40
  57. package/dist/feedback.js +88 -46
  58. package/dist/feedback.js.map +1 -1
  59. package/dist/i18n/defaults.js +0 -4
  60. package/dist/i18n/defaults.js.map +1 -1
  61. package/dist/i18n/german.js +2 -19
  62. package/dist/i18n/german.js.map +1 -1
  63. package/dist/i18n/kit-labels.d.ts +5 -14
  64. package/dist/i18n/kit-labels.js.map +1 -1
  65. package/dist/i18n/locales/en.js +2 -30
  66. package/dist/i18n/locales/en.js.map +3 -3
  67. package/dist/i18n/locales/es.js +2 -19
  68. package/dist/i18n/locales/es.js.map +1 -1
  69. package/dist/i18n/locales/fr.js +2 -19
  70. package/dist/i18n/locales/fr.js.map +1 -1
  71. package/dist/i18n/locales/hu.js +2 -19
  72. package/dist/i18n/locales/hu.js.map +1 -1
  73. package/dist/i18n/locales/it.js +2 -20
  74. package/dist/i18n/locales/it.js.map +1 -1
  75. package/dist/i18n/locales/zh.js +2 -19
  76. package/dist/i18n/locales/zh.js.map +1 -1
  77. package/dist/i18n/review.js +9 -4
  78. package/dist/i18n/review.js.map +1 -1
  79. package/dist/i18n/shared-labels.js +0 -1
  80. package/dist/i18n/shared-labels.js.map +1 -1
  81. package/dist/index.d.ts +15 -64
  82. package/dist/index.js +22 -102
  83. package/dist/index.js.map +1 -1
  84. package/dist/rhf/fields.d.ts +2 -2
  85. package/dist/rhf/fields.js.map +1 -1
  86. package/dist/search/search-index.d.ts +0 -6
  87. package/dist/search/search-index.js +0 -4
  88. package/dist/search/search-index.js.map +1 -1
  89. package/dist/search.d.ts +1 -8
  90. package/dist/search.js +2 -7
  91. package/dist/search.js.map +1 -1
  92. package/dist/shell/account-menu-language.d.ts +7 -21
  93. package/dist/shell/account-menu-language.js +1 -3
  94. package/dist/shell/account-menu-language.js.map +1 -1
  95. package/dist/shell/account-menu-text-size.d.ts +9 -23
  96. package/dist/shell/account-menu-text-size.js +2 -3
  97. package/dist/shell/account-menu-text-size.js.map +1 -1
  98. package/dist/shell/app-shell.d.ts +0 -10
  99. package/dist/shell/app-shell.js +1 -7
  100. package/dist/shell/app-shell.js.map +1 -1
  101. package/dist/shell/company-switcher.d.ts +1 -1
  102. package/dist/shell/company-switcher.js.map +1 -1
  103. package/dist/shell/dev-menu.d.ts +1 -1
  104. package/dist/shell/dev-menu.js.map +1 -1
  105. package/dist/shell/top-bar-parts-labels.d.ts +1 -1
  106. package/dist/shell/top-bar-parts-labels.js.map +1 -1
  107. package/dist/shell.d.ts +7 -29
  108. package/dist/shell.js +12 -42
  109. package/dist/shell.js.map +1 -1
  110. package/dist/sync.d.ts +2 -6
  111. package/dist/sync.js +2 -15
  112. package/dist/sync.js.map +1 -1
  113. package/dist/theme/chart-palette.d.ts +0 -5
  114. package/dist/theme/chart-palette.js +0 -2
  115. package/dist/theme/chart-palette.js.map +1 -1
  116. package/package.json +1 -1
  117. package/src/billing/cancel-subscription.tsx +5 -16
  118. package/src/billing/plan-card.tsx +7 -24
  119. package/src/billing/plan-switch.tsx +5 -16
  120. package/src/chart.ts +62 -13
  121. package/src/components/date-field.tsx +1 -1
  122. package/src/components/date-picker.tsx +0 -1
  123. package/src/components/date-range-picker.tsx +6 -22
  124. package/src/components/nav-pills.tsx +1 -1
  125. package/src/components/series-chart-axes.ts +6 -1
  126. package/src/components/series-chart.tsx +78 -21
  127. package/src/components/treemap-labels.ts +11 -3
  128. package/src/components/treemap.tsx +65 -12
  129. package/src/data-table.ts +1 -11
  130. package/src/demo/demo-countdown.ts +3 -8
  131. package/src/feedback/feedback-mutation.ts +12 -33
  132. package/src/feedback/feedback-public-list.tsx +1 -7
  133. package/src/feedback/feedback-row-detail-labels.ts +0 -8
  134. package/src/feedback/feedback-row-detail.tsx +8 -58
  135. package/src/feedback/feedback-status-undo.ts +4 -18
  136. package/src/feedback/feedback-thread.tsx +0 -10
  137. package/src/feedback.ts +89 -48
  138. package/src/i18n/defaults.ts +0 -4
  139. package/src/i18n/german.ts +2 -19
  140. package/src/i18n/kit-labels.tsx +5 -14
  141. package/src/i18n/locales/es.ts +2 -19
  142. package/src/i18n/locales/fr.ts +2 -19
  143. package/src/i18n/locales/hu.ts +2 -19
  144. package/src/i18n/locales/it.ts +2 -20
  145. package/src/i18n/locales/zh.ts +2 -19
  146. package/src/i18n/review.ts +9 -4
  147. package/src/i18n/shared-labels.ts +0 -1
  148. package/src/index.ts +30 -112
  149. package/src/rhf/fields.tsx +2 -2
  150. package/src/search/search-index.ts +0 -15
  151. package/src/search.ts +8 -8
  152. package/src/shell/account-menu-language.tsx +7 -27
  153. package/src/shell/account-menu-text-size.tsx +13 -32
  154. package/src/shell/app-shell.tsx +0 -13
  155. package/src/shell/company-switcher.tsx +1 -1
  156. package/src/shell/dev-menu.tsx +1 -1
  157. package/src/shell/top-bar-parts-labels.ts +1 -1
  158. package/src/shell.ts +17 -44
  159. package/src/sync.ts +2 -15
  160. package/src/theme/chart-palette.ts +0 -2
  161. package/tokens.css +4 -4
  162. package/dist/billing/dialog-close.d.ts +0 -29
  163. package/dist/billing/dialog-close.js +0 -8
  164. package/dist/billing/dialog-close.js.map +0 -1
  165. package/dist/components/field-sync-labels.d.ts +0 -3
  166. package/dist/components/field-sync-labels.js +0 -12
  167. package/dist/components/field-sync-labels.js.map +0 -1
  168. package/dist/components/field-sync.d.ts +0 -186
  169. package/dist/components/field-sync.js +0 -269
  170. package/dist/components/field-sync.js.map +0 -1
  171. package/dist/components/section-nav.d.ts +0 -44
  172. package/dist/components/section-nav.js +0 -33
  173. package/dist/components/section-nav.js.map +0 -1
  174. package/dist/components/sign-chip-labels.d.ts +0 -3
  175. package/dist/components/sign-chip-labels.js +0 -11
  176. package/dist/components/sign-chip-labels.js.map +0 -1
  177. package/dist/components/sign-chip.d.ts +0 -77
  178. package/dist/components/sign-chip.js +0 -47
  179. package/dist/components/sign-chip.js.map +0 -1
  180. package/dist/lib/isin.d.ts +0 -38
  181. package/dist/lib/isin.js +0 -36
  182. package/dist/lib/isin.js.map +0 -1
  183. package/dist/shell/role-switcher.d.ts +0 -28
  184. package/dist/shell/role-switcher.js +0 -31
  185. package/dist/shell/role-switcher.js.map +0 -1
  186. package/src/billing/dialog-close.ts +0 -34
  187. package/src/components/field-sync-labels.ts +0 -14
  188. package/src/components/field-sync.tsx +0 -504
  189. package/src/components/section-nav.tsx +0 -72
  190. package/src/components/sign-chip-labels.ts +0 -13
  191. package/src/components/sign-chip.tsx +0 -133
  192. package/src/lib/isin.ts +0 -72
  193. 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?: boolean;
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 && redactNames ? "" : undefined}
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={redactNames ? "" : undefined}
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(props: ComponentProps<typeof ChartTooltipContent>) {
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), shareText(total > 0 ? n.size / total : 0));
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
- () => <TreemapTooltip content={<Content hideLabel valueFormatter={format} />} anchor={anchor} />,
1104
- [Content, format, anchor],
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
- * The countdown at `now` — pure, for a test or a server-rendered value. See
55
- * {@link DemoCountdown} for the rounding and the thresholds.
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 in either of the forms the feedback parts take, run once (refactor
5
- * audit 2026-10-30, FLW-3).
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 used to take TanStack Query's `mutate` with a per-call `onSuccess`. TanStack
8
- * v5 calls per-call callbacks for the LATEST `mutate()` on an observer only — it
9
- * overwrites the options and detaches from the earlier mutation — so a second change sent
10
- * before the first PATCH answered (another swipe, another pill, the Undo itself) lost the
11
- * first change's Undo toast, and the detail's editor stayed open. The promise
12
- * `mutateAsync` returns settles for every call, whatever the observer does next.
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
- * Both forms are called the same way — the patch and `{ onSuccess }` — and the answer is
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
- (onOpenIdChange ?? onOpenChange)?.(id);
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, type FeedbackMutationCall } from "./feedback-mutation";
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
- * The page a report was filed on as the reporter had it — path + query + hash (keksdose
186
- * `localHref`: the query and hash carry the state, `?tab=import`, a drill-down). Read from
187
- * `context.url`, else `context.route`; a path-only `url` works. `null` when there is no
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?: FeedbackMutationCall<FeedbackDetailPatch>;
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 ({@link FeedbackDetailUpdate}, `update.mutate`) still fits, deprecated
521
- * since 0.52; the prop's one signature takes both. */
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, type FeedbackMutationCall } from "./feedback-mutation";
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` ({@link FeedbackStatusMutate}) still fits, deprecated since 0.52: with it
94
- * a second change before the first answered loses the first one's Undo. One signature
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: FeedbackMutationCall<FeedbackStatusPatch>,
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
- export * from "./feedback/feedback-record";
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 * from "./feedback/feedback-status-undo";
15
- export * from "./feedback/feedback-swipe";
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 * from "./feedback/feedback-table";
21
- export * from "./feedback/feedback-row-detail";
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 * from "./feedback/feedback-public-switch";
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";