@conscia-labs/design-system 0.3.2 → 0.3.4

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.
package/README.md CHANGED
@@ -273,14 +273,50 @@ export function ProductShell({
273
273
 
274
274
  ### Typography and font loading
275
275
 
276
- The design system declares the open-source Inter variable font as a runtime
277
- dependency and loads it through its CSS entry points. Inter is distributed
278
- under the SIL Open Font License 1.1 and supports the system's fractional
279
- weight values. Consumers should import the published `tailwind.css` or
280
- `styles.css` entry and should not add a separate Saans or Inter download.
276
+ The design system declares the open-source Source Sans 3 variable font as a
277
+ runtime dependency and loads it through its CSS entry points. Consumers should
278
+ import the published `tailwind.css` or `styles.css` entry and should not add a
279
+ separate font download. The shared hierarchy uses a deliberate `400 / 500 /
280
+ 600` weight ladder; applications should avoid replacing it with arbitrary
281
+ fractional weights.
281
282
  Applications may override `--font-sans` only when a deliberate product-specific
282
283
  type decision has been made.
283
284
 
285
+ ### Typography hierarchy
286
+
287
+ Use the shared type scale by role:
288
+
289
+ - `--ds-display-title` is the responsive display or welcome scale for
290
+ high-level entry points.
291
+ - `--ds-page-title` is for page-level headings and `PageHeader` titles.
292
+ - `--ds-section-title` is for sections within a page or resource detail.
293
+ - `--ds-body` is the default application body size.
294
+ - `--ds-metadata` is for supporting context such as descriptions, timestamps,
295
+ counts, and secondary organization text.
296
+ - `--ds-menu-label-size` is intentionally compact and is reserved for menu
297
+ labels and compact option descriptions, not normal body copy.
298
+
299
+ Prefer these tokens over local `clamp()`, pixel, or one-off font-size values.
300
+ Product-specific layout styles may still control wrapping, maximum width, or
301
+ composition when the content requires it.
302
+
303
+ Sidebar section labels are intentionally smaller than navigation rows and
304
+ slightly more weighted: comfortable density uses a `12px / 600 / 16px`
305
+ contract with restrained tracking, while compact density reduces the size
306
+ without changing the role. Keep navigation labels at the shared row size and
307
+ weight them only when active.
308
+
309
+ ### BrandIcon
310
+
311
+ `BrandIcon` is the shared symbol-only Conscia mark. It embeds the supplied
312
+ 240×240 symbol geometry so published consumers do not need to manage an asset
313
+ path. The default treatment uses the existing foreground role in light mode
314
+ and the existing white brand treatment in dark mode. Use it for symbol-only
315
+ lockups, collapsed navigation identity, and other shared brand placements.
316
+
317
+ The icon is decorative by default. Add an `aria-label` when the mark conveys
318
+ meaning without adjacent text, and use `className` to control its size.
319
+
284
320
  ### Sidebar variants and semantic surfaces
285
321
 
286
322
  `AppSidebar` keeps the historical dark treatment by default. Consumers that
@@ -315,6 +351,13 @@ are intentionally theme-aware: the base uses the muted surface in light mode
315
351
  and the raised surface in dark mode; hover reverses that relationship so the
316
352
  control remains visibly interactive without introducing a new color palette.
317
353
 
354
+ Button variants provide their foreground role explicitly: primary, secondary,
355
+ destructive, outline, ghost, and link content do not depend on an ancestor's
356
+ text color. The destructive variant uses the existing dark danger background
357
+ and foreground pair in dark mode because the bright danger role is not suitable
358
+ for white text there. Consumer classes remain the final override when a
359
+ product-specific treatment is intentional.
360
+
318
361
  `SidebarSearch` owns only the trigger, expanded field, Escape handling, and
319
362
  focus handoff. Applications provide the query value and filtering behavior.
320
363
  `NavigationGroup` accepts an optional `count`; application-owned group labels
@@ -324,9 +367,21 @@ application-owned.
324
367
 
325
368
  The shell uses `--ds-topbar-height` as the shared chrome-height contract. The
326
369
  sidebar header aliases the historical `--ds-sidebar-header-height` token to the
327
- same value, so the two rails stay aligned. `SidebarTrigger` should be rendered
328
- as a child of `TopBar`, never inside `AppSidebar`; the topbar remains mounted
329
- when the sidebar enters collapsed or mobile states.
370
+ same value, so the two rails stay aligned. `TopBar` also owns shared horizontal
371
+ padding through its responsive `--ds-topbar-padding-x` tokens; applications
372
+ should not add a normal-use hardcoded height or padding override. Keep leading
373
+ and trailing actions inside the topbar so icons and labels share the same
374
+ vertical rhythm and visible focus treatment. `SidebarTrigger` should be
375
+ rendered as a child of `TopBar`, never inside `AppSidebar`; the topbar remains
376
+ mounted when the sidebar enters collapsed or mobile states.
377
+
378
+ Sidebar section labels use the field-label size with a restrained medium weight
379
+ and tracking. Navigation rows retain the shared comfortable/touch heights,
380
+ while `--ds-sidebar-item-gap`, `--ds-sidebar-label-gap`, and
381
+ `--ds-sidebar-group-gap` control list, label, and group rhythm. Use the shared
382
+ sidebar semantic utilities for surfaces, text, icons, borders, and focus rings;
383
+ keep conversation data, organization names, and product-specific row actions
384
+ application-owned.
330
385
 
331
386
  For migration, replace a consuming application's light-only `--sidebar-*`
332
387
  root override with `variant="auto"` on its shared `AppSidebar`. Remove
@@ -19,7 +19,7 @@ import {
19
19
  TableHead,
20
20
  TableHeader,
21
21
  TableRow
22
- } from "./chunk-JC7W5VB3.js";
22
+ } from "./chunk-ZCBZHRTV.js";
23
23
  import {
24
24
  cn
25
25
  } from "./chunk-JU5DQXFC.js";
@@ -156,15 +156,92 @@ function Badge({
156
156
  return /* @__PURE__ */ jsx3("span", { "data-slot": "badge", className: cn(badgeVariants({ variant, className })), ...props });
157
157
  }
158
158
 
159
+ // src/primitives/brand-icon.tsx
160
+ import { jsx as jsx4 } from "react/jsx-runtime";
161
+ var CONSCIA_SYMBOL_PATH = [
162
+ "M171.225 63.8139L173.637 66.1116L203.794 34.4551L201.382 32.1575L171.225 63.8139Z",
163
+ "M184.012 78.9693L185.769 81.8487L223.091 59.076L221.334 56.1966L184.012 78.9693Z",
164
+ "M192.436 96.8858L193.417 100.222L235.362 87.8847L234.381 84.5488L192.436 96.8858Z",
165
+ "M195.949 116.334L196.037 119.987L239.746 118.926L239.657 115.273L195.949 116.334Z",
166
+ "M194.341 135.989L193.42 139.796L235.913 150.084L236.835 146.277L194.341 135.989Z",
167
+ "M187.759 154.526L185.708 158.285L224.091 179.221L226.142 175.461L187.759 154.526Z",
168
+ "M176.683 170.712L173.394 174.165L205.05 204.322L208.34 200.868L176.683 170.712Z",
169
+ "M161.899 183.49L157.288 186.304L180.06 223.626L184.672 220.812L161.899 183.49Z",
170
+ "M144.425 192.058L138.472 193.809L150.809 235.754L156.762 234.003L144.425 192.058Z",
171
+ "M125.438 195.913L118.244 196.088L119.305 239.796L126.499 239.622L125.438 195.913Z",
172
+ "M106.176 194.873L98.0421 192.903L87.754 235.397L95.8882 237.366L106.176 194.873Z",
173
+ "M87.8408 189.056L79.3505 184.425L58.4147 222.808L66.905 227.439L87.8408 189.056Z",
174
+ "M71.5444 178.838L63.5819 171.253L33.4252 202.91L41.3878 210.495L71.5444 178.838Z",
175
+ "M58.2896 164.821L51.9185 154.379L14.5961 177.152L20.9672 187.593L58.2896 164.821Z",
176
+ "M48.9443 147.836L45.1912 135.075L3.24659 147.412L6.99972 160.173L48.9443 147.836Z",
177
+ "M44.1724 128.938L43.8283 114.759L0.119827 115.82L0.463868 129.998L44.1724 128.938Z",
178
+ "M44.3613 109.352L47.8648 94.8809L5.37116 84.5928L1.86766 99.0635L44.3613 109.352Z",
179
+ "M49.563 90.3812L56.9571 76.825L18.5742 55.8893L11.18 69.4455L49.563 90.3812Z",
180
+ "M59.4839 73.314L70.4267 61.8269L38.7702 31.6703L27.8274 43.1574L59.4839 73.314Z",
181
+ "M73.4951 59.3251L87.307 50.8976L64.5343 13.5752L50.7224 22.0027L73.4951 59.3251Z",
182
+ "M90.6772 49.3891L106.414 44.7604L94.0775 2.81575L78.3402 7.44453L90.6772 49.3891Z",
183
+ "M109.88 44.2086L126.426 43.8071L125.366 0.098614L108.82 0.500089L109.88 44.2086Z",
184
+ "M129.802 44.1632L145.967 48.0768L156.255 5.58318L140.09 1.66954L129.802 44.1632Z",
185
+ "M149.087 49.2798L163.709 57.2553L184.645 18.8723L170.023 10.8969L149.087 49.2798Z",
186
+ "M152.448 160.384L141.06 167.332L154.089 188.685L165.477 181.736L152.448 160.384Z",
187
+ "M140.881 167.41L128.103 171.168L135.161 195.165L147.939 191.407L140.881 167.41Z",
188
+ "M127.834 171.202L114.653 171.522L115.26 196.528L128.441 196.209L127.834 171.202Z",
189
+ "M114.192 171.456L101.624 168.413L95.738 192.724L108.306 195.767L114.192 171.456Z",
190
+ "M100.907 168.109L89.889 162.1L77.9114 184.059L88.9296 190.069L100.907 168.109Z",
191
+ "M88.9224 161.353L80.2035 153.047L62.9505 171.158L71.6694 179.464L88.9224 161.353Z",
192
+ "M79.1143 151.631L73.1721 141.893L51.8195 154.921L57.7617 164.66L79.1143 151.631Z",
193
+ "M72.2163 139.615L69.2075 129.385L45.2105 136.444L48.2193 146.673L72.2163 139.615Z",
194
+ "M68.7593 126.163L68.5209 116.339L43.5147 116.946L43.7531 126.77L68.7593 126.163Z",
195
+ "M69.0161 112.256L71.1176 103.576L46.8064 97.6899L44.7049 106.37L69.0161 112.256Z",
196
+ "M72.979 98.9209L76.8146 91.8888L54.8552 79.9112L51.0196 86.9432L72.979 98.9209Z",
197
+ "M80.3506 87.1414L85.2494 81.999L67.1383 64.746L62.2395 69.8884L80.3506 87.1414Z",
198
+ "M90.5762 77.7753L95.9023 74.5255L82.8738 53.1729L77.5476 56.4227L90.5762 77.7753Z",
199
+ "M102.889 71.4875L108.114 69.9508L101.056 45.9537L95.831 47.4905L102.889 71.4875Z",
200
+ "M116.381 68.7043L121.119 68.5894L120.513 43.5832L115.775 43.6981L116.381 68.7043Z",
201
+ "M130.08 69.5886L134.092 70.56L139.978 46.2488L135.966 45.2775L130.08 69.5886Z",
202
+ "M143.01 74.0389L146.183 75.7697L158.161 53.8103L154.988 52.0795L143.01 74.0389Z",
203
+ "M154.273 81.705L156.588 83.9108L173.841 65.7997L171.526 63.5939L154.273 81.705Z",
204
+ "M163.102 92.0197L164.599 94.4735L185.952 81.445L184.455 78.9911L163.102 92.0197Z",
205
+ "M168.91 104.243L169.655 106.775L193.652 99.7164L192.907 97.1844L168.91 104.243Z",
206
+ "M171.325 117.515L171.386 120.001L196.392 119.394L196.331 116.909L171.325 117.515Z",
207
+ "M170.21 130.922L169.644 133.264L193.955 139.15L194.522 136.808L170.21 130.922Z",
208
+ "M165.673 143.549L164.523 145.658L186.482 157.636L187.633 155.527L165.673 143.549Z",
209
+ "M158.032 154.558L156.355 156.318L174.467 173.571L176.143 171.811L158.032 154.558Z"
210
+ ].join(" ");
211
+ function BrandIcon({
212
+ "aria-label": ariaLabel,
213
+ className,
214
+ ...props
215
+ }) {
216
+ return /* @__PURE__ */ jsx4(
217
+ "svg",
218
+ {
219
+ "data-slot": "brand-icon",
220
+ xmlns: "http://www.w3.org/2000/svg",
221
+ width: "240",
222
+ height: "240",
223
+ viewBox: "0 0 240 240",
224
+ fill: "none",
225
+ focusable: "false",
226
+ role: ariaLabel ? "img" : void 0,
227
+ "aria-hidden": ariaLabel ? void 0 : true,
228
+ "aria-label": ariaLabel,
229
+ className: cn("size-6 shrink-0 text-foreground dark:text-white", className),
230
+ ...props,
231
+ children: /* @__PURE__ */ jsx4("path", { d: CONSCIA_SYMBOL_PATH, fill: "currentColor" })
232
+ }
233
+ );
234
+ }
235
+
159
236
  // src/primitives/switch.tsx
160
237
  import * as SwitchPrimitive from "@radix-ui/react-switch";
161
- import { jsx as jsx4 } from "react/jsx-runtime";
238
+ import { jsx as jsx5 } from "react/jsx-runtime";
162
239
  function Switch({
163
240
  className,
164
241
  size = "default",
165
242
  ...props
166
243
  }) {
167
- return /* @__PURE__ */ jsx4(
244
+ return /* @__PURE__ */ jsx5(
168
245
  SwitchPrimitive.Root,
169
246
  {
170
247
  "data-slot": "switch",
@@ -174,7 +251,7 @@ function Switch({
174
251
  className
175
252
  ),
176
253
  ...props,
177
- children: /* @__PURE__ */ jsx4(
254
+ children: /* @__PURE__ */ jsx5(
178
255
  SwitchPrimitive.Thumb,
179
256
  {
180
257
  "data-slot": "switch-thumb",
@@ -186,26 +263,26 @@ function Switch({
186
263
  }
187
264
 
188
265
  // src/primitives/textarea.tsx
189
- import { jsx as jsx5 } from "react/jsx-runtime";
266
+ import { jsx as jsx6 } from "react/jsx-runtime";
190
267
  function Textarea({ className, ...props }) {
191
- return /* @__PURE__ */ jsx5(
268
+ return /* @__PURE__ */ jsx6(
192
269
  "textarea",
193
270
  {
194
271
  "data-slot": "textarea",
195
- className: cn("min-h-28 w-full rounded-[var(--ds-field-control-radius)] border border-input bg-surface-control px-[var(--ds-field-control-padding-x)] py-3 text-sm outline-none transition-colors placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50", className),
272
+ className: cn("min-h-28 w-full rounded-[var(--ds-field-control-radius)] border border-input bg-surface-control px-[var(--ds-field-control-padding-x)] py-3 text-sm leading-5 outline-none transition-colors placeholder:text-sm placeholder:leading-5 placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50", className),
196
273
  ...props
197
274
  }
198
275
  );
199
276
  }
200
277
 
201
278
  // src/primitives/compat.tsx
202
- import { jsx as jsx6, jsxs } from "react/jsx-runtime";
279
+ import { jsx as jsx7, jsxs } from "react/jsx-runtime";
203
280
  var ConsciaButton = Button;
204
281
  function ConsciaIconButton({
205
282
  size = "icon",
206
283
  ...props
207
284
  }) {
208
- return /* @__PURE__ */ jsx6(Button, { size, ...props });
285
+ return /* @__PURE__ */ jsx7(Button, { size, ...props });
209
286
  }
210
287
  var ConsciaCard = Card;
211
288
  var ConsciaCardContent = CardContent;
@@ -217,7 +294,7 @@ function ConsciaCardHeader({
217
294
  ...props
218
295
  }) {
219
296
  if (!actionRight) {
220
- return /* @__PURE__ */ jsx6(CardHeader, { className, ...props, children });
297
+ return /* @__PURE__ */ jsx7(CardHeader, { className, ...props, children });
221
298
  }
222
299
  return /* @__PURE__ */ jsxs(
223
300
  CardHeader,
@@ -228,8 +305,8 @@ function ConsciaCardHeader({
228
305
  ),
229
306
  ...props,
230
307
  children: [
231
- /* @__PURE__ */ jsx6("div", { className: "grid gap-2", children }),
232
- /* @__PURE__ */ jsx6("div", { className: "justify-self-end", children: actionRight })
308
+ /* @__PURE__ */ jsx7("div", { className: "grid gap-2", children }),
309
+ /* @__PURE__ */ jsx7("div", { className: "justify-self-end", children: actionRight })
233
310
  ]
234
311
  }
235
312
  );
@@ -253,12 +330,12 @@ var ConsciaTableHead = TableHead;
253
330
  var ConsciaTableRow = TableRow;
254
331
 
255
332
  // src/primitives/field.tsx
256
- import { jsx as jsx7 } from "react/jsx-runtime";
333
+ import { jsx as jsx8 } from "react/jsx-runtime";
257
334
  function Field({
258
335
  className,
259
336
  ...props
260
337
  }) {
261
- return /* @__PURE__ */ jsx7(
338
+ return /* @__PURE__ */ jsx8(
262
339
  "div",
263
340
  {
264
341
  "data-slot": "field",
@@ -271,7 +348,7 @@ function FieldGroup({
271
348
  className,
272
349
  ...props
273
350
  }) {
274
- return /* @__PURE__ */ jsx7(
351
+ return /* @__PURE__ */ jsx8(
275
352
  "div",
276
353
  {
277
354
  "data-slot": "field-group",
@@ -284,7 +361,7 @@ function FieldLabel({
284
361
  className,
285
362
  ...props
286
363
  }) {
287
- return /* @__PURE__ */ jsx7(
364
+ return /* @__PURE__ */ jsx8(
288
365
  "label",
289
366
  {
290
367
  "data-slot": "field-label",
@@ -297,7 +374,7 @@ function FieldDescription({
297
374
  className,
298
375
  ...props
299
376
  }) {
300
- return /* @__PURE__ */ jsx7(
377
+ return /* @__PURE__ */ jsx8(
301
378
  "p",
302
379
  {
303
380
  "data-slot": "field-description",
@@ -310,7 +387,7 @@ function FieldError({
310
387
  className,
311
388
  ...props
312
389
  }) {
313
- return /* @__PURE__ */ jsx7(
390
+ return /* @__PURE__ */ jsx8(
314
391
  "p",
315
392
  {
316
393
  "data-slot": "field-error",
@@ -322,7 +399,7 @@ function FieldError({
322
399
 
323
400
  // src/primitives/form-select.tsx
324
401
  import * as React from "react";
325
- import { jsx as jsx8, jsxs as jsxs2 } from "react/jsx-runtime";
402
+ import { jsx as jsx9, jsxs as jsxs2 } from "react/jsx-runtime";
326
403
  var emptyValue = "__conscia_empty_select_value__";
327
404
  function toSelectValue(value) {
328
405
  if (value === void 0) {
@@ -358,7 +435,7 @@ function FormSelect({
358
435
  }
359
436
  onValueChange?.(actualValue);
360
437
  }
361
- return /* @__PURE__ */ jsx8("div", { className: cn("min-w-0", className), onClick, children: /* @__PURE__ */ jsxs2(
438
+ return /* @__PURE__ */ jsx9("div", { className: cn("min-w-0", className), onClick, children: /* @__PURE__ */ jsxs2(
362
439
  Select,
363
440
  {
364
441
  name,
@@ -367,8 +444,8 @@ function FormSelect({
367
444
  disabled,
368
445
  onValueChange: handleValueChange,
369
446
  children: [
370
- /* @__PURE__ */ jsx8(SelectTrigger, { id, "aria-label": ariaLabel, className: triggerClassName, children: /* @__PURE__ */ jsx8(SelectValue, { placeholder }) }),
371
- /* @__PURE__ */ jsx8(SelectContent, { className: contentClassName, children: /* @__PURE__ */ jsx8(SelectGroup, { children: options.map((option) => /* @__PURE__ */ jsx8(
447
+ /* @__PURE__ */ jsx9(SelectTrigger, { id, "aria-label": ariaLabel, className: triggerClassName, children: /* @__PURE__ */ jsx9(SelectValue, { placeholder }) }),
448
+ /* @__PURE__ */ jsx9(SelectContent, { className: contentClassName, children: /* @__PURE__ */ jsx9(SelectGroup, { children: options.map((option) => /* @__PURE__ */ jsx9(
372
449
  SelectItem,
373
450
  {
374
451
  value: toSelectValue(option.value) ?? emptyValue,
@@ -385,12 +462,12 @@ var ConsciaFormSelect = FormSelect;
385
462
 
386
463
  // src/primitives/label.tsx
387
464
  import * as LabelPrimitive from "@radix-ui/react-label";
388
- import { jsx as jsx9 } from "react/jsx-runtime";
465
+ import { jsx as jsx10 } from "react/jsx-runtime";
389
466
  function Label({
390
467
  className,
391
468
  ...props
392
469
  }) {
393
- return /* @__PURE__ */ jsx9(
470
+ return /* @__PURE__ */ jsx10(
394
471
  LabelPrimitive.Root,
395
472
  {
396
473
  "data-slot": "label",
@@ -406,7 +483,7 @@ function Label({
406
483
  // src/primitives/searchable-select.tsx
407
484
  import * as React2 from "react";
408
485
  import { Check, ChevronsUpDown, Search, X } from "lucide-react";
409
- import { jsx as jsx10, jsxs as jsxs3 } from "react/jsx-runtime";
486
+ import { jsx as jsx11, jsxs as jsxs3 } from "react/jsx-runtime";
410
487
  function SearchableSelect({
411
488
  id,
412
489
  name,
@@ -503,10 +580,10 @@ function SearchableSelect({
503
580
  }
504
581
  }
505
582
  return /* @__PURE__ */ jsxs3("div", { ref: rootRef, "data-slot": "searchable-select", className: cn("relative min-w-0", className), children: [
506
- name ? /* @__PURE__ */ jsx10("input", { type: "hidden", name, value }) : null,
583
+ name ? /* @__PURE__ */ jsx11("input", { type: "hidden", name, value }) : null,
507
584
  /* @__PURE__ */ jsxs3("div", { className: "relative", children: [
508
- /* @__PURE__ */ jsx10(Search, { className: "pointer-events-none absolute left-3 top-1/2 size-4 -translate-y-1/2 text-muted-foreground", "aria-hidden": "true" }),
509
- /* @__PURE__ */ jsx10(
585
+ /* @__PURE__ */ jsx11(Search, { className: "pointer-events-none absolute left-3 top-1/2 size-4 -translate-y-1/2 text-muted-foreground", "aria-hidden": "true" }),
586
+ /* @__PURE__ */ jsx11(
510
587
  Input,
511
588
  {
512
589
  id,
@@ -540,7 +617,7 @@ function SearchableSelect({
540
617
  onKeyDown
541
618
  }
542
619
  ),
543
- clearable && value ? /* @__PURE__ */ jsx10(
620
+ clearable && value ? /* @__PURE__ */ jsx11(
544
621
  Button,
545
622
  {
546
623
  type: "button",
@@ -554,12 +631,12 @@ function SearchableSelect({
554
631
  onValueChange("");
555
632
  setSearch("");
556
633
  },
557
- children: /* @__PURE__ */ jsx10(X, {})
634
+ children: /* @__PURE__ */ jsx11(X, {})
558
635
  }
559
636
  ) : null,
560
- /* @__PURE__ */ jsx10(ChevronsUpDown, { className: "pointer-events-none absolute right-3 top-1/2 size-4 -translate-y-1/2 text-muted-foreground", "aria-hidden": "true" })
637
+ /* @__PURE__ */ jsx11(ChevronsUpDown, { className: "pointer-events-none absolute right-3 top-1/2 size-4 -translate-y-1/2 text-muted-foreground", "aria-hidden": "true" })
561
638
  ] }),
562
- open ? /* @__PURE__ */ jsx10(
639
+ open ? /* @__PURE__ */ jsx11(
563
640
  "div",
564
641
  {
565
642
  id: listboxId,
@@ -584,14 +661,14 @@ function SearchableSelect({
584
661
  onClick: () => select(option),
585
662
  children: [
586
663
  /* @__PURE__ */ jsxs3("span", { className: "grid min-w-0 flex-1 gap-0.5", children: [
587
- /* @__PURE__ */ jsx10("span", { className: "truncate font-medium", children: option.label }),
588
- option.description ? /* @__PURE__ */ jsx10("span", { className: "truncate text-[length:var(--ds-menu-label-size)] text-muted-foreground", children: option.description }) : null
664
+ /* @__PURE__ */ jsx11("span", { className: "truncate font-medium", children: option.label }),
665
+ option.description ? /* @__PURE__ */ jsx11("span", { className: "truncate text-[length:var(--ds-menu-label-size)] text-muted-foreground", children: option.description }) : null
589
666
  ] }),
590
- option.value === value ? /* @__PURE__ */ jsx10(Check, { className: "size-4 shrink-0 text-success-foreground", "aria-hidden": "true" }) : null
667
+ option.value === value ? /* @__PURE__ */ jsx11(Check, { className: "size-4 shrink-0 text-success-foreground", "aria-hidden": "true" }) : null
591
668
  ]
592
669
  },
593
670
  option.value
594
- )) : /* @__PURE__ */ jsx10("p", { className: "px-3 py-6 text-center text-[length:var(--ds-menu-item-size)] text-muted-foreground", children: emptyMessage })
671
+ )) : /* @__PURE__ */ jsx11("p", { className: "px-3 py-6 text-center text-[length:var(--ds-menu-item-size)] text-muted-foreground", children: emptyMessage })
595
672
  }
596
673
  ) : null
597
674
  ] });
@@ -607,6 +684,7 @@ export {
607
684
  AvatarFallback,
608
685
  badgeVariants,
609
686
  Badge,
687
+ BrandIcon,
610
688
  Switch,
611
689
  Textarea,
612
690
  ConsciaButton,
@@ -642,4 +720,4 @@ export {
642
720
  Label,
643
721
  SearchableSelect
644
722
  };
645
- //# sourceMappingURL=chunk-OFYVHEIH.js.map
723
+ //# sourceMappingURL=chunk-CTRJ24EO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/primitives/alert.tsx","../src/primitives/avatar.tsx","../src/primitives/badge.tsx","../src/primitives/brand-icon.tsx","../src/primitives/switch.tsx","../src/primitives/textarea.tsx","../src/primitives/compat.tsx","../src/primitives/field.tsx","../src/primitives/form-select.tsx","../src/primitives/label.tsx","../src/primitives/searchable-select.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"./utils\";\n\nconst alertVariants = cva(\n \"relative grid w-full grid-cols-[auto_1fr] items-start gap-x-3 rounded-[var(--ds-radius-surface)] border px-4 py-3.5 text-sm [&>svg]:mt-0.5 [&>svg]:size-5\",\n {\n variants: {\n variant: {\n default: \"border-border-default bg-card text-foreground\",\n information:\n \"border-information-border bg-information-background text-information-foreground\",\n success:\n \"border-success-border bg-success-background text-success-foreground\",\n warning:\n \"border-warning-border bg-warning-background text-warning-foreground\",\n danger: \"border-danger-border bg-danger-background text-danger-foreground\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n },\n);\n\nfunction Alert({\n className,\n variant,\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof alertVariants>) {\n return (\n <div\n data-slot=\"alert\"\n className={cn(alertVariants({ variant }), className)}\n {...props}\n />\n );\n}\n\nfunction AlertTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-title\"\n className={cn(\"font-medium leading-5\", className)}\n {...props}\n />\n );\n}\n\nfunction AlertDescription({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-description\"\n className={cn(\"col-start-2 mt-0.5 text-sm leading-5 opacity-80\", className)}\n {...props}\n />\n );\n}\n\nexport { Alert, AlertDescription, AlertTitle, alertVariants };\n","\"use client\";\n\nimport * as React from \"react\";\nimport * as AvatarPrimitive from \"@radix-ui/react-avatar\";\n\nimport { cn } from \"./utils\";\n\nfunction Avatar({\n className,\n ...props\n}: React.ComponentProps<typeof AvatarPrimitive.Root>) {\n return (\n <AvatarPrimitive.Root\n data-slot=\"avatar\"\n className={cn(\"relative flex size-8 shrink-0 overflow-hidden rounded-full\", className)}\n {...props}\n />\n );\n}\n\nfunction AvatarImage({\n className,\n ...props\n}: React.ComponentProps<typeof AvatarPrimitive.Image>) {\n return (\n <AvatarPrimitive.Image\n data-slot=\"avatar-image\"\n className={cn(\"aspect-square size-full\", className)}\n {...props}\n />\n );\n}\n\nfunction AvatarFallback({\n className,\n ...props\n}: React.ComponentProps<typeof AvatarPrimitive.Fallback>) {\n return (\n <AvatarPrimitive.Fallback\n data-slot=\"avatar-fallback\"\n className={cn(\"flex size-full items-center justify-center rounded-full bg-surface-muted text-xs font-medium text-muted-foreground\", className)}\n {...props}\n />\n );\n}\n\nexport { Avatar, AvatarFallback, AvatarImage };\n","import * as React from \"react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"./utils\";\n\nconst badgeVariants = cva(\n \"inline-flex items-center rounded-md border px-1.5 py-0.5 text-[var(--ds-metadata)] font-medium leading-4 transition-colors\",\n {\n variants: {\n variant: {\n default: \"border-primary bg-primary text-primary-foreground\",\n accent: \"border-selection-border bg-selection-background text-selection-foreground\",\n secondary: \"border-neutral-border bg-neutral-background text-neutral-foreground\",\n neutral: \"border-neutral-border bg-neutral-background text-neutral-foreground\",\n outline: \"border-border-default text-foreground\",\n information: \"border-information-border bg-information-background text-information-foreground\",\n info: \"border-information-border bg-information-background text-information-foreground\",\n success: \"border-success-border bg-success-background text-success-foreground\",\n warning: \"border-warning-border bg-warning-background text-warning-foreground\",\n danger: \"border-danger-border bg-danger-background text-danger-foreground\",\n destructive: \"border-danger-border bg-danger-background text-danger-foreground\"\n }\n },\n defaultVariants: {\n variant: \"neutral\"\n }\n },\n);\n\nfunction Badge({\n className,\n variant,\n ...props\n}: React.ComponentProps<\"span\"> & VariantProps<typeof badgeVariants>) {\n return <span data-slot=\"badge\" className={cn(badgeVariants({ variant, className }))} {...props} />;\n}\n\nexport { Badge, badgeVariants };\n","import * as React from \"react\";\n\nimport { cn } from \"./utils\";\n\nconst CONSCIA_SYMBOL_PATH = [\n \"M171.225 63.8139L173.637 66.1116L203.794 34.4551L201.382 32.1575L171.225 63.8139Z\",\n \"M184.012 78.9693L185.769 81.8487L223.091 59.076L221.334 56.1966L184.012 78.9693Z\",\n \"M192.436 96.8858L193.417 100.222L235.362 87.8847L234.381 84.5488L192.436 96.8858Z\",\n \"M195.949 116.334L196.037 119.987L239.746 118.926L239.657 115.273L195.949 116.334Z\",\n \"M194.341 135.989L193.42 139.796L235.913 150.084L236.835 146.277L194.341 135.989Z\",\n \"M187.759 154.526L185.708 158.285L224.091 179.221L226.142 175.461L187.759 154.526Z\",\n \"M176.683 170.712L173.394 174.165L205.05 204.322L208.34 200.868L176.683 170.712Z\",\n \"M161.899 183.49L157.288 186.304L180.06 223.626L184.672 220.812L161.899 183.49Z\",\n \"M144.425 192.058L138.472 193.809L150.809 235.754L156.762 234.003L144.425 192.058Z\",\n \"M125.438 195.913L118.244 196.088L119.305 239.796L126.499 239.622L125.438 195.913Z\",\n \"M106.176 194.873L98.0421 192.903L87.754 235.397L95.8882 237.366L106.176 194.873Z\",\n \"M87.8408 189.056L79.3505 184.425L58.4147 222.808L66.905 227.439L87.8408 189.056Z\",\n \"M71.5444 178.838L63.5819 171.253L33.4252 202.91L41.3878 210.495L71.5444 178.838Z\",\n \"M58.2896 164.821L51.9185 154.379L14.5961 177.152L20.9672 187.593L58.2896 164.821Z\",\n \"M48.9443 147.836L45.1912 135.075L3.24659 147.412L6.99972 160.173L48.9443 147.836Z\",\n \"M44.1724 128.938L43.8283 114.759L0.119827 115.82L0.463868 129.998L44.1724 128.938Z\",\n \"M44.3613 109.352L47.8648 94.8809L5.37116 84.5928L1.86766 99.0635L44.3613 109.352Z\",\n \"M49.563 90.3812L56.9571 76.825L18.5742 55.8893L11.18 69.4455L49.563 90.3812Z\",\n \"M59.4839 73.314L70.4267 61.8269L38.7702 31.6703L27.8274 43.1574L59.4839 73.314Z\",\n \"M73.4951 59.3251L87.307 50.8976L64.5343 13.5752L50.7224 22.0027L73.4951 59.3251Z\",\n \"M90.6772 49.3891L106.414 44.7604L94.0775 2.81575L78.3402 7.44453L90.6772 49.3891Z\",\n \"M109.88 44.2086L126.426 43.8071L125.366 0.098614L108.82 0.500089L109.88 44.2086Z\",\n \"M129.802 44.1632L145.967 48.0768L156.255 5.58318L140.09 1.66954L129.802 44.1632Z\",\n \"M149.087 49.2798L163.709 57.2553L184.645 18.8723L170.023 10.8969L149.087 49.2798Z\",\n \"M152.448 160.384L141.06 167.332L154.089 188.685L165.477 181.736L152.448 160.384Z\",\n \"M140.881 167.41L128.103 171.168L135.161 195.165L147.939 191.407L140.881 167.41Z\",\n \"M127.834 171.202L114.653 171.522L115.26 196.528L128.441 196.209L127.834 171.202Z\",\n \"M114.192 171.456L101.624 168.413L95.738 192.724L108.306 195.767L114.192 171.456Z\",\n \"M100.907 168.109L89.889 162.1L77.9114 184.059L88.9296 190.069L100.907 168.109Z\",\n \"M88.9224 161.353L80.2035 153.047L62.9505 171.158L71.6694 179.464L88.9224 161.353Z\",\n \"M79.1143 151.631L73.1721 141.893L51.8195 154.921L57.7617 164.66L79.1143 151.631Z\",\n \"M72.2163 139.615L69.2075 129.385L45.2105 136.444L48.2193 146.673L72.2163 139.615Z\",\n \"M68.7593 126.163L68.5209 116.339L43.5147 116.946L43.7531 126.77L68.7593 126.163Z\",\n \"M69.0161 112.256L71.1176 103.576L46.8064 97.6899L44.7049 106.37L69.0161 112.256Z\",\n \"M72.979 98.9209L76.8146 91.8888L54.8552 79.9112L51.0196 86.9432L72.979 98.9209Z\",\n \"M80.3506 87.1414L85.2494 81.999L67.1383 64.746L62.2395 69.8884L80.3506 87.1414Z\",\n \"M90.5762 77.7753L95.9023 74.5255L82.8738 53.1729L77.5476 56.4227L90.5762 77.7753Z\",\n \"M102.889 71.4875L108.114 69.9508L101.056 45.9537L95.831 47.4905L102.889 71.4875Z\",\n \"M116.381 68.7043L121.119 68.5894L120.513 43.5832L115.775 43.6981L116.381 68.7043Z\",\n \"M130.08 69.5886L134.092 70.56L139.978 46.2488L135.966 45.2775L130.08 69.5886Z\",\n \"M143.01 74.0389L146.183 75.7697L158.161 53.8103L154.988 52.0795L143.01 74.0389Z\",\n \"M154.273 81.705L156.588 83.9108L173.841 65.7997L171.526 63.5939L154.273 81.705Z\",\n \"M163.102 92.0197L164.599 94.4735L185.952 81.445L184.455 78.9911L163.102 92.0197Z\",\n \"M168.91 104.243L169.655 106.775L193.652 99.7164L192.907 97.1844L168.91 104.243Z\",\n \"M171.325 117.515L171.386 120.001L196.392 119.394L196.331 116.909L171.325 117.515Z\",\n \"M170.21 130.922L169.644 133.264L193.955 139.15L194.522 136.808L170.21 130.922Z\",\n \"M165.673 143.549L164.523 145.658L186.482 157.636L187.633 155.527L165.673 143.549Z\",\n \"M158.032 154.558L156.355 156.318L174.467 173.571L176.143 171.811L158.032 154.558Z\",\n].join(\" \");\n\ntype BrandIconProps = React.ComponentPropsWithoutRef<\"svg\">;\n\nfunction BrandIcon({\n \"aria-label\": ariaLabel,\n className,\n ...props\n}: BrandIconProps) {\n return (\n <svg\n data-slot=\"brand-icon\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"240\"\n height=\"240\"\n viewBox=\"0 0 240 240\"\n fill=\"none\"\n focusable=\"false\"\n role={ariaLabel ? \"img\" : undefined}\n aria-hidden={ariaLabel ? undefined : true}\n aria-label={ariaLabel}\n className={cn(\"size-6 shrink-0 text-foreground dark:text-white\", className)}\n {...props}\n >\n <path d={CONSCIA_SYMBOL_PATH} fill=\"currentColor\" />\n </svg>\n );\n}\n\nexport { BrandIcon };\nexport type { BrandIconProps };\n","\"use client\";\n\nimport * as React from \"react\";\nimport * as SwitchPrimitive from \"@radix-ui/react-switch\";\n\nimport { cn } from \"./utils\";\n\nfunction Switch({\n className,\n size = \"default\",\n ...props\n}: React.ComponentProps<typeof SwitchPrimitive.Root> & {\n size?: \"sm\" | \"default\";\n}) {\n return (\n <SwitchPrimitive.Root\n data-slot=\"switch\"\n data-size={size}\n className={cn(\n \"peer group/switch inline-flex shrink-0 items-center rounded-full border border-transparent shadow-xs transition-all outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 data-[size=default]:h-[1.15rem] data-[size=default]:w-8 data-[size=sm]:h-3.5 data-[size=sm]:w-6 data-[state=checked]:bg-primary data-[state=unchecked]:bg-input dark:data-[state=unchecked]:bg-input/80\",\n className,\n )}\n {...props}\n >\n <SwitchPrimitive.Thumb\n data-slot=\"switch-thumb\"\n className=\"pointer-events-none block rounded-full bg-background ring-0 transition-transform group-data-[size=default]/switch:size-4 group-data-[size=sm]/switch:size-3 data-[state=checked]:translate-x-[calc(100%-2px)] data-[state=unchecked]:translate-x-0 dark:data-[state=checked]:bg-primary-foreground dark:data-[state=unchecked]:bg-foreground\"\n />\n </SwitchPrimitive.Root>\n );\n}\n\nexport { Switch };\n","import * as React from \"react\";\n\nimport { cn } from \"./utils\";\n\nfunction Textarea({ className, ...props }: React.ComponentProps<\"textarea\">) {\n return (\n <textarea\n data-slot=\"textarea\"\n className={cn(\"min-h-28 w-full rounded-[var(--ds-field-control-radius)] border border-input bg-surface-control px-[var(--ds-field-control-padding-x)] py-3 text-sm leading-5 outline-none transition-colors placeholder:text-sm placeholder:leading-5 placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50\", className)}\n {...props}\n />\n );\n}\n\nexport { Textarea };\n","import * as React from \"react\";\n\nimport { Button } from \"./button\";\nimport {\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n} from \"./card\";\nimport { Checkbox } from \"./checkbox\";\nimport { Input } from \"./input\";\nimport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"./select\";\nimport { Switch } from \"./switch\";\nimport {\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from \"./table\";\nimport { Textarea } from \"./textarea\";\nimport { cn } from \"./utils\";\n\n/**\n * Temporary Admin UI migration aliases. New product code should import the\n * clean primitive names from @conscia-labs/design-system.\n */\nconst ConsciaButton = Button;\n\nfunction ConsciaIconButton({\n size = \"icon\",\n ...props\n}: React.ComponentProps<typeof Button>) {\n return <Button size={size} {...props} />;\n}\n\nconst ConsciaCard = Card;\nconst ConsciaCardContent = CardContent;\nconst ConsciaCardDescription = CardDescription;\n\nfunction ConsciaCardHeader({\n actionRight,\n className,\n children,\n ...props\n}: React.ComponentProps<typeof CardHeader> & {\n actionRight?: React.ReactNode;\n}) {\n if (!actionRight) {\n return (\n <CardHeader className={className} {...props}>\n {children}\n </CardHeader>\n );\n }\n\n return (\n <CardHeader\n className={cn(\n \"grid grid-cols-[minmax(0,1fr)_auto] items-start gap-4\",\n className,\n )}\n {...props}\n >\n <div className=\"grid gap-2\">{children}</div>\n <div className=\"justify-self-end\">{actionRight}</div>\n </CardHeader>\n );\n}\n\nconst ConsciaCardTitle = CardTitle;\nconst ConsciaCheckbox = Checkbox;\nconst ConsciaInput = Input;\nconst ConsciaSwitch = Switch;\nconst ConsciaTextarea = Textarea;\nconst ConsciaSelect = Select;\nconst ConsciaSelectContent = SelectContent;\nconst ConsciaSelectGroup = SelectGroup;\nconst ConsciaSelectItem = SelectItem;\nconst ConsciaSelectTrigger = SelectTrigger;\nconst ConsciaSelectValue = SelectValue;\nconst ConsciaTable = Table;\nconst ConsciaTableBody = TableBody;\nconst ConsciaTableCell = TableCell;\nconst ConsciaTableHeader = TableHeader;\nconst ConsciaTableHead = TableHead;\nconst ConsciaTableRow = TableRow;\n\nexport {\n ConsciaButton,\n ConsciaCard,\n ConsciaCardContent,\n ConsciaCardDescription,\n ConsciaCardHeader,\n ConsciaCardTitle,\n ConsciaCheckbox,\n ConsciaIconButton,\n ConsciaInput,\n ConsciaSwitch,\n ConsciaTextarea,\n ConsciaSelect,\n ConsciaSelectContent,\n ConsciaSelectGroup,\n ConsciaSelectItem,\n ConsciaSelectTrigger,\n ConsciaSelectValue,\n ConsciaTable,\n ConsciaTableBody,\n ConsciaTableCell,\n ConsciaTableHeader,\n ConsciaTableHead,\n ConsciaTableRow,\n};\n","import * as React from \"react\";\n\nimport { cn } from \"./utils\";\n\nfunction Field({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"field\"\n className={cn(\"grid gap-[var(--ds-field-label-gap)]\", className)}\n {...props}\n />\n );\n}\n\nfunction FieldGroup({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"field-group\"\n className={cn(\"grid gap-[var(--ds-field-gap)]\", className)}\n {...props}\n />\n );\n}\n\nfunction FieldLabel({\n className,\n ...props\n}: React.ComponentProps<\"label\">) {\n return (\n <label\n data-slot=\"field-label\"\n className={cn(\"text-[length:var(--ds-field-label-size)] font-medium leading-[var(--ds-field-label-line-height)] text-foreground\", className)}\n {...props}\n />\n );\n}\n\nfunction FieldDescription({\n className,\n ...props\n}: React.ComponentProps<\"p\">) {\n return (\n <p\n data-slot=\"field-description\"\n className={cn(\"mt-[var(--ds-field-message-gap)] text-[var(--ds-metadata)] text-muted-foreground\", className)}\n {...props}\n />\n );\n}\n\nfunction FieldError({\n className,\n ...props\n}: React.ComponentProps<\"p\">) {\n return (\n <p\n data-slot=\"field-error\"\n className={cn(\"mt-[var(--ds-field-message-gap)] text-[var(--ds-metadata)] font-medium text-danger-foreground\", className)}\n {...props}\n />\n );\n}\n\nexport { Field, FieldDescription, FieldError, FieldGroup, FieldLabel };\n","\"use client\";\n\nimport * as React from \"react\";\n\nimport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"./select\";\nimport { cn } from \"./utils\";\n\ntype FormSelectOption = {\n value: string;\n label: React.ReactNode;\n disabled?: boolean;\n};\n\ntype FormSelectProps = {\n id?: string;\n name?: string;\n value?: string;\n defaultValue?: string;\n required?: boolean;\n disabled?: boolean;\n placeholder?: string;\n options: FormSelectOption[];\n className?: string;\n triggerClassName?: string;\n contentClassName?: string;\n onValueChange?: (value: string) => void;\n onClick?: React.MouseEventHandler<HTMLDivElement>;\n \"aria-label\"?: string;\n};\n\nconst emptyValue = \"__conscia_empty_select_value__\";\n\nfunction toSelectValue(value: string | undefined) {\n if (value === undefined) {\n return undefined;\n }\n\n return value === \"\" ? emptyValue : value;\n}\n\nfunction fromSelectValue(value: string) {\n return value === emptyValue ? \"\" : value;\n}\n\nfunction FormSelect({\n name,\n id,\n value,\n defaultValue,\n required,\n disabled,\n placeholder,\n options,\n className,\n triggerClassName,\n contentClassName,\n onValueChange,\n onClick,\n \"aria-label\": ariaLabel,\n}: FormSelectProps) {\n const [internalValue, setInternalValue] = React.useState(defaultValue ?? \"\");\n const currentValue = value ?? internalValue;\n\n function handleValueChange(nextValue: string) {\n const actualValue = fromSelectValue(nextValue);\n\n if (value === undefined) {\n setInternalValue(actualValue);\n }\n\n onValueChange?.(actualValue);\n }\n\n return (\n <div className={cn(\"min-w-0\", className)} onClick={onClick}>\n <Select\n name={name}\n value={toSelectValue(currentValue)}\n required={required}\n disabled={disabled}\n onValueChange={handleValueChange}\n >\n <SelectTrigger id={id} aria-label={ariaLabel} className={triggerClassName}>\n <SelectValue placeholder={placeholder} />\n </SelectTrigger>\n <SelectContent className={contentClassName}>\n <SelectGroup>\n {options.map((option) => (\n <SelectItem\n key={option.value}\n value={toSelectValue(option.value) ?? emptyValue}\n disabled={option.disabled}\n >\n {option.label}\n </SelectItem>\n ))}\n </SelectGroup>\n </SelectContent>\n </Select>\n </div>\n );\n}\n\nconst ConsciaFormSelect = FormSelect;\n\nexport { ConsciaFormSelect, FormSelect };\nexport type { FormSelectOption, FormSelectProps };\n","\"use client\";\n\nimport * as React from \"react\";\nimport * as LabelPrimitive from \"@radix-ui/react-label\";\n\nimport { cn } from \"./utils\";\n\nfunction Label({\n className,\n ...props\n}: React.ComponentProps<typeof LabelPrimitive.Root>) {\n return (\n <LabelPrimitive.Root\n data-slot=\"label\"\n className={cn(\n \"flex items-center gap-2 text-[length:var(--ds-field-label-size)] font-medium leading-[var(--ds-field-label-line-height)] text-foreground select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport { Label };\n","\"use client\";\n\nimport * as React from \"react\";\nimport { Check, ChevronsUpDown, Search, X } from \"lucide-react\";\n\nimport { Button } from \"./button\";\nimport { Input } from \"./input\";\nimport { cn } from \"./utils\";\n\ntype SearchableSelectOption = {\n value: string;\n label: string;\n description?: string;\n keywords?: string[];\n disabled?: boolean;\n};\n\ntype SearchableSelectProps = {\n id?: string;\n name?: string;\n value?: string;\n options: SearchableSelectOption[];\n onValueChange: (value: string) => void;\n placeholder?: string;\n searchPlaceholder?: string;\n emptyMessage?: string;\n disabled?: boolean;\n clearable?: boolean;\n clearLabel?: string;\n optionsLabel?: string;\n className?: string;\n \"aria-label\"?: string;\n};\n\nfunction SearchableSelect({\n id,\n name,\n value = \"\",\n options,\n onValueChange,\n placeholder = \"Select an option\",\n searchPlaceholder = \"Search...\",\n emptyMessage = \"No matching options.\",\n disabled = false,\n clearable = false,\n clearLabel = \"Clear selection\",\n optionsLabel,\n className,\n \"aria-label\": ariaLabel,\n}: SearchableSelectProps) {\n const generatedId = React.useId();\n const listboxId = `${id ?? generatedId}-listbox`;\n const rootRef = React.useRef<HTMLDivElement>(null);\n const activeOptionRef = React.useRef<HTMLButtonElement>(null);\n const [open, setOpen] = React.useState(false);\n const [search, setSearch] = React.useState(\"\");\n const [activeIndex, setActiveIndex] = React.useState(0);\n const selected = options.find((option) => option.value === value);\n const normalizedSearch = search.trim().toLowerCase();\n const filteredOptions = normalizedSearch\n ? options.filter((option) =>\n [option.label, option.description, ...(option.keywords ?? [])]\n .filter(Boolean)\n .join(\" \")\n .toLowerCase()\n .includes(normalizedSearch),\n )\n : options;\n const enabledIndexes = filteredOptions.reduce<number[]>((indexes, option, index) => {\n if (!option.disabled) {\n indexes.push(index);\n }\n\n return indexes;\n }, []);\n const resolvedActiveIndex = enabledIndexes.includes(activeIndex)\n ? activeIndex\n : (enabledIndexes[0] ?? -1);\n\n React.useEffect(() => {\n if (!open) {\n return;\n }\n\n function closeWhenOutside(event: PointerEvent) {\n if (!rootRef.current?.contains(event.target as Node)) {\n setOpen(false);\n setSearch(\"\");\n }\n }\n document.addEventListener(\"pointerdown\", closeWhenOutside);\n return () => document.removeEventListener(\"pointerdown\", closeWhenOutside);\n }, [open]);\n\n React.useEffect(() => {\n if (open) {\n activeOptionRef.current?.scrollIntoView({ block: \"nearest\" });\n }\n }, [open, resolvedActiveIndex]);\n\n function select(option: SearchableSelectOption) {\n if (option.disabled) {\n return;\n }\n\n onValueChange(option.value);\n setSearch(\"\");\n setOpen(false);\n }\n\n function onKeyDown(event: React.KeyboardEvent<HTMLInputElement>) {\n if (event.key === \"ArrowDown\") {\n event.preventDefault();\n setOpen(true);\n setActiveIndex((current) => {\n const position = enabledIndexes.indexOf(current);\n return enabledIndexes[Math.min(enabledIndexes.length - 1, position + 1)] ?? -1;\n });\n } else if (event.key === \"ArrowUp\") {\n event.preventDefault();\n setOpen(true);\n setActiveIndex((current) => {\n const position = enabledIndexes.indexOf(current);\n return enabledIndexes[Math.max(0, position === -1 ? 0 : position - 1)] ?? -1;\n });\n } else if (event.key === \"Home\") {\n event.preventDefault();\n setOpen(true);\n setActiveIndex(enabledIndexes[0] ?? -1);\n } else if (event.key === \"End\") {\n event.preventDefault();\n setOpen(true);\n setActiveIndex(enabledIndexes.at(-1) ?? -1);\n } else if (event.key === \"Enter\" && open && filteredOptions[resolvedActiveIndex]) {\n event.preventDefault();\n select(filteredOptions[resolvedActiveIndex]);\n } else if (event.key === \"Escape\") {\n setOpen(false);\n setSearch(\"\");\n } else if (event.key === \"Tab\") {\n setOpen(false);\n setSearch(\"\");\n }\n }\n\n return (\n <div ref={rootRef} data-slot=\"searchable-select\" className={cn(\"relative min-w-0\", className)}>\n {name ? <input type=\"hidden\" name={name} value={value} /> : null}\n <div className=\"relative\">\n <Search className=\"pointer-events-none absolute left-3 top-1/2 size-4 -translate-y-1/2 text-muted-foreground\" aria-hidden=\"true\" />\n <Input\n id={id}\n role=\"combobox\"\n aria-label={ariaLabel}\n aria-autocomplete=\"list\"\n aria-expanded={open}\n aria-controls={open ? listboxId : undefined}\n aria-activedescendant={open && filteredOptions[resolvedActiveIndex] ? `${listboxId}-${resolvedActiveIndex}` : undefined}\n autoComplete=\"off\"\n className=\"px-9\"\n disabled={disabled}\n placeholder={open ? searchPlaceholder : placeholder}\n value={open ? search : selected?.label ?? \"\"}\n onFocus={(event) => {\n setOpen(true);\n setSearch(\"\");\n event.currentTarget.select();\n }}\n onClick={() => {\n if (!open) {\n setOpen(true);\n setSearch(\"\");\n }\n }}\n onChange={(event) => {\n setSearch(event.target.value);\n setOpen(true);\n setActiveIndex(0);\n }}\n onKeyDown={onKeyDown}\n />\n {clearable && value ? (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n disabled={disabled}\n className=\"absolute right-8 top-1/2 -translate-y-1/2\"\n aria-label={clearLabel}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => {\n onValueChange(\"\");\n setSearch(\"\");\n }}\n >\n <X />\n </Button>\n ) : null}\n <ChevronsUpDown className=\"pointer-events-none absolute right-3 top-1/2 size-4 -translate-y-1/2 text-muted-foreground\" aria-hidden=\"true\" />\n </div>\n\n {open ? (\n <div\n id={listboxId}\n role=\"listbox\"\n aria-label={optionsLabel ?? (ariaLabel ? `${ariaLabel} options` : \"Options\")}\n className=\"absolute z-50 mt-1 max-h-72 w-full overflow-y-auto rounded-md border border-border-subtle bg-popover p-1 text-popover-foreground shadow-md\"\n >\n {filteredOptions.length ? filteredOptions.map((option, index) => (\n <button\n key={option.value}\n id={`${listboxId}-${index}`}\n type=\"button\"\n role=\"option\"\n aria-selected={option.value === value}\n aria-disabled={option.disabled || undefined}\n disabled={option.disabled}\n tabIndex={-1}\n ref={index === resolvedActiveIndex ? activeOptionRef : undefined}\n data-active={index === resolvedActiveIndex}\n className=\"flex w-full items-center gap-3 rounded-sm px-3 py-2 text-left text-[length:var(--ds-menu-item-size)] outline-none hover:bg-surface-muted focus-visible:bg-surface-muted data-[active=true]:bg-surface-muted disabled:pointer-events-none disabled:opacity-50\"\n onMouseDown={(event) => event.preventDefault()}\n onMouseEnter={() => setActiveIndex(index)}\n onClick={() => select(option)}\n >\n <span className=\"grid min-w-0 flex-1 gap-0.5\">\n <span className=\"truncate font-medium\">{option.label}</span>\n {option.description ? <span className=\"truncate text-[length:var(--ds-menu-label-size)] text-muted-foreground\">{option.description}</span> : null}\n </span>\n {option.value === value ? <Check className=\"size-4 shrink-0 text-success-foreground\" aria-hidden=\"true\" /> : null}\n </button>\n )) : <p className=\"px-3 py-6 text-center text-[length:var(--ds-menu-item-size)] text-muted-foreground\">{emptyMessage}</p>}\n </div>\n ) : null}\n </div>\n );\n}\n\nexport { SearchableSelect };\nexport type { SearchableSelectOption, SearchableSelectProps };\n"],"mappings":"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","names":["jsx","cva","jsx","cva","jsx","jsx","jsx","jsx","jsx","jsx","jsxs","jsx","React","jsx","jsxs"]}
@@ -52,7 +52,7 @@ import {
52
52
  TooltipContent,
53
53
  TooltipProvider,
54
54
  TooltipTrigger
55
- } from "./chunk-JC7W5VB3.js";
55
+ } from "./chunk-ZCBZHRTV.js";
56
56
  import {
57
57
  cn
58
58
  } from "./chunk-JU5DQXFC.js";
@@ -653,27 +653,30 @@ function NavigationGroup({
653
653
  "section",
654
654
  {
655
655
  "data-slot": "navigation-group",
656
- className: cn("flex min-w-0 flex-col gap-1", className),
656
+ className: cn(
657
+ "flex min-w-0 flex-col gap-[var(--ds-sidebar-label-gap)]",
658
+ className
659
+ ),
657
660
  children: [
658
661
  label ? /* @__PURE__ */ jsxs4(
659
662
  "div",
660
663
  {
661
664
  "data-slot": "navigation-group-label",
662
- className: "flex min-h-6 items-center gap-2 px-2 pb-1 pt-2 text-[length:var(--ds-sidebar-group-label-size)] font-semibold uppercase leading-5 tracking-[0.08em] text-sidebar-group-label group-data-[sidebar-state=collapsed]/shell:hidden",
665
+ className: "flex min-h-6 items-center gap-2 px-2 pb-0 pt-2 text-[length:var(--ds-sidebar-group-label-size)] font-semibold uppercase leading-[var(--ds-sidebar-group-label-line-height)] tracking-[0.04em] text-sidebar-group-label group-data-[sidebar-state=collapsed]/shell:hidden",
663
666
  children: [
664
667
  label,
665
668
  count !== void 0 ? /* @__PURE__ */ jsx5("span", { className: "ml-auto shrink-0 text-[length:var(--ds-metadata)] font-medium normal-case tracking-normal text-sidebar-group-count", children: count }) : null
666
669
  ]
667
670
  }
668
671
  ) : null,
669
- /* @__PURE__ */ jsx5("div", { className: "flex min-w-0 flex-col gap-1", children })
672
+ /* @__PURE__ */ jsx5("div", { className: "flex min-w-0 flex-col gap-[var(--ds-sidebar-item-gap)]", children })
670
673
  ]
671
674
  }
672
675
  );
673
676
  }
674
677
  function navigationItemClasses(active) {
675
678
  return cn(
676
- "flex min-h-[var(--ds-sidebar-item-height-touch)] min-w-0 cursor-pointer items-center gap-2 rounded-[var(--ds-radius-control)] px-2 text-sm font-medium text-sidebar-secondary-text outline-none transition-colors duration-150 lg:h-[var(--ds-sidebar-item-height)] lg:min-h-0",
679
+ "flex min-h-[var(--ds-sidebar-item-height-touch)] min-w-0 cursor-pointer items-center gap-2 rounded-[var(--ds-radius-control)] px-2 text-sm font-medium leading-5 text-sidebar-secondary-text outline-none transition-colors duration-150 lg:h-[var(--ds-sidebar-item-height)] lg:min-h-0",
677
680
  "hover:bg-sidebar-hover hover:text-sidebar-primary-text",
678
681
  "focus-visible:ring-[3px] focus-visible:ring-sidebar-focus-ring",
679
682
  "disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:cursor-not-allowed aria-disabled:opacity-50",
@@ -733,7 +736,7 @@ function NavigationSubItem({
733
736
  "data-slot": "navigation-sub-item",
734
737
  "data-active": active ? "true" : void 0,
735
738
  className: cn(
736
- "flex min-h-[var(--ds-sidebar-item-height-touch)] min-w-0 cursor-pointer items-center gap-2 rounded-[var(--ds-radius-control)] px-2 text-sm text-sidebar-secondary-text outline-none transition-colors duration-150 lg:h-[calc(var(--ds-sidebar-item-height)-0.25rem)] lg:min-h-0",
739
+ "flex min-h-[var(--ds-sidebar-item-height-touch)] min-w-0 cursor-pointer items-center gap-2 rounded-[var(--ds-radius-control)] px-2 text-sm leading-5 text-sidebar-secondary-text outline-none transition-colors duration-150 lg:h-[calc(var(--ds-sidebar-item-height)-0.25rem)] lg:min-h-0",
737
740
  "hover:bg-sidebar-hover hover:text-sidebar-primary-text focus-visible:ring-[3px] focus-visible:ring-sidebar-focus-ring",
738
741
  "group-data-[sidebar-state=collapsed]/shell:hidden [&>svg]:size-4 [&>svg]:shrink-0 [&>svg]:stroke-[1.75] [&>svg]:text-sidebar-icon",
739
742
  active && "bg-sidebar-active text-sidebar-active-foreground shadow-[inset_3px_0_0_var(--sidebar-active-indicator)] hover:bg-sidebar-active hover:text-sidebar-active-foreground [&>svg]:text-sidebar-active-foreground",
@@ -752,7 +755,7 @@ function NavigationSubList({
752
755
  {
753
756
  "data-slot": "navigation-sub-list",
754
757
  className: cn(
755
- "ml-4 flex min-w-0 flex-col gap-1 border-l border-sidebar-border pl-2 group-data-[sidebar-state=collapsed]/shell:hidden",
758
+ "ml-4 flex min-w-0 flex-col gap-[var(--ds-sidebar-item-gap)] border-l border-sidebar-border pl-2 group-data-[sidebar-state=collapsed]/shell:hidden",
756
759
  className
757
760
  ),
758
761
  ...props
@@ -829,7 +832,7 @@ function SidebarSearch({
829
832
  type: "button",
830
833
  "data-slot": "sidebar-search-trigger",
831
834
  className: cn(
832
- "flex min-h-[var(--ds-sidebar-item-height-touch)] w-full cursor-pointer items-center gap-2 rounded-[var(--ds-radius-control)] px-2 text-left text-sm font-medium text-sidebar-secondary-text outline-none transition-colors hover:bg-sidebar-hover hover:text-sidebar-primary-text focus-visible:ring-[3px] focus-visible:ring-sidebar-focus-ring lg:min-h-[var(--ds-sidebar-item-height)]",
835
+ "flex min-h-[var(--ds-sidebar-item-height-touch)] w-full cursor-pointer items-center gap-2 rounded-[var(--ds-radius-control)] px-2 text-left text-sm font-medium leading-5 text-sidebar-secondary-text outline-none transition-colors hover:bg-sidebar-hover hover:text-sidebar-primary-text focus-visible:ring-[3px] focus-visible:ring-sidebar-focus-ring lg:min-h-[var(--ds-sidebar-item-height)]",
833
836
  "group-data-[sidebar-state=collapsed]/shell:justify-center group-data-[sidebar-state=collapsed]/shell:px-0",
834
837
  className
835
838
  ),
@@ -913,7 +916,7 @@ function TopBar({
913
916
  {
914
917
  "data-slot": "top-bar",
915
918
  className: cn(
916
- "sticky top-0 z-10 flex min-h-[var(--ds-topbar-height)] shrink-0 items-center justify-between gap-3 border-b border-border-subtle bg-background/96 px-3 backdrop-blur md:px-4",
919
+ "sticky top-0 z-10 flex h-[var(--ds-topbar-height)] min-h-[var(--ds-topbar-height)] shrink-0 items-center justify-between gap-3 border-b border-border-subtle bg-background/96 px-[var(--ds-topbar-padding-x)] backdrop-blur md:px-[var(--ds-topbar-padding-x-wide)]",
917
920
  "supports-[backdrop-filter]:bg-background/88",
918
921
  className
919
922
  ),
@@ -1578,13 +1581,16 @@ function SidebarNavigation({
1578
1581
  {
1579
1582
  "data-slot": "sidebar-navigation",
1580
1583
  "aria-label": "Primary navigation",
1581
- className: cn("flex flex-col gap-1", className),
1584
+ className: cn(
1585
+ "flex flex-col gap-[var(--ds-sidebar-group-gap)]",
1586
+ className
1587
+ ),
1582
1588
  children: entries.map((entry) => {
1583
1589
  if (!isSection(entry)) {
1584
1590
  return /* @__PURE__ */ jsx16(
1585
1591
  NavigationGroup,
1586
1592
  {
1587
- className: entry.startsSection ? "mt-2" : void 0,
1593
+ className: entry.startsSection ? "mt-[var(--ds-sidebar-group-gap)]" : void 0,
1588
1594
  children: /* @__PURE__ */ jsx16(NavigationItem, { asChild: true, active: entry.active, tooltip: entry.label, children: renderLink(entry, {
1589
1595
  "aria-current": entry.active ? "page" : void 0,
1590
1596
  "aria-label": entry.label,
@@ -1604,7 +1610,7 @@ function SidebarNavigation({
1604
1610
  /* @__PURE__ */ jsx16(
1605
1611
  NavigationGroup,
1606
1612
  {
1607
- className: entry.startsSection ? "mt-2" : void 0,
1613
+ className: entry.startsSection ? "mt-[var(--ds-sidebar-group-gap)]" : void 0,
1608
1614
  children: /* @__PURE__ */ jsx16(DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ jsxs14(
1609
1615
  NavigationItem,
1610
1616
  {
@@ -1879,4 +1885,4 @@ export {
1879
1885
  ErrorState,
1880
1886
  ValueMeter
1881
1887
  };
1882
- //# sourceMappingURL=chunk-RFSIC55H.js.map
1888
+ //# sourceMappingURL=chunk-VIVMQAJM.js.map