tempest-react-sdk 0.48.0 → 0.49.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (194) hide show
  1. package/dist/audio/sfx-pool.cjs +1 -1
  2. package/dist/audio/sfx-pool.cjs.map +1 -1
  3. package/dist/audio/sfx-pool.js +16 -7
  4. package/dist/audio/sfx-pool.js.map +1 -1
  5. package/dist/audio/use-sfx-pool.cjs +1 -1
  6. package/dist/audio/use-sfx-pool.cjs.map +1 -1
  7. package/dist/audio/use-sfx-pool.js +3 -8
  8. package/dist/audio/use-sfx-pool.js.map +1 -1
  9. package/dist/auth/passkey.cjs +1 -1
  10. package/dist/auth/passkey.cjs.map +1 -1
  11. package/dist/auth/passkey.js +79 -81
  12. package/dist/auth/passkey.js.map +1 -1
  13. package/dist/charts.cjs +1 -1
  14. package/dist/charts.js +4 -4
  15. package/dist/components/BarList/BarList.cjs +1 -1
  16. package/dist/components/BarList/BarList.cjs.map +1 -1
  17. package/dist/components/BarList/BarList.js +31 -24
  18. package/dist/components/BarList/BarList.js.map +1 -1
  19. package/dist/components/BarList/bar-list-model.cjs +1 -1
  20. package/dist/components/BarList/bar-list-model.cjs.map +1 -1
  21. package/dist/components/BarList/bar-list-model.js +5 -5
  22. package/dist/components/BarList/bar-list-model.js.map +1 -1
  23. package/dist/components/ClickOutside/ClickOutside.cjs +1 -1
  24. package/dist/components/ClickOutside/ClickOutside.cjs.map +1 -1
  25. package/dist/components/ClickOutside/ClickOutside.js +13 -14
  26. package/dist/components/ClickOutside/ClickOutside.js.map +1 -1
  27. package/dist/components/DataTable/DataTable.cjs +1 -1
  28. package/dist/components/DataTable/DataTable.cjs.map +1 -1
  29. package/dist/components/DataTable/DataTable.js +124 -122
  30. package/dist/components/DataTable/DataTable.js.map +1 -1
  31. package/dist/components/FilterBar/filter-apply.cjs +1 -1
  32. package/dist/components/FilterBar/filter-apply.cjs.map +1 -1
  33. package/dist/components/FilterBar/filter-apply.js +35 -38
  34. package/dist/components/FilterBar/filter-apply.js.map +1 -1
  35. package/dist/components/FilterBar/filter-query.cjs +1 -1
  36. package/dist/components/FilterBar/filter-query.cjs.map +1 -1
  37. package/dist/components/FilterBar/filter-query.js +16 -13
  38. package/dist/components/FilterBar/filter-query.js.map +1 -1
  39. package/dist/geo/use-position-tracker.cjs +1 -1
  40. package/dist/geo/use-position-tracker.cjs.map +1 -1
  41. package/dist/geo/use-position-tracker.js +25 -26
  42. package/dist/geo/use-position-tracker.js.map +1 -1
  43. package/dist/hooks/use-async.cjs +1 -1
  44. package/dist/hooks/use-async.cjs.map +1 -1
  45. package/dist/hooks/use-async.js +27 -30
  46. package/dist/hooks/use-async.js.map +1 -1
  47. package/dist/hooks/use-click-outside.cjs +1 -1
  48. package/dist/hooks/use-click-outside.cjs.map +1 -1
  49. package/dist/hooks/use-click-outside.js +8 -9
  50. package/dist/hooks/use-click-outside.js.map +1 -1
  51. package/dist/hooks/use-countdown.cjs +1 -1
  52. package/dist/hooks/use-countdown.cjs.map +1 -1
  53. package/dist/hooks/use-countdown.js +8 -13
  54. package/dist/hooks/use-countdown.js.map +1 -1
  55. package/dist/hooks/use-event-listener.cjs +1 -1
  56. package/dist/hooks/use-event-listener.cjs.map +1 -1
  57. package/dist/hooks/use-event-listener.js +6 -6
  58. package/dist/hooks/use-event-listener.js.map +1 -1
  59. package/dist/hooks/use-interval.cjs +1 -1
  60. package/dist/hooks/use-interval.cjs.map +1 -1
  61. package/dist/hooks/use-interval.js +5 -6
  62. package/dist/hooks/use-interval.js.map +1 -1
  63. package/dist/hooks/use-latest-ref.cjs.map +1 -1
  64. package/dist/hooks/use-latest-ref.js.map +1 -1
  65. package/dist/hooks/use-long-press-handlers.cjs +1 -1
  66. package/dist/hooks/use-long-press-handlers.cjs.map +1 -1
  67. package/dist/hooks/use-long-press-handlers.js +8 -10
  68. package/dist/hooks/use-long-press-handlers.js.map +1 -1
  69. package/dist/hooks/use-long-press.cjs +1 -1
  70. package/dist/hooks/use-long-press.cjs.map +1 -1
  71. package/dist/hooks/use-long-press.js +6 -6
  72. package/dist/hooks/use-long-press.js.map +1 -1
  73. package/dist/hooks/use-online.cjs +1 -1
  74. package/dist/hooks/use-online.cjs.map +1 -1
  75. package/dist/hooks/use-online.js +10 -10
  76. package/dist/hooks/use-online.js.map +1 -1
  77. package/dist/hooks/use-service-worker-update.cjs +1 -1
  78. package/dist/hooks/use-service-worker-update.cjs.map +1 -1
  79. package/dist/hooks/use-service-worker-update.js +24 -25
  80. package/dist/hooks/use-service-worker-update.js.map +1 -1
  81. package/dist/hooks/use-stable-callback.cjs +1 -1
  82. package/dist/hooks/use-stable-callback.cjs.map +1 -1
  83. package/dist/hooks/use-stable-callback.js +4 -3
  84. package/dist/hooks/use-stable-callback.js.map +1 -1
  85. package/dist/hooks/use-timeout.cjs +1 -1
  86. package/dist/hooks/use-timeout.cjs.map +1 -1
  87. package/dist/hooks/use-timeout.js +5 -6
  88. package/dist/hooks/use-timeout.js.map +1 -1
  89. package/dist/hooks/use-typewriter.cjs +1 -1
  90. package/dist/hooks/use-typewriter.cjs.map +1 -1
  91. package/dist/hooks/use-typewriter.js +9 -18
  92. package/dist/hooks/use-typewriter.js.map +1 -1
  93. package/dist/http/api-client.cjs +1 -1
  94. package/dist/http/api-client.cjs.map +1 -1
  95. package/dist/http/api-client.js +11 -16
  96. package/dist/http/api-client.js.map +1 -1
  97. package/dist/http/describe-api-error.cjs +1 -1
  98. package/dist/http/describe-api-error.cjs.map +1 -1
  99. package/dist/http/describe-api-error.js +12 -15
  100. package/dist/http/describe-api-error.js.map +1 -1
  101. package/dist/http/errors.cjs +1 -1
  102. package/dist/http/errors.cjs.map +1 -1
  103. package/dist/http/errors.js +18 -6
  104. package/dist/http/errors.js.map +1 -1
  105. package/dist/http/resumable-upload.cjs +1 -1
  106. package/dist/http/resumable-upload.cjs.map +1 -1
  107. package/dist/http/resumable-upload.js +60 -61
  108. package/dist/http/resumable-upload.js.map +1 -1
  109. package/dist/http/retry.cjs +1 -1
  110. package/dist/http/retry.cjs.map +1 -1
  111. package/dist/http/retry.js +20 -16
  112. package/dist/http/retry.js.map +1 -1
  113. package/dist/http/use-describe-api-error.cjs +1 -1
  114. package/dist/http/use-describe-api-error.cjs.map +1 -1
  115. package/dist/http/use-describe-api-error.js +2 -2
  116. package/dist/http/use-describe-api-error.js.map +1 -1
  117. package/dist/i18n/create-i18n.cjs +1 -1
  118. package/dist/i18n/create-i18n.cjs.map +1 -1
  119. package/dist/i18n/create-i18n.js +6 -6
  120. package/dist/i18n/create-i18n.js.map +1 -1
  121. package/dist/icons/material-symbols.cjs +1 -1
  122. package/dist/icons/material-symbols.cjs.map +1 -1
  123. package/dist/icons/material-symbols.js +136 -5
  124. package/dist/icons/material-symbols.js.map +1 -1
  125. package/dist/icons.d.ts +17 -5
  126. package/dist/offline/create-offline-sync.cjs +1 -1
  127. package/dist/offline/create-offline-sync.cjs.map +1 -1
  128. package/dist/offline/create-offline-sync.js +17 -9
  129. package/dist/offline/create-offline-sync.js.map +1 -1
  130. package/dist/offline/use-offline-sync.cjs +1 -1
  131. package/dist/offline/use-offline-sync.cjs.map +1 -1
  132. package/dist/offline/use-offline-sync.js +7 -8
  133. package/dist/offline/use-offline-sync.js.map +1 -1
  134. package/dist/push/use-push-subscription.cjs +1 -1
  135. package/dist/push/use-push-subscription.cjs.map +1 -1
  136. package/dist/push/use-push-subscription.js +13 -12
  137. package/dist/push/use-push-subscription.js.map +1 -1
  138. package/dist/query/retry-policy.cjs +1 -1
  139. package/dist/query/retry-policy.cjs.map +1 -1
  140. package/dist/query/retry-policy.js +3 -3
  141. package/dist/query/retry-policy.js.map +1 -1
  142. package/dist/sse/use-event-stream.cjs +1 -1
  143. package/dist/sse/use-event-stream.cjs.map +1 -1
  144. package/dist/sse/use-event-stream.js +19 -20
  145. package/dist/sse/use-event-stream.js.map +1 -1
  146. package/dist/tabular/use-tabular-predictor.cjs +1 -1
  147. package/dist/tabular/use-tabular-predictor.cjs.map +1 -1
  148. package/dist/tabular/use-tabular-predictor.js +20 -17
  149. package/dist/tabular/use-tabular-predictor.js.map +1 -1
  150. package/dist/tempest-react-sdk.cjs +1 -1
  151. package/dist/tempest-react-sdk.d.ts +363 -149
  152. package/dist/tempest-react-sdk.js +143 -143
  153. package/dist/theme/ThemeProvider.cjs +1 -1
  154. package/dist/theme/ThemeProvider.cjs.map +1 -1
  155. package/dist/theme/ThemeProvider.js +12 -17
  156. package/dist/theme/ThemeProvider.js.map +1 -1
  157. package/dist/utils/base64.cjs +2 -0
  158. package/dist/utils/base64.cjs.map +1 -0
  159. package/dist/utils/base64.js +16 -0
  160. package/dist/utils/base64.js.map +1 -0
  161. package/dist/utils/compare-values.cjs +1 -1
  162. package/dist/utils/compare-values.cjs.map +1 -1
  163. package/dist/utils/compare-values.js +4 -3
  164. package/dist/utils/compare-values.js.map +1 -1
  165. package/dist/utils/compressed-storage.cjs +1 -1
  166. package/dist/utils/compressed-storage.cjs.map +1 -1
  167. package/dist/utils/compressed-storage.js +16 -46
  168. package/dist/utils/compressed-storage.js.map +1 -1
  169. package/dist/utils/storage.cjs +1 -1
  170. package/dist/utils/storage.cjs.map +1 -1
  171. package/dist/utils/storage.js +37 -17
  172. package/dist/utils/storage.js.map +1 -1
  173. package/dist/vision/use-camera-stream.cjs +1 -1
  174. package/dist/vision/use-camera-stream.cjs.map +1 -1
  175. package/dist/vision/use-camera-stream.js +34 -33
  176. package/dist/vision/use-camera-stream.js.map +1 -1
  177. package/dist/vite/base-url.cjs +2 -0
  178. package/dist/vite/base-url.cjs.map +1 -0
  179. package/dist/vite/base-url.js +8 -0
  180. package/dist/vite/base-url.js.map +1 -0
  181. package/dist/vite/tempest-pwa-dev-sw.cjs +1 -1
  182. package/dist/vite/tempest-pwa-dev-sw.cjs.map +1 -1
  183. package/dist/vite/tempest-pwa-dev-sw.js +54 -29
  184. package/dist/vite/tempest-pwa-dev-sw.js.map +1 -1
  185. package/dist/vite/tempest-pwa-manifest.cjs +2 -2
  186. package/dist/vite/tempest-pwa-manifest.cjs.map +1 -1
  187. package/dist/vite/tempest-pwa-manifest.js +15 -14
  188. package/dist/vite/tempest-pwa-manifest.js.map +1 -1
  189. package/dist/vite.d.ts +2 -2
  190. package/dist/ws/use-web-socket.cjs +1 -1
  191. package/dist/ws/use-web-socket.cjs.map +1 -1
  192. package/dist/ws/use-web-socket.js +40 -42
  193. package/dist/ws/use-web-socket.js.map +1 -1
  194. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"create-i18n.cjs","names":[],"sources":["../../src/i18n/create-i18n.ts"],"sourcesContent":["export type Messages = Record<string, string>;\nexport type Catalog = Record<string, Messages>;\nexport type InterpolationValues = Record<string, string | number>;\n\nexport interface CreateI18nOptions {\n /** Initial locale. */\n locale: string;\n /** Fallback locale used when a key is missing in the active locale. */\n fallbackLocale?: string;\n /** Catalog `{ [locale]: { [key]: \"...\" } }`. */\n messages: Catalog;\n}\n\nexport interface I18n {\n /** Currently active locale. */\n locale: string;\n /** Fallback locale (or `null` when not configured). */\n fallbackLocale: string | null;\n /**\n * Translate `key`, interpolating `{name}` placeholders from `params`.\n * Falls back to the configured fallback locale, then to the key itself.\n */\n t: (key: string, params?: InterpolationValues) => string;\n /**\n * Plural-aware translation. Tries `${key}_one` for `count === 1` and\n * `${key}_other` otherwise, with `{count}` available for interpolation.\n */\n plural: (key: string, count: number, params?: InterpolationValues) => string;\n /** Format a number using `Intl.NumberFormat` on the active locale. */\n formatNumber: (value: number, options?: Intl.NumberFormatOptions) => string;\n /** Format a Date using `Intl.DateTimeFormat` on the active locale. */\n formatDate: (value: Date | string, options?: Intl.DateTimeFormatOptions) => string;\n /** Build a new `I18n` instance pointing at a different locale. */\n withLocale: (locale: string) => I18n;\n}\n\nfunction interpolate(template: string, params?: InterpolationValues): string {\n if (!params) return template;\n return template.replace(/\\{(\\w+)\\}/g, (_match, name: string) => {\n const value = params[name];\n return value === undefined ? `{${name}}` : String(value);\n });\n}\n\nfunction lookup(\n catalog: Catalog,\n locale: string,\n fallback: string | null,\n key: string,\n): string | null {\n const direct = catalog[locale]?.[key];\n if (direct !== undefined) return direct;\n if (fallback) {\n const fallbackValue = catalog[fallback]?.[key];\n if (fallbackValue !== undefined) return fallbackValue;\n }\n return null;\n}\n\n/**\n * Create an i18n object with translation, pluralization and Intl helpers.\n *\n * The catalog is a plain `{ [locale]: { [key]: \"...\" } }` map — bring your\n * own keys, namespaces, or nested-key conventions. The SDK does not enforce\n * a schema so you can plug it into any string-loading pipeline.\n *\n * @example\n * const i18n = createI18n({\n * locale: \"pt-BR\",\n * fallbackLocale: \"en\",\n * messages: {\n * \"pt-BR\": {\n * \"greet\": \"Olá, {name}\",\n * \"alos_one\": \"{count} Alô\",\n * \"alos_other\": \"{count} Alôs\",\n * },\n * \"en\": { greet: \"Hi, {name}\", alos_one: \"{count} Alo\", alos_other: \"{count} Alos\" },\n * },\n * });\n * i18n.t(\"greet\", { name: \"Mau\" }); // \"Olá, Mau\"\n * i18n.plural(\"alos\", 3); // \"3 Alôs\"\n */\nexport function createI18n(options: CreateI18nOptions): I18n {\n const { locale, fallbackLocale = null, messages } = options;\n\n function t(key: string, params?: InterpolationValues): string {\n const template = lookup(messages, locale, fallbackLocale, key);\n if (template === null) return key;\n return interpolate(template, params);\n }\n\n function plural(key: string, count: number, params?: InterpolationValues): string {\n const suffix = count === 1 ? \"_one\" : \"_other\";\n const template =\n lookup(messages, locale, fallbackLocale, `${key}${suffix}`) ??\n lookup(messages, locale, fallbackLocale, key);\n if (template === null) return key;\n return interpolate(template, { count, ...(params ?? {}) });\n }\n\n function formatNumber(value: number, opts?: Intl.NumberFormatOptions): string {\n return new Intl.NumberFormat(locale, opts).format(value);\n }\n\n function formatDate(value: Date | string, opts?: Intl.DateTimeFormatOptions): string {\n const date = typeof value === \"string\" ? new Date(value) : value;\n if (Number.isNaN(date.getTime())) return \"\";\n return new Intl.DateTimeFormat(locale, opts).format(date);\n }\n\n return {\n locale,\n fallbackLocale,\n t,\n plural,\n formatNumber,\n formatDate,\n withLocale: (nextLocale) =>\n createI18n({\n locale: nextLocale,\n fallbackLocale: fallbackLocale ?? undefined,\n messages,\n }),\n };\n}\n"],"mappings":"AAoCA,SAAS,EAAY,EAAkB,EAAsC,CAEzE,OADK,EACE,EAAS,QAAQ,cAAe,EAAQ,IAAiB,CAC5D,IAAM,EAAQ,EAAO,GACrB,OAAO,IAAU,IAAA,GAAY,IAAI,EAAK,GAAK,OAAO,CAAK,CAC3D,CAAC,EAJmB,CAKxB,CAEA,SAAS,EACL,EACA,EACA,EACA,EACa,CACb,IAAM,EAAS,EAAQ,EAAO,GAAG,GACjC,GAAI,IAAW,IAAA,GAAW,OAAO,EACjC,GAAI,EAAU,CACV,IAAM,EAAgB,EAAQ,EAAS,GAAG,GAC1C,GAAI,IAAkB,IAAA,GAAW,OAAO,CAC5C,CACA,OAAO,IACX,CAyBA,SAAgB,EAAW,EAAkC,CACzD,GAAM,CAAE,SAAQ,iBAAiB,KAAM,YAAa,EAEpD,SAAS,EAAE,EAAa,EAAsC,CAC1D,IAAM,EAAW,EAAO,EAAU,EAAQ,EAAgB,CAAG,EAE7D,OADI,IAAa,KAAa,EACvB,EAAY,EAAU,CAAM,CACvC,CAEA,SAAS,EAAO,EAAa,EAAe,EAAsC,CAE9E,IAAM,EACF,EAAO,EAAU,EAAQ,EAAgB,GAAG,IAFjC,IAAU,EAAI,OAAS,UAEwB,GAC1D,EAAO,EAAU,EAAQ,EAAgB,CAAG,EAEhD,OADI,IAAa,KAAa,EACvB,EAAY,EAAU,CAAE,QAAO,GAAI,GAAU,CAAC,CAAG,CAAC,CAC7D,CAEA,SAAS,EAAa,EAAe,EAAyC,CAC1E,OAAO,IAAI,KAAK,aAAa,EAAQ,CAAI,CAAC,CAAC,OAAO,CAAK,CAC3D,CAEA,SAAS,EAAW,EAAsB,EAA2C,CACjF,IAAM,EAAO,OAAO,GAAU,SAAW,IAAI,KAAK,CAAK,EAAI,EAE3D,OADI,OAAO,MAAM,EAAK,QAAQ,CAAC,EAAU,GAClC,IAAI,KAAK,eAAe,EAAQ,CAAI,CAAC,CAAC,OAAO,CAAI,CAC5D,CAEA,MAAO,CACH,SACA,iBACA,IACA,SACA,eACA,aACA,WAAa,GACT,EAAW,CACP,OAAQ,EACR,eAAgB,GAAkB,IAAA,GAClC,UACJ,CAAC,CACT,CACJ"}
