@businessdash/sdk 0.9.60

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 (268) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +899 -0
  3. package/dist/adapters-revalidate.d.ts +44 -0
  4. package/dist/adapters-revalidate.d.ts.map +1 -0
  5. package/dist/adapters-revalidate.js +68 -0
  6. package/dist/adapters-revalidate.js.map +1 -0
  7. package/dist/alpha.d.ts +21 -0
  8. package/dist/alpha.d.ts.map +1 -0
  9. package/dist/alpha.js +21 -0
  10. package/dist/alpha.js.map +1 -0
  11. package/dist/analytics-core.d.ts +34 -0
  12. package/dist/analytics-core.d.ts.map +1 -0
  13. package/dist/analytics-core.js +138 -0
  14. package/dist/analytics-core.js.map +1 -0
  15. package/dist/analytics-server.d.ts +54 -0
  16. package/dist/analytics-server.d.ts.map +1 -0
  17. package/dist/analytics-server.js +78 -0
  18. package/dist/analytics-server.js.map +1 -0
  19. package/dist/attribution-logo.d.ts +2 -0
  20. package/dist/attribution-logo.d.ts.map +1 -0
  21. package/dist/attribution-logo.js +5 -0
  22. package/dist/attribution-logo.js.map +1 -0
  23. package/dist/auth-handler.d.ts +92 -0
  24. package/dist/auth-handler.d.ts.map +1 -0
  25. package/dist/auth-handler.js +277 -0
  26. package/dist/auth-handler.js.map +1 -0
  27. package/dist/biab-forms.css +484 -0
  28. package/dist/cli.d.ts +46 -0
  29. package/dist/cli.d.ts.map +1 -0
  30. package/dist/cli.js +1824 -0
  31. package/dist/cli.js.map +1 -0
  32. package/dist/client.d.ts +1681 -0
  33. package/dist/client.d.ts.map +1 -0
  34. package/dist/client.js +2845 -0
  35. package/dist/client.js.map +1 -0
  36. package/dist/collections.d.ts +13 -0
  37. package/dist/collections.d.ts.map +1 -0
  38. package/dist/collections.js +13 -0
  39. package/dist/collections.js.map +1 -0
  40. package/dist/contracts.d.ts +14609 -0
  41. package/dist/contracts.d.ts.map +1 -0
  42. package/dist/contracts.js +2428 -0
  43. package/dist/contracts.js.map +1 -0
  44. package/dist/data-model-schema.d.ts +962 -0
  45. package/dist/data-model-schema.d.ts.map +1 -0
  46. package/dist/data-model-schema.js +2295 -0
  47. package/dist/data-model-schema.js.map +1 -0
  48. package/dist/distribution.d.ts +38 -0
  49. package/dist/distribution.d.ts.map +1 -0
  50. package/dist/distribution.js +61 -0
  51. package/dist/distribution.js.map +1 -0
  52. package/dist/element.d.ts +121 -0
  53. package/dist/element.d.ts.map +1 -0
  54. package/dist/element.js +276 -0
  55. package/dist/element.js.map +1 -0
  56. package/dist/enums.d.ts +25 -0
  57. package/dist/enums.d.ts.map +1 -0
  58. package/dist/enums.js +38 -0
  59. package/dist/enums.js.map +1 -0
  60. package/dist/errors.d.ts +195 -0
  61. package/dist/errors.d.ts.map +1 -0
  62. package/dist/errors.js +188 -0
  63. package/dist/errors.js.map +1 -0
  64. package/dist/forms-core/autocomplete.d.ts +37 -0
  65. package/dist/forms-core/autocomplete.d.ts.map +1 -0
  66. package/dist/forms-core/autocomplete.js +82 -0
  67. package/dist/forms-core/autocomplete.js.map +1 -0
  68. package/dist/forms-core/business-function.d.ts +61 -0
  69. package/dist/forms-core/business-function.d.ts.map +1 -0
  70. package/dist/forms-core/business-function.js +149 -0
  71. package/dist/forms-core/business-function.js.map +1 -0
  72. package/dist/forms-core/calculation.d.ts +72 -0
  73. package/dist/forms-core/calculation.d.ts.map +1 -0
  74. package/dist/forms-core/calculation.js +103 -0
  75. package/dist/forms-core/calculation.js.map +1 -0
  76. package/dist/forms-core/controller.d.ts +249 -0
  77. package/dist/forms-core/controller.d.ts.map +1 -0
  78. package/dist/forms-core/controller.js +590 -0
  79. package/dist/forms-core/controller.js.map +1 -0
  80. package/dist/forms-core/elements.d.ts +44 -0
  81. package/dist/forms-core/elements.d.ts.map +1 -0
  82. package/dist/forms-core/elements.js +68 -0
  83. package/dist/forms-core/elements.js.map +1 -0
  84. package/dist/forms-core/email-domains.d.ts +10 -0
  85. package/dist/forms-core/email-domains.d.ts.map +1 -0
  86. package/dist/forms-core/email-domains.js +69 -0
  87. package/dist/forms-core/email-domains.js.map +1 -0
  88. package/dist/forms-core/file-rules.d.ts +51 -0
  89. package/dist/forms-core/file-rules.d.ts.map +1 -0
  90. package/dist/forms-core/file-rules.js +105 -0
  91. package/dist/forms-core/file-rules.js.map +1 -0
  92. package/dist/forms-core/formula.d.ts +114 -0
  93. package/dist/forms-core/formula.d.ts.map +1 -0
  94. package/dist/forms-core/formula.js +1170 -0
  95. package/dist/forms-core/formula.js.map +1 -0
  96. package/dist/forms-core/index.d.ts +24 -0
  97. package/dist/forms-core/index.d.ts.map +1 -0
  98. package/dist/forms-core/index.js +28 -0
  99. package/dist/forms-core/index.js.map +1 -0
  100. package/dist/forms-core/units.d.ts +49 -0
  101. package/dist/forms-core/units.d.ts.map +1 -0
  102. package/dist/forms-core/units.js +255 -0
  103. package/dist/forms-core/units.js.map +1 -0
  104. package/dist/forms-core/us-states.d.ts +14 -0
  105. package/dist/forms-core/us-states.d.ts.map +1 -0
  106. package/dist/forms-core/us-states.js +66 -0
  107. package/dist/forms-core/us-states.js.map +1 -0
  108. package/dist/forms-core/validation.d.ts +266 -0
  109. package/dist/forms-core/validation.d.ts.map +1 -0
  110. package/dist/forms-core/validation.js +850 -0
  111. package/dist/forms-core/validation.js.map +1 -0
  112. package/dist/forms.d.ts +19 -0
  113. package/dist/forms.d.ts.map +1 -0
  114. package/dist/forms.js +29 -0
  115. package/dist/forms.js.map +1 -0
  116. package/dist/gallery-types.d.ts +32 -0
  117. package/dist/gallery-types.d.ts.map +1 -0
  118. package/dist/gallery-types.js +2 -0
  119. package/dist/gallery-types.js.map +1 -0
  120. package/dist/graphql.d.ts +97 -0
  121. package/dist/graphql.d.ts.map +1 -0
  122. package/dist/graphql.js +212 -0
  123. package/dist/graphql.js.map +1 -0
  124. package/dist/index.cjs +19448 -0
  125. package/dist/index.d.cts +19 -0
  126. package/dist/index.d.mts +19 -0
  127. package/dist/index.d.ts +19 -0
  128. package/dist/index.d.ts.map +1 -0
  129. package/dist/index.js +20 -0
  130. package/dist/index.js.map +1 -0
  131. package/dist/marketing-schema.d.ts +216 -0
  132. package/dist/marketing-schema.d.ts.map +1 -0
  133. package/dist/marketing-schema.js +200 -0
  134. package/dist/marketing-schema.js.map +1 -0
  135. package/dist/mcp.d.ts +42 -0
  136. package/dist/mcp.d.ts.map +1 -0
  137. package/dist/mcp.js +87 -0
  138. package/dist/mcp.js.map +1 -0
  139. package/dist/native.d.ts +45 -0
  140. package/dist/native.d.ts.map +1 -0
  141. package/dist/native.js +43 -0
  142. package/dist/native.js.map +1 -0
  143. package/dist/next-revalidate.d.ts +43 -0
  144. package/dist/next-revalidate.d.ts.map +1 -0
  145. package/dist/next-revalidate.js +84 -0
  146. package/dist/next-revalidate.js.map +1 -0
  147. package/dist/parallel-pages.d.ts +102 -0
  148. package/dist/parallel-pages.d.ts.map +1 -0
  149. package/dist/parallel-pages.js +108 -0
  150. package/dist/parallel-pages.js.map +1 -0
  151. package/dist/payment-icons.d.ts +66 -0
  152. package/dist/payment-icons.d.ts.map +1 -0
  153. package/dist/payment-icons.js +160 -0
  154. package/dist/payment-icons.js.map +1 -0
  155. package/dist/proxy.d.ts +67 -0
  156. package/dist/proxy.d.ts.map +1 -0
  157. package/dist/proxy.js +97 -0
  158. package/dist/proxy.js.map +1 -0
  159. package/dist/react-analytics.d.ts +39 -0
  160. package/dist/react-analytics.d.ts.map +1 -0
  161. package/dist/react-analytics.js +59 -0
  162. package/dist/react-analytics.js.map +1 -0
  163. package/dist/react-attribution.d.ts +99 -0
  164. package/dist/react-attribution.d.ts.map +1 -0
  165. package/dist/react-attribution.js +52 -0
  166. package/dist/react-attribution.js.map +1 -0
  167. package/dist/react-marketing.d.ts +181 -0
  168. package/dist/react-marketing.d.ts.map +1 -0
  169. package/dist/react-marketing.js +215 -0
  170. package/dist/react-marketing.js.map +1 -0
  171. package/dist/react.d.ts +727 -0
  172. package/dist/react.d.ts.map +1 -0
  173. package/dist/react.js +2418 -0
  174. package/dist/react.js.map +1 -0
  175. package/dist/reserved-paths.d.ts +24 -0
  176. package/dist/reserved-paths.d.ts.map +1 -0
  177. package/dist/reserved-paths.js +60 -0
  178. package/dist/reserved-paths.js.map +1 -0
  179. package/dist/revalidate-verify.d.ts +30 -0
  180. package/dist/revalidate-verify.d.ts.map +1 -0
  181. package/dist/revalidate-verify.js +74 -0
  182. package/dist/revalidate-verify.js.map +1 -0
  183. package/dist/sdk.d.ts +678 -0
  184. package/dist/sdk.d.ts.map +1 -0
  185. package/dist/sdk.js +801 -0
  186. package/dist/sdk.js.map +1 -0
  187. package/dist/seo.d.ts +218 -0
  188. package/dist/seo.d.ts.map +1 -0
  189. package/dist/seo.js +309 -0
  190. package/dist/seo.js.map +1 -0
  191. package/dist/socials.d.ts +47 -0
  192. package/dist/socials.d.ts.map +1 -0
  193. package/dist/socials.js +172 -0
  194. package/dist/socials.js.map +1 -0
  195. package/dist/static.d.ts +14 -0
  196. package/dist/static.d.ts.map +1 -0
  197. package/dist/static.js +14 -0
  198. package/dist/static.js.map +1 -0
  199. package/dist/url-pattern.d.ts +47 -0
  200. package/dist/url-pattern.d.ts.map +1 -0
  201. package/dist/url-pattern.js +124 -0
  202. package/dist/url-pattern.js.map +1 -0
  203. package/dist/vanilla.d.ts +77 -0
  204. package/dist/vanilla.d.ts.map +1 -0
  205. package/dist/vanilla.js +903 -0
  206. package/dist/vanilla.js.map +1 -0
  207. package/openapi.json +13779 -0
  208. package/package.json +204 -0
  209. package/src/adapters-revalidate.ts +88 -0
  210. package/src/alpha.ts +89 -0
  211. package/src/analytics-core.ts +175 -0
  212. package/src/analytics-server.ts +99 -0
  213. package/src/angular/biab-form.component.ts +1443 -0
  214. package/src/angular/index.ts +26 -0
  215. package/src/attribution-logo.ts +5 -0
  216. package/src/auth-handler.ts +352 -0
  217. package/src/cli.ts +2517 -0
  218. package/src/client.ts +3578 -0
  219. package/src/collections.ts +101 -0
  220. package/src/contracts.ts +3390 -0
  221. package/src/data-model-schema.ts +4042 -0
  222. package/src/distribution.ts +73 -0
  223. package/src/element.ts +321 -0
  224. package/src/enums.ts +65 -0
  225. package/src/errors.ts +338 -0
  226. package/src/forms-core/autocomplete.ts +97 -0
  227. package/src/forms-core/business-function.ts +209 -0
  228. package/src/forms-core/calculation.ts +167 -0
  229. package/src/forms-core/controller.ts +922 -0
  230. package/src/forms-core/elements.ts +86 -0
  231. package/src/forms-core/email-domains.ts +68 -0
  232. package/src/forms-core/file-rules.ts +123 -0
  233. package/src/forms-core/formula.ts +1339 -0
  234. package/src/forms-core/index.ts +122 -0
  235. package/src/forms-core/units.ts +308 -0
  236. package/src/forms-core/us-states.ts +68 -0
  237. package/src/forms-core/validation.ts +1037 -0
  238. package/src/forms.ts +63 -0
  239. package/src/gallery-types.ts +31 -0
  240. package/src/graphql.ts +295 -0
  241. package/src/index.ts +505 -0
  242. package/src/marketing-schema.ts +395 -0
  243. package/src/mcp.ts +108 -0
  244. package/src/native.ts +73 -0
  245. package/src/next-revalidate.ts +124 -0
  246. package/src/parallel-pages.ts +192 -0
  247. package/src/payment-icons.ts +205 -0
  248. package/src/proxy.ts +173 -0
  249. package/src/qwik.tsx +1234 -0
  250. package/src/react-analytics.tsx +76 -0
  251. package/src/react-attribution.tsx +192 -0
  252. package/src/react-marketing.tsx +338 -0
  253. package/src/react.tsx +5495 -0
  254. package/src/reserved-paths.ts +65 -0
  255. package/src/revalidate-verify.ts +98 -0
  256. package/src/sdk.ts +1671 -0
  257. package/src/seo.ts +488 -0
  258. package/src/socials.ts +230 -0
  259. package/src/solid.tsx +1466 -0
  260. package/src/static.ts +21 -0
  261. package/src/styles/biab-forms.css +484 -0
  262. package/src/svelte/BiabForm.svelte +1069 -0
  263. package/src/svelte/context.ts +57 -0
  264. package/src/svelte/index.ts +79 -0
  265. package/src/url-pattern.ts +153 -0
  266. package/src/vanilla.ts +1290 -0
  267. package/src/vue/BiabForm.vue +1538 -0
  268. package/src/vue/index.ts +119 -0
