@stealthscale/component-screen 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 (44) hide show
  1. package/dist/cyclonedx/bom.json +1 -1
  2. package/dist/index.d.ts +3 -3
  3. package/dist/index.js +1 -8216
  4. package/dist/pages/action-bar/action-bar.js +471 -0
  5. package/dist/pages/action-bar/action-bar.props.js +3 -0
  6. package/dist/pages/app-shell/app-shell.js +4899 -0
  7. package/dist/pages/app-shell/app-shell.props.js +3 -0
  8. package/dist/pages/floating-panel/floating-panel.js +995 -0
  9. package/dist/pages/floating-panel/floating-panel.props.js +3 -0
  10. package/dist/pages/locale-switcher/locale-switcher.js +180 -0
  11. package/dist/pages/locale-switcher/locale-switcher.props.js +3 -0
  12. package/dist/pages/page/page.js +2308 -0
  13. package/dist/pages/page/page.props.js +3 -0
  14. package/dist/pages/pages.json +123 -0
  15. package/dist/pages/section/section.js +1241 -0
  16. package/dist/pages/section/section.props.js +3 -0
  17. package/dist/pages/sidebar/sidebar.js +1743 -0
  18. package/dist/pages/sidebar/sidebar.props.js +3 -0
  19. package/dist/pages/splitter/splitter.js +1563 -0
  20. package/dist/pages/splitter/splitter.props.js +3 -0
  21. package/dist/pages/switcher/switcher.js +900 -0
  22. package/dist/pages/switcher/switcher.props.js +3 -0
  23. package/dist/pages/theme-switcher/theme-switcher.js +180 -0
  24. package/dist/pages/theme-switcher/theme-switcher.props.js +3 -0
  25. package/dist/pages/toolbar/toolbar.js +1045 -0
  26. package/dist/pages/toolbar/toolbar.props.js +3 -0
  27. package/dist/{recipe-sZAQY6Kq.js → recipes-Cmy1leBm.js} +312 -30
  28. package/dist/shared-DxlFabHA.js +9547 -0
  29. package/dist/shell.js +1 -165
  30. package/dist/theme.js +3 -4
  31. package/locales/en/specimen/action-bar.json +46 -0
  32. package/locales/en/specimen/app-shell.json +288 -0
  33. package/locales/en/specimen/floating-panel.json +70 -0
  34. package/locales/en/specimen/locale-switcher.json +15 -0
  35. package/locales/en/specimen/page.json +198 -0
  36. package/locales/en/specimen/section.json +91 -0
  37. package/locales/en/specimen/sidebar.json +87 -0
  38. package/locales/en/specimen/splitter.json +93 -0
  39. package/locales/en/specimen/switcher.json +61 -0
  40. package/locales/en/specimen/theme-switcher.json +15 -0
  41. package/locales/en/specimen/toolbar.json +80 -0
  42. package/package.json +25 -24
  43. package/dist/recipe-DRMsitrw.js +0 -283
  44. package/dist/root-qEh4u7y5.js +0 -1182
