@path58/ui 2.0.0 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/dist/atoms/Alert/Alert.d.ts +39 -0
  2. package/dist/atoms/Alert/Alert.d.ts.map +1 -0
  3. package/dist/atoms/Alert/Alert.stories.d.ts +12 -0
  4. package/dist/atoms/Alert/Alert.stories.d.ts.map +1 -0
  5. package/dist/atoms/Alert/index.d.ts +3 -0
  6. package/dist/atoms/Alert/index.d.ts.map +1 -0
  7. package/dist/atoms/Banner/Banner.d.ts +48 -0
  8. package/dist/atoms/Banner/Banner.d.ts.map +1 -0
  9. package/dist/atoms/Banner/Banner.stories.d.ts +11 -0
  10. package/dist/atoms/Banner/Banner.stories.d.ts.map +1 -0
  11. package/dist/atoms/Banner/index.d.ts +3 -0
  12. package/dist/atoms/Banner/index.d.ts.map +1 -0
  13. package/dist/atoms/StatusPill/StatusPill.d.ts +47 -0
  14. package/dist/atoms/StatusPill/StatusPill.d.ts.map +1 -0
  15. package/dist/atoms/StatusPill/index.d.ts +3 -0
  16. package/dist/atoms/StatusPill/index.d.ts.map +1 -0
  17. package/dist/atoms/Toast/Toast.d.ts +49 -0
  18. package/dist/atoms/Toast/Toast.d.ts.map +1 -0
  19. package/dist/atoms/Toast/Toast.stories.d.ts +10 -0
  20. package/dist/atoms/Toast/Toast.stories.d.ts.map +1 -0
  21. package/dist/atoms/Toast/index.d.ts +3 -0
  22. package/dist/atoms/Toast/index.d.ts.map +1 -0
  23. package/dist/atoms/index.d.ts +4 -0
  24. package/dist/atoms/index.d.ts.map +1 -1
  25. package/dist/index.d.ts +15 -0
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +1974 -411
  28. package/dist/molecules/ConfirmDialog/ConfirmDialog.d.ts +43 -0
  29. package/dist/molecules/ConfirmDialog/ConfirmDialog.d.ts.map +1 -0
  30. package/dist/molecules/ConfirmDialog/ConfirmDialog.stories.d.ts +9 -0
  31. package/dist/molecules/ConfirmDialog/ConfirmDialog.stories.d.ts.map +1 -0
  32. package/dist/molecules/ConfirmDialog/index.d.ts +3 -0
  33. package/dist/molecules/ConfirmDialog/index.d.ts.map +1 -0
  34. package/dist/molecules/Modal/Modal.d.ts +39 -0
  35. package/dist/molecules/Modal/Modal.d.ts.map +1 -0
  36. package/dist/molecules/Modal/Modal.stories.d.ts +11 -0
  37. package/dist/molecules/Modal/Modal.stories.d.ts.map +1 -0
  38. package/dist/molecules/Modal/index.d.ts +3 -0
  39. package/dist/molecules/Modal/index.d.ts.map +1 -0
  40. package/dist/molecules/PromptDialog/PromptDialog.d.ts +46 -0
  41. package/dist/molecules/PromptDialog/PromptDialog.d.ts.map +1 -0
  42. package/dist/molecules/PromptDialog/PromptDialog.stories.d.ts +10 -0
  43. package/dist/molecules/PromptDialog/PromptDialog.stories.d.ts.map +1 -0
  44. package/dist/molecules/PromptDialog/index.d.ts +3 -0
  45. package/dist/molecules/PromptDialog/index.d.ts.map +1 -0
  46. package/dist/molecules/index.d.ts +3 -0
  47. package/dist/molecules/index.d.ts.map +1 -1
  48. package/dist/organisms/ToastProvider/ToastProvider.d.ts +53 -0
  49. package/dist/organisms/ToastProvider/ToastProvider.d.ts.map +1 -0
  50. package/dist/organisms/ToastProvider/index.d.ts +4 -0
  51. package/dist/organisms/ToastProvider/index.d.ts.map +1 -0
  52. package/dist/organisms/ToastProvider/useToast.d.ts +28 -0
  53. package/dist/organisms/ToastProvider/useToast.d.ts.map +1 -0
  54. package/dist/organisms/index.d.ts +1 -0
  55. package/dist/organisms/index.d.ts.map +1 -1
  56. package/dist/primitives/Dialog/Dialog.d.ts +63 -0
  57. package/dist/primitives/Dialog/Dialog.d.ts.map +1 -0
  58. package/dist/primitives/Dialog/Dialog.stories.d.ts +9 -0
  59. package/dist/primitives/Dialog/Dialog.stories.d.ts.map +1 -0
  60. package/dist/primitives/Dialog/index.d.ts +3 -0
  61. package/dist/primitives/Dialog/index.d.ts.map +1 -0
  62. package/dist/primitives/index.d.ts +1 -0
  63. package/dist/primitives/index.d.ts.map +1 -1
  64. package/dist/styles.css +1 -1
  65. package/package.json +17 -2
@@ -0,0 +1,43 @@
1
+ import React from 'react';
2
+ import './ConfirmDialog.css';
3
+ export type ConfirmDialogVariant = 'default' | 'danger';
4
+ export interface ConfirmDialogProps {
5
+ /** Whether the dialog is open. */
6
+ open: boolean;
7
+ /** Fires when the user clicks Confirm (or presses Enter on focused confirm). */
8
+ onConfirm: () => void;
9
+ /** Fires when the user clicks Cancel, presses ESC, or clicks the backdrop. */
10
+ onCancel: () => void;
11
+ /** Title rendered in the modal header (used as `aria-labelledby` source). */
12
+ title: string;
13
+ /** Body message — string or rich ReactNode. */
14
+ message: string | React.ReactNode;
15
+ /** Confirm button label. Default "Confirm". */
16
+ confirmLabel?: string;
17
+ /** Cancel button label. Default "Cancel". */
18
+ cancelLabel?: string;
19
+ /**
20
+ * Variant — `default` uses the brand accent for confirm; `danger` routes the
21
+ * confirm CTA to the sacred `--p58-danger` palette (BRAND_ARCH § 5 status
22
+ * semantics; NEVER `--p58-accent`).
23
+ */
24
+ variant?: ConfirmDialogVariant;
25
+ /**
26
+ * When true, both buttons disable and the confirm button shows a spinner.
27
+ * Use during async confirm flow (e.g. delete-in-progress).
28
+ */
29
+ loading?: boolean;
30
+ }
31
+ /**
32
+ * ConfirmDialog — DSGN-3.6.3
33
+ *
34
+ * Modal preset for yes/no flows. Renders a Modal with title + message + a
35
+ * cancel/confirm button group in the footer. The `danger` variant is for
36
+ * destructive actions (delete, discard) and routes the confirm CTA through
37
+ * the sacred status palette (`--p58-danger`).
38
+ *
39
+ * Composition stack: ConfirmDialog → Modal → Dialog (focus-trap + ARIA).
40
+ */
41
+ export declare const ConfirmDialog: React.FC<ConfirmDialogProps>;
42
+ export default ConfirmDialog;
43
+ //# sourceMappingURL=ConfirmDialog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConfirmDialog.d.ts","sourceRoot":"","sources":["../../../src/molecules/ConfirmDialog/ConfirmDialog.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAgB,MAAM,OAAO,CAAC;AAGrC,OAAO,qBAAqB,CAAC;AAE7B,MAAM,MAAM,oBAAoB,GAAG,SAAS,GAAG,QAAQ,CAAC;AAExD,MAAM,WAAW,kBAAkB;IACjC,kCAAkC;IAClC,IAAI,EAAE,OAAO,CAAC;IACd,gFAAgF;IAChF,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,8EAA8E;IAC9E,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,6EAA6E;IAC7E,KAAK,EAAE,MAAM,CAAC;IACd,+CAA+C;IAC/C,OAAO,EAAE,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC;IAClC,+CAA+C;IAC/C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,6CAA6C;IAC7C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;OAIG;IACH,OAAO,CAAC,EAAE,oBAAoB,CAAC;IAC/B;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC,kBAAkB,CAsDtD,CAAC;AAEF,eAAe,aAAa,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { Meta, StoryObj } from '@storybook/react';
2
+ import { ConfirmDialog } from './ConfirmDialog';
3
+ declare const meta: Meta<typeof ConfirmDialog>;
4
+ export default meta;
5
+ type Story = StoryObj<typeof ConfirmDialog>;
6
+ export declare const Default: Story;
7
+ export declare const Danger: Story;
8
+ export declare const Loading: Story;
9
+ //# sourceMappingURL=ConfirmDialog.stories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConfirmDialog.stories.d.ts","sourceRoot":"","sources":["../../../src/molecules/ConfirmDialog/ConfirmDialog.stories.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,aAAa,CAIpC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,aAAa,CAAC,CAAC;AAwB5C,eAAO,MAAM,OAAO,EAAE,KAAkC,CAAC;AACzD,eAAO,MAAM,MAAM,EAAE,KAUpB,CAAC;AACF,eAAO,MAAM,OAAO,EAAE,KAKrB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { ConfirmDialog, type ConfirmDialogProps, type ConfirmDialogVariant, } from './ConfirmDialog';
2
+ export { default } from './ConfirmDialog';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/molecules/ConfirmDialog/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,GAC1B,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,39 @@
1
+ import React from 'react';
2
+ import { type DialogProps } from '../../primitives/Dialog';
3
+ import './Modal.css';
4
+ export type ModalSize = 'sm' | 'md' | 'lg';
5
+ export interface ModalProps extends Omit<DialogProps, 'children'> {
6
+ /** Header slot (typically `<h2 id="...">Title</h2>` referenced by aria-labelledby). */
7
+ header?: React.ReactNode;
8
+ /** Body slot. */
9
+ children: React.ReactNode;
10
+ /** Footer slot (typically action buttons). */
11
+ footer?: React.ReactNode;
12
+ /** Size variant — sm (360 px) / md (480 px, default) / lg (640 px). */
13
+ size?: ModalSize;
14
+ /**
15
+ * Whether the dismissive close × is rendered in the header. Default true.
16
+ * The × always triggers `onClose`. Useful to set false for forced-decision
17
+ * flows (ConfirmDialog danger variant may opt to set this false).
18
+ */
19
+ dismissible?: boolean;
20
+ }
21
+ /**
22
+ * Modal — DSGN-3.6.3
23
+ *
24
+ * Dialog + content slots. Composes the Dialog primitive (DSGN-3.6.2); does
25
+ * NOT re-instantiate FocusTrap — Dialog already owns the trap.
26
+ *
27
+ * Slots:
28
+ * - `header` → top, with optional × dismiss control on the right
29
+ * - children → body (the default slot)
30
+ * - `footer` → bottom (typically action buttons)
31
+ *
32
+ * Sizes: sm 360 px / md 480 px (default) / lg 640 px — driven by CSS classes.
33
+ * No px literals in TSX.
34
+ *
35
+ * Token consumption: per DSGN-3.6.1 D1 Modal row.
36
+ */
37
+ export declare const Modal: React.FC<ModalProps>;
38
+ export default Modal;
39
+ //# sourceMappingURL=Modal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Modal.d.ts","sourceRoot":"","sources":["../../../src/molecules/Modal/Modal.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAU,KAAK,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,aAAa,CAAC;AAErB,MAAM,MAAM,SAAS,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAE3C,MAAM,WAAW,UAAW,SAAQ,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC;IAC/D,uFAAuF;IACvF,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,iBAAiB;IACjB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,8CAA8C;IAC9C,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,uEAAuE;IACvE,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB;;;;OAIG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC,UAAU,CAmCtC,CAAC;AAEF,eAAe,KAAK,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { Meta, StoryObj } from '@storybook/react';
2
+ import { Modal } from './Modal';
3
+ declare const meta: Meta<typeof Modal>;
4
+ export default meta;
5
+ type Story = StoryObj<typeof Modal>;
6
+ export declare const Default: Story;
7
+ export declare const Small: Story;
8
+ export declare const Large: Story;
9
+ export declare const HeaderOnly: Story;
10
+ export declare const NonDismissible: Story;
11
+ //# sourceMappingURL=Modal.stories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Modal.stories.d.ts","sourceRoot":"","sources":["../../../src/molecules/Modal/Modal.stories.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAEhC,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,KAAK,CAI5B,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,KAAK,CAAC,CAAC;AAiCpC,eAAO,MAAM,OAAO,EAAE,KAAkC,CAAC;AACzD,eAAO,MAAM,KAAK,EAAE,KAA4C,CAAC;AACjE,eAAO,MAAM,KAAK,EAAE,KAA4C,CAAC;AACjE,eAAO,MAAM,UAAU,EAAE,KAAqD,CAAC;AAC/E,eAAO,MAAM,cAAc,EAAE,KAK5B,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { Modal, type ModalProps, type ModalSize } from './Modal';
2
+ export { default } from './Modal';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/molecules/Modal/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,KAAK,UAAU,EAAE,KAAK,SAAS,EAAE,MAAM,SAAS,CAAC;AACjE,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC"}
@@ -0,0 +1,46 @@
1
+ import React from 'react';
2
+ import './PromptDialog.css';
3
+ export type PromptDialogInputType = 'text' | 'email' | 'url';
4
+ export interface PromptDialogProps {
5
+ /** Whether the dialog is open. */
6
+ open: boolean;
7
+ /** Fires with the input value when the user confirms. */
8
+ onConfirm: (value: string) => void;
9
+ /** Fires when the user cancels (Cancel click, ESC, backdrop click). */
10
+ onCancel: () => void;
11
+ /** Title rendered in the modal header (used as aria-labelledby source). */
12
+ title: string;
13
+ /** Label rendered above the input. */
14
+ label: string;
15
+ /** Placeholder text. */
16
+ placeholder?: string;
17
+ /** Initial value when the dialog opens. */
18
+ defaultValue?: string;
19
+ /** Confirm button label. Default "Save". */
20
+ confirmLabel?: string;
21
+ /** Cancel button label. Default "Cancel". */
22
+ cancelLabel?: string;
23
+ /** When true, blocks empty-string submit. Default false. */
24
+ required?: boolean;
25
+ /** HTML input type. Default 'text'. */
26
+ inputType?: PromptDialogInputType;
27
+ /**
28
+ * Custom validator. Receives the current value; returns an error string to
29
+ * display (and block submit) or `undefined` to accept. Runs on blur + submit.
30
+ */
31
+ validator?: (value: string) => string | undefined;
32
+ }
33
+ /**
34
+ * PromptDialog — DSGN-3.6.3
35
+ *
36
+ * Modal + single-input preset. Internal state for the input value (controlled
37
+ * internally to keep the consumer API minimal — value emits via onConfirm).
38
+ * Validation runs on blur + submit. Errors render inline with
39
+ * `aria-describedby` so screen-readers announce them when the input regains
40
+ * focus.
41
+ *
42
+ * Composition stack: PromptDialog → Modal → Dialog (focus-trap + ARIA).
43
+ */
44
+ export declare const PromptDialog: React.FC<PromptDialogProps>;
45
+ export default PromptDialog;
46
+ //# sourceMappingURL=PromptDialog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PromptDialog.d.ts","sourceRoot":"","sources":["../../../src/molecules/PromptDialog/PromptDialog.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAqC,MAAM,OAAO,CAAC;AAI1D,OAAO,oBAAoB,CAAC;AAE5B,MAAM,MAAM,qBAAqB,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK,CAAC;AAE7D,MAAM,WAAW,iBAAiB;IAChC,kCAAkC;IAClC,IAAI,EAAE,OAAO,CAAC;IACd,yDAAyD;IACzD,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,uEAAuE;IACvE,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,2EAA2E;IAC3E,KAAK,EAAE,MAAM,CAAC;IACd,sCAAsC;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,wBAAwB;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,2CAA2C;IAC3C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,4CAA4C;IAC5C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,6CAA6C;IAC7C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,uCAAuC;IACvC,SAAS,CAAC,EAAE,qBAAqB,CAAC;IAClC;;;OAGG;IACH,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;CACnD;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,iBAAiB,CAgGpD,CAAC;AAEF,eAAe,YAAY,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { Meta, StoryObj } from '@storybook/react';
2
+ import { PromptDialog } from './PromptDialog';
3
+ declare const meta: Meta<typeof PromptDialog>;
4
+ export default meta;
5
+ type Story = StoryObj<typeof PromptDialog>;
6
+ export declare const Default: Story;
7
+ export declare const Required: Story;
8
+ export declare const Email: Story;
9
+ export declare const WithValidator: Story;
10
+ //# sourceMappingURL=PromptDialog.stories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PromptDialog.stories.d.ts","sourceRoot":"","sources":["../../../src/molecules/PromptDialog/PromptDialog.stories.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,YAAY,CAInC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,YAAY,CAAC,CAAC;AA0B3C,eAAO,MAAM,OAAO,EAAE,KAAkC,CAAC;AACzD,eAAO,MAAM,QAAQ,EAAE,KAKtB,CAAC;AACF,eAAO,MAAM,KAAK,EAAE,KAKnB,CAAC;AACF,eAAO,MAAM,aAAa,EAAE,KAW3B,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { PromptDialog, type PromptDialogProps, type PromptDialogInputType, } from './PromptDialog';
2
+ export { default } from './PromptDialog';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/molecules/PromptDialog/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,GAC3B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC"}
@@ -8,4 +8,7 @@ export * from './TagBadge';
8
8
  export * from './InfoCard';
