@stealthscale/component-feedback 0.2.1 → 0.2.3

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 (37) hide show
  1. package/dist/cyclonedx/bom.json +1 -1
  2. package/dist/index.js +1 -1825
  3. package/dist/pages/alert/alert.js +223 -0
  4. package/dist/pages/alert/alert.props.js +3 -0
  5. package/dist/pages/empty-state/empty-state.js +96 -0
  6. package/dist/pages/empty-state/empty-state.props.js +3 -0
  7. package/dist/pages/loader/loader.js +359 -0
  8. package/dist/pages/loader/loader.props.js +3 -0
  9. package/dist/pages/meter/meter.js +785 -0
  10. package/dist/pages/meter/meter.props.js +3 -0
  11. package/dist/pages/pages.json +115 -0
  12. package/dist/pages/progress/progress.js +550 -0
  13. package/dist/pages/progress/progress.props.js +3 -0
  14. package/dist/pages/progress-circle/progress-circle.js +329 -0
  15. package/dist/pages/progress-circle/progress-circle.props.js +3 -0
  16. package/dist/pages/skeleton/skeleton.js +94 -0
  17. package/dist/pages/skeleton/skeleton.props.js +3 -0
  18. package/dist/pages/skeleton-text/skeleton-text.js +81 -0
  19. package/dist/pages/skeleton-text/skeleton-text.props.js +3 -0
  20. package/dist/pages/spinner/spinner.js +186 -0
  21. package/dist/pages/spinner/spinner.props.js +3 -0
  22. package/dist/pages/toast/toast.js +427 -0
  23. package/dist/pages/toast/toast.props.js +3 -0
  24. package/dist/shared-Xc-n0bn7.js +1826 -0
  25. package/dist/theme.js +27 -13
  26. package/locales/en/specimen/alert.json +37 -0
  27. package/locales/en/specimen/empty-state.json +10 -0
  28. package/locales/en/specimen/loader.json +30 -0
  29. package/locales/en/specimen/meter.json +81 -0
  30. package/locales/en/specimen/progress-circle.json +41 -0
  31. package/locales/en/specimen/progress.json +66 -0
  32. package/locales/en/specimen/skeleton-text.json +12 -0
  33. package/locales/en/specimen/skeleton.json +18 -0
  34. package/locales/en/specimen/spinner.json +33 -0
  35. package/locales/en/specimen/toast.json +79 -0
  36. package/package.json +8 -7
  37. /package/dist/{recipe-CX1gSsN7.js → recipes-CX1gSsN7.js} +0 -0
package/dist/theme.js CHANGED
@@ -1,14 +1,29 @@
1
- import { a as recipe$6, d as recipe$4, f as recipe$3, i as recipe$7, l as recipe$2, n as recipe, r as recipe$1, t as recipe$8, u as recipe$5 } from "./recipe-CX1gSsN7.js";
1
+ import { a as recipe$6, d as recipe$4, f as recipe$3, i as recipe$7, l as recipe$2, n as recipe, r as recipe$1, t as recipe$8, u as recipe$5 } from "./recipes-CX1gSsN7.js";
2
2
  import { definePreset } from "@stealthscale/theme/authoring";
