efficient-shell 4.134.0 → 4.137.1

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 (171) hide show
  1. package/LICENSE +6 -17
  2. package/README.md +84 -8
  3. package/dist/Browser-ZX5OTOKK.js +43 -0
  4. package/dist/Calculator-4SQGOQFQ.js +29 -0
  5. package/dist/ConfirmDialog-NPKW2XHM.js +1 -0
  6. package/dist/CurrencyConverter-2KOM7L6V.js +21 -0
  7. package/dist/Documents-IZTIQYPG.js +52 -0
  8. package/dist/Files-B63KKXGZ.js +89 -0
  9. package/dist/Notepad-WA77V45J.js +25 -0
  10. package/dist/PdfViewer-RBRGEKWF.js +1 -0
  11. package/dist/PomodoroTimer-SDUBKXUS.js +99 -0
  12. package/dist/Preview-D4KOA4OI.js +187 -0
  13. package/dist/Sidebar-Y57LYXXI.js +23 -0
  14. package/dist/Spreadsheet-JX5E6WH6.js +37 -0
  15. package/dist/Stock-XAQ5WMUZ.js +16 -0
  16. package/dist/Weather-HLAGJ5LV.js +60 -0
  17. package/dist/WorldClock-IRI4VCTA.js +32 -0
  18. package/dist/apps/index.js +1 -151
  19. package/dist/brand.css +1 -1
  20. package/dist/chunk-3A46NCXK.js +29 -0
  21. package/dist/chunk-44UO7FYU.js +11 -0
  22. package/dist/chunk-466CM2TJ.js +1 -0
  23. package/dist/chunk-57MIENLJ.js +1 -0
  24. package/dist/chunk-5CRAF2AD.js +2 -0
  25. package/dist/chunk-A2OQLLYK.js +6 -0
  26. package/dist/chunk-B43AGQET.js +4 -0
  27. package/dist/chunk-BR22X7E5.js +1 -0
  28. package/dist/chunk-BUTSU7FO.js +1 -0
  29. package/dist/chunk-D65T4H6J.js +1 -0
  30. package/dist/chunk-ESL5TDNA.js +1 -0
  31. package/dist/chunk-FBDZGO3V.js +1 -0
  32. package/dist/chunk-FHTLC7HH.js +1 -0
  33. package/dist/chunk-FQLMX3IE.js +948 -0
  34. package/dist/chunk-H562R4GX.js +34 -0
  35. package/dist/chunk-JN4WXTWJ.js +106 -0
  36. package/dist/chunk-LVDRBRYU.js +1 -0
  37. package/dist/chunk-LWLCNQY7.js +1 -0
  38. package/dist/chunk-MAIHBBWT.js +1 -0
  39. package/dist/chunk-NPJH5MD7.js +13 -0
  40. package/dist/chunk-OCSOMMY2.js +1 -0
  41. package/dist/chunk-OQDWLHZI.js +1 -0
  42. package/dist/chunk-OWSAMA3I.js +23 -0
  43. package/dist/chunk-PH3PRIFP.js +5 -0
  44. package/dist/chunk-TAWKWSPN.js +9 -0
  45. package/dist/chunk-U4GTZPXP.js +1 -0
  46. package/dist/chunk-UB4JIOLD.js +2 -0
  47. package/dist/chunk-UZAJ5BF6.js +9 -0
  48. package/dist/chunk-VEGMDXT4.js +1 -0
  49. package/dist/chunk-VTVSMRFX.js +1 -0
  50. package/dist/chunk-VVAGSKW7.js +1 -0
  51. package/dist/chunk-XO43FJRM.js +19 -0
  52. package/dist/chunk-Y7BOLDRM.js +69 -0
  53. package/dist/file-intake/index.js +1 -4
  54. package/dist/{index-DZ7E7bCl.d.ts → index-DVI9DMSu.d.ts} +189 -18
  55. package/dist/index.d.ts +2 -2
  56. package/dist/index.js +639 -7473
  57. package/dist/map/index.js +20 -540
  58. package/dist/markdown/index.js +6 -184
  59. package/dist/markup/index.js +1 -135
  60. package/dist/page-tabs/index.js +21 -709
  61. package/dist/sounds-OMHXVVQ4.js +1 -0
  62. package/dist/ui/index.d.ts +1 -1
  63. package/dist/ui/index.js +1 -19
  64. package/dist/ui.css +78 -10
  65. package/package.json +4 -3
  66. package/dist/Browser-O3QZGUF2.js +0 -482
  67. package/dist/Browser-O3QZGUF2.js.map +0 -1
  68. package/dist/Calculator-L6N5X3KU.js +0 -192
  69. package/dist/Calculator-L6N5X3KU.js.map +0 -1
  70. package/dist/ConfirmDialog-LYSSZSUD.js +0 -4
  71. package/dist/ConfirmDialog-LYSSZSUD.js.map +0 -1
  72. package/dist/CurrencyConverter-64MKXB3D.js +0 -236
  73. package/dist/CurrencyConverter-64MKXB3D.js.map +0 -1
  74. package/dist/Documents-5WXXYCLI.js +0 -441
  75. package/dist/Documents-5WXXYCLI.js.map +0 -1
  76. package/dist/Files-AUURUUDN.js +0 -805
  77. package/dist/Files-AUURUUDN.js.map +0 -1
  78. package/dist/Notepad-GPXJVPB7.js +0 -410
  79. package/dist/Notepad-GPXJVPB7.js.map +0 -1
  80. package/dist/PdfViewer-HKO6P4SR.js +0 -5
  81. package/dist/PdfViewer-HKO6P4SR.js.map +0 -1
  82. package/dist/PomodoroTimer-4TQBWLP2.js +0 -633
  83. package/dist/PomodoroTimer-4TQBWLP2.js.map +0 -1
  84. package/dist/Preview-FOZYPKM2.js +0 -2959
  85. package/dist/Preview-FOZYPKM2.js.map +0 -1
  86. package/dist/Sidebar-BPU7RCZP.js +0 -291
  87. package/dist/Sidebar-BPU7RCZP.js.map +0 -1
  88. package/dist/Spreadsheet-3C66BBBF.js +0 -519
  89. package/dist/Spreadsheet-3C66BBBF.js.map +0 -1
  90. package/dist/Stock-IF4IHYLU.js +0 -158
  91. package/dist/Stock-IF4IHYLU.js.map +0 -1
  92. package/dist/Weather-725PFR7T.js +0 -431
  93. package/dist/Weather-725PFR7T.js.map +0 -1
  94. package/dist/WorldClock-UU4NZIQ7.js +0 -202
  95. package/dist/WorldClock-UU4NZIQ7.js.map +0 -1
  96. package/dist/apps/index.js.map +0 -1
  97. package/dist/chunk-2TPTHAKI.js +0 -316
  98. package/dist/chunk-2TPTHAKI.js.map +0 -1
  99. package/dist/chunk-4P44JXDS.js +0 -195
  100. package/dist/chunk-4P44JXDS.js.map +0 -1
  101. package/dist/chunk-5O42JXQE.js +0 -26
  102. package/dist/chunk-5O42JXQE.js.map +0 -1
  103. package/dist/chunk-72CQWN7O.js +0 -547
  104. package/dist/chunk-72CQWN7O.js.map +0 -1
  105. package/dist/chunk-7CCHEEYC.js +0 -94
  106. package/dist/chunk-7CCHEEYC.js.map +0 -1
  107. package/dist/chunk-BE7FZOFU.js +0 -17
  108. package/dist/chunk-BE7FZOFU.js.map +0 -1
  109. package/dist/chunk-D276EMXS.js +0 -57
  110. package/dist/chunk-D276EMXS.js.map +0 -1
  111. package/dist/chunk-D7PYW2QS.js +0 -265
  112. package/dist/chunk-D7PYW2QS.js.map +0 -1
  113. package/dist/chunk-DVZWYWSD.js +0 -26
  114. package/dist/chunk-DVZWYWSD.js.map +0 -1
  115. package/dist/chunk-ET6ID4LP.js +0 -102
  116. package/dist/chunk-ET6ID4LP.js.map +0 -1
  117. package/dist/chunk-GA35NEND.js +0 -56
  118. package/dist/chunk-GA35NEND.js.map +0 -1
  119. package/dist/chunk-GIGV2ZRW.js +0 -70
  120. package/dist/chunk-GIGV2ZRW.js.map +0 -1
  121. package/dist/chunk-IPXN646P.js +0 -14
  122. package/dist/chunk-IPXN646P.js.map +0 -1
  123. package/dist/chunk-IRWSRJ4K.js +0 -48
  124. package/dist/chunk-IRWSRJ4K.js.map +0 -1
  125. package/dist/chunk-IULP5BCD.js +0 -79
  126. package/dist/chunk-IULP5BCD.js.map +0 -1
  127. package/dist/chunk-MGGY74RY.js +0 -14
  128. package/dist/chunk-MGGY74RY.js.map +0 -1
  129. package/dist/chunk-OLJDJYSU.js +0 -13678
  130. package/dist/chunk-OLJDJYSU.js.map +0 -1
  131. package/dist/chunk-PIGDNN5F.js +0 -46
  132. package/dist/chunk-PIGDNN5F.js.map +0 -1
  133. package/dist/chunk-Q2MJVSJT.js +0 -7
  134. package/dist/chunk-Q2MJVSJT.js.map +0 -1
  135. package/dist/chunk-Q3LT745N.js +0 -3710
  136. package/dist/chunk-Q3LT745N.js.map +0 -1
  137. package/dist/chunk-QAGQRNKI.js +0 -145
  138. package/dist/chunk-QAGQRNKI.js.map +0 -1
  139. package/dist/chunk-QRL64J5F.js +0 -503
  140. package/dist/chunk-QRL64J5F.js.map +0 -1
  141. package/dist/chunk-QSKCQUZE.js +0 -1103
  142. package/dist/chunk-QSKCQUZE.js.map +0 -1
  143. package/dist/chunk-R4OQIQYX.js +0 -153
  144. package/dist/chunk-R4OQIQYX.js.map +0 -1
  145. package/dist/chunk-RT6DSB5Y.js +0 -143
  146. package/dist/chunk-RT6DSB5Y.js.map +0 -1
  147. package/dist/chunk-SHQM5CK3.js +0 -549
  148. package/dist/chunk-SHQM5CK3.js.map +0 -1
  149. package/dist/chunk-T4VQHMG4.js +0 -822
  150. package/dist/chunk-T4VQHMG4.js.map +0 -1
  151. package/dist/chunk-TRCWINHF.js +0 -105
  152. package/dist/chunk-TRCWINHF.js.map +0 -1
  153. package/dist/chunk-TW7LPMVR.js +0 -16
  154. package/dist/chunk-TW7LPMVR.js.map +0 -1
  155. package/dist/chunk-W622KQTD.js +0 -465
  156. package/dist/chunk-W622KQTD.js.map +0 -1
  157. package/dist/chunk-X4Q6G253.js +0 -416
  158. package/dist/chunk-X4Q6G253.js.map +0 -1
  159. package/dist/chunk-YNKK7NE3.js +0 -171
  160. package/dist/chunk-YNKK7NE3.js.map +0 -1
  161. package/dist/chunk-YPO6RDMX.js +0 -20
  162. package/dist/chunk-YPO6RDMX.js.map +0 -1
  163. package/dist/file-intake/index.js.map +0 -1
  164. package/dist/index.js.map +0 -1
  165. package/dist/map/index.js.map +0 -1
  166. package/dist/markdown/index.js.map +0 -1
  167. package/dist/markup/index.js.map +0 -1
  168. package/dist/page-tabs/index.js.map +0 -1
  169. package/dist/sounds-NT4DEZGD.js +0 -3
  170. package/dist/sounds-NT4DEZGD.js.map +0 -1
  171. package/dist/ui/index.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/utils/number.ts","../src/shell/strings.tsx"],"names":[],"mappings":"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","file":"chunk-72CQWN7O.js","sourcesContent":["/**\n * Numbers in the host's locale — or exactly as the kit printed them before it\n * had a locale to print them in.\n *\n * Every helper takes the BCP 47 tag `ShellStringsProvider` was given (read with\n * `useShellLocale`), and every one has two halves. With a tag, `Intl` writes the\n * number the way that locale does: `1.234,5` in German, a narrow space before\n * the percent sign in French. Without one, the helper returns what its call\n * sites used to compute inline — `String(v)`, `v.toFixed(d)`,\n * `v.toLocaleString()` — character for character.\n *\n * The second half is the contract, and the reason the fallbacks are spelled out\n * rather than left to an `Intl` default: `new Intl.NumberFormat()` with no tag\n * is the RUNTIME's locale, and a hard-coded `'en-US'` is somebody else's. An app\n * that never mounts a provider, or mounts one without a locale, must not see a\n * digit move — a table whose totals regrouped themselves on upgrade is a bug\n * report, not a feature.\n *\n * Kit-safe: no React, no DOM.\n */\n\n/** Building an `Intl.NumberFormat` is the expensive part of using one, and a\n * chart formats every tick of every axis on every render. One per locale and\n * option set, for the life of the page. */\nconst formats = new Map<string, Intl.NumberFormat>();\n\nfunction numberFormat(locale: string, options: Intl.NumberFormatOptions): Intl.NumberFormat {\n const key = `${locale}|${JSON.stringify(options)}`;\n let format = formats.get(key);\n if (!format) {\n format = new Intl.NumberFormat(locale, options);\n formats.set(key, format);\n }\n return format;\n}\n\n/**\n * A number as written — `String(v)` without a locale. With one, every digit the\n * value has is kept (up to `Intl`'s ceiling of 20), because the call sites this\n * replaces never rounded: a chart whose caller passed 0.125 printed `0.125`, and\n * `Intl`'s default of three fraction digits would quietly print `0.125` but\n * `0.1235` for 0.12345.\n */\nexport function formatPlain(value: number, locale?: string): string {\n return locale ? numberFormat(locale, { maximumFractionDigits: 20 }).format(value) : String(value);\n}\n\n/** A count with thousands separators — `v.toLocaleString()` without a locale,\n * which is the runtime's own grouping, exactly as before. */\nexport function formatGrouped(value: number, locale?: string): string {\n return locale ? numberFormat(locale, {}).format(value) : value.toLocaleString();\n}\n\n/** Exactly `digits` decimals — `v.toFixed(digits)` without a locale. */\nexport function formatFixed(value: number, digits: number, locale?: string): string {\n return locale\n ? numberFormat(locale, { minimumFractionDigits: digits, maximumFractionDigits: digits }).format(value)\n : value.toFixed(digits);\n}\n\n/**\n * A PERCENTAGE — `37.5`, not the fraction `0.375` — with `digits` decimals:\n * `${p.toFixed(digits)}%` without a locale, the locale's own percent with one\n * (`37,5 %`, `%37,5`).\n *\n * It takes the percentage rather than the fraction because that is what every\n * call site already had in hand: they computed `(share * 100).toFixed(1)`, and\n * passing that same product through keeps the no-locale output identical down to\n * the last floating-point digit.\n */\nexport function formatPercent(percent: number, digits: number, locale?: string): string {\n return locale\n ? numberFormat(locale, {\n style: 'percent', minimumFractionDigits: digits, maximumFractionDigits: digits,\n }).format(percent / 100)\n : `${percent.toFixed(digits)}%`;\n}\n","/**\n * ShellStrings — the shell's user-facing strings, in one typed catalog.\n *\n * Every string here was hardcoded English at its call site, which made the\n * shell untranslatable no matter what the consuming portal did. The catalog\n * is the fix's whole shape: components read strings through `useShellStrings`\n * (which works with NO provider — the English defaults are the context\n * default), and a consumer that wants another language mounts\n * `ShellStringsProvider` once with a partial override. Overrides merge per\n * SECTION, so translating the window controls does not oblige anyone to\n * translate the help viewer.\n *\n * This is deliberately not an i18n library: no message IDs, no interpolation\n * DSL, no plural rules. The shell's strings are labels and short sentences;\n * a typed object keeps them discoverable and lets TypeScript flag a\n * translation that goes stale when a string is added.\n *\n * ── Sentences that carry a value are functions ──\n * \"3 of 40 records\", \"Remove invoice.pdf\", \"Choose a year, currently 2026\".\n * A string with a hole in it would need a template syntax, and a template\n * syntax would need plural rules the moment a count went into the hole —\n * which is the i18n library this file refuses to be. So those entries are\n * plain functions, and the host writes them with whatever it already has:\n * `Intl.PluralRules`, its own message catalog, a ternary.\n *\n * Two rules keep the functions predictable:\n * - A COUNT arrives as a `number`, unformatted, because the words depend on\n * it (\"1 file\", \"2 files\", \"5 файлов\") and a plural rule needs the number.\n * The host formats it; the English defaults do, in the provider's `locale`.\n * - A VALUE the kit already formatted — a date, a caller's `formatValue`\n * output, a file size — arrives as the `string` that would be printed.\n *\n * A few older entries are halves the caller concatenates (`select.remove` +\n * a label, `pageTabs.discardMany` after a count). They stay, so no existing\n * catalog breaks, and each has an optional function beside it that wins when\n * supplied — word order differs between languages, and a concatenation cannot.\n *\n * ── Locale ──\n * `ShellStringsProvider` also takes a `locale` (a BCP 47 tag). It is not a\n * string section, it is how numbers and dates are WRITTEN: month and weekday\n * names in the pickers, `formatDate`, the digits in a list footer or a chart\n * axis. With no locale the kit writes exactly what it always wrote — the same\n * English month names, `toLocaleString()` with no argument, `String(v)` — so\n * mounting the provider for its strings alone changes no number on screen.\n * `useShellLocale` reads it; `src/utils/number.ts` and `calendarNames` in\n * `src/utils/date.ts` are the two halves that honour it.\n *\n * Prop-level text (a `emptyText` prop, a `placeholder`) always wins over the\n * catalog — the catalog replaces hardcoded DEFAULTS, never a caller's words.\n *\n * Kit-safe: no window-manager import, so `efficient-shell/ui` consumers get it\n * too.\n */\nimport { createContext, useContext, useEffect, useMemo, type ReactNode } from 'react';\nimport { formatFixed, formatGrouped, formatPercent, formatPlain } from '../utils/number';\n\nexport interface ShellStrings {\n /** Window chrome: control tooltips and the title bar's accessible name. */\n window: {\n minimize: string;\n /** Bring a hand-minimized window back — the tab's own control. */\n restore: string;\n maximize: string;\n windowed: string;\n pinOnTop: string;\n unpin: string;\n close: string;\n /** Suffix of the title bar's aria-label: `\"{title} — {windowSuffix}\"`. */\n windowSuffix: string;\n prev: string;\n next: string;\n snapLayouts: string;\n snapLeft: string;\n snapRight: string;\n snapTopLeft: string;\n snapTopRight: string;\n snapBottomLeft: string;\n snapBottomRight: string;\n };\n /** Taskbar and exposé. */\n taskbar: {\n closeWindow: string;\n offscreenHint: string;\n offscreenDot: string;\n expose: string;\n addToDesktop: string;\n removeFromDesktop: string;\n /** Group menu — a taskbar tab standing for more than one window. The\n * count is appended by the caller, e.g. \"Close all (3)\". */\n minimizeAllWindows: string;\n restoreAllWindows: string;\n closeAllWindows: string;\n };\n /** The logout cover. */\n logout: {\n goodbye: string;\n seeYou: string;\n };\n /** About + What's New dialogs. */\n about: {\n aboutPrefix: string;\n thisApp: string;\n openSourceLicenses: string;\n whatsNew: string;\n noChangelog: string;\n };\n /** Data-display defaults (DataTable, lists). */\n table: {\n empty: string;\n loading: string;\n selectAll: string;\n selectRow: string;\n };\n /** Picker defaults (SearchableSelect, TagInput). */\n select: {\n none: string;\n noMatches: string;\n allSelected: string;\n clear: string;\n /** aria-label of a TagInput chip's remove button: `\"{remove} {label}\"`. */\n remove: string;\n /** The whole chip label, when the word order is not \"{remove} {label}\".\n * Wins over `remove` when supplied. */\n removeItem?: (label: string) => string;\n };\n /** Notification bell + popup. */\n notifications: {\n title: string;\n markAllRead: string;\n dnd: string;\n dndOn: string;\n caughtUp: string;\n empty: string;\n viewAll: string;\n cardLabel: string;\n dismiss: string;\n };\n /** Form-level messages. */\n form: {\n errorSummaryTitle: string;\n };\n /** HelpCenter chrome. */\n help: {\n title: string;\n searchPlaceholder: string;\n empty: string;\n noResults: string;\n loading: string;\n pickArticle: string;\n noBody: string;\n draft: string;\n newArticle: string;\n edit: string;\n };\n /** The app-update banner (a deploy happened under a long-lived tab). */\n update: {\n available: string;\n refreshNow: string;\n };\n /** The page-tab strip (`efficient-shell/page-tabs`). */\n pageTabs: {\n /** The strip's accessible name. */\n label: string;\n /** A tab's close button, and the menu item: `\"{close} {title}\"` for the button. */\n close: string;\n /** The close button's whole label, when the word order is not\n * \"{close} {title}\". Wins over `close` for the button when supplied. */\n closeTab?: (title: string) => string;\n closeOthers: string;\n closeRight: string;\n closeAll: string;\n /** Marks a tab with unsaved changes (the dot's accessible text). */\n unsaved: string;\n /** Asked before a tab with unsaved changes closes. */\n discardTitle: string;\n discardOne: string;\n /** Several at once — the count is prefixed by the caller: \"3 pages have…\". */\n discardMany: string;\n /** The whole several-at-once sentence, for a language whose noun follows\n * the count's plural form. Wins over `discardMany` when supplied. */\n discardCount?: (count: number) => string;\n discardConfirm: string;\n keepEditing: string;\n };\n /** `Dialog` and `Drawer`'s close control, and the dialogs behind `confirm`,\n * `confirmDestructive` and `prompt` (each option a caller passes wins). */\n dialog: {\n close: string;\n cancel: string;\n ok: string;\n /** `confirm`'s heading when the caller gives no `title`. */\n confirmTitle: string;\n /** `confirmDestructive`'s heading, cancel and confirm defaults. */\n destructiveTitle: string;\n destructiveCancel: string;\n destructiveConfirm: string;\n /** The line over the type-to-confirm box; the word is drawn in a `<kbd>`\n * wherever the sentence puts it. */\n typeToConfirm: (word: string) => string;\n /** `prompt`'s heading when the caller gives no `title`. */\n promptTitle: string;\n };\n /** The month grid (`Calendar`, and the pickers that open it). Month and\n * weekday NAMES are not here — they come from `locale`. */\n calendar: {\n previousMonth: string;\n nextMonth: string;\n previousYear: string;\n nextYear: string;\n previousYears: string;\n nextYears: string;\n /** The month and year panels' accessible names. */\n monthPanel: string;\n yearPanel: string;\n /** The heading's month button. */\n chooseMonth: (month: string) => string;\n /** The heading's year button. */\n chooseYear: (year: number) => string;\n };\n /** `DatePicker`'s trigger and popover. */\n datePicker: {\n placeholder: string;\n /** The popover's accessible name when the field has no `aria-label`. */\n dialog: string;\n clear: string;\n today: string;\n };\n /** `DateRangePicker`. */\n dateRange: {\n placeholder: string;\n /** The trigger's × button. */\n clearRange: string;\n /** The popover's and the grid's accessible name. */\n dialog: string;\n from: string;\n to: string;\n /** The From/To boxes before a day is chosen. */\n start: string;\n end: string;\n /** The trigger with only one end of the range set. */\n fromOnly: (date: string) => string;\n toOnly: (date: string) => string;\n last2Weeks: string;\n lastMonth: string;\n last3Months: string;\n last6Months: string;\n last12Months: string;\n custom: string;\n clear: string;\n cancel: string;\n apply: string;\n };\n /** `Pagination` (and `DataTable`'s pager). */\n pagination: {\n label: string;\n first: string;\n previous: string;\n next: string;\n last: string;\n };\n /** `ListFooter` and `ListLoadError`. `label` is the caller's own noun\n * (\"records\"); the counts are numbers, for the plural. */\n list: {\n /** Before the em dash: \"3 selected — 40 records\". */\n selected: (count: number) => string;\n allLoaded: (total: number, label: string) => string;\n count: (total: number, label: string) => string;\n loadedOf: (loaded: number, total: number, label: string) => string;\n /** After a middle dot: \"40 of 900 records · Loading more...\". */\n loadingMore: string;\n loadError: string;\n loadErrorMessage: string;\n retry: string;\n };\n /** `Kanban`'s defaults (its own props win). */\n kanban: {\n loading: string;\n empty: string;\n dropHere: string;\n addItem: string;\n };\n /** File intake: `FilePicker`, `ComposerAttachments`, and the rejection\n * messages every upload control shares. */\n files: {\n attach: string;\n drop: string;\n remove: (name: string) => string;\n chooseMany: string;\n chooseOne: string;\n /** After the choose link, in the same line. */\n dragMany: string;\n dragOne: string;\n /** `hint` is the caller's `acceptHint` when it is a string, else ''. */\n notAccepted: (name: string, hint: string) => string;\n /** `size` and `limit` arrive written out — \"6.2 MB\". */\n tooLarge: (name: string, size: string, limit: string) => string;\n tooMany: (name: string, max: number) => string;\n bytes: (value: number) => string;\n kilobytes: (value: number) => string;\n megabytes: (value: number) => string;\n };\n /** `MediaUploadField` and `MediaUploadGrid`. */\n media: {\n uploadImage: string;\n uploadVideo: string;\n uploadFile: string;\n /** The drop zone's accessible name when its prompt is not a string. */\n upload: string;\n cta: string;\n replace: string;\n remove: string;\n uploading: string;\n cover: string;\n add: string;\n addMedia: string;\n empty: string;\n removeItem: (name: string) => string;\n /** A reorderable thumbnail's accessible name. */\n reorder: (name: string, position: number, total: number) => string;\n };\n /** `BrandAssetEditor`. `noun` is the last word of `assetName`, lower-cased\n * (\"Portal logo\" → \"logo\"); a translation that cannot use it has\n * `assetName` itself. */\n brandAsset: {\n save: (noun: string, assetName: string) => string;\n remove: (noun: string, assetName: string) => string;\n discard: string;\n saveFailed: (noun: string, assetName: string) => string;\n removeFailed: (noun: string, assetName: string) => string;\n region: (assetName: string, subjectName: string) => string;\n usedFor: (subjectName: string) => string;\n previews: (assetName: string) => string;\n preview: string;\n alt: (subjectName: string, assetName: string) => string;\n };\n /** `Snippet`'s copy button, and the clipboard's toasts. */\n copy: {\n copy: string;\n copyLabel: (label: string) => string;\n /** Snippet's spoken confirmation. */\n copied: string;\n /** `copyToClipboard`'s success toast; `label` names what was copied. */\n copiedLabel: (label: string) => string;\n failed: string;\n };\n /** `NumericKeypad`. */\n keypad: {\n backspace: string;\n enter: string;\n };\n /** `Banner`. */\n banner: {\n dismiss: string;\n };\n /** A closable `ColoredBadge`'s × (its `closeLabel` wins). */\n badge: {\n /** When the badge's content is not plain text. */\n remove: string;\n removeItem: (label: string) => string;\n };\n /** `Breadcrumbs`. */\n breadcrumbs: {\n label: string;\n /** The ellipsis standing for the crumbs `maxItems` folded away. */\n hidden: string;\n };\n /** `EmptyState`'s line when the caller gives neither a title nor a message. */\n emptyState: {\n message: string;\n };\n /** `ErrorPage`, `ErrorBoundary` and `Result`'s status defaults. */\n errors: {\n notFound: string;\n notFoundBody: string;\n forbidden: string;\n forbiddenBody: string;\n /** `Result status=\"403\"`'s title — gentler than `ErrorPage`'s. */\n noAccess: string;\n serverError: string;\n serverErrorBody: string;\n retry: string;\n details: string;\n };\n /** `GlobalSearch`. */\n search: {\n placeholder: string;\n /** The key cap beside the input. */\n escBadge: string;\n searching: string;\n noResults: string;\n minChars: (min: number) => string;\n navigate: string;\n open: string;\n close: string;\n enterKey: string;\n escKey: string;\n };\n /** `EditableGrid`. */\n grid: {\n selectAll: string;\n insertRowAbove: string;\n insertRowBelow: string;\n deleteRow: (row: number) => string;\n insertColumnLeft: string;\n insertColumnRight: string;\n deleteColumn: (column: string) => string;\n resize: string;\n fill: string;\n };\n /** `SidebarLayout`'s resize handle. */\n sidebar: {\n resize: string;\n };\n /** `MarkdownLite`. */\n markdown: {\n /** Before an image placeholder's caption, with an em dash between. */\n screenshot: string;\n };\n /** The word a severity marker is spoken and tooltipped with. */\n severity: {\n success: string;\n warning: string;\n danger: string;\n /** A token that is not one of the three, as received. */\n unrecognised: (token: string) => string;\n };\n /** `MetricBar` and `BudgetBar`. */\n meter: {\n noData: string;\n warningAt: (bound: number) => string;\n criticalAt: (bound: number) => string;\n noReading: string;\n noBudget: string;\n /** The meter's spoken value: \"84% of budget\". */\n ofBudget: (value: string) => string;\n /** The deadline marker's tooltip. */\n budget: string;\n hoursMinutes: (hours: number, minutes: number) => string;\n minutesSeconds: (minutes: number, seconds: number) => string;\n seconds: (seconds: number) => string;\n };\n /** The chart family. Series, axis and category names are the caller's. */\n charts: {\n showTable: string;\n loading: string;\n noData: string;\n windowStart: string;\n windowEnd: string;\n window: (from: string, to: string, count: number) => string;\n overIntervals: (series: string[], count: number) => string;\n acrossCategories: (series: string[], count: number) => string;\n acrossMeasures: (series: string[], count: number) => string;\n /** The pie's accessible name; `total` is written by the caller's `formatValue`. */\n breakdown: (total: string, segments: number) => string;\n funnel: (stages: number, first: string, last: string) => string;\n radialTrack: (count: number) => string;\n radialCycle: (count: number) => string;\n /** Column heads of the screen-reader tables some charts carry. */\n tableFrom: string;\n tableTo: string;\n tableItem: string;\n tableLevel: string;\n tableSeries: string;\n inBucket: (total: string) => string;\n inCategory: (total: string) => string;\n value: string;\n share: string;\n count: string;\n flow: string;\n totalFlow: string;\n throughput: string;\n open: string;\n high: string;\n low: string;\n close: string;\n maximum: string;\n q3: string;\n median: string;\n q1: string;\n minimum: string;\n distribution: string;\n fiveNumber: (label: string, count: number) => string;\n outliers: (count: number) => string;\n price: string;\n ohlc: (label: string, count: number) => string;\n closedAbove: string;\n closedBelow: string;\n noFlows: string;\n chord: (count: number) => string;\n noStages: string;\n ofFirstStage: string;\n droppedHere: string;\n intensity: string;\n noActivity: string;\n heatmap: (label: string, rows: number, columns: number) => string;\n /** A histogram's y-axis title. */\n countAxis: string;\n histogram: (label: string, bins: number, observations: number) => string;\n observations: string;\n /** `Meter` with no value to judge. */\n notEnough: string;\n objectiveMet: (objective: string) => string;\n objectiveMissed: (objective: string) => string;\n nothingToPlot: string;\n nothingToCompare: string;\n /** The pie slice the small segments are folded into. */\n other: string;\n nothingToBreakDown: string;\n range: string;\n rangeLabel: (label: string, count: number) => string;\n nothingToRank: string;\n /** Spoken after the emphasised row of `RankedBars`. */\n emphasised: string;\n sankey: (nodes: number, links: number) => string;\n noObservations: string;\n xAxis: string;\n yAxis: string;\n size: string;\n scatter: (series: string[], yLabel: string, xLabel: string) => string;\n outsideRange: (count: number) => string;\n waterfall: (steps: number, from: string, to: string) => string;\n balance: string;\n increase: string;\n decrease: string;\n runningTotal: string;\n sunburst: (total: string, depth: number) => string;\n treemap: (count: number) => string;\n /** `StatTile`'s delta direction, spoken after the arrow glyph. */\n trendUp: string;\n trendDown: string;\n trendFlat: string;\n };\n /** `TimelineTrack` and `MilestoneTimeline`. */\n timeline: {\n /** A cut in the axis: \"412 days\". */\n days: (count: number) => string;\n daysToToday: (count: number) => string;\n notReached: string;\n /** Before the first pending entry, with a middle dot after it. */\n next: string;\n more: (count: number) => string;\n today: string;\n todayTitle: (date: string) => string;\n open: (name: string) => string;\n openButton: string;\n scrub: string;\n alsoToCome: (names: string[]) => string;\n start: (date: string) => string;\n /** A folded run of marks: its count, then each member's own name. */\n events: (count: number, names: string[]) => string;\n started: (date: string) => string;\n duration: (days: number) => string;\n reached: (dated: number, total: number) => string;\n milestones: (title: string) => string;\n };\n /** `ProductionTimeline`. */\n production: {\n heading: string;\n /** The synthetic report standing for the production start. */\n start: string;\n /** The synthetic report between two real ones. */\n estimated: string;\n estimatedCompletion: string;\n estDone: string;\n play: string;\n pause: string;\n playTitle: string;\n backTo: (report: string) => string;\n /** The report is drawn bold wherever the sentence puts it. */\n showing: (report: string) => string;\n overall: (percent: number) => string;\n inStock: (pieces: number) => string;\n noReport: string;\n leadTime: (days: number) => string;\n report: string;\n shipment: string;\n inspection: string;\n invoice: string;\n scrub: string;\n label: (from: string, to: string) => string;\n };\n /** `ContainerFillChart`. Volumes are cubic metres. */\n containers: {\n items: (count: number) => string;\n pieces: (count: number) => string;\n split: (instructed: number, loaded: number) => string;\n added: (count: number, pieces: number) => string;\n fill: (volume: number, capacity: number) => string;\n total: string;\n instructed: (volume: number) => string;\n loaded: (volume: number) => string;\n volume: (volume: number) => string;\n noVolume: string;\n };\n /** `toast.notify`'s card. */\n toast: {\n notification: string;\n };\n}\n\n/**\n * The English catalog, with its numbers written for `locale`.\n *\n * A function, not a literal, because the defaults that carry a count have to\n * write it the way the provider's locale does — `1.234 records` is still the\n * English default, in a German-formatted app — and the locale is not known\n * until a provider says so. With no locale every number is written exactly as\n * the component wrote it inline before (`toLocaleString()` where it grouped,\n * a bare interpolation where it did not), which is what makes\n * `DEFAULT_SHELL_STRINGS` byte-identical to the strings it replaced.\n */\nfunction englishStrings(locale?: string): ShellStrings {\n const plain = (v: number) => formatPlain(v, locale);\n const grouped = (v: number) => formatGrouped(v, locale);\n const fixed = (v: number, digits: number) => formatFixed(v, digits, locale);\n const percent = (p: number, digits: number) => formatPercent(p, digits, locale);\n return {\n window: {\n minimize: 'Minimize',\n restore: 'Restore',\n maximize: 'Maximize',\n windowed: 'Windowed',\n pinOnTop: 'Pin on top',\n unpin: 'Unpin from top',\n close: 'Close',\n windowSuffix: 'window',\n prev: 'Prev',\n next: 'Next',\n snapLayouts: 'Snap layouts',\n snapLeft: 'Snap left half',\n snapRight: 'Snap right half',\n snapTopLeft: 'Snap top-left quarter',\n snapTopRight: 'Snap top-right quarter',\n snapBottomLeft: 'Snap bottom-left quarter',\n snapBottomRight: 'Snap bottom-right quarter',\n },\n taskbar: {\n closeWindow: 'Close window',\n offscreenHint: 'This window is off screen — click to bring it back',\n offscreenDot: 'Off screen — click to bring this window back',\n expose: 'Exposé — show all open windows as thumbnails',\n addToDesktop: 'Add to desktop',\n removeFromDesktop: 'Remove from desktop',\n minimizeAllWindows: 'Minimize all',\n restoreAllWindows: 'Restore all',\n closeAllWindows: 'Close all',\n },\n logout: {\n goodbye: 'Goodbye',\n seeYou: 'See you next time',\n },\n about: {\n aboutPrefix: 'About',\n thisApp: 'this app',\n openSourceLicenses: 'Open Source Licenses',\n whatsNew: \"What's New\",\n noChangelog: 'No changelog available.',\n },\n table: {\n empty: 'Nothing to show',\n loading: 'Loading',\n selectAll: 'Select all rows',\n selectRow: 'Select row',\n },\n select: {\n none: '— None —',\n noMatches: 'No matches',\n allSelected: 'All options selected',\n clear: 'Clear selection',\n remove: 'Remove',\n },\n notifications: {\n title: 'Notifications',\n markAllRead: 'Mark all read',\n dnd: 'Do not disturb',\n dndOn: 'Do not disturb is on',\n caughtUp: 'All caught up',\n empty: 'No notifications yet',\n viewAll: 'View all notifications',\n cardLabel: 'Notification',\n dismiss: 'Dismiss notification',\n },\n form: {\n errorSummaryTitle: 'There is a problem',\n },\n help: {\n title: 'Help',\n searchPlaceholder: 'Search help…',\n empty: 'No help articles yet.',\n noResults: 'No articles match your search.',\n loading: 'Loading…',\n pickArticle: 'Pick a help article from the left.',\n noBody: 'This article has no body yet.',\n draft: 'Draft',\n newArticle: '+ New',\n edit: 'Edit',\n },\n update: {\n available: 'A new version is available.',\n refreshNow: 'Refresh now',\n },\n pageTabs: {\n label: 'Open pages',\n close: 'Close',\n closeOthers: 'Close other tabs',\n closeRight: 'Close tabs to the right',\n closeAll: 'Close all tabs',\n unsaved: 'Unsaved changes',\n discardTitle: 'Discard unsaved changes?',\n discardOne: 'This page has changes that have not been saved. Close it anyway?',\n discardMany: 'pages have changes that have not been saved. Close them anyway?',\n discardConfirm: 'Discard and close',\n keepEditing: 'Keep editing',\n },\n dialog: {\n close: 'Close',\n cancel: 'Cancel',\n ok: 'OK',\n confirmTitle: 'Confirm',\n destructiveTitle: 'Confirm Action',\n destructiveCancel: 'Dismiss',\n destructiveConfirm: 'Delete',\n typeToConfirm: word => `Type ${word} to confirm:`,\n promptTitle: 'Enter a value',\n },\n calendar: {\n previousMonth: 'Previous month',\n nextMonth: 'Next month',\n previousYear: 'Previous year',\n nextYear: 'Next year',\n previousYears: 'Previous years',\n nextYears: 'Next years',\n monthPanel: 'Choose a month',\n yearPanel: 'Choose a year',\n chooseMonth: month => `Choose a month, currently ${month}`,\n // A year is never grouped: \"2,026\" is a quantity, not a year.\n chooseYear: year => `Choose a year, currently ${year}`,\n },\n datePicker: {\n placeholder: 'Select a date',\n dialog: 'Choose a date',\n clear: 'Clear',\n today: 'Today',\n },\n dateRange: {\n placeholder: 'Date Range',\n clearRange: 'Clear date range',\n dialog: 'Date range',\n from: 'From',\n to: 'To',\n start: 'Start',\n end: 'End',\n fromOnly: date => `From ${date}`,\n toOnly: date => `To ${date}`,\n last2Weeks: 'Last 2 Weeks',\n lastMonth: 'Last Month',\n last3Months: 'Last 3 Months',\n last6Months: 'Last 6 Months',\n last12Months: 'Last 12 Months',\n custom: 'Custom',\n clear: 'Clear',\n cancel: 'Cancel',\n apply: 'Apply',\n },\n pagination: {\n label: 'Pagination',\n first: 'First page',\n previous: 'Previous page',\n next: 'Next page',\n last: 'Last page',\n },\n list: {\n selected: count => `${plain(count)} selected`,\n allLoaded: (total, label) => `All ${grouped(total)} ${label} loaded`,\n count: (total, label) => `${grouped(total)} ${label}`,\n loadedOf: (loaded, total, label) => `${grouped(loaded)} of ${grouped(total)} ${label}`,\n loadingMore: 'Loading more...',\n loadError: \"Couldn't load this list\",\n loadErrorMessage: 'Something went wrong fetching these records. Check your connection and try again.',\n retry: 'Try again',\n },\n kanban: {\n loading: 'Loading…',\n empty: 'No items.',\n dropHere: 'Drop here',\n addItem: 'Add item',\n },\n files: {\n attach: 'Attach files',\n drop: 'Drop files to attach',\n remove: name => `Remove ${name}`,\n chooseMany: 'Choose files',\n chooseOne: 'Choose a file',\n dragMany: 'or drag them here',\n dragOne: 'or drag it here',\n notAccepted: (name, hint) => `${name} is not an accepted file type${hint ? ` (${hint})` : ''}`,\n tooLarge: (name, size, limit) => `${name} is ${size} — the limit is ${limit}`,\n tooMany: (name, max) => `${name} was not added — ${plain(max)} ${max === 1 ? 'file' : 'files'} is the limit`,\n bytes: value => `${plain(value)} B`,\n kilobytes: value => `${plain(value)} KB`,\n megabytes: value => `${fixed(value, 1)} MB`,\n },\n media: {\n uploadImage: 'Upload an image',\n uploadVideo: 'Upload a video',\n uploadFile: 'Upload a file',\n upload: 'Upload media',\n cta: 'Choose from library or upload',\n replace: 'Replace',\n remove: 'Remove',\n uploading: 'Uploading…',\n cover: 'Cover',\n add: 'Add',\n addMedia: 'Add media',\n empty: 'No media.',\n removeItem: name => `Remove ${name}`,\n reorder: (name, position, total) =>\n `${name}, item ${plain(position)} of ${plain(total)}. Use arrow keys to reorder.`,\n },\n brandAsset: {\n save: noun => `Save ${noun}`,\n remove: noun => `Remove ${noun}`,\n discard: 'Discard change',\n saveFailed: noun => `Could not save ${noun}.`,\n removeFailed: noun => `Could not remove ${noun}.`,\n region: (assetName, subjectName) => `${assetName} for ${subjectName}`,\n usedFor: subjectName => `Used for ${subjectName}.`,\n previews: assetName => `${assetName} previews`,\n preview: 'Preview',\n alt: (subjectName, assetName) => `${subjectName} ${assetName}`,\n },\n copy: {\n copy: 'Copy',\n copyLabel: label => `Copy ${label}`,\n copied: 'Copied',\n copiedLabel: label => `${label} copied`,\n failed: 'Could not copy to the clipboard',\n },\n keypad: {\n backspace: 'Backspace',\n enter: 'Enter',\n },\n banner: {\n dismiss: 'Dismiss',\n },\n badge: {\n remove: 'Remove',\n removeItem: label => `Remove ${label}`,\n },\n breadcrumbs: {\n label: 'Breadcrumb',\n hidden: 'Hidden crumbs',\n },\n emptyState: {\n message: 'Nothing here yet.',\n },\n errors: {\n notFound: 'Page not found',\n notFoundBody: \"The page you're looking for doesn't exist or was moved.\",\n forbidden: 'Access denied',\n forbiddenBody: \"You don't have permission to view this page.\",\n noAccess: \"You don't have access to this\",\n serverError: 'Something went wrong',\n serverErrorBody: 'An unexpected error occurred. Please try again.',\n retry: 'Try again',\n details: 'Error details',\n },\n search: {\n placeholder: 'Search...',\n escBadge: 'ESC',\n searching: 'Searching...',\n noResults: 'No results found.',\n minChars: min => `Type at least ${plain(min)} characters to search...`,\n navigate: 'navigate',\n open: 'open',\n close: 'close',\n enterKey: 'Enter',\n escKey: 'Esc',\n },\n grid: {\n selectAll: 'Select all',\n insertRowAbove: 'Insert row above',\n insertRowBelow: 'Insert row below',\n // A row NUMBER, as the grid's own row header prints it — never grouped.\n deleteRow: row => `Delete row ${row}`,\n insertColumnLeft: 'Insert column left',\n insertColumnRight: 'Insert column right',\n deleteColumn: column => `Delete column ${column}`,\n resize: 'Drag to resize · double-click to auto-fit',\n fill: 'Drag to fill',\n },\n sidebar: {\n resize: 'Drag to resize · double-click to reset',\n },\n markdown: {\n screenshot: 'Screenshot',\n },\n severity: {\n success: 'ok',\n warning: 'warning',\n danger: 'critical',\n unrecognised: token => `unrecognised severity ${token}`,\n },\n meter: {\n noData: 'no data',\n warningAt: bound => `warning ≥ ${plain(bound)}`,\n criticalAt: bound => `critical ≥ ${plain(bound)}`,\n noReading: 'no reading',\n noBudget: 'no budget',\n ofBudget: value => `${value} of budget`,\n budget: 'budget',\n hoursMinutes: (hours, minutes) => `${plain(hours)}h ${plain(minutes)}m`,\n minutesSeconds: (minutes, seconds) => `${plain(minutes)}m ${plain(seconds)}s`,\n seconds: seconds => `${plain(seconds)}s`,\n },\n charts: {\n showTable: 'Show the data as a table',\n loading: 'Loading chart data',\n noData: 'No data in this window.',\n windowStart: 'Window start',\n windowEnd: 'Window end',\n window: (from, to, count) => `Time window — showing ${from} to ${to} of ${plain(count)} intervals`,\n overIntervals: (series, count) => `${series.join(', ')} over ${plain(count)} intervals`,\n acrossCategories: (series, count) => `${series.join(', ')} across ${plain(count)} categories`,\n acrossMeasures: (series, count) => `${series.join(', ')} across ${plain(count)} measures`,\n breakdown: (total, segments) => `Breakdown of ${total} across ${plain(segments)} segments`,\n funnel: (stages, first, last) => `Funnel of ${plain(stages)} stages, ${first} down to ${last}`,\n radialTrack: count => `${plain(count)} categories, as concentric proportions`,\n radialCycle: count => `${plain(count)} categories, around a cycle`,\n tableFrom: 'From',\n tableTo: 'To',\n tableItem: 'Item',\n tableLevel: 'Level',\n tableSeries: 'Series',\n inBucket: total => `${total} in this bucket`,\n inCategory: total => `${total} in this category`,\n value: 'Value',\n share: 'Share',\n count: 'Count',\n flow: 'Flow',\n totalFlow: 'Total flow',\n throughput: 'Throughput',\n open: 'Open',\n high: 'High',\n low: 'Low',\n close: 'Close',\n maximum: 'Maximum',\n q3: 'Q3',\n median: 'Median',\n q1: 'Q1',\n minimum: 'Minimum',\n distribution: 'Distribution',\n fiveNumber: (label, count) => `${label}: five-number summary for ${plain(count)} categories`,\n outliers: count => `${plain(count)} outlier${count > 1 ? 's' : ''} beyond the whiskers`,\n price: 'Price',\n ohlc: (label, count) => `${label}: open, high, low and close across ${plain(count)} periods`,\n closedAbove: 'Closed above its open',\n closedBelow: 'Closed below its open',\n noFlows: 'No flows to chart.',\n chord: count => `Flows between ${plain(count)} participants`,\n noStages: 'No stages to chart.',\n ofFirstStage: 'Of first stage',\n droppedHere: 'Dropped here',\n intensity: 'Intensity',\n noActivity: 'No activity in this window.',\n heatmap: (label, rows, columns) => `${label} across ${plain(rows)} rows and ${plain(columns)} columns`,\n countAxis: 'count',\n histogram: (label, bins, observations) =>\n `${label}: ${plain(bins)} bins over ${plain(observations)} observations`,\n observations: 'Observations',\n notEnough: 'Not enough eligible requests to judge.',\n objectiveMet: objective => `objective ${objective} met`,\n objectiveMissed: objective => `objective ${objective} missed`,\n nothingToPlot: 'Nothing to plot.',\n nothingToCompare: 'Nothing to compare.',\n other: 'Other',\n nothingToBreakDown: 'Nothing to break down.',\n range: 'Range',\n rangeLabel: (label, count) => `${label}: low and high across ${plain(count)} categories`,\n nothingToRank: 'Nothing to rank in this window.',\n emphasised: '(emphasised)',\n sankey: (nodes, links) => `Flow between ${plain(nodes)} nodes over ${plain(links)} links`,\n noObservations: 'No observations in this window.',\n xAxis: 'x',\n yAxis: 'y',\n size: 'Size',\n scatter: (series, yLabel, xLabel) => `${series.join(', ')}: ${yLabel} against ${xLabel}`,\n outsideRange: count => `${plain(count)} ${count === 1 ? 'point' : 'points'} outside the shown range`,\n waterfall: (steps, from, to) => `Waterfall of ${plain(steps)} steps from ${from} to ${to}`,\n balance: 'Balance',\n increase: 'Increase',\n decrease: 'Decrease',\n runningTotal: 'Running total',\n sunburst: (total, depth) => `Hierarchy of ${total} across ${plain(depth)} levels`,\n treemap: count => `Treemap of ${plain(count)} items`,\n trendUp: 'up',\n trendDown: 'down',\n trendFlat: 'flat',\n },\n timeline: {\n days: count => `${grouped(count)} days`,\n daysToToday: count => `${grouped(count)} days to today`,\n notReached: 'Not yet reached',\n next: 'Next',\n more: count => `+${plain(count)} more`,\n today: 'Today',\n todayTitle: date => `Today — ${date}`,\n open: name => `Open ${name}`,\n openButton: 'Open',\n scrub: 'Scrub the timeline',\n alsoToCome: names => `Also to come: ${names.join(', ')}`,\n start: date => `Start · ${date}`,\n events: (count, names) => `${plain(count)} events · ${names.join(', ')}`,\n started: date => `started ${date}`,\n duration: days => `${grouped(days)} day${days === 1 ? '' : 's'}`,\n reached: (dated, total) => `${plain(dated)} of ${plain(total)} milestones`,\n milestones: title => `${title} milestones`,\n },\n production: {\n heading: 'Production progress',\n start: 'Start',\n estimated: 'Estimated',\n estimatedCompletion: 'Estimated completion',\n estDone: 'Est. done',\n play: 'Play',\n pause: 'Pause',\n playTitle: 'Play the timeline, report by report',\n backTo: report => `Back to ${report}`,\n showing: report => `Showing ${report}`,\n overall: p => `${percent(p, 0)} overall`,\n inStock: pieces => `${grouped(pieces)} pc in stock`,\n noReport: 'No production report filed yet',\n leadTime: days => `${grouped(days)} day${days === 1 ? '' : 's'} lead time`,\n report: 'Production report',\n shipment: 'Shipment',\n inspection: 'Inspection',\n invoice: 'Invoice',\n scrub: 'Scrub the production timeline',\n label: (from, to) => `Production reports and events, ${from} to ${to}`,\n },\n containers: {\n items: count => `${plain(count)} items`,\n pieces: count => `${plain(count)} pcs`,\n split: (instructed, loaded) => `(${plain(instructed)} instr / ${plain(loaded)} loaded)`,\n added: (count, pieces) => `${plain(count)} new (${plain(pieces)} pcs)`,\n fill: (volume, capacity) => `${fixed(volume, 1)} / ${plain(capacity)} m³`,\n total: 'Total:',\n instructed: volume => `${fixed(volume, 2)} m³ instruction`,\n loaded: volume => `${fixed(volume, 2)} m³ loaded`,\n volume: volume => `${fixed(volume, 2)} m³`,\n noVolume: 'Volume: N/A (no volume data for these part numbers)',\n },\n toast: {\n notification: 'Notification',\n },\n };\n}\n\nexport const DEFAULT_SHELL_STRINGS: ShellStrings = englishStrings();\n\n/** The English defaults per locale — a provider re-rendering with the same\n * locale gets the same object, so its merge memo holds. */\nconst localisedDefaults = new Map<string, ShellStrings>();\n\nfunction defaultsFor(locale: string | undefined): ShellStrings {\n if (!locale) return DEFAULT_SHELL_STRINGS;\n let defaults = localisedDefaults.get(locale);\n if (!defaults) {\n defaults = englishStrings(locale);\n localisedDefaults.set(locale, defaults);\n }\n return defaults;\n}\n\n/** A per-section partial: override any subset of a section's strings. */\nexport type ShellStringsOverride = {\n [S in keyof ShellStrings]?: Partial<ShellStrings[S]>;\n};\n\nconst ShellStringsContext = createContext<ShellStrings>(DEFAULT_SHELL_STRINGS);\n\n/** `null` outside any provider — which is how a provider tells it is nested. */\nconst ShellLocaleContext = createContext<{ locale: string | undefined } | null>(null);\n\nconst reportedLocales = new Set<string>();\n\n/**\n * The tag in canonical form, or `undefined` for one `Intl` refuses.\n *\n * Refused here, once, rather than at every formatter: `new Intl.DateTimeFormat\n * ('en_US')` throws, and a malformed tag would otherwise take down whichever\n * component formatted a number first — in render, where the error boundary is\n * the only thing left to catch it. A tag that is well formed but names nothing\n * the runtime has (`xx-YY`) is not an error: `Intl` falls back on its own.\n */\nfunction canonicalLocale(tag: string | undefined): string | undefined {\n if (!tag) return undefined;\n try {\n return Intl.getCanonicalLocales(tag)[0];\n } catch {\n if (!reportedLocales.has(tag)) {\n reportedLocales.add(tag);\n console.error(\n `[efficient-shell] ShellStringsProvider: locale=\"${tag}\" is not a BCP 47 language tag, so it is ` +\n 'ignored and numbers and dates keep their default formatting. Pass a tag such as \"de-DE\" or \"ja\".',\n );\n }\n return undefined;\n }\n}\n\n/**\n * The catalog for code that runs outside React — `toast` builds its DOM by\n * hand, long after any render. It follows the OUTERMOST mounted provider (the\n * app's own, not a subtree's), and is the English defaults when none is\n * mounted. Not part of the public surface: components read `useShellStrings`.\n */\nlet outermost: ShellStrings = DEFAULT_SHELL_STRINGS;\n\n/** One empty override for every provider given none — a fresh `{}` per render\n * would re-merge, and re-render every reader, each time the provider did. */\nconst NO_OVERRIDE: ShellStringsOverride = {};\n\nexport function currentShellStrings(): ShellStrings {\n return outermost;\n}\n\n/**\n * Mount once, near the top of the app. `value` is a partial — sections and\n * keys you do not translate keep their English defaults, so a catalog never\n * breaks by falling behind a release.\n *\n * `locale` is a BCP 47 tag (`'de-DE'`, `'ja'`, `'zh-Hant'`) for how numbers and\n * dates are written; omit it and they are written exactly as without a\n * provider. A nested provider without a `locale` keeps its parent's — a subtree\n * that overrides one string should not lose the app's number format. Strings\n * do not cascade that way: a nested provider's `value` merges onto the English\n * defaults, as it always has.\n */\nexport function ShellStringsProvider({ value = NO_OVERRIDE, locale, children }: {\n value?: ShellStringsOverride;\n locale?: string;\n children: ReactNode;\n}) {\n const parent = useContext(ShellLocaleContext);\n const own = useMemo(() => canonicalLocale(locale), [locale]);\n const active = locale === undefined ? parent?.locale : own;\n const merged = useMemo<ShellStrings>(() => {\n const base = defaultsFor(active);\n const out = {} as ShellStrings;\n for (const key of Object.keys(base) as (keyof ShellStrings)[]) {\n out[key] = { ...base[key], ...(value[key] ?? {}) } as never;\n }\n return out;\n }, [value, active]);\n const localeValue = useMemo(() => ({ locale: active }), [active]);\n\n const nested = parent !== null;\n useEffect(() => {\n if (nested) return;\n outermost = merged;\n return () => {\n if (outermost === merged) outermost = DEFAULT_SHELL_STRINGS;\n };\n }, [merged, nested]);\n\n return (\n <ShellLocaleContext.Provider value={localeValue}>\n <ShellStringsContext.Provider value={merged}>{children}</ShellStringsContext.Provider>\n </ShellLocaleContext.Provider>\n );\n}\n\n/** The active catalog — English defaults when no provider is mounted. */\nexport function useShellStrings(): ShellStrings {\n return useContext(ShellStringsContext);\n}\n\n/**\n * The provider's `locale`, canonicalised — `undefined` when there is no\n * provider or it was given none. Hand it to `formatDate(value, { locale })`,\n * `fmtSliderDate(ms, locale)`, or `Intl` directly, so a host's own cells write\n * numbers and dates the way the kit's do.\n */\nexport function useShellLocale(): string | undefined {\n return useContext(ShellLocaleContext)?.locale;\n}\n\n/**\n * The text either side of the value in a catalog sentence, for the few\n * sentences that wrap their value in markup of its own — \"Type <kbd>DELETE</kbd>\n * to confirm:\", \"Showing <b>PR-7</b>\".\n *\n * The entry stays a plain `(word) => string`, so a translator writes a sentence\n * and puts the word wherever their language does; the kit calls it with a\n * marker no sentence contains and splits there. A sentence that leaves the word\n * out entirely comes back whole, as the text before it.\n */\nexport function splitAround(sentence: (slot: string) => string): [string, string] {\n const MARK = '\\u0000';\n const [before = '', ...after] = sentence(MARK).split(MARK);\n return [before, after.join('')];\n}\n"]}
@@ -1,94 +0,0 @@
1
- // src/apps/_weatherData.ts
2
- var WMO = {
3
- 0: ["Clear Sky", "\u2600\uFE0F", "\u{1F319}", "from-sky-400 to-blue-500", "from-indigo-900 to-slate-950"],
4
- 1: ["Mainly Clear", "\u{1F324}\uFE0F", "\u{1F319}", "from-sky-400 to-blue-500", "from-indigo-900 to-slate-950"],
5
- 2: ["Partly Cloudy", "\u26C5", "\u2601\uFE0F", "from-sky-400 to-blue-400", "from-indigo-800 to-slate-900"],
6
- 3: ["Overcast", "\u2601\uFE0F", "\u2601\uFE0F", "from-gray-400 to-gray-500", "from-gray-700 to-slate-900"],
7
- 45: ["Foggy", "\u{1F32B}\uFE0F", "\u{1F32B}\uFE0F", "from-gray-400 to-gray-500", "from-gray-700 to-slate-800"],
8
- 48: ["Foggy", "\u{1F32B}\uFE0F", "\u{1F32B}\uFE0F", "from-gray-400 to-gray-500", "from-gray-700 to-slate-800"],
9
- 51: ["Light Drizzle", "\u{1F326}\uFE0F", "\u{1F327}\uFE0F", "from-gray-400 to-blue-500", "from-gray-700 to-indigo-900"],
10
- 53: ["Drizzle", "\u{1F327}\uFE0F", "\u{1F327}\uFE0F", "from-gray-500 to-blue-600", "from-gray-700 to-indigo-900"],
11
- 55: ["Heavy Drizzle", "\u{1F327}\uFE0F", "\u{1F327}\uFE0F", "from-gray-500 to-blue-600", "from-gray-700 to-indigo-900"],
12
- 61: ["Light Rain", "\u{1F326}\uFE0F", "\u{1F327}\uFE0F", "from-gray-400 to-blue-500", "from-gray-700 to-indigo-900"],
13
- 63: ["Rain", "\u{1F327}\uFE0F", "\u{1F327}\uFE0F", "from-gray-500 to-blue-600", "from-gray-700 to-indigo-900"],
14
- 65: ["Heavy Rain", "\u{1F327}\uFE0F", "\u{1F327}\uFE0F", "from-gray-600 to-blue-700", "from-gray-700 to-indigo-950"],
15
- 71: ["Light Snow", "\u{1F328}\uFE0F", "\u{1F328}\uFE0F", "from-blue-200 to-blue-400", "from-blue-800 to-slate-900"],
16
- 73: ["Snow", "\u2744\uFE0F", "\u2744\uFE0F", "from-blue-300 to-blue-500", "from-blue-800 to-slate-900"],
17
- 75: ["Heavy Snow", "\u2744\uFE0F", "\u2744\uFE0F", "from-blue-400 to-blue-600", "from-blue-800 to-slate-900"],
18
- 80: ["Rain Showers", "\u{1F327}\uFE0F", "\u{1F327}\uFE0F", "from-gray-500 to-blue-600", "from-gray-700 to-indigo-900"],
19
- 82: ["Heavy Showers", "\u{1F327}\uFE0F", "\u{1F327}\uFE0F", "from-gray-600 to-blue-700", "from-gray-700 to-indigo-950"],
20
- 95: ["Thunderstorm", "\u26C8\uFE0F", "\u26C8\uFE0F", "from-gray-700 to-indigo-800", "from-gray-800 to-indigo-950"],
21
- 96: ["Thunderstorm", "\u26C8\uFE0F", "\u26C8\uFE0F", "from-gray-700 to-indigo-800", "from-gray-800 to-indigo-950"],
22
- 99: ["Thunderstorm", "\u26C8\uFE0F", "\u26C8\uFE0F", "from-gray-700 to-indigo-900", "from-gray-800 to-indigo-950"]
23
- };
24
- var getCondition = (code, isDay = true) => {
25
- const entry = WMO[code] || ["Unknown", "\u2753", "\u2753", "from-gray-400 to-gray-500", "from-gray-700 to-slate-800"];
26
- return [entry[0], isDay ? entry[1] : entry[2], isDay ? entry[3] : entry[4]];
27
- };
28
- var AVAILABLE_CITIES = {
29
- "Sydney": { lat: -33.8688, lon: 151.2093, tz: "Australia/Sydney" },
30
- "Melbourne": { lat: -37.8136, lon: 144.9631, tz: "Australia/Melbourne" },
31
- "Auckland": { lat: -36.8485, lon: 174.7633, tz: "Pacific/Auckland" },
32
- "Tokyo": { lat: 35.6762, lon: 139.6503, tz: "Asia/Tokyo" },
33
- "Shanghai": { lat: 31.2304, lon: 121.4737, tz: "Asia/Shanghai" },
34
- "Hong Kong": { lat: 22.3193, lon: 114.1694, tz: "Asia/Hong_Kong" },
35
- "Singapore": { lat: 1.3521, lon: 103.8198, tz: "Asia/Singapore" },
36
- "Bangkok": { lat: 13.7563, lon: 100.5018, tz: "Asia/Bangkok" },
37
- "Mumbai": { lat: 19.076, lon: 72.8777, tz: "Asia/Kolkata" },
38
- "Dubai": { lat: 25.2048, lon: 55.2708, tz: "Asia/Dubai" },
39
- "Berlin": { lat: 52.52, lon: 13.405, tz: "Europe/Berlin" },
40
- "Paris": { lat: 48.8566, lon: 2.3522, tz: "Europe/Paris" },
41
- "London": { lat: 51.5074, lon: -0.1278, tz: "Europe/London" },
42
- "New York": { lat: 40.7128, lon: -74.006, tz: "America/New_York" },
43
- "Miami": { lat: 25.7617, lon: -80.1918, tz: "America/New_York" },
44
- "Toronto": { lat: 43.6532, lon: -79.3832, tz: "America/Toronto" },
45
- "Chicago": { lat: 41.8781, lon: -87.6298, tz: "America/Chicago" },
46
- "Los Angeles": { lat: 34.0522, lon: -118.2437, tz: "America/Los_Angeles" }
47
- };
48
- var WEATHER_CACHE_KEY = "weather_local_cache";
49
- var WEATHER_CACHE_TTL = 30 * 60 * 1e3;
50
- function readCache() {
51
- try {
52
- return JSON.parse(localStorage.getItem(WEATHER_CACHE_KEY) || "{}");
53
- } catch {
54
- return {};
55
- }
56
- }
57
- function writeCache(c) {
58
- try {
59
- localStorage.setItem(WEATHER_CACHE_KEY, JSON.stringify(c));
60
- } catch {
61
- }
62
- }
63
- async function fetchCityWeather(cityName, force = false) {
64
- const coords = AVAILABLE_CITIES[cityName];
65
- if (!coords) return null;
66
- if (!force) {
67
- const cached = readCache()[cityName];
68
- if (cached && Date.now() - cached.ts < WEATHER_CACHE_TTL) return cached.data;
69
- }
70
- try {
71
- const res = await fetch(`https://api.open-meteo.com/v1/forecast?latitude=${coords.lat}&longitude=${coords.lon}&current=temperature_2m,weather_code,is_day&daily=temperature_2m_max,temperature_2m_min&forecast_days=1&timezone=auto`);
72
- const w = await res.json();
73
- const cw = {
74
- city: cityName,
75
- temp: Math.round(w.current.temperature_2m),
76
- code: w.current.weather_code,
77
- high: Math.round(w.daily.temperature_2m_max[0]),
78
- low: Math.round(w.daily.temperature_2m_min[0]),
79
- isDay: w.current.is_day === 1,
80
- timezone: w.timezone || "UTC"
81
- };
82
- const c = readCache();
83
- c[cityName] = { data: cw, ts: Date.now() };
84
- writeCache(c);
85
- return cw;
86
- } catch {
87
- return null;
88
- }
89
- }
90
- var toFahrenheit = (c) => Math.round(c * 9 / 5 + 32);
91
-
92
- export { AVAILABLE_CITIES, fetchCityWeather, getCondition, toFahrenheit };
93
- //# sourceMappingURL=chunk-7CCHEEYC.js.map
94
- //# sourceMappingURL=chunk-7CCHEEYC.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/apps/_weatherData.ts"],"names":[],"mappings":";AASO,IAAM,GAAA,GAAgE;AAAA,EAC3E,GAAG,CAAC,WAAA,EAAa,cAAA,EAAM,WAAA,EAAM,4BAA4B,8BAA8B,CAAA;AAAA,EACvF,GAAG,CAAC,cAAA,EAAgB,iBAAA,EAAO,WAAA,EAAM,4BAA4B,8BAA8B,CAAA;AAAA,EAC3F,GAAG,CAAC,eAAA,EAAiB,QAAA,EAAK,cAAA,EAAM,4BAA4B,8BAA8B,CAAA;AAAA,EAC1F,GAAG,CAAC,UAAA,EAAY,cAAA,EAAM,cAAA,EAAM,6BAA6B,4BAA4B,CAAA;AAAA,EACrF,IAAI,CAAC,OAAA,EAAS,iBAAA,EAAO,iBAAA,EAAO,6BAA6B,4BAA4B,CAAA;AAAA,EACrF,IAAI,CAAC,OAAA,EAAS,iBAAA,EAAO,iBAAA,EAAO,6BAA6B,4BAA4B,CAAA;AAAA,EACrF,IAAI,CAAC,eAAA,EAAiB,iBAAA,EAAO,iBAAA,EAAO,6BAA6B,6BAA6B,CAAA;AAAA,EAC9F,IAAI,CAAC,SAAA,EAAW,iBAAA,EAAO,iBAAA,EAAO,6BAA6B,6BAA6B,CAAA;AAAA,EACxF,IAAI,CAAC,eAAA,EAAiB,iBAAA,EAAO,iBAAA,EAAO,6BAA6B,6BAA6B,CAAA;AAAA,EAC9F,IAAI,CAAC,YAAA,EAAc,iBAAA,EAAO,iBAAA,EAAO,6BAA6B,6BAA6B,CAAA;AAAA,EAC3F,IAAI,CAAC,MAAA,EAAQ,iBAAA,EAAO,iBAAA,EAAO,6BAA6B,6BAA6B,CAAA;AAAA,EACrF,IAAI,CAAC,YAAA,EAAc,iBAAA,EAAO,iBAAA,EAAO,6BAA6B,6BAA6B,CAAA;AAAA,EAC3F,IAAI,CAAC,YAAA,EAAc,iBAAA,EAAO,iBAAA,EAAO,6BAA6B,4BAA4B,CAAA;AAAA,EAC1F,IAAI,CAAC,MAAA,EAAQ,cAAA,EAAM,cAAA,EAAM,6BAA6B,4BAA4B,CAAA;AAAA,EAClF,IAAI,CAAC,YAAA,EAAc,cAAA,EAAM,cAAA,EAAM,6BAA6B,4BAA4B,CAAA;AAAA,EACxF,IAAI,CAAC,cAAA,EAAgB,iBAAA,EAAO,iBAAA,EAAO,6BAA6B,6BAA6B,CAAA;AAAA,EAC7F,IAAI,CAAC,eAAA,EAAiB,iBAAA,EAAO,iBAAA,EAAO,6BAA6B,6BAA6B,CAAA;AAAA,EAC9F,IAAI,CAAC,cAAA,EAAgB,cAAA,EAAM,cAAA,EAAM,+BAA+B,6BAA6B,CAAA;AAAA,EAC7F,IAAI,CAAC,cAAA,EAAgB,cAAA,EAAM,cAAA,EAAM,+BAA+B,6BAA6B,CAAA;AAAA,EAC7F,IAAI,CAAC,cAAA,EAAgB,cAAA,EAAM,cAAA,EAAM,+BAA+B,6BAA6B;AAC/F,CAAA;AAEO,IAAM,YAAA,GAAe,CAAC,IAAA,EAAc,KAAA,GAAQ,IAAA,KAAmC;AACpF,EAAA,MAAM,KAAA,GAAQ,IAAI,IAAI,CAAA,IAAK,CAAC,SAAA,EAAW,QAAA,EAAK,QAAA,EAAK,2BAAA,EAA6B,4BAA4B,CAAA;AAC1G,EAAA,OAAO,CAAC,KAAA,CAAM,CAAC,CAAA,EAAG,KAAA,GAAQ,MAAM,CAAC,CAAA,GAAI,KAAA,CAAM,CAAC,GAAG,KAAA,GAAQ,KAAA,CAAM,CAAC,CAAA,GAAI,KAAA,CAAM,CAAC,CAAC,CAAA;AAC5E;AAEO,IAAM,gBAAA,GAA6E;AAAA,EACxF,UAAgB,EAAE,GAAA,EAAK,UAAU,GAAA,EAAK,QAAA,EAAU,IAAI,kBAAA,EAAmB;AAAA,EACvE,aAAgB,EAAE,GAAA,EAAK,UAAU,GAAA,EAAK,QAAA,EAAU,IAAI,qBAAA,EAAsB;AAAA,EAC1E,YAAgB,EAAE,GAAA,EAAK,UAAU,GAAA,EAAK,QAAA,EAAU,IAAI,kBAAA,EAAmB;AAAA,EACvE,SAAgB,EAAE,GAAA,EAAK,SAAU,GAAA,EAAK,QAAA,EAAU,IAAI,YAAA,EAAa;AAAA,EACjE,YAAgB,EAAE,GAAA,EAAK,SAAU,GAAA,EAAK,QAAA,EAAU,IAAI,eAAA,EAAgB;AAAA,EACpE,aAAgB,EAAE,GAAA,EAAK,SAAU,GAAA,EAAK,QAAA,EAAU,IAAI,gBAAA,EAAiB;AAAA,EACrE,aAAgB,EAAE,GAAA,EAAK,QAAU,GAAA,EAAK,QAAA,EAAU,IAAI,gBAAA,EAAiB;AAAA,EACrE,WAAgB,EAAE,GAAA,EAAK,SAAU,GAAA,EAAK,QAAA,EAAU,IAAI,cAAA,EAAe;AAAA,EACnE,UAAgB,EAAE,GAAA,EAAK,QAAU,GAAA,EAAK,OAAA,EAAU,IAAI,cAAA,EAAe;AAAA,EACnE,SAAgB,EAAE,GAAA,EAAK,SAAU,GAAA,EAAK,OAAA,EAAU,IAAI,YAAA,EAAa;AAAA,EACjE,UAAgB,EAAE,GAAA,EAAK,OAAU,GAAA,EAAK,MAAA,EAAU,IAAI,eAAA,EAAgB;AAAA,EACpE,SAAgB,EAAE,GAAA,EAAK,SAAU,GAAA,EAAK,MAAA,EAAU,IAAI,cAAA,EAAe;AAAA,EACnE,UAAgB,EAAE,GAAA,EAAK,SAAU,GAAA,EAAK,OAAA,EAAU,IAAI,eAAA,EAAgB;AAAA,EACpE,YAAgB,EAAE,GAAA,EAAK,SAAU,GAAA,EAAK,OAAA,EAAU,IAAI,kBAAA,EAAmB;AAAA,EACvE,SAAgB,EAAE,GAAA,EAAK,SAAU,GAAA,EAAK,QAAA,EAAU,IAAI,kBAAA,EAAmB;AAAA,EACvE,WAAgB,EAAE,GAAA,EAAK,SAAU,GAAA,EAAK,QAAA,EAAU,IAAI,iBAAA,EAAkB;AAAA,EACtE,WAAgB,EAAE,GAAA,EAAK,SAAU,GAAA,EAAK,QAAA,EAAU,IAAI,iBAAA,EAAkB;AAAA,EACtE,eAAgB,EAAE,GAAA,EAAK,SAAU,GAAA,EAAK,SAAA,EAAW,IAAI,qBAAA;AACvD;AAEO,IAAM,iBAAA,GAAoB,qBAAA;AAC1B,IAAM,iBAAA,GAAoB,KAAK,EAAA,GAAK,GAAA;AAe3C,SAAS,SAAA,GAA0B;AACjC,EAAA,IAAI;AAAE,IAAA,OAAO,KAAK,KAAA,CAAM,YAAA,CAAa,OAAA,CAAQ,iBAAiB,KAAK,IAAI,CAAA;AAAA,EAAG,CAAA,CAAA,MAAQ;AAAE,IAAA,OAAO,EAAC;AAAA,EAAG;AACjG;AACA,SAAS,WAAW,CAAA,EAAiB;AACnC,EAAA,IAAI;AAAE,IAAA,YAAA,CAAa,OAAA,CAAQ,iBAAA,EAAmB,IAAA,CAAK,SAAA,CAAU,CAAC,CAAC,CAAA;AAAA,EAAG,CAAA,CAAA,MAAQ;AAAA,EAAC;AAC7E;AAIA,eAAsB,gBAAA,CAAiB,QAAA,EAAkB,KAAA,GAAQ,KAAA,EAAoC;AACnG,EAAA,MAAM,MAAA,GAAS,iBAAiB,QAAQ,CAAA;AACxC,EAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AACpB,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,MAAM,MAAA,GAAS,SAAA,EAAU,CAAE,QAAQ,CAAA;AACnC,IAAA,IAAI,MAAA,IAAU,KAAK,GAAA,EAAI,GAAI,OAAO,EAAA,GAAK,iBAAA,SAA0B,MAAA,CAAO,IAAA;AAAA,EAC1E;AACA,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,CAAA,gDAAA,EAAmD,OAAO,GAAG,CAAA,WAAA,EAAc,MAAA,CAAO,GAAG,CAAA,qHAAA,CAAuH,CAAA;AACpO,IAAA,MAAM,CAAA,GAAI,MAAM,GAAA,CAAI,IAAA,EAAK;AACzB,IAAA,MAAM,EAAA,GAAkB;AAAA,MACtB,IAAA,EAAM,QAAA;AAAA,MACN,IAAA,EAAM,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,QAAQ,cAAc,CAAA;AAAA,MACzC,IAAA,EAAM,EAAE,OAAA,CAAQ,YAAA;AAAA,MAChB,MAAM,IAAA,CAAK,KAAA,CAAM,EAAE,KAAA,CAAM,kBAAA,CAAmB,CAAC,CAAC,CAAA;AAAA,MAC9C,KAAK,IAAA,CAAK,KAAA,CAAM,EAAE,KAAA,CAAM,kBAAA,CAAmB,CAAC,CAAC,CAAA;AAAA,MAC7C,KAAA,EAAO,CAAA,CAAE,OAAA,CAAQ,MAAA,KAAW,CAAA;AAAA,MAC5B,QAAA,EAAU,EAAE,QAAA,IAAY;AAAA,KAC1B;AACA,IAAA,MAAM,IAAI,SAAA,EAAU;AACpB,IAAA,CAAA,CAAE,QAAQ,IAAI,EAAE,IAAA,EAAM,IAAI,EAAA,EAAI,IAAA,CAAK,KAAI,EAAE;AACzC,IAAA,UAAA,CAAW,CAAC,CAAA;AACZ,IAAA,OAAO,EAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEO,IAAM,YAAA,GAAe,CAAC,CAAA,KAAc,IAAA,CAAK,MAAM,CAAA,GAAI,CAAA,GAAI,IAAI,EAAE","file":"chunk-7CCHEEYC.js","sourcesContent":["/**\n * Shared weather data — used by Weather (single-city tile with animations)\n * and WorldClock (multi-city list with per-row weather + day/night via the\n * emoji). Single source of truth for the WMO code map, the supported city\n * coordinates, and the localStorage cache so both widgets share fetched\n * data.\n */\n\n// [condition, day emoji, night emoji, day gradient, night gradient]\nexport const WMO: Record<number, [string, string, string, string, string]> = {\n 0: ['Clear Sky', '☀️', '🌙', 'from-sky-400 to-blue-500', 'from-indigo-900 to-slate-950'],\n 1: ['Mainly Clear', '🌤️', '🌙', 'from-sky-400 to-blue-500', 'from-indigo-900 to-slate-950'],\n 2: ['Partly Cloudy', '⛅', '☁️', 'from-sky-400 to-blue-400', 'from-indigo-800 to-slate-900'],\n 3: ['Overcast', '☁️', '☁️', 'from-gray-400 to-gray-500', 'from-gray-700 to-slate-900'],\n 45: ['Foggy', '🌫️', '🌫️', 'from-gray-400 to-gray-500', 'from-gray-700 to-slate-800'],\n 48: ['Foggy', '🌫️', '🌫️', 'from-gray-400 to-gray-500', 'from-gray-700 to-slate-800'],\n 51: ['Light Drizzle', '🌦️', '🌧️', 'from-gray-400 to-blue-500', 'from-gray-700 to-indigo-900'],\n 53: ['Drizzle', '🌧️', '🌧️', 'from-gray-500 to-blue-600', 'from-gray-700 to-indigo-900'],\n 55: ['Heavy Drizzle', '🌧️', '🌧️', 'from-gray-500 to-blue-600', 'from-gray-700 to-indigo-900'],\n 61: ['Light Rain', '🌦️', '🌧️', 'from-gray-400 to-blue-500', 'from-gray-700 to-indigo-900'],\n 63: ['Rain', '🌧️', '🌧️', 'from-gray-500 to-blue-600', 'from-gray-700 to-indigo-900'],\n 65: ['Heavy Rain', '🌧️', '🌧️', 'from-gray-600 to-blue-700', 'from-gray-700 to-indigo-950'],\n 71: ['Light Snow', '🌨️', '🌨️', 'from-blue-200 to-blue-400', 'from-blue-800 to-slate-900'],\n 73: ['Snow', '❄️', '❄️', 'from-blue-300 to-blue-500', 'from-blue-800 to-slate-900'],\n 75: ['Heavy Snow', '❄️', '❄️', 'from-blue-400 to-blue-600', 'from-blue-800 to-slate-900'],\n 80: ['Rain Showers', '🌧️', '🌧️', 'from-gray-500 to-blue-600', 'from-gray-700 to-indigo-900'],\n 82: ['Heavy Showers', '🌧️', '🌧️', 'from-gray-600 to-blue-700', 'from-gray-700 to-indigo-950'],\n 95: ['Thunderstorm', '⛈️', '⛈️', 'from-gray-700 to-indigo-800', 'from-gray-800 to-indigo-950'],\n 96: ['Thunderstorm', '⛈️', '⛈️', 'from-gray-700 to-indigo-800', 'from-gray-800 to-indigo-950'],\n 99: ['Thunderstorm', '⛈️', '⛈️', 'from-gray-700 to-indigo-900', 'from-gray-800 to-indigo-950'],\n};\n\nexport const getCondition = (code: number, isDay = true): [string, string, string] => {\n const entry = WMO[code] || ['Unknown', '❓', '❓', 'from-gray-400 to-gray-500', 'from-gray-700 to-slate-800'];\n return [entry[0], isDay ? entry[1] : entry[2], isDay ? entry[3] : entry[4]];\n};\n\nexport const AVAILABLE_CITIES: Record<string, { lat: number; lon: number; tz: string }> = {\n 'Sydney': { lat: -33.8688, lon: 151.2093, tz: 'Australia/Sydney' },\n 'Melbourne': { lat: -37.8136, lon: 144.9631, tz: 'Australia/Melbourne' },\n 'Auckland': { lat: -36.8485, lon: 174.7633, tz: 'Pacific/Auckland' },\n 'Tokyo': { lat: 35.6762, lon: 139.6503, tz: 'Asia/Tokyo' },\n 'Shanghai': { lat: 31.2304, lon: 121.4737, tz: 'Asia/Shanghai' },\n 'Hong Kong': { lat: 22.3193, lon: 114.1694, tz: 'Asia/Hong_Kong' },\n 'Singapore': { lat: 1.3521, lon: 103.8198, tz: 'Asia/Singapore' },\n 'Bangkok': { lat: 13.7563, lon: 100.5018, tz: 'Asia/Bangkok' },\n 'Mumbai': { lat: 19.0760, lon: 72.8777, tz: 'Asia/Kolkata' },\n 'Dubai': { lat: 25.2048, lon: 55.2708, tz: 'Asia/Dubai' },\n 'Berlin': { lat: 52.5200, lon: 13.4050, tz: 'Europe/Berlin' },\n 'Paris': { lat: 48.8566, lon: 2.3522, tz: 'Europe/Paris' },\n 'London': { lat: 51.5074, lon: -0.1278, tz: 'Europe/London' },\n 'New York': { lat: 40.7128, lon: -74.0060, tz: 'America/New_York' },\n 'Miami': { lat: 25.7617, lon: -80.1918, tz: 'America/New_York' },\n 'Toronto': { lat: 43.6532, lon: -79.3832, tz: 'America/Toronto' },\n 'Chicago': { lat: 41.8781, lon: -87.6298, tz: 'America/Chicago' },\n 'Los Angeles': { lat: 34.0522, lon: -118.2437, tz: 'America/Los_Angeles' },\n};\n\nexport const WEATHER_CACHE_KEY = 'weather_local_cache';\nexport const WEATHER_CACHE_TTL = 30 * 60 * 1000;\n\nexport interface CityWeather {\n city: string;\n temp: number;\n code: number;\n high: number;\n low: number;\n isDay: boolean;\n timezone: string;\n}\n\nexport interface WeatherCacheEntry { data: CityWeather; ts: number }\ntype WeatherCache = Record<string, WeatherCacheEntry>;\n\nfunction readCache(): WeatherCache {\n try { return JSON.parse(localStorage.getItem(WEATHER_CACHE_KEY) || '{}'); } catch { return {}; }\n}\nfunction writeCache(c: WeatherCache) {\n try { localStorage.setItem(WEATHER_CACHE_KEY, JSON.stringify(c)); } catch {}\n}\n\n/** Fetch a city's current weather + today's high/low, with a 30-min\n * localStorage cache shared across widgets. */\nexport async function fetchCityWeather(cityName: string, force = false): Promise<CityWeather | null> {\n const coords = AVAILABLE_CITIES[cityName];\n if (!coords) return null;\n if (!force) {\n const cached = readCache()[cityName];\n if (cached && Date.now() - cached.ts < WEATHER_CACHE_TTL) return cached.data;\n }\n try {\n const res = await fetch(`https://api.open-meteo.com/v1/forecast?latitude=${coords.lat}&longitude=${coords.lon}&current=temperature_2m,weather_code,is_day&daily=temperature_2m_max,temperature_2m_min&forecast_days=1&timezone=auto`);\n const w = await res.json();\n const cw: CityWeather = {\n city: cityName,\n temp: Math.round(w.current.temperature_2m),\n code: w.current.weather_code,\n high: Math.round(w.daily.temperature_2m_max[0]),\n low: Math.round(w.daily.temperature_2m_min[0]),\n isDay: w.current.is_day === 1,\n timezone: w.timezone || 'UTC',\n };\n const c = readCache();\n c[cityName] = { data: cw, ts: Date.now() };\n writeCache(c);\n return cw;\n } catch {\n return null;\n }\n}\n\nexport const toFahrenheit = (c: number) => Math.round(c * 9 / 5 + 32);\n"]}
@@ -1,17 +0,0 @@
1
- import { requestFilesTrashView } from './chunk-YNKK7NE3.js';
2
-
3
- // src/apps/_filesShared.ts
4
- var filesDemoTree = null;
5
- function setFilesDemoTree(tree) {
6
- filesDemoTree = tree;
7
- }
8
- function getFilesDemoTree() {
9
- return filesDemoTree;
10
- }
11
- function openFilesInTrashMode() {
12
- requestFilesTrashView();
13
- }
14
-
15
- export { getFilesDemoTree, openFilesInTrashMode, setFilesDemoTree };
16
- //# sourceMappingURL=chunk-BE7FZOFU.js.map
17
- //# sourceMappingURL=chunk-BE7FZOFU.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/apps/_filesShared.ts"],"names":[],"mappings":";;;AAwBA,IAAI,aAAA,GAAwC,IAAA;AAErC,SAAS,iBAAiB,IAAA,EAA8B;AAC7D,EAAA,aAAA,GAAgB,IAAA;AAClB;AAGO,SAAS,gBAAA,GAA2C;AACzD,EAAA,OAAO,aAAA;AACT;AAKO,SAAS,oBAAA,GAAuB;AACrC,EAAA,qBAAA,EAAsB;AACxB","file":"chunk-BE7FZOFU.js","sourcesContent":["/**\n * Files app config — the tiny consumer-facing surface of the Files app\n * (demo-tree injection + trash-mode open). Lives apart from Files.tsx so\n * importing these from `efficient-shell/apps` never drags the Files\n * implementation into a host's startup bundle; the Files window component\n * stays behind its React.lazy dynamic import.\n */\nimport { requestFilesTrashView } from '../shell/desktopIcons';\n\n/**\n * Demo filesystem. When a consumer (e.g. the demo app) injects a static tree\n * via `setFilesDemoTree`, Files browses it in-memory — no file server needed.\n * Browse-only: upload / new-folder / rename / delete / trash are hidden while a\n * demo tree is set. Consumers with a real file server never call it, so their\n * behaviour is unchanged.\n */\nexport interface FilesDemoNode {\n name: string;\n kind: 'file' | 'folder';\n size?: number;\n modifiedAt?: string;\n children?: FilesDemoNode[];\n}\n\nlet filesDemoTree: FilesDemoNode[] | null = null;\n\nexport function setFilesDemoTree(tree: FilesDemoNode[] | null) {\n filesDemoTree = tree;\n}\n\n/** @internal Current injected demo tree, if any — read by Files.tsx. */\nexport function getFilesDemoTree(): FilesDemoNode[] | null {\n return filesDemoTree;\n}\n\n// Side-channel for opening Files on a specific view (trash, desktop folder).\n// The flag + event plumbing lives in shell/desktopIcons.tsx; this wrapper is\n// kept because consumers import it from the package.\nexport function openFilesInTrashMode() {\n requestFilesTrashView();\n}\n"]}
@@ -1,57 +0,0 @@
1
- import { rootIsDark } from './chunk-IPXN646P.js';
2
-
3
- // src/utils/glass.ts
4
- function getMenuOpacity() {
5
- try {
6
- const val = getComputedStyle(document.documentElement).getPropertyValue("--menu-opacity")?.trim();
7
- if (val) return parseFloat(val);
8
- } catch {
9
- }
10
- return 0.95;
11
- }
12
- var isDarkTheme = rootIsDark;
13
- function reduceTransparency() {
14
- try {
15
- return document.documentElement.classList.contains("rosh-reduce-transparency");
16
- } catch {
17
- return false;
18
- }
19
- }
20
- function tint(colour, alpha) {
21
- const steps = Math.round(Math.min(1, Math.max(0, alpha)) * 255);
22
- return `color-mix(in srgb, ${colour} ${+(steps / 255 * 100).toFixed(4)}%, transparent)`;
23
- }
24
- function glassStyle(opacity) {
25
- const o = opacity ?? getMenuOpacity();
26
- if (reduceTransparency()) {
27
- return {
28
- background: "var(--rosh-glass-surface)",
29
- border: "1px solid var(--rosh-glass-solid-border)",
30
- boxShadow: "var(--rosh-glass-solid-shadow)"
31
- };
32
- }
33
- const surface = "var(--rosh-glass-surface)";
34
- const mid = "var(--rosh-glass-surface-mid)";
35
- if (isDarkTheme()) {
36
- return {
37
- background: `linear-gradient(135deg in srgb, ${tint(surface, o * 0.85)} 0%, ${tint(mid, o * 0.75)} 50%, ${tint(surface, o * 0.85)} 100%)`,
38
- backdropFilter: "blur(40px) saturate(1.6)",
39
- WebkitBackdropFilter: "blur(40px) saturate(1.6)",
40
- border: "1px solid var(--rosh-glass-border)",
41
- boxShadow: "var(--rosh-glass-shadow)"
42
- };
43
- }
44
- return {
45
- background: `linear-gradient(135deg in srgb, ${tint(surface, o * 0.85)} 0%, ${tint(mid, o * 0.65)} 50%, ${tint(surface, o * 0.75)} 100%)`,
46
- backdropFilter: "blur(40px) saturate(1.8)",
47
- WebkitBackdropFilter: "blur(40px) saturate(1.8)",
48
- border: "1px solid var(--rosh-glass-border)",
49
- boxShadow: "var(--rosh-glass-shadow)"
50
- };
51
- }
52
- var GLASS_DIVIDER = "border-white/20";
53
- var GLASS_INPUT_BG = "glass-input-bg";
54
-
55
- export { GLASS_DIVIDER, GLASS_INPUT_BG, glassStyle };
56
- //# sourceMappingURL=chunk-D276EMXS.js.map
57
- //# sourceMappingURL=chunk-D276EMXS.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/utils/glass.ts"],"names":[],"mappings":";;;AAIA,SAAS,cAAA,GAAyB;AAChC,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,iBAAiB,QAAA,CAAS,eAAe,EAAE,gBAAA,CAAiB,gBAAgB,GAAG,IAAA,EAAK;AAChG,IAAA,IAAI,GAAA,EAAK,OAAO,UAAA,CAAW,GAAG,CAAA;AAAA,EAChC,CAAA,CAAA,MAAQ;AAAA,EAAC;AACT,EAAA,OAAO,IAAA;AACT;AAGA,IAAM,WAAA,GAAc,UAAA;AAKpB,SAAS,kBAAA,GAA8B;AACrC,EAAA,IAAI;AACF,IAAA,OAAO,QAAA,CAAS,eAAA,CAAgB,SAAA,CAAU,QAAA,CAAS,0BAA0B,CAAA;AAAA,EAC/E,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAgBA,SAAS,IAAA,CAAK,QAAgB,KAAA,EAAuB;AACnD,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAK,CAAC,CAAA,GAAI,GAAG,CAAA;AAC9D,EAAA,OAAO,CAAA,mBAAA,EAAsB,MAAM,CAAA,CAAA,EAAI,CAAA,CAAG,QAAQ,GAAA,GAAO,GAAA,EAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,eAAA,CAAA;AAC1E;AAgBO,SAAS,WAAW,OAAA,EAAiC;AAC1D,EAAA,MAAM,CAAA,GAAI,WAAW,cAAA,EAAe;AACpC,EAAA,IAAI,oBAAmB,EAAG;AAQxB,IAAA,OAAO;AAAA,MACL,UAAA,EAAY,2BAAA;AAAA,MACZ,MAAA,EAAQ,0CAAA;AAAA,MACR,SAAA,EAAW;AAAA,KACb;AAAA,EACF;AAIA,EAAA,MAAM,OAAA,GAAU,2BAAA;AAChB,EAAA,MAAM,GAAA,GAAM,+BAAA;AACZ,EAAA,IAAI,aAAY,EAAG;AAIjB,IAAA,OAAO;AAAA,MACL,YAAY,CAAA,gCAAA,EAAmC,IAAA,CAAK,SAAS,CAAA,GAAI,IAAI,CAAC,CAAA,KAAA,EAAQ,IAAA,CAAK,GAAA,EAAK,CAAA,GAAI,IAAI,CAAC,CAAA,MAAA,EAAS,KAAK,OAAA,EAAS,CAAA,GAAI,IAAI,CAAC,CAAA,MAAA,CAAA;AAAA,MACjI,cAAA,EAAgB,0BAAA;AAAA,MAChB,oBAAA,EAAsB,0BAAA;AAAA,MACtB,MAAA,EAAQ,oCAAA;AAAA,MACR,SAAA,EAAW;AAAA,KACb;AAAA,EACF;AACA,EAAA,OAAO;AAAA,IACL,YAAY,CAAA,gCAAA,EAAmC,IAAA,CAAK,SAAS,CAAA,GAAI,IAAI,CAAC,CAAA,KAAA,EAAQ,IAAA,CAAK,GAAA,EAAK,CAAA,GAAI,IAAI,CAAC,CAAA,MAAA,EAAS,KAAK,OAAA,EAAS,CAAA,GAAI,IAAI,CAAC,CAAA,MAAA,CAAA;AAAA,IACjI,cAAA,EAAgB,0BAAA;AAAA,IAChB,oBAAA,EAAsB,0BAAA;AAAA,IACtB,MAAA,EAAQ,oCAAA;AAAA,IACR,SAAA,EAAW;AAAA,GACb;AACF;AAGO,IAAM,aAAA,GAAgB;AAKtB,IAAM,cAAA,GAAiB","file":"chunk-D276EMXS.js","sourcesContent":["import type { CSSProperties } from 'react';\nimport { rootIsDark } from './rootTheme';\n\n/** Read the system menu opacity from CSS custom property set by Layout */\nfunction getMenuOpacity(): number {\n try {\n const val = getComputedStyle(document.documentElement).getPropertyValue('--menu-opacity')?.trim();\n if (val) return parseFloat(val);\n } catch {}\n return 0.95;\n}\n\n// `data-theme=\"dark\"` or a `dark` class on <html>, as ui.css reads it.\nconst isDarkTheme = rootIsDark;\n\n/** Whether the \"Reduce transparency\" preference is active (root class set by\n * Layout). When on, glass surfaces render solid + blur-free — the blur is the\n * GPU-expensive part, and dropping it is the point of the setting. */\nfunction reduceTransparency(): boolean {\n try {\n return document.documentElement.classList.contains('rosh-reduce-transparency');\n } catch {\n return false;\n }\n}\n\n/**\n * `colour` at `alpha` (0–1) of its own opacity — what `rgba(r,g,b,alpha)` was,\n * for a colour that is a token rather than three channels. `rgba()` cannot take\n * a variable for its channels; `color-mix()` with `transparent` can, and in\n * sRGB it is exactly that colour at that alpha (the mix is premultiplied, so\n * the channels come back unchanged).\n *\n * The alpha is rounded to a 255th first. An `rgba()` is a legacy colour, which\n * the engine stores with an 8-bit alpha; a `color-mix()` result keeps a float\n * one, and across a gradient the two land a rounding step apart on a few\n * percent of pixels. Rounding here puts the stops where the `rgba()` ones were,\n * and the gradient is pixel-identical to the one this replaced — measured in\n * Chromium against the previous release's output, light and dark.\n */\nfunction tint(colour: string, alpha: number): string {\n const steps = Math.round(Math.min(1, Math.max(0, alpha)) * 255);\n return `color-mix(in srgb, ${colour} ${+((steps / 255) * 100).toFixed(4)}%, transparent)`;\n}\n\n/** Frosted glass style — shared across all menus, popups, and glass UI elements.\n * Reads --menu-opacity CSS variable set by the theme system, and adapts the\n * base tint to dark mode so menus don't stay light-cream when text is light.\n *\n * Every colour is a token from ui.css (\"Kit colours\" there), so a host can\n * restyle the popups without forking this: the surface they are tinted from\n * (`--rosh-glass-surface`, which reads `--surface`), the stop across the middle,\n * the edge and the depth. Each token's default is the literal this function\n * used to write, in both themes. The numbers stay here — the alphas follow\n * `--menu-opacity`, which is read per call, and the blur differs by theme.\n *\n * To make every popup SOLID in the host's own surface colour, put\n * `rosh-reduce-transparency` on <html>: the branch below then paints one opaque\n * `--rosh-glass-surface`, and the stylesheet drops every backdrop blur. */\nexport function glassStyle(opacity?: number): CSSProperties {\n const o = opacity ?? getMenuOpacity();\n if (reduceTransparency()) {\n // Reduce-transparency: a fully opaque, blur-free surface. No\n // backdrop-filter (the expensive part on low-end GPUs) and a solid\n // background so menus/popups stay legible over any wallpaper. The global\n // stylesheet rule also strips backdrop-filter, but returning a solid\n // background here is what keeps the surface from reading as washed-out\n // translucent glass with the blur gone. One branch for both themes: the\n // tokens carry the dark values themselves.\n return {\n background: 'var(--rosh-glass-surface)',\n border: '1px solid var(--rosh-glass-solid-border)',\n boxShadow: 'var(--rosh-glass-solid-shadow)',\n };\n }\n // `in srgb` on both gradients: once any stop is a non-legacy colour — and a\n // `color-mix()` result is one — a gradient interpolates in Oklab by default,\n // where the `rgba()` stops it replaced were interpolated in sRGB.\n const surface = 'var(--rosh-glass-surface)';\n const mid = 'var(--rosh-glass-surface-mid)';\n if (isDarkTheme()) {\n // Dark frosted glass — the dark `--surface` (Catppuccin's #1e1e2e) with\n // `--surface-sunken` across the middle, a subtle gradient and a lighter\n // inner highlight.\n return {\n background: `linear-gradient(135deg in srgb, ${tint(surface, o * 0.85)} 0%, ${tint(mid, o * 0.75)} 50%, ${tint(surface, o * 0.85)} 100%)`,\n backdropFilter: 'blur(40px) saturate(1.6)',\n WebkitBackdropFilter: 'blur(40px) saturate(1.6)',\n border: '1px solid var(--rosh-glass-border)',\n boxShadow: 'var(--rosh-glass-shadow)',\n };\n }\n return {\n background: `linear-gradient(135deg in srgb, ${tint(surface, o * 0.85)} 0%, ${tint(mid, o * 0.65)} 50%, ${tint(surface, o * 0.75)} 100%)`,\n backdropFilter: 'blur(40px) saturate(1.8)',\n WebkitBackdropFilter: 'blur(40px) saturate(1.8)',\n border: '1px solid var(--rosh-glass-border)',\n boxShadow: 'var(--rosh-glass-shadow)',\n };\n}\n\n/** Glass divider border color */\nexport const GLASS_DIVIDER = 'border-white/20';\n\n/** Glass input/search bar background — declared in styles.css so it can adapt\n * to dark mode (a flat `bg-white/15` reads as a too-bright tile on the dark\n * glass gradient). */\nexport const GLASS_INPUT_BG = 'glass-input-bg';\n"]}