1
+ {"version":3,"file":"create-i18n.cjs","names":[],"sources":["../../src/i18n/create-i18n.ts"],"sourcesContent":["export type Messages = Record<string, string>;\nexport type Catalog = Record<string, Messages>;\nexport type InterpolationValues = Record<string, string | number>;\n\nexport interface CreateI18nOptions {\n /** Initial locale. */\n locale: string;\n /** Fallback locale used when a key is missing in the active locale. */\n fallbackLocale?: string;\n /** Catalog `{ [locale]: { [key]: \"...\" } }`. */\n messages: Catalog;\n}\n\n/** Per-call options for {@link I18n.t} and {@link I18n.plural}. */\nexport interface TranslateOptions {\n /**\n * Text to use when the catalog defines neither the key nor its fallback.\n *\n * Without this, a miss returns the key, and a caller that wants its own text\n * instead has to *detect* the miss — which from the outside means comparing\n * the result against the key it just passed in. That heuristic is wrong for a\n * catalog that legitimately maps a key to itself, and it is what every\n * translatable string the SDK ships would otherwise have to copy.\n *\n * Interpolated like any other message, so a default carries `{placeholders}`\n * too and is not second-class.\n */\n default?: string;\n}\n\nexport interface I18n {\n /** Currently active locale. */\n locale: string;\n /** Fallback locale (or `null` when not configured). */\n fallbackLocale: string | null;\n /**\n * Translate `key`, interpolating `{name}` placeholders from `params`.\n * Falls back to the configured fallback locale, then to `options.default`,\n * then to the key itself.\n */\n t: (key: string, params?: InterpolationValues, options?: TranslateOptions) => string;\n /**\n * Plural-aware translation. Tries `${key}_one` for `count === 1` and\n * `${key}_other` otherwise, with `{count}` available for interpolation.\n * Falls back to `options.default`, then to the key itself.\n */\n plural: (\n key: string,\n count: number,\n params?: InterpolationValues,\n options?: TranslateOptions,\n ) => string;\n /** Format a number using `Intl.NumberFormat` on the active locale. */\n formatNumber: (value: number, options?: Intl.NumberFormatOptions) => string;\n /** Format a Date using `Intl.DateTimeFormat` on the active locale. */\n formatDate: (value: Date | string, options?: Intl.DateTimeFormatOptions) => string;\n /** Build a new `I18n` instance pointing at a different locale. */\n withLocale: (locale: string) => I18n;\n}\n\nfunction interpolate(template: string, params?: InterpolationValues): string {\n if (!params) return template;\n return template.replace(/\\{(\\w+)\\}/g, (_match, name: string) => {\n const value = params[name];\n return value === undefined ? `{${name}}` : String(value);\n });\n}\n\nfunction lookup(\n catalog: Catalog,\n locale: string,\n fallback: string | null,\n key: string,\n): string | null {\n const direct = catalog[locale]?.[key];\n if (direct !== undefined) return direct;\n if (fallback) {\n const fallbackValue = catalog[fallback]?.[key];\n if (fallbackValue !== undefined) return fallbackValue;\n }\n return null;\n}\n\n/**\n * Create an i18n object with translation, pluralization and Intl helpers.\n *\n * The catalog is a plain `{ [locale]: { [key]: \"...\" } }` map — bring your\n * own keys, namespaces, or nested-key conventions. The SDK does not enforce\n * a schema so you can plug it into any string-loading pipeline.\n *\n * @example\n * const i18n = createI18n({\n * locale: \"pt-BR\",\n * fallbackLocale: \"en\",\n * messages: {\n * \"pt-BR\": {\n * \"greet\": \"Olá, {name}\",\n * \"alos_one\": \"{count} Alô\",\n * \"alos_other\": \"{count} Alôs\",\n * },\n * \"en\": { greet: \"Hi, {name}\", alos_one: \"{count} Alo\", alos_other: \"{count} Alos\" },\n * },\n * });\n * i18n.t(\"greet\", { name: \"Mau\" }); // \"Olá, Mau\"\n * i18n.plural(\"alos\", 3); // \"3 Alôs\"\n *\n * @example\n * // A key the catalog does not define, with text to show instead of the key.\n * i18n.t(\"cart.empty\", undefined, { default: \"Seu carrinho está vazio\" });\n */\nexport function createI18n(options: CreateI18nOptions): I18n {\n const { locale, fallbackLocale = null, messages } = options;\n\n function t(key: string, params?: InterpolationValues, options?: TranslateOptions): string {\n const template = lookup(messages, locale, fallbackLocale, key) ?? options?.default;\n if (template === undefined) return key;\n return interpolate(template, params);\n }\n\n function plural(\n key: string,\n count: number,\n params?: InterpolationValues,\n options?: TranslateOptions,\n ): string {\n const suffix = count === 1 ? \"_one\" : \"_other\";\n const template =\n lookup(messages, locale, fallbackLocale, `${key}${suffix}`) ??\n lookup(messages, locale, fallbackLocale, key) ??\n options?.default;\n if (template === undefined) return key;\n return interpolate(template, { count, ...(params ?? {}) });\n }\n\n function formatNumber(value: number, opts?: Intl.NumberFormatOptions): string {\n return new Intl.NumberFormat(locale, opts).format(value);\n }\n\n function formatDate(value: Date | string, opts?: Intl.DateTimeFormatOptions): string {\n const date = typeof value === \"string\" ? new Date(value) : value;\n if (Number.isNaN(date.getTime())) return \"\";\n return new Intl.DateTimeFormat(locale, opts).format(date);\n }\n\n return {\n locale,\n fallbackLocale,\n t,\n plural,\n formatNumber,\n formatDate,\n withLocale: (nextLocale) =>\n createI18n({\n locale: nextLocale,\n fallbackLocale: fallbackLocale ?? undefined,\n messages,\n }),\n };\n}\n"],"mappings":"AA4DA,SAAS,EAAY,EAAkB,EAAsC,CAEzE,OADK,EACE,EAAS,QAAQ,cAAe,EAAQ,IAAiB,CAC5D,IAAM,EAAQ,EAAO,GACrB,OAAO,IAAU,IAAA,GAAY,IAAI,EAAK,GAAK,OAAO,CAAK,CAC3D,CAAC,EAJmB,CAKxB,CAEA,SAAS,EACL,EACA,EACA,EACA,EACa,CACb,IAAM,EAAS,EAAQ,EAAO,GAAG,GACjC,GAAI,IAAW,IAAA,GAAW,OAAO,EACjC,GAAI,EAAU,CACV,IAAM,EAAgB,EAAQ,EAAS,GAAG,GAC1C,GAAI,IAAkB,IAAA,GAAW,OAAO,CAC5C,CACA,OAAO,IACX,CA6BA,SAAgB,EAAW,EAAkC,CACzD,GAAM,CAAE,SAAQ,iBAAiB,KAAM,YAAa,EAEpD,SAAS,EAAE,EAAa,EAA8B,EAAoC,CACtF,IAAM,EAAW,EAAO,EAAU,EAAQ,EAAgB,CAAG,GAAK,GAAS,QAE3E,OADI,IAAa,IAAA,GAAkB,EAC5B,EAAY,EAAU,CAAM,CACvC,CAEA,SAAS,EACL,EACA,EACA,EACA,EACM,CAEN,IAAM,EACF,EAAO,EAAU,EAAQ,EAAgB,GAAG,IAFjC,IAAU,EAAI,OAAS,UAEwB,GAC1D,EAAO,EAAU,EAAQ,EAAgB,CAAG,GAC5C,GAAS,QAEb,OADI,IAAa,IAAA,GAAkB,EAC5B,EAAY,EAAU,CAAE,QAAO,GAAI,GAAU,CAAC,CAAG,CAAC,CAC7D,CAEA,SAAS,EAAa,EAAe,EAAyC,CAC1E,OAAO,IAAI,KAAK,aAAa,EAAQ,CAAI,CAAC,CAAC,OAAO,CAAK,CAC3D,CAEA,SAAS,EAAW,EAAsB,EAA2C,CACjF,IAAM,EAAO,OAAO,GAAU,SAAW,IAAI,KAAK,CAAK,EAAI,EAE3D,OADI,OAAO,MAAM,EAAK,QAAQ,CAAC,EAAU,GAClC,IAAI,KAAK,eAAe,EAAQ,CAAI,CAAC,CAAC,OAAO,CAAI,CAC5D,CAEA,MAAO,CACH,SACA,iBACA,IACA,SACA,eACA,aACA,WAAa,GACT,EAAW,CACP,OAAQ,EACR,eAAgB,GAAkB,IAAA,GAClC,UACJ,CAAC,CACT,CACJ"}
@@ -16,13 +16,13 @@ function t(e, t, n, r) {
16
16
  }