package/src/static.ts ADDED
@@ -0,0 +1,21 @@
1
+ /**
2
+ * `@businessdash/sdk/static` — static data utilities and type helpers.
3
+ *
4
+ * Use this entrypoint for type‑safe enum / choice declarations and any other
5
+ * compile‑time static data definitions that ship with your collections.
6
+ *
7
+ * ```ts
8
+ * import { Enums } from "@businessdash/sdk/static";
9
+ *
10
+ * const Status = Enums(["active", "inactive"] as const);
11
+ * ```
12
+ */
13
+
14
+ export {
15
+ type DefineEnums,
16
+ type Enum,
17
+ type EnumEntry,
18
+ Enums,
19
+ type InferEnum,
20
+ type InferEnumValues,
21
+ } from "./enums.js";
@@ -0,0 +1,484 @@
1
+ /*
2
+ * @businessdash/sdk — optional form styles.
3
+ *
4
+ * Styles the parts of `<BiabForm>` that benefit from non-trivial layout: the
5
+ * date-range / slot pickers, the file-upload field, and the multi-step progress
6
+ * header (numbered-steps and bar variants). Base field/label/input chrome is
7
+ * left to the host app so the form adopts your design. Import once:
8
+ *
9
+ * import "@businessdash/sdk/biab-forms.css";
10
+ *
11
+ * It is theme-aware: it reads the standard shadcn/COSS CSS variables
12
+ * (--primary, --muted, --border, --radius-md, …) and falls back to the COSS
13
+ * light-theme defaults when they aren't defined, so it looks right out of the box
14
+ * and adopts your theme when present. Containers are intentionally
15
+ * background-LESS — add a surface fill in your own app if you want one.
16
+ */
17
+
18
+ .biab-daterange {
19
+ --biab-cell-size: 2rem;
20
+ --biab-radius: var(--radius-md, 0.375rem);
21
+ --biab-primary: var(--primary, oklch(0.205 0 0));
22
+ --biab-primary-fg: var(--primary-foreground, oklch(0.985 0 0));
23
+ --biab-muted: var(--muted, oklch(0.97 0 0));
24
+ --biab-muted-fg: var(--muted-foreground, oklch(0.556 0 0));
25
+ --biab-border: var(--border, oklch(0.922 0 0));
26
+ --biab-popover: var(--popover, oklch(1 0 0));
27
+ --biab-popover-fg: var(--popover-foreground, oklch(0.145 0 0));
28
+ --biab-accent: var(--accent, oklch(0.97 0 0));
29
+ position: relative;
30
+ }
31
+
32
+ /* Trigger — mirrors the COSS outline button (w-full justify-start). */
33
+ .biab-daterange__trigger {
34
+ display: flex;
35
+ width: 100%;
36
+ align-items: center;
37
+ gap: 0.5rem;
38
+ height: 2.25rem;
39
+ padding: 0 0.75rem;
40
+ border: 1px solid var(--biab-border);
41
+ border-radius: var(--biab-radius);
42
+ background: transparent;
43
+ color: inherit;
44
+ font-size: 0.875rem;
45
+ text-align: left;
46
+ cursor: pointer;
47
+ }
48
+ .biab-daterange__trigger:hover {
49
+ background: var(--biab-accent);
50
+ }
51
+
52
+ /* Popover card — matches the COSS popover (bg-popover, border, rounded, shadow). */
53
+ .biab-daterange__popover {
54
+ top: calc(100% + 4px);
55
+ left: 0;
56
+ width: max-content;
57
+ padding: 0.75rem;
58
+ border: 1px solid var(--biab-border);
59
+ border-radius: calc(var(--biab-radius) + 0.25rem);
60
+ background: var(--biab-popover);
61
+ color: var(--biab-popover-fg);
62
+ box-shadow:
63
+ 0 4px 6px -1px rgb(0 0 0 / 0.1),
64
+ 0 2px 4px -2px rgb(0 0 0 / 0.1);
65
+ }
66
+
67
+ /* Month nav — ghost prev/next flanking a centered caption. */
68
+ .biab-daterange__nav {
69
+ display: flex;
70
+ align-items: center;
71
+ justify-content: space-between;
72
+ gap: 0.25rem;
73
+ margin-bottom: 0.5rem;
74
+ }
75
+ .biab-daterange__navbtn {
76
+ display: inline-flex;
77
+ align-items: center;
78
+ justify-content: center;
79
+ width: var(--biab-cell-size);
80
+ height: var(--biab-cell-size);
81
+ padding: 0;
82
+ border: none;
83
+ border-radius: var(--biab-radius);
84
+ background: transparent;
85
+ color: inherit;
86
+ font-size: 1rem;
87
+ line-height: 1;
88
+ cursor: pointer;
89
+ }
90
+ .biab-daterange__navbtn:hover {
91
+ background: var(--biab-accent);
92
+ }
93
+ .biab-daterange__title {
94
+ flex: 1;
95
+ text-align: center;
96
+ font-size: 0.875rem;
97
+ font-weight: 500;
98
+ user-select: none;
99
+ }
100
+
101
+ /* Day grid. */
102
+ .biab-daterange__grid {
103
+ display: grid;
104
+ grid-template-columns: repeat(7, var(--biab-cell-size));
105
+ gap: 0;
106
+ }
107
+ .biab-daterange__dow {
108
+ display: flex;
109
+ align-items: center;
110
+ justify-content: center;
111
+ height: var(--biab-cell-size);
112
+ font-size: 0.8rem;
113
+ font-weight: 400;
114
+ color: var(--biab-muted-fg);
115
+ user-select: none;
116
+ }
117
+ .biab-daterange__blank {
118
+ width: var(--biab-cell-size);
119
+ height: var(--biab-cell-size);
120
+ }
121
+ .biab-daterange__day {
122
+ width: var(--biab-cell-size);
123
+ height: var(--biab-cell-size);
124
+ border: none;
125
+ border-radius: var(--biab-radius);
126
+ background: transparent;
127
+ color: inherit;
128
+ font-size: 0.875rem;
129
+ line-height: 1;
130
+ cursor: pointer;
131
+ user-select: none;
132
+ }
133
+ .biab-daterange__day:hover {
134
+ background: var(--biab-accent);
135
+ }
136
+
137
+ /* today (when not selected) — matches COSS `today` (bg-muted). */
138
+ .biab-daterange__day[data-today]:not([data-selected-single]):not(
139
+ [data-range-start]
140
+ ):not([data-range-end]):not([data-range-middle]) {
141
+ background: var(--biab-muted);
142
+ font-weight: 500;
143
+ }
144
+
145
+ /* Range middle — muted fill, square corners (connects the pill). */
146
+ .biab-daterange__day[data-range-middle] {
147
+ background: var(--biab-muted);
148
+ color: var(--biab-popover-fg);
149
+ border-radius: 0;
150
+ }
151
+
152
+ /* Range start / end + single selection — solid primary, rounded on the outer
153
+ * edge so start→end reads as one connected pill (exactly like COSS). */
154
+ .biab-daterange__day[data-range-start],
155
+ .biab-daterange__day[data-range-end],
156
+ .biab-daterange__day[data-selected-single] {
157
+ background: var(--biab-primary);
158
+ color: var(--biab-primary-fg);
159
+ }
160
+ .biab-daterange__day[data-range-start] {
161
+ border-top-right-radius: 0;
162
+ border-bottom-right-radius: 0;
163
+ }
164
+ .biab-daterange__day[data-range-end] {
165
+ border-top-left-radius: 0;
166
+ border-bottom-left-radius: 0;
167
+ }
168
+ .biab-daterange__day[data-range-start]:hover,
169
+ .biab-daterange__day[data-range-end]:hover,
170
+ .biab-daterange__day[data-selected-single]:hover {
171
+ background: var(--biab-primary);
172
+ }
173
+
174
+ /* ── Auto-schedule (instant booking) slot picker ─────────────────────────── */
175
+ .biab-field__schedule-auto {
176
+ display: flex;
177
+ flex-direction: column;
178
+ gap: 0.75rem;
179
+ max-height: 18rem;
180
+ overflow-y: auto;
181
+ }
182
+ .biab-field__schedule-day-label {
183
+ margin: 0 0 0.25rem;
184
+ font-size: 0.8125rem;
185
+ font-weight: 600;
186
+ }
187
+ .biab-field__schedule-times {
188
+ display: flex;
189
+ flex-wrap: wrap;
190
+ gap: 0.375rem;
191
+ }
192
+ .biab-field__schedule-slot {
193
+ border: 1px solid var(--biab-border, #d4d4d8);
194
+ background: var(--biab-card, #fff);
195
+ border-radius: 9999px;
196
+ padding: 0.25rem 0.75rem;
197
+ font-size: 0.875rem;
198
+ cursor: pointer;
199
+ }
200
+ .biab-field__schedule-slot:hover {
201
+ background: var(--biab-muted, #f4f4f5);
202
+ }
203
+ .biab-field__schedule-slot[data-selected="true"] {
204
+ background: var(--biab-primary);
205
+ color: var(--biab-primary-fg);
206
+ border-color: var(--biab-primary);
207
+ }
208
+ .biab-field__schedule-hint {
209
+ font-size: 0.875rem;
210
+ color: var(--biab-muted-fg, #71717a);
211
+ }
212
+
213
+ /* ── Shared theme tokens for the components below ─────────────────────────── */
214
+ /* Same theme-aware pattern as `.biab-daterange`: read the host's shadcn/COSS
215
+ * vars, fall back to neutral light defaults. Containers are intentionally
216
+ * background-LESS — the host app adds a surface fill if it wants one. */
217
+ .biab-field__files,
218
+ .biab-field__schedule,
219
+ .biab-progress {
220
+ --biab-radius: var(--radius-md, 0.5rem);
221
+ --biab-primary: var(--primary, oklch(0.205 0 0));
222
+ --biab-primary-fg: var(--primary-foreground, oklch(0.985 0 0));
223
+ --biab-muted: var(--muted, oklch(0.97 0 0));
224
+ --biab-muted-fg: var(--muted-foreground, oklch(0.556 0 0));
225
+ --biab-border: var(--border, oklch(0.922 0 0));
226
+ --biab-accent: var(--accent, oklch(0.97 0 0));
227
+ }
228
+
229
+ /* ── File upload ─────────────────────────────────────────────────────────── */
230
+ .biab-field__files {
231
+ display: flex;
232
+ flex-direction: column;
233
+ gap: 0.5rem;
234
+ }
235
+ /* The picker — a dashed drop-zone box. No background fill by default.
236
+ * `appearance: auto` + the text resets defend the NATIVE file control against a
237
+ * host app's global input styling (e.g. `appearance: none` / letter-spacing),
238
+ * which otherwise glitches the "Choose file" text and its layout in Safari. */
239
+ .biab-field__fileinput {
240
+ -webkit-appearance: auto;
241
+ appearance: auto;
242
+ box-sizing: border-box;
243
+ display: block;
244
+ width: 100%;
245
+ max-width: 100%;
246
+ padding: 0.75rem;
247
+ border: 1.5px dashed var(--biab-border);
248
+ border-radius: var(--biab-radius);
249
+ background: transparent;
250
+ color: var(--biab-muted-fg);
251
+ font-size: 0.875rem;
252
+ line-height: normal;
253
+ letter-spacing: normal;
254
+ cursor: pointer;
255
+ transition: border-color 0.15s ease;
256
+ }
257
+ .biab-field__fileinput:hover:not(:disabled) {
258
+ border-color: var(--biab-primary);
259
+ }
260
+ .biab-field__fileinput:disabled {
261
+ opacity: 0.55;
262
+ cursor: not-allowed;
263
+ }
264
+ /* The native "choose file" control — styled as an obvious button (it's a
265
+ * control, not a container, so it carries a fill). */
266
+ .biab-field__fileinput::file-selector-button {
267
+ margin-right: 0.75rem;
268
+ padding: 0.35rem 0.75rem;
269
+ border: none;
270
+ border-radius: calc(var(--biab-radius) - 0.15rem);
271
+ background: var(--biab-primary);
272
+ color: var(--biab-primary-fg);
273
+ font-size: 0.8125rem;
274
+ font-weight: 600;
275
+ cursor: pointer;
276
+ }
277
+ /* Selected-file rows — bordered, no fill. */
278
+ .biab-field__filelist {
279
+ list-style: none;
280
+ margin: 0;
281
+ padding: 0;
282
+ display: flex;
283
+ flex-direction: column;
284
+ gap: 0.375rem;
285
+ }
286
+ .biab-field__fileitem {
287
+ display: flex;
288
+ align-items: center;
289
+ gap: 0.5rem;
290
+ padding: 0.4rem 0.625rem;
291
+ border: 1px solid var(--biab-border);
292
+ border-radius: var(--biab-radius);
293
+ background: transparent;
294
+ font-size: 0.8125rem;
295
+ }
296
+ .biab-field__filename {
297
+ flex: 1;
298
+ overflow: hidden;
299
+ text-overflow: ellipsis;
300
+ white-space: nowrap;
301
+ }
302
+ .biab-field__filepending {
303
+ flex-shrink: 0;
304
+ color: var(--biab-muted-fg);
305
+ font-size: 0.75rem;
306
+ white-space: nowrap;
307
+ }
308
+ .biab-field__fileremove {
309
+ flex-shrink: 0;
310
+ display: inline-flex;
311
+ align-items: center;
312
+ justify-content: center;
313
+ width: 1.25rem;
314
+ height: 1.25rem;
315
+ border: none;
316
+ border-radius: 9999px;
317
+ background: transparent;
318
+ color: var(--biab-muted-fg);
319
+ font-size: 1.1rem;
320
+ line-height: 1;
321
+ cursor: pointer;
322
+ transition: color 0.15s ease;
323
+ }
324
+ .biab-field__fileremove:hover {
325
+ color: var(--biab-primary);
326
+ }
327
+
328
+ /* ── Progress header — steps ─────────────────────────────────────────────── */
329
+ .biab-progress {
330
+ margin-bottom: 1.25rem;
331
+ }
332
+ .biab-progress--steps {
333
+ display: flex;
334
+ align-items: center;
335
+ gap: 0.25rem;
336
+ }
337
+ .biab-progress__line {
338
+ flex: 1;
339
+ height: 2px;
340
+ border-radius: 1px;
341
+ background: var(--biab-border);
342
+ }
343
+ .biab-progress__line--done {
344
+ background: var(--biab-primary);
345
+ }
346
+ .biab-progress__step {
347
+ display: inline-flex;
348
+ align-items: center;
349
+ gap: 0.4rem;
350
+ padding: 0.25rem 0.4rem;
351
+ border: none;
352
+ background: transparent;
353
+ color: var(--biab-muted-fg);
354
+ font-size: 0.8125rem;
355
+ cursor: pointer;
356
+ }
357
+ /* The step number/check — a small indicator circle (filled only once done). */
358
+ .biab-progress__num {
359
+ display: inline-flex;
360
+ align-items: center;
361
+ justify-content: center;
362
+ flex-shrink: 0;
363
+ width: 1.5rem;
364
+ height: 1.5rem;
365
+ border-radius: 9999px;
366
+ border: 1.5px solid var(--biab-border);
367
+ background: transparent;
368
+ color: var(--biab-muted-fg);
369
+ font-size: 0.8125rem;
370
+ font-weight: 600;
371
+ }
372
+ .biab-progress__step--current .biab-progress__num {
373
+ border-color: var(--biab-primary);
374
+ color: var(--biab-primary);
375
+ }
376
+ .biab-progress__step--done .biab-progress__num {
377
+ border-color: var(--biab-primary);
378
+ background: var(--biab-primary);
379
+ color: var(--biab-primary-fg);
380
+ }
381
+ .biab-progress__title {
382
+ white-space: nowrap;
383
+ }
384
+ .biab-progress__step--current .biab-progress__title {
385
+ color: var(--biab-primary);
386
+ font-weight: 600;
387
+ }
388
+ /* Compact: drop step labels on narrow viewports so the row doesn't wrap. */
389
+ @media (max-width: 520px) {
390
+ .biab-progress__title {
391
+ display: none;
392
+ }
393
+ }
394
+
395
+ /* ── Progress header — bar ───────────────────────────────────────────────── */
396
+ .biab-progress--bar {
397
+ display: flex;
398
+ flex-direction: column;
399
+ gap: 0.375rem;
400
+ }
401
+ .biab-progress__count {
402
+ font-size: 0.8125rem;
403
+ font-weight: 500;
404
+ color: var(--biab-muted-fg);
405
+ }
406
+ /* The track is intrinsic to a progress bar (it shows the unfilled portion), so
407
+ * it keeps a muted fill — it's the control, not a layout container. */
408
+ .biab-progress__track {
409
+ width: 100%;
410
+ height: 0.5rem;
411
+ border-radius: 9999px;
412
+ background: var(--biab-muted);
413
+ overflow: hidden;
414
+ }
415
+ .biab-progress__fill {
416
+ height: 100%;
417
+ border-radius: 9999px;
418
+ background: var(--biab-primary);
419
+ transition: width 0.3s ease;
420
+ }
421
+
422
+ /* ── Availability (capture mode) — ASAP + day/time chips ──────────────────── */
423
+ .biab-field__schedule {
424
+ display: flex;
425
+ flex-direction: column;
426
+ gap: 0.875rem;
427
+ }
428
+ .biab-field__schedule-asap {
429
+ display: flex;
430
+ align-items: center;
431
+ gap: 0.5rem;
432
+ cursor: pointer;
433
+ }
434
+ .biab-field__schedule-asap input {
435
+ width: 1rem;
436
+ height: 1rem;
437
+ accent-color: var(--biab-primary);
438
+ }
439
+ .biab-field__schedule-group {
440
+ display: flex;
441
+ flex-direction: column;
442
+ gap: 0.4rem;
443
+ }
444
+ .biab-field__schedule-label {
445
+ font-size: 0.8125rem;
446
+ font-weight: 600;
447
+ color: var(--biab-muted-fg);
448
+ }
449
+ .biab-field__schedule-chips {
450
+ display: flex;
451
+ flex-wrap: wrap;
452
+ gap: 0.4rem;
453
+ }
454
+
455
+ /* Toggle chips (day/time choices, and any `biab-field__chip` elsewhere). The
456
+ * selected state (`--on`) is a solid primary fill so a pick is unmistakable. */
457
+ .biab-field__chip {
458
+ -webkit-appearance: none;
459
+ appearance: none;
460
+ padding: 0.35rem 0.85rem;
461
+ border: 1px solid var(--biab-border);
462
+ border-radius: 9999px;
463
+ background: transparent;
464
+ color: inherit;
465
+ font-size: 0.875rem;
466
+ line-height: 1.2;
467
+ cursor: pointer;
468
+ transition:
469
+ background 0.15s ease,
470
+ border-color 0.15s ease,
471
+ color 0.15s ease;
472
+ }
473
+ .biab-field__chip:hover {
474
+ border-color: var(--biab-primary);
475
+ background: var(--biab-accent);
476
+ }
477
+ .biab-field__chip--on {
478
+ border-color: var(--biab-primary);
479
+ background: var(--biab-primary);
480
+ color: var(--biab-primary-fg);
481
+ }
482
+ .biab-field__chip--on:hover {
483
+ background: var(--biab-primary);
484
+ }