your-ai-workflow-firebase-os 2.0.1 → 2.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (183) hide show
  1. package/dist/AccessNotice-BZ5Gt1nP.js +40 -0
  2. package/dist/AccessNotice-CN7kc70o.cjs +1 -0
  3. package/dist/{AddressField-R-HvndkG.js → AddressField-9Sqn8TvC.js} +3 -3
  4. package/dist/{AddressField-BkzFOo2t.cjs → AddressField-B7wtV8yA.cjs} +1 -1
  5. package/dist/Assets-DBMwZ3bN.cjs +1 -0
  6. package/dist/Assets-DT-NU_WO.js +296 -0
  7. package/dist/Attachments-Bl9_dfsu.js +46 -0
  8. package/dist/Attachments-UVK9SRXf.cjs +1 -0
  9. package/dist/Billing-0RIHayHy.cjs +1 -0
  10. package/dist/Billing-FNE2r3_d.js +379 -0
  11. package/dist/BookingCalendar-BP5kiv3d.cjs +1 -0
  12. package/dist/BookingCalendar-DZ2fEFja.js +309 -0
  13. package/dist/Button-4lzOE31p.js +48 -0
  14. package/dist/Button-5DlB2MCi.cjs +1 -0
  15. package/dist/CalendarView-BimoXy_k.cjs +1 -0
  16. package/dist/CalendarView-D-ykjpvI.js +664 -0
  17. package/dist/ConfirmModal-Di9GR-vV.cjs +1 -0
  18. package/dist/ConfirmModal-gKQEpd4d.js +113 -0
  19. package/dist/ContactPopup-BXnHrRwl.js +1114 -0
  20. package/dist/ContactPopup-lxmRMoIa.cjs +1 -0
  21. package/dist/CopyLink-BpEQWmfI.cjs +1 -0
  22. package/dist/CopyLink-CBAVfcm1.js +43 -0
  23. package/dist/DashboardNav-CXa_ci-_.cjs +1 -0
  24. package/dist/DashboardNav-Dmn7PVSp.js +886 -0
  25. package/dist/EmailAdmin-CjN_rvxT.js +318 -0
  26. package/dist/EmailAdmin-lAEBdY1s.cjs +1 -0
  27. package/dist/EventCard-46EquygT.cjs +1 -0
  28. package/dist/EventCard-B6xD-mk3.js +97 -0
  29. package/dist/FileViewerPopup-CX-J75TM.js +1283 -0
  30. package/dist/FileViewerPopup-D8-MmIoS.cjs +3 -0
  31. package/dist/FormNote-BivRNA3J.js +50 -0
  32. package/dist/FormNote-BtdTGpml.cjs +1 -0
  33. package/dist/FormsAdmin-B5PBCG2W.js +812 -0
  34. package/dist/FormsAdmin-BQCULvi5.cjs +1 -0
  35. package/dist/Inbox-BPk2ZkE5.js +779 -0
  36. package/dist/Inbox-DNrcBx0o.cjs +3 -0
  37. package/dist/Loader-Bu89fsbB.cjs +1 -0
  38. package/dist/Loader-D4gwgBOq.js +32 -0
  39. package/dist/ManagePlanButton-B0dwqZBd.cjs +1 -0
  40. package/dist/ManagePlanButton-BSrOHYze.js +29 -0
  41. package/dist/MyBookings-6qr0GgzO.cjs +1 -0
  42. package/dist/MyBookings-BQjGM2LQ.js +113 -0
  43. package/dist/PageTitle-CZhgmmDT.cjs +3 -0
  44. package/dist/PageTitle-D93YCiN8.js +1606 -0
  45. package/dist/PagesAdmin-BcHIcqM5.cjs +34 -0
  46. package/dist/PagesAdmin-D69P9nRb.js +5802 -0
  47. package/dist/PagesAdmin-DNwZOKjA.cjs +1 -0
  48. package/dist/PagesAdmin-HUITEcHx.js +3 -0
  49. package/dist/PaymentsAdmin-C2iCI9qC.js +1291 -0
  50. package/dist/PaymentsAdmin-CoXi2vCm.cjs +2 -0
  51. package/dist/{PhoneInputField-B3P_vUDW.cjs → PhoneInputField-BEwYZMB7.cjs} +1 -1
  52. package/dist/{PhoneInputField-BlYHb5e0.js → PhoneInputField-BG0L2djE.js} +2 -2
  53. package/dist/PhoneInputField-DfOtCIH_.js +2 -0
  54. package/dist/{PhoneInputField-CdNTvWXQ.cjs → PhoneInputField-jhWvto8C.cjs} +1 -1
  55. package/dist/Popup-DHYGFl2-.cjs +1 -0
  56. package/dist/Popup-xROLytgr.js +142 -0
  57. package/dist/ProviderMark-BBfaM5Yl.js +52 -0
  58. package/dist/ProviderMark-xLkUN3Fx.cjs +1 -0
  59. package/dist/PublishApp-Bm-6r3Td.js +595 -0
  60. package/dist/PublishApp-D4XJUkJa.cjs +2 -0
  61. package/dist/Said-CoC15awL.js +94 -0
  62. package/dist/Said-IqCNofdh.cjs +1 -0
  63. package/dist/ScheduleAdmin-BKfQkrR8.js +1853 -0
  64. package/dist/ScheduleAdmin-DwK36GAZ.cjs +1 -0
  65. package/dist/SchedulePicker--urIH2Eb.js +112 -0
  66. package/dist/SchedulePicker-nmqzUnUH.cjs +1 -0
  67. package/dist/Setup-CHLgd-ag.js +849 -0
  68. package/dist/Setup-CaDranTm.cjs +1374 -0
  69. package/dist/SetupPayments-CVIwh1eQ.js +411 -0
  70. package/dist/SetupPayments-HNXWA25X.cjs +1 -0
  71. package/dist/SignInAdmin-C94-A-0w.cjs +4 -0
  72. package/dist/SignInAdmin-Yxgv_8U4.js +766 -0
  73. package/dist/SupportBar-CDT0HwdP.cjs +1 -0
  74. package/dist/SupportBar-CN_JGC-9.js +117 -0
  75. package/dist/SystemTabContent-L3vGGF3P.cjs +1 -0
  76. package/dist/SystemTabContent-QdxxLILE.js +35 -0
  77. package/dist/TemplateDrive-DV8zNjYe.cjs +1 -0
  78. package/dist/TemplateDrive-NJY_AAvV.js +1197 -0
  79. package/dist/ThemeAdmin-BzFjJkLg.js +269 -0
  80. package/dist/ThemeAdmin-DVnPNxe7.cjs +1 -0
  81. package/dist/ThemeAdmin-DY7Vc4Sj.cjs +3 -0
  82. package/dist/ThemeAdmin-DnC-D2N3.js +2 -0
  83. package/dist/{ContactPopup-9J_YeJrb.js → TimeZoneField-DkI1Bkcz.js} +3382 -5513
  84. package/dist/TimeZoneField-qs7NPR30.cjs +12 -0
  85. package/dist/TransactionsAdmin-BsZ-oQWi.js +582 -0
  86. package/dist/TransactionsAdmin-CTSTiPld.cjs +1 -0
  87. package/dist/Trouble-9es_AI4F.cjs +1 -0
  88. package/dist/Trouble-oWt9fMsm.js +164 -0
  89. package/dist/Users-CTitWXyd.cjs +1 -0
  90. package/dist/Users-DJjQTWJF.js +1207 -0
  91. package/dist/aiModels-DIP9fn8T.cjs +1 -0
  92. package/dist/{aiModels-BHlEfuRJ.js → aiModels-DnDhNGup.js} +29 -61
  93. package/dist/arrivalRoads-BJ-35vkk.js +228 -0
  94. package/dist/arrivalRoads-qoU-B4jt.cjs +4 -0
  95. package/dist/{bake-D0gLVNTL.cjs → bake-n2wyFw0B.cjs} +1 -1
  96. package/dist/{bake-OErV2MLy.js → bake-naZeMu98.js} +14 -14
  97. package/dist/bookingPages-C7a3srPG.js +102 -0
  98. package/dist/bookingPages-DvbFbD9X.cjs +1 -0
  99. package/dist/components/CustomSelect.d.ts +7 -1
  100. package/dist/components/RegistrationFields.d.ts +6 -1
  101. package/dist/components/Reveal.d.ts +12 -0
  102. package/dist/components/ScrollToTop.d.ts +4 -0
  103. package/dist/contentFallback-C9MZjdq7.cjs +1 -0
  104. package/dist/contentFallback-CEDY0Pwp.js +96 -0
  105. package/dist/contentKey-Bwry4lDa.js +13 -0
  106. package/dist/contentKey-DJGYYnAE.cjs +1 -0
  107. package/dist/{dist-_zWHDDrc.js → dist-DUPvBnOA.js} +1 -1
  108. package/dist/email-BfnZnMwD.cjs +1 -0
  109. package/dist/email-Ddj8Dlu6.js +58 -0
  110. package/dist/{fileBytes-B0qxHYQL.cjs → fileBytes-BJPaiX9Y.cjs} +1 -1
  111. package/dist/{fileBytes-uhq3pGCS.js → fileBytes-bjgvCfWu.js} +2 -2
  112. package/dist/forms-Bvx9HTM6.js +75 -0
  113. package/dist/forms-CmNeTETW.cjs +1 -0
  114. package/dist/lib/ThemeContext.d.ts +0 -14
  115. package/dist/lib/bareImgWatch.d.ts +6 -1
  116. package/dist/lib/localEdits.d.ts +2 -0
  117. package/dist/lib/pageDesignLines.d.ts +1 -1
  118. package/dist/lib/paymentProducts.d.ts +8 -0
  119. package/dist/lib/payments.d.ts +11 -1
  120. package/dist/lib/people.d.ts +9 -0
  121. package/dist/lib/recordsKey.d.ts +24 -0
  122. package/dist/{lucide-react-DiyP8FA_.js → lucide-react-CA7GD7Nv.js} +8 -8
  123. package/dist/notices-B7iIrIEg.js +29 -0
  124. package/dist/notices-upMg8UVh.cjs +1 -0
  125. package/dist/openOnArrival-Buwqb86D.cjs +1 -0
  126. package/dist/openOnArrival-S2K6v-lB.js +35 -0
  127. package/dist/pageFiles--Ih60ITP.js +45 -0
  128. package/dist/pageFiles-UtBmlOcD.cjs +1 -0
  129. package/dist/pages/PagesAdmin.d.ts +69 -7
  130. package/dist/{pdf-DLuvpvHg.js → pdf-DRXcPGkr.js} +1 -1
  131. package/dist/{pdf.worker.min-C0gkd2Ec.js → pdf.worker.min-CfKZezeM.js} +1 -1
  132. package/dist/people-2jZE_pdI.js +102 -0
  133. package/dist/people-BpVvIr9-.cjs +1 -0
  134. package/dist/personName-CFw3pxuu.js +18 -0
  135. package/dist/personName-CbzN_i57.cjs +1 -0
  136. package/dist/publishSteps-C1cDFzzB.js +88 -0
  137. package/dist/publishSteps-SSm8afDw.cjs +1 -0
  138. package/dist/recordLock-DHVvI9bP.js +61 -0
  139. package/dist/recordLock-DWeIxiwh.cjs +1 -0
  140. package/dist/recordsKey-B7QrxdeU.cjs +1 -0
  141. package/dist/recordsKey-D5-wC0Aw.js +141 -0
  142. package/dist/registrationFields-CLeR2lQJ.js +181 -0
  143. package/dist/registrationFields-v4pOoRdn.cjs +1 -0
  144. package/dist/renderer.cjs.js +1 -1
  145. package/dist/renderer.es.js +1 -1
  146. package/dist/roles-D6VaHWfV.js +147 -0
  147. package/dist/roles-DQUFFBQe.cjs +1 -0
  148. package/dist/scheduleData-ATN8w5hI.js +727 -0
  149. package/dist/scheduleData-Cltj0ABZ.cjs +1 -0
  150. package/dist/server.cjs.js +6 -6
  151. package/dist/server.es.js +716 -715
  152. package/dist/serviceStatus-TQyZO_Y_.cjs +1 -0
  153. package/dist/serviceStatus-vS8AI7SZ.js +125 -0
  154. package/dist/tabAudience-BqpN6dsR.cjs +1 -0
  155. package/dist/tabAudience-CRyMvv0v.js +34 -0
  156. package/dist/transactions-BqMQDRx3.js +343 -0
  157. package/dist/transactions-CufFrdAM.cjs +1 -0
  158. package/dist/useIsPhone-BVGx_X3e.js +13 -0
  159. package/dist/useIsPhone-o63tNneA.cjs +1 -0
  160. package/dist/{validate-DzSJWuyL.js → validate-CmC_tLK-.js} +433 -351
  161. package/dist/validate-DZMwqSrb.cjs +103 -0
  162. package/dist/vite/validate.d.ts +14 -0
  163. package/dist/vite.cjs.js +1 -1
  164. package/dist/vite.es.js +1 -1
  165. package/dist/your-ai-workflow-firebase-os.cjs.js +15 -1431
  166. package/dist/your-ai-workflow-firebase-os.css +1 -1
  167. package/dist/your-ai-workflow-firebase-os.es.js +11695 -35911
  168. package/package.json +1 -1
  169. package/src/index.css +122 -2
  170. package/dist/ContactPopup-DF8qQCoY.cjs +0 -12
  171. package/dist/PhoneInputField-Btx07xvM.js +0 -2
  172. package/dist/aiModels-BIhoTNH0.cjs +0 -1
  173. package/dist/validate-e48WXJdP.cjs +0 -103
  174. /package/dist/{address-DI1YaCI4.cjs → address-Bsb8COq2.cjs} +0 -0
  175. /package/dist/{address-Ca1h_UZX.js → address-C2bHNxJU.js} +0 -0
  176. /package/dist/{dist-BLGlDv1e.cjs → dist-E4jTFPs7.cjs} +0 -0
  177. /package/dist/{lucide-react-BYniZ3lQ.cjs → lucide-react-BwV6L6Is.cjs} +0 -0
  178. /package/dist/{mediaKind-dk396a03.cjs → mediaKind-D0MWyv6b.cjs} +0 -0
  179. /package/dist/{mediaKind-De2Cx_kB.js → mediaKind-DmKMsjeY.js} +0 -0
  180. /package/dist/{pdf-CC5g01eC.cjs → pdf-jLjjhvjp.cjs} +0 -0
  181. /package/dist/{pdf.worker.min-pI_P-OCl.cjs → pdf.worker.min-bLgNWd7w.cjs} +0 -0
  182. /package/dist/{verifiedAccount-C1iCxopN.js → verifiedAccount-DRbRFJ6H.js} +0 -0
  183. /package/dist/{verifiedAccount-D3OeaOBo.cjs → verifiedAccount-DScyKk96.cjs} +0 -0