9
9
  export * from './CategoryHeader';
10
10
  export * from './FileItem';
11
+ export * from './Modal';
12
+ export * from './ConfirmDialog';
13
+ export * from './PromptDialog';
11
14
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/molecules/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC;AACjC,cAAc,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/molecules/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC;AACjC,cAAc,YAAY,CAAC;AAG3B,cAAc,SAAS,CAAC;AACxB,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC"}
@@ -0,0 +1,53 @@
1
+ import React from 'react';
2
+ import { type ToastAction, type ToastVariant } from '../../atoms/Toast';
3
+ import './ToastProvider.css';
4
+ export { useToast } from './useToast';
5
+ export type ToastPosition = 'top-right' | 'top-left' | 'bottom-right' | 'bottom-left';
6
+ export interface ToastInit {
7
+ message: string | React.ReactNode;
8
+ variant?: ToastVariant;
9
+ /** Auto-dismiss after this many ms. `-1` = persistent. Default: provider's `defaultDuration`. */
10
+ duration?: number;
11
+ action?: ToastAction;
12
+ }
13
+ export interface ToastApi {
14
+ /** Fire a generic toast; returns the toast id (used to dismiss later). */
15
+ toast: ((opts: ToastInit) => string) & {
16
+ success: (message: ToastInit['message'], opts?: Omit<ToastInit, 'message' | 'variant'>) => string;
17
+ warning: (message: ToastInit['message'], opts?: Omit<ToastInit, 'message' | 'variant'>) => string;
18
+ danger: (message: ToastInit['message'], opts?: Omit<ToastInit, 'message' | 'variant'>) => string;
19
+ info: (message: ToastInit['message'], opts?: Omit<ToastInit, 'message' | 'variant'>) => string;
20
+ };
21
+ /** Dismiss a specific toast by id. */
22
+ dismiss: (id: string) => void;
23
+ /** Dismiss every visible toast. */
24
+ dismissAll: () => void;
25
+ }
26
+ /**
27
+ * React Context published by ToastProvider; consumed by useToast (sibling
28
+ * module). Exported so the hook in useToast.ts can read it.
29
+ */
30
+ export declare const ToastContext: React.Context<ToastApi | null>;
31
+ export interface ToastProviderProps {
32
+ children: React.ReactNode;
33
+ /** Stack position. Default top-right. */
34
+ position?: ToastPosition;
35
+ /** Max simultaneously visible. Oldest dismisses when queue exceeds. Default 3. */
36
+ maxVisible?: number;
37
+ /** Default auto-dismiss in ms (when a toast doesn't specify its own). Default 5000. */
38
+ defaultDuration?: number;
39
+ /** Portal mount target. Default `document.body`. */
40
+ portalRoot?: HTMLElement;
41
+ }
42
+ /**
43
+ * ToastProvider — DSGN-3.6.4 (organism)
44
+ *
45
+ * Owns the toast queue + portal mount + position stack. Consumers wrap their
46
+ * app once at the root and use `useToast()` anywhere underneath.
47
+ *
48
+ * SSR note: portal mount is deferred to `useEffect` (client-only) — works under
49
+ * Next.js / Remix without hydration mismatch warnings.
50
+ */
51
+ export declare const ToastProvider: React.FC<ToastProviderProps>;
52
+ export default ToastProvider;
53
+ //# sourceMappingURL=ToastProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ToastProvider.d.ts","sourceRoot":"","sources":["../../../src/organisms/ToastProvider/ToastProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAMN,MAAM,OAAO,CAAC;AAEf,OAAO,EAAS,KAAK,WAAW,EAAE,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC/E,OAAO,qBAAqB,CAAC;AAK7B,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,MAAM,MAAM,aAAa,GACrB,WAAW,GACX,UAAU,GACV,cAAc,GACd,aAAa,CAAC;AAElB,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC;IAClC,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,iGAAiG;IACjG,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAMD,MAAM,WAAW,QAAQ;IACvB,0EAA0E;IAC1E,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,SAAS,KAAK,MAAM,CAAC,GAAG;QACrC,OAAO,EAAE,CAAC,OAAO,EAAE,SAAS,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,SAAS,EAAE,SAAS,GAAG,SAAS,CAAC,KAAK,MAAM,CAAC;QAClG,OAAO,EAAE,CAAC,OAAO,EAAE,SAAS,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,SAAS,EAAE,SAAS,GAAG,SAAS,CAAC,KAAK,MAAM,CAAC;QAClG,MAAM,EAAG,CAAC,OAAO,EAAE,SAAS,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,SAAS,EAAE,SAAS,GAAG,SAAS,CAAC,KAAK,MAAM,CAAC;QAClG,IAAI,EAAK,CAAC,OAAO,EAAE,SAAS,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,SAAS,EAAE,SAAS,GAAG,SAAS,CAAC,KAAK,MAAM,CAAC;KACnG,CAAC;IACF,sCAAsC;IACtC,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9B,mCAAmC;IACnC,UAAU,EAAE,MAAM,IAAI,CAAC;CACxB;AAED;;;GAGG;AACH,eAAO,MAAM,YAAY,gCAAuC,CAAC;AAEjE,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,yCAAyC;IACzC,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,kFAAkF;IAClF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,uFAAuF;IACvF,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,oDAAoD;IACpD,UAAU,CAAC,EAAE,WAAW,CAAC;CAC1B;AAKD;;;;;;;;GAQG;AACH,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC,kBAAkB,CA+EtD,CAAC;AAEF,eAAe,aAAa,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { ToastProvider, ToastContext, type ToastProviderProps, type ToastPosition, type ToastInit, type ToastApi, } from './ToastProvider';
2
+ export { useToast } from './useToast';
3
+ export { default } from './ToastProvider';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/organisms/ToastProvider/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,YAAY,EACZ,KAAK,kBAAkB,EACvB,KAAK,aAAa,EAClB,KAAK,SAAS,EACd,KAAK,QAAQ,GACd,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,28 @@
1
+ import { type ToastApi } from './ToastProvider';
2
+ /**
3
+ * useToast — DSGN-3.6.4 (hook)
4
+ *
5
+ * Returns the toast API. Must be called inside a `<ToastProvider>` subtree.
6
+ *
7
+ * Outside a Provider:
8
+ * - Dev mode → console.warn ("[useToast] called outside <ToastProvider>...")
9
+ * - All modes → returns a stable no-op API so calls don't crash partial trees
10
+ *
11
+ * Convenience methods are available on the returned `toast`:
12
+ * - `toast(opts)` — generic; opts: { message, variant?, duration?, action? }
13
+ * - `toast.success(msg, opts?)` — pre-set variant: success
14
+ * - `toast.warning(msg, opts?)` — pre-set variant: warning
15
+ * - `toast.danger(msg, opts?)` — pre-set variant: danger
16
+ * - `toast.info(msg, opts?)` — pre-set variant: info
17
+ *
18
+ * Plus `dismiss(id)` to remove a specific toast and `dismissAll()` to clear.
19
+ *
20
+ * Extracted to a standalone module per DSGN-3.6.4 ASSIGNMENT D3
21
+ * (`production/packages/ui/src/organisms/ToastProvider/useToast.ts`).
22
+ * ToastContext + Provider stay in ToastProvider.tsx; this hook reads the
23
+ * context but ships separately so consumers and tree-shakers see the
24
+ * cleanest dependency cut.
25
+ */
26
+ export declare const useToast: () => ToastApi;
27
+ export default useToast;
28
+ //# sourceMappingURL=useToast.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useToast.d.ts","sourceRoot":"","sources":["../../../src/organisms/ToastProvider/useToast.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,KAAK,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE9D;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,eAAO,MAAM,QAAQ,QAAO,QA2B3B,CAAC;AAEF,eAAe,QAAQ,CAAC"}
@@ -7,4 +7,5 @@ export * from './SearchSection';
7
7
  export * from './TagFilterList';