3
- //#region src/theme.ts
4
- /**
5
- * Registers every recipe in the package in the preset an application's style compiler installs.
6
- *
7
- * @remarks
8
- * The list is written by hand. `theme.spec.ts` fails when a recipe file is missing from it, so
9
- * no generator writes it.
10
- */
11
- var theme_default = definePreset({
3
+ //#endregion
4
+ const theme_default$published = ((preset) => {
5
+ const extend = preset.theme.extend;
6
+ return {
7
+ ...preset,
8
+ theme: {
9
+ ...preset.theme,
10
+ extend: {
11
+ ...extend,
12
+ "recipes": {
13
+ ...extend["recipes"],
14
+ "skeleton": {
15
+ ...extend["recipes"]["skeleton"],
16
+ staticCss: [...extend["recipes"]["skeleton"].staticCss ?? []]
17
+ },
18
+ "spinner": {
19
+ ...extend["recipes"]["spinner"],
20
+ staticCss: [...extend["recipes"]["spinner"].staticCss ?? [], { "size": ["inherit"] }]
21
+ }
22
+ }
23
+ }
24
+ }
25
+ };
26
+ })(definePreset({
12
27
  name: "@stealthscale/component-feedback",
13
28
  theme: { extend: {
14
29
  recipes: {
@@ -25,6 +40,5 @@ var theme_default = definePreset({
25
40
  toast: recipe$8
26
41
  }
27
42
  } }
28
- });
29
- //#endregion
30
- export { theme_default as default };
43
+ }));
44
+ export { theme_default$published as default };
@@ -0,0 +1,37 @@
1
+ {
2
+ "about": "A notice the reader needs to act on or know about: an icon, a title, a description and a close trigger.",
3
+ "declined": "The card was declined and nothing was charged.",
4
+ "dismiss": "Dismiss {{name}}",
5
+ "edge": {
6
+ "about": "A rule in the palette's solid color along one edge. The end edge is logical: the right edge in a left-to-right document and the left edge in a right-to-left one.",
7
+ "title": "Edges"
8
+ },
9
+ "failed": "Payment failed",
10
+ "layout": {
11
+ "about": "The description stacked under the title, and on the same line after it.",
12
+ "title": "Layouts"
13
+ },
14
+ "motion": {
15
+ "about": "The entry animation of the alert. Under reduced motion the alert appears without it.",
16
+ "title": "Motion"
17
+ },
18
+ "radius": {
19
+ "about": "Every corner.",
20
+ "title": "Corners"
21
+ },
22
+ "restored": "Your draft was restored from Tuesday.",
23
+ "saved": "Changes saved",
24
+ "size": {
25
+ "about": "Every size. The size sets the text style, the inset, the gap and the icon box. The close trigger is 1.5em square and at least 24px.",
26
+ "title": "Sizes"
27
+ },
28
+ "status": {
29
+ "about": "Every status in the subtle look. The status sets the palette only, and the title states the severity in words.",
30
+ "title": "Statuses"
31
+ },
32
+ "title": "Alert",
33
+ "variant": {
34
+ "about": "Every look in the error status. The close trigger takes the alert's ink, so it takes the contrast ink on the solid look.",
35
+ "title": "Looks"
36
+ }
37
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "about": "The panel a surface renders when it has no content: a mark, a heading and a sentence about what to do next.",
3
+ "description": "Send your first one to get started.",
4
+ "none": "No invoices yet",
5
+ "size": {
6
+ "about": "Every size. The size sets the panel's inset, the gap, the mark and the title. The description stays at the small body size.",
7
+ "title": "Sizes"
8
+ },
9
+ "title": "Empty state"
10
+ }
@@ -0,0 +1,30 @@
1
+ {
2
+ "about": "Shows that something is loading, beside words or over the content it replaces. Over content, the loader hides it and keeps its box, so the layout does not shift when the content returns.",
3
+ "button": {
4
+ "about": "A button loaded and loading. The label is hidden and keeps its width, so the button does not resize when the save starts or ends.",
5
+ "title": "In a button"
6
+ },
7
+ "ledger": "Matched against the ledger, then written back.",
8
+ "lines": "Four hundred lines",
9
+ "matching": "Matching",
10
+ "palette": {
11
+ "about": "The spinner in each semantic palette's solid color. Without a palette the spinner takes the ink of the surrounding text.",
12
+ "title": "Palettes"
13
+ },
14
+ "placement": {
15
+ "about": "The spinner before or after its words. Both stay on one line in any container.",
16
+ "title": "Placement"
17
+ },
18
+ "save": "Save changes",
19
+ "saving": "Saving changes",
20
+ "scrim": {
21
+ "about": "The overlay's fill over a card that is loading. `veil` keeps the content visible behind the spinner, `glass` blurs it, and `none` leaves it unchanged.",
22
+ "title": "Scrims"
23
+ },
24
+ "settled": "£17,500.40 settled",
25
+ "title": "Loader",
26
+ "value": {
27
+ "about": "A value loaded and loading. The spinner is centred over the hidden value, and screen readers read the label `Loading` in its place.",
28
+ "title": "Over a value"
29
+ }
30
+ }
@@ -0,0 +1,81 @@
1
+ {
2
+ "about": "Shows a measurement within a known range: storage used, seats taken, a password's strength. The track is the meter a screen reader reports, named by the label. A meter has a value and moves only when its caller measures again, which is what sets it apart from a progress bar. Every part but the root is the progress bar's.",
3
+ "capacity": {
4
+ "about": "A disk's used space split into its parts. `Meter.Segment` fills the track once per part, in the order the parts render, each as wide as its share of the disk's size, and the rest of the track is the free space. Each part takes the theme's series color at its place, the colors a chart gives its series, so neighbouring parts differ in every theme. A key of the data package's `ColorSwatch` names each color with its amount. The meter's value is the used space, the parts' sum.",
5
+ "apps": "Apps {{value, number}} GB",
6
+ "label": "Storage",
7
+ "other": "Other {{value, number}} GB",
8
+ "photos": "Photos {{value, number}} GB",
9
+ "system": "System {{value, number}} GB",
10
+ "title": "Parts of a capacity",
11
+ "value": "{{used, number}} of {{size, number}} GB"
12
+ },
13
+ "layout": {
14
+ "about": "Stacked puts the label and the value above the track. Inline puts them on the track's row, and the track takes the room the words leave.",
15
+ "title": "Layouts"
16
+ },
17
+ "limits": {
18
+ "about": "A plan's usage. Each meter's palette comes from the caller's own threshold, warning from 75% and error from 90%, because a meter has no judgement of its own: 90% is good news for a download and bad news for a disk. The words state the count, and `aria-valuetext` on the track states it too.",
19
+ "title": "Usage against limits"
20
+ },
21
+ "palette": {
22
+ "about": "Every palette in both looks. The outline look lays the range on a muted ground with an inset line, and the subtle look on the palette's muted role.",
23
+ "title": "Palettes and looks"
24
+ },
25
+ "shape": {
26
+ "about": "The ends of the track, which the range takes too: square, rounded or full, on the thickest track.",
27
+ "title": "Shapes"
28
+ },
29
+ "shares": {
30
+ "about": "A whole split into shares: the accounts on each plan. `max` is the total, so the segments fill the track. `aria-valuetext` on the track lists the shares through `Intl.ListFormat`, because a meter at 100% tells a screen reader nothing about the split.",
31
+ "growth": "Growth {{share}}",
32
+ "label": "Accounts by plan",
33
+ "scale": "Scale {{share}}",
34
+ "starter": "Starter {{share}}",
35
+ "title": "Shares of a whole",
36
+ "value_one": "{{count, number}} account",
37
+ "value_other": "{{count, number}} accounts"
38
+ },
39
+ "size": {
40
+ "about": "The size is the thickness of the track: 4, 6, 8, 12 and 16px. The label and the value keep the label style at every size.",
41
+ "title": "Sizes"
42
+ },
43
+ "storage": "Storage used",
44
+ "strength": {
45
+ "fair": "Fair",
46
+ "good": "Good",
47
+ "label": "Password strength",
48
+ "none": "Too short",
49
+ "password": "New password",
50
+ "strong": "Strong",
51
+ "weak": "Weak"
52
+ },
53
+ "target": {
54
+ "about": "Measures against their targets. `Meter.Marker` crosses the track at the target, and `max` is the larger of the target and the value, so a measure past its target fills the track and still reads as more than the target. The palette is the caller's judgement: deals past their target take success, and spend past 90% of its budget takes warning. The words state both numbers, and `aria-valuetext` on the track states them too, because the marker is hidden from a screen reader.",
55
+ "deals": "Deals closed this quarter",
56
+ "spend": "Cloud spend this month, €",
57
+ "spoken": "{{value, number}}, target {{target, number}}",
58
+ "title": "Against a target",
59
+ "trials": "Trials started this month",
60
+ "value": "{{value, number}} / {{target, number}}"
61
+ },
62
+ "title": "Meter",
63
+ "usage": {
64
+ "requests": {
65
+ "label": "API requests this month",
66
+ "value": "{{value, number}} of {{max, number}}"
67
+ },
68
+ "seats": {
69
+ "label": "Seats",
70
+ "value": "{{value, number}} of {{max, number}}"
71
+ },
72
+ "storage": {
73
+ "label": "Storage",
74
+ "value": "{{value, number}} of {{max, number}} GB"
75
+ }
76
+ },
77
+ "words": {
78
+ "about": "A password's strength from 0 to 4 as the reader types. The words are the value text and the track's `aria-valuetext`, so a screen reader hears Strong rather than 100%, and the palette follows the score.",
79
+ "title": "A value in words"
80
+ }
81
+ }
@@ -0,0 +1,41 @@
1
+ {
2
+ "about": "Reports how far a task has come as a ring, with the value in its middle. The ring is the progress bar a screen reader reports, and the label names it. For a value the machine does not know, a quarter arc turns.",
3
+ "checklist": "Workspace set-up",
4
+ "counted": {
5
+ "about": "`max` counts the steps. The ring's middle shows `3/5` as children of the value text, and `aria-valuetext` on the ring states the count in words.",
6
+ "title": "Counting steps"
7
+ },
8
+ "layout": {
9
+ "about": "Stacked puts the label under the ring. Inline puts it beside the ring, as in a list row.",
10
+ "title": "Layouts"
11
+ },
12
+ "palette": {
13
+ "about": "The scene crosses every palette with both looks. The outline look strokes the track in the muted ground, and the subtle look in the palette's muted role.",
14
+ "title": "Palettes and looks"
15
+ },
16
+ "quota": {
17
+ "label": "Storage used",
18
+ "used": "{{used}} of {{total}} GB"
19
+ },
20
+ "shape": {
21
+ "about": "`shape` rounds or squares the ends of the range. The scene shows both on the thickest ring.",
22
+ "title": "Shapes"
23
+ },
24
+ "size": {
25
+ "about": "The ring is 24, 32, 40, 48 and 64px wide and 4, 4, 4, 6 and 8px thick. From `md` up the value shows in the ring's middle, in the largest text style whose \"100%\" fits inside the ring. The smaller rings hide it. The ring's `aria-valuetext` states the value at every size.",
26
+ "title": "Sizes"
27
+ },
28
+ "steps_one": "{{count}} of {{total}} step done",
29
+ "steps_other": "{{count}} of {{total}} steps done",
30
+ "syncing": "Syncing mail",
31
+ "title": "Progress circle",
32
+ "unknown": {
33
+ "about": "A `null` value means the end is not known. A quarter arc turns once every 1.2 seconds, and the ring leaves out `aria-valuenow`. For a reader who asked for less motion, the ring stops and the range is a dashed line around the whole ring.",
34
+ "title": "Value unknown"
35
+ },
36
+ "units": {
37
+ "about": "`max` sets the range in gigabytes. The middle shows the share, and `aria-valuetext` states the amount used.",
38
+ "title": "Counting in its own units"
39
+ },
40
+ "upload": "Uploading the report"
41
+ }
@@ -0,0 +1,66 @@
1
+ {
2
+ "about": "Reports how far a task has come. The track is the progress bar a screen reader reports, named by the label, and for a value the machine does not know a segment crosses the track.",
3
+ "animated": {
4
+ "about": "The stripes move at 40px a second while the work runs, so a value that updates slowly still reads as work in progress. They stop moving for a reader who asked for less motion.",
5
+ "title": "Moving stripes"
6
+ },
7
+ "bare": {
8
+ "about": "A bar without a label is named by `aria-label` on the track, as in a player's position under its controls. `aria-valuetext` states the position in minutes.",
9
+ "title": "Without words"
10
+ },
11
+ "effect": {
12
+ "about": "A halo around the range in the palette's solid. `pulse` animates it and stops for a reader who asked for less motion.",
13
+ "title": "Effects"
14
+ },
15
+ "imported": "Rows imported",
16
+ "layout": {
17
+ "about": "Stacked puts the label and the value above the track. Inline puts them on the track's row, the shape a bar takes in a table row or at the foot of a card, and the track takes the room the words leave.",
18
+ "title": "Layouts"
19
+ },
20
+ "outcomes": {
21
+ "about": "A test run split by outcome while it runs. `Progress.Segment` fills the track with the passed, failed and skipped tests, each in the palette its `color` states, and the rest of the track is the tests still to run. The value is the tests run so far, the segments' sum, and a key of the data package's `Status` names each palette with its count.",
22
+ "failed": "{{count, number}} failed",
23
+ "label": "Test run",
24
+ "passed": "{{count, number}} passed",
25
+ "skipped": "{{count, number}} skipped",
26
+ "title": "Outcomes while it runs",
27
+ "value": "{{run, number}} of {{tests, number}}"
28
+ },
29
+ "palette": {
30
+ "about": "Every palette in both looks. The outline look lays the range on a muted ground with an inset line, and the subtle look on the palette's muted role. A palette has no meaning of its own, so the label has to agree with it.",
31
+ "title": "Palettes and looks"
32
+ },
33
+ "plan": {
34
+ "about": "A migration against the share its plan expects by today. `Progress.Marker` crosses the track at the planned share, and the bar takes the warning palette while it is behind. The words and `aria-valuetext` state both shares, because the marker is hidden from a screen reader.",
35
+ "label": "Migrating customer records",
36
+ "spoken": "{{done}}% done, {{planned}}% planned by today",
37
+ "title": "Against a plan",
38
+ "value": "{{done}}%, plan {{planned}}%"
39
+ },
40
+ "playback": "Playback position",
41
+ "played": "2:41 of 4:05",
42
+ "preparing": "Preparing the export",
43
+ "reconciling": "Reconciling payouts",
44
+ "rows": "2,650 of 4,200",
45
+ "shape": {
46
+ "about": "The ends of the track, which the range takes too: square, rounded or full, on the thickest track.",
47
+ "title": "Shapes"
48
+ },
49
+ "size": {
50
+ "about": "The size is the thickness of the track: 4, 6, 8, 12 and 16px. The label and the value keep the label style at every size, so a thin bar under its words still reads as one thing.",
51
+ "title": "Sizes"
52
+ },
53
+ "striped": {
54
+ "about": "Stripes over the range in the palette's contrast ink at a quarter strength.",
55
+ "title": "Stripes"
56
+ },
57
+ "title": "Progress",
58
+ "unknown": {
59
+ "about": "A `null` value means the end is not known. A segment crosses the track once every 1.2 seconds and the value text is empty, so the bar never claims a share it does not know. For a reader who asked for less motion the segment spreads over the whole track and stops. The track reports no `aria-valuenow`.",
60
+ "title": "Value unknown"
61
+ },
62
+ "units": {
63
+ "about": "`min` and `max` set the range in the units the work is measured in. The words over the bar and `aria-valuetext` on the track state the count, because the bar itself reports a share.",
64
+ "title": "Counting in its own units"
65
+ }
66
+ }
@@ -0,0 +1,12 @@
1
+ {
2
+ "about": "A placeholder paragraph with one bar per line and a shorter last bar.",
3
+ "lines": {
4
+ "about": "One, three and six lines. Each bar is one line height tall, and the bars are half a line height apart.",
5
+ "title": "Lines"
6
+ },
7
+ "motion": {
8
+ "about": "Every motion of the skeleton recipe, applied to each bar.",
9
+ "title": "Motion"
10
+ },
11
+ "title": "Skeleton text"
12
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "about": "A placeholder over content that is still loading, at the size of the content it wraps.",
3
+ "loading": {
4
+ "about": "The loaded card and the placeholder over it. Wrap the content in the skeleton instead of replacing it, so the layout does not shift when the content arrives.",
5
+ "title": "Loading"
6
+ },
7
+ "motion": {
8
+ "about": "Every motion: none, pulse and shimmer. The theme stops both animations under reduced motion.",
9
+ "title": "Motion"
10
+ },
11
+ "name": "Ada Lovelace",
12
+ "radius": {
13
+ "about": "Every corner of the placeholder.",
14
+ "title": "Corners"
15
+ },
16
+ "role": "Analyst",
17
+ "title": "Skeleton"
18
+ }
@@ -0,0 +1,33 @@
1
+ {
2
+ "about": "Shows that work is running when there is no progress to report. Where the work reports how far along it is, show a progress indicator instead. The spinner has no role and no text, so write the words the wait needs beside it and set `aria-busy` on the region that is waiting.",
3
+ "button": {
4
+ "about": "A spinner at `inherit` in a disabled button, in three looks. With the palette at `current`, the arc takes the button's label ink in each one.",
5
+ "title": "In a button"
6
+ },
7
+ "effect": {
8
+ "about": "A halo in the palette's solid at half opacity: `glow` holds still and `pulse` breathes. Both stop moving when the reader prefers reduced motion.",
9
+ "title": "Effects"
10
+ },
11
+ "inline": {
12
+ "about": "At `inherit` the spinner is as tall as the text it sits in, so the line keeps its height at every text size.",
13
+ "title": "In a line of text"
14
+ },
15
+ "palette": {
16
+ "about": "The arc in each semantic palette's solid color. The theme engine keeps every solid at 3:1 or more against the page. `current` takes the ink of the surrounding text.",
17
+ "title": "Palettes"
18
+ },
19
+ "saving": "Saving",
20
+ "size": {
21
+ "about": "Every step of the icon scale, and `inherit`, which takes the height of the surrounding text.",
22
+ "title": "Sizes"
23
+ },
24
+ "stroke": {
25
+ "about": "The theme's three stroke widths, and `heavy` for a thicker ring. The stroke is a border width, so it keeps its weight at every size.",
26
+ "title": "Strokes"
27
+ },
28
+ "title": "Spinner",
29
+ "track": {
30
+ "about": "The ring behind the arc, in the palette's muted color.",
31
+ "title": "Track"
32
+ }
33
+ }
@@ -0,0 +1,79 @@
1
+ {
2
+ "about": "Raises a short message into a region fixed to an edge of the window, and removes it after its duration. A pointer resting on the region, or focus inside it, pauses every toast, and Alt+T moves focus to the region. A screen reader hears each new toast through the region's polite live region. A toast that is missed is gone, so nothing a reader needs is only in one.",
3
+ "dismiss": "Dismiss",
4
+ "kinds": {
5
+ "about": "The five types. The type sets the toast's palette, which the indicator reads, and its duration: 2 seconds for `success`, 5 for the others, and no timer for `loading`.",
6
+ "error": {
7
+ "description": "The bank could not verify the account.",
8
+ "show": "Error",
9
+ "title": "Payout held"
10
+ },
11
+ "info": {
12
+ "description": "ledger-2026-09.csv is in your downloads.",
13
+ "show": "Info",
14
+ "title": "Export ready"
15
+ },
16
+ "loading": {
17
+ "description": "Matching 400 lines against the bank.",
18
+ "show": "Loading",
19
+ "title": "Reconciling"
20
+ },
21
+ "success": {
22
+ "description": "€1,240.00 is on its way to NL91 ABNA 0417 1643 00.",
23
+ "show": "Success",
24
+ "title": "Payout sent"
25
+ },
26
+ "title": "Kinds",
27
+ "warning": {
28
+ "description": "The card ending in 4242 expires this month.",
29
+ "show": "Warning",
30
+ "title": "Card expiring"
31
+ }
32
+ },
33
+ "promise": {
34
+ "about": "`promise` raises one loading toast and rewrites it as the work settles: the success in its place, or the error. The first trigger settles after 2 seconds, the second fails after 2 seconds.",
35
+ "error": "Export failed",
36
+ "failed": "Nothing was written.",
37
+ "fails": "Export, failing",
38
+ "file": "ledger-2026-09.csv",
39
+ "lines": "400 lines",
40
+ "loading": "Exporting the ledger",
41
+ "succeeds": "Export, settling",
42
+ "success": "Exported",
43
+ "title": "Promise"
44
+ },
45
+ "queue": {
46
+ "about": "The toaster shows 5 toasts at a time and queues the rest. The trigger raises 8 at once: 5 show, and the others arrive as those close.",
47
+ "description": "Line {{line}} could not be matched.",
48
+ "heading": "Line not matched",
49
+ "show": "Report 8 failures",
50
+ "title": "Queue"
51
+ },
52
+ "region": {
53
+ "about": "The region an application renders once, at its root, for one toaster. Its render function returns each toast's parts: the indicator's glyph by type, the title, the description, the action and the close button. A trigger anywhere in the application raises into the same toaster.",
54
+ "description": "Your changes to the payout schedule are saved.",
55
+ "heading": "Schedule saved",
56
+ "show": "Show a toast",
57
+ "title": "Region"
58
+ },
59
+ "sync": {
60
+ "about": "A toast raised with an id is rewritten in place through `update`. The report starts as a loading toast, changes its description after 1.5 seconds and turns into a success after 3.",
61
+ "done": "400 of 400 lines matched.",
62
+ "halfway": "200 of 400 lines matched.",
63
+ "heading": "Reconciling",
64
+ "matched": "Reconciled",
65
+ "show": "Reconcile the ledger",
66
+ "started": "Matching 400 lines.",
67
+ "title": "Updated in place"
68
+ },
69
+ "title": "Toast",
70
+ "undo": {
71
+ "about": "A toast with an action. A press on Undo runs the action, then dismisses the toast. The toast closes after 10 seconds, which gives a reader time to reach the button.",
72
+ "action": "Undo",
73
+ "description": "PO-2026-0731 is no longer scheduled.",
74
+ "heading": "Payout removed",
75
+ "restored": "Payout restored",
76
+ "show": "Remove the payout",
77
+ "title": "Action"
78
+ }
79
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stealthscale/component-feedback",
3
- "version": "0.2.1",
3
+ "version": "0.2.3",
4
4
  "description": "Draws the system reporting on itself: what is loading, what went wrong, what state a thing is in.",
5
5
  "keywords": [
6
6
  "components",
@@ -19,6 +19,7 @@
19
19
  "files": [
20
20
  "dist",
21
21
  "LICENSE",
22
+ "locales",
22
23
  "README.md"
23
24
  ],
24
25
  "type": "module",
@@ -43,16 +44,16 @@
43
44
  },
44
45
  "devDependencies": {
45
46
  "@arethetypeswrong/core": "^0.18",
46
- "@stealthscale/component-actions": "^0.2.1",
47
- "@stealthscale/component-layout": "^0.2.1",
48
- "@stealthscale/component-surfaces": "^0.1.1",
47
+ "@stealthscale/component-actions": "^0.2.3",
48
+ "@stealthscale/component-layout": "^0.2.2",
49
+ "@stealthscale/component-surfaces": "^0.1.2",
49
50
  "@stealthscale/hooks": "^0.3.0",
50
51
  "@stealthscale/theme": "^0.5.0",
51
52
  "@stealthscale/vite-config": "^0.8.0",
52
- "@stealthscale/vite-config-i18n": "^0.2.1",
53
+ "@stealthscale/vite-config-i18n": "^0.2.2",
53
54
  "@stealthscale/vite-config-react": "^0.9.1",
54
- "@stealthscale/vite-config-specimen": "^0.2.1",
55
- "@stealthscale/vite-config-theme": "^0.2.1",
55
+ "@stealthscale/vite-config-specimen": "^0.3.0",
56
+ "@stealthscale/vite-config-theme": "^0.3.0",
56
57
  "@stealthscale/vite-config-typescript": "^0.3.0",
57
58
  "@testing-library/react": "^16.3",
58
59
  "@types/react": "^19.3",