@@ -102,7 +102,7 @@ export declare const PIECES_LINE = "And the hard parts are the app\u2019s own pi
102
102
  * that keeps many things — and names no piece: rule 6 and rule 31 do, and
103
103
  * `whole-records` is the build's half.
104
104
  */
105
- export declare const WORKING_VIEW_LINE = "If this page keeps many things \u2014 orders, requests, clients \u2014 show them the way a professional tool does, so a dozen can be seen at once without my asking for it: each one a compact card or a single row saying only what tells it apart \u2014 its number or name, who it is for, its stage as a small label, when, how much, who has it \u2014 and pressing one opens the whole of it in the app\u2019s own pop-up, where everything done to it is: its stage, its notes, handing it over. Where things move through stages, the people who work on them see a board of those stages; somebody who only follows their own sees theirs as a short list. Never every one drawn open, one big box under another. Inside the opened one, keep it tidy and even: a clear grid, each label above its value, the same spacing throughout, and boxes and buttons that sit side by side the same height. Do not add a gallery to a page I did not ask it for.";
105
+ export declare const WORKING_VIEW_LINE = "If this page keeps many things \u2014 orders, requests, clients \u2014 show them the way a professional tool does, so a dozen can be seen at once without my asking for it: each one a compact card or a single row saying only what tells it apart \u2014 its number or name, who it is for, its stage as a small label, when, how much, who has it \u2014 and pressing one opens the whole of it in the app\u2019s own pop-up, where everything done to it is: its stage, its notes, handing it over. Where things move through stages, the people who work on them see a board of those stages; somebody who only follows their own sees theirs as a short list. Never every one drawn open, one big box under another. Inside the opened one, keep it tidy and even: the pop-up is its one frame, so its parts are set apart by space or a thin rule and never each in a bordered box of its own, nothing boxed inside a box; a clear grid, each label in small print above its value at the page\u2019s ordinary size, one spacing throughout, boxes and buttons that sit side by side the same height, and what can be done to it \u2014 its stage, who holds it, a note \u2014 together in one place at the end rather than scattered through it; nothing on it pulses, and every word on it is mine or the entry\u2019s, never a made-up place, carrier or name standing in for one that is missing. Do not add a gallery to a page I did not ask it for.";
106
106
  export declare const finishLine: (website: boolean) => string;