package/dist/shell.js CHANGED
@@ -1,166 +1,2 @@
1
- import { t as Root } from "./root-qEh4u7y5.js";
2
- import { c } from "react/compiler-runtime";
3
- import { token } from "@stealthscale/theme";
4
- import { jsx } from "react/jsx-runtime";
5
- import { ColorSwatch } from "@stealthscale/component-data";
6
- import { useLocale } from "@stealthscale/provider-locale";
7
- import { useThemeChoice } from "@stealthscale/provider-shell";
8
- //#region src/locale-switcher/endonym.ts
9
- /**
10
- * Writes a locale's name in its own language, and the short mark a switcher shows beside it.
11
- */
12
- /**
13
- * Matches the region and every subtag after the language in a tag.
14
- */
15
- const AFTER_LANGUAGE = /-.*$/u;
16
- /**
17
- * Returns a locale's name in its own language, `Nederlands` for `nl`, or the tag where the runtime
18
- * has no name for it.
19
- *
20
- * @remarks
21
- * `Intl.DisplayNames` runs with `fallback: "none"`, so it returns undefined for a tag it cannot
22
- * name, and it throws for a malformed tag. The function returns the tag in both cases.
23
- * @param tag - The locale, as a BCP 47 tag.
24
- * @returns The name in its own language, or the tag.
25
- */
26
- function endonymOf(tag) {
27
- try {
28
- return new Intl.DisplayNames([tag], {
29
- fallback: "none",
30
- type: "language"
31
- }).of(tag) ?? tag;
32
- } catch {
33
- return tag;
34
- }
35
- }
36
- /**
37
- * Returns a locale's language subtag in capitals, `NL` for `nl-BE`.
38
- *
39
- * @param tag - The locale, as a BCP 47 tag.
40
- * @returns The language subtag in capitals.
41
- */
42
- function markOf(tag) {
43
- return tag.replace(AFTER_LANGUAGE, "").toUpperCase();
44
- }
45
- //#endregion
46
- //#region src/locale-switcher/locale-switcher.tsx
47
- /**
48
- * Renders `Switcher.Root` with a row per locale on offer, and switches to the locale a person
49
- * picks.
50
- *
51
- * @param props - The control's name and the switcher's props.
52
- * @returns The switcher, or nothing where the application offers one locale.
53
- */
54
- function LocaleSwitcher(t0) {
55
- const $ = c(11);
56
- let props;
57
- let t1;
58
- if ($[0] !== t0) {
59
- ({label: t1, ...props} = t0);
60
- $[0] = t0;
61
- $[1] = props;
62
- $[2] = t1;
63
- } else {
64
- props = $[1];
65
- t1 = $[2];
66
- }
67
- const label = t1 === void 0 ? "Language" : t1;
68
- const { locale, locales, setLocale } = useLocale();
69
- if (locales.length < 2) return null;
70
- let t2;
71
- if ($[3] !== locales) {
72
- t2 = locales.map(_temp$1);
73
- $[3] = locales;
74
- $[4] = t2;
75
- } else t2 = $[4];
76
- let t3;
77
- if ($[5] !== label || $[6] !== locale || $[7] !== props || $[8] !== setLocale || $[9] !== t2) {
78
- t3 = /* @__PURE__ */ jsx(Root, {
79
- ...props,
80
- items: t2,
81
- label,
82
- onValueChange: setLocale,
83
- value: locale
84
- });
85
- $[5] = label;
86
- $[6] = locale;
87
- $[7] = props;
88
- $[8] = setLocale;
89
- $[9] = t2;
90
- $[10] = t3;
91
- } else t3 = $[10];
92
- return t3;
93
- }
94
- function _temp$1(tag) {
95
- return {
96
- label: endonymOf(tag),
97
- mark: markOf(tag),
98
- value: tag
99
- };
100
- }
101
- //#endregion
102
- //#region src/theme-switcher/theme-switcher.tsx
103
- /**
104
- * Colour of a theme's swatch: the primary solid of the theme in the swatch's `data-theme`.
105
- */
106
- const PRIMARY = token.var("colors.primary.solid");
107
- /**
108
- * Renders `Switcher.Root` with a row per theme on offer, and switches to the theme a person picks.
109
- *
110
- * @param props - The control's name and the switcher's props.
111
- * @returns The switcher, or nothing where the application offers fewer than two themes.
112
- */
113
- function ThemeSwitcher(t0) {
114
- const $ = c(11);
115
- let props;
116
- let t1;
117
- if ($[0] !== t0) {
118
- ({label: t1, ...props} = t0);
119
- $[0] = t0;
120
- $[1] = props;
121
- $[2] = t1;
122
- } else {
123
- props = $[1];
124
- t1 = $[2];
125
- }
126
- const label = t1 === void 0 ? "Theme" : t1;
127
- const { setTheme, theme, themes } = useThemeChoice();
128
- if (themes.length < 2) return null;
129
- let t2;
130
- if ($[3] !== themes) {
131
- t2 = themes.map(_temp);
132
- $[3] = themes;
133
- $[4] = t2;
134
- } else t2 = $[4];
135
- let t3;
136
- if ($[5] !== label || $[6] !== props || $[7] !== setTheme || $[8] !== t2 || $[9] !== theme) {
137
- t3 = /* @__PURE__ */ jsx(Root, {
138
- ...props,
139
- items: t2,
140
- label,
141
- onValueChange: setTheme,
142
- value: theme
143
- });
144
- $[5] = label;
145
- $[6] = props;
146
- $[7] = setTheme;
147
- $[8] = t2;
148
- $[9] = theme;
149
- $[10] = t3;
150
- } else t3 = $[10];
151
- return t3;
152
- }
153
- function _temp(name) {
154
- return {
155
- label: name,
156
- mark: /* @__PURE__ */ jsx(ColorSwatch, {
157
- "data-theme": name,
158
- shape: "circle",
159
- size: "inherit",
160
- value: PRIMARY
161
- }),
162
- value: name
163
- };
164
- }
165
- //#endregion
1
+ import { n as LocaleSwitcher, t as ThemeSwitcher } from "./shared-DxlFabHA.js";
166
2
  export { LocaleSwitcher, ThemeSwitcher };