17
17
  function n(r) {
18
18
  let { locale: i, fallbackLocale: a = null, messages: o } = r;
19
- function s(n, r) {
20
- let s = t(o, i, a, n);
21
- return s === null ? n : e(s, r);
19
+ function s(n, r, s) {
20
+ let c = t(o, i, a, n) ?? s?.default;
21
+ return c === void 0 ? n : e(c, r);
22
22
  }
23
- function c(n, r, s) {
24
- let c = t(o, i, a, `${n}${r === 1 ? "_one" : "_other"}`) ?? t(o, i, a, n);
25
- return c === null ? n : e(c, {
23
+ function c(n, r, s, c) {
24
+ let l = t(o, i, a, `${n}${r === 1 ? "_one" : "_other"}`) ?? t(o, i, a, n) ?? c?.default;
25
+ return l === void 0 ? n : e(l, {
26
26
  count: r,
27
27
  ...s ?? {}
28
28
  });
@@ -1 +1 @@
1
- {"version":3,"file":"create-i18n.js","names":[],"sources":["../../src/i18n/create-i18n.ts"],"sourcesContent":["export type Messages = Record<string, string>;\nexport type Catalog = Record<string, Messages>;\nexport type InterpolationValues = Record<string, string | number>;\n\nexport interface CreateI18nOptions {\n /** Initial locale. */\n locale: string;\n /** Fallback locale used when a key is missing in the active locale. */\n fallbackLocale?: string;\n /** Catalog `{ [locale]: { [key]: \"...\" } }`. */\n messages: Catalog;\n}\n\nexport interface I18n {\n /** Currently active locale. */\n locale: string;\n /** Fallback locale (or `null` when not configured). */\n fallbackLocale: string | null;\n /**\n * Translate `key`, interpolating `{name}` placeholders from `params`.\n * Falls back to the configured fallback locale, then to the key itself.\n */\n t: (key: string, params?: InterpolationValues) => string;\n /**\n * Plural-aware translation. Tries `${key}_one` for `count === 1` and\n * `${key}_other` otherwise, with `{count}` available for interpolation.\n */\n plural: (key: string, count: number, params?: InterpolationValues) => string;\n /** Format a number using `Intl.NumberFormat` on the active locale. */\n formatNumber: (value: number, options?: Intl.NumberFormatOptions) => string;\n /** Format a Date using `Intl.DateTimeFormat` on the active locale. */\n formatDate: (value: Date | string, options?: Intl.DateTimeFormatOptions) => string;\n /** Build a new `I18n` instance pointing at a different locale. */\n withLocale: (locale: string) => I18n;\n}\n\nfunction interpolate(template: string, params?: InterpolationValues): string {\n if (!params) return template;\n return template.replace(/\\{(\\w+)\\}/g, (_match, name: string) => {\n const value = params[name];\n return value === undefined ? `{${name}}` : String(value);\n });\n}\n\nfunction lookup(\n catalog: Catalog,\n locale: string,\n fallback: string | null,\n key: string,\n): string | null {\n const direct = catalog[locale]?.[key];\n if (direct !== undefined) return direct;\n if (fallback) {\n const fallbackValue = catalog[fallback]?.[key];\n if (fallbackValue !== undefined) return fallbackValue;\n }\n return null;\n}\n\n/**\n * Create an i18n object with translation, pluralization and Intl helpers.\n *\n * The catalog is a plain `{ [locale]: { [key]: \"...\" } }` map — bring your\n * own keys, namespaces, or nested-key conventions. The SDK does not enforce\n * a schema so you can plug it into any string-loading pipeline.\n *\n * @example\n * const i18n = createI18n({\n * locale: \"pt-BR\",\n * fallbackLocale: \"en\",\n * messages: {\n * \"pt-BR\": {\n * \"greet\": \"Olá, {name}\",\n * \"alos_one\": \"{count} Alô\",\n * \"alos_other\": \"{count} Alôs\",\n * },\n * \"en\": { greet: \"Hi, {name}\", alos_one: \"{count} Alo\", alos_other: \"{count} Alos\" },\n * },\n * });\n * i18n.t(\"greet\", { name: \"Mau\" }); // \"Olá, Mau\"\n * i18n.plural(\"alos\", 3); // \"3 Alôs\"\n */\nexport function createI18n(options: CreateI18nOptions): I18n {\n const { locale, fallbackLocale = null, messages } = options;\n\n function t(key: string, params?: InterpolationValues): string {\n const template = lookup(messages, locale, fallbackLocale, key);\n if (template === null) return key;\n return interpolate(template, params);\n }\n\n function plural(key: string, count: number, params?: InterpolationValues): string {\n const suffix = count === 1 ? \"_one\" : \"_other\";\n const template =\n lookup(messages, locale, fallbackLocale, `${key}${suffix}`) ??\n lookup(messages, locale, fallbackLocale, key);\n if (template === null) return key;\n return interpolate(template, { count, ...(params ?? {}) });\n }\n\n function formatNumber(value: number, opts?: Intl.NumberFormatOptions): string {\n return new Intl.NumberFormat(locale, opts).format(value);\n }\n\n function formatDate(value: Date | string, opts?: Intl.DateTimeFormatOptions): string {\n const date = typeof value === \"string\" ? new Date(value) : value;\n if (Number.isNaN(date.getTime())) return \"\";\n return new Intl.DateTimeFormat(locale, opts).format(date);\n }\n\n return {\n locale,\n fallbackLocale,\n t,\n plural,\n formatNumber,\n formatDate,\n withLocale: (nextLocale) =>\n createI18n({\n locale: nextLocale,\n fallbackLocale: fallbackLocale ?? undefined,\n messages,\n }),\n };\n}\n"],"mappings":";AAoCA,SAAS,EAAY,GAAkB,GAAsC;CAEzE,OADK,IACE,EAAS,QAAQ,eAAe,GAAQ,MAAiB;EAC5D,IAAM,IAAQ,EAAO;EACrB,OAAO,MAAU,KAAA,IAAY,IAAI,EAAK,KAAK,OAAO,CAAK;CAC3D,CAAC,IAJmB;AAKxB;AAEA,SAAS,EACL,GACA,GACA,GACA,GACa;CACb,IAAM,IAAS,EAAQ,EAAO,GAAG;CACjC,IAAI,MAAW,KAAA,GAAW,OAAO;CACjC,IAAI,GAAU;EACV,IAAM,IAAgB,EAAQ,EAAS,GAAG;EAC1C,IAAI,MAAkB,KAAA,GAAW,OAAO;CAC5C;CACA,OAAO;AACX;AAyBA,SAAgB,EAAW,GAAkC;CACzD,IAAM,EAAE,WAAQ,oBAAiB,MAAM,gBAAa;CAEpD,SAAS,EAAE,GAAa,GAAsC;EAC1D,IAAM,IAAW,EAAO,GAAU,GAAQ,GAAgB,CAAG;EAE7D,OADI,MAAa,OAAa,IACvB,EAAY,GAAU,CAAM;CACvC;CAEA,SAAS,EAAO,GAAa,GAAe,GAAsC;EAE9E,IAAM,IACF,EAAO,GAAU,GAAQ,GAAgB,GAAG,IAFjC,MAAU,IAAI,SAAS,UAEwB,KAC1D,EAAO,GAAU,GAAQ,GAAgB,CAAG;EAEhD,OADI,MAAa,OAAa,IACvB,EAAY,GAAU;GAAE;GAAO,GAAI,KAAU,CAAC;EAAG,CAAC;CAC7D;CAEA,SAAS,EAAa,GAAe,GAAyC;EAC1E,OAAO,IAAI,KAAK,aAAa,GAAQ,CAAI,CAAC,CAAC,OAAO,CAAK;CAC3D;CAEA,SAAS,EAAW,GAAsB,GAA2C;EACjF,IAAM,IAAO,OAAO,KAAU,WAAW,IAAI,KAAK,CAAK,IAAI;EAE3D,OADI,OAAO,MAAM,EAAK,QAAQ,CAAC,IAAU,KAClC,IAAI,KAAK,eAAe,GAAQ,CAAI,CAAC,CAAC,OAAO,CAAI;CAC5D;CAEA,OAAO;EACH;EACA;EACA;EACA;EACA;EACA;EACA,aAAa,MACT,EAAW;GACP,QAAQ;GACR,gBAAgB,KAAkB,KAAA;GAClC;EACJ,CAAC;CACT;AACJ"}
1
+ {"version":3,"file":"create-i18n.js","names":[],"sources":["../../src/i18n/create-i18n.ts"],"sourcesContent":["export type Messages = Record<string, string>;\nexport type Catalog = Record<string, Messages>;\nexport type InterpolationValues = Record<string, string | number>;\n\nexport interface CreateI18nOptions {\n /** Initial locale. */\n locale: string;\n /** Fallback locale used when a key is missing in the active locale. */\n fallbackLocale?: string;\n /** Catalog `{ [locale]: { [key]: \"...\" } }`. */\n messages: Catalog;\n}\n\n/** Per-call options for {@link I18n.t} and {@link I18n.plural}. */\nexport interface TranslateOptions {\n /**\n * Text to use when the catalog defines neither the key nor its fallback.\n *\n * Without this, a miss returns the key, and a caller that wants its own text\n * instead has to *detect* the miss — which from the outside means comparing\n * the result against the key it just passed in. That heuristic is wrong for a\n * catalog that legitimately maps a key to itself, and it is what every\n * translatable string the SDK ships would otherwise have to copy.\n *\n * Interpolated like any other message, so a default carries `{placeholders}`\n * too and is not second-class.\n */\n default?: string;\n}\n\nexport interface I18n {\n /** Currently active locale. */\n locale: string;\n /** Fallback locale (or `null` when not configured). */\n fallbackLocale: string | null;\n /**\n * Translate `key`, interpolating `{name}` placeholders from `params`.\n * Falls back to the configured fallback locale, then to `options.default`,\n * then to the key itself.\n */\n t: (key: string, params?: InterpolationValues, options?: TranslateOptions) => string;\n /**\n * Plural-aware translation. Tries `${key}_one` for `count === 1` and\n * `${key}_other` otherwise, with `{count}` available for interpolation.\n * Falls back to `options.default`, then to the key itself.\n */\n plural: (\n key: string,\n count: number,\n params?: InterpolationValues,\n options?: TranslateOptions,\n ) => string;\n /** Format a number using `Intl.NumberFormat` on the active locale. */\n formatNumber: (value: number, options?: Intl.NumberFormatOptions) => string;\n /** Format a Date using `Intl.DateTimeFormat` on the active locale. */\n formatDate: (value: Date | string, options?: Intl.DateTimeFormatOptions) => string;\n /** Build a new `I18n` instance pointing at a different locale. */\n withLocale: (locale: string) => I18n;\n}\n\nfunction interpolate(template: string, params?: InterpolationValues): string {\n if (!params) return template;\n return template.replace(/\\{(\\w+)\\}/g, (_match, name: string) => {\n const value = params[name];\n return value === undefined ? `{${name}}` : String(value);\n });\n}\n\nfunction lookup(\n catalog: Catalog,\n locale: string,\n fallback: string | null,\n key: string,\n): string | null {\n const direct = catalog[locale]?.[key];\n if (direct !== undefined) return direct;\n if (fallback) {\n const fallbackValue = catalog[fallback]?.[key];\n if (fallbackValue !== undefined) return fallbackValue;\n }\n return null;\n}\n\n/**\n * Create an i18n object with translation, pluralization and Intl helpers.\n *\n * The catalog is a plain `{ [locale]: { [key]: \"...\" } }` map — bring your\n * own keys, namespaces, or nested-key conventions. The SDK does not enforce\n * a schema so you can plug it into any string-loading pipeline.\n *\n * @example\n * const i18n = createI18n({\n * locale: \"pt-BR\",\n * fallbackLocale: \"en\",\n * messages: {\n * \"pt-BR\": {\n * \"greet\": \"Olá, {name}\",\n * \"alos_one\": \"{count} Alô\",\n * \"alos_other\": \"{count} Alôs\",\n * },\n * \"en\": { greet: \"Hi, {name}\", alos_one: \"{count} Alo\", alos_other: \"{count} Alos\" },\n * },\n * });\n * i18n.t(\"greet\", { name: \"Mau\" }); // \"Olá, Mau\"\n * i18n.plural(\"alos\", 3); // \"3 Alôs\"\n *\n * @example\n * // A key the catalog does not define, with text to show instead of the key.\n * i18n.t(\"cart.empty\", undefined, { default: \"Seu carrinho está vazio\" });\n */\nexport function createI18n(options: CreateI18nOptions): I18n {\n const { locale, fallbackLocale = null, messages } = options;\n\n function t(key: string, params?: InterpolationValues, options?: TranslateOptions): string {\n const template = lookup(messages, locale, fallbackLocale, key) ?? options?.default;\n if (template === undefined) return key;\n return interpolate(template, params);\n }\n\n function plural(\n key: string,\n count: number,\n params?: InterpolationValues,\n options?: TranslateOptions,\n ): string {\n const suffix = count === 1 ? \"_one\" : \"_other\";\n const template =\n lookup(messages, locale, fallbackLocale, `${key}${suffix}`) ??\n lookup(messages, locale, fallbackLocale, key) ??\n options?.default;\n if (template === undefined) return key;\n return interpolate(template, { count, ...(params ?? {}) });\n }\n\n function formatNumber(value: number, opts?: Intl.NumberFormatOptions): string {\n return new Intl.NumberFormat(locale, opts).format(value);\n }\n\n function formatDate(value: Date | string, opts?: Intl.DateTimeFormatOptions): string {\n const date = typeof value === \"string\" ? new Date(value) : value;\n if (Number.isNaN(date.getTime())) return \"\";\n return new Intl.DateTimeFormat(locale, opts).format(date);\n }\n\n return {\n locale,\n fallbackLocale,\n t,\n plural,\n formatNumber,\n formatDate,\n withLocale: (nextLocale) =>\n createI18n({\n locale: nextLocale,\n fallbackLocale: fallbackLocale ?? undefined,\n messages,\n }),\n };\n}\n"],"mappings":";AA4DA,SAAS,EAAY,GAAkB,GAAsC;CAEzE,OADK,IACE,EAAS,QAAQ,eAAe,GAAQ,MAAiB;EAC5D,IAAM,IAAQ,EAAO;EACrB,OAAO,MAAU,KAAA,IAAY,IAAI,EAAK,KAAK,OAAO,CAAK;CAC3D,CAAC,IAJmB;AAKxB;AAEA,SAAS,EACL,GACA,GACA,GACA,GACa;CACb,IAAM,IAAS,EAAQ,EAAO,GAAG;CACjC,IAAI,MAAW,KAAA,GAAW,OAAO;CACjC,IAAI,GAAU;EACV,IAAM,IAAgB,EAAQ,EAAS,GAAG;EAC1C,IAAI,MAAkB,KAAA,GAAW,OAAO;CAC5C;CACA,OAAO;AACX;AA6BA,SAAgB,EAAW,GAAkC;CACzD,IAAM,EAAE,WAAQ,oBAAiB,MAAM,gBAAa;CAEpD,SAAS,EAAE,GAAa,GAA8B,GAAoC;EACtF,IAAM,IAAW,EAAO,GAAU,GAAQ,GAAgB,CAAG,KAAK,GAAS;EAE3E,OADI,MAAa,KAAA,IAAkB,IAC5B,EAAY,GAAU,CAAM;CACvC;CAEA,SAAS,EACL,GACA,GACA,GACA,GACM;EAEN,IAAM,IACF,EAAO,GAAU,GAAQ,GAAgB,GAAG,IAFjC,MAAU,IAAI,SAAS,UAEwB,KAC1D,EAAO,GAAU,GAAQ,GAAgB,CAAG,KAC5C,GAAS;EAEb,OADI,MAAa,KAAA,IAAkB,IAC5B,EAAY,GAAU;GAAE;GAAO,GAAI,KAAU,CAAC;EAAG,CAAC;CAC7D;CAEA,SAAS,EAAa,GAAe,GAAyC;EAC1E,OAAO,IAAI,KAAK,aAAa,GAAQ,CAAI,CAAC,CAAC,OAAO,CAAK;CAC3D;CAEA,SAAS,EAAW,GAAsB,GAA2C;EACjF,IAAM,IAAO,OAAO,KAAU,WAAW,IAAI,KAAK,CAAK,IAAI;EAE3D,OADI,OAAO,MAAM,EAAK,QAAQ,CAAC,IAAU,KAClC,IAAI,KAAK,eAAe,GAAQ,CAAI,CAAC,CAAC,OAAO,CAAI;CAC5D;CAEA,OAAO;EACH;EACA;EACA;EACA;EACA;EACA;EACA,aAAa,MACT,EAAW;GACP,QAAQ;GACR,gBAAgB,KAAkB,KAAA;GAClC;EACJ,CAAC;CACT;AACJ"}
@@ -1,2 +1,2 @@
1
- var e=`circle-question-mark`,t={ac_unit:`snowflake`,account_balance:`landmark`,add:`plus`,balance:`scale`,bar_chart:`chart-column`,battery_full:`battery-full`,bluetooth:`bluetooth`,bolt:`zap`,brush:`brush`,build:`wrench`,cake:`cake`,calculate:`calculator`,campaign:`megaphone`,car_repair:`car`,carpenter:`hammer`,chair:`armchair`,chat:`message-circle`,check:`check`,child_care:`baby`,cleaning_services:`spray-can`,close:`x`,cloud:`cloud`,code:`code`,computer:`monitor`,construction:`hard-hat`,content_cut:`scissors`,credit_card:`credit-card`,dashboard:`layout-dashboard`,delete:`trash-2`,delivery_dining:`bike`,dentistry:`face-slightly-smiling`,description:`file-text`,directions_car:`car`,door_front:`door-open`,download:`download`,edit:`pencil`,electrical_services:`plug-zap`,error:`circle-x`,event:`calendar`,favorite:`heart`,fitness_center:`dumbbell`,flight:`plane`,folder:`folder`,format_paint:`paint-roller`,forum:`messages-square`,gavel:`gavel`,grass:`sprout`,group:`users`,groups:`users`,handyman:`wrench`,hardware:`wrench`,help:`circle-question-mark`,history:`rotate-ccw-clock`,home:`house`,hotel:`bed-double`,image:`image`,info:`info`,iron:`shirt`,key:`key`,kitchen:`refrigerator`,laptop:`laptop`,local_bar:`wine`,local_cafe:`coffee`,local_florist:`flower`,local_gas_station:`fuel`,local_laundry_service:`washing-machine`,local_shipping:`truck`,local_taxi:`car-taxi-front`,location_on:`map-pin`,lock:`lock`,lock_open:`lock-open`,login:`log-in`,logout:`log-out`,mail:`mail`,map:`map`,medical_services:`stethoscope`,menu:`menu`,mic:`mic`,music_note:`music`,notifications:`bell`,palette:`palette`,payments:`banknote`,pedal_bike:`bike`,person:`user`,pest_control:`bug`,pets:`paw-print`,phone:`phone`,phone_iphone:`smartphone`,photo_camera:`camera`,pie_chart:`chart-pie`,plumbing:`shower-head`,print:`printer`,receipt_long:`receipt`,restaurant:`utensils`,roofing:`house`,router:`router`,savings:`piggy-bank`,schedule:`clock`,school:`graduation-cap`,search:`search`,security:`shield-check`,settings:`settings`,share:`share-2`,shield:`shield`,shopping_bag:`shopping-bag`,shopping_cart:`shopping-cart`,smartphone:`smartphone`,soap:`soap-dispenser-droplet`,spa:`flower-2`,star:`star`,store:`store`,storefront:`store`,support_agent:`headset`,sync:`refresh-cw`,today:`calendar-days`,translate:`languages`,trending_up:`trending-up`,tv:`tv`,two_wheeler:`bike`,upload:`upload`,vaccines:`syringe`,verified:`badge-check`,videocam:`video`,visibility:`eye`,warehouse:`warehouse`,warning:`triangle-alert`,water_drop:`droplet`,wifi:`wifi`,work:`briefcase`,yard:`trees`};function n(n,r=e){return n?t[n.trim().toLowerCase()]??r:r}exports.MATERIAL_SYMBOL_FALLBACK=e,exports.fromMaterialSymbol=n,exports.materialToLucide=t;
1
+ var e=`circle-question-mark`,t={ac_unit:`snowflake`,account_balance:`landmark`,account_balance_wallet:`wallet`,account_box:`square-user`,account_circle:`circle-user`,add:`plus`,add_circle:`circle-plus`,add_circle_outline:`circle-plus`,add_shopping_cart:`shopping-cart`,admin_panel_settings:`shield-user`,analytics:`chart-column`,apps:`layout-grid`,arrow_back:`arrow-left`,arrow_back_ios:`chevron-left`,arrow_back_ios_new:`chevron-left`,arrow_downward:`arrow-down`,arrow_drop_down:`chevron-down`,arrow_forward:`arrow-right`,arrow_forward_ios:`chevron-right`,arrow_right:`chevron-right`,arrow_right_alt:`arrow-right`,arrow_upward:`arrow-up`,article:`newspaper`,assignment:`clipboard-list`,attach_file:`paperclip`,attach_money:`dollar-sign`,autorenew:`refresh-cw`,badge:`id-card`,balance:`scale`,bar_chart:`chart-column`,battery_full:`battery-full`,bluetooth:`bluetooth`,bolt:`zap`,bookmark:`bookmark`,brush:`brush`,build:`wrench`,business:`building-2`,cake:`cake`,calculate:`calculator`,calendar_month:`calendar`,calendar_today:`calendar`,call:`phone`,campaign:`megaphone`,cancel:`circle-x`,car_repair:`car`,carpenter:`hammer`,category:`shapes`,chair:`armchair`,chat:`message-circle`,check:`check`,check_box:`square-check`,check_box_outline_blank:`square`,check_circle:`circle-check`,check_circle_outline:`circle-check`,chevron_left:`chevron-left`,chevron_right:`chevron-right`,child_care:`baby`,circle:`circle`,cleaning_services:`spray-can`,clear:`x`,close:`x`,cloud:`cloud`,code:`code`,computer:`monitor`,construction:`construction`,content_copy:`copy`,content_cut:`scissors`,credit_card:`credit-card`,dark_mode:`moon`,dashboard:`layout-dashboard`,date_range:`calendar-range`,delete:`trash-2`,delete_forever:`trash-2`,delete_outline:`trash-2`,delivery_dining:`bike`,dentistry:`face-slightly-smiling`,description:`file-text`,directions_car:`car`,done:`check`,done_all:`check-check`,door_front:`door-open`,download:`download`,east:`arrow-right`,edit:`pencil`,edit_note:`pencil-line`,electrical_services:`plug-zap`,email:`mail`,emoji_events:`trophy`,engineering:`hard-hat`,error:`circle-alert`,error_outline:`circle-alert`,event:`calendar-days`,expand_less:`chevron-up`,expand_more:`chevron-down`,explore:`compass`,face:`face-slightly-smiling`,fact_check:`clipboard-check`,favorite:`heart`,favorite_border:`heart`,file_download:`download`,file_upload:`upload`,filter_alt:`funnel`,filter_list:`funnel`,fingerprint:`fingerprint-pattern`,fitness_center:`dumbbell`,flight:`plane`,folder:`folder`,format_list_bulleted:`list`,format_paint:`paint-roller`,forum:`messages-square`,gavel:`gavel`,grade:`star`,grass:`sprout`,grid_view:`layout-grid`,group:`users`,groups:`users`,handyman:`wrench`,hardware:`wrench`,help:`circle-question-mark`,help_outline:`circle-question-mark`,highlight_off:`circle-x`,history:`rotate-ccw-clock`,home:`house`,hotel:`bed-double`,image:`image`,info:`info`,insights:`chart-line`,inventory:`package`,inventory_2:`package`,iron:`shirt`,key:`key`,kitchen:`refrigerator`,language:`globe`,laptop:`laptop`,light_mode:`sun`,lightbulb:`lightbulb`,link:`link`,list:`list`,list_alt:`list`,local_bar:`wine`,local_cafe:`coffee`,local_florist:`flower`,local_gas_station:`fuel`,local_laundry_service:`washing-machine`,local_offer:`tag`,local_shipping:`truck`,local_taxi:`car-taxi-front`,location_on:`map-pin`,lock:`lock`,lock_open:`lock-open`,login:`log-in`,logout:`log-out`,mail:`mail`,mail_outline:`mail`,manage_accounts:`user-cog`,map:`map`,medical_services:`stethoscope`,menu:`menu`,menu_book:`book-open`,mic:`mic`,mode_edit:`pencil`,monetization_on:`circle-dollar-sign`,more_horiz:`ellipsis`,more_vert:`ellipsis-vertical`,music_note:`music`,navigate_next:`chevron-right`,note_add:`file-plus`,notifications:`bell`,notifications_active:`bell-ring`,open_in_new:`external-link`,paid:`circle-dollar-sign`,palette:`palette`,pause:`pause`,payments:`banknote`,pedal_bike:`bike`,people:`users`,perm_identity:`user`,person:`user`,person_add:`user-plus`,person_outline:`user`,pest_control:`bug`,pets:`paw-print`,phone:`phone`,phone_iphone:`smartphone`,photo_camera:`camera`,picture_as_pdf:`file-text`,pie_chart:`chart-pie`,place:`map-pin`,play_arrow:`play`,play_circle:`circle-play`,play_circle_filled:`circle-play`,plumbing:`shower-head`,power_settings_new:`power`,print:`printer`,public:`globe`,qr_code_scanner:`scan-line`,question_answer:`messages-square`,radio_button_checked:`circle-dot`,radio_button_unchecked:`circle`,receipt:`receipt`,receipt_long:`receipt-text`,refresh:`refresh-cw`,remove:`minus`,remove_circle_outline:`circle-minus`,reorder:`list`,report_problem:`triangle-alert`,restart_alt:`rotate-ccw`,restaurant:`utensils`,roofing:`house`,room:`map-pin`,router:`router`,save:`save`,savings:`piggy-bank`,schedule:`clock`,school:`graduation-cap`,search:`search`,security:`shield-check`,send:`send`,settings:`settings`,share:`share-2`,shield:`shield`,shopping_bag:`shopping-bag`,shopping_cart:`shopping-cart`,smartphone:`smartphone`,soap:`soap-dispenser-droplet`,sort:`arrow-down-up`,spa:`flower-2`,star:`star`,star_border:`star`,star_rate:`star`,store:`store`,storefront:`store`,support_agent:`headset`,sync:`refresh-cw`,task_alt:`circle-check`,timer:`timer`,today:`calendar`,toggle_on:`toggle-right`,translate:`languages`,trending_up:`trending-up`,tune:`sliders-horizontal`,tv:`tv`,two_wheeler:`bike`,upload:`upload`,upload_file:`upload`,vaccines:`syringe`,verified:`badge-check`,verified_user:`shield-check`,videocam:`video`,view_list:`list`,visibility:`eye`,visibility_off:`eye-off`,vpn_key:`key-round`,warehouse:`warehouse`,warning:`triangle-alert`,warning_amber:`triangle-alert`,watch_later:`clock`,water_drop:`droplet`,wifi:`wifi`,work:`briefcase`,yard:`trees`};function n(n,r=e){return n?t[n.trim().toLowerCase()]??r:r}exports.MATERIAL_SYMBOL_FALLBACK=e,exports.fromMaterialSymbol=n,exports.materialToLucide=t;
2
2
  //# sourceMappingURL=material-symbols.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"material-symbols.cjs","names":[],"sources":["../../src/icons/material-symbols.ts"],"sourcesContent":["import type { IconName } from \"./generated/icon-name\";\n\n/**\n * The slug `fromMaterialSymbol` falls back to when a code is unknown.\n *\n * A neutral glyph rather than nothing: a category created in an admin with a\n * code this table has not learned yet still has to draw something, or it opens a\n * hole in the grid and the bug reads as a layout problem instead of a missing\n * mapping.\n *\n * Lucide's `circle-help` is a deprecated alias of this slug. `<Icon>` resolves\n * aliases, so both render — but the bridge emits the canonical name, since a\n * value that gets persisted should not be one lucide has already renamed.\n */\nexport const MATERIAL_SYMBOL_FALLBACK: IconName = \"circle-question-mark\";\n\n/**\n * Material Symbols code → lucide slug, for backends that store `icon_code`.\n *\n * Every Python backend we write stores a category icon as a Material Symbol\n * (`build`, `format_paint`, `electrical_services`) — the vocabulary Flutter,\n * Android and the administrative seeds already speak. The SDK speaks lucide in\n * kebab-case. The two lists do not meet, and the failure is nastier than an\n * empty screen: a handful of codes collide by accident, so roughly one row in\n * ten draws the right icon and the bug reads as \"some icons went missing\".\n *\n * **Still not the full vocabulary.** Material Symbols ships ~3600 names and\n * almost none of them will ever appear in an `icon_code` of ours, so this grows\n * on demand, one hand-written pair at a time — a map generated by name\n * heuristics gets it badly wrong, starting with `build`, which is a wrench in\n * Material Symbols and nothing to do with construction. What is here covers the\n * trades lot it started as plus the vocabulary an administrative panel actually\n * uses: navigation, money, dates, media, and the service categories a seed\n * tends to carry.\n *\n * Every target is checked mechanically against the slug list by\n * `material-symbols.test.ts`, so a pair pointing at a name lucide does not ship\n * — or at one it has since deprecated — fails the suite instead of reaching a\n * grid. What no test can check is whether the *chosen* icon is the right\n * metaphor, which is why pairs go in by hand.\n *\n * **Approximations, deliberate and not one-to-one** (the full list lives in\n * `docs/icons.md`):\n *\n * - `plumbing` → `shower-head`, because lucide has no pipe.\n * - `build`, `handyman` and `hardware` all land on `wrench` — Material Symbols\n * distinguishes the tools, lucide does not.\n * - `pedal_bike`, `two_wheeler` and `delivery_dining` all land on `bike`.\n * - `dentistry` → `face-slightly-smiling`, since lucide ships no tooth.\n * - `iron` → `shirt` and `cleaning_services` → `spray-can`: the activity, not\n * the implement.\n * - `roofing` → `house`, the same glyph as `home`, because lucide has no roof.\n *\n * The identity pairs are here on purpose. Their names happen to match in both\n * vocabularies, so they already render today — leaving them out would send them\n * to {@link MATERIAL_SYMBOL_FALLBACK} and make this bridge a regression for\n * exactly the codes that used to work.\n *\n * @see fromMaterialSymbol — the lookup you normally call.\n */\nexport const materialToLucide: Readonly<Record<string, IconName>> = {\n ac_unit: \"snowflake\",\n account_balance: \"landmark\",\n add: \"plus\",\n balance: \"scale\",\n bar_chart: \"chart-column\",\n battery_full: \"battery-full\",\n bluetooth: \"bluetooth\",\n bolt: \"zap\",\n brush: \"brush\",\n build: \"wrench\",\n cake: \"cake\",\n calculate: \"calculator\",\n campaign: \"megaphone\",\n car_repair: \"car\",\n carpenter: \"hammer\",\n chair: \"armchair\",\n chat: \"message-circle\",\n check: \"check\",\n child_care: \"baby\",\n cleaning_services: \"spray-can\",\n close: \"x\",\n cloud: \"cloud\",\n code: \"code\",\n computer: \"monitor\",\n construction: \"hard-hat\",\n content_cut: \"scissors\",\n credit_card: \"credit-card\",\n dashboard: \"layout-dashboard\",\n delete: \"trash-2\",\n delivery_dining: \"bike\",\n dentistry: \"face-slightly-smiling\",\n description: \"file-text\",\n directions_car: \"car\",\n door_front: \"door-open\",\n download: \"download\",\n edit: \"pencil\",\n electrical_services: \"plug-zap\",\n error: \"circle-x\",\n event: \"calendar\",\n favorite: \"heart\",\n fitness_center: \"dumbbell\",\n flight: \"plane\",\n folder: \"folder\",\n format_paint: \"paint-roller\",\n forum: \"messages-square\",\n gavel: \"gavel\",\n grass: \"sprout\",\n group: \"users\",\n groups: \"users\",\n handyman: \"wrench\",\n hardware: \"wrench\",\n help: \"circle-question-mark\",\n history: \"rotate-ccw-clock\",\n home: \"house\",\n hotel: \"bed-double\",\n image: \"image\",\n info: \"info\",\n iron: \"shirt\",\n key: \"key\",\n kitchen: \"refrigerator\",\n laptop: \"laptop\",\n local_bar: \"wine\",\n local_cafe: \"coffee\",\n local_florist: \"flower\",\n local_gas_station: \"fuel\",\n local_laundry_service: \"washing-machine\",\n local_shipping: \"truck\",\n local_taxi: \"car-taxi-front\",\n location_on: \"map-pin\",\n lock: \"lock\",\n lock_open: \"lock-open\",\n login: \"log-in\",\n logout: \"log-out\",\n mail: \"mail\",\n map: \"map\",\n medical_services: \"stethoscope\",\n menu: \"menu\",\n mic: \"mic\",\n music_note: \"music\",\n notifications: \"bell\",\n palette: \"palette\",\n payments: \"banknote\",\n pedal_bike: \"bike\",\n person: \"user\",\n pest_control: \"bug\",\n pets: \"paw-print\",\n phone: \"phone\",\n phone_iphone: \"smartphone\",\n photo_camera: \"camera\",\n pie_chart: \"chart-pie\",\n plumbing: \"shower-head\",\n print: \"printer\",\n receipt_long: \"receipt\",\n restaurant: \"utensils\",\n roofing: \"house\",\n router: \"router\",\n savings: \"piggy-bank\",\n schedule: \"clock\",\n school: \"graduation-cap\",\n search: \"search\",\n security: \"shield-check\",\n settings: \"settings\",\n share: \"share-2\",\n shield: \"shield\",\n shopping_bag: \"shopping-bag\",\n shopping_cart: \"shopping-cart\",\n smartphone: \"smartphone\",\n soap: \"soap-dispenser-droplet\",\n spa: \"flower-2\",\n star: \"star\",\n store: \"store\",\n storefront: \"store\",\n support_agent: \"headset\",\n sync: \"refresh-cw\",\n today: \"calendar-days\",\n translate: \"languages\",\n trending_up: \"trending-up\",\n tv: \"tv\",\n two_wheeler: \"bike\",\n upload: \"upload\",\n vaccines: \"syringe\",\n verified: \"badge-check\",\n videocam: \"video\",\n visibility: \"eye\",\n warehouse: \"warehouse\",\n warning: \"triangle-alert\",\n water_drop: \"droplet\",\n wifi: \"wifi\",\n work: \"briefcase\",\n yard: \"trees\",\n};\n\n/**\n * Translate a Material Symbols code into a lucide slug, always returning one.\n *\n * Never returns `undefined`: an unknown code resolves to `fallback`, so a row\n * whose `icon_code` this table has not learned yet still renders. The input is\n * trimmed and lower-cased before lookup, because a seed written by hand is the\n * kind of source that carries stray whitespace and the odd capital.\n *\n * Nothing else in `/icons` imports this module, so an app that does not store\n * Material Symbols never pays for the table.\n *\n * @example\n * <Icon name={fromMaterialSymbol(category.icon_code)} size={20} />\n *\n * @example\n * <Icon name={fromMaterialSymbol(category.icon_code, \"folder\")} size={20} />\n *\n * @param code - A Material Symbols name, or `null`/`undefined` for a row that has none.\n * @param fallback - Slug to use when `code` is empty or unknown. Defaults to {@link MATERIAL_SYMBOL_FALLBACK}.\n * @returns A lucide slug `<Icon>` can render.\n */\nexport function fromMaterialSymbol(\n code: string | null | undefined,\n fallback: IconName = MATERIAL_SYMBOL_FALLBACK,\n): IconName {\n if (!code) return fallback;\n return materialToLucide[code.trim().toLowerCase()] ?? fallback;\n}\n"],"mappings":"AAcA,IAAa,EAAqC,uBA8CrC,EAAuD,CAChE,QAAS,YACT,gBAAiB,WACjB,IAAK,OACL,QAAS,QACT,UAAW,eACX,aAAc,eACd,UAAW,YACX,KAAM,MACN,MAAO,QACP,MAAO,SACP,KAAM,OACN,UAAW,aACX,SAAU,YACV,WAAY,MACZ,UAAW,SACX,MAAO,WACP,KAAM,iBACN,MAAO,QACP,WAAY,OACZ,kBAAmB,YACnB,MAAO,IACP,MAAO,QACP,KAAM,OACN,SAAU,UACV,aAAc,WACd,YAAa,WACb,YAAa,cACb,UAAW,mBACX,OAAQ,UACR,gBAAiB,OACjB,UAAW,wBACX,YAAa,YACb,eAAgB,MAChB,WAAY,YACZ,SAAU,WACV,KAAM,SACN,oBAAqB,WACrB,MAAO,WACP,MAAO,WACP,SAAU,QACV,eAAgB,WAChB,OAAQ,QACR,OAAQ,SACR,aAAc,eACd,MAAO,kBACP,MAAO,QACP,MAAO,SACP,MAAO,QACP,OAAQ,QACR,SAAU,SACV,SAAU,SACV,KAAM,uBACN,QAAS,mBACT,KAAM,QACN,MAAO,aACP,MAAO,QACP,KAAM,OACN,KAAM,QACN,IAAK,MACL,QAAS,eACT,OAAQ,SACR,UAAW,OACX,WAAY,SACZ,cAAe,SACf,kBAAmB,OACnB,sBAAuB,kBACvB,eAAgB,QAChB,WAAY,iBACZ,YAAa,UACb,KAAM,OACN,UAAW,YACX,MAAO,SACP,OAAQ,UACR,KAAM,OACN,IAAK,MACL,iBAAkB,cAClB,KAAM,OACN,IAAK,MACL,WAAY,QACZ,cAAe,OACf,QAAS,UACT,SAAU,WACV,WAAY,OACZ,OAAQ,OACR,aAAc,MACd,KAAM,YACN,MAAO,QACP,aAAc,aACd,aAAc,SACd,UAAW,YACX,SAAU,cACV,MAAO,UACP,aAAc,UACd,WAAY,WACZ,QAAS,QACT,OAAQ,SACR,QAAS,aACT,SAAU,QACV,OAAQ,iBACR,OAAQ,SACR,SAAU,eACV,SAAU,WACV,MAAO,UACP,OAAQ,SACR,aAAc,eACd,cAAe,gBACf,WAAY,aACZ,KAAM,yBACN,IAAK,WACL,KAAM,OACN,MAAO,QACP,WAAY,QACZ,cAAe,UACf,KAAM,aACN,MAAO,gBACP,UAAW,YACX,YAAa,cACb,GAAI,KACJ,YAAa,OACb,OAAQ,SACR,SAAU,UACV,SAAU,cACV,SAAU,QACV,WAAY,MACZ,UAAW,YACX,QAAS,iBACT,WAAY,UACZ,KAAM,OACN,KAAM,YACN,KAAM,OACV,EAuBA,SAAgB,EACZ,EACA,EAAqB,EACb,CAER,OADK,EACE,EAAiB,EAAK,KAAK,CAAC,CAAC,YAAY,IAAM,EADpC,CAEtB"}
1
+ {"version":3,"file":"material-symbols.cjs","names":[],"sources":["../../src/icons/material-symbols.ts"],"sourcesContent":["import type { IconName } from \"./generated/icon-name\";\n\n/**\n * The slug `fromMaterialSymbol` falls back to when a code is unknown.\n *\n * A neutral glyph rather than nothing: a category created in an admin with a\n * code this table has not learned yet still has to draw something, or it opens a\n * hole in the grid and the bug reads as a layout problem instead of a missing\n * mapping.\n *\n * Lucide's `circle-help` is a deprecated alias of this slug. `<Icon>` resolves\n * aliases, so both render — but the bridge emits the canonical name, since a\n * value that gets persisted should not be one lucide has already renamed.\n */\nexport const MATERIAL_SYMBOL_FALLBACK: IconName = \"circle-question-mark\";\n\n/**\n * Material Symbols code → lucide slug, for backends that store `icon_code`.\n *\n * Every Python backend we write stores a category icon as a Material Symbol\n * (`build`, `format_paint`, `electrical_services`) — the vocabulary Flutter,\n * Android and the administrative seeds already speak. The SDK speaks lucide in\n * kebab-case. The two lists do not meet, and the failure is nastier than an\n * empty screen: a handful of codes collide by accident, so roughly one row in\n * ten draws the right icon and the bug reads as \"some icons went missing\".\n *\n * **Still not the full vocabulary.** Material Symbols publishes ~6100 names and\n * almost none of them will ever appear in an `icon_code` of ours, so this grows\n * on demand, one hand-written pair at a time — a map generated by name\n * heuristics gets it badly wrong, starting with `build`, which is a wrench in\n * Material Symbols and nothing to do with construction.\n *\n * **How the codes were chosen.** Two lots, merged. The first was the trades seed\n * the bridge started as. The second is the head of Material Symbols' own\n * published popularity ranking (`fonts.google.com/metadata/icons`), which is\n * measured usage rather than a guess at which names a seed will contain — every\n * key was checked to exist in that vocabulary before landing.\n *\n * **Where the two lots disagreed**, six keys, the tie went to whichever mapping\n * keeps two distinct Material Symbols names distinct in lucide: `error` →\n * `circle-alert` because `cancel` already owns `circle-x`; `payments` →\n * `banknote` because `account_balance_wallet` already owns `wallet`;\n * `receipt_long` → `receipt-text` because `receipt` already owns `receipt`;\n * `construction` → itself because `engineering` already owns `hard-hat`; and\n * `today` → `calendar` with `event` → `calendar-days`, splitting the generic\n * calendar names from the dated one.\n *\n * Every target is checked mechanically against the slug list by\n * `material-symbols.test.ts`, so a pair pointing at a name lucide does not ship\n * — or at one it has since deprecated — fails the suite instead of reaching a\n * grid. What no test can check is whether the *chosen* icon is the right\n * metaphor, which is why pairs go in by hand.\n *\n * **Approximations, deliberate and not one-to-one** (the full list lives in\n * `docs/icons.md`):\n *\n * - `plumbing` → `shower-head`, because lucide has no pipe.\n * - `build`, `handyman` and `hardware` all land on `wrench` — Material Symbols\n * distinguishes the tools, lucide does not.\n * - `pedal_bike`, `two_wheeler` and `delivery_dining` all land on `bike`.\n * - `dentistry` → `face-slightly-smiling`, since lucide ships no tooth.\n * - `iron` → `shirt` and `cleaning_services` → `spray-can`: the activity, not\n * the implement.\n * - `roofing` → `house`, the same glyph as `home`, because lucide has no roof.\n *\n * The identity pairs are here on purpose. Their names happen to match in both\n * vocabularies, so they already render today — leaving them out would send them\n * to {@link MATERIAL_SYMBOL_FALLBACK} and make this bridge a regression for\n * exactly the codes that used to work.\n *\n * @see fromMaterialSymbol — the lookup you normally call.\n */\nexport const materialToLucide: Readonly<Record<string, IconName>> = {\n ac_unit: \"snowflake\",\n account_balance: \"landmark\",\n account_balance_wallet: \"wallet\",\n account_box: \"square-user\",\n account_circle: \"circle-user\",\n add: \"plus\",\n add_circle: \"circle-plus\",\n add_circle_outline: \"circle-plus\",\n add_shopping_cart: \"shopping-cart\",\n admin_panel_settings: \"shield-user\",\n analytics: \"chart-column\",\n apps: \"layout-grid\",\n arrow_back: \"arrow-left\",\n arrow_back_ios: \"chevron-left\",\n arrow_back_ios_new: \"chevron-left\",\n arrow_downward: \"arrow-down\",\n arrow_drop_down: \"chevron-down\",\n arrow_forward: \"arrow-right\",\n arrow_forward_ios: \"chevron-right\",\n arrow_right: \"chevron-right\",\n arrow_right_alt: \"arrow-right\",\n arrow_upward: \"arrow-up\",\n article: \"newspaper\",\n assignment: \"clipboard-list\",\n attach_file: \"paperclip\",\n attach_money: \"dollar-sign\",\n autorenew: \"refresh-cw\",\n badge: \"id-card\",\n balance: \"scale\",\n bar_chart: \"chart-column\",\n battery_full: \"battery-full\",\n bluetooth: \"bluetooth\",\n bolt: \"zap\",\n bookmark: \"bookmark\",\n brush: \"brush\",\n build: \"wrench\",\n business: \"building-2\",\n cake: \"cake\",\n calculate: \"calculator\",\n calendar_month: \"calendar\",\n calendar_today: \"calendar\",\n call: \"phone\",\n campaign: \"megaphone\",\n cancel: \"circle-x\",\n car_repair: \"car\",\n carpenter: \"hammer\",\n category: \"shapes\",\n chair: \"armchair\",\n chat: \"message-circle\",\n check: \"check\",\n check_box: \"square-check\",\n check_box_outline_blank: \"square\",\n check_circle: \"circle-check\",\n check_circle_outline: \"circle-check\",\n chevron_left: \"chevron-left\",\n chevron_right: \"chevron-right\",\n child_care: \"baby\",\n circle: \"circle\",\n cleaning_services: \"spray-can\",\n clear: \"x\",\n close: \"x\",\n cloud: \"cloud\",\n code: \"code\",\n computer: \"monitor\",\n construction: \"construction\",\n content_copy: \"copy\",\n content_cut: \"scissors\",\n credit_card: \"credit-card\",\n dark_mode: \"moon\",\n dashboard: \"layout-dashboard\",\n date_range: \"calendar-range\",\n delete: \"trash-2\",\n delete_forever: \"trash-2\",\n delete_outline: \"trash-2\",\n delivery_dining: \"bike\",\n dentistry: \"face-slightly-smiling\",\n description: \"file-text\",\n directions_car: \"car\",\n done: \"check\",\n done_all: \"check-check\",\n door_front: \"door-open\",\n download: \"download\",\n east: \"arrow-right\",\n edit: \"pencil\",\n edit_note: \"pencil-line\",\n electrical_services: \"plug-zap\",\n email: \"mail\",\n emoji_events: \"trophy\",\n engineering: \"hard-hat\",\n error: \"circle-alert\",\n error_outline: \"circle-alert\",\n event: \"calendar-days\",\n expand_less: \"chevron-up\",\n expand_more: \"chevron-down\",\n explore: \"compass\",\n face: \"face-slightly-smiling\",\n fact_check: \"clipboard-check\",\n favorite: \"heart\",\n favorite_border: \"heart\",\n file_download: \"download\",\n file_upload: \"upload\",\n filter_alt: \"funnel\",\n filter_list: \"funnel\",\n fingerprint: \"fingerprint-pattern\",\n fitness_center: \"dumbbell\",\n flight: \"plane\",\n folder: \"folder\",\n format_list_bulleted: \"list\",\n format_paint: \"paint-roller\",\n forum: \"messages-square\",\n gavel: \"gavel\",\n grade: \"star\",\n grass: \"sprout\",\n grid_view: \"layout-grid\",\n group: \"users\",\n groups: \"users\",\n handyman: \"wrench\",\n hardware: \"wrench\",\n help: \"circle-question-mark\",\n help_outline: \"circle-question-mark\",\n highlight_off: \"circle-x\",\n history: \"rotate-ccw-clock\",\n home: \"house\",\n hotel: \"bed-double\",\n image: \"image\",\n info: \"info\",\n insights: \"chart-line\",\n inventory: \"package\",\n inventory_2: \"package\",\n iron: \"shirt\",\n key: \"key\",\n kitchen: \"refrigerator\",\n language: \"globe\",\n laptop: \"laptop\",\n light_mode: \"sun\",\n lightbulb: \"lightbulb\",\n link: \"link\",\n list: \"list\",\n list_alt: \"list\",\n local_bar: \"wine\",\n local_cafe: \"coffee\",\n local_florist: \"flower\",\n local_gas_station: \"fuel\",\n local_laundry_service: \"washing-machine\",\n local_offer: \"tag\",\n local_shipping: \"truck\",\n local_taxi: \"car-taxi-front\",\n location_on: \"map-pin\",\n lock: \"lock\",\n lock_open: \"lock-open\",\n login: \"log-in\",\n logout: \"log-out\",\n mail: \"mail\",\n mail_outline: \"mail\",\n manage_accounts: \"user-cog\",\n map: \"map\",\n medical_services: \"stethoscope\",\n menu: \"menu\",\n menu_book: \"book-open\",\n mic: \"mic\",\n mode_edit: \"pencil\",\n monetization_on: \"circle-dollar-sign\",\n more_horiz: \"ellipsis\",\n more_vert: \"ellipsis-vertical\",\n music_note: \"music\",\n navigate_next: \"chevron-right\",\n note_add: \"file-plus\",\n notifications: \"bell\",\n notifications_active: \"bell-ring\",\n open_in_new: \"external-link\",\n paid: \"circle-dollar-sign\",\n palette: \"palette\",\n pause: \"pause\",\n payments: \"banknote\",\n pedal_bike: \"bike\",\n people: \"users\",\n perm_identity: \"user\",\n person: \"user\",\n person_add: \"user-plus\",\n person_outline: \"user\",\n pest_control: \"bug\",\n pets: \"paw-print\",\n phone: \"phone\",\n phone_iphone: \"smartphone\",\n photo_camera: \"camera\",\n picture_as_pdf: \"file-text\",\n pie_chart: \"chart-pie\",\n place: \"map-pin\",\n play_arrow: \"play\",\n play_circle: \"circle-play\",\n play_circle_filled: \"circle-play\",\n plumbing: \"shower-head\",\n power_settings_new: \"power\",\n print: \"printer\",\n public: \"globe\",\n qr_code_scanner: \"scan-line\",\n question_answer: \"messages-square\",\n radio_button_checked: \"circle-dot\",\n radio_button_unchecked: \"circle\",\n receipt: \"receipt\",\n receipt_long: \"receipt-text\",\n refresh: \"refresh-cw\",\n remove: \"minus\",\n remove_circle_outline: \"circle-minus\",\n reorder: \"list\",\n report_problem: \"triangle-alert\",\n restart_alt: \"rotate-ccw\",\n restaurant: \"utensils\",\n roofing: \"house\",\n room: \"map-pin\",\n router: \"router\",\n save: \"save\",\n savings: \"piggy-bank\",\n schedule: \"clock\",\n school: \"graduation-cap\",\n search: \"search\",\n security: \"shield-check\",\n send: \"send\",\n settings: \"settings\",\n share: \"share-2\",\n shield: \"shield\",\n shopping_bag: \"shopping-bag\",\n shopping_cart: \"shopping-cart\",\n smartphone: \"smartphone\",\n soap: \"soap-dispenser-droplet\",\n sort: \"arrow-down-up\",\n spa: \"flower-2\",\n star: \"star\",\n star_border: \"star\",\n star_rate: \"star\",\n store: \"store\",\n storefront: \"store\",\n support_agent: \"headset\",\n sync: \"refresh-cw\",\n task_alt: \"circle-check\",\n timer: \"timer\",\n today: \"calendar\",\n toggle_on: \"toggle-right\",\n translate: \"languages\",\n trending_up: \"trending-up\",\n tune: \"sliders-horizontal\",\n tv: \"tv\",\n two_wheeler: \"bike\",\n upload: \"upload\",\n upload_file: \"upload\",\n vaccines: \"syringe\",\n verified: \"badge-check\",\n verified_user: \"shield-check\",\n videocam: \"video\",\n view_list: \"list\",\n visibility: \"eye\",\n visibility_off: \"eye-off\",\n vpn_key: \"key-round\",\n warehouse: \"warehouse\",\n warning: \"triangle-alert\",\n warning_amber: \"triangle-alert\",\n watch_later: \"clock\",\n water_drop: \"droplet\",\n wifi: \"wifi\",\n work: \"briefcase\",\n yard: \"trees\",\n};\n\n/**\n * Translate a Material Symbols code into a lucide slug, always returning one.\n *\n * Never returns `undefined`: an unknown code resolves to `fallback`, so a row\n * whose `icon_code` this table has not learned yet still renders. The input is\n * trimmed and lower-cased before lookup, because a seed written by hand is the\n * kind of source that carries stray whitespace and the odd capital.\n *\n * Nothing else in `/icons` imports this module, so an app that does not store\n * Material Symbols never pays for the table.\n *\n * @example\n * <Icon name={fromMaterialSymbol(category.icon_code)} size={20} />\n *\n * @example\n * <Icon name={fromMaterialSymbol(category.icon_code, \"folder\")} size={20} />\n *\n * @param code - A Material Symbols name, or `null`/`undefined` for a row that has none.\n * @param fallback - Slug to use when `code` is empty or unknown. Defaults to {@link MATERIAL_SYMBOL_FALLBACK}.\n * @returns A lucide slug `<Icon>` can render.\n */\nexport function fromMaterialSymbol(\n code: string | null | undefined,\n fallback: IconName = MATERIAL_SYMBOL_FALLBACK,\n): IconName {\n if (!code) return fallback;\n return materialToLucide[code.trim().toLowerCase()] ?? fallback;\n}\n"],"mappings":"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"}
@@ -2,70 +2,149 @@
2
2
  var e = "circle-question-mark", t = {
3
3
  ac_unit: "snowflake",
4
4
  account_balance: "landmark",
5
+ account_balance_wallet: "wallet",
6
+ account_box: "square-user",
7
+ account_circle: "circle-user",
5
8
  add: "plus",
9
+ add_circle: "circle-plus",
10
+ add_circle_outline: "circle-plus",
11
+ add_shopping_cart: "shopping-cart",
12
+ admin_panel_settings: "shield-user",
13
+ analytics: "chart-column",
14
+ apps: "layout-grid",
15
+ arrow_back: "arrow-left",
16
+ arrow_back_ios: "chevron-left",
17
+ arrow_back_ios_new: "chevron-left",
18
+ arrow_downward: "arrow-down",
19
+ arrow_drop_down: "chevron-down",
20
+ arrow_forward: "arrow-right",
21
+ arrow_forward_ios: "chevron-right",
22
+ arrow_right: "chevron-right",
23
+ arrow_right_alt: "arrow-right",
24
+ arrow_upward: "arrow-up",
25
+ article: "newspaper",
26
+ assignment: "clipboard-list",
27
+ attach_file: "paperclip",
28
+ attach_money: "dollar-sign",
29
+ autorenew: "refresh-cw",
30
+ badge: "id-card",
6
31
  balance: "scale",
7
32
  bar_chart: "chart-column",
8
33
  battery_full: "battery-full",
9
34
  bluetooth: "bluetooth",
10
35
  bolt: "zap",
36
+ bookmark: "bookmark",
11
37
  brush: "brush",
12
38
  build: "wrench",
39
+ business: "building-2",
13
40
  cake: "cake",
14
41
  calculate: "calculator",
42
+ calendar_month: "calendar",
43
+ calendar_today: "calendar",
44
+ call: "phone",
15
45
  campaign: "megaphone",
46
+ cancel: "circle-x",
16
47
  car_repair: "car",
17
48
  carpenter: "hammer",
49
+ category: "shapes",
18
50
  chair: "armchair",
19
51
  chat: "message-circle",
20
52
  check: "check",
53
+ check_box: "square-check",
54
+ check_box_outline_blank: "square",
55
+ check_circle: "circle-check",
56
+ check_circle_outline: "circle-check",
57
+ chevron_left: "chevron-left",
58
+ chevron_right: "chevron-right",
21
59
  child_care: "baby",
60
+ circle: "circle",
22
61
  cleaning_services: "spray-can",
62
+ clear: "x",
23
63
  close: "x",
24
64
  cloud: "cloud",
25
65
  code: "code",
26
66
  computer: "monitor",
27
- construction: "hard-hat",
67
+ construction: "construction",
68
+ content_copy: "copy",
28
69
  content_cut: "scissors",
29
70
  credit_card: "credit-card",
71
+ dark_mode: "moon",
30
72
  dashboard: "layout-dashboard",
73
+ date_range: "calendar-range",
31
74
  delete: "trash-2",
75
+ delete_forever: "trash-2",
76
+ delete_outline: "trash-2",
32
77
  delivery_dining: "bike",
33
78
  dentistry: "face-slightly-smiling",
34
79
  description: "file-text",
35
80
  directions_car: "car",
81
+ done: "check",
82
+ done_all: "check-check",
36
83
  door_front: "door-open",
37
84
  download: "download",
85
+ east: "arrow-right",
38
86
  edit: "pencil",
87
+ edit_note: "pencil-line",
39
88
  electrical_services: "plug-zap",
40
- error: "circle-x",
41
- event: "calendar",
89
+ email: "mail",
90
+ emoji_events: "trophy",
91
+ engineering: "hard-hat",
92
+ error: "circle-alert",
93
+ error_outline: "circle-alert",
94
+ event: "calendar-days",
95
+ expand_less: "chevron-up",
96
+ expand_more: "chevron-down",
97
+ explore: "compass",
98
+ face: "face-slightly-smiling",
99
+ fact_check: "clipboard-check",
42
100
  favorite: "heart",
101
+ favorite_border: "heart",
102
+ file_download: "download",
103
+ file_upload: "upload",
104
+ filter_alt: "funnel",
105
+ filter_list: "funnel",
106
+ fingerprint: "fingerprint-pattern",
43
107
  fitness_center: "dumbbell",
44
108
  flight: "plane",
45
109
  folder: "folder",
110
+ format_list_bulleted: "list",
46
111
  format_paint: "paint-roller",
47
112
  forum: "messages-square",
48
113
  gavel: "gavel",
114
+ grade: "star",
49
115
  grass: "sprout",
116
+ grid_view: "layout-grid",
50
117
  group: "users",
51
118
  groups: "users",
52
119
  handyman: "wrench",
53
120
  hardware: "wrench",
54
121
  help: "circle-question-mark",
122
+ help_outline: "circle-question-mark",
123
+ highlight_off: "circle-x",
55
124
  history: "rotate-ccw-clock",
56
125
  home: "house",
57
126
  hotel: "bed-double",
58
127
  image: "image",
59
128
  info: "info",
129
+ insights: "chart-line",
130
+ inventory: "package",
131
+ inventory_2: "package",
60
132
  iron: "shirt",
61
133
  key: "key",
62
134
  kitchen: "refrigerator",
135
+ language: "globe",
63
136
  laptop: "laptop",
137
+ light_mode: "sun",
138
+ lightbulb: "lightbulb",
139
+ link: "link",
140
+ list: "list",
141
+ list_alt: "list",
64
142
  local_bar: "wine",
65
143
  local_cafe: "coffee",
66
144
  local_florist: "flower",
67
145
  local_gas_station: "fuel",
68
146
  local_laundry_service: "washing-machine",
147
+ local_offer: "tag",
69
148
  local_shipping: "truck",
70
149
  local_taxi: "car-taxi-front",
71
150
  location_on: "map-pin",
@@ -74,33 +153,71 @@ var e = "circle-question-mark", t = {
74
153
  login: "log-in",
75
154
  logout: "log-out",
76
155
  mail: "mail",
156
+ mail_outline: "mail",
157
+ manage_accounts: "user-cog",
77
158
  map: "map",
78
159
  medical_services: "stethoscope",
79
160
  menu: "menu",
161
+ menu_book: "book-open",
80
162
  mic: "mic",
163
+ mode_edit: "pencil",
164
+ monetization_on: "circle-dollar-sign",
165
+ more_horiz: "ellipsis",
166
+ more_vert: "ellipsis-vertical",
81
167
  music_note: "music",
168
+ navigate_next: "chevron-right",
169
+ note_add: "file-plus",
82
170
  notifications: "bell",
171
+ notifications_active: "bell-ring",
172
+ open_in_new: "external-link",
173
+ paid: "circle-dollar-sign",
83
174
  palette: "palette",
175
+ pause: "pause",
84
176
  payments: "banknote",
85
177
  pedal_bike: "bike",
178
+ people: "users",
179
+ perm_identity: "user",
86
180
  person: "user",
181
+ person_add: "user-plus",
182
+ person_outline: "user",
87
183
  pest_control: "bug",
88
184
  pets: "paw-print",
89
185
  phone: "phone",
90
186
  phone_iphone: "smartphone",
91
187
  photo_camera: "camera",
188
+ picture_as_pdf: "file-text",
92
189
  pie_chart: "chart-pie",
190
+ place: "map-pin",
191
+ play_arrow: "play",
192
+ play_circle: "circle-play",
193
+ play_circle_filled: "circle-play",
93
194
  plumbing: "shower-head",
195
+ power_settings_new: "power",
94
196
  print: "printer",
95
- receipt_long: "receipt",
197
+ public: "globe",
198
+ qr_code_scanner: "scan-line",
199
+ question_answer: "messages-square",
200
+ radio_button_checked: "circle-dot",
201
+ radio_button_unchecked: "circle",
202
+ receipt: "receipt",
203
+ receipt_long: "receipt-text",
204
+ refresh: "refresh-cw",
205
+ remove: "minus",
206
+ remove_circle_outline: "circle-minus",
207
+ reorder: "list",
208
+ report_problem: "triangle-alert",
209
+ restart_alt: "rotate-ccw",
96
210
  restaurant: "utensils",
97
211
  roofing: "house",
212
+ room: "map-pin",
98
213
  router: "router",
214
+ save: "save",
99
215
  savings: "piggy-bank",
100
216
  schedule: "clock",
101
217
  school: "graduation-cap",
102
218
  search: "search",
103
219
  security: "shield-check",
220
+ send: "send",
104
221
  settings: "settings",
105
222
  share: "share-2",
106
223
  shield: "shield",
@@ -108,24 +225,38 @@ var e = "circle-question-mark", t = {
108
225
  shopping_cart: "shopping-cart",
109
226
  smartphone: "smartphone",
110
227
  soap: "soap-dispenser-droplet",
228
+ sort: "arrow-down-up",
111
229
  spa: "flower-2",
112
230
  star: "star",
231
+ star_border: "star",
232
+ star_rate: "star",
113
233
  store: "store",
114
234
  storefront: "store",
115
235
  support_agent: "headset",
116
236
  sync: "refresh-cw",
117
- today: "calendar-days",
237
+ task_alt: "circle-check",
238
+ timer: "timer",
239
+ today: "calendar",
240
+ toggle_on: "toggle-right",
118
241
  translate: "languages",
119
242
  trending_up: "trending-up",
243
+ tune: "sliders-horizontal",
120
244
  tv: "tv",
121
245
  two_wheeler: "bike",
122
246
  upload: "upload",
247
+ upload_file: "upload",
123
248
  vaccines: "syringe",
124
249
  verified: "badge-check",
250
+ verified_user: "shield-check",
125
251
  videocam: "video",
252
+ view_list: "list",
126
253
  visibility: "eye",
254
+ visibility_off: "eye-off",
255
+ vpn_key: "key-round",
127
256
  warehouse: "warehouse",
128
257
  warning: "triangle-alert",
258
+ warning_amber: "triangle-alert",
259
+ watch_later: "clock",
129
260
  water_drop: "droplet",
130
261
  wifi: "wifi",
131
262
  work: "briefcase",
@@ -1 +1 @@
1
- {"version":3,"file":"material-symbols.js","names":[],"sources":["../../src/icons/material-symbols.ts"],"sourcesContent":["import type { IconName } from \"./generated/icon-name\";\n\n/**\n * The slug `fromMaterialSymbol` falls back to when a code is unknown.\n *\n * A neutral glyph rather than nothing: a category created in an admin with a\n * code this table has not learned yet still has to draw something, or it opens a\n * hole in the grid and the bug reads as a layout problem instead of a missing\n * mapping.\n *\n * Lucide's `circle-help` is a deprecated alias of this slug. `<Icon>` resolves\n * aliases, so both render — but the bridge emits the canonical name, since a\n * value that gets persisted should not be one lucide has already renamed.\n */\nexport const MATERIAL_SYMBOL_FALLBACK: IconName = \"circle-question-mark\";\n\n/**\n * Material Symbols code → lucide slug, for backends that store `icon_code`.\n *\n * Every Python backend we write stores a category icon as a Material Symbol\n * (`build`, `format_paint`, `electrical_services`) — the vocabulary Flutter,\n * Android and the administrative seeds already speak. The SDK speaks lucide in\n * kebab-case. The two lists do not meet, and the failure is nastier than an\n * empty screen: a handful of codes collide by accident, so roughly one row in\n * ten draws the right icon and the bug reads as \"some icons went missing\".\n *\n * **Still not the full vocabulary.** Material Symbols ships ~3600 names and\n * almost none of them will ever appear in an `icon_code` of ours, so this grows\n * on demand, one hand-written pair at a time — a map generated by name\n * heuristics gets it badly wrong, starting with `build`, which is a wrench in\n * Material Symbols and nothing to do with construction. What is here covers the\n * trades lot it started as plus the vocabulary an administrative panel actually\n * uses: navigation, money, dates, media, and the service categories a seed\n * tends to carry.\n *\n * Every target is checked mechanically against the slug list by\n * `material-symbols.test.ts`, so a pair pointing at a name lucide does not ship\n * — or at one it has since deprecated — fails the suite instead of reaching a\n * grid. What no test can check is whether the *chosen* icon is the right\n * metaphor, which is why pairs go in by hand.\n *\n * **Approximations, deliberate and not one-to-one** (the full list lives in\n * `docs/icons.md`):\n *\n * - `plumbing` → `shower-head`, because lucide has no pipe.\n * - `build`, `handyman` and `hardware` all land on `wrench` — Material Symbols\n * distinguishes the tools, lucide does not.\n * - `pedal_bike`, `two_wheeler` and `delivery_dining` all land on `bike`.\n * - `dentistry` → `face-slightly-smiling`, since lucide ships no tooth.\n * - `iron` → `shirt` and `cleaning_services` → `spray-can`: the activity, not\n * the implement.\n * - `roofing` → `house`, the same glyph as `home`, because lucide has no roof.\n *\n * The identity pairs are here on purpose. Their names happen to match in both\n * vocabularies, so they already render today — leaving them out would send them\n * to {@link MATERIAL_SYMBOL_FALLBACK} and make this bridge a regression for\n * exactly the codes that used to work.\n *\n * @see fromMaterialSymbol — the lookup you normally call.\n */\nexport const materialToLucide: Readonly<Record<string, IconName>> = {\n ac_unit: \"snowflake\",\n account_balance: \"landmark\",\n add: \"plus\",\n balance: \"scale\",\n bar_chart: \"chart-column\",\n battery_full: \"battery-full\",\n bluetooth: \"bluetooth\",\n bolt: \"zap\",\n brush: \"brush\",\n build: \"wrench\",\n cake: \"cake\",\n calculate: \"calculator\",\n campaign: \"megaphone\",\n car_repair: \"car\",\n carpenter: \"hammer\",\n chair: \"armchair\",\n chat: \"message-circle\",\n check: \"check\",\n child_care: \"baby\",\n cleaning_services: \"spray-can\",\n close: \"x\",\n cloud: \"cloud\",\n code: \"code\",\n computer: \"monitor\",\n construction: \"hard-hat\",\n content_cut: \"scissors\",\n credit_card: \"credit-card\",\n dashboard: \"layout-dashboard\",\n delete: \"trash-2\",\n delivery_dining: \"bike\",\n dentistry: \"face-slightly-smiling\",\n description: \"file-text\",\n directions_car: \"car\",\n door_front: \"door-open\",\n download: \"download\",\n edit: \"pencil\",\n electrical_services: \"plug-zap\",\n error: \"circle-x\",\n event: \"calendar\",\n favorite: \"heart\",\n fitness_center: \"dumbbell\",\n flight: \"plane\",\n folder: \"folder\",\n format_paint: \"paint-roller\",\n forum: \"messages-square\",\n gavel: \"gavel\",\n grass: \"sprout\",\n group: \"users\",\n groups: \"users\",\n handyman: \"wrench\",\n hardware: \"wrench\",\n help: \"circle-question-mark\",\n history: \"rotate-ccw-clock\",\n home: \"house\",\n hotel: \"bed-double\",\n image: \"image\",\n info: \"info\",\n iron: \"shirt\",\n key: \"key\",\n kitchen: \"refrigerator\",\n laptop: \"laptop\",\n local_bar: \"wine\",\n local_cafe: \"coffee\",\n local_florist: \"flower\",\n local_gas_station: \"fuel\",\n local_laundry_service: \"washing-machine\",\n local_shipping: \"truck\",\n local_taxi: \"car-taxi-front\",\n location_on: \"map-pin\",\n lock: \"lock\",\n lock_open: \"lock-open\",\n login: \"log-in\",\n logout: \"log-out\",\n mail: \"mail\",\n map: \"map\",\n medical_services: \"stethoscope\",\n menu: \"menu\",\n mic: \"mic\",\n music_note: \"music\",\n notifications: \"bell\",\n palette: \"palette\",\n payments: \"banknote\",\n pedal_bike: \"bike\",\n person: \"user\",\n pest_control: \"bug\",\n pets: \"paw-print\",\n phone: \"phone\",\n phone_iphone: \"smartphone\",\n photo_camera: \"camera\",\n pie_chart: \"chart-pie\",\n plumbing: \"shower-head\",\n print: \"printer\",\n receipt_long: \"receipt\",\n restaurant: \"utensils\",\n roofing: \"house\",\n router: \"router\",\n savings: \"piggy-bank\",\n schedule: \"clock\",\n school: \"graduation-cap\",\n search: \"search\",\n security: \"shield-check\",\n settings: \"settings\",\n share: \"share-2\",\n shield: \"shield\",\n shopping_bag: \"shopping-bag\",\n shopping_cart: \"shopping-cart\",\n smartphone: \"smartphone\",\n soap: \"soap-dispenser-droplet\",\n spa: \"flower-2\",\n star: \"star\",\n store: \"store\",\n storefront: \"store\",\n support_agent: \"headset\",\n sync: \"refresh-cw\",\n today: \"calendar-days\",\n translate: \"languages\",\n trending_up: \"trending-up\",\n tv: \"tv\",\n two_wheeler: \"bike\",\n upload: \"upload\",\n vaccines: \"syringe\",\n verified: \"badge-check\",\n videocam: \"video\",\n visibility: \"eye\",\n warehouse: \"warehouse\",\n warning: \"triangle-alert\",\n water_drop: \"droplet\",\n wifi: \"wifi\",\n work: \"briefcase\",\n yard: \"trees\",\n};\n\n/**\n * Translate a Material Symbols code into a lucide slug, always returning one.\n *\n * Never returns `undefined`: an unknown code resolves to `fallback`, so a row\n * whose `icon_code` this table has not learned yet still renders. The input is\n * trimmed and lower-cased before lookup, because a seed written by hand is the\n * kind of source that carries stray whitespace and the odd capital.\n *\n * Nothing else in `/icons` imports this module, so an app that does not store\n * Material Symbols never pays for the table.\n *\n * @example\n * <Icon name={fromMaterialSymbol(category.icon_code)} size={20} />\n *\n * @example\n * <Icon name={fromMaterialSymbol(category.icon_code, \"folder\")} size={20} />\n *\n * @param code - A Material Symbols name, or `null`/`undefined` for a row that has none.\n * @param fallback - Slug to use when `code` is empty or unknown. Defaults to {@link MATERIAL_SYMBOL_FALLBACK}.\n * @returns A lucide slug `<Icon>` can render.\n */\nexport function fromMaterialSymbol(\n code: string | null | undefined,\n fallback: IconName = MATERIAL_SYMBOL_FALLBACK,\n): IconName {\n if (!code) return fallback;\n return materialToLucide[code.trim().toLowerCase()] ?? fallback;\n}\n"],"mappings":";AAcA,IAAa,IAAqC,wBA8CrC,IAAuD;CAChE,SAAS;CACT,iBAAiB;CACjB,KAAK;CACL,SAAS;CACT,WAAW;CACX,cAAc;CACd,WAAW;CACX,MAAM;CACN,OAAO;CACP,OAAO;CACP,MAAM;CACN,WAAW;CACX,UAAU;CACV,YAAY;CACZ,WAAW;CACX,OAAO;CACP,MAAM;CACN,OAAO;CACP,YAAY;CACZ,mBAAmB;CACnB,OAAO;CACP,OAAO;CACP,MAAM;CACN,UAAU;CACV,cAAc;CACd,aAAa;CACb,aAAa;CACb,WAAW;CACX,QAAQ;CACR,iBAAiB;CACjB,WAAW;CACX,aAAa;CACb,gBAAgB;CAChB,YAAY;CACZ,UAAU;CACV,MAAM;CACN,qBAAqB;CACrB,OAAO;CACP,OAAO;CACP,UAAU;CACV,gBAAgB;CAChB,QAAQ;CACR,QAAQ;CACR,cAAc;CACd,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACP,QAAQ;CACR,UAAU;CACV,UAAU;CACV,MAAM;CACN,SAAS;CACT,MAAM;CACN,OAAO;CACP,OAAO;CACP,MAAM;CACN,MAAM;CACN,KAAK;CACL,SAAS;CACT,QAAQ;CACR,WAAW;CACX,YAAY;CACZ,eAAe;CACf,mBAAmB;CACnB,uBAAuB;CACvB,gBAAgB;CAChB,YAAY;CACZ,aAAa;CACb,MAAM;CACN,WAAW;CACX,OAAO;CACP,QAAQ;CACR,MAAM;CACN,KAAK;CACL,kBAAkB;CAClB,MAAM;CACN,KAAK;CACL,YAAY;CACZ,eAAe;CACf,SAAS;CACT,UAAU;CACV,YAAY;CACZ,QAAQ;CACR,cAAc;CACd,MAAM;CACN,OAAO;CACP,cAAc;CACd,cAAc;CACd,WAAW;CACX,UAAU;CACV,OAAO;CACP,cAAc;CACd,YAAY;CACZ,SAAS;CACT,QAAQ;CACR,SAAS;CACT,UAAU;CACV,QAAQ;CACR,QAAQ;CACR,UAAU;CACV,UAAU;CACV,OAAO;CACP,QAAQ;CACR,cAAc;CACd,eAAe;CACf,YAAY;CACZ,MAAM;CACN,KAAK;CACL,MAAM;CACN,OAAO;CACP,YAAY;CACZ,eAAe;CACf,MAAM;CACN,OAAO;CACP,WAAW;CACX,aAAa;CACb,IAAI;CACJ,aAAa;CACb,QAAQ;CACR,UAAU;CACV,UAAU;CACV,UAAU;CACV,YAAY;CACZ,WAAW;CACX,SAAS;CACT,YAAY;CACZ,MAAM;CACN,MAAM;CACN,MAAM;AACV;AAuBA,SAAgB,EACZ,GACA,IAAqB,GACb;CAER,OADK,IACE,EAAiB,EAAK,KAAK,CAAC,CAAC,YAAY,MAAM,IADpC;AAEtB"}
1
+ {"version":3,"file":"material-symbols.js","names":[],"sources":["../../src/icons/material-symbols.ts"],"sourcesContent":["import type { IconName } from \"./generated/icon-name\";\n\n/**\n * The slug `fromMaterialSymbol` falls back to when a code is unknown.\n *\n * A neutral glyph rather than nothing: a category created in an admin with a\n * code this table has not learned yet still has to draw something, or it opens a\n * hole in the grid and the bug reads as a layout problem instead of a missing\n * mapping.\n *\n * Lucide's `circle-help` is a deprecated alias of this slug. `<Icon>` resolves\n * aliases, so both render — but the bridge emits the canonical name, since a\n * value that gets persisted should not be one lucide has already renamed.\n */\nexport const MATERIAL_SYMBOL_FALLBACK: IconName = \"circle-question-mark\";\n\n/**\n * Material Symbols code → lucide slug, for backends that store `icon_code`.\n *\n * Every Python backend we write stores a category icon as a Material Symbol\n * (`build`, `format_paint`, `electrical_services`) — the vocabulary Flutter,\n * Android and the administrative seeds already speak. The SDK speaks lucide in\n * kebab-case. The two lists do not meet, and the failure is nastier than an\n * empty screen: a handful of codes collide by accident, so roughly one row in\n * ten draws the right icon and the bug reads as \"some icons went missing\".\n *\n * **Still not the full vocabulary.** Material Symbols publishes ~6100 names and\n * almost none of them will ever appear in an `icon_code` of ours, so this grows\n * on demand, one hand-written pair at a time — a map generated by name\n * heuristics gets it badly wrong, starting with `build`, which is a wrench in\n * Material Symbols and nothing to do with construction.\n *\n * **How the codes were chosen.** Two lots, merged. The first was the trades seed\n * the bridge started as. The second is the head of Material Symbols' own\n * published popularity ranking (`fonts.google.com/metadata/icons`), which is\n * measured usage rather than a guess at which names a seed will contain — every\n * key was checked to exist in that vocabulary before landing.\n *\n * **Where the two lots disagreed**, six keys, the tie went to whichever mapping\n * keeps two distinct Material Symbols names distinct in lucide: `error` →\n * `circle-alert` because `cancel` already owns `circle-x`; `payments` →\n * `banknote` because `account_balance_wallet` already owns `wallet`;\n * `receipt_long` → `receipt-text` because `receipt` already owns `receipt`;\n * `construction` → itself because `engineering` already owns `hard-hat`; and\n * `today` → `calendar` with `event` → `calendar-days`, splitting the generic\n * calendar names from the dated one.\n *\n * Every target is checked mechanically against the slug list by\n * `material-symbols.test.ts`, so a pair pointing at a name lucide does not ship\n * — or at one it has since deprecated — fails the suite instead of reaching a\n * grid. What no test can check is whether the *chosen* icon is the right\n * metaphor, which is why pairs go in by hand.\n *\n * **Approximations, deliberate and not one-to-one** (the full list lives in\n * `docs/icons.md`):\n *\n * - `plumbing` → `shower-head`, because lucide has no pipe.\n * - `build`, `handyman` and `hardware` all land on `wrench` — Material Symbols\n * distinguishes the tools, lucide does not.\n * - `pedal_bike`, `two_wheeler` and `delivery_dining` all land on `bike`.\n * - `dentistry` → `face-slightly-smiling`, since lucide ships no tooth.\n * - `iron` → `shirt` and `cleaning_services` → `spray-can`: the activity, not\n * the implement.\n * - `roofing` → `house`, the same glyph as `home`, because lucide has no roof.\n *\n * The identity pairs are here on purpose. Their names happen to match in both\n * vocabularies, so they already render today — leaving them out would send them\n * to {@link MATERIAL_SYMBOL_FALLBACK} and make this bridge a regression for\n * exactly the codes that used to work.\n *\n * @see fromMaterialSymbol — the lookup you normally call.\n */\nexport const materialToLucide: Readonly<Record<string, IconName>> = {\n ac_unit: \"snowflake\",\n account_balance: \"landmark\",\n account_balance_wallet: \"wallet\",\n account_box: \"square-user\",\n account_circle: \"circle-user\",\n add: \"plus\",\n add_circle: \"circle-plus\",\n add_circle_outline: \"circle-plus\",\n add_shopping_cart: \"shopping-cart\",\n admin_panel_settings: \"shield-user\",\n analytics: \"chart-column\",\n apps: \"layout-grid\",\n arrow_back: \"arrow-left\",\n arrow_back_ios: \"chevron-left\",\n arrow_back_ios_new: \"chevron-left\",\n arrow_downward: \"arrow-down\",\n arrow_drop_down: \"chevron-down\",\n arrow_forward: \"arrow-right\",\n arrow_forward_ios: \"chevron-right\",\n arrow_right: \"chevron-right\",\n arrow_right_alt: \"arrow-right\",\n arrow_upward: \"arrow-up\",\n article: \"newspaper\",\n assignment: \"clipboard-list\",\n attach_file: \"paperclip\",\n attach_money: \"dollar-sign\",\n autorenew: \"refresh-cw\",\n badge: \"id-card\",\n balance: \"scale\",\n bar_chart: \"chart-column\",\n battery_full: \"battery-full\",\n bluetooth: \"bluetooth\",\n bolt: \"zap\",\n bookmark: \"bookmark\",\n brush: \"brush\",\n build: \"wrench\",\n business: \"building-2\",\n cake: \"cake\",\n calculate: \"calculator\",\n calendar_month: \"calendar\",\n calendar_today: \"calendar\",\n call: \"phone\",\n campaign: \"megaphone\",\n cancel: \"circle-x\",\n car_repair: \"car\",\n carpenter: \"hammer\",\n category: \"shapes\",\n chair: \"armchair\",\n chat: \"message-circle\",\n check: \"check\",\n check_box: \"square-check\",\n check_box_outline_blank: \"square\",\n check_circle: \"circle-check\",\n check_circle_outline: \"circle-check\",\n chevron_left: \"chevron-left\",\n chevron_right: \"chevron-right\",\n child_care: \"baby\",\n circle: \"circle\",\n cleaning_services: \"spray-can\",\n clear: \"x\",\n close: \"x\",\n cloud: \"cloud\",\n code: \"code\",\n computer: \"monitor\",\n construction: \"construction\",\n content_copy: \"copy\",\n content_cut: \"scissors\",\n credit_card: \"credit-card\",\n dark_mode: \"moon\",\n dashboard: \"layout-dashboard\",\n date_range: \"calendar-range\",\n delete: \"trash-2\",\n delete_forever: \"trash-2\",\n delete_outline: \"trash-2\",\n delivery_dining: \"bike\",\n dentistry: \"face-slightly-smiling\",\n description: \"file-text\",\n directions_car: \"car\",\n done: \"check\",\n done_all: \"check-check\",\n door_front: \"door-open\",\n download: \"download\",\n east: \"arrow-right\",\n edit: \"pencil\",\n edit_note: \"pencil-line\",\n electrical_services: \"plug-zap\",\n email: \"mail\",\n emoji_events: \"trophy\",\n engineering: \"hard-hat\",\n error: \"circle-alert\",\n error_outline: \"circle-alert\",\n event: \"calendar-days\",\n expand_less: \"chevron-up\",\n expand_more: \"chevron-down\",\n explore: \"compass\",\n face: \"face-slightly-smiling\",\n fact_check: \"clipboard-check\",\n favorite: \"heart\",\n favorite_border: \"heart\",\n file_download: \"download\",\n file_upload: \"upload\",\n filter_alt: \"funnel\",\n filter_list: \"funnel\",\n fingerprint: \"fingerprint-pattern\",\n fitness_center: \"dumbbell\",\n flight: \"plane\",\n folder: \"folder\",\n format_list_bulleted: \"list\",\n format_paint: \"paint-roller\",\n forum: \"messages-square\",\n gavel: \"gavel\",\n grade: \"star\",\n grass: \"sprout\",\n grid_view: \"layout-grid\",\n group: \"users\",\n groups: \"users\",\n handyman: \"wrench\",\n hardware: \"wrench\",\n help: \"circle-question-mark\",\n help_outline: \"circle-question-mark\",\n highlight_off: \"circle-x\",\n history: \"rotate-ccw-clock\",\n home: \"house\",\n hotel: \"bed-double\",\n image: \"image\",\n info: \"info\",\n insights: \"chart-line\",\n inventory: \"package\",\n inventory_2: \"package\",\n iron: \"shirt\",\n key: \"key\",\n kitchen: \"refrigerator\",\n language: \"globe\",\n laptop: \"laptop\",\n light_mode: \"sun\",\n lightbulb: \"lightbulb\",\n link: \"link\",\n list: \"list\",\n list_alt: \"list\",\n local_bar: \"wine\",\n local_cafe: \"coffee\",\n local_florist: \"flower\",\n local_gas_station: \"fuel\",\n local_laundry_service: \"washing-machine\",\n local_offer: \"tag\",\n local_shipping: \"truck\",\n local_taxi: \"car-taxi-front\",\n location_on: \"map-pin\",\n lock: \"lock\",\n lock_open: \"lock-open\",\n login: \"log-in\",\n logout: \"log-out\",\n mail: \"mail\",\n mail_outline: \"mail\",\n manage_accounts: \"user-cog\",\n map: \"map\",\n medical_services: \"stethoscope\",\n menu: \"menu\",\n menu_book: \"book-open\",\n mic: \"mic\",\n mode_edit: \"pencil\",\n monetization_on: \"circle-dollar-sign\",\n more_horiz: \"ellipsis\",\n more_vert: \"ellipsis-vertical\",\n music_note: \"music\",\n navigate_next: \"chevron-right\",\n note_add: \"file-plus\",\n notifications: \"bell\",\n notifications_active: \"bell-ring\",\n open_in_new: \"external-link\",\n paid: \"circle-dollar-sign\",\n palette: \"palette\",\n pause: \"pause\",\n payments: \"banknote\",\n pedal_bike: \"bike\",\n people: \"users\",\n perm_identity: \"user\",\n person: \"user\",\n person_add: \"user-plus\",\n person_outline: \"user\",\n pest_control: \"bug\",\n pets: \"paw-print\",\n phone: \"phone\",\n phone_iphone: \"smartphone\",\n photo_camera: \"camera\",\n picture_as_pdf: \"file-text\",\n pie_chart: \"chart-pie\",\n place: \"map-pin\",\n play_arrow: \"play\",\n play_circle: \"circle-play\",\n play_circle_filled: \"circle-play\",\n plumbing: \"shower-head\",\n power_settings_new: \"power\",\n print: \"printer\",\n public: \"globe\",\n qr_code_scanner: \"scan-line\",\n question_answer: \"messages-square\",\n radio_button_checked: \"circle-dot\",\n radio_button_unchecked: \"circle\",\n receipt: \"receipt\",\n receipt_long: \"receipt-text\",\n refresh: \"refresh-cw\",\n remove: \"minus\",\n remove_circle_outline: \"circle-minus\",\n reorder: \"list\",\n report_problem: \"triangle-alert\",\n restart_alt: \"rotate-ccw\",\n restaurant: \"utensils\",\n roofing: \"house\",\n room: \"map-pin\",\n router: \"router\",\n save: \"save\",\n savings: \"piggy-bank\",\n schedule: \"clock\",\n school: \"graduation-cap\",\n search: \"search\",\n security: \"shield-check\",\n send: \"send\",\n settings: \"settings\",\n share: \"share-2\",\n shield: \"shield\",\n shopping_bag: \"shopping-bag\",\n shopping_cart: \"shopping-cart\",\n smartphone: \"smartphone\",\n soap: \"soap-dispenser-droplet\",\n sort: \"arrow-down-up\",\n spa: \"flower-2\",\n star: \"star\",\n star_border: \"star\",\n star_rate: \"star\",\n store: \"store\",\n storefront: \"store\",\n support_agent: \"headset\",\n sync: \"refresh-cw\",\n task_alt: \"circle-check\",\n timer: \"timer\",\n today: \"calendar\",\n toggle_on: \"toggle-right\",\n translate: \"languages\",\n trending_up: \"trending-up\",\n tune: \"sliders-horizontal\",\n tv: \"tv\",\n two_wheeler: \"bike\",\n upload: \"upload\",\n upload_file: \"upload\",\n vaccines: \"syringe\",\n verified: \"badge-check\",\n verified_user: \"shield-check\",\n videocam: \"video\",\n view_list: \"list\",\n visibility: \"eye\",\n visibility_off: \"eye-off\",\n vpn_key: \"key-round\",\n warehouse: \"warehouse\",\n warning: \"triangle-alert\",\n warning_amber: \"triangle-alert\",\n watch_later: \"clock\",\n water_drop: \"droplet\",\n wifi: \"wifi\",\n work: \"briefcase\",\n yard: \"trees\",\n};\n\n/**\n * Translate a Material Symbols code into a lucide slug, always returning one.\n *\n * Never returns `undefined`: an unknown code resolves to `fallback`, so a row\n * whose `icon_code` this table has not learned yet still renders. The input is\n * trimmed and lower-cased before lookup, because a seed written by hand is the\n * kind of source that carries stray whitespace and the odd capital.\n *\n * Nothing else in `/icons` imports this module, so an app that does not store\n * Material Symbols never pays for the table.\n *\n * @example\n * <Icon name={fromMaterialSymbol(category.icon_code)} size={20} />\n *\n * @example\n * <Icon name={fromMaterialSymbol(category.icon_code, \"folder\")} size={20} />\n *\n * @param code - A Material Symbols name, or `null`/`undefined` for a row that has none.\n * @param fallback - Slug to use when `code` is empty or unknown. Defaults to {@link MATERIAL_SYMBOL_FALLBACK}.\n * @returns A lucide slug `<Icon>` can render.\n */\nexport function fromMaterialSymbol(\n code: string | null | undefined,\n fallback: IconName = MATERIAL_SYMBOL_FALLBACK,\n): IconName {\n if (!code) return fallback;\n return materialToLucide[code.trim().toLowerCase()] ?? fallback;\n}\n"],"mappings":"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"}
package/dist/icons.d.ts CHANGED
@@ -332,14 +332,26 @@ export declare const MATERIAL_SYMBOL_FALLBACK: IconName;
332
332
  * empty screen: a handful of codes collide by accident, so roughly one row in
333
333
  * ten draws the right icon and the bug reads as "some icons went missing".
334
334
  *
335
- * **Still not the full vocabulary.** Material Symbols ships ~3600 names and
335
+ * **Still not the full vocabulary.** Material Symbols publishes ~6100 names and
336
336
  * almost none of them will ever appear in an `icon_code` of ours, so this grows
337
337
  * on demand, one hand-written pair at a time — a map generated by name
338
338
  * heuristics gets it badly wrong, starting with `build`, which is a wrench in
339
- * Material Symbols and nothing to do with construction. What is here covers the
340
- * trades lot it started as plus the vocabulary an administrative panel actually
341
- * uses: navigation, money, dates, media, and the service categories a seed
342
- * tends to carry.
339
+ * Material Symbols and nothing to do with construction.
340
+ *
341
+ * **How the codes were chosen.** Two lots, merged. The first was the trades seed
342
+ * the bridge started as. The second is the head of Material Symbols' own
343
+ * published popularity ranking (`fonts.google.com/metadata/icons`), which is
344
+ * measured usage rather than a guess at which names a seed will contain — every
345
+ * key was checked to exist in that vocabulary before landing.
346
+ *
347
+ * **Where the two lots disagreed**, six keys, the tie went to whichever mapping
348
+ * keeps two distinct Material Symbols names distinct in lucide: `error` →
349
+ * `circle-alert` because `cancel` already owns `circle-x`; `payments` →
350
+ * `banknote` because `account_balance_wallet` already owns `wallet`;
351
+ * `receipt_long` → `receipt-text` because `receipt` already owns `receipt`;
352
+ * `construction` → itself because `engineering` already owns `hard-hat`; and
353
+ * `today` → `calendar` with `event` → `calendar-days`, splitting the generic
354
+ * calendar names from the dated one.
343
355
  *
344
356
  * Every target is checked mechanically against the slug list by
345
357
  * `material-symbols.test.ts`, so a pair pointing at a name lucide does not ship
@@ -1,2 +1,2 @@
1
- const e=require("../utils/ids.cjs"),t=require("./create-offline-store.cjs");function n(e){let t=typeof localStorage<`u`;return{get:()=>t?localStorage.getItem(e):null,set:n=>{t&&localStorage.setItem(e,n)},clear:()=>{t&&localStorage.removeItem(e)}}}function r(r){let i=t.createOfflineStore({databaseName:r.databaseName,version:r.version??1,tableName:r.tableName??`outbox`,indexes:`&id, recordId, enqueuedAt`,keyPath:`id`}),a=`get`in r.watermark?r.watermark:n(r.watermark.storageKey),o=r.idPrefix??`outbox`,s=r.isOnline??(()=>typeof navigator<`u`?navigator.onLine:!0),c=null,l=new Set,u={phase:`idle`,pending:0,lastSummary:null,lastError:null,lastSyncedAt:null},d=r.crossTab===!0,f=r.broadcastChannelName??`tempest-sync:${r.databaseName}`,p=d&&typeof BroadcastChannel<`u`?new BroadcastChannel(f):null,m=!1;function h(){for(let e of l)e(u)}function g(e){u={...u,...e},h(),p&&!m&&p.postMessage(u)}p&&(p.onmessage=e=>{m||(u=e.data,h())});async function _(){g({pending:await i.count()})}async function v(e){let t=await i.list(void 0,{orderBy:`enqueuedAt`});for(let n of t)try{await r.deliver(n),await i.delete(n.id),await r.onEntryDelivered?.(n),e.succeeded+=1}catch(t){let a=t instanceof Error?t.message:`delivery failed`;await i.update(n.id,{attempts:n.attempts+1,lastError:a}),await r.onEntryFailed?.(n,t),e.failed+=1,e.lastError=a}}async function y(){let e=a.get(),t=null,n;do{let i=await r.pullPage(e,t);for(let e of i.items)await r.applyRemote(e);t=i.nextCursor,n=i.serverTime}while(t);n&&a.set(n)}async function b(e){let t=Date.now(),n={trigger:e,succeeded:0,failed:0,durationMs:0,skipped:!1,lastError:null};return s()?(await v(n),await y(),n.durationMs=Date.now()-t,n):(n.skipped=!0,n.durationMs=Date.now()-t,n)}async function x(e){let t=typeof navigator<`u`?navigator.locks:void 0;return!d||!t?b(e):await t.request(`${f}:flush`,{ifAvailable:!0},async t=>t?b(e):null)??{trigger:e,succeeded:0,failed:0,durationMs:0,skipped:!1,lastError:null}}_();let S=0;function C(){let e=Date.now();return S=e>S?e:S+1,S}return{async enqueue(t,n,r){let a={id:e.randomId(o),op:t,recordId:n,enqueuedAt:C(),attempts:0,payload:r};return await i.put(a),await _(),a.id},flush(e=`manual`){return c||=(g({phase:`syncing`}),x(e).then(async e=>(await _(),g({phase:e.skipped?`offline`:e.failed>0?`error`:`idle`,lastSummary:e,lastError:e.lastError,lastSyncedAt:e.skipped?u.lastSyncedAt:Date.now()}),e)).finally(()=>{c=null})),c},pendingCount(){return i.count()},listPending(){return i.list(void 0,{orderBy:`enqueuedAt`})},async clearOutbox(){await i.clear(),await _()},resetWatermark(){a.clear()},getState(){return u},subscribe(e){return l.add(e),()=>{l.delete(e)}},dispose(){m=!0,p?.close()}}}exports.createOfflineSync=r;
1
+ const e=require("../utils/ids.cjs"),t=require("./create-offline-store.cjs");function n(e){let t=typeof localStorage<`u`;return{get:()=>t?localStorage.getItem(e):null,set:n=>{t&&localStorage.setItem(e,n)},clear:()=>{t&&localStorage.removeItem(e)}}}function r(r){let i=t.createOfflineStore({databaseName:r.databaseName,version:r.version??1,tableName:r.tableName??`outbox`,indexes:`&id, recordId, enqueuedAt`,keyPath:`id`}),a=`get`in r.watermark?r.watermark:n(r.watermark.storageKey),o=r.idPrefix??`outbox`,s=r.isOnline??(()=>typeof navigator<`u`?navigator.onLine:!0),c=null,l=new Set,u={phase:`idle`,pending:0,lastSummary:null,lastError:null,lastSyncedAt:null},d=r.crossTab===!0,f=r.broadcastChannelName??`tempest-sync:${r.databaseName}`,p=d&&typeof BroadcastChannel<`u`?new BroadcastChannel(f):null,m=!1;function h(){for(let e of l)e(u)}function g(e){u={...u,...e},h(),p&&!m&&p.postMessage(u)}p&&(p.onmessage=e=>{m||(u=e.data,h())});async function _(){g({pending:await i.count()})}async function v(e){let t=await i.list(void 0,{orderBy:`enqueuedAt`}),n=new Set;for(let a of t){if(n.has(a.recordId)){e.deferred+=1;continue}try{await r.deliver(a),await i.delete(a.id),await r.onEntryDelivered?.(a),e.succeeded+=1}catch(t){let o=t instanceof Error?t.message:`delivery failed`;await i.update(a.id,{attempts:a.attempts+1,lastError:o}),await r.onEntryFailed?.(a,t),n.add(a.recordId),e.failed+=1,e.lastError=o}}}async function y(){let e=a.get(),t=null,n;do{let i=await r.pullPage(e,t);for(let e of i.items)await r.applyRemote(e);t=i.nextCursor,n=i.serverTime}while(t);n&&a.set(n)}async function b(e){let t=Date.now(),n={trigger:e,succeeded:0,failed:0,deferred:0,durationMs:0,skipped:!1,lastError:null};return s()?(await v(n),await y(),n.durationMs=Date.now()-t,n):(n.skipped=!0,n.durationMs=Date.now()-t,n)}async function x(e){let t=typeof navigator<`u`?navigator.locks:void 0;return!d||!t?b(e):await t.request(`${f}:flush`,{ifAvailable:!0},async t=>t?b(e):null)??{trigger:e,succeeded:0,failed:0,deferred:0,durationMs:0,skipped:!1,lastError:null}}_();let S=0;function C(){let e=Date.now();return S=e>S?e:S+1,S}return{async enqueue(t,n,r){let a={id:e.randomId(o),op:t,recordId:n,enqueuedAt:C(),attempts:0,payload:r};return await i.put(a),await _(),a.id},flush(e=`manual`){return c||=(g({phase:`syncing`}),x(e).then(async e=>(await _(),g({phase:e.skipped?`offline`:e.failed>0?`error`:`idle`,lastSummary:e,lastError:e.lastError,lastSyncedAt:e.skipped?u.lastSyncedAt:Date.now()}),e)).finally(()=>{c=null})),c},pendingCount(){return i.count()},listPending(){return i.list(void 0,{orderBy:`enqueuedAt`})},async clearOutbox(){await i.clear(),await _()},resetWatermark(){a.clear()},getState(){return u},subscribe(e){return l.add(e),()=>{l.delete(e)}},dispose(){m=!0,p?.close()}}}exports.createOfflineSync=r;
2
2
  //# sourceMappingURL=create-offline-sync.cjs.map