8
8
  export * from './CategoryGroup';
9
9
  export * from './ArtifactList';
10
+ export * from './ToastProvider';
10
11
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/organisms/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/organisms/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAI/B,cAAc,iBAAiB,CAAC"}
@@ -0,0 +1,63 @@
1
+ import React from 'react';
2
+ import './Dialog.css';
3
+ export interface DialogProps {
4
+ /** Whether the dialog is open. Render is a no-op when false. */
5
+ open: boolean;
6
+ /** Called when the dialog should close (ESC, backdrop click, programmatic). */
7
+ onClose: () => void;
8
+ /** Content rendered inside the dialog surface. */
9
+ children: React.ReactNode;
10
+ /**
11
+ * Required: id of the element labelling this dialog. Pair with `<h2 id="...">`
12
+ * or similar inside `children`. Enables WCAG 4.1.2 "Name, Role, Value".
13
+ */
14
+ 'aria-labelledby': string;
15
+ /** Optional: id of the element describing this dialog (typically the body paragraph). */
16
+ 'aria-describedby'?: string;
17
+ /**
18
+ * Optional initial focus target. If omitted, focus-trap-react chooses the
19
+ * first focusable child. Pass a ref when the consumer wants explicit control
20
+ * (e.g. focusing an input when a Prompt opens).
21
+ */
22
+ initialFocus?: React.RefObject<HTMLElement>;
23
+ /** Whether ESC closes the dialog. Default true. */
24
+ closeOnEscape?: boolean;
25
+ /** Whether clicking the backdrop closes the dialog. Default true. */
26
+ closeOnBackdropClick?: boolean;
27
+ /** Whether to lock body scroll while open. Default true. */
28
+ lockScroll?: boolean;
29
+ /**
30
+ * Portal mount target. Default `document.body`. Override when the consumer
31
+ * has a dedicated portal-root (e.g. for stacking-context isolation in
32
+ * embedded surfaces). DSGN-1.5 / DSGN-2.8 integration risk: may need to
33
+ * override under their portal infrastructure — contract documented.
34
+ */
35
+ portalRoot?: HTMLElement;
36
+ /** Additional className applied to the backdrop. */
37
+ className?: string;
38
+ }
39
+ /**
40
+ * Dialog Primitive — DSGN-3.6.2
41
+ *
42
+ * Neutral overlay container. Brand-agnostic at the substrate level: renders
43
+ * correctly under any active theme via token-driven CSS — no per-theme
44
+ * branching. Composed by Modal / ConfirmDialog / PromptDialog (DSGN-3.6.3).
45
+ *
46
+ * Behaviour:
47
+ * - Portal-mounts to `portalRoot` (default `document.body`).
48
+ * - Focus-trap engages while `open=true` (via `focus-trap-react`).
49
+ * - On unmount, focus restores to the element that opened the dialog.
50
+ * - ESC closes (unless `closeOnEscape=false`).
51
+ * - Backdrop click closes (unless `closeOnBackdropClick=false`).
52
+ * - Body scroll locks while open (unless `lockScroll=false`).
53
+ *
54
+ * A11y:
55
+ * - `role="dialog"` + `aria-modal="true"` on the surface.
56
+ * - `aria-labelledby` is REQUIRED. Dev build emits a `console.warn` if missing.
57
+ * - `aria-describedby` is optional; route to the body paragraph's id.
58
+ *
59
+ * Token consumption: per DSGN-3.6.1 D1 (token-consumption-table.md) Dialog row.
60
+ */
61
+ export declare const Dialog: React.FC<DialogProps>;
62
+ export default Dialog;
63
+ //# sourceMappingURL=Dialog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Dialog.d.ts","sourceRoot":"","sources":["../../../src/primitives/Dialog/Dialog.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA4B,MAAM,OAAO,CAAC;AAGjD,OAAO,cAAc,CAAC;AAEtB,MAAM,WAAW,WAAW;IAC1B,gEAAgE;IAChE,IAAI,EAAE,OAAO,CAAC;IACd,+EAA+E;IAC/E,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,kDAAkD;IAClD,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B;;;OAGG;IACH,iBAAiB,EAAE,MAAM,CAAC;IAC1B,yFAAyF;IACzF,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B;;;;OAIG;IACH,YAAY,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IAC5C,mDAAmD;IACnD,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,qEAAqE;IACrE,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,4DAA4D;IAC5D,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,WAAW,CAAC;IACzB,oDAAoD;IACpD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,WAAW,CAuFxC,CAAC;AAEF,eAAe,MAAM,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { Meta, StoryObj } from '@storybook/react';
2
+ import { Dialog } from './Dialog';
3
+ declare const meta: Meta<typeof Dialog>;
4
+ export default meta;
5
+ type Story = StoryObj<typeof Dialog>;
6
+ export declare const Default: Story;
7
+ export declare const EscapeDisabled: Story;
8
+ export declare const BackdropClickDisabled: Story;
9
+ //# sourceMappingURL=Dialog.stories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Dialog.stories.d.ts","sourceRoot":"","sources":["../../../src/primitives/Dialog/Dialog.stories.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,MAAM,CAc7B,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,MAAM,CAAC,CAAC;AAyBrC,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,KAK5B,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE,KAKnC,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { Dialog, type DialogProps } from './Dialog';
2
+ export { default } from './Dialog';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/primitives/Dialog/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,WAAW,EAAE,MAAM,UAAU,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC"}
@@ -14,6 +14,7 @@ export { P58Button } from './P58Button';
14
14
  export { P58Card } from './P58Card';
15
15
  export { P58Eyebrow } from './P58Eyebrow';
16
16
  export { P58Metric } from './P58Metric';
17
+ export { Dialog, type DialogProps } from './Dialog';
17
18
  export type { P58IconProps } from './P58Icon';
18
19
  export type { P58ButtonProps, P58ButtonVariant, P58ButtonSize } from './P58Button';
19
20
  export type { P58CardProps } from './P58Card';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/primitives/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,YAAY,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAC9C,YAAY,EAAE,cAAc,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACnF,YAAY,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAC9C,YAAY,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACpD,YAAY,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/primitives/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAIxC,OAAO,EAAE,MAAM,EAAE,KAAK,WAAW,EAAE,MAAM,UAAU,CAAC;AAEpD,YAAY,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAC9C,YAAY,EAAE,cAAc,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACnF,YAAY,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAC9C,YAAY,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACpD,YAAY,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC"}