package/dist/theme.js CHANGED
@@ -1,5 +1,4 @@
1
- import { d as recipe$1, i as recipe$4, l as recipe$3, n as recipe$6, r as recipe$5, t as recipe$7, u as recipe$2, w as recipe } from "./recipe-sZAQY6Kq.js";
2
- import { t as recipe$8 } from "./recipe-DRMsitrw.js";
1
+ import { O as recipe, a as recipe$4, h as recipe$1, i as recipe$5, m as recipe$2, n as recipe$7, r as recipe$6, t as recipe$8, u as recipe$3 } from "./recipes-Cmy1leBm.js";
3
2
  import { definePreset } from "@stealthscale/theme/authoring";
4
3
  //#region src/theme.ts
5
4
  /**
@@ -20,8 +19,8 @@ var theme_default = definePreset({
20
19
  section: recipe$4,
21
20
  sidebar: recipe$5,
22
21
  splitter: recipe$6,
23
- switcher: recipe$8,
24
- toolbar: recipe$7
22
+ switcher: recipe$7,
23
+ toolbar: recipe$8
25
24
  } } }
26
25
  });
27
26
  //#endregion
@@ -0,0 +1,46 @@
1
+ {
2
+ "about": "The action bar is fixed to the bottom of the window and offers the actions for what a person has selected. It opens while anything is selected and leaves focus on the selection. A screen reader announces it once as it opens. Escape inside the bar and its close button clear the selection, and focus returns to the checkbox that opened it.",
3
+ "clear": "Clear selection",
4
+ "photos": {
5
+ "about": "The bar at the end of the window offers four actions. In a narrow window the toolbar moves the two actions without an icon into its More menu and shows only the icon of Download. Share is the primary action and keeps its words.",
6
+ "album": "Add to album",
7
+ "announcement": "Photo actions available",
8
+ "count": "{{count}} selected",
9
+ "done_one": "{{action}}: {{count}} photo.",
10
+ "done_other": "{{action}}: {{count}} photos.",
11
+ "download": "Download",
12
+ "label": "Actions for the selected photos",
13
+ "more": "More actions",
14
+ "names": {
15
+ "bridge": "Bridge at night",
16
+ "garden": "Roof garden",
17
+ "harbour": "Harbour at dawn",
18
+ "market": "Flower market",
19
+ "square": "Town square",
20
+ "tower": "Clock tower"
21
+ },
22
+ "share": "Share",
23
+ "title": "Folding",
24
+ "trash": "Move to trash"
25
+ },
26
+ "placement": {
27
+ "about": "Placement puts the bar at the start, in the middle or at the end of the bottom edge of the window. Start and end follow the writing direction. Select an invoice in a cell to open its bar.",
28
+ "title": "Placement"
29
+ },
30
+ "selection": {
31
+ "count": "{{count}} selected",
32
+ "download": {
33
+ "done_one": "Downloaded {{count}} invoice.",
34
+ "done_other": "Downloaded {{count}} invoices.",
35
+ "label": "Download"
36
+ },
37
+ "invoice": "Invoice {{number}}",
38
+ "label": "Actions for the selected invoices",
39
+ "mark": {
40
+ "done_one": "Marked {{count}} invoice as paid.",
41
+ "done_other": "Marked {{count}} invoices as paid.",
42
+ "label": "Mark as paid"
43
+ }
44
+ },
45
+ "title": "Action bar"
46
+ }
@@ -0,0 +1,288 @@
1
+ {
2
+ "about": "Lays an application out: bars across the top and the bottom, as many as it renders, and a body between them with panels on either side of the page, as many as it renders. Each panel states its width, how it closes and when it folds, and the root states what scrolls and which look. A shell reads on a phone without being told: the navbar folds below the `md` breakpoint and the aside below `lg`. Fourteen applications here, each laid out on the one shell.",
3
+ "accounts": "Accounts",
4
+ "accountsWhen": "To you · today at 08:52",
5
+ "add": "Add",
6
+ "addCard": "Add card",
7
+ "agents": "3 agents idle",
8
+ "agreementNorthwind": "Northwind master agreement",
9
+ "approvals": "Approvals",
10
+ "apps": "Apps",
11
+ "archive": "Archive",
12
+ "artist": "Artist",
13
+ "assignee": "Assignee",
14
+ "basket": "Basket (2)",
15
+ "billing": {
16
+ "about": "Bars stack in the order they render, each as tall as its content: a notice above the toolbar.",
17
+ "title": "A billing console, a notice above the toolbar"
18
+ },
19
+ "billingBrand": "Billing",
20
+ "bot": "Deploy bot",
21
+ "bowl": "Serving bowl",
22
+ "bowlAbout": "Hand thrown, 24 cm across",
23
+ "branch": "Branch",
24
+ "brokeOne": "Retries broke first. A slow partner bank made each worker retry the same payout, and the queue grew faster than we drained it.",
25
+ "brokeTwo": "Idempotency keys stopped the duplicate payments, but the delays remained. We moved each partner to a queue of its own.",
26
+ "buildFailed": "Your build failed",
27
+ "buildFailedFrom": "Ledger · yesterday",
28
+ "byline": "Mara Okafor · 6 min read",
29
+ "calendarApp": "Calendar",
30
+ "canary": "Canary looks clean, error rate flat.",
31
+ "canvas": {
32
+ "about": "The floating look raises each panel's content as a card with a margin around it, and the canvas runs behind. The layers close from the menu button and the properties from Details.",
33
+ "title": "A design tool, panels afloat"
34
+ },
35
+ "canvasLayer": "Canvas",
36
+ "card": "Card number",
37
+ "channels": "Channels",
38
+ "chat": {
39
+ "about": "Panels render across in order, each with its own width and named for its triggers. The rail of workspaces never folds. The panel of channels beside it closes from the menu button and folds below the `md` breakpoint, as a navbar does by default.",
40
+ "title": "A chat client, a rail beside the channels"
41
+ },
42
+ "checkout": {
43
+ "about": "A header and the page alone. A part that is not rendered takes no room, so a checkout states nothing about the navigation it does not have.",
44
+ "title": "A checkout, header and page alone"
45
+ },
46
+ "choosePlan": "Choose a plan",
47
+ "clock": "09:14",
48
+ "closing": "Nice. Closing the release ticket.",
49
+ "code": "Security code",
50
+ "compose": "Compose",
51
+ "connected": "Connected",
52
+ "console": {
53
+ "about": "A toolbar, a sidebar of pages with a search, the page, an aside and a status bar. The menu button, the rail on the navbar's edge and ⌘B close the navbar to icons, and the sidebar follows. Details closes the aside. The navbar leaves the body below the `sm` breakpoint here and the aside below `lg`, and each opens over the page from its control. The status bar lays its entries out in a row at the foot of the shell.",
54
+ "title": "An operations console"
55
+ },
56
+ "contents": "Contents",
57
+ "contracts": "Contracts",
58
+ "cta": "Call to action",
59
+ "deployed": "Deploy 4128 finished in 4m 12s.",
60
+ "deploys": "deploys",
61
+ "details": "Details",
62
+ "direct": "Direct messages",
63
+ "draft": "Draft — landing page",
64
+ "duration": "Duration",
65
+ "email": "Email",
66
+ "environments": "Environments",
67
+ "expiry": "Expiry date",
68
+ "failed": "Failed",
69
+ "fieldNotes": "Field notes",
70
+ "files": {
71
+ "about": "The application keeps the folders' width in its own state through `size` and `onSizeChange`, and the bar shows the width. Drag the rail on the folders' edge, or focus it and press the arrow keys, to resize the folders between `minSize` and `maxSize`, 200 and 360px here. Reset width sets the width back to 240px. Below the `md` breakpoint the folders open over the page from the menu button.",
72
+ "title": "A file browser, the folders' width in the application's state"
73
+ },
74
+ "filesApp": "Files",
75
+ "fill": "Fill",
76
+ "filter": "Filter…",
77
+ "findPage": "Find a page",
78
+ "fleet": "Promoting to the full fleet.",
79
+ "folders": "Folders",
80
+ "foldersWidth": "Folders {{width}}px",
81
+ "footerLayer": "Footer",
82
+ "forward": "Forward",
83
+ "general": "general",
84
+ "gettingStarted": "Getting started",
85
+ "handbook": {
86
+ "about": "A bar renders where it is placed: in a pane it spans the page alone, and the navbar runs the full height of the shell beside it. The header and the footer in the pane are the page's banner and footer, and the page scrolls between them. The inset look raises the pane as a card on a muted ground.",
87
+ "title": "A handbook, sidebar first and page inset"
88
+ },
89
+ "handbookBrand": "Handbook · Working here",
90
+ "handbookName": "Handbook",
91
+ "headerLayer": "Header",
92
+ "height": "Height",
93
+ "hero": "Hero image",
94
+ "heroAction": "Start a free trial",
95
+ "heroBody": "Ledger runs your releases, checks every deploy and rolls back when an error rate climbs.",
96
+ "heroTitle": "Ship on a Friday",
97
+ "hours": "Hours",
98
+ "hoursOne": "Core hours run from 10:00 to 16:00 in your own time zone. Outside them, plan your day around your work and your life.",
99
+ "hosts": "60% of hosts run 4.2.",
100
+ "hoursTwo": "Put leave and appointments in the team calendar, so nobody waits on you for an answer.",
101
+ "idempotency": "Idempotency keys",
102
+ "inProgress": "In progress",
103
+ "inbox": "Inbox",
104
+ "incidents": "incidents",
105
+ "invoiceBody": "Hi, the invoice from March has not been settled. Could you have a look?",
106
+ "invoiceOverdue": "Invoice 2041 is overdue",
107
+ "invoiceOverdueFrom": "Accounts · 08:52",
108
+ "invoiceThanks": "Thanks, the accounts team",
109
+ "invoices": "Invoices",
110
+ "invoicesAppear": "Invoices appear here when your first billing period closes.",
111
+ "issue": "Issue 412",
112
+ "issueOne": "A card payment that times out at the bank is retried with a new idempotency key, so the bank charges the card a second time.",
113
+ "issueTitle": "Retries charge a card twice",
114
+ "issueTwo": "Every retry of one payment must reuse the key of its first attempt.",
115
+ "issueUpdated": "Updated 12 minutes ago by Jonas",
116
+ "jonas": "Jonas",
117
+ "journal": {
118
+ "about": "While the window scrolls, a panel sticks under the pinned bars and is as tall as the room they leave, so the contents reach the bottom of the window however far the article has scrolled.",
119
+ "title": "A journal, the contents stuck under the masthead"
120
+ },
121
+ "journalBrand": "The Ledger Journal",
122
+ "jug": "Milk jug",
123
+ "jugAbout": "Pours without a drip, 500 ml",
124
+ "jumpTo": "Jump to…",
125
+ "keptOne": "We kept the ledger. Every payout is still written once, and every retry reads it before it sends anything.",
126
+ "keptTwo": "We also kept the alerts. They fire on the age of the oldest message, which is what a customer notices.",
127
+ "layers": "Layers",
128
+ "live": "Canary 4.2 takes 5% of traffic.",
129
+ "leave": "Leave",
130
+ "ledger": "Ledger",
131
+ "length": "Length",
132
+ "library": "Library",
133
+ "lunch": "Lunch?",
134
+ "lunchFrom": "Jonas Berg · yesterday",
135
+ "mail": {
136
+ "about": "The folders close to icons: the track moves to the rail's width and remains in reach, and the sidebar inside it renders its rows as icons. Press the menu button or the rail on its edge to see the track move. The list beside it is a second panel, and the message is the page.",
137
+ "title": "A mail client, folders closing to icons"
138
+ },
139
+ "mailApp": "Mail",
140
+ "mara": "Mara",
141
+ "meetings": "Meetings",
142
+ "meetingsOne": "Every meeting has an agenda in its invite and ends five minutes early. A meeting without an agenda is cancelled.",
143
+ "meetingsTwo": "Decisions are made in the document, not in the call. The call is for the questions the document leaves open.",
144
+ "message": "Message",
145
+ "messageActions": "Message actions",
146
+ "messageDeploys": "Message #deploys",
147
+ "moreFiles": "More file actions",
148
+ "movedOne": "For three years every payout went through one queue. It was simple to run and easy to reason about, until the day it was neither.",
149
+ "movedQuote": "A queue hides its backlog until the backlog is the problem.",
150
+ "movedTwo": "We replaced it with one queue per partner bank, so a slow partner delays only its own payouts.",
151
+ "mug": "Stoneware mug",
152
+ "mugAbout": "Speckled glaze, 350 ml",
153
+ "mugs": "Stoneware mug × 2",
154
+ "navigation": "Navigation",
155
+ "newIn": "New in",
156
+ "newRun": "New run",
157
+ "next": "Next track",
158
+ "nextOne": "Next we move refunds onto the same design, and add a dashboard with the age of every queue.",
159
+ "nextTwo": "If you run a service that sends money, the runbook for the new queues is in the handbook under On call.",
160
+ "noInvoices": "No invoices yet",
161
+ "noRoom": "No rooms match",
162
+ "northwind": "Northwind",
163
+ "notifications": "Notifications",
164
+ "notificationsAbout": "Choose which notifications you get, and when.",
165
+ "notifyDigest": "Everything else comes in one digest at 08:00.",
166
+ "notifyMentions": "You get mentions and replies at once, on every device.",
167
+ "notifyQuiet": "You get no notification between 20:00 and 07:00.",
168
+ "offsite": "Re: the offsite",
169
+ "offsiteFrom": "Mara Okafor · 07:40",
170
+ "onCall": "On call",
171
+ "opened": "Opened",
172
+ "openedWhen": "Yesterday at 16:20",
173
+ "operations": "Operations",
174
+ "orderLedger": "Ledger order form",
175
+ "outage": "The outage of May",
176
+ "overview": "Overview",
177
+ "passed": "Passed",
178
+ "pause": "Pause",
179
+ "pay": "Pay £48.00",
180
+ "payment": "Payment",
181
+ "pipelines": "Pipelines",
182
+ "plan": "Plan",
183
+ "plate": "Side plate",
184
+ "plateAbout": "Matte white, set of two",
185
+ "platform": "Platform",
186
+ "playback": "Playback",
187
+ "played": "2:41 of 4:05",
188
+ "player": {
189
+ "about": "A footer told to stick pins to the bottom of the window while the page scrolls, so the player remains in reach however far the library has scrolled.",
190
+ "title": "A music player, the player pinned to the bottom"
191
+ },
192
+ "playlists": "Playlists",
193
+ "position": "Playback position",
194
+ "post": "Post",
195
+ "previous": "Previous track",
196
+ "priority": "Priority",
197
+ "priorityHigh": "High",
198
+ "profile": "Profile",
199
+ "projectCheckout": "Checkout",
200
+ "projectPayouts": "Payouts",
201
+ "projectSearch": "Search",
202
+ "projects": "Projects",
203
+ "properties": "Properties",
204
+ "push": "push to main",
205
+ "quality": "Quality",
206
+ "queues": "Queues",
207
+ "radio": "Radio",
208
+ "reader": {
209
+ "about": "Two columns and no navbar: the article is the page, and the notes that go with it are an aside told to fold under. The root constrains the page's content to the theme's wide page measure, centred in the main region. Below the `lg` breakpoint the aside drops under the article as a block, the way related notes read on a phone, and its trigger renders nothing, because there is nothing to open.",
210
+ "title": "A reader, the page and a column beside it"
211
+ },
212
+ "receipts": "Receipts",
213
+ "related": "Related",
214
+ "relay": "Relay",
215
+ "reliability": "Reliability",
216
+ "renewalRelay": "Relay renewal",
217
+ "replace": "Replace",
218
+ "reply": "Reply",
219
+ "reports": "Reports",
220
+ "resetWidth": "Reset width",
221
+ "resizeFolders": "Resize the folders",
222
+ "resizeSections": "Resize the settings",
223
+ "resolve": "Resolve",
224
+ "retries": "Retries done right",
225
+ "rolling": "Rolling 4.2 to eu-west-1 now.",
226
+ "run": "Run",
227
+ "run4128": "Run #4128",
228
+ "runs": "Runs",
229
+ "searchProducts": "Search products",
230
+ "secure": "Secure checkout",
231
+ "security": "Security",
232
+ "send": "Send",
233
+ "sent": "Sent",
234
+ "settings": "Settings",
235
+ "share": "Share",
236
+ "shipping": "Shipping",
237
+ "spam": "Spam",
238
+ "starred": "Starred",
239
+ "started": "Started",
240
+ "starting": "Starting the canary in eu-west-1.",
241
+ "status": "Status",
242
+ "statusBar": "Status",
243
+ "stealth": "Stealth Scale",
244
+ "storefront": {
245
+ "about": "Told that the window scrolls, the root grows with the page and the window scrolls. A bar told to stick pins to the top while the page scrolls by. Here the window is a box of a stated height.",
246
+ "title": "A storefront, the toolbar pinned"
247
+ },
248
+ "subscribe": "Subscribe",
249
+ "suite": {
250
+ "about": "Two panels at the start: a rail of apps, and the sidebar of the app on screen. The header is in a pane beside them, so both panels run the full height of the shell and the header spans the page alone. Drag the sidebar's edge, or focus it and press the arrow keys, to resize the sidebar. Below the `md` breakpoint the rail leaves the shell, a bar of the apps at the foot of the pane replaces it, and the sidebar opens over the page from the menu button.",
251
+ "title": "An office suite, a rail of apps beside the app's sidebar"
252
+ },
253
+ "summary": "Order summary",
254
+ "tagged": "Morning. Release 4.2 is tagged.",
255
+ "teapot": "Teapot",
256
+ "teapotAbout": "Brews four cups, with a steel strainer",
257
+ "thanks": "Thanks, both.",
258
+ "time": "2:41 / 4:05",
259
+ "title": "App shell",
260
+ "took": "4m 12s",
261
+ "tools": "Tools",
262
+ "total": "Total",
263
+ "trackTitle": "Title",
264
+ "tracker": {
265
+ "about": "`AppShell.Pane` is the column between the panels at the start and the panels at the end. It contains the header, the main region and the footer, so the bars span the page alone, and the projects and the details run the full height of the shell. The header in the pane is the banner landmark, and the main region scrolls under it. Below the `md` breakpoint the projects open over the page from the menu button, and below `lg` the details open from their button.",
266
+ "title": "An issue tracker, the bars in a pane between the panels"
267
+ },
268
+ "tracks": "Tracks",
269
+ "trialEnds": "Your trial ends in 4 days.",
270
+ "trigger": "Trigger",
271
+ "update": "Last updated 3 days ago by Mara",
272
+ "usage": "Usage",
273
+ "vase": "Bud vase",
274
+ "vaseAbout": "Ash glaze, 18 cm tall",
275
+ "vat": "VAT",
276
+ "version": "v4.2 · eu-west-1",
277
+ "whatBroke": "What broke first",
278
+ "whatKept": "What we kept",
279
+ "whatNext": "What is next",
280
+ "whyMoved": "Why we moved off the queue",
281
+ "width": "Width",
282
+ "workingHere": "Working here",
283
+ "workingHereAbout": "How we plan the week, when we meet, and how decisions are written down.",
284
+ "workspaces": "Workspaces",
285
+ "writing": "Writing things down",
286
+ "writingOne": "Write a proposal before you build anything that takes more than a week. Keep it to one page, with the problem first.",
287
+ "writingTwo": "Link the proposal from the ticket, so the next person finds the reasoning without asking."
288
+ }
@@ -0,0 +1,70 @@
1
+ {
2
+ "about": "A floating panel is a window over the page that a person opens from a trigger, moves by its header and resizes from its edges and corners. The page around it remains in use. Minimize leaves the header, Maximize fills the window and Restore returns the panel to its size and place. While the panel itself has focus, the arrow keys move it and Alt with an arrow resizes it. Escape closes the panel in front.",
3
+ "close": "Close",
4
+ "controlled": {
5
+ "about": "The application keeps the open state and the size in its own state. It passes them as open and size, and takes each change from onOpenChange and onSizeChange. The line under the button reports the place and the size. Reset in the panel restores the first size.",
6
+ "body": "Resize the panel from an edge, then reset it.",
7
+ "heading": "Size",
8
+ "place": "At {{x}}, {{y}}, {{width}} by {{height}} pixels",
9
+ "reset": "Reset the size",
10
+ "title": "Controlled open state and size",
11
+ "trigger": "Size"
12
+ },
13
+ "inspector": {
14
+ "about": "The panel opens under its trigger through getAnchorPosition and contains form fields. Tab moves from the trigger into the panel and from the panel's last field to the page after the trigger.",
15
+ "height": "Height",
16
+ "heading": "Layer",
17
+ "locked": "Lock the layer",
18
+ "name": "Name",
19
+ "title": "Anchored to the trigger",
20
+ "trigger": "Layer",
21
+ "value": "Hero image",
22
+ "width": "Width"
23
+ },
24
+ "maximize": "Maximize",
25
+ "minimize": "Minimize",
26
+ "notes": {
27
+ "about": "The panel opens in the middle of the window. Drag the header to move it and any edge or corner to resize it. Minimize leaves the header, Maximize fills the window, and a double click on the header maximizes and restores it.",
28
+ "body": "The launch moves to the first week of November. Marketing needs the final screenshots by the end of October.",
29
+ "heading": "Launch notes",
30
+ "title": "Stages and resizing",
31
+ "trigger": "Notes"
32
+ },
33
+ "preview": {
34
+ "about": "The panel keeps its proportions as it resizes, between 240 and 640 pixels wide.",
35
+ "ada": "Ada Lovelace",
36
+ "heading": "Call with Ada",
37
+ "leave": "Leave the call",
38
+ "speaking": "Ada Lovelace is speaking",
39
+ "title": "Locked aspect ratio",
40
+ "trigger": "Join the call"
41
+ },
42
+ "restore": "Restore",
43
+ "snapped": {
44
+ "about": "The panel moves and resizes in steps of 16 pixels, remains inside the window, and is between 256 and 480 pixels wide.",
45
+ "heading": "Shortcuts",
46
+ "shortcuts": {
47
+ "bold": { "keys": "Ctrl+B", "label": "Bold" },
48
+ "italic": { "keys": "Ctrl+I", "label": "Italic" },
49
+ "link": { "keys": "Ctrl+K", "label": "Link" },
50
+ "undo": { "keys": "Ctrl+Z", "label": "Undo" }
51
+ },
52
+ "title": "Grid and limits",
53
+ "trigger": "Shortcuts"
54
+ },
55
+ "stacked": {
56
+ "about": "Two panels open side by side. A press or focus in a panel brings it in front, and Escape closes the panel in front.",
57
+ "history": {
58
+ "body": "Seven edits since the last save.",
59
+ "heading": "History",
60
+ "trigger": "History"
61
+ },
62
+ "layers": {
63
+ "body": "Three layers: the title, the image and the background.",
64
+ "heading": "Layers",
65
+ "trigger": "Layers"
66
+ },
67
+ "title": "Stacked panels"
68
+ },
69
+ "title": "Floating panel"
70
+ }
@@ -0,0 +1,15 @@
1
+ {
2
+ "about": "A locale switcher changes the language an application is read in. It renders `Switcher.Root` with a row per locale the locale provider offers, each in its own language, so a pick translates the page, and a language written right to left mirrors it. It renders nothing where the application offers one locale. Import it from `@stealthscale/component-screen/shell`. Every switcher on this page switches the catalogue itself.",
3
+ "application": "Application",
4
+ "label": "Language",
5
+ "looks": {
6
+ "about": "The switcher takes the looks of `Switcher.Root`, so a bar sets the look it uses for its other controls. Each shows the language subtag as its mark, the language's own name and the indicator.",
7
+ "title": "Looks"
8
+ },
9
+ "product": "Ledger",
10
+ "title": "Locale switcher",
11
+ "toolbar": {
12
+ "about": "At the end of an application's bar the switcher is one of the toolbar's controls at the toolbar's size, so the arrow keys move focus to it.",
13
+ "title": "In a toolbar"
14
+ }
15
+ }