107
107
  /**
108
108
  * A change sentence's first rule: what the owner's words are about is the
@@ -218,6 +218,14 @@ export declare const BUYER_ANSWERS_RULE = "Who is paying is asked by the button
218
218
  * see. Said on every payment, because it is the page that knows.
219
219
  */
220
220
  export declare const PURCHASE_DETAILS_RULE = "Put what was bought into the button's metadata as well, whenever the page knows more than productName says \u2014 a basket, a chosen plan, options, a quantity, hours: items as one line per thing (quantity, name, the options chosen and its price \u2014 '2 \u00D7 Blazer, Noir Black, size M \u2014 240; 1 \u00D7 Belt \u2014 60', joined with '; '), total as the number charged, and delivery, discount or whatever else made up the amount under a key each. Every value a plain string under 500 characters, never an object or an array. My Transactions screen shows those under What they bought, so a payment there says what the money was for and not only how much.";
221
+ /** Words that say a one-off buys something the page then GIVES — credits, access, a download, a seat. */
222
+ export declare const ONCE_UNLOCK_WORDS: RegExp;
223
+ /**
224
+ * How a page learns what THIS buyer has bought once — the payments the app
225
+ * already keeps, by the product's name. Presentation, never protection: the
226
+ * same line a plan without a role gets, said for the thing bought once.
227
+ */
228
+ export declare const onceUnlockRule: (names: string) => string;
221
229
  /** Gating by plan is what a buyer SEES, never what protects the paid thing. */