package/dist/styles.css CHANGED
@@ -1 +1 @@
1
- :root{--p58-bg: #0a0a1a;--p58-surface: #0e0e24;--p58-surface-2: #14142e;--p58-surface-3: #1b1b3a;--p58-fg-1: #f5f6fb;--p58-fg-2: #b8bad0;--p58-fg-3: #7b7e9c;--p58-fg-4: #4a4d6b;--p58-border: rgba(255, 255, 255, .08);--p58-border-strong: rgba(255, 255, 255, .14);--p58-border-subtle: rgba(255, 255, 255, .04);--p58-teal: #00d4aa;--p58-teal-hover: #1ee5bd;--p58-teal-press: #00b892;--p58-teal-dim: #00d4aa22;--p58-teal-glow: #00d4aa44;--p58-teal-text-on-light: #007a63;--p58-on-accent: #0d1d4d;--p58-accent-fg: var(--p58-teal);--p58-accent: var(--p58-teal);--p58-accent-hover: var(--p58-teal-hover);--p58-accent-press: var(--p58-teal-press);--p58-accent-dim: var(--p58-teal-dim);--p58-accent-glow: var(--p58-teal-glow);--p58-icon-accent-soft: color-mix(in srgb, var(--p58-teal) 70%, transparent);--p58-blue-50: #f8f8fa;--p58-blue-100: #eeeff3;--p58-blue-200: #e0e2e8;--p58-blue-300: #c7cbd6;--p58-blue-400: #adb2c2;--p58-blue-500: #9097ad;--p58-blue-600: #6e7794;--p58-blue-700: #4c587b;--p58-blue-800: #2c3a64;--p58-blue-900: #0d1d4d;--p58-lime: #9ab64a;--p58-lime-text-on-light: #5e8a23;--p58-lime-wash: rgba(154, 182, 74, .32);--p58-lime-300: #c7d79b;--p58-lime-700: #6c7f34;--p58-success: #00d4aa;--p58-success-dim: #00d4aa1a;--p58-warning: #f5a623;--p58-warning-dim: #f5a6231a;--p58-danger: #ff4757;--p58-danger-dim: #ff47571a;--p58-info: #5aa9ff;--p58-info-dim: #5aa9ff1a;--p58-trend-neutral: var(--p58-fg-2);--p58-trend-muted: var(--p58-fg-3);--p58-trend-negative: #ff4757;--p58-trend-positive: var(--p58-accent);--p58-viz-1: #00d4aa;--p58-viz-2: #5aa9ff;--p58-viz-3: #c084fc;--p58-viz-4: #f5a623;--p58-viz-5: #ff4757;--p58-viz-6: #7b7e9c;--p58-font-display: "Space Grotesk", ui-sans-serif, system-ui, sans-serif;--p58-font-ui: "Inter", ui-sans-serif, system-ui, -apple-system, sans-serif;--p58-font-mono: "JetBrains Mono", ui-monospace, "Menlo", "Monaco", monospace;--p58-text-2xs: 10px;--p58-text-xs: 11px;--p58-text-sm: 12px;--p58-text-md: 13px;--p58-text-base:14px;--p58-text-lg: 16px;--p58-text-xl: 20px;--p58-text-2xl: 24px;--p58-text-3xl: 32px;--p58-text-4xl: 40px;--p58-text-5xl: 56px;--p58-text-6xl: 72px;--p58-weight-light: 300;--p58-weight-regular: 400;--p58-weight-medium: 500;--p58-weight-semibold:600;--p58-weight-bold: 700;--p58-leading-tight: 1.15;--p58-leading-snug: 1.3;--p58-leading-normal: 1.5;--p58-leading-loose: 1.7;--p58-tracking-tight: -.02em;--p58-tracking-normal: 0;--p58-tracking-wide: .04em;--p58-tracking-caps: .12em;--p58-space-0: 0;--p58-space-1: 4px;--p58-space-2: 8px;--p58-space-3: 12px;--p58-space-4: 16px;--p58-space-5: 20px;--p58-space-6: 24px;--p58-space-8: 32px;--p58-space-10: 40px;--p58-space-12: 48px;--p58-space-16: 64px;--p58-space-20: 80px;--p58-space-24: 96px;--p58-radius-none: 0;--p58-radius-sm: 2px;--p58-radius-md: 4px;--p58-radius-lg: 6px;--p58-radius-xl: 10px;--p58-radius-full: 999px;--p58-elev-1-bg: #0e0e24;--p58-elev-1-border: rgba(255, 255, 255, .08);--p58-elev-2-bg: #13132f;--p58-elev-2-border: rgba(255, 255, 255, .15);--p58-elev-3-bg: #16163a;--p58-elev-3-border: rgba(255, 255, 255, .22);--p58-shadow-inset: inset 0 1px 0 rgba(255, 255, 255, .03);--p58-glow-accent: 0 0 0 1px var(--p58-accent), 0 0 16px var(--p58-accent-glow);--p58-ring-focus: 0 0 0 2px var(--p58-bg), 0 0 0 4px var(--p58-accent);--p58-ease: cubic-bezier(.2, .6, .2, 1);--p58-ease-in: cubic-bezier(.4, 0, 1, 1);--p58-duration-fast: .12s;--p58-duration-base: .18s;--p58-duration-slow: .26s;--p58-z-base: 1;--p58-z-sticky: 10;--p58-z-dropdown:100;--p58-z-modal: 1000;--p58-z-toast: 2000;--p58-brand-3p-react: #61DAFB;--p58-brand-3p-react-hover: #4DD0E1;--p58-brand-3p-html5: #E34F26;--p58-brand-3p-html5-hover: #F06529}html,body{background:var(--p58-bg);color:var(--p58-fg-1);font-family:var(--p58-font-ui);font-size:var(--p58-text-md);line-height:var(--p58-leading-normal);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.p58-h1,h1.p58{font-family:var(--p58-font-display);font-size:var(--p58-text-5xl);font-weight:var(--p58-weight-semibold);line-height:var(--p58-leading-tight);letter-spacing:var(--p58-tracking-tight);color:var(--p58-fg-1)}.p58-h2,h2.p58{font-family:var(--p58-font-display);font-size:var(--p58-text-3xl);font-weight:var(--p58-weight-semibold);line-height:var(--p58-leading-tight);letter-spacing:var(--p58-tracking-tight);color:var(--p58-fg-1)}.p58-h3,h3.p58{font-family:var(--p58-font-display);font-size:var(--p58-text-2xl);font-weight:var(--p58-weight-medium);line-height:var(--p58-leading-snug);color:var(--p58-fg-1)}.p58-h4,h4.p58{font-family:var(--p58-font-display);font-size:var(--p58-text-xl);font-weight:var(--p58-weight-medium);line-height:var(--p58-leading-snug);color:var(--p58-fg-1)}.p58-body{font-family:var(--p58-font-ui);font-size:var(--p58-text-md);font-weight:var(--p58-weight-regular);line-height:var(--p58-leading-normal);color:var(--p58-fg-2)}.p58-body-lg{font-family:var(--p58-font-ui);font-size:var(--p58-text-lg);line-height:var(--p58-leading-normal);color:var(--p58-fg-2)}.p58-small{font-size:var(--p58-text-sm);color:var(--p58-fg-3)}.p58-eyebrow{font-family:var(--p58-font-mono);font-size:var(--p58-text-xs);font-weight:var(--p58-weight-medium);text-transform:uppercase;letter-spacing:var(--p58-tracking-caps);color:var(--p58-fg-3)}.p58-code,code.p58,kbd.p58{font-family:var(--p58-font-mono);font-size:.92em;color:var(--p58-fg-1);background:var(--p58-surface-2);border:1px solid var(--p58-border);border-radius:var(--p58-radius-sm);padding:1px 5px}.p58-metric{font-family:var(--p58-font-mono);font-size:var(--p58-text-4xl);font-weight:var(--p58-weight-medium);line-height:1;letter-spacing:-.01em;color:var(--p58-fg-1);font-variant-numeric:tabular-nums}.p58-metric-sm{font-family:var(--p58-font-mono);font-size:var(--p58-text-xl);font-weight:var(--p58-weight-medium);line-height:1;color:var(--p58-fg-1);font-variant-numeric:tabular-nums}.p58-scroll::-webkit-scrollbar{width:10px;height:10px}.p58-scroll::-webkit-scrollbar-track{background:transparent}.p58-scroll::-webkit-scrollbar-thumb{background:var(--p58-border-strong);border-radius:var(--p58-radius-full);border:2px solid var(--p58-bg)}.p58-scroll::-webkit-scrollbar-thumb:hover{background:var(--p58-fg-4)}::selection{background:var(--p58-accent-dim);color:var(--p58-fg-1)}.p58-trend,.p58-trend-neutral,.p58-trend-negative,.p58-trend-positive{font-family:var(--p58-font-mono);font-size:var(--p58-text-xs);font-variant-numeric:tabular-nums;display:inline-flex;align-items:center;gap:4px;line-height:1}.p58-trend,.p58-trend-neutral{color:var(--p58-trend-neutral)}.p58-trend-negative{color:var(--p58-trend-negative)}.p58-trend-positive{color:var(--p58-trend-positive)}.p58-trend-muted{color:var(--p58-trend-muted);font-family:var(--p58-font-mono);font-size:var(--p58-text-xs)}.p58-trend-baseline{color:var(--p58-trend-muted);font-family:var(--p58-font-mono);font-size:10px;text-transform:uppercase;letter-spacing:.1em;margin-left:2px}.path58-scrollbar{scrollbar-width:thin;scrollbar-color:color-mix(in srgb,var(--p58-teal) 60%,transparent) color-mix(in srgb,var(--p58-bg) 40%,transparent);scrollbar-gutter:stable;padding-right:8px}.path58-scrollbar::-webkit-scrollbar{width:8px!important;height:8px!important;-webkit-appearance:none!important;display:block!important}.path58-scrollbar::-webkit-scrollbar-track{background:color-mix(in srgb,var(--p58-bg) 40%,transparent)!important;border-radius:4px;border:1px solid color-mix(in srgb,var(--p58-teal) 20%,transparent)!important;margin:2px 0;-webkit-appearance:none!important}.path58-scrollbar::-webkit-scrollbar-thumb{background:color-mix(in srgb,var(--p58-teal) 60%,transparent)!important;border-radius:4px;min-height:30px;border:1px solid color-mix(in srgb,var(--p58-teal) 30%,transparent)!important;-webkit-appearance:none!important}.path58-scrollbar::-webkit-scrollbar-thumb:hover{background:color-mix(in srgb,var(--p58-teal) 80%,transparent)!important;border-color:color-mix(in srgb,var(--p58-teal) 50%,transparent)!important}.path58-scrollbar::-webkit-scrollbar:horizontal{height:8px!important}.path58-scrollbar::-webkit-scrollbar-track:horizontal{margin:0 2px}.path58-button{display:inline-flex;align-items:center;justify-content:center;gap:.5rem;border:none;border-radius:6px;font-weight:500;cursor:pointer;transition:all .2s;outline:none;font-family:inherit}.path58-button:focus-visible{outline:2px solid color-mix(in srgb,var(--p58-teal) 50%,transparent);outline-offset:2px}.path58-button:disabled{opacity:.5;cursor:not-allowed}.path58-button--sm{padding:.375rem .75rem;font-size:.75rem;min-height:28px}.path58-button--md{padding:.5rem 1rem;font-size:.875rem;min-height:36px}.path58-button--lg{padding:.75rem 1.5rem;font-size:1rem;min-height:44px}.path58-button--primary{background:color-mix(in srgb,var(--p58-teal) 15%,transparent);border:1px solid color-mix(in srgb,var(--p58-teal) 30%,transparent);color:var(--p58-accent-fg)}.path58-button--primary:hover:not(:disabled){background:color-mix(in srgb,var(--p58-teal) 25%,transparent);border-color:color-mix(in srgb,var(--p58-teal) 50%,transparent)}.path58-button--secondary{background:color-mix(in srgb,var(--p58-bg) 30%,transparent);border:1px solid color-mix(in srgb,var(--p58-teal) 20%,transparent);color:var(--p58-fg-2)}.path58-button--secondary:hover:not(:disabled){background:color-mix(in srgb,var(--p58-bg) 40%,transparent);border-color:color-mix(in srgb,var(--p58-teal) 30%,transparent);color:var(--p58-fg-1)}.path58-button--ghost{background:transparent;border:1px solid transparent;color:var(--p58-fg-3)}.path58-button--ghost:hover:not(:disabled){background:color-mix(in srgb,var(--p58-teal) 5%,transparent);border-color:color-mix(in srgb,var(--p58-teal) 10%,transparent);color:var(--p58-fg-2)}.path58-button--danger{background:color-mix(in srgb,var(--p58-danger) 15%,transparent);border:1px solid color-mix(in srgb,var(--p58-danger) 30%,transparent);color:var(--p58-danger)}.path58-button--danger:hover:not(:disabled){background:color-mix(in srgb,var(--p58-danger) 25%,transparent);border-color:color-mix(in srgb,var(--p58-danger) 50%,transparent)}.path58-button--with-icon{gap:.5rem}.path58-button-icon{display:flex;align-items:center;justify-content:center;flex-shrink:0}.path58-button-text{flex:1;text-align:center}.path58-input{width:100%;padding:.625rem .75rem;background:color-mix(in srgb,var(--p58-bg) 30%,transparent);border:1px solid color-mix(in srgb,var(--p58-teal) 30%,transparent);border-radius:6px;color:var(--p58-fg-1);font-size:.875rem;outline:none;transition:all .2s;font-family:inherit}.path58-input::placeholder{color:var(--p58-fg-4)}.path58-input:focus{border-color:var(--p58-accent-fg);box-shadow:0 0 0 2px color-mix(in srgb,var(--p58-teal) 10%,transparent);background:color-mix(in srgb,var(--p58-bg) 50%,transparent)}.path58-input:disabled{opacity:.5;cursor:not-allowed}.path58-input--search{padding:.625rem 2.5rem .625rem .75rem}.path58-input--error{border-color:color-mix(in srgb,var(--p58-danger) 50%,transparent)}.path58-input--error:focus{border-color:var(--p58-danger);box-shadow:0 0 0 2px color-mix(in srgb,var(--p58-danger) 10%,transparent)}.path58-badge{display:inline-flex;align-items:center;justify-content:center;padding:.375rem .75rem;border-radius:6px;font-size:.75rem;font-weight:400;transition:all .2s;cursor:default}.path58-badge--tag{background:transparent;border:1px solid;color:inherit;cursor:pointer}.path58-badge--tag:hover{opacity:.8;transform:translateY(-1px);box-shadow:0 2px 4px color-mix(in srgb,var(--p58-bg) 20%,transparent)}.path58-badge--tag.path58-badge--active{font-weight:600;box-shadow:0 2px 8px color-mix(in srgb,var(--p58-bg) 30%,transparent)}.path58-badge--filter{display:inline-flex;align-items:center;gap:.25rem;padding:.125rem .5rem;background:color-mix(in srgb,var(--p58-teal) 15%,transparent);border:1px solid color-mix(in srgb,var(--p58-teal) 30%,transparent);border-radius:4px;font-size:.75rem;color:var(--p58-accent-fg)}.path58-badge--default{background:color-mix(in srgb,var(--p58-bg) 30%,transparent);border:1px solid color-mix(in srgb,var(--p58-teal) 20%,transparent);color:var(--p58-fg-2)}.path58-icon{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;transition:all .2s}.path58-icon--html{color:var(--p58-brand-3p-html5)}.path58-icon--html:hover{color:var(--p58-brand-3p-html5-hover)}.path58-icon--tsx{color:var(--p58-brand-3p-react)}.path58-icon--tsx:hover{color:var(--p58-brand-3p-react-hover)}.path58-icon--primary{color:var(--p58-accent-fg)}.path58-icon--default{color:var(--p58-fg-3)}.path58-icon-container{display:flex;align-items:center;justify-content:center;border-radius:6px;flex-shrink:0}.path58-icon-container--sm{width:24px;height:24px}.path58-icon-container--md{width:32px;height:32px}.path58-icon-container--lg{width:40px;height:40px}.path58-icon-container--default{background:color-mix(in srgb,var(--p58-teal) 6%,transparent);color:var(--p58-icon-accent-soft)}.path58-icon-container--primary{background:color-mix(in srgb,var(--p58-teal) 10%,transparent);border:1px solid color-mix(in srgb,var(--p58-teal) 20%,transparent);color:var(--p58-accent-fg)}.path58-icon-container--html{background:color-mix(in srgb,var(--p58-brand-3p-html5) 15%,transparent);color:var(--p58-brand-3p-html5)}.path58-icon-container--tsx{background:color-mix(in srgb,var(--p58-brand-3p-react) 15%,transparent);color:var(--p58-brand-3p-react)}.path58-label{display:flex;align-items:center;gap:.5rem;font-weight:500}.path58-label--section{font-size:.75rem;font-weight:600;color:var(--p58-fg-3);text-transform:uppercase;letter-spacing:.05em}.path58-label--section .path58-label-icon,.path58-label--section .path58-label-text{color:var(--p58-accent-fg)}.path58-label--card{font-size:.625rem;color:var(--p58-fg-3);text-transform:uppercase;letter-spacing:.05em;font-weight:500}.path58-label--default{font-size:.875rem;color:var(--p58-fg-2)}.path58-label-icon{display:flex;align-items:center;justify-content:center;flex-shrink:0}.path58-label-text{flex:1}.path58-container{display:flex;flex-direction:column;border-radius:8px}.path58-container--section{padding:.875rem;background:color-mix(in srgb,var(--p58-bg) 40%,transparent);border:1px solid color-mix(in srgb,var(--p58-teal) 20%,transparent);gap:.75rem}.path58-container--card{padding:.875rem 1rem;background:color-mix(in srgb,var(--p58-bg) 30%,transparent);border:1px solid color-mix(in srgb,var(--p58-teal) 12%,transparent);min-width:120px;min-height:56px;transition:all .2s}.path58-container--card:hover{border-color:color-mix(in srgb,var(--p58-teal) 25%,transparent);background:color-mix(in srgb,var(--p58-bg) 40%,transparent);transform:translateY(-2px);box-shadow:0 4px 12px color-mix(in srgb,var(--p58-teal) 15%,transparent)}.path58-container--default{padding:1rem;background:transparent}.path58-list{display:flex;overflow-y:auto;overflow-x:hidden;min-height:0;-webkit-overflow-scrolling:touch;scrollbar-width:thin;scrollbar-color:color-mix(in srgb,var(--p58-teal) 60%,transparent) color-mix(in srgb,var(--p58-bg) 40%,transparent);scrollbar-gutter:stable}.path58-list::-webkit-scrollbar{width:8px!important;-webkit-appearance:none!important;display:block!important}.path58-list::-webkit-scrollbar-track{background:color-mix(in srgb,var(--p58-bg) 40%,transparent)!important;border-radius:4px;margin:2px 0;border:1px solid color-mix(in srgb,var(--p58-teal) 20%,transparent)!important;-webkit-appearance:none!important}.path58-list::-webkit-scrollbar-thumb{background:color-mix(in srgb,var(--p58-teal) 60%,transparent)!important;border-radius:4px;min-height:30px;border:1px solid color-mix(in srgb,var(--p58-teal) 30%,transparent)!important;-webkit-appearance:none!important}.path58-list::-webkit-scrollbar-thumb:hover{background:color-mix(in srgb,var(--p58-teal) 80%,transparent)!important;border-color:color-mix(in srgb,var(--p58-teal) 50%,transparent)!important}.path58-list--vertical{flex-direction:column;padding:.5rem}.path58-list--horizontal{flex-direction:row;overflow-x:auto;overflow-y:hidden;padding:.5rem}.path58-list--wrap{flex-wrap:wrap;gap:.375rem;padding:0}.path58-list-item{width:100%;display:flex;align-items:center;gap:.5rem;padding:.625rem .75rem;background:transparent;border:1px solid transparent;border-radius:4px;color:var(--p58-fg-2);cursor:pointer;font-size:.8125rem;font-weight:400;text-align:left;transition:all .2s;text-transform:none;letter-spacing:normal}.path58-list-item:hover{background:color-mix(in srgb,var(--p58-teal) 5%,transparent);border-color:color-mix(in srgb,var(--p58-teal) 20%,transparent);color:var(--p58-fg-1)}.path58-list-item--selected{background:color-mix(in srgb,var(--p58-teal) 10%,transparent);border-color:var(--p58-accent-fg);color:var(--p58-accent-fg);font-weight:500}.path58-search-input{position:relative;display:flex;align-items:center;width:100%}.path58-search-input .path58-input{width:100%;padding-right:2.5rem}.path58-search-input-clear{position:absolute;right:.5rem;background:transparent;border:none;color:var(--p58-fg-3);padding:.25rem;border-radius:4px;display:flex;align-items:center;justify-content:center;transition:all .2s}.path58-search-input-clear:hover{color:var(--p58-fg-1);background:color-mix(in srgb,var(--p58-fg-1) 10%,transparent)}.path58-info-card{display:flex;align-items:center;gap:.75rem;position:relative;margin-top:.25rem}.path58-info-card-content{display:flex;flex-direction:column;gap:.125rem;min-width:0;flex:1}.path58-info-card-value{font-size:.9375rem;color:var(--p58-fg-2);font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.path58-info-card-value{display:flex;flex-wrap:wrap;gap:.25rem}.path58-info-card--filters{border-color:color-mix(in srgb,var(--p58-teal) 20%,transparent)}.path58-info-card--selected{border-color:color-mix(in srgb,var(--p58-teal) 25%,transparent);background:color-mix(in srgb,var(--p58-teal) 3%,transparent)}.path58-info-card--category{transition:all .2s}.path58-info-card--clickable{cursor:pointer}.path58-category-header{width:100%;display:flex;align-items:center;gap:.5rem;padding:.75rem;background:color-mix(in srgb,var(--p58-teal) 8%,transparent);border:1px solid color-mix(in srgb,var(--p58-teal) 15%,transparent);color:var(--p58-accent-fg);cursor:pointer;border-radius:6px;font-size:.875rem;font-weight:500;text-transform:uppercase;letter-spacing:.05em;transition:all .2s;margin-bottom:.25rem}.path58-category-header svg{color:var(--p58-accent-fg)}.path58-category-header:hover{background:color-mix(in srgb,var(--p58-teal) 12%,transparent);border-color:color-mix(in srgb,var(--p58-teal) 25%,transparent);color:var(--p58-accent-fg)}.path58-category-name{flex:1;text-align:left}.path58-category-count{color:var(--p58-fg-3);font-weight:400}.path58-category-chevron{transition:transform .2s}.path58-category-chevron--expanded{transform:rotate(90deg)}.path58-file-name{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.path58-search-input-wrapper{position:relative;display:flex;align-items:center;width:100%}.path58-tag-filter{display:flex;flex-direction:column;gap:.5rem;min-width:200px;height:110px;max-height:110px;overflow-y:scroll;overflow-x:hidden;position:relative;padding-right:0}.path58-tag-filter-header{display:flex;align-items:center;gap:.5rem;font-size:.75rem;color:var(--p58-accent-fg);flex-shrink:0}.path58-tag-filter-clear{margin-left:auto}.path58-tag-filter-list{flex:1;min-height:0}.path58-tag-filter-scroll-hint{padding:.25rem .5rem;font-size:.625rem;color:var(--p58-fg-3);text-align:center;font-style:italic;border-top:1px solid color-mix(in srgb,var(--p58-teal) 10%,transparent);margin-top:.25rem;flex-shrink:0}.path58-category-group{margin-bottom:.5rem}.path58-category-file-list{display:flex;flex-direction:column;gap:.25rem;padding-left:.5rem}.path58-artifact-list.path58-list{flex:1 1 0!important;min-height:0!important;overflow-y:scroll!important;overflow-x:hidden!important;scrollbar-width:thin!important;scrollbar-color:color-mix(in srgb,var(--p58-teal) 60%,transparent) color-mix(in srgb,var(--p58-bg) 40%,transparent)!important;scrollbar-gutter:stable!important;-webkit-overflow-scrolling:touch;padding:.5rem!important;display:flex!important;flex-direction:column!important;height:100%!important}.path58-artifact-list::-webkit-scrollbar{width:8px!important;-webkit-appearance:none!important;display:block!important}.path58-artifact-list::-webkit-scrollbar-track{background:color-mix(in srgb,var(--p58-bg) 40%,transparent)!important;border-radius:4px;margin:2px 0;border:1px solid color-mix(in srgb,var(--p58-teal) 20%,transparent)!important;-webkit-appearance:none!important}.path58-artifact-list::-webkit-scrollbar-thumb{background:color-mix(in srgb,var(--p58-teal) 60%,transparent)!important;border-radius:4px;min-height:30px;border:1px solid color-mix(in srgb,var(--p58-teal) 30%,transparent)!important;-webkit-appearance:none!important}.path58-artifact-list::-webkit-scrollbar-thumb:hover{background:color-mix(in srgb,var(--p58-teal) 80%,transparent)!important;border-color:color-mix(in srgb,var(--p58-teal) 50%,transparent)!important}
1
+ :root{--p58-bg: #0a0a1a;--p58-surface: #0e0e24;--p58-surface-2: #14142e;--p58-surface-3: #1b1b3a;--p58-fg-1: #f5f6fb;--p58-fg-2: #b8bad0;--p58-fg-3: #7b7e9c;--p58-fg-4: #4a4d6b;--p58-border: rgba(255, 255, 255, .08);--p58-border-strong: rgba(255, 255, 255, .14);--p58-border-subtle: rgba(255, 255, 255, .04);--p58-overlay-backdrop: color-mix(in srgb, var(--p58-bg) 65%, transparent);--p58-teal: #00d4aa;--p58-teal-hover: #1ee5bd;--p58-teal-press: #00b892;--p58-teal-dim: #00d4aa22;--p58-teal-glow: #00d4aa44;--p58-teal-text-on-light: #007a63;--p58-on-accent: #0d1d4d;--p58-accent-fg: var(--p58-teal);--p58-accent: var(--p58-teal);--p58-accent-hover: var(--p58-teal-hover);--p58-accent-press: var(--p58-teal-press);--p58-accent-dim: var(--p58-teal-dim);--p58-accent-glow: var(--p58-teal-glow);--p58-icon-accent-soft: color-mix(in srgb, var(--p58-teal) 70%, transparent);--p58-blue-50: #f8f8fa;--p58-blue-100: #eeeff3;--p58-blue-200: #e0e2e8;--p58-blue-300: #c7cbd6;--p58-blue-400: #adb2c2;--p58-blue-500: #9097ad;--p58-blue-600: #6e7794;--p58-blue-700: #4c587b;--p58-blue-800: #2c3a64;--p58-blue-900: #0d1d4d;--p58-lime: #9ab64a;--p58-lime-text-on-light: #5e8a23;--p58-lime-wash: rgba(154, 182, 74, .32);--p58-lime-300: #c7d79b;--p58-lime-700: #6c7f34;--p58-axe-accent: #a78bfa;--p58-axe-accent-hover: #baa5fb;--p58-axe-accent-press: #967de1;--p58-axe-accent-dim: color-mix(in srgb, #a78bfa 13%, transparent);--p58-axe-accent-glow: color-mix(in srgb, #a78bfa 27%, transparent);--p58-success-axe: #4ade80;--p58-success-axe-dim: color-mix(in srgb, #4ade80 14%, transparent);--p58-axe-density-card-padding: 14px 16px;--p58-axe-density-tile-padding: 10px 12px;--p58-axe-density-grid-gap: 8px;--p58-axe-density-section-gap: 14px;--p58-axe-density-row-height: 28px;--p58-axe-density-tile-value-fontsize: 18px;--p58-axe-density-tile-label-fontsize: 10.5px;--p58-axe-density-mono-letter-spacing: .005em;--p58-success: #00d4aa;--p58-success-dim: #00d4aa1a;--p58-warning: #f5a623;--p58-warning-dim: #f5a6231a;--p58-danger: #ff4757;--p58-danger-dim: #ff47571a;--p58-info: #5aa9ff;--p58-info-dim: #5aa9ff1a;--p58-trend-neutral: var(--p58-fg-2);--p58-trend-muted: var(--p58-fg-3);--p58-trend-negative: #ff4757;--p58-trend-positive: var(--p58-accent);--p58-viz-1: #00d4aa;--p58-viz-2: #5aa9ff;--p58-viz-3: #c084fc;--p58-viz-4: #f5a623;--p58-viz-5: #ff4757;--p58-viz-6: #7b7e9c;--p58-font-display: "Space Grotesk", ui-sans-serif, system-ui, sans-serif;--p58-font-ui: "Inter", ui-sans-serif, system-ui, -apple-system, sans-serif;--p58-font-mono: "JetBrains Mono", ui-monospace, "Menlo", "Monaco", monospace;--p58-text-2xs: 10px;--p58-text-xs: 11px;--p58-text-sm: 12px;--p58-text-md: 13px;--p58-text-base:14px;--p58-text-lg: 16px;--p58-text-xl: 20px;--p58-text-2xl: 24px;--p58-text-3xl: 32px;--p58-text-4xl: 40px;--p58-text-5xl: 56px;--p58-text-6xl: 72px;--p58-weight-light: 300;--p58-weight-regular: 400;--p58-weight-medium: 500;--p58-weight-semibold:600;--p58-weight-bold: 700;--p58-leading-tight: 1.15;--p58-leading-snug: 1.3;--p58-leading-normal: 1.5;--p58-leading-loose: 1.7;--p58-tracking-tight: -.02em;--p58-tracking-normal: 0;--p58-tracking-wide: .04em;--p58-tracking-caps: .12em;--p58-space-0: 0;--p58-space-1: 4px;--p58-space-2: 8px;--p58-space-3: 12px;--p58-space-4: 16px;--p58-space-5: 20px;--p58-space-6: 24px;--p58-space-8: 32px;--p58-space-10: 40px;--p58-space-12: 48px;--p58-space-16: 64px;--p58-space-20: 80px;--p58-space-24: 96px;--p58-radius-none: 0;--p58-radius-sm: 2px;--p58-radius-md: 4px;--p58-radius-lg: 6px;--p58-radius-xl: 10px;--p58-radius-full: 999px;--p58-elev-1-bg: #0e0e24;--p58-elev-1-border: rgba(255, 255, 255, .08);--p58-elev-2-bg: #13132f;--p58-elev-2-border: rgba(255, 255, 255, .15);--p58-elev-3-bg: #16163a;--p58-elev-3-border: rgba(255, 255, 255, .22);--p58-shadow-inset: inset 0 1px 0 rgba(255, 255, 255, .03);--p58-glow-accent: 0 0 0 1px var(--p58-accent), 0 0 16px var(--p58-accent-glow);--p58-ring-focus: 0 0 0 2px var(--p58-bg), 0 0 0 4px var(--p58-accent);--p58-ease: cubic-bezier(.2, .6, .2, 1);--p58-ease-in: cubic-bezier(.4, 0, 1, 1);--p58-duration-fast: .12s;--p58-duration-base: .18s;--p58-duration-slow: .26s;--p58-z-base: 1;--p58-z-sticky: 10;--p58-z-dropdown:100;--p58-z-modal: 1000;--p58-z-toast: 2000;--p58-brand-3p-react: #61DAFB;--p58-brand-3p-react-hover: #4DD0E1;--p58-brand-3p-html5: #E34F26;--p58-brand-3p-html5-hover: #F06529}html,body{background:var(--p58-bg);color:var(--p58-fg-1);font-family:var(--p58-font-ui);font-size:var(--p58-text-md);line-height:var(--p58-leading-normal);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.p58-h1,h1.p58{font-family:var(--p58-font-display);font-size:var(--p58-text-5xl);font-weight:var(--p58-weight-semibold);line-height:var(--p58-leading-tight);letter-spacing:var(--p58-tracking-tight);color:var(--p58-fg-1)}.p58-h2,h2.p58{font-family:var(--p58-font-display);font-size:var(--p58-text-3xl);font-weight:var(--p58-weight-semibold);line-height:var(--p58-leading-tight);letter-spacing:var(--p58-tracking-tight);color:var(--p58-fg-1)}.p58-h3,h3.p58{font-family:var(--p58-font-display);font-size:var(--p58-text-2xl);font-weight:var(--p58-weight-medium);line-height:var(--p58-leading-snug);color:var(--p58-fg-1)}.p58-h4,h4.p58{font-family:var(--p58-font-display);font-size:var(--p58-text-xl);font-weight:var(--p58-weight-medium);line-height:var(--p58-leading-snug);color:var(--p58-fg-1)}.p58-body{font-family:var(--p58-font-ui);font-size:var(--p58-text-md);font-weight:var(--p58-weight-regular);line-height:var(--p58-leading-normal);color:var(--p58-fg-2)}.p58-body-lg{font-family:var(--p58-font-ui);font-size:var(--p58-text-lg);line-height:var(--p58-leading-normal);color:var(--p58-fg-2)}.p58-small{font-size:var(--p58-text-sm);color:var(--p58-fg-3)}.p58-eyebrow{font-family:var(--p58-font-mono);font-size:var(--p58-text-xs);font-weight:var(--p58-weight-medium);text-transform:uppercase;letter-spacing:var(--p58-tracking-caps);color:var(--p58-fg-3)}.p58-code,code.p58,kbd.p58{font-family:var(--p58-font-mono);font-size:.92em;color:var(--p58-fg-1);background:var(--p58-surface-2);border:1px solid var(--p58-border);border-radius:var(--p58-radius-sm);padding:1px 5px}.p58-metric{font-family:var(--p58-font-mono);font-size:var(--p58-text-4xl);font-weight:var(--p58-weight-medium);line-height:1;letter-spacing:-.01em;color:var(--p58-fg-1);font-variant-numeric:tabular-nums}.p58-metric-sm{font-family:var(--p58-font-mono);font-size:var(--p58-text-xl);font-weight:var(--p58-weight-medium);line-height:1;color:var(--p58-fg-1);font-variant-numeric:tabular-nums}.p58-scroll::-webkit-scrollbar{width:10px;height:10px}.p58-scroll::-webkit-scrollbar-track{background:transparent}.p58-scroll::-webkit-scrollbar-thumb{background:var(--p58-border-strong);border-radius:var(--p58-radius-full);border:2px solid var(--p58-bg)}.p58-scroll::-webkit-scrollbar-thumb:hover{background:var(--p58-fg-4)}::selection{background:var(--p58-accent-dim);color:var(--p58-fg-1)}.p58-trend,.p58-trend-neutral,.p58-trend-negative,.p58-trend-positive{font-family:var(--p58-font-mono);font-size:var(--p58-text-xs);font-variant-numeric:tabular-nums;display:inline-flex;align-items:center;gap:4px;line-height:1}.p58-trend,.p58-trend-neutral{color:var(--p58-trend-neutral)}.p58-trend-negative{color:var(--p58-trend-negative)}.p58-trend-positive{color:var(--p58-trend-positive)}.p58-trend-muted{color:var(--p58-trend-muted);font-family:var(--p58-font-mono);font-size:var(--p58-text-xs)}.p58-trend-baseline{color:var(--p58-trend-muted);font-family:var(--p58-font-mono);font-size:10px;text-transform:uppercase;letter-spacing:.1em;margin-left:2px}.path58-scrollbar{scrollbar-width:thin;scrollbar-color:color-mix(in srgb,var(--p58-teal) 60%,transparent) color-mix(in srgb,var(--p58-bg) 40%,transparent);scrollbar-gutter:stable;padding-right:8px}.path58-scrollbar::-webkit-scrollbar{width:8px!important;height:8px!important;-webkit-appearance:none!important;display:block!important}.path58-scrollbar::-webkit-scrollbar-track{background:color-mix(in srgb,var(--p58-bg) 40%,transparent)!important;border-radius:4px;border:1px solid color-mix(in srgb,var(--p58-teal) 20%,transparent)!important;margin:2px 0;-webkit-appearance:none!important}.path58-scrollbar::-webkit-scrollbar-thumb{background:color-mix(in srgb,var(--p58-teal) 60%,transparent)!important;border-radius:4px;min-height:30px;border:1px solid color-mix(in srgb,var(--p58-teal) 30%,transparent)!important;-webkit-appearance:none!important}.path58-scrollbar::-webkit-scrollbar-thumb:hover{background:color-mix(in srgb,var(--p58-teal) 80%,transparent)!important;border-color:color-mix(in srgb,var(--p58-teal) 50%,transparent)!important}.path58-scrollbar::-webkit-scrollbar:horizontal{height:8px!important}.path58-scrollbar::-webkit-scrollbar-track:horizontal{margin:0 2px}.path58-button{display:inline-flex;align-items:center;justify-content:center;gap:.5rem;border:none;border-radius:6px;font-weight:500;cursor:pointer;transition:all .2s;outline:none;font-family:inherit}.path58-button:focus-visible{outline:2px solid color-mix(in srgb,var(--p58-teal) 50%,transparent);outline-offset:2px}.path58-button:disabled{opacity:.5;cursor:not-allowed}.path58-button--sm{padding:.375rem .75rem;font-size:.75rem;min-height:28px}.path58-button--md{padding:.5rem 1rem;font-size:.875rem;min-height:36px}.path58-button--lg{padding:.75rem 1.5rem;font-size:1rem;min-height:44px}.path58-button--primary{background:color-mix(in srgb,var(--p58-teal) 15%,transparent);border:1px solid color-mix(in srgb,var(--p58-teal) 30%,transparent);color:var(--p58-accent-fg)}.path58-button--primary:hover:not(:disabled){background:color-mix(in srgb,var(--p58-teal) 25%,transparent);border-color:color-mix(in srgb,var(--p58-teal) 50%,transparent)}.path58-button--secondary{background:color-mix(in srgb,var(--p58-bg) 30%,transparent);border:1px solid color-mix(in srgb,var(--p58-teal) 20%,transparent);color:var(--p58-fg-2)}.path58-button--secondary:hover:not(:disabled){background:color-mix(in srgb,var(--p58-bg) 40%,transparent);border-color:color-mix(in srgb,var(--p58-teal) 30%,transparent);color:var(--p58-fg-1)}.path58-button--ghost{background:transparent;border:1px solid transparent;color:var(--p58-fg-3)}.path58-button--ghost:hover:not(:disabled){background:color-mix(in srgb,var(--p58-teal) 5%,transparent);border-color:color-mix(in srgb,var(--p58-teal) 10%,transparent);color:var(--p58-fg-2)}.path58-button--danger{background:color-mix(in srgb,var(--p58-danger) 15%,transparent);border:1px solid color-mix(in srgb,var(--p58-danger) 30%,transparent);color:var(--p58-danger)}.path58-button--danger:hover:not(:disabled){background:color-mix(in srgb,var(--p58-danger) 25%,transparent);border-color:color-mix(in srgb,var(--p58-danger) 50%,transparent)}.path58-button--with-icon{gap:.5rem}.path58-button-icon{display:flex;align-items:center;justify-content:center;flex-shrink:0}.path58-button-text{flex:1;text-align:center}.path58-input{width:100%;padding:.625rem .75rem;background:color-mix(in srgb,var(--p58-bg) 30%,transparent);border:1px solid color-mix(in srgb,var(--p58-teal) 30%,transparent);border-radius:6px;color:var(--p58-fg-1);font-size:.875rem;outline:none;transition:all .2s;font-family:inherit}.path58-input::placeholder{color:var(--p58-fg-4)}.path58-input:focus{border-color:var(--p58-accent-fg);box-shadow:0 0 0 2px color-mix(in srgb,var(--p58-teal) 10%,transparent);background:color-mix(in srgb,var(--p58-bg) 50%,transparent)}.path58-input:disabled{opacity:.5;cursor:not-allowed}.path58-input--search{padding:.625rem 2.5rem .625rem .75rem}.path58-input--error{border-color:color-mix(in srgb,var(--p58-danger) 50%,transparent)}.path58-input--error:focus{border-color:var(--p58-danger);box-shadow:0 0 0 2px color-mix(in srgb,var(--p58-danger) 10%,transparent)}.path58-badge{display:inline-flex;align-items:center;justify-content:center;padding:.375rem .75rem;border-radius:6px;font-size:.75rem;font-weight:400;transition:all .2s;cursor:default}.path58-badge--tag{background:transparent;border:1px solid;color:inherit;cursor:pointer}.path58-badge--tag:hover{opacity:.8;transform:translateY(-1px);box-shadow:0 2px 4px color-mix(in srgb,var(--p58-bg) 20%,transparent)}.path58-badge--tag.path58-badge--active{font-weight:600;box-shadow:0 2px 8px color-mix(in srgb,var(--p58-bg) 30%,transparent)}.path58-badge--filter{display:inline-flex;align-items:center;gap:.25rem;padding:.125rem .5rem;background:color-mix(in srgb,var(--p58-teal) 15%,transparent);border:1px solid color-mix(in srgb,var(--p58-teal) 30%,transparent);border-radius:4px;font-size:.75rem;color:var(--p58-accent-fg)}.path58-badge--default{background:color-mix(in srgb,var(--p58-bg) 30%,transparent);border:1px solid color-mix(in srgb,var(--p58-teal) 20%,transparent);color:var(--p58-fg-2)}.path58-icon{display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;transition:all .2s}.path58-icon--html{color:var(--p58-brand-3p-html5)}.path58-icon--html:hover{color:var(--p58-brand-3p-html5-hover)}.path58-icon--tsx{color:var(--p58-brand-3p-react)}.path58-icon--tsx:hover{color:var(--p58-brand-3p-react-hover)}.path58-icon--primary{color:var(--p58-accent-fg)}.path58-icon--default{color:var(--p58-fg-3)}.path58-icon-container{display:flex;align-items:center;justify-content:center;border-radius:6px;flex-shrink:0}.path58-icon-container--sm{width:24px;height:24px}.path58-icon-container--md{width:32px;height:32px}.path58-icon-container--lg{width:40px;height:40px}.path58-icon-container--default{background:color-mix(in srgb,var(--p58-teal) 6%,transparent);color:var(--p58-icon-accent-soft)}.path58-icon-container--primary{background:color-mix(in srgb,var(--p58-teal) 10%,transparent);border:1px solid color-mix(in srgb,var(--p58-teal) 20%,transparent);color:var(--p58-accent-fg)}.path58-icon-container--html{background:color-mix(in srgb,var(--p58-brand-3p-html5) 15%,transparent);color:var(--p58-brand-3p-html5)}.path58-icon-container--tsx{background:color-mix(in srgb,var(--p58-brand-3p-react) 15%,transparent);color:var(--p58-brand-3p-react)}.path58-label{display:flex;align-items:center;gap:.5rem;font-weight:500}.path58-label--section{font-size:.75rem;font-weight:600;color:var(--p58-fg-3);text-transform:uppercase;letter-spacing:.05em}.path58-label--section .path58-label-icon,.path58-label--section .path58-label-text{color:var(--p58-accent-fg)}.path58-label--card{font-size:.625rem;color:var(--p58-fg-3);text-transform:uppercase;letter-spacing:.05em;font-weight:500}.path58-label--default{font-size:.875rem;color:var(--p58-fg-2)}.path58-label-icon{display:flex;align-items:center;justify-content:center;flex-shrink:0}.path58-label-text{flex:1}.path58-container{display:flex;flex-direction:column;border-radius:8px}.path58-container--section{padding:.875rem;background:color-mix(in srgb,var(--p58-bg) 40%,transparent);border:1px solid color-mix(in srgb,var(--p58-teal) 20%,transparent);gap:.75rem}.path58-container--card{padding:.875rem 1rem;background:color-mix(in srgb,var(--p58-bg) 30%,transparent);border:1px solid color-mix(in srgb,var(--p58-teal) 12%,transparent);min-width:120px;min-height:56px;transition:all .2s}.path58-container--card:hover{border-color:color-mix(in srgb,var(--p58-teal) 25%,transparent);background:color-mix(in srgb,var(--p58-bg) 40%,transparent);transform:translateY(-2px);box-shadow:0 4px 12px color-mix(in srgb,var(--p58-teal) 15%,transparent)}.path58-container--default{padding:1rem;background:transparent}.path58-list{display:flex;overflow-y:auto;overflow-x:hidden;min-height:0;-webkit-overflow-scrolling:touch;scrollbar-width:thin;scrollbar-color:color-mix(in srgb,var(--p58-teal) 60%,transparent) color-mix(in srgb,var(--p58-bg) 40%,transparent);scrollbar-gutter:stable}.path58-list::-webkit-scrollbar{width:8px!important;-webkit-appearance:none!important;display:block!important}.path58-list::-webkit-scrollbar-track{background:color-mix(in srgb,var(--p58-bg) 40%,transparent)!important;border-radius:4px;margin:2px 0;border:1px solid color-mix(in srgb,var(--p58-teal) 20%,transparent)!important;-webkit-appearance:none!important}.path58-list::-webkit-scrollbar-thumb{background:color-mix(in srgb,var(--p58-teal) 60%,transparent)!important;border-radius:4px;min-height:30px;border:1px solid color-mix(in srgb,var(--p58-teal) 30%,transparent)!important;-webkit-appearance:none!important}.path58-list::-webkit-scrollbar-thumb:hover{background:color-mix(in srgb,var(--p58-teal) 80%,transparent)!important;border-color:color-mix(in srgb,var(--p58-teal) 50%,transparent)!important}.path58-list--vertical{flex-direction:column;padding:.5rem}.path58-list--horizontal{flex-direction:row;overflow-x:auto;overflow-y:hidden;padding:.5rem}.path58-list--wrap{flex-wrap:wrap;gap:.375rem;padding:0}.path58-list-item{width:100%;display:flex;align-items:center;gap:.5rem;padding:.625rem .75rem;background:transparent;border:1px solid transparent;border-radius:4px;color:var(--p58-fg-2);cursor:pointer;font-size:.8125rem;font-weight:400;text-align:left;transition:all .2s;text-transform:none;letter-spacing:normal}.path58-list-item:hover{background:color-mix(in srgb,var(--p58-teal) 5%,transparent);border-color:color-mix(in srgb,var(--p58-teal) 20%,transparent);color:var(--p58-fg-1)}.path58-list-item--selected{background:color-mix(in srgb,var(--p58-teal) 10%,transparent);border-color:var(--p58-accent-fg);color:var(--p58-accent-fg);font-weight:500}.path58-toast{display:flex;align-items:flex-start;gap:var(--p58-space-3);background:var(--p58-surface-2);color:var(--p58-fg-1);border:1px solid var(--p58-border);border-left:4px solid var(--p58-border-strong);border-radius:var(--p58-radius-lg);padding:var(--p58-space-3) var(--p58-space-4);min-width:280px;max-width:420px;animation:path58-toast-slide-in .2s ease-out;pointer-events:auto}.path58-toast__message{flex:1;min-width:0;color:var(--p58-fg-1);font-size:.875rem;line-height:1.5;word-break:break-word}.path58-toast__action{flex-shrink:0}.path58-toast__dismiss{display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px;min-width:32px;min-height:32px;background:transparent;border:none;color:var(--p58-fg-3);cursor:pointer;border-radius:var(--p58-radius-sm);transition:color .12s ease-out;flex-shrink:0}.path58-toast__dismiss:hover{color:var(--p58-fg-1)}.path58-toast__dismiss:focus-visible{outline:2px solid var(--p58-accent-fg);outline-offset:2px}.path58-toast--success{border-left-color:var(--p58-success)}.path58-toast--warning{border-left-color:var(--p58-warning)}.path58-toast--danger{border-left-color:var(--p58-danger)}.path58-toast--info{border-left-color:var(--p58-info)}@keyframes path58-toast-slide-in{0%{opacity:0;transform:translate(8px)}to{opacity:1;transform:translate(0)}}@media (prefers-reduced-motion: reduce){.path58-toast{animation:none}}.path58-banner{display:flex;align-items:flex-start;gap:var(--p58-space-3);color:var(--p58-fg-1);border:1px solid var(--p58-border);border-left-width:4px;border-radius:var(--p58-radius-lg);padding:var(--p58-space-4);font-size:.9375rem;line-height:1.5}.path58-banner__icon{flex-shrink:0;display:inline-flex;align-items:center;margin-top:2px}.path58-banner__content{flex:1;min-width:0}.path58-banner__title{font-weight:500;color:var(--p58-fg-1);margin-bottom:var(--p58-space-1)}.path58-banner__message{color:var(--p58-fg-2);word-break:break-word}.path58-banner__action{flex-shrink:0}.path58-banner__dismiss{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;min-width:44px;min-height:44px;background:transparent;border:none;color:var(--p58-fg-3);cursor:pointer;border-radius:var(--p58-radius-sm);transition:color .12s ease-out;flex-shrink:0}.path58-banner__dismiss:hover{color:var(--p58-fg-1)}.path58-banner__dismiss:focus-visible{outline:2px solid var(--p58-accent-fg);outline-offset:2px}.path58-banner--success{background:color-mix(in srgb,var(--p58-success) 12%,transparent);border-color:color-mix(in srgb,var(--p58-success) 30%,transparent);border-left-color:var(--p58-success)}.path58-banner--success .path58-banner__icon{color:var(--p58-success)}.path58-banner--warning{background:color-mix(in srgb,var(--p58-warning) 12%,transparent);border-color:color-mix(in srgb,var(--p58-warning) 30%,transparent);border-left-color:var(--p58-warning)}.path58-banner--warning .path58-banner__icon{color:var(--p58-warning)}.path58-banner--danger{background:color-mix(in srgb,var(--p58-danger) 12%,transparent);border-color:color-mix(in srgb,var(--p58-danger) 30%,transparent);border-left-color:var(--p58-danger)}.path58-banner--danger .path58-banner__icon{color:var(--p58-danger)}.path58-banner--info{background:color-mix(in srgb,var(--p58-info) 12%,transparent);border-color:color-mix(in srgb,var(--p58-info) 30%,transparent);border-left-color:var(--p58-info)}.path58-banner--info .path58-banner__icon{color:var(--p58-info)}.path58-banner--sticky-top{position:sticky;top:0;z-index:200;border-radius:0}.path58-alert{display:flex;align-items:flex-start;gap:var(--p58-space-2);color:var(--p58-fg-1);border:1px solid var(--p58-border);border-left-width:3px;border-radius:var(--p58-radius-md);line-height:1.5}.path58-alert__icon{flex-shrink:0;display:inline-flex;align-items:center}.path58-alert__content{flex:1;min-width:0}.path58-alert__title{font-weight:500;color:var(--p58-fg-1)}.path58-alert__message{color:var(--p58-fg-2);word-break:break-word}.path58-alert__dismiss{display:inline-flex;align-items:center;justify-content:center;background:transparent;border:none;color:var(--p58-fg-3);cursor:pointer;border-radius:var(--p58-radius-sm);transition:color .12s ease-out;flex-shrink:0}.path58-alert__dismiss:hover{color:var(--p58-fg-1)}.path58-alert__dismiss:focus-visible{outline:2px solid var(--p58-accent-fg);outline-offset:2px}.path58-alert--md{padding:var(--p58-space-3) var(--p58-space-4);font-size:.875rem;gap:var(--p58-space-3)}.path58-alert--md .path58-alert__icon{margin-top:2px}.path58-alert--md .path58-alert__dismiss{width:24px;height:24px;min-width:32px;min-height:32px}.path58-alert--sm{padding:var(--p58-space-2) var(--p58-space-3);font-size:.8125rem;gap:var(--p58-space-2)}.path58-alert--sm .path58-alert__icon{margin-top:1px}.path58-alert--sm .path58-alert__dismiss{width:20px;height:20px;min-width:28px;min-height:28px}.path58-alert--success{background:color-mix(in srgb,var(--p58-success) 10%,transparent);border-color:color-mix(in srgb,var(--p58-success) 28%,transparent);border-left-color:var(--p58-success)}.path58-alert--success .path58-alert__icon{color:var(--p58-success)}.path58-alert--warning{background:color-mix(in srgb,var(--p58-warning) 10%,transparent);border-color:color-mix(in srgb,var(--p58-warning) 28%,transparent);border-left-color:var(--p58-warning)}.path58-alert--warning .path58-alert__icon{color:var(--p58-warning)}.path58-alert--danger{background:color-mix(in srgb,var(--p58-danger) 10%,transparent);border-color:color-mix(in srgb,var(--p58-danger) 28%,transparent);border-left-color:var(--p58-danger)}.path58-alert--danger .path58-alert__icon{color:var(--p58-danger)}.path58-alert--info{background:color-mix(in srgb,var(--p58-info) 10%,transparent);border-color:color-mix(in srgb,var(--p58-info) 28%,transparent);border-left-color:var(--p58-info)}.path58-alert--info .path58-alert__icon{color:var(--p58-info)}.path58-search-input{position:relative;display:flex;align-items:center;width:100%}.path58-search-input .path58-input{width:100%;padding-right:2.5rem}.path58-search-input-clear{position:absolute;right:.5rem;background:transparent;border:none;color:var(--p58-fg-3);padding:.25rem;border-radius:4px;display:flex;align-items:center;justify-content:center;transition:all .2s}.path58-search-input-clear:hover{color:var(--p58-fg-1);background:color-mix(in srgb,var(--p58-fg-1) 10%,transparent)}.path58-info-card{display:flex;align-items:center;gap:.75rem;position:relative;margin-top:.25rem}.path58-info-card-content{display:flex;flex-direction:column;gap:.125rem;min-width:0;flex:1}.path58-info-card-value{font-size:.9375rem;color:var(--p58-fg-2);font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.path58-info-card-value{display:flex;flex-wrap:wrap;gap:.25rem}.path58-info-card--filters{border-color:color-mix(in srgb,var(--p58-teal) 20%,transparent)}.path58-info-card--selected{border-color:color-mix(in srgb,var(--p58-teal) 25%,transparent);background:color-mix(in srgb,var(--p58-teal) 3%,transparent)}.path58-info-card--category{transition:all .2s}.path58-info-card--clickable{cursor:pointer}.path58-category-header{width:100%;display:flex;align-items:center;gap:.5rem;padding:.75rem;background:color-mix(in srgb,var(--p58-teal) 8%,transparent);border:1px solid color-mix(in srgb,var(--p58-teal) 15%,transparent);color:var(--p58-accent-fg);cursor:pointer;border-radius:6px;font-size:.875rem;font-weight:500;text-transform:uppercase;letter-spacing:.05em;transition:all .2s;margin-bottom:.25rem}.path58-category-header svg{color:var(--p58-accent-fg)}.path58-category-header:hover{background:color-mix(in srgb,var(--p58-teal) 12%,transparent);border-color:color-mix(in srgb,var(--p58-teal) 25%,transparent);color:var(--p58-accent-fg)}.path58-category-name{flex:1;text-align:left}.path58-category-count{color:var(--p58-fg-3);font-weight:400}.path58-category-chevron{transition:transform .2s}.path58-category-chevron--expanded{transform:rotate(90deg)}.path58-file-name{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.path58-dialog-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;background:var(--p58-overlay-backdrop);display:flex;align-items:center;justify-content:center;padding:var(--p58-space-6);z-index:1000;animation:path58-dialog-fade-in .15s ease-out}.path58-dialog-surface{background:var(--p58-surface);color:var(--p58-fg-1);border:1px solid var(--p58-border-strong);border-radius:var(--p58-radius-xl);padding:var(--p58-space-6);max-width:480px;width:100%;max-height:calc(100vh - var(--p58-space-12));overflow-y:auto;animation:path58-dialog-slide-up .2s ease-out}.path58-dialog-surface :focus-visible{outline:2px solid var(--p58-accent-fg);outline-offset:2px;border-radius:var(--p58-radius-sm)}@keyframes path58-dialog-fade-in{0%{opacity:0}to{opacity:1}}@keyframes path58-dialog-slide-up{0%{opacity:0;transform:translateY(8px) scale(.98)}to{opacity:1;transform:translateY(0) scale(1)}}@media (prefers-reduced-motion: reduce){.path58-dialog-backdrop,.path58-dialog-surface{animation:none}}.path58-modal{display:flex;flex-direction:column;gap:var(--p58-space-4);margin:calc(var(--p58-space-6) * -1)}.path58-modal__header{display:flex;align-items:flex-start;justify-content:space-between;gap:var(--p58-space-3);padding:var(--p58-space-5) var(--p58-space-6);border-bottom:1px solid var(--p58-border)}.path58-modal__header-content{flex:1;min-width:0;color:var(--p58-fg-1);font-size:1rem;font-weight:500;line-height:1.4}.path58-modal__dismiss{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;min-width:44px;min-height:44px;background:transparent;border:none;color:var(--p58-fg-2);cursor:pointer;border-radius:var(--p58-radius-sm);transition:color .12s ease-out}.path58-modal__dismiss:hover{color:var(--p58-fg-1)}.path58-modal__dismiss:focus-visible{outline:2px solid var(--p58-accent-fg);outline-offset:2px}.path58-modal__body{padding:0 var(--p58-space-6);color:var(--p58-fg-1);font-size:.9375rem;line-height:1.6}.path58-modal__footer{display:flex;align-items:center;justify-content:flex-end;gap:var(--p58-space-2);padding:var(--p58-space-4) var(--p58-space-6);border-top:1px solid var(--p58-border)}.path58-modal--sm{--path58-modal-max-width: 360px}.path58-modal--md{--path58-modal-max-width: 480px}.path58-modal--lg{--path58-modal-max-width: 640px}.path58-dialog-surface:has(.path58-modal--sm){max-width:360px}.path58-dialog-surface:has(.path58-modal--lg){max-width:640px}.path58-confirm-dialog__message{color:var(--p58-fg-2);font-size:.9375rem;line-height:1.6;padding:var(--p58-space-3) 0}.path58-confirm-dialog__spinner{display:inline-block;width:12px;height:12px;border:2px solid currentColor;border-right-color:transparent;border-radius:var(--p58-radius-full);margin-right:var(--p58-space-2);animation:path58-confirm-dialog-spin .6s linear infinite}@keyframes path58-confirm-dialog-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}@media (prefers-reduced-motion: reduce){.path58-confirm-dialog__spinner{animation-duration:1.5s}}.path58-prompt-dialog__field{display:flex;flex-direction:column;gap:var(--p58-space-2);padding:var(--p58-space-3) 0}.path58-prompt-dialog__label{color:var(--p58-fg-2);font-size:.8125rem;font-weight:500;line-height:1.4}.path58-prompt-dialog__error{color:var(--p58-danger);font-size:.8125rem;line-height:1.4}.path58-search-input-wrapper{position:relative;display:flex;align-items:center;width:100%}.path58-tag-filter{display:flex;flex-direction:column;gap:.5rem;min-width:200px;height:110px;max-height:110px;overflow-y:scroll;overflow-x:hidden;position:relative;padding-right:0}.path58-tag-filter-header{display:flex;align-items:center;gap:.5rem;font-size:.75rem;color:var(--p58-accent-fg);flex-shrink:0}.path58-tag-filter-clear{margin-left:auto}.path58-tag-filter-list{flex:1;min-height:0}.path58-tag-filter-scroll-hint{padding:.25rem .5rem;font-size:.625rem;color:var(--p58-fg-3);text-align:center;font-style:italic;border-top:1px solid color-mix(in srgb,var(--p58-teal) 10%,transparent);margin-top:.25rem;flex-shrink:0}.path58-category-group{margin-bottom:.5rem}.path58-category-file-list{display:flex;flex-direction:column;gap:.25rem;padding-left:.5rem}.path58-artifact-list.path58-list{flex:1 1 0!important;min-height:0!important;overflow-y:scroll!important;overflow-x:hidden!important;scrollbar-width:thin!important;scrollbar-color:color-mix(in srgb,var(--p58-teal) 60%,transparent) color-mix(in srgb,var(--p58-bg) 40%,transparent)!important;scrollbar-gutter:stable!important;-webkit-overflow-scrolling:touch;padding:.5rem!important;display:flex!important;flex-direction:column!important;height:100%!important}.path58-artifact-list::-webkit-scrollbar{width:8px!important;-webkit-appearance:none!important;display:block!important}.path58-artifact-list::-webkit-scrollbar-track{background:color-mix(in srgb,var(--p58-bg) 40%,transparent)!important;border-radius:4px;margin:2px 0;border:1px solid color-mix(in srgb,var(--p58-teal) 20%,transparent)!important;-webkit-appearance:none!important}.path58-artifact-list::-webkit-scrollbar-thumb{background:color-mix(in srgb,var(--p58-teal) 60%,transparent)!important;border-radius:4px;min-height:30px;border:1px solid color-mix(in srgb,var(--p58-teal) 30%,transparent)!important;-webkit-appearance:none!important}.path58-artifact-list::-webkit-scrollbar-thumb:hover{background:color-mix(in srgb,var(--p58-teal) 80%,transparent)!important;border-color:color-mix(in srgb,var(--p58-teal) 50%,transparent)!important}.path58-toast-stack{position:fixed;display:flex;flex-direction:column;gap:var(--p58-space-2);z-index:1100;padding:var(--p58-space-4);pointer-events:none;max-width:calc(100vw - var(--p58-space-8))}.path58-toast-stack--top-right{top:0;right:0;align-items:flex-end}.path58-toast-stack--top-left{top:0;left:0;align-items:flex-start}.path58-toast-stack--bottom-right{bottom:0;right:0;align-items:flex-end;flex-direction:column-reverse}.path58-toast-stack--bottom-left{bottom:0;left:0;align-items:flex-start;flex-direction:column-reverse}