222
230
  export declare const GATING_RULE = "Show and hide what a plan unlocks with the app's own useMyPayments() \u2014 it returns { loading, active, subscriptions, payments } \u2014 and that is presentation, not protection: anything genuinely paid, like a file or a secret, must come from the server.";
223
231
  /**
@@ -163,7 +163,17 @@ export declare function openBillingPortal(): Promise<string | null>;
163
163
  * The browser arriving on the success page proves nothing — anyone can type
164
164
  * that URL. Only `paid: true` from here means money moved.
165
165
  */
166
- export declare function confirmPayment(sessionId: string): Promise<PaymentConfirmation>;
166
+ export declare function confirmPayment(sessionId: string,
167
+ /**
168
+ * `quiet`: a LOOK at an old payment, not a buyer arriving back from Stripe.
169
+ * The Schedule calendar asks about every paid booking on it; each paid
170
+ * answer used to tell the menu and the bell to ask the server again, so a
171
+ * calendar of a hundred paid bookings sent the bell to the server a
172
+ * hundred times on every open.
173
+ */
174
+ options?: {
175
+ quiet?: boolean;
176
+ }): Promise<PaymentConfirmation>;
167
177
  export interface PaymentsStatus {
168
178
  configured: boolean;
169
179
  mode: 'live' | 'test' | null;
@@ -6,6 +6,15 @@ export interface Person {
6
6
  name: string;
7
7
  /** Their picture, or '' — most installs keep none on the profile. */
8
8
  photo: string;
9
+ /**
10
+ * Their address, or '' — beside the name in a picker, so two people who
11
+ * share a name are told apart and a name that IS an address is not the
12
+ * only thing known about them. Only the team and admins ever list people,
13
+ * so it reaches nobody a profile does not already reach.
14
+ */
15
+ email: string;
16
+ /** The number they signed in with, or ''. */
17
+ phone: string;
9
18
  /** The word they are marked with, which is the word that was asked for. */
10
19
  role: string;
11
20
  }
@@ -28,3 +28,27 @@ export declare function pageRecordsCollection(config: any, prefix: string, id?:
28
28
  * no preset draws no record list of its own).
29
29
  */
30
30
  export declare function recordsKeyInUse(config: any, id: string, isPublic: boolean): string;
31
+ /**
32
+ * The word a page of SENT entries names its collection after: its tab name
33
+ * as the sentence has always folded it — lower case, one `_` between words,
34
+ * none at either end — behind the key the page keeps once it has been
35
+ * renamed or moved, so a rename never sends the road to an empty list.
36
+ */
37
+ export declare const casePageName: (config: any) => string;
38
+ /**
39
+ * The ONE collection a page whose entries are sent keeps them in —
40
+ * `case_orders_entries` for a page called Orders.
41
+ *
42
+ * Three things have to agree on it to the letter, and until 2026-09-24 only
43
+ * two did. The page's sentence hands the assistant this name
44
+ * (`useCases('case_orders_entries')`), and the arrival road writes a shop's
45
+ * orders into it (lib/arrivalRoads.ts). But the page templates handed the
46
+ * content file its `actions` — `records`, `saveRecord`, `updateRecord`,
47
+ * `deleteRecord`, `collection` — bound to `case_<name>_records`, the shape
48
+ * every other page has, and nothing else ever read or wrote that name. So
49
+ * `actions.updateRecord(order.id, …)` on an order that had arrived answered
50
+ * "No document to update: …/case_orders_records/<id>": the order sat one
51
+ * collection over under the same id, and the first anybody heard of it was
52
+ * the owner pressing Assign. Named here, once, and read by all three.
53
+ */
54
+ export declare const caseEntriesCollection: (config: any, prefix?: string) => string;
@@ -1,9 +1,9 @@
1
1
  import { r as e } from "./chunk-NnHqS4_Y.js";
2
2
  import { createContext as t, createElement as n, forwardRef as r, useContext as i, useMemo as a } from "react";
3
- //#region ../your-ai-workflow-firebase-os/node_modules/lucide-react/dist/esm/shared/src/utils/toKebabCase.mjs
3
+ //#region node_modules/lucide-react/dist/esm/shared/src/utils/toKebabCase.mjs
4
4
  var o = (e) => e?.replace(/([a-z0-9])([A-Z])/g, "$1-$2").toLowerCase();
5
5
  //#endregion
6
- //#region ../your-ai-workflow-firebase-os/node_modules/lucide-react/dist/esm/shared/src/utils/toLucideIconData.mjs
6
+ //#region node_modules/lucide-react/dist/esm/shared/src/utils/toLucideIconData.mjs
7
7
  function ee(e, t, n = []) {
8
8
  if (t == null) throw Error("[lucide]: iconNode is required when icon name is used");
9
9
  return {
@@ -14,7 +14,7 @@ function ee(e, t, n = []) {
14
14
  };
15
15
  }
16
16
  //#endregion
17
- //#region ../your-ai-workflow-firebase-os/node_modules/lucide-react/dist/esm/shared/src/utils/toCamelCase.mjs
17
+ //#region node_modules/lucide-react/dist/esm/shared/src/utils/toCamelCase.mjs
18
18
  var te = (e) => {
19
19
  let t = "", n = !1;
20
20
  for (let r of e) {
@@ -40,7 +40,7 @@ var te = (e) => {
40
40
  "stroke-linejoin": "round"
41
41
  };
42
42
  //#endregion
43
- //#region ../your-ai-workflow-firebase-os/node_modules/lucide-react/dist/esm/shared/src/build/buildLucideIconNode.mjs
43
+ //#region node_modules/lucide-react/dist/esm/shared/src/build/buildLucideIconNode.mjs
44
44
  function re(e) {
45
45
  return e != null;
46
46
  }
@@ -77,7 +77,7 @@ function ie(e, t = {}) {
77
77
  ];
78
78
  }
79
79
  //#endregion
80
- //#region ../your-ai-workflow-firebase-os/node_modules/lucide-react/dist/esm/shared/src/build/buildLucideIconForReact.mjs
80
+ //#region node_modules/lucide-react/dist/esm/shared/src/build/buildLucideIconForReact.mjs
81
81
  function eee(e, t = {}) {
82
82
  return ie(e, {
83
83
  ...t,
@@ -92,7 +92,7 @@ function eee(e, t = {}) {
92
92
  });
93
93
  }
94
94
  //#endregion
95
- //#region ../your-ai-workflow-firebase-os/node_modules/lucide-react/dist/esm/shared/src/utils/hasA11yProp.mjs
95
+ //#region node_modules/lucide-react/dist/esm/shared/src/utils/hasA11yProp.mjs
96
96
  var tee = (e) => {
97
97
  for (let t in e) if (t.startsWith("aria-") || t === "role" || t === "title") return !0;
98
98
  return !1;
@@ -137,7 +137,7 @@ var se = () => i(ae), ce = r(({ color: e, size: t, width: r, height: i, strokeWi
137
137
  }, [...he.map(([e, t]) => n(e, t)), ...Array.isArray(s) ? s : [s]]);
138
138
  });
139
139
  //#endregion
140
- //#region ../your-ai-workflow-firebase-os/node_modules/lucide-react/dist/esm/createLucideIcon.mjs
140
+ //#region node_modules/lucide-react/dist/esm/createLucideIcon.mjs
141
141
  function l(e, t = [], i = []) {
142
142
  let a = typeof e == "string" ? ee(e, t, i) : e, o = r(({ className: e, ...t }, r) => n(ce, {
143
143
  ref: r,
@@ -148,7 +148,7 @@ function l(e, t = [], i = []) {
148
148
  return a.name && (o.displayName = s(a.name)), o;
149
149
  }
150
150
  //#endregion
151
- //#region ../your-ai-workflow-firebase-os/node_modules/lucide-react/dist/esm/icons/a-arrow-down.mjs
151
+ //#region node_modules/lucide-react/dist/esm/icons/a-arrow-down.mjs
152
152
  var le = {
153
153
  name: "a-arrow-down",
154
154
  size: 24,
@@ -0,0 +1,29 @@
1
+ import { Oa as e, ka as t } from "./TimeZoneField-DkI1Bkcz.js";
2
+ import { addDoc as n, collection as r } from "firebase/firestore";
3
+ //#region src/lib/notices.ts
4
+ var i = "user_notices";
5
+ async function a(a, o) {
6
+ let s = String(a || "").trim();
7
+ if (!s || !o?.title) {
8
+ console.warn("leaveNotice(): needs the uid of the person to tell and a title.", o);
9
+ return;
10
+ }
11
+ try {
12
+ await n(r(t, i), {
13
+ uid: s,
14
+ kind: "notice",
15
+ title: o.title,
16
+ body: o.body || "",
17
+ link: o.link || "",
18
+ fromName: e.currentUser?.displayName || e.currentUser?.email || "",
19
+ createdAt: Date.now()
20
+ });
21
+ } catch (e) {
22
+ console.warn("leaveNotice(): the notice was not saved — only an admin may leave one.", e);
23
+ }
24
+ }
25
+ async function o(e, t) {
26
+ for (let n of [...new Set(e.map((e) => String(e || "").trim()).filter(Boolean))]) await a(n, t);
27
+ }
28
+ //#endregion
29
+ export { a as n, o as r, i as t };
@@ -0,0 +1 @@
1
+ require(`./chunk-CiTBaPhY.cjs`);const e=require(`./TimeZoneField-qs7NPR30.cjs`);let t=require(`firebase/firestore`);var n=`user_notices`;async function r(r,i){let a=String(r||``).trim();if(!a||!i?.title){console.warn(`leaveNotice(): needs the uid of the person to tell and a title.`,i);return}try{await(0,t.addDoc)((0,t.collection)(e.ka,n),{uid:a,kind:`notice`,title:i.title,body:i.body||``,link:i.link||``,fromName:e.Oa.currentUser?.displayName||e.Oa.currentUser?.email||``,createdAt:Date.now()})}catch(e){console.warn(`leaveNotice(): the notice was not saved — only an admin may leave one.`,e)}}async function i(e,t){for(let n of[...new Set(e.map(e=>String(e||``).trim()).filter(Boolean))])await r(n,t)}Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return r}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return i}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return n}});
@@ -0,0 +1 @@
1
+ require(`./chunk-CiTBaPhY.cjs`);let e=require(`react`);var t=320;function n(e){if(typeof document>`u`)return null;for(let t of document.querySelectorAll(`[data-ledger-row]`))if(t.getAttribute(`data-ledger-row`)===e)return t;return null}function r(r,i,a,o){let s=(0,e.useRef)({open:a,done:o});(0,e.useEffect)(()=>{s.current={open:a,done:o}});let c=(0,e.useRef)(void 0);(0,e.useEffect)(()=>()=>clearTimeout(c.current),[]),(0,e.useEffect)(()=>{if(!r||!i)return;s.current.open(r);let e=typeof window<`u`&&!!window.matchMedia?.(`(prefers-reduced-motion: reduce)`)?.matches;clearTimeout(c.current),c.current=setTimeout(()=>{let t=n(r);t&&typeof t.scrollIntoView==`function`&&t.scrollIntoView({block:`start`,behavior:e?`auto`:`smooth`})},e?0:t),s.current.done?.()},[r,i])}Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return r}});
@@ -0,0 +1,35 @@
1
+ import { useEffect as e, useRef as t } from "react";
2
+ //#region src/lib/openOnArrival.ts
3
+ var n = 320;
4
+ function r(e) {
5
+ if (typeof document > "u") return null;
6
+ for (let t of document.querySelectorAll("[data-ledger-row]")) if (t.getAttribute("data-ledger-row") === e) return t;
7
+ return null;
8
+ }
9
+ function i(i, a, o, s) {
10
+ let c = t({
11
+ open: o,
12
+ done: s
13
+ });
14
+ e(() => {
15
+ c.current = {
16
+ open: o,
17
+ done: s
18
+ };
19
+ });
20
+ let l = t(void 0);
21
+ e(() => () => clearTimeout(l.current), []), e(() => {
22
+ if (!i || !a) return;
23
+ c.current.open(i);
24
+ let e = typeof window < "u" && !!window.matchMedia?.("(prefers-reduced-motion: reduce)")?.matches;
25
+ clearTimeout(l.current), l.current = setTimeout(() => {
26
+ let t = r(i);
27
+ t && typeof t.scrollIntoView == "function" && t.scrollIntoView({
28
+ block: "start",
29
+ behavior: e ? "auto" : "smooth"
30
+ });
31
+ }, e ? 0 : n), c.current.done?.();
32
+ }, [i, a]);
33
+ }
34
+ //#endregion
35
+ export { i as t };
@@ -0,0 +1,45 @@
1
+ import { Ln as e, ja as t } from "./TimeZoneField-DkI1Bkcz.js";
2
+ import { f as n, v as r } from "./mediaKind-DmKMsjeY.js";
3
+ import { deleteObject as i, ref as a } from "firebase/storage";
4
+ //#region src/lib/pageFiles.ts
5
+ var o = (e) => `${e}files`, s = "case_files", c = (e, t) => e && t ? `${s}/${e}/${t}` : "";
6
+ function l(e) {
7
+ let t = /^https?:\/\/[^?#\s]*\/v0\/b\/[^/]+\/o\/([^?#\s]+)/.exec(e);
8
+ if (!t) return "";
9
+ try {
10
+ return decodeURIComponent(t[1]);
11
+ } catch {
12
+ return "";
13
+ }
14
+ }
15
+ var u = (e) => {
16
+ let t = String(e || "").split("/");
17
+ return t.length === 2 && /^[a-z][a-z0-9]*_files$/.test(t[0]) && t[0] !== "case_files" ? t[0] : "";
18
+ }, d = (t) => u(t) === e, f = /^[a-z][a-z0-9_]*_(files|uploads)\//;
19
+ function p(e, t = 5) {
20
+ let n = /* @__PURE__ */ new Set(), r = (e, t) => {
21
+ if (typeof e == "string") {
22
+ let t = l(e) || (f.test(e) ? e : "");
23
+ t && n.add(t);
24
+ } else t > 0 && Array.isArray(e) ? e.forEach((e) => r(e, t - 1)) : t > 0 && e && typeof e == "object" && Object.values(e).forEach((e) => r(e, t - 1));
25
+ };
26
+ return r(e, t), [...n];
27
+ }
28
+ function m(e, t) {
29
+ let n = /* @__PURE__ */ new Set(), r = (e) => e.startsWith(`${t}/`) && e.length > t.length + 1, i = (e, t) => {
30
+ if (typeof e == "string") {
31
+ let t = r(e) ? e : l(e);
32
+ r(t) && n.add(t);
33
+ } else t < 2 && Array.isArray(e) ? e.forEach((e) => i(e, t + 1)) : t < 2 && e && typeof e == "object" && Object.values(e).forEach((e) => i(e, t + 1));
34
+ };
35
+ return i(e, 0), [...n];
36
+ }
37
+ async function h(e, o, s) {
38
+ if (!e) return;
39
+ let c = new Set(o.filter((t) => t.id !== e.id).flatMap((e) => m(e, s))), l = m(e, s).filter((e) => !c.has(e));
40
+ await Promise.all([...l.map((e) => i(a(t, e)).catch((t) => {
41
+ console.warn(`${e}: the record is gone but its file stayed (${t?.code || t}).`);
42
+ })), ...l.flatMap((e) => [r(e), n(e)]).filter(Boolean).map((e) => i(a(t, e)).catch(() => {}))]);
43
+ }
44
+ //#endregion
45
+ export { m as a, p as c, o as i, c as n, h as o, d as r, l as s, u as t };
@@ -0,0 +1 @@
1
+ require(`./chunk-CiTBaPhY.cjs`);const e=require(`./TimeZoneField-qs7NPR30.cjs`),t=require(`./mediaKind-D0MWyv6b.cjs`);let n=require(`firebase/storage`);var r=e=>`${e}files`,i=`case_files`,a=(e,t)=>e&&t?`${i}/${e}/${t}`:``;function o(e){let t=/^https?:\/\/[^?#\s]*\/v0\/b\/[^/]+\/o\/([^?#\s]+)/.exec(e);if(!t)return``;try{return decodeURIComponent(t[1])}catch{return``}}var s=e=>{let t=String(e||``).split(`/`);return t.length===2&&/^[a-z][a-z0-9]*_files$/.test(t[0])&&t[0]!==`case_files`?t[0]:``},c=t=>s(t)===e.Ln,l=/^[a-z][a-z0-9_]*_(files|uploads)\//;function u(e,t=5){let n=new Set,r=(e,t)=>{if(typeof e==`string`){let t=o(e)||(l.test(e)?e:``);t&&n.add(t)}else t>0&&Array.isArray(e)?e.forEach(e=>r(e,t-1)):t>0&&e&&typeof e==`object`&&Object.values(e).forEach(e=>r(e,t-1))};return r(e,t),[...n]}function d(e,t){let n=new Set,r=e=>e.startsWith(`${t}/`)&&e.length>t.length+1,i=(e,t)=>{if(typeof e==`string`){let t=r(e)?e:o(e);r(t)&&n.add(t)}else t<2&&Array.isArray(e)?e.forEach(e=>i(e,t+1)):t<2&&e&&typeof e==`object`&&Object.values(e).forEach(e=>i(e,t+1))};return i(e,0),[...n]}async function f(r,i,a){if(!r)return;let o=new Set(i.filter(e=>e.id!==r.id).flatMap(e=>d(e,a))),s=d(r,a).filter(e=>!o.has(e));await Promise.all([...s.map(t=>(0,n.deleteObject)((0,n.ref)(e.ja,t)).catch(e=>{console.warn(`${t}: the record is gone but its file stayed (${e?.code||e}).`)})),...s.flatMap(e=>[t.v(e),t.f(e)]).filter(Boolean).map(t=>(0,n.deleteObject)((0,n.ref)(e.ja,t)).catch(()=>{}))])}Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return d}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return u}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return r}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return a}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return f}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return c}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return o}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return s}});
@@ -72,13 +72,6 @@ export declare const audienceRoleOptions: (roles?: CustomRole[]) => {
72
72
  value: string;
73
73
  label: string;
74
74
  }[];
75
- /**
76
- * The collection a page of sent entries keeps them in — the name its sentence
77
- * hands the assistant (`useCases('case_orders_entries')`), and so the name the
78
- * app lets a linked page's entries into (arrivalRoads). ONE place, because the
79
- * two have to agree to the letter.
80
- */
81
- export declare const caseEntriesCollection: (config: any, prefix?: string) => string;
82
75
  export declare const audienceLines: (config: any) => string[];
83
76
  /** Which groups a piece of the owner's words names, each counted once. */
84
77
  export declare const groupsNamed: (text: string, roles?: CustomRole[]) => string[];
@@ -87,6 +80,12 @@ export declare const groupsNamed: (text: string, roles?: CustomRole[]) => string
87
80
  * or they name one and keep something from it.
88
81
  */
89
82
  export declare const mentionsAudienceSplit: (text: string, roles?: CustomRole[]) => boolean;
83
+ /**
84
+ * Words that say each person SEES ONLY what is assigned to them — the one
85
+ * reading of "assigned" that makes a record one person's own. "Edit the ones
86
+ * assigned to them" and "who it is assigned to" on a shared board do not.
87
+ */
88
+ export declare const SEES_ONLY_ASSIGNED: RegExp;
90
89
  /**
91
90
  * The lines that say how the page is divided between groups — only when the
92
91
  * owner's words divide it, and only on a page where the answer differs by
@@ -240,6 +239,15 @@ export declare const DELETE_LOCK_OFF_LINE = "Anybody who can change a record on
240
239
  export declare const DELETE_NONE_LINE = "Nothing on this page may be deleted \u2014 not by me, not by my admins, not by anybody. My app enforces it: every record saved through actions.saveRecord carries a lock my database honours. So never draw a Delete, a Remove, a bin or any other way of throwing a record away here \u2014 actions.canDelete(record) is false for everybody on this page, and you never decide it from a role yourself. Changing a record is not deleting it \u2014 everybody who could change one still can.";
241
240
  export declare const DELETE_NONE_ON_LINE = "From now on nothing on this page may be deleted \u2014 not by me, not by my admins, not by anybody. My app has locked every record: take away every Delete, Remove and bin this page has, and never draw one again. Changing a record is not deleting it \u2014 everybody who could change one still can. Change nothing else.";
242
241
  /** The switch, said in the first sentence — wherever it is on the row, and only what it says. */
242
+ /** Words that say something on the page is thrown away — beside a switch that says nobody may. */
243
+ export declare const DELETE_WORDS: RegExp;
244
+ /**
245
+ * The line under Who may delete: the answer's own hint — or, while no answer
246
+ * was given and the owner's words throw things away, that the two disagree.
247
+ * "A draft can be deleted" beside a row that never answered got a sentence
248
+ * saying nothing on the page may be deleted, by anybody (2026-09-24).
249
+ */
250
+ export declare const deleteByHint: (config: any) => string;
243
251
  export declare const deleteLockLines: (config: any) => string[];
244
252
  /**
245
253
  * Where the owner's words are silent, the DEFAULT — by the kind of page, and
@@ -742,6 +750,49 @@ export declare const variantLines: (words: string) => string[];
742
750
  * the line below is an if, so a page that only shows one loses nothing.
743
751
  */
744
752
  export declare const COUNT_WORDS: RegExp;
753
+ /**
754
+ * Words that move things through STAGES — a kanban, a pipeline, columns a
755
+ * card is dragged between, "from New to Done". Never the bare "board" (a
756
+ * notice board) or "stage" (at a venue): the words have to say things move.
757
+ */
758
+ export declare const STAGE_WORDS: RegExp;
759
+ /**
760
+ * Things that move through stages are the app's own <Pipeline>. Said in the
761
+ * sentence and not only in the contract because the Products rehearsal
762
+ * (2026-09-22) showed what a piece named only there gets: HTML5 draggable,
763
+ * dead under a finger. Not on a preset (the board keeps its own) and not on
764
+ * a page of the website.
765
+ */
766
+ export declare const pipelineLines: (config: any, words: string) => string[];
767
+ /**
768
+ * Words that put a PERSON from the team on a record — assigned to, handed
769
+ * to, who leads it, who is on it. Not the bare "lead": a pipeline of sales
770
+ * leads names nobody.
771
+ */
772
+ export declare const TEAM_PEOPLE_WORDS: RegExp;
773
+ /**
774
+ * A person from the team ON a shared record — the assignee, the lead — and
775
+ * the picker they are chosen with. On a shared team or admins page the
776
+ * record is everybody's and the person is a FIELD on it: told only "assigned
777
+ * to them", the sentence used to send the page after a user_ collection
778
+ * keyed by the assignee's uid (the private page's shape), and the board the
779
+ * owner described became a drawer each colleague could not see into. The
780
+ * picker is named because the alternative a model reaches for is
781
+ * user_profiles read by hand, which every role but the team is refused.
782
+ */
783
+ export declare const teamPeopleLines: (config: any, words: string) => string[];
784
+ /** Words that ask a card to say who made or changed a thing — "the lead's face", "who finished it", "created by". */
785
+ export declare const MADE_BY_WORDS: RegExp;
786
+ /** Who made or changed a record is already stamped on it, and <MadeBy> draws it. */
787
+ export declare const madeByLines: (config: any, words: string) => string[];
788
+ /**
789
+ * Words that ask for numbers DRAWN — a chart, a graph, "shown visually so I
790
+ * can see where the time goes". Narrower than CHART_WORDS on purpose: "make
791
+ * the workflow visual" is about a page's look, not a picture of numbers.
792
+ */
793
+ export declare const DRAWN_NUMBERS_WORDS: RegExp;
794
+ /** Numbers drawn side by side are <Bars> — on a page whose own numbers they are, where no tally is being counted (tallyLines says it there). */
795
+ export declare const chartLines: (config: any, words: string) => string[];
745
796
  /** A count is nudged with the app's own stepper, and saved once they stop — not on every press. */
746
797
  export declare const countLines: (words: string) => string[];
747
798
  /**
@@ -1444,6 +1495,10 @@ export declare const linkAudienceWords: (audience?: string, config?: any) => {
1444
1495
  kind: string;
1445
1496
  who: string;
1446
1497
  };
1498
+ /** Words that give the person an entry is about something to DO to it. */
1499
+ export declare const SENDER_ACTS_WORDS: RegExp;
1500
+ /** How the person an entry is about acts on it: an entry of their own, sent to whoever holds theirs. */
1501
+ export declare const senderActsLine: (collection: string, where: string) => string;
1447
1502
  /**
1448
1503
  * What a link ALREADY BUILT still means, for a sentence that changes one of
1449
1504
  * its two pages.
@@ -1539,6 +1594,13 @@ export declare const deadRoadHint: (config: any, targets: WiringPageRow[]) => st
1539
1594
  * page's setting is not on this row, so the line says where it is.
1540
1595
  */
1541
1596
  export declare const deadRoadEndWords: (target: WiringPageRow) => string;
1597
+ /** The shared lists THIS page of sent entries links to. */
1598
+ export declare const sharedListEnds: (config: any, targets: WiringPageRow[]) => WiringPageRow[];
1599
+ export declare const sharedListEndWords: (target: WiringPageRow) => string;
1600
+ /** The pages of sent entries linked to THIS shared list, from either row. */
1601
+ export declare const sharedListSources: (config: any, targets: WiringPageRow[]) => WiringPageRow[];
1602
+ /** The line under the shared list's space answer while a page of sent entries is linked to it. */
1603
+ export declare const sharedListHint: (config: any, targets: WiringPageRow[]) => string;
1542
1604
  /**
1543
1605
  * What holds a sentence back on either end of a road with nowhere to end.
1544
1606
  * A page that can never show what it is for is not one to hand over: the
@@ -1,4 +1,4 @@
1
- //#region ../your-ai-workflow-firebase-os/node_modules/pdfjs-dist/legacy/build/pdf.mjs
1
+ //#region node_modules/pdfjs-dist/legacy/build/pdf.mjs
2
2
  var e = {
3
3
  9306(e, t, n) {
4
4
  var r = n(4901), i = n(6823), a = TypeError;